Instalace cílů¶
install(TARGETS targets... ] ] ] )
Formulář TARGETS
určuje pravidla pro instalaci cílů z aproject. Existuje několik druhů cílových výstupních artefaktů, které lze instalovat:
ARCHIVE
Mezi cílové artefakty tohoto druhu patří:
-
Statické knihovny(kromě systému MacOS, pokud jsou označeny jako
FRAMEWORK
, viz níže); -
DLL importní knihovny(ve všech systémech se systémem Windows včetně Cygwin; mají příponu
.lib
, na rozdíl od knihoven.dll
, které jdou doRUNTIME
); -
V systému AIX je importní soubor linkeru vytvořený pro spustitelné soubory s povolenou příponou
ENABLE_EXPORTS
.
LIBRARY
Cílové artefakty tohoto druhu zahrnují:
-
Sdílené knihovny, kromě
-
DLL (ty jdou do
RUNTIME
, viz níže), -
v systému MacOS, pokud jsou označeny jako
FRAMEWORK
(viz níže).
-
RUNTIME
Cílové artefakty tohoto druhu zahrnují:
-
Spustitelné soubory (s výjimkou systému macOS, pokud jsou označeny jako
MACOSX_BUNDLE
, vizBUNDLE
níže); -
DLL (ve všech systémech se systémem Windows včetně Cygwin; všimněte si, že doprovodné importní knihovny jsou druhu
ARCHIVE
).
OBJECTS
Novinka ve verzi 3.9.
Objektové soubory spojené s objektovými knihovnami.
FRAMEWORK
Statické i sdílené knihovny označené vlastností FRAMEWORK
jsou v systému MacOS považovány za FRAMEWORK
cíle.
BUNDLE
S spustitelnými soubory označenými vlastností MACOSX_BUNDLE
se v systému macOS zachází jako s BUNDLE
cíli.
PUBLIC_HEADER
Všechny PUBLIC_HEADER
soubory spojené s knihovnou se na platformách jiných než Apple nainstalují do cíle určeného argumentem PUBLIC_HEADER
. Pravidla definovaná tímto argumentem jsou pro FRAMEWORK
knihovny na platformách Apple ignorována, protože přidružené soubory jsou instaloványdo příslušných umístění uvnitř složky frameworku. Podrobnosti viz PUBLIC_HEADER
.
PRIVATE_HEADER
Podobné jako PUBLIC_HEADER
, ale pro PRIVATE_HEADER
soubory. Podrobnosti vizPRIVATE_HEADER
.
RESOURCE
Podobné jako PUBLIC_HEADER
a PRIVATE_HEADER
, ale pro souboryRESOURCE
. Podrobnosti viz RESOURCE
.
Pro každý z těchto uvedených argumentů platí argumenty, které za ním následují, pouze pro cíl nebo typ souboru uvedený v argumentu. Pokud není zadán žádný, platí vlastnostiinstalace pro všechny typy cílů. Pokud je zadán pouze jeden, pak se nainstalují pouze cíle tohoto typu (což lze použít pro instalaci pouze DLL nebo pouze importované knihovny.)
Pro běžné spustitelné soubory, statické knihovny a sdílené knihovny není argumentDESTINATION
vyžadován. U těchto typů cílů, pokud jeDESTINATION
vynechán, bude výchozí cíl převzat z příslušné proměnné z GNUInstallDirs
, nebo nastaven na vestavěnou výchozí hodnotu, pokud tato proměnná není definována. Totéž platí proveřejné a soukromé hlavičky spojené s nainstalovanými cíli prostřednictvím vlastností cílePUBLIC_HEADER
a PRIVATE_HEADER
. cíl musí být vždy uveden pro knihovny modulů, balíčky Apple aframeworks. Cíl lze vynechat pro knihovny rozhraní a objektové knihovny,ale s těmi se zachází jinak (viz diskusi na toto téma ke konci této části).
Následující tabulka uvádí cílové typy s přidruženými proměnnými a vestavěnými výchozími hodnotami, které se použijí, pokud není zadán žádný cíl:
Typ cíle |
GNUInstallDirs Proměnná |
Built-Ve výchozím nastavení |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Projekty, které chtějí dodržovat běžnou praxi instalace hlaviček do aprojektů-specifického podadresáře, budou muset zadat cíl a nespoléhat se pouze na výše uvedené.
Aby byly balíčky v souladu s distribučními zásadami uspořádání souborového systému, pokudprojekty musí zadat DESTINATION
, doporučuje se, aby použily cestu, která začíná příslušnou proměnnou GNUInstallDirs
. to umožní správcům balíčků řídit cíl instalace nastavením příslušných proměnných mezipaměti. Následující příklad ukazuje instalaci statické knihovny do výchozího cíle poskytovaného GNUInstallDirs
, ale s jejími hlavičkami nainstalovanými do podadresáře specifického pro projekt, který se řídí výše uvedeným doporučením:
add_library(mylib STATIC ...)set_target_properties(mylib PROPERTIES PUBLIC_HEADER mylib.h)include(GNUInstallDirs)install(TARGETS mylib PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/myproj)
Kromě běžných voleb uvedených výše může každý cíl přijmout následující další argumenty:
NAMELINK_COMPONENT
Nově ve verzi 3.12.
Na některých platformách má sdílená knihovna s verzí symbolický odkaz, například:
lib<name>.so -> lib<name>.so.1
kde lib<name>.so.1
je zvukový název knihovny a lib<name>.so
je „namelink“ umožňující linkerům najít knihovnu při zadání-l<name>
. Volba NAMELINK_COMPONENT
je podobná volběCOMPONENT
, ale mění instalační složku namelinku sdílené knihovny, pokud je generována. Pokud není zadána, je výchozí hodnotou hodnota COMPONENT
. Použití tohoto parametru mimo blokLIBRARY
je chybou.
Podívejte se na následující příklad:
install(TARGETS mylib LIBRARY COMPONENT Libraries NAMELINK_COMPONENT Development PUBLIC_HEADER COMPONENT Development )
V tomto scénáři, pokud zvolíte instalaci pouze složky Development
, budou hlavičky i namelink nainstalovány bez knihovny. (Pokud nenainstalujete také komponentu Libraries
, bude odkaz na knihovnu visícím symlinkem a projekty, které se na knihovnu odkazují, budou mít chyby při sestavování.) Pokud nainstalujete pouze komponentu Libraries
,bude nainstalována pouze knihovna bez hlaviček a namelinku.
Tato volba se obvykle používá u správců balíčků, kteří mají oddělenéčasové a vývojové balíčky. Například v systémech Debian se očekává, že knihovna bude v runtime balíčku a hlavičky a namelink budou ve vývojovém balíčku.
Podrobnosti o vytváření sdílených knihoven s verzí naleznete ve vlastnostech VERSION
a SOVERSION
cíle.
NAMELINK_ONLY
Tato volba způsobí instalaci pouze namelinku, pokud je instalován cíl knihovny. Na platformách, kde verzované sdílené knihovny nemají namelinky nebo když knihovna není verzovaná, volba NAMELINK_ONLY
neinstaluje nic. Použití tohoto parametru mimo blokLIBRARY
je chybou.
Při zadání NAMELINK_ONLY
lze použít buď NAMELINK_COMPONENT
neboCOMPONENT
k určení instalační složky pakamelinku, ale obecně by se měla upřednostňovat COMPONENT
.
NAMELINK_SKIP
Podobný parametr jako NAMELINK_ONLY
, ale má opačný účinek: způsobí instalaci jiných souborů knihovny než namelinku, když je instalován cíl knihovny. Pokud není zadán ani NAMELINK_ONLY
, ani NAMELINK_SKIP
,nainstalují se obě části. Na platformách, kde verzované sdílené knihovnynemají symlinky nebo když knihovna není verzovaná, NAMELINK_SKIP
nainstaluje knihovnu. Použití tohoto parametru mimo blokLIBRARY
je chybou.
Pokud je zadán NAMELINK_SKIP
, NAMELINK_COMPONENT
nemá žádný účinek. Nedoporučuje se používat parametr NAMELINK_SKIP
ve spojení s parametremNAMELINK_COMPONENT
.
Příkaz install(TARGETS) může na nejvyšší úrovni přijmout také následující volby:
EXPORT
Tato volba spojuje instalované cílové soubory s exportem nazvaným<export-name>
. Musí se objevit před všemi cílovými volbami. Chcete-li skutečně nainstalovat samotný exportní soubor, zavolejte příkaz install(EXPORT), který je zdokumentován níže. pro změnu názvu exportovaného cíle viz dokumentaci k vlastnosti EXPORT_NAME
target.
INCLUDES DESTINATION
Tato volba určuje seznam adresářů, které budou při exportu příkazem install(EXPORT) přidány do vlastnostiINTERFACE_INCLUDE_DIRECTORIES
target<targets>
. Pokud je zadána relativní cesta, je považována za relativní k$<INSTALL_PREFIX>
.
Jedním voláním TARGETS
formy tohoto příkazu lze zadat jednu nebo více skupin vlastností. Cíl může být nainstalován vícekrát do různých umístění. Uvažujme hypotetické cíle myExe
,mySharedLib
a myStaticLib
. Kód:
install(TARGETS myExe mySharedLib myStaticLib RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib/static)install(TARGETS mySharedLib DESTINATION /some/full/path)
nainstaluje myExe
na <prefix>/bin
a myStaticLib
na<prefix>/lib/static
. Na platformách bez DLL se mySharedLib
nainstaluje na <prefix>/lib
a /some/full/path
. Na platformách DLLbude mySharedLib
DLL nainstalována do <prefix>/bin
a/some/full/path
a její importní knihovna bude nainstalována do<prefix>/lib/static
a /some/full/path
.
Mezi cíli k instalaci mohou být uvedeny knihovny rozhraní, které neinstalují žádné artefakty, ale budou zahrnuty do přidruženého EXPORT
. pokud jsou uvedeny knihovny objektů, ale není uveden žádný cíl pro jejich soubory, budou exportovány jako knihovny rozhraní.To postačuje ke splnění požadavků na přechodné použití jiných cílů, které se ve své implementaci odkazují na objektové knihovny.
Instalace cíle s vlastností EXCLUDE_FROM_ALL
target nastavenou na TRUE
má nedefinované chování.
Novinka ve verzi 3.3: Cíl instalace uvedený jako argument DESTINATION
může používat „generátorové výrazy“ se syntaxí $<...>
. Dostupné výrazy najdete v příručcecmake-generator-expressions(7)
.
Novinka ve verzi 3.13: install(TARGETS) může instalovat cíle, které byly vytvořeny v jiných adresářích. Při použití takových pravidel pro instalaci napříč adresáři nezaručí spuštěnímake install
(nebo podobného nástroje) z podadresáře, že cíle z jiných adresářů budou aktuální. Můžete použíttarget_link_libraries()
nebo add_dependencies()
, abyste zajistili, že takové cíle mimo adresář budou sestaveny před spuštěním instalačních pravidel specifických pro podadresář.
.