【发布时间】:2020-04-10 11:51:30
【问题描述】:
我有一个 CMake 项目,它使用外部工具为某个平台构建特殊库。运行这个工具使用一个“配置文件”来生成几个文件,这些文件在最终程序构建时注入到编译器和链接器选项中:
- 对象库
- 链接器命令文件,链接多个预编译库和上述对象库
- 设置各种平台编译器选项的 makefile 选项文件
每当这些文件中的任何一个发生更改时,都必须完全重建主程序,因为它们是程序的固有部分,并且涉及编译器标志和系统包含等内容。
到目前为止,我有这样的东西,appears 是推荐的方式:
# run the external build tool to generate platform libs
# and compiler/linker option files
add_custom_command(
OUTPUT ${LINKER_CMD_FILE} ${COMPILER_OPTS_FILE} ${PLATFORM_OBJECT_LIB}
COMMAND "${EXTERNAL_BUILD_TOOL}"
ARGS --config ${CFG_FILE}
DEPENDS ${CFG_FILE}
COMMENT "Invoking external build tool for ${CFG_FILE}"
)
add_custom_target(platform_libs
DEPENDS ${LINKER_CMD_FILE} ${COMPILER_OPTS_FILE} ${PLATFORM_OBJECT_LIB}
)
....
add_executable(main_prog
main.c
)
# whenever any of these change, rebuild
add_dependencies(main_prog platform_libs)
# add the platform compiler opts from the generated file
target_compile_options(main_prog PRIVATE
@${COMPILER_OPTS_FILE}
)
这也是in this question所做的。
当我更改配置文件时,platform_libs 目标运行并根据需要生成库和其他文件。然而,虽然运行make main_prog 确实会正确触发platform_libs 的构建,但它似乎没有“注意到”任何变化,因此得出结论它不需要实际重新构建主程序。
我总是可以运行make clean,但让 CMake 完全忽视基本系统库的变化并不是很好。
如果platform_libs 已运行,我如何强制main_prog 重建?
【问题讨论】:
-
也许,您还没有显示所有代码,但
add_dependencies()调用不应该在main_prog上,而不是main_app? -
@squareskittles 抱歉,这是一个错字。真正的目标有不同的名称。
-
尝试与
set_target_property(main_prog LINK_DEPENDS ${COMPILER_OPTS_FILE})或platform_libs一起做一些事情 -
@KamilCuk 确实总是强制重新链接,尽管它不强制重新构建源文件(即
main.c),现在可能有不同的编译器选项。 -
Och,因为当
COMPILER_OPTS_FILE发生变化时,main_prog的所有源都需要重建。好的,对不起,我错过了。试试看:设置对源文件本身的依赖。遍历main_progget_target_property(main_prog SOURCES sources)中的文件并对每个源执行set_source_files_properties(${sources} OBJECT_DEPENDS ${COMPILER_OPTS_FILE})。我认为应该这样做。