CMake:源文件依赖于源文件

8zzbczxx  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(119)

我正在使用内联汇编和.incbin将源文件嵌入到另一个源文件中,这就像我想要的那样。我不会接受标准的objcopy方法,虽然它是(imho)较小的方法。xxd也是一种选择,但实际上只适用于非常小的包含。我有一个静态站点构建器,它需要大量的资源并将其打包到一个程序中,使用. incbin非常快速。
不幸的是,将JS文件添加到源列表中是不够的:

ninja explain: output CMakeFiles/jsapp.dir/static_site.c.o older than most recent input static_site.c (1629797306094133842 vs 1629797311521966739)
ninja explain: CMakeFiles/jsapp.dir/static_site.c.o is dirty
ninja explain: jsapp is dirty
[2/2] Linking C executable jsapp

字符串
嵌入JS的主C文件没有被重建,但是与此无关的静态站点源代码是因为时间戳改变了。
如何告诉CMake source.c现在依赖于some_file.js?

6ju8rftf

6ju8rftf1#

按照@arrowd的想法:

set_source_files_properties(main.c OBJECT_DEPENDS
    ${CMAKE_SOURCE_DIR}/my.js
)

字符串
工作得很好。

fruv7luv

fruv7luv2#

我最近也在做同样的工作,我被从我自己的重复问题重定向到这个问题。
根据CMake official documentationOBJECT_DEPENDS属性只对 makefileninja 生成器有效,但对 Visual StudioXCode 等IDE生成器无效。所以我尝试了另一种方法。简而言之:

  • 纯内联汇编部分被生成到一个单独的源文件(比如rcs_asm.cpp),其他辅助代码部分(在我的情况下存在)被生成到另一个C++文件(比如rcs_blob.cpp)。
  • 使用cmake_custom_commandrcs_asm.cpp手动编译为对象文件(假设为rcs_asm.o),这允许您指定文件级依赖关系:
add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/rcs_asm.o
    MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/rcs_asm.cpp
    DEPENDS ${all_those_input_resource_files}
    COMMAND "${CMAKE_CXX_COMPILER}" -c -o ${CMAKE_CURRENT_BINARY_DIR}/rcs_asm.o ${CMAKE_CURRENT_BINARY_DIR}/rcs_asm.cpp
    VERBATIM)

字符串

  • 然后将生成的对象文件和blob C++文件编译成库:
add_library(rcs_lib STATIC
    ${CMAKE_CURRENT_BINARY_DIR}/rcs_blob.cpp
    ${CMAKE_CURRENT_BINARY_DIR}/rcs_asm.o)


pure-inline-assembly部分make rcs_asm.cpp的分离不需要优化标志,所以你不需要在不同的构建类型中编译它们的标志,因此不需要使用讨厌的生成器表达式。

相关问题