2014-11-20 9 views
28

Nel nostro flusso di lavoro, possiamo avere un modulo A che è composto da diversi file di intestazione, modulo A non produce alcun binario (nota a margine: sarà ovviamente utilizzato da altri moduli, che includono alcune delle intestazioni da modulo A per produrre file binari).Come far visualizzare a CMake le intestazioni, che non fanno parte di alcun target binario, nell'IDE?

Un buon esempio potrebbe essere una libreria di testa-solo, per il quale CMake 3 introduce un buon supporto grazie alla nozione di INTERFACE libreria (vedere this SO answer e CMake di documentation of the feature).

Possiamo fare un obiettivo libreria di interfaccia di modulo A:

add_library(module_A INTERFACE) 

Questo ci tutte le caratteristiche interessanti di obiettivi CMakes dà (è possibile usarlo come la dipendenza di un altro bersaglio, di esportarlo , a transitivamente avanti requisiti ecc)

Ma in questo caso, le intestazioni di modulo Un non mostrano nel nostro IDE (Xcode, ma ci aspettiamo che sia la stessa con la maggior parte/tutti gli altri IDE).

Ciò risulta essere uno dei principali inconvenienti del flusso di lavoro, poiché è necessario che i file che compongono il modulo A vengano visualizzati nell'IDE per l'edizione. È possibile raggiungerlo?

+0

Ah cancellato il mio commento. Buona domanda. – IdeaHat

+0

@IdeaHat Grazie per il vostro interesse nella domanda e il vostro suggerimento. Purtroppo, il modulo 'INTERFACE' del comando' add_library' non si aspetta alcun argomento * file * (si veda [l'ultimo modulo nella documentazione] (http://www.cmake.org/cmake/help/v3.0/command /add_library.html?highlight=add_library)). Infatti, non abbiamo necessariamente bisogno di un 'INTERFACCIA', ma questo è l'unico ** target mutabile ** non binario di cui siamo a conoscenza. [Per il contesto, IdeaHat si chiedeva se potessimo fornire i file di intestazione al comando 'add_library' nel suo modulo' INTERFACE'] –

+0

Un modo di hacking farebbe un oggetto personalizzato fittizio (mai costruito, o senza passi di costruzione) con questi file come sorgente ... per la mia educazione personale, hai un link alla definizione di mutabile di CMake? – IdeaHat

risposta

18

Diversi mesi lungo la linea, non ho trovato un modo per elencare direttamente i file di intestazione per una libreria INTERFACE.

Poiché la domanda ha ancora qualche punto di vista, ecco cosa ho fatto (cioè ciò che appare come il trucco minore attualmente disponibile).

Imagine modulo A è una libreria di sola intestazione. Nel CMakeLists.txt dichiarando il suo obiettivo:

# Define 'modA_headers' variable to list all the header files 
set(modA_headers 
    utility.h 
    moreUtilities.h 
    ...) 

add_library(moduleA INTERFACE) # 'moduleA' is an INTERFACE pseudo target 

# 
# From here, the target 'moduleA' can be customised 
# 
target_include_directories(moduleA ...) # Transitively forwarded 
install(TARGETS moduleA ...) 

# 
# HACK: have the files showing in the IDE, under the name 'moduleA_ide' 
# 
add_custom_target(moduleA_ide SOURCES ${modA_headers}) 

Non accetto questa risposta, dal momento che mi aspetto ulteriori rilasci di CMake per offrire un approccio più semanticamente corretto, che sarà poi accettato:)

+0

Stavo cercando un modo per farlo da un po 'e la soluzione finalmente mi ha aiutato. Grazie! –

9

È possibile utilizzare il nuovo comando target_sources in CMake 3.1.

add_library(moduleA INTERFACE) 
target_include_directories(moduleA INTERFACE ...) 
target_sources(moduleA INTERFACE 
    ${CMAKE_CURRENT_SOURCE_DIR}/utility.h 
    ${CMAKE_CURRENT_SOURCE_DIR}/moreUtilities.h 
) 

E 'anche transitiva.

http://www.cmake.org/cmake/help/v3.1/command/target_sources.html#command:target_sources

Il limite di non essere in grado di esportare gli obiettivi che hanno INTERFACE_SOURCES è stato sollevato per CMake 3.3.

+4

Questo w orks nel senso che le intestazioni verranno aggiunte ad altri progetti esistenti che si collegano alla tua libreria, ma non funziona se non hai progetti che si collegano alla tua libreria. Quindi se si ha un progetto di test con un eseguibile che si collega alla libreria INTERFACE, allora tale progetto conterrà le intestazioni della libreria insieme alle sue fonti. –

+3

Questo è un ottimo punto sollevato da @FranciscoAguilera. steveire, non c'è ancora una buona soluzione per questo fino ad oggi? – Ela782

Problemi correlati