From c94cbbc062346c0ba5806c644d69e33b66cb3c56 Mon Sep 17 00:00:00 2001 From: Ronan Keryell Date: Wed, 22 Apr 2026 04:52:10 -0700 Subject: [PATCH] Add configuration for CMake build system alongside autoconf (#17) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add a modern CMake build system (`CMakeLists.txt`, `CMakePresets.json`) that coexists with the legacy autoconf/Makefile build - Shared source files (`midifile.c`, `parseabc.c`, `music_utils.c`, `parser2.c`) are compiled once via OBJECT libraries and linked into the 8 binaries - Three presets: `default` (Release), `debug`, `sanitize` (ASan + UBSan) - Generates `compile_commands.json` for clangd/LSP editor support - Install rules match the legacy Makefile (binaries, doc files, man pages) - Pinned to `-std=gnu89` because the codebase mixes K&R `()` and ANSI typed prototypes — in C23/gnu23 (GCC 15+ default), `()` means `(void)`, making these a hard error. Note: **the existing autoconf build is also broken with GCC 15** for the same reason ```sh cmake --preset debug cmake --build --preset debug cmake --install build/debug --prefix /usr/local Documentation - README.md: added Building section with both autoconf and CMake instructions - doc/readme.txt: added build instructions in the existing preamble - doc/CHANGES: added changelog entry Test plan - All 3 presets configure and build with GCC 15 - Smoke test: abc2midi samples/coleraine.abc produces valid MIDI through mftext - Sanitizer build (--preset sanitize) runs clean on sample files - Install layout verified: 8 binaries, 10 doc files, 8 man pages in correct paths - Build on macOS (untested, should work with AppleClang) Co-authored-by: Seymour Shlien --- README.md | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/README.md b/README.md index d538ee5..980e822 100644 --- a/README.md +++ b/README.md @@ -59,30 +59,3 @@ Available presets: The CMake build generates `compile_commands.json` for use with clangd and other LSP-based editors. -### Testing - -The CMake build includes a test suite covering all 8 programs: - -- **Smoke tests** verify each binary runs cleanly with `-ver`. -- **Golden-file tests** run each program on a sample input and compare the - (normalized) output to a checked-in reference. Binary MIDI outputs are - piped through `mftext` to produce diffable text. Volatile lines (version - banners, dates, temporary paths) are stripped before comparison. - -```sh -# Run all tests -ctest --preset debug - -# Run only golden-file tests / only smoke tests -ctest --preset debug -L golden -ctest --preset debug -L smoke -``` - -To regenerate the golden files after an intentional behavioural change, -review the diff, then commit: - -```sh -cmake --build build/debug --target update-golden -git diff tests/golden/ -``` -