db41258d16
Ersetzt das Geruest (counter/notebook) durch ein echtes Beispiel und teilt es in zwei eigenstaendige Projekte, wie P1204R0 es fuer Bibliothek plus Programm verlangt. libpda: textfile (C, Datei-I/O und Feld-Escaping), calculator (Recursive-Descent-Parser mit std::expected), contact, editor, explorer. Exportiert pda::pda ueber install(EXPORT) und ist per find_package(pda) benutzbar. pda: Shell ohne Ein-/Ausgabe (execute() gibt Text zurueck, deshalb ohne Terminal testbar), REPL und Stapelbetrieb in main.cpp. examples/consumer und tools/check-install.sh pruefen die Export-Kette Ende-zu-Ende: installieren, dann ein fremdes Projekt dagegen bauen. docs/CMAKE.md erklaert das Target-Modell, PUBLIC/PRIVATE/INTERFACE, Generator-Ausdruecke, install/export und Symbolsichtbarkeit an diesem Projekt. 71 Tests gruen unter Homebrew-clang 22, Apple clang und GCC 16, statisch und shared, mit und ohne ASan/UBSan. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
68 lines
2.7 KiB
CMake
68 lines
2.7 KiB
CMake
# ---------------------------------------------------------------------------
|
|
# playground - Superprojekt
|
|
#
|
|
# Dieses Verzeichnis ist KEIN Projekt mit eigenem Quellcode. Es haelt nur zwei
|
|
# eigenstaendige Projekte zusammen:
|
|
#
|
|
# libpda/ die Bibliothek -> libpda.a bzw. libpda.dylib
|
|
# pda/ die Anwendung -> bin/pda
|
|
#
|
|
# P1204R0 verlangt genau diese Trennung ("If a project consists of a library
|
|
# and an executable, then they should be split into separate projects"). Der
|
|
# Grund ist nicht Ordnungsliebe: die Bibliothek muss OHNE die Anwendung
|
|
# baubar, testbar und installierbar sein, sonst ist sie keine Bibliothek,
|
|
# sondern ein Unterverzeichnis.
|
|
#
|
|
# Beide Teilprojekte lassen sich einzeln konfigurieren:
|
|
#
|
|
# cmake -S libpda -B build/nur-lib && cmake --build build/nur-lib
|
|
#
|
|
# Das ist die Probe aufs Exempel. Wenn das bricht, hat die Bibliothek eine
|
|
# versteckte Abhaengigkeit zur Anwendung.
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# 3.28 = die CMake-Version aus Ubuntu 24.04 LTS. NICHT auf die lokale 4.4
|
|
# hochziehen: das laesst sich auf keinem LTS-Server mehr konfigurieren.
|
|
cmake_minimum_required(VERSION 3.28)
|
|
|
|
project(playground
|
|
VERSION 0.1.0
|
|
DESCRIPTION "PDA: Bibliothek und Anwendung"
|
|
LANGUAGES C CXX)
|
|
|
|
# CMAKE_MODULE_PATH ist die Suchliste fuer include(<name>) und
|
|
# find_package(<name> MODULE). Ohne diese Zeile findet include(Warnings)
|
|
# nichts.
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
|
|
|
include(ProjectDefaults)
|
|
include(Warnings)
|
|
include(Sanitizers)
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Optionen. option() legt einen Cache-Eintrag an, den man mit -D ueberschreibt:
|
|
#
|
|
# cmake --preset debug -DPDA_BUILD_TESTS=OFF
|
|
#
|
|
# BUILD_SHARED_LIBS ist eine CMake-Konvention: add_library() ohne STATIC/SHARED
|
|
# richtet sich danach. Deshalb hier NICHT selbst erfinden, sondern genau diesen
|
|
# Namen benutzen -- jedes Werkzeug da draussen kennt ihn.
|
|
# ---------------------------------------------------------------------------
|
|
option(BUILD_SHARED_LIBS "Bibliothek als Shared Library bauen" OFF)
|
|
option(PDA_BUILD_TESTS "Unit- und Integrationstests bauen" ON)
|
|
|
|
# enable_testing() gehoert ins OBERSTE CMakeLists.txt und nirgendwo sonst.
|
|
# Nur hier legt es die CTestTestfile.cmake an, die ctest im Wurzel-Build-
|
|
# verzeichnis sucht.
|
|
if(PDA_BUILD_TESTS)
|
|
enable_testing()
|
|
endif()
|
|
|
|
add_subdirectory(third_party)
|
|
add_subdirectory(libpda)
|
|
add_subdirectory(pda)
|
|
|
|
message(STATUS "playground ${PROJECT_VERSION} | C${CMAKE_C_STANDARD} C++${CMAKE_CXX_STANDARD} | "
|
|
"${CMAKE_BUILD_TYPE} | ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} | "
|
|
"shared=${BUILD_SHARED_LIBS} tests=${PDA_BUILD_TESTS}")
|