如何使一个CMake库目标依赖于任意文件?[重复]

p5cysglq  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(62)

此问题在此处已有答案

CMake: Source file depends on source file(2个答案)
12天前关闭
我正在用CMake做一个二进制资源 Package 工具,它是通过内联汇编.incbin指令实现的。简单来说,它是这样工作的:

  1. CMake脚本获取一个输入文件列表,通过configure_file命令生成一个源文件(我们称之为rcs_bundle.cpp)。生成的源文件大多包含一个大型内联汇编,其中包含了.incbin的所有输入文件:
__asm__(
   ".const_data\n"
   ".globl _data1_BEGIN\n"
   ".balign 16\n"
   "_data1_BEGIN:\n"
   ".incbin \"/full/path/to/data1\"\n"
   // omit data1 size generation lines that are not important in this topic

   ".globl _data2_BEGIN\n"
   ".balign 16\n"
   "_data2_BEGIN:\n"
   ".incbin \"/full/path/to/data2\"\n"
   // omit data2 size generation lines that are not important in this topic

   // and many more resources ......
   ".text\n");

字符串
1.静态库的生成方式与add_library(rcs_lib STATIC rcs_bundle.cpp)类似,并在本产品的其他部分中使用。
问题来了。理想情况下,当任何数据文件被更改时,rcs_lib应该自动重新编译。然而,CMake目标并不知道它对这些数据文件的依赖性,因为.incbin不被任何依赖性步行者识别。CMake没有提供手动指定文件级依赖性的方法,因为add_dependencies只在目标上工作。
我还尝试创建一个假目标,并像这样指定依赖项:

add_custom_target(rcs_lib_deps DEPENDS /full/path/to/data1 /full/path/to/data2)
add_dependencies(rcs_lib rcs_lib_deps)


但这根本行不通。
那么有没有办法在CMake中添加文件依赖项呢?因为这种方法只会在Mac中使用,所以有没有Clang编译器指令来手动指定C++源代码中的依赖项?

rnmwe5a2

rnmwe5a21#

就我对incbin的理解而言,从rcs_rule. cpp生成目标文件取决于文件。在这种情况下,你应该:

set_source_files_properties(rcs_bundle.cpp PROPERTIES OBJECT_DEPENDS
     /full/path/to/data1
     /full/path/to/data2
 )

字符串
相反,如果 linking rsc_lib依赖于文件(例如使用自定义链接脚本),则需要在库上设置一个属性:

set_target_properties(rsc_lib PROPERTIES LINK_DEPENDS
     /full/path/to/data1
     /full/path/to/data2
 )

相关问题