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 или 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–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.25/prop_tgt/IMPORTED_OBJECTS.html