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>
70 lines
2.3 KiB
CMake
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}>
|
|
)
|