我想在每次构建项目时运行一个脚本,**但如果任何依赖文件发生更改,也要运行脚本。现在我有:
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
上运行
1条答案
按热度按时间tv6aics11#
就像文件上说的,
该命令将成为目标的一部分,并且仅在构建目标本身时执行。如果目标已生成,则不会执行该命令。
参见:https://cmake.org/cmake/help/latest/command/add_custom_command.html#build-events
因此,
limine.cfg
是否被修改并不重要,因为kernel
* 没有构建 *。POST_BUILD
加上BYPRODUCTS
通常表示您希望OUTPUT
依赖于该目标,再加上一个自定义目标来驱动OUTPUT
命令。大概是这样的:字符串
请注意,
$<TARGET_FILE:kernel>
生成器表达式隐式地在kernel
上添加了一个 * 目标级 * 依赖项,而不是 * 文件级 * 依赖项。这意味着构建kernel_iso
不会使kernel
保持最新。通过在DEPENDS
中命名kernel
,我们建立了必要的文件级依赖关系。