使用 CMake 签署 MacOS 框架

pcb*_*ion 5 c++ macos xcode cmake codesign

我正在开发一个 C/C++ 库,它将作为苹果架构的框架进行分发,但我无法让 CMake 签署我的二进制文件以进行公证/分发。

使用 CMake 协同设计框架的最佳实践是什么?

由于该库将支持多个平台,因此我想使用现有的 conan/cmake 构建系统,而不是专门为苹果维护单独的 Xcode 项目文件。理想情况下,我希望将代码签名作为构建的一部分,这样 conan 就会自动打包签名的框架。

根据CMakeFRAMEWORK文档和我在该主题上挖掘的其他问题,似乎只要设置了XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY和,CMake 就应该签署我的输出包XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED,但这不是我所拥有的经验。我的 CMake 输出没有提及代码签名,并且在构建/打包后,快速代码签名验证显示代码签名没有发生:

codesign -v build/package/HelloWorld.framework

build/package/HelloWorld.framework: code object is not signed at all
In architecture: x86_64
Run Code Online (Sandbox Code Playgroud)

我的框架的目标属性设置如下:

set_target_properties(${TARGET_NAME} PROPERTIES
    OUTPUT_NAME ${TARGET_NAME}
    PUBLIC_HEADER "${PUB_INCLUDES}")
if((CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR CMAKE_SYSTEM_NAME STREQUAL "iOS") AND BUILD_SHARED_LIBS)
    set_target_properties(${TARGET_NAME} PROPERTIES
        FRAMEWORK TRUE
        FRAMEWORK_VERSION C
        MACOSX_FRAMEWORK_IDENTIFIER "com.example.project"
        XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED ${APPLE_SIGN_BINARIES}
        XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${APPLE_CERT_IDENTIFIER}"
        XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "XXXXX")
endif()
Run Code Online (Sandbox Code Playgroud)

我通常使用 APPLE_CERT_IDENTIFIER =“开发人员 ID”,但我也尝试过各种其他开发人员和分发证书,包括尝试它们的全名(即“开发人员 ID 应用程序:Devname(十六进制代码)”)。将 CODE_SIGNING_REQUIRED 设置为 TRUE、YES 或完全消除它似乎没有什么区别。

我还知道CPack 的捆绑包生成器。我还没有尝试过这条路线,因为乍一看它似乎更适合安装程序包和完整的应用程序而不是单独的框架。这是我应该追求的东西而不是FRAMEWORK上面的目标属性吗?

小智 1

你如何调用cmake命令?您需要使用Xcode生成器才能XCODE_ATTRIBUTE_*使属性生效。

传递-G Xcode给你的cmake命令,例如cmake -S <...> ... -G Xcode ...

来自(强调我的)文档XCODE_ATTRIBUTE_<an-attribute>

告诉 Xcode 生成器在生成的 Xcode 项目中设置为给定值。在其他生成器上被忽略。