Célprogramok telepítése¶

install(TARGETS targets... ] ] ] )

A TARGETS űrlap a projektből származó célprogramok telepítésének szabályait határozza meg. Többféle célobjektum kimeneti leletet lehet telepíteni:

ARCHIVE

Az ilyen típusú célobjektumok közé tartoznak:

  • Statikus könyvtárak(kivéve macOS-en, ha FRAMEWORK-ként van jelölve, lásd alább);

  • DLL importkönyvtárak(minden Windows-alapú rendszeren, beleértve a Cygwint is; ezek kiterjesztése.lib, ellentétben a .dll könyvtárakkal, amelyek RUNTIME-be mennek);

  • AIX-en a linker importfájlja, amely a ENABLE_EXPORTS engedélyezéssel rendelkező futtatható programokhoz készül.

LIBRARY

Az ilyen típusú céltárgyak közé tartoznak:

  • megosztott könyvtárak, kivéve

    • DLL-ek (ezek a RUNTIME-be mennek, lásd alább),

    • MacOS-en, ha FRAMEWORK-ként van megjelölve (lásd alább).

RUNTIME

Az ilyen típusú céltárgyak közé tartoznak:

  • Futtatható fájlok (kivéve macOS-en, ha MACOSX_BUNDLE-ként van jelölve, lásd alább BUNDLE);

  • DLL-ek (minden Windows-alapú rendszeren, beleértve a Cygwint is; vegye figyelembe, hogy a kísérő importkönyvtárak ARCHIVE típusúak).

OBJECTS

Újdonság a 3.9-es verzióban.

Objektumkönyvtárakhoz kapcsolódó objektumfájlok.

FRAMEWORK

A FRAMEWORKtulajdonsággal jelölt statikus és megosztott könyvtárakat egyaránt FRAMEWORKcélként kezeli a macOS.

BUNDLE

A MACOSX_BUNDLE tulajdonsággal megjelölt végrehajtható állományokat macOS-enBUNDLE célként kezelik.

PUBLIC_HEADER

A könyvtárhoz tartozó PUBLIC_HEADER fájlok nem Appleplatformokon a PUBLIC_HEADER argumentummal megadott célhelyre települnek. Az ezzel az argumentummal meghatározott szabályok figyelmen kívül maradnak az FRAMEWORKkönyvtárak esetében Apple platformokon, mivel a kapcsolódó fájlok a megfelelő helyekre települnek a keretmappán belül. A részleteket lásd PUBLIC_HEADER.

PRIVATE_HEADER

Hasonló a PUBLIC_HEADER-hez, de PRIVATE_HEADER fájlokra. LásdPRIVATE_HEADER a részletekért.

RESOURCE

Hasonlóan a PUBLIC_HEADER és PRIVATE_HEADER, deRESOURCE fájlokra. Lásd RESOURCE a részletekért.

A megadott argumentumok mindegyikére az őket követő argumentumok csak az argumentumban megadott célpontra vagy fájltípusra vonatkoznak. Ha egyik sincs megadva, a telepítési tulajdonságok minden céltípusra vonatkoznak. Ha csak egy van megadva, akkor csak az adott típusú célprogramok lesznek telepítve (ami használható csak egy DLL vagy csak egy importált könyvtár telepítésére.)

A normál futtatható fájlok, statikus könyvtárak és megosztott könyvtárak esetében aDESTINATION argumentum nem szükséges. Ezeknél a céltípusoknál, ha aDESTINATION elmarad, az alapértelmezett célt a GNUInstallDirs megfelelő változójából veszi ki, vagy egy beépített alapértelmezett értékre állítja be, ha ez a változó nincs definiálva. Ugyanez igaz a telepített céltárgyakhoz aPUBLIC_HEADER és PRIVATE_HEADER céltárgy tulajdonságokon keresztül kapcsolódó nyilvános és privát fejlécekre is.A modulkönyvtárak, Apple csomagok és keretrendszerek esetében mindig meg kell adni a célt. A célállomás elhagyható az interfész- és objektumkönyvtárak esetében, de ezeket másképp kezelik (lásd ennek a témának a tárgyalását a szakasz vége felé).

