CMake - 构建输出目录的生成器表达式的替代方法吗?

时间:2017-08-06 00:29:13

标签: build cmake

我有一个cmake构建系统疯狂。在支持IDE之前,一切正常。

我需要将文件(在本例中为着色器)复制到构建目录。无论主要目标是否已建成,都需要在变更时进行复制。

之前我有成功,因为我可以添加${CMAKE_CURRENT_BINARY_DIR}的自定义命令,稍后添加依赖项,一切都很好。

问题是,当为命令输出使用生成器表达式时,它会从我的自定义命令创建一个依赖关系到主目标。这意味着向后添加依赖项(触发副本需要)会因循环依赖性而抛出错误。

这是我到目前为止所做的,因为当主目标不需要重建时不会触发自定义目标(因此自定义命令),所以它不起作用。

set(SHADER_IN_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/shaders)
file(GLOB_RECURSE SHADERS "${SHADER_IN_DIR}/*.glsl")

add_custom_command(TARGET ${PROJECT_NAME} PRE_BUILD
    COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:${PROJECT_NAME}>/shaders/)

set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/.stamps)
add_custom_command(TARGET ${PROJECT_NAME} PRE_BUILD
    COMMAND ${CMAKE_COMMAND} -E make_directory ${STAMP_DIR})

set(STAMP_FILES "")
foreach(SHADER ${SHADERS})
    get_filename_component(SHADER_FILENAME ${SHADER} NAME)

    set(STAMP_FILE ${STAMP_DIR}/${SHADER_FILENAME}.stamp)

    add_custom_command(
        OUTPUT ${STAMP_FILE}
        COMMAND ${CMAKE_COMMAND} -E touch ${STAMP_FILE}
        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SHADER} $<TARGET_FILE_DIR:${PROJECT_NAME}>/shaders/${SHADER_FILENAME}
        DEPENDS ${SHADER}
    )

    list(APPEND STAMP_FILES ${STAMP_FILE})
endforeach()

add_custom_target(Shaders
    SOURCES ${SHADERS}
    DEPENDS ${STAMP_FILES})

# Need to add dependency here! But I can't :(

那么,有没有其他方法可以在IDE中使用哪个输出目录?我阅读以强制构建目标的所有“解决方案”都失败了(它们几乎都依赖于add_dependencies)。

感谢您拯救我的理智。

1 个答案:

答案 0 :(得分:0)

最后,我没有试图找出IDE输出二进制文件的位置,而是强制输出可预测的bin / dir。

set(BINARY_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BINARY_OUT_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BINARY_OUT_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BINARY_OUT_DIR})

foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
    string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${BINARY_OUT_DIR})
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${BINARY_OUT_DIR})
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${BINARY_OUT_DIR})
endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)