diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Makefile136
1 file changed, 66 insertions, 70 deletions
diff --git a/Makefile b/Makefile
index a3668d5..3eb0ff5 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,27 @@
-all::
+# cgit top-level Makefile. cgit itself is compiled inside the bundled Git tree
+# by source/cgit.mk, which this file invokes; everything else (docs, install,
+# packaging, maintenance) is driven from here.
+.DEFAULT_GOAL := all
+.SUFFIXES:
+
+# Project layout. Sources live in source/, web assets in assets/, Lua filters
+# in extensions/, the bundled Git tree in libraries/git, and every generated
+# file lands in build/. CGIT_ROOT reaches from the Git tree back to the root.
+SRCDIR = source
+ASSETDIR = assets
+EXTDIR = extensions
+GITDIR = libraries/git
+BUILDDIR = build
+CGIT_ROOT = ../..
+
+# Git release fetched by get-git when the submodule is not checked out. Keep in
+# step with the submodule pin in .gitmodules.
+GIT_VERSION = 2.54.0
+GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VERSION).tar.xz
+
+# Compiled-in cgit defaults, overridable through cgit.conf. All carry the CGIT_
+# prefix except CACHE_ROOT, inherited from upstream under that name.
CGIT_VERSION = v2.1.0
CGIT_SCRIPT_NAME = cgit.cgi
CGIT_SCRIPT_PATH = /var/www/htdocs/cgit
@@ -7,6 +29,8 @@ CGIT_DATA_PATH = $(CGIT_SCRIPT_PATH)
CGIT_CONFIG = /etc/cgitrc
CACHE_ROOT = /var/cache/cgit
+# Standard GNU-style install directories, lowercase so packaging can override
+# them; filterdir is the one cgit-specific addition.
prefix = /usr/local
libdir = $(prefix)/lib
filterdir = $(libdir)/cgit/filters
@@ -14,77 +38,71 @@ docdir = $(prefix)/share/doc/cgit
htmldir = $(docdir)
mandir = $(prefix)/share/man
-SHA1_HEADER = <openssl/sha.h>
-GIT_VER = 2.54.0
-GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz
-
-INSTALL = install
-COPYTREE = cp -r
+# Files installed into the data path and the filter dir. One list each drives
+# both install and uninstall, so the two can never drift apart.
+ASSETS = cgit.css cgit.js cgit.png favicon.ico robots.txt
+FILTER_FILES = $(notdir $(wildcard $(EXTDIR)/*.lua))
-# Project layout. Sources live in source/, web assets in assets/, the bundled
-# Git tree in libraries/git, and every generated file lands in build/.
-SRCDIR = source
-ASSETDIR = assets
-GITDIR = libraries/git
-BUILDDIR = build
-
-# The bundled Git tree is two levels down, so the sub-make reaches back to the
-# project root with "../../".
-TO_ROOT = ../../
-
-# Documentation. The man-page source (*.5.txt) sits at the project root and is
-# rendered into build/.
+# The man-page source (*.5.txt) sits at the project root and is rendered into
+# build/. Only one man section exists, so DOC_* derive straight from MAN5_TXT.
MAN5_TXT = $(wildcard *.5.txt)
-MAN_TXT = $(MAN5_TXT)
DOC_MAN5 = $(patsubst %.txt,$(BUILDDIR)/%,$(MAN5_TXT))
-DOC_HTML = $(patsubst %.txt,$(BUILDDIR)/%.html,$(MAN_TXT))
+DOC_HTML = $(patsubst %.txt,$(BUILDDIR)/%.html,$(MAN5_TXT))
+INSTALL = install
+COPYTREE = cp -r
ASCIIDOC = asciidoc
ASCIIDOC_EXTRA =
ASCIIDOC_HTML = xhtml11
ASCIIDOC_COMMON = $(ASCIIDOC) $(ASCIIDOC_EXTRA)
TXT_TO_HTML = $(ASCIIDOC_COMMON) -b $(ASCIIDOC_HTML)
-# Reuse Git's platform detection, then let the user override the settings
-# above through cgit.conf.
+# 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 CGIT_DATA_PATH CGIT_CONFIG CACHE_ROOT
-.SUFFIXES:
-
-all:: cgit
+all: cgit
# cgit is compiled inside the bundled Git tree so it can reuse Git's build
# machinery (see source/cgit.mk). Objects and the binary go to build/.
cgit:
- +@$(MAKE) -C $(GITDIR) -f $(TO_ROOT)$(SRCDIR)/cgit.mk \
- $(TO_ROOT)$(BUILDDIR)/cgit $(EXTRA_GIT_TARGETS) NO_CURL=1 NO_OPENSSL=1
+ +@$(MAKE) -C $(GITDIR) -f $(CGIT_ROOT)/$(SRCDIR)/cgit.mk \
+ $(CGIT_ROOT)/$(BUILDDIR)/cgit $(EXTRA_GIT_TARGETS) NO_CURL=1 NO_OPENSSL=1
sparse:
- +@$(MAKE) -C $(GITDIR) -f $(TO_ROOT)$(SRCDIR)/cgit.mk \
+ +@$(MAKE) -C $(GITDIR) -f $(CGIT_ROOT)/$(SRCDIR)/cgit.mk \
NO_CURL=1 NO_OPENSSL=1 cgit-sparse
-# Building the test suite needs a fully built Git tree for its helpers, hence
-# EXTRA_GIT_TARGETS=all.
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` alongside cgit.
cgit-with-git:
+@$(MAKE) cgit EXTRA_GIT_TARGETS=all
+doc: doc-man doc-html
+doc-man: $(DOC_MAN5)
+doc-html: $(DOC_HTML)
+
+$(DOC_MAN5): $(BUILDDIR)/%.5 : %.5.txt
+ @mkdir -p $(BUILDDIR)
+ a2x -f manpage -D $(BUILDDIR) $<
+
+$(DOC_HTML): $(BUILDDIR)/%.html : %.txt
+ @mkdir -p $(BUILDDIR)
+ $(TXT_TO_HTML) -o $@ $<
+
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 $(ASSETDIR)/cgit.css $(DESTDIR)$(CGIT_DATA_PATH)/cgit.css
- $(INSTALL) -m 0644 $(ASSETDIR)/cgit.js $(DESTDIR)$(CGIT_DATA_PATH)/cgit.js
- $(INSTALL) -m 0644 $(ASSETDIR)/cgit.png $(DESTDIR)$(CGIT_DATA_PATH)/cgit.png
- $(INSTALL) -m 0644 $(ASSETDIR)/favicon.ico $(DESTDIR)$(CGIT_DATA_PATH)/favicon.ico
- $(INSTALL) -m 0644 $(ASSETDIR)/robots.txt $(DESTDIR)$(CGIT_DATA_PATH)/robots.txt
+ $(INSTALL) -m 0644 $(addprefix $(ASSETDIR)/,$(ASSETS)) $(DESTDIR)$(CGIT_DATA_PATH)
$(INSTALL) -m 0755 -d $(DESTDIR)$(filterdir)
- $(COPYTREE) extensions/* $(DESTDIR)$(filterdir)
+ $(INSTALL) -m 0644 $(EXTDIR)/*.lua $(DESTDIR)$(filterdir)
install-doc: install-man install-html
@@ -96,20 +114,10 @@ install-html: doc-html
$(INSTALL) -m 0755 -d $(DESTDIR)$(htmldir)
$(INSTALL) -m 0644 $(DOC_HTML) $(DESTDIR)$(htmldir)
-define rm_f
-rm -f $(1)
-
-endef
-
uninstall:
- rm -f $(DESTDIR)$(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME)
- rm -f $(DESTDIR)$(CGIT_DATA_PATH)/cgit.css
- rm -f $(DESTDIR)$(CGIT_DATA_PATH)/cgit.js
- rm -f $(DESTDIR)$(CGIT_DATA_PATH)/cgit.png
- rm -f $(DESTDIR)$(CGIT_DATA_PATH)/favicon.ico
- rm -f $(DESTDIR)$(CGIT_DATA_PATH)/robots.txt
- $(foreach file,$(patsubst extensions/%,%,$(shell find extensions/ ! -type d)), \
- $(call rm_f,$(DESTDIR)$(filterdir)/$(file)))
+ $(RM) $(DESTDIR)$(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME)
+ $(RM) $(addprefix $(DESTDIR)$(CGIT_DATA_PATH)/,$(ASSETS))
+ $(RM) $(addprefix $(DESTDIR)$(filterdir)/,$(FILTER_FILES))
uninstall-doc: uninstall-man uninstall-html
@@ -123,19 +131,6 @@ uninstall-html:
rm -fv $(DESTDIR)$(htmldir)/$$i; \
done
-doc: doc-man doc-html
-doc-man: doc-man5
-doc-man5: $(DOC_MAN5)
-doc-html: $(DOC_HTML)
-
-$(DOC_MAN5): $(BUILDDIR)/%.5 : %.5.txt
- @mkdir -p $(BUILDDIR)
- a2x -f manpage -D $(BUILDDIR) $<
-
-$(DOC_HTML): $(BUILDDIR)/%.html : %.txt
- @mkdir -p $(BUILDDIR)
- $(TXT_TO_HTML) -o $@ $<
-
# Compiled output lives under build/; the test suite writes into tests/, so
# cleaning removes both. The tests descent is guarded because tests/Makefile
# includes git's config.mak.uname, which needs the submodule present.
@@ -149,14 +144,15 @@ cleanall: clean
# Fetch a Git release tarball for builds without the submodule checked out.
get-git:
mkdir -p $(dir $(GITDIR))
- curl -L $(GIT_URL) | tar -xJf - && rm -rf $(GITDIR) && mv git-$(GIT_VER) $(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 get-git tags
-.PHONY: clean cleanall
-.PHONY: doc doc-html doc-man doc-man5
-.PHONY: install install-doc install-html install-man
-.PHONY: uninstall uninstall-doc uninstall-html uninstall-man
+# Grouped to mirror the order of the targets above.
+.PHONY: all cgit cgit-with-git sparse test
+.PHONY: doc doc-man doc-html
+.PHONY: install install-doc install-man install-html
+.PHONY: uninstall uninstall-doc uninstall-man uninstall-html
+.PHONY: clean cleanall get-git tags