如何在ExternalProject_Add的CMAKE_ARGS中传递带有多个值的CMAKE_OSX_ARCHITECTURES

kqqjbcuj  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(212)

我找不到一种方法来创建我的CMake ExternalProjects的胖库。问题的优点是如何传递-DCMAKE_OSX_ARCHITECTURES:STRING=“x86_64;arm 64”添加到ExternalProject_Add定义中的CMAKE_ARGS。
人们会期望下面的定义可以完美地工作。然而,似乎CMAKE_ARGS的内容正在以某种方式被解析,这导致了结果CMakeCache.txt中的错误值。

  • CMake定义 *
ExternalProject_Add(
        ext_libexiv2
        GIT_REPOSITORY https://github.com/Exiv2/exiv2.git
        GIT_TAG v0.27.6
        GIT_SHALLOW true
        CMAKE_ARGS -DCMAKE_OSX_ARCHITECTURES:STRING="x86_64;arm64" -DBUILD_SHARED_LIBS=OFF -DEXIV2_BUILD_SAMPLES=OFF -DEXIV2_BUILD_EXIV2_COMMAND=OFF
        UPDATE_COMMAND ""
)
  • CMakeCache.txt*
//No help, variable specified on the command line.
CMAKE_OSX_ARCHITECTURES:STRING="x86_64

我试着转义双引号,使用单引号,转义分号,但都没有成功。
当然,我可以做的脂肪库在多个步骤,但我更喜欢清洁的解决方案。我会感谢任何方向你给予我。

h6my8fg2

h6my8fg21#

解决方案是在ExternalProject_Add定义中使用LIST_SEPARATOR选项。

ExternalProject_Add(
        ext_libexiv2
        GIT_REPOSITORY https://github.com/Exiv2/exiv2.git
        GIT_TAG v0.27.6
        GIT_SHALLOW true
        LIST_SEPARATOR |
        CMAKE_ARGS -DCMAKE_OSX_ARCHITECTURES:STRING=x86_64|arm64 -DBUILD_SHARED_LIBS=OFF -DEXIV2_BUILD_SAMPLES=OFF -DEXIV2_BUILD_EXIV2_COMMAND=OFF
        UPDATE_COMMAND ""
)

这样,得到的缓存值就是正确的缓存值。

//No help, variable specified on the command line.
CMAKE_OSX_ARCHITECTURES:STRING=x86_64;arm64

结果库现在真的很胖。

➜  lib git:(prebuilt-components-replacement) ✗ lipo -info *.a
Architectures in the fat file: libexiv2-xmp.a are: x86_64 arm64
Architectures in the fat file: libexiv2.a are: x86_64 arm64
mnowg1ta

mnowg1ta2#

如果你切换到使用CMAKE_CACHE_ARGS而不是CMAKE_ARGS,这个问题就会消失。就像CMAKE_CACHE_ARGS "-DCMAKE_OSX_ARCHITECTURES:STRING=x86_64;arm64"一样。从文档中:
这是指定缓存变量的另一种方法,其中命令行长度问题可能会成为问题。参数的格式应为-Dvar:STRING=value,然后使用FORCE选项将其转换为CMake set()命令。这些set()命令写入预加载脚本,然后使用cmake -C命令行选项应用该脚本。

相关问题