在 OSX 上使用 CMake 将 Adob​​e 的 XMP 工具包构建为共享库的最简单方法是什么?

What's the easiest way to build Adobe's XMP toolkit as a shared library with CMake on OSX?

我正在整理一个应该是跨平台的小项目,用 CMake 构建,它需要 link 和 Adobe's XMP toolkit (libxmp).理想情况下,我希望 CMake 负责构建依赖项,包括 libxmp,一举成名。

不幸的是,XMP 工具包设计为在 OSX 上使用 XCode 构建,在 Linux 上使用 CMake 构建。 CMake 构建过程似乎无法在 OSX.

开箱即用

为了在 OSX 上使用 CMake 构建 XMP 工具包,我可以对它做的最小更改是什么?我是否应该一直修改它直到它起作用,或者这是一个 known/solved 问题?而且,更一般地说,我应该对自己的 CMakeLists.txt 文件添加哪些内容才能将此项目与我自己的项目集成?

今天我学到了一些东西,一些误解显然已经烟消云散。

满足第三方依赖要求后(expat 和 zlib;这只是将源压缩包中的文件解压到指定位置的问题),一旦我意识到 XCode 可以从命令行在这里利用,并且 XMP 自己的 "build system" 有足够的工具来完成我需要的一切。

简而言之,来自 build 目录:

./cmake.command 64 Dynamic WarningAsError ToolchainLLVM.cmake
cd xcode/dynamic/intel_64
xcodebuild -scheme ALL_BUILD build

然后,在 public/libraries/macintosh/intel_64/Debug 下找到了框架文件,并且在 public/include.

下已经可以使用 include 了

经过一些自由符号链接后,在我自己的项目 CMakeLists.txt 中,它只是一个问题:

target_compile_definitions(myProject
    PUBLIC
        MAC_ENV
)

target_include_directories(
    myProject
    PRIVATE
        include/libxmp
)

# Add build dir to path for finding frameworks (libmxp)
set_target_properties(
    myProject 
    PROPERTIES
        LINK_FLAGS "-Wl,-F${CMAKE_BINARY_DIR}/Frameworks"
)

target_link_libraries(
    myProject
    PRIVATE
        catch
        "-framework XMPCore"
        "-framework XMPFiles"
)

它当然可以被巧妙地处理,但这样做却不然 "just work"。


如果您使用的是 XMP Toolkit 2016.07(并且,在撰写本文时,没有更新的版本)并且有 Xcode 10+ & Mojave,您需要在安装之前安装几个补丁构建:

  1. Xcode version detect fix
  2. stdlib config fix
  3. Map/pair type alias fixes

此外,如果您使用 expat 2.2.2 或更新版本:

  1. expatxmlparse.c 的顶部定义 HAVE_ARC4RANDOM_BUFXML_POOR_ENTROPY(因为 libxmp 构建系统不会这样做为你)