Installation av mål¶
install(TARGETS targets... ] ] ] )
Formuläret TARGETS
anger regler för installation av mål från ett projekt. Det finns flera typer av mål Utdataartefakter som kan installeras:
ARCHIVE
Målartefakter av detta slag inkluderar:
-
Statiska bibliotek (utom på macOS när de är markerade som
FRAMEWORK
, se nedan); -
DLL-importbibliotek (på alla Windows-baserade system inklusive Cygwin; de har ändelsen
.lib
, till skillnad från.dll
-biblioteken som går tillRUNTIME
); -
På AIX, linker-importfilen som skapats för körbara filer med
ENABLE_EXPORTS
aktiverad.
LIBRARY
Målartefakter av detta slag inkluderar:
-
Delade bibliotek, utom
-
DLLs (dessa går till
RUNTIME
, se nedan), -
på macOS när de är markerade som
FRAMEWORK
(se nedan).
-
RUNTIME
Målartefakter av detta slag inkluderar:
-
Executables(utom på macOS när de är markerade som
MACOSX_BUNDLE
, seBUNDLE
nedan); -
DLL:er (på alla Windows-baserade system, inklusive Cygwin; observera att de medföljande importbiblioteken är av typen
ARCHIVE
).
OBJECTS
Nytt i version 3.9.
Objektfiler som är associerade med objektbibliotek.
FRAMEWORK
Både statiska och delade bibliotek som är markerade med FRAMEWORK
egenskapen behandlas som FRAMEWORK
-mål på macOS.
BUNDLE
Exekverbara filer markerade med egenskapen MACOSX_BUNDLE
behandlas somBUNDLE
-mål på macOS.
PUBLIC_HEADER
Alla PUBLIC_HEADER
-filer som är associerade med ett bibliotek installeras i den destination som anges av PUBLIC_HEADER
-argumentet på andra plattformar än Apple. Regler som definieras med det här argumentet ignoreras för FRAMEWORK
bibliotek på Apple-plattformar eftersom de associerade filerna installeras på lämpliga platser i rammappen. SePUBLIC_HEADER
för mer information.
PRIVATE_HEADER
Samma som PUBLIC_HEADER
, men för PRIVATE_HEADER
-filer. SePRIVATE_HEADER
för mer information.
RESOURCE
Liknande PUBLIC_HEADER
och PRIVATE_HEADER
, men förRESOURCE
filer. Se RESOURCE
för mer information.
För vart och ett av dessa angivna argument gäller de efterföljande argumenten endast för den mål- eller filtyp som anges i argumentet. Om inget anges gäller installationsegenskaperna för alla måltyper. Om endast ett anges kommer endast mål av den typen att installeras (vilket kan användas för att installera endast en DLL eller endast ett importbibliotek.)
För vanliga körbara filer, statiska bibliotek och delade bibliotek krävs inteDESTINATION
-argumentet. För dessa måltyper, närDESTINATION
utelämnas, kommer en standarddestination att tas från den lämpliga variabeln från GNUInstallDirs
, eller sättas till ett inbyggt standardvärde om den variabeln inte är definierad. Samma sak gäller för depublic och private headers som är associerade med de installerade målen genom egenskapernaPUBLIC_HEADER
och PRIVATE_HEADER
target.En destination måste alltid anges för modulbibliotek, Apple bundles ochframeworks. En destination kan utelämnas för gränssnitts- och objektbibliotek, men de hanteras annorlunda (se diskussionen om detta ämne mot slutet av det här avsnittet).
Följande tabell visar måltyperna med tillhörande variabler och inbyggda standardvärden som gäller när ingen destination anges:
Måltyp |
GNUInstallDirs Variabel |
Built-I standard |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Projekt som vill följa det vanliga tillvägagångssättet att installera headers i en projekt-specifik underkatalog måste ange en destination i stället för att enbart förlita sig på ovanstående.
För att paketen skall vara kompatibla med riktlinjer för distributionens filsystemlayout, omprojekt måste ange en DESTINATION
, rekommenderas det att de använder en sökväg som börjar med en lämplig GNUInstallDirs
-variabel.Detta gör det möjligt för paketansvariga att kontrollera installationsdestinationen genom att ställa in lämpliga cache-variabler. Följande exempel visar ett statiskt bibliotek som installeras till standarddestinationen som tillhandahålls avGNUInstallDirs
, men med dess headers installerade till en projektspecifik underkatalog som följer rekommendationen ovan:
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)
Utöver de vanliga alternativen som listas ovan kan varje mål acceptera följande ytterligare argument:
NAMELINK_COMPONENT
Nytt i version 3.12.
På vissa plattformar har ett versionerat delat bibliotek en symbolisk länk som:
lib<name>.so -> lib<name>.so.1
där lib<name>.so.1
är bibliotekets soname och lib<name>.so
är en ”namelink” som gör det möjligt för länkarna att hitta biblioteket när det ges-l<name>
. Alternativet NAMELINK_COMPONENT
liknar alternativetCOMPONENT
, men ändrar installationskomponenten för en namelink till ett delat bibliotek om en sådan genereras. Om det inte anges är standardvärdet COMPONENT
. Det är ett fel att använda den här parametern utanför ettLIBRARY
block.
Konsultera följande exempel:
install(TARGETS mylib LIBRARY COMPONENT Libraries NAMELINK_COMPONENT Development PUBLIC_HEADER COMPONENT Development )
I det här scenariot, om du väljer att installera endast Development
komponenten, kommer både rubrikerna och namelänken att installeras utan biblioteket. (Om du inte också installerar Libraries
-komponenten kommeramelink att vara en hängande symbolisk länk, och projekt som länkar till biblioteket kommer att få byggfel.) Om du installerar endast Libraries
-komponenten kommer endast biblioteket att installeras, utan headers och namelink.
Detta alternativ används vanligtvis för pakethanterare som har separeradeuntime- och utvecklingspaket. På Debiansystem förväntas till exempel biblioteket finnas i körtidspaketet, och rubrikerna och namelänken förväntas finnas i utvecklingspaketet.
Se VERSION
och SOVERSION
målegenskaperna för detaljer om hur man skapar versionerade delade bibliotek.
NAMELINK_ONLY
Detta alternativ gör att endast namelänken installeras när ett biblioteksmål är installerat. På plattformar där versionerade delade bibliotek inte har namelinks eller när ett bibliotek inte är versionerat, installerar NAMELINK_ONLY
alternativet ingenting. Det är ett fel att använda den här parametern utanför ettLIBRARY
block.
När NAMELINK_ONLY
ges kan antingen NAMELINK_COMPONENT
ellerCOMPONENT
användas för att specificera installationskomponenten av dåvarandeamelink, men COMPONENT
är i allmänhet att föredra.
NAMELINK_SKIP
Liknande NAMELINK_ONLY
, men det har motsatt effekt: det orsakar installation av andra biblioteksfiler än namelink när ett biblioteksmål är installerat. När varken NAMELINK_ONLY
eller NAMELINK_SKIP
anges installeras båda delarna. På plattformar där versionerade delade bibliotek inte har symlänkar eller när ett bibliotek inte är versionerat, installerar NAMELINK_SKIP
biblioteket. Det är ett fel att använda den här parametern utanför ett blockLIBRARY
.
Om NAMELINK_SKIP
anges har NAMELINK_COMPONENT
ingen effekt. Det rekommenderas inte att använda NAMELINK_SKIP
tillsammans medNAMELINK_COMPONENT
.
Kommandot install(TARGETS) kan också acceptera följande alternativ på toppnivå:
EXPORT
Detta alternativ associerar de installerade målfilerna med en export kallad<export-name>
. Det måste finnas före alla målalternativ. För att faktiskt installera själva exportfilen, anropar du install(EXPORT), dokumenterat nedan.Se dokumentationen av egenskapen EXPORT_NAME
target för att ändra namnet på det exporterade målet.
INCLUDES DESTINATION
Detta alternativ specificerar en lista med kataloger som kommer att läggas till egenskapenINTERFACE_INCLUDE_DIRECTORIES
target för<targets>
när den exporteras av kommandot install(EXPORT). Om en relativ sökväg anges behandlas den som relativ till$<INSTALL_PREFIX>
.
En eller flera grupper av egenskaper kan anges i ett enda anrop av TARGETS
-formen av det här kommandot. Ett mål kan installeras mer än en gång på olika platser. Tänk på de hypotetiska målen myExe
,mySharedLib
och myStaticLib
. Koden:
install(TARGETS myExe mySharedLib myStaticLib RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib/static)install(TARGETS mySharedLib DESTINATION /some/full/path)
installerar myExe
till <prefix>/bin
och myStaticLib
till<prefix>/lib/static
. På icke-DLL-plattformar installeras mySharedLib
till <prefix>/lib
och /some/full/path
. På DLL-plattformar installeras mySharedLib
DLL till <prefix>/bin
och /some/full/path
och dess importbibliotek installeras till<prefix>/lib/static
och /some/full/path
.
Interface Libraries kan listas bland de mål som ska installeras.De installerar inga artefakter men kommer att inkluderas i en associerad EXPORT
.Om Object Libraries listas utan att det anges någon destination för deras objektfiler kommer de att exporteras som Interface Libraries.Detta är tillräckligt för att uppfylla kraven på transitiv användning för andra mål som länkar till objektbiblioteken i sin implementering.
Installation av ett mål med egenskapen EXCLUDE_FROM_ALL
target som är satt till TRUE
har odefinierat beteende.
Nytt i version 3.3: En installationsdestination som ges som ett DESTINATION
-argument kan använda ”generatoruttryck” med syntaxen $<...>
. Secmake-generator-expressions(7)
manualen för tillgängliga uttryck.
Nytt i version 3.13: install(TARGETS) kan installera mål som skapats i andra kataloger. När man använder sådana regler för installation över kataloggränserna garanterar inte körning avmake install
(eller liknande) från en underkatalog att mål från andra kataloger är uppdaterade. Du kan användatarget_link_libraries()
eller add_dependencies()
för att se till att sådana mål utanför katalogen byggs innan de underkatalogspecifika installationsreglerna körs.