繁体   English   中英

CMake:softlink资源(例如GLSL着色器)或复制每个complilation

[英]CMake : softlink resource ( such as GLSL shaders ) or copy each complilation

使用CMake将资源从源目录复制到构建目录的最简单方法是

file( COPY ${CMAKE_CURRENT_SOURCE_DIR}/resources DESTINATION ${CMAKE_CURRENT_BINARY_DIR} )

但是, 只有在我调用cmake 时才会更新构建目录中的资源。 每次调用 make 需要更新资源的东西。

例如,现在我开发了一些GLSL着色器。 我需要同时更改C ++代码和GLSL代码, 每次我在IDE中compilerun 时都需要同步所有内容 (我使用CodeBlocks和CMake生成的项目文件)

简单的解决方案是从源目录到构建目录进行软链接 但是我不想手动完成它(它会绕过CMake并使项目更加脆弱)。 CMake可以帮我吗?


只是为了完整性,这就是我整个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的依赖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 )

使用自定义目标使用包含复制命令的脚本文件CopyFile.cmake调用新的CMake实例:

file( COPY ${CMAKE_CURRENT_SOURCE_DIR}/shaders DESTINATION ${CMAKE_CURRENT_BINARY_DIR} )

这样,每次makemake test_SphereShader都会复制文件。 您甚至可以手动复制make copy_shader_files

我对已接受的解决方案有一些问题。 最大的问题是它没有将文件夹放在某些IDE的可执行文件目录中,例如XCode。 这是因为XCode中的${CMAKE_CURRENT_BINARY_DIR}不是放置实际二进制文件的位置,它们通常是/Debug/executable类的更深层目录。 要获取该目录,您可以使用$,但它似乎不适用于cmake脚本。

我还没有找到完美的解决方案,但我目前正在使用选项1.如果我了解更多,我会更新。 如果有人知道如何解决选项1的缺点,我将非常高兴。

选项1: add_custom_command with 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
         )

MY_TARGET更改为使用add_executable或类似名称创建的目标。 还可以将/ shaders更改为着色器目录的名称。 -E copy_directory应保持原样,因为它在cmake中调用了copy_directory内置函数。

优点:

  • 单个命令,没有其他文件
  • 在更多IDE中复制到包含二进制文件的目录
  • 每次重建目标时都要复制新鲜的副本。 对于Xcode,只有着色器更改时它才有效。

缺点:

  • 使用make (至少在Mac上),如果只有着色器发生了变化,它会跳过复制步骤。 如果有人知道在这种情况下强制重建的正确方法,请告诉我。 在Xcode中不会发生。

选项2: add_custom_command with 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
         )

MY_TARGET更改为使用add_executable或类似名称创建的目标。 还可以将/ shaders更改为着色器目录的名称。 -E create_symlink应保持原样,因为它在cmake中调用create_symlink内置函数。

优点:

  • 基于单个目标的命令
  • 由于它为着色器/资产文件夹创建了一个符号链接,因此可以立即观察到对着色器的任何更改,而无需重建。 可能会将此移动到其他cmake命令,该命令仅在第一次cmake调用时执行

缺点:

  • 警告:这应该在Windows上不起作用
  • 虽然它适用于基于unix的开发,但请确保您最终不会尝试将带有符号链接的内容发送到您的用户不具备的文件夹。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM