blob: 53580f3f32749bdb5b4ec634ebfa1637909eb3bc (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
121
122
123
124
125
126
127
128
129
130
131
132
133
# 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.8.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

# Apple's linker otherwise stamps each object's mtime into the debug map, so
# two builds of the same sources would differ.
export ZERO_AR_DATE = 1

cgit:
	+@$(MAKE) -C $(GITDIR) -f $(CGIT_ROOT)/$(SRCDIR)/cgit.mk \
		$(CGIT_ROOT)/$(BUILDDIR)/cgit $(EXTRA_GIT_TARGETS) $(GIT_BUILD_FLAGS)

# The same program without Lua, built beside the full one so a change cannot
# break that configuration unnoticed. The suite runs both.
cgit-nolua:
	+@$(MAKE) -C $(GITDIR) -f $(CGIT_ROOT)/$(SRCDIR)/cgit.mk \
		$(CGIT_ROOT)/$(BUILDDIR)/nolua/cgit NO_LUA=1 BUILDDIR=$(BUILDDIR)/nolua $(GIT_BUILD_FLAGS)

sparse:
	+@$(MAKE) -C $(GITDIR) -f $(CGIT_ROOT)/$(SRCDIR)/cgit.mk $(GIT_BUILD_FLAGS) cgit-sparse

# The two builds share the Git tree, so they are made one after the other
# even under -j.
test: cgit-with-git
	+@$(MAKE) cgit-nolua
	+@$(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 cgit-nolua sparse test
.PHONY: install uninstall
.PHONY: clean cleanall get-git tags