Spec-Zone.ru › CMake 3.29

IMPORTED_OBJECTS

Новые возможности версии 3.9.

Список абсолютных путей к объектным файлам на диске, разделённый точкой с запятой, для импортированной объектной библиотеки.

Игнорируется для неимпортированных целей.

Проекты могут пропустить IMPORTED_OBJECTS если задан конфигурационно-специфический параметр IMPORTED_OBJECTS_<CONFIG>, за исключением ситуаций, описанных ниже.

Учёт генератора Xcode

Новые возможности версии 3.20.

Для платформ Apple проект может быть скомпилирован для нескольких архитектур. Это контролируется переменной CMAKE_OSX_ARCHITECTURES. Для всех генераторов, кроме генератора Xcode, CMake вызывает компиляторы один раз на каждый исходный файл и передает несколько -arch флагов, что приводит к одному объектному файлу, который будет универсальной бинарной. Такие объектные файлы хорошо работают, когда перечислены в IMPORTED_OBJECTS отдельного CMake билда, даже для генератора Xcode. Но создание таких объектных файлов с генератором Xcode сложнее, так как он вызывает компилятор один раз на каждую архитектуру для каждого исходного файла. В отличие от других генераторов, он не генерирует универсальные бинарные объектные файлы.

Ещё одна сложность с генератором Xcode заключается в том, что при нацеливании на платформы устройств (iOS, tvOS, visionOS или watchOS), генератор Xcode может использовать SDK устройства или симулятора без необходимости повторного запуска CMake. SDK может быть выбран во время сборки. Но поскольку некоторые архитектуры могут поддерживаться как SDK устройства, так и SDK симулятора (например, arm64 с Xcode 12 или более поздней версией), не все комбинации могут быть представлены в одной универсальной бинарной. Единственным решением в этом случае является наличие нескольких объектных файлов.

IMPORTED_OBJECTS не поддерживает выражения генератора, поэтому каждый файл в нём должен быть допустим для каждой архитектуры и SDK. Если вы включаете объектные файлы, которые не являются универсальными бинарными, путь и/или имя файла каждого объектного файла должны каким-то образом обобщать различные архитектуры и SDK. С генератором Xcode, переменные Xcode вида $(...) могут использоваться для представления этих аспектов, и Xcode заменит соответствующие значения во время сборки. CMake не интерпретирует эти переменные и встраивает их без изменений в файл проекта Xcode. $(CURRENT_ARCH) может использоваться для представления архитектуры, а $(EFFECTIVE_PLATFORM_NAME) — для различения SDK.

Ниже приведен пример использования этих двух переменных для ссылки на объектный файл, чьё расположение зависит как от SDK, так и от архитектуры:

add_library(someObjs OBJECT IMPORTED)

set_property(TARGET someObjs PROPERTY IMPORTED_OBJECTS
  # Quotes are required because of the ()
  "/path/to/somewhere/objects$(EFFECTIVE_PLATFORM_NAME)/$(CURRENT_ARCH)/func.o"
)

# Example paths:
#   /path/to/somewhere/objects-iphoneos/arm64/func.o
#   /path/to/somewhere/objects-iphonesimulator/x86_64/func.o

В некоторых случаях вам может потребоваться иметь конфигурационно-специфичные объектные файлы. Переменная Xcode $(CONFIGURATION) часто используется для этого и может использоваться совместно с другими упомянутыми выше переменными:

add_library(someObjs OBJECT IMPORTED)
set_property(TARGET someObjs PROPERTY IMPORTED_OBJECTS
  "/path/to/somewhere/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(CURRENT_ARCH)/func.o"
)

# Example paths:
#   /path/to/somewhere/Release-iphoneos/arm64/func.o
#   /path/to/somewhere/Debug-iphonesimulator/x86_64/func.o

Когда используется любая переменная Xcode, CMake не может полностью оценить путь(и) во время настройки. Одним следствием этого является то, что конфигурационно-специфические IMPORTED_OBJECTS_<CONFIG> свойства не могут быть использованы, так как CMake не может определить, существует ли объектный файл по указанному <CONFIG> пути. Для этих ситуаций необходимо использовать свойство IMPORTED_OBJECTS, а конфигурационно-специфические аспекты пути должны быть обработаны переменной Xcode $(CONFIGURATION).

© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.29/prop_tgt/IMPORTED_OBJECTS.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API