当Post Build命令的依赖项变更时,如何重建目标?
问题翻译
我使用custom_command作为POST_BUILD步骤对可执行文件进行签名,该命令依赖于一个生成签名证书的目标。可执行文件目标也通过add_dependency依赖于该证书生成目标。当证书被意外删除后,构建会生成新证书,但不会触发所有可执行文件的重建(因其依赖项未变更),且POST_BUILD自定义命令也不会执行,导致证书与已签名的可执行文件不匹配。如何让可执行文件重建/链接,或仅在证书文件变更后执行Post Build步骤?
解决方案
方案1:让POST_BUILD命令直接依赖证书文件
问题核心是原POST_BUILD命令仅依赖证书生成目标,而非证书文件本身。修改add_custom_command,将证书文件路径加入DEPENDS列表,这样证书文件的修改(包括删除后重建)会触发签名命令重新执行:
# 假设证书生成目标为generate_cert,生成的证书路径为${CMAKE_BINARY_DIR}/cert.pem add_custom_command(TARGET my_exe POST_BUILD COMMAND sign_tool sign $<TARGET_FILE:my_exe> --cert ${CMAKE_BINARY_DIR}/cert.pem DEPENDS generate_cert ${CMAKE_BINARY_DIR}/cert.pem # 新增证书文件依赖 ) add_dependencies(my_exe generate_cert)
这个方案无需重建可执行文件,仅在证书变化时重新签名,是最轻量化的解决方式。
方案2:将证书文件设为可执行文件的链接依赖
如果需要确保证书变化时可执行文件强制重新链接(进而触发POST_BUILD步骤),可以通过LINK_DEPENDS属性将证书文件设为可执行文件的链接依赖:
set_target_properties(my_exe PROPERTIES LINK_DEPENDS ${CMAKE_BINARY_DIR}/cert.pem ) add_dependencies(my_exe generate_cert)
当证书文件修改时间变更时,CMake会判定可执行文件的链接依赖发生变化,自动触发重新链接,之后POST_BUILD签名步骤也会随之执行。
方案3:用自定义目标管理签名步骤
创建专门的签名目标,让它同时依赖可执行文件和证书文件,再将该目标加入默认构建流程:
add_custom_target(sign_my_exe COMMAND sign_tool sign $<TARGET_FILE:my_exe> --cert ${CMAKE_BINARY_DIR}/cert.pem DEPENDS my_exe ${CMAKE_BINARY_DIR}/cert.pem ) add_dependencies(sign_my_exe generate_cert) # 将签名目标加入默认构建目标(适配多数CMake版本) add_dependencies(${CMAKE_PROJECT_NAME} sign_my_exe)
这种方式适合需要集中管理多个签名任务的场景,确保每次构建都会检查证书状态并执行必要的签名操作。
内容的提问来源于stack exchange,提问作者mgr
相关产品推荐
相关产品推荐

