Files
libakerror/docs/building.md
Andrew Kesterson 5695061130
Some checks failed
libakerror CI Build / cmake_build (push) Successful in 2m47s
libakerror CI Build / coverage (push) Successful in 2m48s
libakerror CI Build / thread_sanitizer (push) Failing after 2m49s
libakerror CI Build / mutation_test (push) Successful in 39m56s
Split the README reference material into docs/
The README was 794 lines: the summary, the design rationale, the whole macro
reference, the threading contract, the build internals and the exit-status
specification in one file. It is now 178 lines -- summary, installation,
quickstart, and an index -- and the reference material lives in docs/, one file
per topic: architecture, usage, status-codes, uncaught-errors, exit-status,
thread-safety, building.

The prose moved as written. Inbound references followed it: UPGRADING.md,
TODO.md, include/akerror.tmpl.h and tests/err_threads_handoff.c now name the
docs/ file that owns the text they cite, and AGENTS.md says where new
documentation goes so the README does not grow back.

Five factual errors fixed in the moved text:

- Both NULL-pointer examples inverted their test. FAIL_ZERO_* fails when the
  expression is zero, so `(somePointer == NULL)` failed on a *valid* pointer.
  They now read `(somePointer != NULL)`.
- AKERROR_NOIGNORE, four times including the #define, is AKERR_NOIGNORE.
- FINISH_NORExbTURN is FINISH_NORETURN.
- "functiions" is "functions".
- The architecture link pointed at include/akerror.h, which is generated and
  not in the tree; it points at include/akerror.tmpl.h.

The quickstart is new text. It compiles under -Wall -Wextra -Werror and was run
through all three of its paths: handled usage error exits 0, unhandled IO error
prints a trace and exits with the status, success exits 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 16:56:07 -04:00

2.8 KiB

Building libakerror

The ordinary build is an out-of-tree CMake build, described in the README. This file covers what the build generates for you, what it links against, and the configure options that change either of those.

Configure options

Option Default What it does
AKERR_THREADS auto Threading backend: auto, pthread, or none. auto takes POSIX threads and fails the configure if it cannot find them. See Building single threaded.
AKERR_USE_STDLIB ON Link against the C standard library. See Dependencies for what you must supply instead when this is OFF.
AKERR_STATUS_NAME_SLOTS 4096 Slots in the status-name table; 75% of it is usable.
AKERR_MAX_RESERVED_STATUS_RANGES 64 How many status ranges may be reserved in one process.
AKERR_SANITIZE (empty) Sanitizer list applied to the library and the tests, e.g. thread or address,undefined.
AKERR_COVERAGE OFF Instrument the library with gcov counters.

The two capacity options are applied PRIVATE: the tables live entirely in src/error.c, so raising them never changes anything a consumer can see. See UPGRADING.md for what happens when you exhaust them.

Templating and autogenerated code

The build process relies upon scripts/generrno.sh which performs the following:

  1. Executes errno --list and gathers up the output
  2. Templates include/akerror.tmpl.h into include/akerror.h to set the AKERR_LAST_ERRNO_VALUE equal to the highest integer defined by errno
  3. Generates src/errno.c which contains a function called by akerr_init which initializes all of the status names for the previously defined values of errno.

Neither output is meant to be edited. Change the template or the generator.

Dependencies

This library depends upon stdlib, and upon POSIX threads unless it is built with -DAKERR_THREADS=none (see Thread safety). If you don't want to link against stdlib, you must modify the library code to include headers and link against a library that provides the following:

  • memset function
  • strncpy function
  • strlen function
  • strcmp function
  • sprintf function
  • exit function
  • bool type
  • NULL type
  • INT_MAX constant
  • PATH_MAX constant

... then you can compile it thusly:

cmake -S . -B build -DAKERR_USE_STDLIB=OFF
cmake --build build
cmake --install build

Known defect: that configuration does not currently compile. bool, PATH_MAX and NULL are used unconditionally but only included under the stdlib branch, so the header's includes need untangling before -DAKERR_USE_STDLIB=OFF builds. The list above still states what a replacement must provide. See TODO.md.