CMake POST_BUILD自定义命令忽略文件依赖项

p8ekf7hl  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(157)

我想在每次构建项目时运行一个脚本,**但如果任何依赖文件发生更改,也要运行脚本。现在我有:

add_custom_command(
    TARGET kernel POST_BUILD
    # doesn't work :(
    DEPENDS 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
)

字符串
如果我编辑任何源代码,它都能正常工作,但如果我 * 只 * 在limine.cfg上更改某些内容,则该命令不会在cmake --build build上运行

tv6aics1

tv6aics11#

就像文件上说的,
该命令将成为目标的一部分,并且仅在构建目标本身时执行。如果目标已生成,则不会执行该命令。
参见:https://cmake.org/cmake/help/latest/command/add_custom_command.html#build-events
因此,limine.cfg是否被修改并不重要,因为kernel * 没有构建 *。
POST_BUILD加上BYPRODUCTS通常表示您希望OUTPUT依赖于该目标,再加上一个自定义目标来驱动OUTPUT命令。大概是这样的:

set(kernel_iso "${CMAKE_CURRENT_BINARY_DIR}/kernel.iso")
set(iso_root "${CMAKE_CURRENT_BINARY_DIR}/iso_root")
set(build_script "${CMAKE_CURRENT_SOURCE_DIR}/build-iso.sh")

add_custom_command(
    OUTPUT "${kernel_iso}"
    COMMAND "${build_script}" "$<TARGET_FILE:kernel>" "${kernel_iso}" "${iso_root}"
    DEPENDS
      "${build_script}"
      limine.cfg
      kernel  # File-level dependency on `kernel`.
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    VERBATIM
)

add_custom_target(kernel_iso ALL DEPENDS "${kernel_iso}")

字符串
请注意,$<TARGET_FILE:kernel>生成器表达式隐式地在kernel上添加了一个 * 目标级 * 依赖项,而不是 * 文件级 * 依赖项。这意味着构建kernel_iso不会使kernel保持最新。通过在DEPENDS中命名kernel,我们建立了必要的文件级依赖关系。

相关问题