如何让CMake自动签名所有MacOS可执行目标以启用核心转储?
MacOS下CMake自动签名可执行目标以支持核心转储
MacOS中,可执行文件必须签名才能生成核心转储。针对层级化CMake项目,可通过根目录配置实现自动签名所有可执行目标,无需修改子目录的CMakeLists.txt。
准备工作
将以下内容保存为segv.entitlements并加入代码仓库(建议放在项目根目录的cmake/子目录下):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.get-task-allow</key> <true/> </dict> </plist>
根目录CMake配置
在项目根目录的CMakeLists.txt中添加以下代码,仅在MacOS环境下触发签名流程:
if(APPLE) # 指定entitlements文件路径,根据实际存放位置调整 set(CORE_DUMP_ENTITLEMENTS "${PROJECT_SOURCE_DIR}/cmake/segv.entitlements") # 定义自动签名函数,仅处理可执行目标 function(auto_sign_for_core_dump target) get_target_property(target_type ${target} TYPE) if(target_type STREQUAL "EXECUTABLE") add_custom_command(TARGET ${target} POST_BUILD COMMAND codesign -s - -f --entitlements "${CORE_DUMP_ENTITLEMENTS}" "$<TARGET_FILE:${target}>" COMMENT "Signing ${target} to enable core dumps on MacOS" VERBATIM ) endif() endfunction() # 为已定义的所有目标应用签名 get_all_targets(all_project_targets) foreach(target IN LISTS all_project_targets) auto_sign_for_core_dump(${target}) endforeach() # 处理后续新增的目标(可选,确保动态添加的目标也被签名) add_custom_target(auto_sign_all ALL) add_custom_command(TARGET auto_sign_all PRE_BUILD COMMAND ${CMAKE_COMMAND} -D "ENTITLEMENTS_FILE=${CORE_DUMP_ENTITLEMENTS}" -P "${PROJECT_SOURCE_DIR}/cmake/sign_all_targets.cmake" VERBATIM ) endif()
辅助脚本(可选)
若需要确保后续动态添加的目标也能被签名,在cmake/目录下创建sign_all_targets.cmake:
get_all_targets(all_targets) foreach(target IN LISTS all_targets) get_target_property(target_type ${target} TYPE) if(target_type STREQUAL "EXECUTABLE") execute_process( COMMAND codesign -s - -f --entitlements "${ENTITLEMENTS_FILE}" "$<TARGET_FILE:${target}>" RESULT_VARIABLE sign_result ) if(sign_result EQUAL 0) message(STATUS "Successfully signed ${target} for core dump support") else() message(WARNING "Failed to sign ${target}") endif() endif() endforeach()
关键说明
- 该配置仅在MacOS下生效,完全不影响Linux生产环境的构建流程。
- 无需修改任何子目录的
CMakeLists.txt,根目录配置会自动遍历所有可执行目标。 codesign -s -使用自签名证书,完全满足开发环境需求,无需额外申请证书。
内容的提问来源于stack exchange,提问作者Alex O
相关产品推荐
相关产品推荐

