如何在CMake生成*.pbxproj后自动运行Shell脚本?
针对CMake生成Xcode工程后自动执行Shell脚本的解决方案
方案1:用add_custom_target关联Xcode工程文件
直接将自定义目标依赖于生成的.pbxproj文件,确保脚本在工程文件生成后执行:
# 定义自定义目标,指定脚本路径 add_custom_target( RunPostGenScript ALL COMMAND /path/to/your/script.sh COMMENT "Running post-generation shell script..." ) # 指向生成的Xcode工程文件(替换为你的工程名) set(XCODE_PROJECT_FILE "${CMAKE_BINARY_DIR}/YourProject.xcodeproj/project.pbxproj") # 让自定义目标依赖pbxproj文件 add_dependencies(RunPostGenScript "${XCODE_PROJECT_FILE}")
这种方式会在.pbxproj生成完成后触发脚本执行,Xcode控制台会显示COMMENT中的提示信息。
方案2:利用CMake生成后事件钩子(CMake 3.17+)
通过生成标记文件确保脚本只在生成阶段结束后执行一次:
set(PROJECT_POST_SCRIPT "/path/to/your/script.sh") add_custom_command( OUTPUT "${CMAKE_BINARY_DIR}/.post_gen_marker" COMMAND "${PROJECT_POST_SCRIPT}" COMMAND touch "${CMAKE_BINARY_DIR}/.post_gen_marker" COMMENT "Executing post-generation script" ) add_custom_target( PostGen ALL DEPENDS "${CMAKE_BINARY_DIR}/.post_gen_marker" )
标记文件会作为依赖项,避免脚本在后续CMake重新配置时重复执行。
方案3:全局CMake钩子脚本
创建全局钩子脚本,在所有CMake生成流程末尾触发脚本:
- 新建
post_gen_hook.cmake文件:
if(XCODE) execute_process( COMMAND /path/to/your/script.sh WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" RESULT_VARIABLE SCRIPT_RESULT ) if(NOT SCRIPT_RESULT EQUAL 0) message(WARNING "Post-generation script failed with exit code ${SCRIPT_RESULT}") endif() endif()
- 在主
CMakeLists.txt中引入:
set(CMAKE_PROJECT_INCLUDE "${CMAKE_SOURCE_DIR}/post_gen_hook.cmake")
此方案会在CMake配置完成、工程文件生成后自动执行脚本。
方案4:给Xcode添加预构建阶段
通过CMake给Xcode工程添加预构建阶段,利用首次构建必然在工程生成后的特性:
if(XCODE) add_custom_command( TARGET ${PROJECT_NAME} PRE_BUILD COMMAND /path/to/your/script.sh COMMENT "Running pre-build script (post Xcode generation)" ) endif()
脚本会在Xcode首次构建前执行,满足工程生成后自动运行的需求,且Xcode控制台会清晰展示执行日志。
内容的提问来源于stack exchange,提问作者Jiri Zaloudek
相关产品推荐
相关产品推荐