A következő táblázat a céltípusokat mutatja a hozzájuk tartozó változókkal és a beépített alapértelmezett értékekkel, amelyek akkor alkalmazandók, ha nem adunk meg célt:

céltípus

GNUInstallDirs változó

Built-In Default

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

Azok a projektek, amelyek követni kívánják azt a bevett gyakorlatot, hogy a fejléceket egy projektbe telepítsék-specifikus alkönyvtárba helyezik, meg kell adniuk egy célállomást, nem pedig pusztán a fentiekre hagyatkozniuk.

Azért, hogy a csomagok megfeleljenek a disztribúciós fájlrendszer elrendezési szabályainak, ha a projekteknek meg kell adniuk egy DESTINATION, ajánlott olyan elérési utat használniuk, amely a megfelelő GNUInstallDirs változóval kezdődik.Ez lehetővé teszi a csomagok karbantartói számára, hogy a megfelelő cache-változók beállításával szabályozzák a telepítés célját. A következő példa egy statikus könyvtárat mutat, amelyet aGNUInstallDirs által megadott alapértelmezett célba telepítenek, de fejléceit egy projektspecifikus alkönyvtárba telepítik, amely követi a fenti ajánlást:

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)

A fent felsorolt általános opciók mellett minden célpont elfogadhatja a következő további argumentumokat:

NAMELINK_COMPONENT

Új a 3. verzióban.12.

Némely platformon egy verziószámozott megosztott könyvtár szimbolikus linkkel rendelkezik, mint például:

lib<name>.so -> lib<name>.so.1

ahol lib<name>.so.1 a könyvtár neve és lib<name>.so egy “namelink”, amely lehetővé teszi a linkelők számára a könyvtár megtalálását, ha megadják-l<name>. A NAMELINK_COMPONENT opció hasonló aCOMPONENT opcióhoz, de megváltoztatja a sharedlibrary namelink telepítési komponensét, ha generálódik. Ha nincs megadva, az alapértelmezett érték a COMPONENT értéke lesz. Hiba ezt a paramétert egyLIBRARY blokkon kívül használni.

Megfigyelhető a következő példa:

install(TARGETS mylib LIBRARY COMPONENT Libraries NAMELINK_COMPONENT Development PUBLIC_HEADER COMPONENT Development )

Ez esetben, ha csak a Developmentkomponens telepítését választja, mind a fejlécek, mind a namelink a könyvtár nélkül kerül telepítésre. (Ha nem telepíti a Libraries komponenst is, akkor a samelink egy lógó symlink lesz, és a könyvtárra hivatkozó projektek építési hibákat fognak mutatni.) Ha csak a Libraries komponenst telepíti,csak a könyvtár lesz telepítve, a fejlécek és a namelink nélkül.

Ezt az opciót jellemzően olyan csomagkezelőkben használják, amelyeknek külön vannak a végfelhasználói és a fejlesztői csomagjai. Például Debian rendszereken a könyvtár a futásidejű csomagban, a fejlécek és a namelink pedig a fejlesztői csomagban várható.

Lásd a VERSION és SOVERSION céltulajdonságoknál a verziószámozott megosztott könyvtárak létrehozásának részleteit.

NAMELINK_ONLY

Ez az opció csak a namelink telepítését eredményezi, amikor egy könyvtárcél telepítése történik. Azokon a platformokon, ahol a verziószámozott megosztott könyvtárak nem rendelkeznek névkapcsolattal, vagy amikor egy könyvtár nem verziószámozott, a NAMELINK_ONLYopció nem telepít semmit. Hiba ezt a paramétert egyLIBRARY blokkon kívül használni.

Ha NAMELINK_ONLY van megadva, akkor NAMELINK_COMPONENT vagy COMPONENT is használható a namelink telepítési komponensének megadására, de a COMPONENT általában előnyben részesítendő.

NAMELINK_SKIP

