#!/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