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

  • På AIX, linker-importfilen som skapats för körbara filer medENABLE_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, se BUNDLE 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 FRAMEWORKegenskapen 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 FRAMEWORKbibliotek 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

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

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 Developmentkomponenten, 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_ONLYalternativet 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.

Lämna ett svar

Din e-postadress kommer inte publiceras.