From ca697724df0c2ccdaacb7313eabaaf1355f4aa8b Mon Sep 17 00:00:00 2001 From: Bryce Kwon Date: Thu, 29 Oct 2026 15:43:47 -1000 Subject: Add a development build script cgit's objects are compiled by its own rule rather than git's, so they took no -MJ flag and a compilation database held only git's sources. --- tools/build-development.sh | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100755 tools/build-development.sh (limited to 'tools/build-development.sh') diff --git a/tools/build-development.sh b/tools/build-development.sh new file mode 100755 index 0000000..79b9259 --- /dev/null +++ b/tools/build-development.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +# Build cgit for development and debugging. It compiles without optimisation +# and with full debug information, holds the sources to git's DEVELOPER +# warnings, and links in AddressSanitizer and UndefinedBehaviorSanitizer, so a +# memory error or undefined behaviour stops the program where it happens. With +# clang it also leaves a compilation database in build/compile_commands.json, +# where a language server looks for one, and with ctags a tags file in +# build/tags. The sanitizers make cgit slow, so the result is for testing and +# debugging rather than serving. +# +# Any arguments go on to make, the way Lua flags do where pkg-config cannot +# find Lua: +# +# ./tools/build-development.sh LUA_PKGCONFIG=luajit +# +# Going back to a normal build takes make cleanall first. + +set -eu + +# Every make target below is written relative to the repository root. +cd "$(dirname "$0")/.." + +# The build starts from clean so the bundled git objects pick up the same +# flags, and cleanall rather than clean because only cleanall descends into +# vendor/git. +make cleanall +make "$@" CFLAGS="-O0 -g3" DEVELOPER=1 SANITIZE=address,undefined \ + GENERATE_COMPILATION_DATABASE=yes + +# clang writes one entry per object under vendor/git/compile_commands, each +# ending in a comma, so they are joined into one array. cgit's are named after +# ../../build, which a shell glob would pass over as hidden. +if test -d vendor/git/compile_commands +then + find vendor/git/compile_commands -name '*.json' -exec cat {} + | + sed -e '1s/^/[/' -e '$s/,$/]/' >build/compile_commands.json + test -s build/compile_commands.json || rm -f build/compile_commands.json +fi + +if command -v ctags >/dev/null +then + make tags +fi -- cgit