macOS下通过CMake CPack嵌入安装第三方pkg包的正确方法
你的当前方法完全错误
你把第三方.pkg文件当作导入可执行目标处理,install(IMPORTED_RUNTIME_ARTIFACTS)的作用仅仅是将指定文件复制到安装目录,根本不会触发macOS安装包的执行逻辑,所以只会把XYZ.pkg拷贝到产品目录,不会完成链式安装。
实现依赖链式安装的两种正确方式
方式一:利用macOS安装包原生依赖声明(推荐)
如果XYZ.pkg有官方的bundle标识符(比如com.vendor.XYZ),可以通过CPack配置你的安装包依赖该标识符,让macOS系统安装器自动处理依赖检查与安装:
# 替换为XYZ.pkg实际的bundle identifier set(CPACK_OSX_PACKAGE_REQUIREMENTS "com.vendor.XYZ")
配置后,用户安装你的包时,系统会自动检测是否已安装XYZ:未安装则提示用户先完成XYZ的安装,若你将两个包一起分发,系统会按依赖顺序自动完成链式安装。
方式二:通过预安装脚本强制执行XYZ.pkg安装
如果XYZ.pkg没有公开的bundle标识符,或你需要强制在安装你的包前自动安装XYZ,可以通过预安装脚本实现:
- 先将
XYZ.pkg打包到安装包的资源目录:
install(FILES ${CMAKE_BINARY_DIR}/import/redist/XYZ.pkg DESTINATION Resources COMPONENT XYZ)
- 在项目目录下创建
preinstall.sh脚本:
#!/bin/bash # 获取当前安装包的资源路径 RESOURCE_DIR="$2/Resources" # 执行XYZ.pkg安装,需要管理员权限 installer -pkg "$RESOURCE_DIR/XYZ.pkg" -target /
- 在CMake中指定该脚本为预安装脚本:
set(CPACK_OSX_PACKAGE_PREINSTALL_SCRIPT ${CMAKE_SOURCE_DIR}/preinstall.sh)
注意:这种方式会触发管理员权限验证,且可能重复安装已存在的XYZ,需根据实际场景评估是否适用。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

