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, amelyekRUNTIME
-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ábbBUNDLE
); -
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 FRAMEWORK
tulajdonsággal jelölt statikus és megosztott könyvtárakat egyaránt FRAMEWORK
cé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 FRAMEWORK
kö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 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 Development
komponens 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_ONLY
opció 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_SKIP
telepí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.