Files
paulhorn db41258d16 feat: PDA als libpda + pda nach P1204R0
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>
2026-08-30 16:39:35 +02:00

70 lines
2.3 KiB
CMake

# ---------------------------------------------------------------------------
# Warnungen als INTERFACE-Target.
#
# Als Target und nicht als globales CMAKE_C_FLAGS, damit der vendorte Code in
# third_party/ die Warnungen NICHT abbekommt: unity.c und doctest.h sind nicht
# unser Code, und -Wconversion darauf ergibt nur Rauschen.
#
# Kein -Werror (bewusste Entscheidung): waehrend eines TDD-Zyklus soll ein
# unbenutztes Argument den Build nicht blockieren. Warnungen werden trotzdem
# live in Neovim angezeigt, weil clangd sie ohnehin liefert.
# ---------------------------------------------------------------------------
# Die Datei kann aus zwei verschiedenen Projekten eingebunden werden
# (Superprojekt und libpda im Alleinbetrieb). Ohne include_guard waere der
# zweite add_library()-Aufruf ein harter Fehler: "target already exists".
include_guard(GLOBAL)
add_library(pda_warnings INTERFACE)
set(PDA_GCC_LIKE_WARNINGS
-Wall
-Wextra
-Wpedantic
# Shadowing ist in C mit kurzen Namen (p, h, s) eine echte Fehlerquelle.
-Wshadow
# Implizite Verengungen (size_t -> uint16_t und aehnliches). Explizite
# Casts -- (uint16_t) len -- schweigen weiterhin, implizite nicht.
-Wconversion
-Wsign-conversion
-Wcast-qual
-Wdouble-promotion
-Wformat=2
-Wundef
-Wunused
-Wnull-dereference
-Wimplicit-fallthrough
-Warray-bounds
)
# Bewusst NICHT dabei: -Wcast-align.
#
# Uebernommen aus dem Hausstandard: clang warnt bereits, wenn ein uint8_t* auf
# einen ausgerichteten Typ gecastet wird, unabhaengig davon, wie der Puffer
# tatsaechlich ausgerichtet ist -- also auch auf korrektem Code. Wer hier mit
# rohen Puffern experimentiert, sichert die Ausrichtung im Code zu
# (alignas(...)), wo sie ueberpruefbar ist.
set(PDA_C_ONLY_WARNINGS
# Ein () statt (void) in C ist eine Funktion mit unbekannten Parametern --
# in C23 zwar geheilt, aber die Warnung haelt aelteren Code ehrlich.
-Wstrict-prototypes
-Wmissing-prototypes
-Wold-style-definition
)
set(PDA_CXX_ONLY_WARNINGS
-Wnon-virtual-dtor
-Woverloaded-virtual
-Wold-style-cast
)
target_compile_options(pda_warnings INTERFACE
$<$<COMPILE_LANG_AND_ID:C,GNU,Clang,AppleClang>:${PDA_GCC_LIKE_WARNINGS};${PDA_C_ONLY_WARNINGS}>
$<$<COMPILE_LANG_AND_ID:CXX,GNU,Clang,AppleClang>:${PDA_GCC_LIKE_WARNINGS};${PDA_CXX_ONLY_WARNINGS}>
)