我们构建了几个私有框架,这些框架在我们的Xcode构建过程中被复制到我们的应用程序包中。我正在将整个构建过程转移到CMake,这是我无法解决的一个领域。
我找到了一个实用程序模块:CMakeIngestOSXBundleLibraries.cmake,但我有点不清楚如何使用它,或者它是否符合我们的要求。我希望每次应用程序在链接后构建时都会运行它。这让我相信我应该做像
这样的事情IF (APPLE)
add_custom_command( TargetName POST_BUILD CMakeIngestOSXBundleLibraries.cmake )
ENDIF (APPLE)
但我不认为这是对的。有人有这方面的经验吗?
答案 0 :(得分:1)
这就是我正在做的事情:
1)在我的框架CMakeLists.txt文件中,我有以下内容:
IF (APPLE)
SET_TARGET_PROPERTIES( MyFramework PROPERTIES FRAMEWORK true)
SET_TARGET_PROPERTIES( MyFramework PROPERTIES
XCODE_ATTRIBUTE_INSTALL_PATH @executable_path/../Frameworks/ )
ENDIF (APPLE)
第二个“set_target_properties”行将框架配置为 始终在框架中的应用程序包中查找 子文件夹中。
2)在我的顶级CMakeLists.txt文件中,我添加了一个统一的二进制文件 输出目录:
SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Bin)
SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Bin )
SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Bin )
3)然后,在我的应用程序的CMakeLists.txt文件中,我有以下内容:
IF (APPLE)
ADD_CUSTOM_COMMAND(
TARGET MyApp
POST_BUILD
COMMAND ${PYTHON_EXECUTABLE}
ARGS ${CMAKE_HOME_DIRECTORY}/CopyFramework.py
--binary ${PROJECT_BINARY_DIR}/Bin
--framework MyFramework.framework
--app MyApp.app
)
ENDIF (APPLE)
这会调用我的python脚本,它执行汇编工作 src和dest路径,实际上是复制框架。
最后的诀窍是,因为这是Mac唯一的东西,我可以依靠 Python脚本中的Xcode环境变量:
config= os.environ["CONFIGURATION"]
这允许我组装实际二进制文件的完整路径 框架和应用程序的位置。
我希望的一件事就是有一个CMake变量 在上下文中扩展到当前的Config ADD_CUSTOM_COMMAND ......不必诉诸于使用 Xcode环境变量。