blob: c92259896e6c8b3bbc914d91a20c9fc3bb5be3a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# 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.0
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