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 устройства, либо 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
В некоторых случаях вам может потребоваться наличие объектных файлов, специфичных для конфигурации. Переменная CMAKE_CFG_INTDIR может быть удобным способом включения этого в сочетании со SDK:
add_library(someObjs OBJECT IMPORTED)
set_property(TARGET someObjs PROPERTY IMPORTED_OBJECTS
"/path/to/somewhere/${CMAKE_CFG_INTDIR}/$(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_CFG_INTDIR, CMake не может полностью оценить путь(и) во время настройки. Следствием этого является то, что конфигурационно-специфические параметры IMPORTED_OBJECTS_<CONFIG> нельзя использовать, так как CMake не может определить, существует ли объектный файл в конкретном <CONFIG> местоположении. В таких случаях необходимо использовать параметр IMPORTED_OBJECTS, а конфигурационно-специфические аспекты пути необходимо обрабатывать с помощью CMAKE_CFG_INTDIR или с помощью другой переменной Xcode $(CONFIGURATION).
© 2000–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.20/prop_tgt/IMPORTED_OBJECTS.html