2015-06-05 6 views
7

Quindi ho impostato un metaproject, il che significa che ho una directory (la directory root) contenente più sottodirectory, ognuna delle quali è un progetto cmake (con un cmakelist valido). I cmalisti nella directory root importano i sottoprogetti usando il comando c_ke_add_subdirectory.Come evitare conflitti di nomi nei sottoprogetti cmake?

Ogni sottoprogetto definisce i propri target (librerie e file eseguibili) nonché i target "check" che eseguono la suite di test per quel progetto e "docs" che esegue doxygen.

Il mio problema è che CMake non capisce che gli obiettivi di controllo e di documentazione sono locali per ogni progetto, e quindi lamenta conflitti di nome.

Quindi la mia domanda è, c'è un modo per convincere cmake a capire che questi obiettivi sono locali per ogni progetto?

risposta

1

CMake non consente nomi di destinazione duplicati. La logica è previsto nel docs for policy CMP0002:

  • nomi unici possono essere consultati in modo univoco sia in codice CMake e sul make righe di comando strumento.
  • I nomi logici vengono utilizzati dai generatori Xcode e VS IDE per produrre nomi di progetto significativi per gli obiettivi.

vostro potrebbe provare a impostare CMP0002-OLD (fatto tramite cmake_policy(SET CMP0002 OLD)), che avrebbe almeno eliminare l'errore di CMake, ma mi piacerebbe consigliare contro questo - certamente non funzionerà per MSVC/Xcode.

L'unica opzione che posso vedere a meno di nomi univoci codificati a mano sarebbe scrivere una funzione CMake che genera un nome univoco per target "check", ad esempio potrebbe aggiungere il nome del target che viene controllato, cedendo nomi come check_my_lib_one, check_my_exe_one, ecc

Questa funzione potrebbe essere utilizzato anche per raccogliere un elenco di tutti gli iscritti check_<Target> istanze e aggiungerle a un singolo bersaglio chiamato check che invocare ogni subordinato check_<Target>, in modo da correre make check tutti corre .

+0

Beh, stavo cercando qualcosa come una soluzione "one namespace per project", ma non sembra esistere in cmake, quindi userò la soluzione, grazie! –

+0

@ Abstract-Sky tecnicamente, è possibile utilizzare una convenzione di spazio dei nomi da soli. Ad esempio, il prefisso di tutti gli obiettivi di un progetto in base al nome del progetto. – ibizaman

+0

@ibizaman Questo è quello che ho fatto, usando una macro per automatizzare l'aggiunta del prefisso. –