Znalazłem dobry przykład użycia tego dzisiaj: dodanie dokumentacji Doxygen.
Używam CMake (i Ninja) do budowania moich osobistych projektów C++. Zdecydowałem się na kaprysy, aby dodać dokumentację Doxygen do jednego z moich prawie kompletnych, ale nieudokumentowanych wysiłków. Pomyślałem także, że fajnie byłoby dodać go do innych projektów, gdy tylko opracuję, jak zrobić to jak najbardziej ogólne.
Najpierw wygenerowałem standardowy szablon Doxygen i zmieniłem jego nazwę.
cd my_projects/projectx
doxygen -g Doxyfile
mv Doxyfile Doxyfile.in
Uwaga na rozszerzenie .in. Prawdopodobnie nie jest to konieczne, ale konwencjonalne, jeśli dobrze rozumiem.
Następnie dodałem następujący blok kodu do mojego pliku CMakeLists.txt, tuż przed zdefiniowaniem moich celów (nie jestem pewien, czy jest to ważne, ale CMake czasami jest wybredny w odniesieniu do sekwencji niektórych poleceń).
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()
Spowoduje to utworzenie nowego celu o nazwie doc. Określenie ALL dodaje go do domyślnego celu "all", ale jest to opcjonalne. Podanie @ONLY zapewnia, że dowolne zmienne typu "$ {zmienne}" nie będą rozwijane przez CONFIGURE_FILE, tylko typy "@ variable @". Trochę myląco (przynajmniej dla mnie), CMAKE_CURRENT_SOURCE_DIR wydaje się odnosić do katalogu projektu i CMAKE_CURRENT_BINARY_DIR do katalogu budowania.
Wreszcie, i to jest miejsce, w którym PROJECT_NAME i inni wchodzili, edytowałem Doxyfile.in.
Jest to początek mojego nowego 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
Masz pomysł, myślę. Kiedy już to w pełni uogólnisz (czy to słowo?) Mogę skopiować to do moich innych projektów i tak długo jak będę tagować mój kod, będę miał wszędzie dobrą dokumentację.
Ogłoszenie PROJECT_BRIEF nie zostało określone. Nie skończyłem z tym i wciąż mam kilka pustych miejsc, o które mógłbym pomyśleć. Na przykład PROJECT_VERSION_TWEAK w rzeczywistości jeszcze niczego nie zawiera. Będę musiał znaleźć sposób na zdobycie mojego numeru kompilacji.
Jak korzystać ze zmiennych 'PROJECT_NAME',' PROJECT_SOURCE_DIR' i 'PROJECT_BINARY_DIR'? Czy te biblioteki są niezależne, czy są tylko częściami głównej biblioteki/aplikacji? –
Używam tych zmiennych w makrach generujących kod źródłowy. Tworzę cel najwyższego poziomu o nazwie $ {PROJECT_NAME} _SPDEF, na którym mogą polegać inne projekty, aby wymusić ich generację. Używam również zmiennych _DIR, aby umieścić wygenerowany kod w odpowiedniej lokalizacji. – ScaryAardvark