Hasonló a NAMELINK_ONLY-hez, de ellentétes hatása van: a könyvtárcél telepítésekor a namelinken kívül más könyvtárfájlokat is telepít. Ha sem a NAMELINK_ONLY, sem a NAMELINK_SKIP nincs megadva,mindkét rész települ. Azokon a platformokon, ahol a verziószámozott megosztott könyvtáraknak nincsenek szimlinkjei, vagy ha egy könyvtár nem verziószámozott, a NAMELINK_SKIPtelepíti a könyvtárat. Hiba ezt a paramétert egyLIBRARY blokkon kívül használni.

Ha NAMELINK_SKIP van megadva, a NAMELINK_COMPONENT-nek nincs hatása. Nem ajánlott a NAMELINK_SKIP használata aNAMELINK_COMPONENT kapcsolattal együtt.

Az install(TARGETS) parancs a következő opciókat is elfogadhatja felső szinten:

EXPORT

Ez az opció a telepített célfájlokat egy<export-name> nevű exporthoz társítja. A target opciók előtt kell megjelennie. Magának az exportált fájlnak a tényleges telepítéséhez hívja meg az install(EXPORT) parancsot, amely alább dokumentálva van.Az exportált target nevének megváltoztatásához lásd a EXPORT_NAME target tulajdonság dokumentációját.

INCLUDES DESTINATION

Ez az opció azon könyvtárak listáját adja meg, amelyek az install(EXPORT) parancs által történő exportáláskor hozzáadódnak a<targets> target tulajdonságáhozINTERFACE_INCLUDE_DIRECTORIES. Ha relatív elérési útvonal van megadva, akkor azt a$<INSTALL_PREFIX>-hoz viszonyítva kell kezelni.

Egy vagy több tulajdonságcsoport adható meg a parancs TARGETS formájának egyetlen hívásával. Egy célpont többször is telepíthető különböző helyekre. Tekintsük a myExe,mySharedLib és myStaticLib hipotetikus célokat. A:

install(TARGETS myExe mySharedLib myStaticLib RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib/static)install(TARGETS mySharedLib DESTINATION /some/full/path)

kód a myExe-t a <prefix>/bin-be és a myStaticLib-t a<prefix>/lib/static-be telepíti. A nem-DLL platformokon a mySharedLib a <prefix>/lib és a /some/full/path helyre lesz telepítve. DLL platformokon a mySharedLib DLL a <prefix>/bin és/some/full/path helyre lesz telepítve, az importáló könyvtár pedig a <prefix>/lib/static és /some/full/path helyre lesz telepítve.

Az interfészkönyvtárak a telepítendő célok között szerepelhetnek.Ezek nem telepítenek leleteket, de egy kapcsolódó EXPORT-be kerülnek.Ha az objektumkönyvtárak szerepelnek a listán, de nincs megadva célállomás azirobjekt fájlok számára, akkor interfészkönyvtárként lesznek exportálva.Ez elegendő ahhoz, hogy kielégítse a tranzitív felhasználási követelményeket más olyan célpontok esetében, amelyek az implementációjukban az objektumkönyvtárakra hivatkoznak.

Egy célpont telepítése a EXCLUDE_FROM_ALL céltulajdonság TRUE értékre állítva meghatározatlan viselkedéssel jár.

Új a 3.3-as verzióban: A DESTINATION argumentumként megadott telepítési célpont használhat $<...> szintaxisú “generátor kifejezéseket”. A rendelkezésre álló kifejezéseket lásd acmake-generator-expressions(7) kézikönyvben.

Újdonság a 3.13-as verzióban: Az install(TARGETS) telepíthet más könyvtárakban létrehozott célokat is. Ilyen könyvtárak közötti telepítési szabályok használatakor amake install (vagy hasonló) futtatása egy alkönyvtárból nem garantálja, hogy a más könyvtárakból származó célok naprakészek. Atarget_link_libraries() vagy add_dependencies() használatával biztosíthatja, hogy az ilyen könyvtáron kívüli célprogramok az alkönyvtár-specifikus telepítési szabályok futtatása előtt elkészüljenek.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.