Ho trovato un buon esempio di utilizzo proprio di questo oggi: aggiungere la documentazione di Doxygen.
Uso CMake (e Ninja) per creare i miei progetti C++ personali. Ho deciso per un capriccio di aggiungere una documentazione di Doxygen ad uno dei miei sforzi più completi ma non documentati. Ho anche pensato che sarebbe stato utile aggiungerlo anche agli altri progetti appena ho capito come renderlo il più generico possibile.
Per iniziare, ho generato un modello Doxygen standard e lo ho rinominato.
cd my_projects/projectx
doxygen -g Doxyfile
mv Doxyfile Doxyfile.in
Nota l'estensione .in. Probabilmente non necessario ma convenzionale, se ho capito bene.
Successivamente, ho aggiunto il seguente blocco di codice nel mio file CMakeLists.txt, appena prima di definire i miei obiettivi (non sono sicuro se ciò è importante ma CMake a volte è esigente riguardo alla sequenza di determinati comandi).
FIND_PACKAGE(Doxygen)
IF("${DOXYGEN_FOUND}" MATCHES "^YES$")
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
@ONLY)
ADD_CUSTOM_TARGET( doc ALL
COMMAND ${DOXYGEN_EXECUTABLE}
${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Doxygenating..."
VERBATIM)
ENDIF()
Questo crea un nuovo obiettivo chiamato doc. Specificando ALL lo si aggiunge al target "tutto" predefinito, ma questo è facoltativo. Specificando @ONLY, le variabili di tipo "$ {variable}" non verranno espanse da CONFIGURE_FILE, solo i tipi "@ variable @". Un po 'di confusione (almeno per me), CMAKE_CURRENT_SOURCE_DIR sembra riferirsi alla directory del progetto e CMAKE_CURRENT_BINARY_DIR alla directory di build.
Infine, ed è qui che entra PROJECT_NAME, ho modificato Doxyfile.in.
Questo è l'inizio della mia nuova Doxyfile.in:
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "@[email protected]"
PROJECT_NUMBER = @[email protected]
PROJECT_BRIEF =
PROJECT_LOGO = @[email protected]/res/doc_logo-200x55.png
OUTPUT_DIRECTORY = @[email protected]/doc
Si ottiene l'idea, credo. Una volta che questo è completamente generico (è una parola?) Posso copiarlo nei miei altri progetti e, finché codifico il mio codice, avrò una buona documentazione ovunque.
Avviso PROJECT_BRIEF non specificato. Non ho finito con questo e ci sono ancora alcuni spazi vuoti su cui riflettere. Ad esempio PROJECT_VERSION_TWEAK in realtà non contiene ancora nulla. Dovrò trovare un modo per ottenere il mio numero di build lì.
Come si usano le variabili 'PROJECT_NAME',' PROJECT_SOURCE_DIR' e 'PROJECT_BINARY_DIR'? E queste librerie sono indipendenti o sono solo parti di una libreria/applicazione principale? –
Uso queste variabili all'interno di macro che generano codice sorgente. Creo un obiettivo di livello superiore chiamato $ {PROJECT_NAME} _SPDEF da cui altri progetti possono dipendere per forzarne la generazione. Io uso anche le variabili _DIR per posizionare il codice generato nella posizione appropriata. – ScaryAardvark