# The entry point for building and installing cgit. The program itself is # compiled inside the bundled Git tree by source/cgit.mk, which this file # invokes with the paths and the defaults it needs. Everything that is not # compilation, that is the install and uninstall rules and the housekeeping # targets, is driven from here. .DEFAULT_GOAL := all .SUFFIXES: # Sources live in source/, web assets in assets/, Lua filters in # custom/extensions/, the bundled Git tree in vendor/git, and everything # generated lands in build/. CGIT_ROOT leads from inside the Git tree back to # the project root, because the cgit build runs with vendor/git as its working # directory. SRCDIR = source ASSETDIR = assets EXTDIR = custom/extensions GITDIR = vendor/git BUILDDIR = build CGIT_ROOT = ../.. # The Git release that get-git fetches when the submodule is not checked out. # Keep it in step with the commit the submodule is pinned to. GIT_VERSION = 2.55.0 GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VERSION).tar.xz # Compiled-in cgit defaults, all overridable through cgit.conf. Every one # carries the CGIT_ prefix except CACHE_ROOT, which is inherited from upstream # under that name. CGIT_VERSION = v2.7.1 CGIT_SCRIPT_NAME = cgit.cgi CGIT_SCRIPT_PATH = /var/www/htdocs/cgit CGIT_DATA_PATH = $(CGIT_SCRIPT_PATH) CGIT_CONFIG = /etc/cgitrc CACHE_ROOT = /var/cache/cgit # The standard GNU install directories, kept lowercase so that packaging can # override them. filterdir is the one cgit-specific addition. prefix = /usr/local libdir = $(prefix)/lib filterdir = $(libdir)/cgit/filters # The files that go into the data path and the filter directory. One list each # drives both install and uninstall, so the two can never drift apart. ASSETS = cgit.css ASSETS += cgit.js ASSETS += cgit.png ASSETS += favicon.ico ASSETS += robots.txt FILTER_FILES = $(notdir $(wildcard $(EXTDIR)/*.lua)) INSTALL = install # Reuse Git's platform detection, then let the user override any of the # settings above through cgit.conf. Both includes must stay after the defaults. -include $(GITDIR)/config.mak.uname -include cgit.conf export CGIT_VERSION CGIT_SCRIPT_NAME CGIT_SCRIPT_PATH export CGIT_DATA_PATH CGIT_CONFIG CACHE_ROOT all: cgit # NO_RUST keeps Cargo out of the build. Git 2.55 inverted the flag that used to # be WITH_RUST, so Rust is now compiled in unless it is turned off, and leaving # this out would quietly make Cargo a build requirement. Git 3.0 drops the # choice entirely, at which point this stops working and Rust becomes # mandatory. GIT_BUILD_FLAGS = NO_CURL=1 NO_OPENSSL=1 NO_RUST=1 cgit: +@$(MAKE) -C $(GITDIR) -f $(CGIT_ROOT)/$(SRCDIR)/cgit.mk \ $(CGIT_ROOT)/$(BUILDDIR)/cgit $(EXTRA_GIT_TARGETS) $(GIT_BUILD_FLAGS) sparse: +@$(MAKE) -C $(GITDIR) -f $(CGIT_ROOT)/$(SRCDIR)/cgit.mk $(GIT_BUILD_FLAGS) cgit-sparse test: cgit-with-git +@$(MAKE) -C tests all # The test helpers link against a fully built Git tree, so this asks the sub # make for Git's own all target alongside cgit. cgit-with-git: +@$(MAKE) cgit EXTRA_GIT_TARGETS=all install: all $(INSTALL) -m 0755 -d $(DESTDIR)$(CGIT_SCRIPT_PATH) $(INSTALL) -m 0755 $(BUILDDIR)/cgit $(DESTDIR)$(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME) $(INSTALL) -m 0755 -d $(DESTDIR)$(CGIT_DATA_PATH) $(INSTALL) -m 0644 $(addprefix $(ASSETDIR)/,$(ASSETS)) $(DESTDIR)$(CGIT_DATA_PATH) $(INSTALL) -m 0755 -d $(DESTDIR)$(filterdir) $(INSTALL) -m 0644 $(addprefix $(EXTDIR)/,$(FILTER_FILES)) $(DESTDIR)$(filterdir) uninstall: $(RM) $(DESTDIR)$(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME) $(RM) $(addprefix $(DESTDIR)$(CGIT_DATA_PATH)/,$(ASSETS)) $(RM) $(addprefix $(DESTDIR)$(filterdir)/,$(FILTER_FILES)) # Compiled output lives under build/ and the test suite writes into tests/, so # cleaning removes both. The descent into tests is guarded because # tests/Makefile includes git's config.mak.uname, which needs the submodule # present. clean: $(RM) -r $(BUILDDIR) @if test -e $(GITDIR)/config.mak.uname; then $(MAKE) -C tests clean; fi cleanall: clean @if test -e $(GITDIR)/Makefile; then $(MAKE) -C $(GITDIR) clean; fi get-git: mkdir -p $(dir $(GITDIR)) curl -L $(GIT_URL) | tar -xJf - && rm -rf $(GITDIR) && mv git-$(GIT_VERSION) $(GITDIR) tags: @mkdir -p $(BUILDDIR) find $(SRCDIR) -name '*.[ch]' | xargs ctags -f $(BUILDDIR)/tags .PHONY: all cgit cgit-with-git sparse test .PHONY: install uninstall .PHONY: clean cleanall get-git tags