【问题标题】:CMake, how to add files to executable target that hasn't been created yetCMake,如何将文件添加到尚未创建的可执行目标
【发布时间】:2018-01-24 18:19:53
【问题描述】:

假设有一个可执行目标,并且它的一些附加头文件丢失了。

那些缺失的标题是由某些脚本自动生成的。

因此,为了确保脚本在可执行目标之前运行,创建一个专用目标来运行此脚本并作为可执行目标的依赖项是合理的。

因此,每次可执行目标运行时,丢失的文件都将可用,因为add_executable 期望所有文件都可用。

但是,尝试以以下方式执行此操作导致无法找到丢失的文件...

add_custom_target(create_a_header)
add_custom_command(TARGET create_a_header POST_BUILD COMMAND /bin/sh create_a_header.sh )

set(SOURCE_FILES a.h a.c)

add_executable(${PROJECT_NAME} ${SOURCE_FILES})
add_dependency(${PROJECT_NAME} create_a_header) 

是否有任何其他选项可以将文件添加到可执行文件,即使它们仍然不可用?

【问题讨论】:

标签: makefile compilation cmake


【解决方案1】:

CMake 可以直接处理位于同一 CMakeLists.txt 中的 custom commands 的输出。

在同一目录(CMakeLists.txt 文件)中创建的将自定义命令的任何输出指定为源文件的目标被赋予在构建时使用该命令生成文件的规则。

所以你的代码应该是这样的:

include(FindUnixCommands)

add_custom_command(
    OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/a.h"
    COMMAND ${BASH} "${CMAKE_CURRENT_SOURCE_DIR}/create_a_header.sh" 
)

set(
    SOURCE_FILES 
        "a.c"
        "${CMAKE_CURRENT_BINARY_DIR}/a.h"
)

add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多