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

时间:2019-09-06 14:49:07

标签: gcc build cmake

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

简化的目录树如下所示

项目:

./src
 - file_of_interest.c
 - CmakeFiles.txt
other_files.c
CmakeFiles.txt

因此,为了以另一种方式编译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)

如您所见,我使用CMake的message()打印路径以确保所有设置均正确。它应该工作,但是不行!我希望CMake将file_of_interest.co注册为target_name的源(这可能正在工作),然后使用生成输出${CMAKE_CURRENT_BINARY_DIR}/file_of_interest.c.o的自定义命令将其“绑定”,然后再将${CMAKE_CURRENT_BINARY_DIR}/file_of_interest.c.o与输出{ {1}},这当然不会发生,因为CMake显示错误消息,说${CMAKE_CURRENT_BINARY_DIR}/file_of_interest.s

路径正常。那么问题是为什么CMake无法识别该文件的配方?

1 个答案:

答案 0 :(得分:2)

似乎您在顶层 - name: 'gcr.io/cloud-builders/docker' args: ['build', '--network=cloudbuild', '-t', 'gcr.io/project-${_ENVIRONMENT}/cloud_run-pubsub_example', './cloud-run/file_upserter/'] 中创建了一个可执行文件(调用add_executable),但是{<1>}是从子目录中调用的CMakeLists.txt)。

这不起作用:当CMake处理add_custom_command并搜索生成其源代码的命令时,它仅看到{strong>相同 src/CMakeLists.txt中创建的add_executable

来自add_custom_commands documentation

  

相同目录CMakeLists.txt文件)中创建的目标,该规则将自定义命令的任何输出指定为源文件,并具有生成规则。在构建时使用命令删除文件。

add_custom_command在同一目录中调用CMakeLists.txt无关:目标是由target_sources命令和add_custom_command创建的只需修改其属性即可。