Qual è il significato della parola chiave PUBLIC, PRIVATEe INTERFACErelativi a CMake di target_include_directories?
Risposte:
Queste parole chiave vengono utilizzate per sapere quando è necessario l'elenco delle directory di inclusione che stai passando alla destinazione. Entro quando , significa che sono necessarie quelle directory di inclusione:
Quando CMake sta compilando un target, utilizza gli obiettivi INCLUDE_DIRECTORIES, COMPILE_DEFINITIONSe COMPILE_OPTIONSle proprietà. Quando si utilizza la PRIVATEparola chiave in target_include_directories()e simili, si dice a CMake di popolare quelle proprietà di destinazione.
Quando CMake rileva una dipendenza tra una destinazione A e un'altra destinazione B (come quando si utilizza il target_link_libraries(A B)comando), propaga in modo transitorio i B requisiti di utilizzo alla Adestinazione. Tali requisiti di utilizzo di destinazione sono le directory di inclusione, le definizioni di compilazione, ecc. Che qualsiasi obiettivo da cui dipende Bdeve soddisfare. Sono specificati dalla INTERFACE_*versione delle proprietà sopra elencate (come INTERFACE_INCLUDE_DIRECTORIES) e vengono popolati utilizzando la INTERFACEparola chiave quando si chiamano i target_*()comandi.
La PUBLICparola chiave significa approssimativamente PRIVATE + INTERFACE.
Supponiamo quindi di creare una libreria Ache utilizzi alcune intestazioni Boost. Faresti:
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})se usi solo quelle intestazioni Boost all'interno dei tuoi file sorgente ( .cpp) o file di intestazione privati ( .h).target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})se non usi queste intestazioni Boost all'interno dei tuoi file sorgente (quindi, non è necessario che vengano compilate A). Non riesco a pensare a un esempio del mondo reale per questo.target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})se usi queste intestazioni Boost nei tuoi file di intestazione pubblici, che sono inclusi ENTRAMBI in alcuni Afile sorgente di e potrebbero anche essere inclusi in qualsiasi altro client della tua Alibreria.La documentazione di CMake 3.0 contiene maggiori dettagli su questa specifica di build e sulle proprietà dei requisiti di utilizzo .
INTERFACE. target_include_directories(libname INTERFACE include PRIVATE include/libname). Ciò significa che all'interno della tua libreria puoi includere file direttamente, ma come utente della libreria devi libname/prima inserirli .
target_include_directories()un target eseguibile se devi impostare le directory di inclusione in cui devono essere trovati i file di intestazione utilizzati da quegli eseguibili (ad esempio: Boost :: Program_options, se lo usi per analizzare gli argomenti nella tua main()funzione) . Probabilmente useresti la PRIVATEparola chiave in questo caso, poiché questi file sono necessari per compilare l'eseguibile stesso. Non so se ci sia qualche utilità per INTERFACEo PUBLICsu un eseguibile, però.
Le parole chiave INTERFACE, PUBLIC e PRIVATE sono necessarie per specificare l'ambito dei seguenti argomenti. Gli elementi PRIVATE e PUBLIC popoleranno la proprietà INCLUDE_DIRECTORIES di <target>. Gli elementi PUBLIC e INTERFACE popoleranno la proprietà INTERFACE_INCLUDE_DIRECTORIES di <target>. I seguenti argomenti specificano le directory include.
Dalla documentazione: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
Per riformulare la documentazione con parole mie: