cmake add_compile_definitions 用于 xcode 的特定架构

问题描述 投票:0回答:2

当我在 CMake 中使用

add_definitions(-DENABLE_SOMETHING)
add_compile_definitions(-DENABLE_SOMETHING)
生成 Xcode 项目时,它将适用于构建设置中的所有拱门。如下所示:

如何对特定架构使用 add_definitions 或 add_compile_definitions ,如下所示:

因为我想为arm64和armv7定义不同的宏。

我尝试附加或设置 xcode 属性 XCODE_ATTRIBUTE_GCC_PREPROCESSOR_DEFINITIONS[arch=arm64],但它将覆盖之前生成的值,只保留新宏。

我知道有一个简单的方法可以解决这个问题,通过使用不同的架构生成两次 xcode 项目,就像这样

cmake . -G Xcode -DARCHS="armv7"
cmake . -G Xcode -DARCHS="arm64"

但我想知道如何解决这个问题,避免运行命令两次。

xcode cmake
2个回答
1
投票

问得好!我认为使用

XCODE_ATTRIBUTE_<an-attribute>
目标属性是正确的。文档说它接受生成器表达式,所以也许你可以做这样的事情?

# early on:
set_property(
  TARGET MyApp
  PROPERTY XCODE_ATTRIBUTE_GCC_PREPROCESSOR_DEFINITIONS[arch=arm64]
  "$<JOIN:$<TARGET_PROPERTY:MyApp,COMPILE_DEFINITIONS>;$<TARGET_PROPERTY:MyApp,ARM64_COMPILE_DEFINITIONS>, >"
)

# later on:
if (CMAKE_GENERATOR MATCHES "Xcode")
  set_property(TARGET MyApp APPEND PROPERTY ARM64_COMPILE_DEFINITIONS ENABLE_SOMETHING)
elseif (ARCHS MATCHES "arm64")
  target_compile_definitions(MyApp PRIVATE ENABLE_SOMETHING)
endif ()

这里的想法是,您可以获得通常的编译定义(通过生成器表达式),以及添加到 自定义属性

ARM64_COMPILE_DEFINITIONS
的定义。


0
投票

回答我的问题。 我放弃了寻找纯 cmake 的方法来解决这个问题,并在 arch 宏中使用编译器(llvm 或 gcc)来找出它是哪个 arch。

    #if defined(__aarch64__) // arm64
    #define MACRO_FOR_ARM64
    #elif defined(__arm__) // armv7
    #define MACRO_FOR_ARMV7
    #endif

我在一个通用头文件中定义了它,它将包含在我想要使用该宏的任何文件中。

© www.soinside.com 2019 - 2024. All rights reserved.