Свойства проекта Xcode верхнего уровня CMake

Я использую Cmake с Xcode для создания С++/c "project" (my_project) и некоторых С++/c "целей" (один из них является двоичным, остальные - библиотеки)

My CMakeLists.txt выглядит примерно так:

project(my_project)
add_subdirectory(library_projectA)
add_subdirectory(library_projectB)
add_subdirectory(binary_project) 

В каждом подкаталоге есть CMakeLists.txt с:

add_library(library_projectA)

или

add_executable(binary_project)

Создает верхний уровень my_project.xcodeproj, который ссылается на подпроекты.

Xcode имеет это наследование иерархического свойства (левые поля имеют приоритет над правыми полями):

Цель, проект, по умолчанию

Я хотел бы изменить поля Project, т.е. для my_project. Это должно повлиять на ВСЕ цели.

Я пробовал это:

add_custom_target(my_project)
add_target_properties(my_project PROPERTIES XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "NO")

Но это не сработает.

Обратите внимание, что если я поместил это в один из "Целей":

add_target_properties(binary_project PROPERTIES XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "NO")

Тогда это работает, но только для этого "Target"

Если это не ясно, я был бы рад предоставить рабочий пример, но это займет немного времени...

О том, что кто-то знает о более быстром решении всей проблемы, я бы хотел, чтобы чистая установка Xcode не придумала это (или любое другое) предупреждение:

Проект 'my_project' переопределяет параметр Архитектуры. Это будет удалите настройку и разрешите Xcode автоматически выбирать Архитектуры, основанные на оборудовании, доступном для активной платформы и цели развертывания.

Ответ 1

Мне недавно понадобилось то же самое, поэтому мне пришлось изучить исходный код CMake.

В настоящее время вы можете устанавливать атрибуты только для целей, и нет способа установить их на уровне проекта.

Тем не менее, можно изменить ONLY_ACTIVE_ARCH на уровне проекта несколько иначе. Реализованная логика в cmake следующая (для версии 2.8.12):

  • Если CMAKE_OSX_ARCHITECTURES не задано, то cmake устанавливает ONLY_ACTIVE_ARCH в YES на уровне проекта, и в зависимости от версии xcode он устанавливает архитектуры по умолчанию либо $(ARCHS_STANDARD_32_64_BIT), либо $(ARCHS_STANDARD_32_BIT)
  • Если CMAKE_OSX_ARCHITECTURES определено, то ONLY_ACTIVE_ARCH становится NO

Я предпочитаю устанавливать CMAKE_OSX_ARCHITECTURES, так что XCode строит живые библиотеки, а для самых больших библиотек я просто вручную устанавливаю ONLY_ACTIVE_ARCH в YES только для конфигурации Debug. Это выглядит так:

set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_64_BIT)")

...

set_target_properties(test PROPERTIES XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH[variant=Debug] "YES")

Ответ 2

Вы можете сделать это, добавив это в ваш верхний уровень CMakeLists.txt:

set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH[variant=Release] NO)

Удалите [variant=Release] чтобы применить его ко всем вариантам.