Cmake 无法将自定义命令识别为有效源

Dan*_*nyS 4 gcc build cmake

我在修改现有的基于 CMake 的构建系统时遇到问题。我想做的就是为某些 .c 文件添加不同的构建规则。为了解决这个问题,我将只关注一个文件。

简化的目录树如下所示

项目:

./src
 - file_of_interest.c
 - CmakeFiles.txt
other_files.c
CmakeFiles.txt
Run Code Online (Sandbox Code Playgroud)

因此,为了以不同的方式编译 file_of_interest.c 我这样做:

add_custom_command(
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/file_of_interest.s
        COMMAND xt-xcc -S ${CMAKE_CURRENT_SOURCE_DIR}/file_of_interest.c
        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/file.c
        COMMENT "Generating file_of_interest.s"
    )
add_custom_command(
        OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/file_of_interest.c.o
        COMMAND xt-xcc ${CMAKE_CURRENT_BINARY_DIR}/file_of_interest.s -o file_of_interest.c.o -c
        DEPENDS  ${CMAKE_CURRENT_BINARY_DIR}/file_of_interest.s
        COMMENT "Generating file_of_interest.c.o"
    )

message(" ${CMAKE_CURRENT_BINARY_DIR} \n ${CMAKE_CURRENT_SOURCE_DIR}")

target_sources(target_name PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/file_of_interest.c.o)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我使用 CMake 的 message() 来打印路径,以确保所有设置都正确。它应该有效,但没有!我希望 CMake 将 file_of_interest.co 注册为 target_name 的源(这可能有效),然后将其与生成 OUTPUT 的自定义命令“绑定” ,然后再次与 OUTPUT${CMAKE_CURRENT_BINARY_DIR}/file_of_interest.c.o绑定,这肯定不会发生,因为 CMake 显示错误留言说${CMAKE_CURRENT_BINARY_DIR}/file_of_interest.c.o${CMAKE_CURRENT_BINARY_DIR}/file_of_interest.sCMake Error at CMakeLists.txt:170 (add_executable): Cannot find source file: path/file_of_interest.c.o

路径没问题。所以问题是为什么 CMake 无法识别该文件的配方?

Tsy*_*rev 6

看来您add_executable顶层 CMakeLists.txt创建了一个可执行文件(调用) ,但从子目录( )add_custom_command调用。src/CMakeLists.txt

这是行不通的:当 CMake 处理add_executable并搜索生成其源的命令时,它只会看到add_custom_commands同一 CMakeLists.txt.

add_custom_command 文档中:

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

target_sources从与以下相同的目录调用是不相关的add_custom_command目标是通过add_executable命令创建的,并且target_sources只是修改其属性。