CMake POST_BUILD自定义命令忽略文件依赖变更的技术问询
问题原因
add_custom_command(TARGET ... POST_BUILD) 的执行逻辑是仅当绑定的目标(这里是kernel)被重新构建时,才会触发命令并检查DEPENDS中的文件。如果只是修改了limine.cfg这类依赖文件,但kernel目标本身不需要重新编译(源码没变化),POST_BUILD命令不会执行。
解决方案
改用add_custom_target创建独立的自定义目标,让它同时依赖kernel目标和需要监控的文件,这样无论是kernel重建还是依赖文件变更,都会触发脚本执行。修改后的配置如下:
add_custom_target( build_kernel_iso ALL DEPENDS kernel build-iso.sh limine.cfg BYPRODUCTS ${CMAKE_BINARY_DIR}/kernel.iso COMMAND ./build-iso.sh $<TARGET_FILE:kernel> ${CMAKE_BINARY_DIR}/kernel.iso ${CMAKE_BINARY_DIR}/iso_root WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} VERBATIM )
关键改动说明
ALL关键字:让这个目标成为默认构建目标的一部分,执行cmake --build build时会自动运行(如果不需要默认执行,可去掉该关键字,构建时需指定--target build_kernel_iso)。DEPENDS kernel:保证kernel目标构建完成后才执行脚本,和原POST_BUILD的时序一致。DEPENDS build-iso.sh limine.cfg:直接监控这些文件的变化,只要它们修改,就会触发目标执行。BYPRODUCTS:告诉CMake生成的kernel.iso是构建产物,避免无意义的重复构建。
内容的提问来源于stack exchange,提问作者mat
相关产品推荐
相关产品推荐

