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 do RUNTIME);

  • V systému AIX je importní soubor linkeru vytvořený pro spustitelné soubory s povolenou příponouENABLE_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, viz BUNDLE 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 FRAMEWORKcíle.

BUNDLE

S spustitelnými soubory označenými vlastností MACOSX_BUNDLE se v systému macOS zachází jako s BUNDLEcíli.

PUBLIC_HEADER

Všechny PUBLIC_HEADERsoubory 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 FRAMEWORKknihovny 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í

RUNTIME

${CMAKE_INSTALL_BINDIR}

bin

LIBRARY

${CMAKE_INSTALL_LIBDIR}

lib

ARCHIVE

${CMAKE_INSTALL_LIBDIR}

lib

PRIVATE_HEADER

${CMAKE_INSTALL_INCLUDEDIR}

include

PUBLIC_HEADER

${CMAKE_INSTALL_INCLUDEDIR}

include

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>.soje „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_ONLYneinstaluje 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 TARGETSformy 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ář.

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.