使用CMake将资源从源目录复制到构建目录的最简单方法是
file( COPY ${CMAKE_CURRENT_SOURCE_DIR}/resources DESTINATION ${CMAKE_CURRENT_BINARY_DIR} )
但是,只有当我调用cmake
时,才会更新构建目录中的资源。每次调用make
时,我都需要更新资源的东西。
例如。现在我开发了一些GLSL着色器。我需要同时更改C ++代码和GLSL代码,每当我在IDE中点击compile
或run
时我都需要同步(我使用CodeBlocks和CMake生成的项目文件)
简单的解决方案是从源目录到构建目录进行软链接。但是我不想手动完成它(它会绕过CMake并使项目更加脆弱)。 CMake可以帮我吗?
只是为了完整性,这就是我整个qazxsw大便的样子
CMakeList.txt
你可以提供一个自定义目标,你变成你的二进制# ==== common header
cmake_minimum_required ( VERSION 2.8 )
project ( SimpleSimulationEngine )
if( UNIX )
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=gnu++0x" )
endif()
SET( AXULIARY_COMPILE_FLAGS "-w -O2")
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${AXULIARY_COMPILE_FLAGS}" )
SET( COMMON_SRCS "${CMAKE_SOURCE_DIR}/common" )
include_directories(
${COMMON_SRCS}
${COMMON_SRCS}/algorithms
${COMMON_SRCS}/math
${COMMON_SRCS}/SDL2OGL3
)
set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake_utils )
find_package( OpenGL REQUIRED )
find_package( GLEW REQUIRED )
find_package( GLU REQUIRED )
find_package( SDL2 REQUIRED )
# ==== Particular build target
add_executable ( test_SphereShader test_SphereShader.cpp )
target_link_libraries( test_SphereShader ${OpenGL_LIBRARY} ${GLU_LIBRARY} ${GLEW_LIBRARY} ${SDL2_LIBRARY} )
file( COPY ${CMAKE_CURRENT_SOURCE_DIR}/shaders DESTINATION ${CMAKE_CURRENT_BINARY_DIR} )
的依赖:
test_SphereShader
使用自定义目标使用包含复制命令的脚本文件ADD_CUSTOM_TARGET(
copy_shader_files
${CMAKE_COMMAND}
-D SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}
-D DESTINATION_DIR=${CMAKE_CURRENT_BINARY_DIR}
-P CopyFile.cmake
COMMENT "Copying Files for target: test_SphereShader" VERBATIM
)
ADD_DEPENDENCIES ( test_SphereShader copy_shader_files )
调用新的CMake实例:
CopyFile.cmake
这样,每次调用file( COPY ${CMAKE_CURRENT_SOURCE_DIR}/shaders DESTINATION ${CMAKE_CURRENT_BINARY_DIR} )
或make
时都会复制文件。您甚至可以手动复制调用make test_SphereShader
。
我对已接受的解决方案有一些问题。最大的问题是它没有将文件夹放在某些IDE的可执行文件目录中,例如XCode。这是因为XCode中的make copy_shader_files
不是放置实际二进制文件的位置,它们通常是${CMAKE_CURRENT_BINARY_DIR}
之类的更深层目录。要获取该目录,您可以使用$,但它似乎不适用于cmake脚本。
我还没有找到完美的解决方案,但我目前正在使用选项1.如果我了解更多,我会更新。如果有人知道如何解决选项1的缺点,我将非常高兴。
/Debug/executable
with add_custom_command
copy_directory
将add_custom_command(
TARGET MY_TARGET POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_SOURCE_DIR}/shaders $<TARGET_FILE_DIR:MY_TARGET>/shaders
COMMENT "Copying shaders" VERBATIM
)
更改为使用add_executable或类似名称创建的目标。还可以将/ shaders更改为着色器目录的名称。 MY_TARGET
应保持原样,因为它在cmake中调用-E copy_directory
内置函数。
copy_directory
(至少在Mac上)时,如果只有着色器发生了变化,它会跳过复制步骤。如果有人知道在这种情况下强制重建的正确方法,请告诉我。在Xcode中不会发生。make
with add_custom_command
create_symlink
将add_custom_command(
TARGET MY_TARGET POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink
${CMAKE_SOURCE_DIR}/shaders $<TARGET_FILE_DIR:MY_TARGET>/shaders
COMMENT "Creating symlink to shader directory" VERBATIM
)
更改为使用add_executable或类似名称创建的目标。还可以将/ shaders更改为着色器目录的名称。 MY_TARGET
应保持原样,因为它在cmake中调用-E create_symlink
内置函数。