Diff options
Diffstat (limited to 'tools/build-development.sh')
-rwxr-xr-xtools/build-development.sh44
1 file changed, 44 insertions, 0 deletions
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