From 5ff3481cce56f40f15fa305b91f9ce26494909db Mon Sep 17 00:00:00 2001 From: Bryce Kwon Date: Wed, 15 Jul 2026 06:14:57 -1000 Subject: Reorganize into source, assets and libraries The C sources move to source/, the served files to assets/, the bundled Git submodule to libraries/git and the filter scripts to extensions/. Everything the build generates now lands in build/, so a clean is a single remove and the tree stays clean. --- Makefile | 141 ++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 68 insertions(+), 73 deletions(-) (limited to 'Makefile') diff --git a/Makefile b/Makefile index 9d39bf4..efb6dc2 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,7 @@ CGIT_SCRIPT_PATH = /var/www/htdocs/cgit CGIT_DATA_PATH = $(CGIT_SCRIPT_PATH) CGIT_CONFIG = /etc/cgitrc CACHE_ROOT = /var/cache/cgit + prefix = /usr/local libdir = $(prefix)/lib filterdir = $(libdir)/cgit/filters @@ -13,16 +14,32 @@ docdir = $(prefix)/share/doc/cgit htmldir = $(docdir) pdfdir = $(docdir) mandir = $(prefix)/share/man + SHA1_HEADER = 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 + +# 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/. MAN5_TXT = $(wildcard *.5.txt) MAN_TXT = $(MAN5_TXT) -DOC_MAN5 = $(patsubst %.txt,%,$(MAN5_TXT)) -DOC_HTML = $(patsubst %.txt,%.html,$(MAN_TXT)) -DOC_PDF = $(patsubst %.txt,%.pdf,$(MAN_TXT)) +DOC_MAN5 = $(patsubst %.txt,$(BUILDDIR)/%,$(MAN5_TXT)) +DOC_HTML = $(patsubst %.txt,$(BUILDDIR)/%.html,$(MAN_TXT)) +DOC_PDF = $(patsubst %.txt,$(BUILDDIR)/%.pdf,$(MAN_TXT)) ASCIIDOC = asciidoc ASCIIDOC_EXTRA = @@ -30,69 +47,46 @@ ASCIIDOC_HTML = xhtml11 ASCIIDOC_COMMON = $(ASCIIDOC) $(ASCIIDOC_EXTRA) TXT_TO_HTML = $(ASCIIDOC_COMMON) -b $(ASCIIDOC_HTML) -# Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.) -# do not support the 'size specifiers' introduced by C99, namely ll, hh, -# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t). -# some C compilers supported these specifiers prior to C99 as an extension. -# -# Define HAVE_LINUX_SENDFILE to use sendfile() - -#-include config.mak - --include git/config.mak.uname -# -# Let the user override the above settings. -# +# Reuse Git's platform detection, then let the user override the settings +# above through cgit.conf. +-include $(GITDIR)/config.mak.uname -include cgit.conf export CGIT_VERSION CGIT_SCRIPT_NAME CGIT_SCRIPT_PATH CGIT_DATA_PATH CGIT_CONFIG CACHE_ROOT -# -# Define a way to invoke make in subdirs quietly, shamelessly ripped -# from git.git -# -QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir -QUIET_SUBDIR1 = - -ifneq ($(findstring w,$(MAKEFLAGS)),w) -PRINT_DIR = --no-print-directory -else # "make -w" -NO_SUBDIR = : -endif - -ifndef V - QUIET_SUBDIR0 = +@subdir= - QUIET_SUBDIR1 = ;$(NO_SUBDIR) echo ' ' SUBDIR $$subdir; \ - $(MAKE) $(PRINT_DIR) -C $$subdir - QUIET_TAGS = @echo ' ' TAGS $@; - export V -endif - .SUFFIXES: 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: - $(QUIET_SUBDIR0)git $(QUIET_SUBDIR1) -f ../cgit.mk ../cgit $(EXTRA_GIT_TARGETS) NO_CURL=1 + +@$(MAKE) -C $(GITDIR) -f $(TO_ROOT)$(SRCDIR)/cgit.mk \ + $(TO_ROOT)$(BUILDDIR)/cgit $(EXTRA_GIT_TARGETS) NO_CURL=1 sparse: - $(QUIET_SUBDIR0)git $(QUIET_SUBDIR1) -f ../cgit.mk NO_CURL=1 cgit-sparse + +@$(MAKE) -C $(GITDIR) -f $(TO_ROOT)$(SRCDIR)/cgit.mk \ + NO_CURL=1 cgit-sparse -test: - @$(MAKE) --no-print-directory cgit EXTRA_GIT_TARGETS=all - $(QUIET_SUBDIR0)tests $(QUIET_SUBDIR1) all +# 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 + +cgit-with-git: + +@$(MAKE) cgit EXTRA_GIT_TARGETS=all install: all $(INSTALL) -m 0755 -d $(DESTDIR)$(CGIT_SCRIPT_PATH) - $(INSTALL) -m 0755 cgit $(DESTDIR)$(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME) + $(INSTALL) -m 0755 $(BUILDDIR)/cgit $(DESTDIR)$(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME) $(INSTALL) -m 0755 -d $(DESTDIR)$(CGIT_DATA_PATH) - $(INSTALL) -m 0644 cgit.css $(DESTDIR)$(CGIT_DATA_PATH)/cgit.css - $(INSTALL) -m 0644 cgit.js $(DESTDIR)$(CGIT_DATA_PATH)/cgit.js - $(INSTALL) -m 0644 cgit.png $(DESTDIR)$(CGIT_DATA_PATH)/cgit.png - $(INSTALL) -m 0644 favicon.ico $(DESTDIR)$(CGIT_DATA_PATH)/favicon.ico - $(INSTALL) -m 0644 robots.txt $(DESTDIR)$(CGIT_DATA_PATH)/robots.txt + $(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 0755 -d $(DESTDIR)$(filterdir) - $(COPYTREE) filters/* $(DESTDIR)$(filterdir) + $(COPYTREE) extensions/* $(DESTDIR)$(filterdir) install-doc: install-man install-html install-pdf @@ -120,23 +114,23 @@ uninstall: 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 filters/%,%,$(shell find filters/ ! -type d)), \ + $(foreach file,$(patsubst extensions/%,%,$(shell find extensions/ ! -type d)), \ $(call rm_f,$(DESTDIR)$(filterdir)/$(file))) uninstall-doc: uninstall-man uninstall-html uninstall-pdf uninstall-man: - @for i in $(DOC_MAN5); do \ + @for i in $(notdir $(DOC_MAN5)); do \ rm -fv $(DESTDIR)$(mandir)/man5/$$i; \ done uninstall-html: - @for i in $(DOC_HTML); do \ + @for i in $(notdir $(DOC_HTML)); do \ rm -fv $(DESTDIR)$(htmldir)/$$i; \ done uninstall-pdf: - @for i in $(DOC_PDF); do \ + @for i in $(notdir $(DOC_PDF)); do \ rm -fv $(DESTDIR)$(pdfdir)/$$i; \ done @@ -146,35 +140,36 @@ doc-man5: $(DOC_MAN5) doc-html: $(DOC_HTML) doc-pdf: $(DOC_PDF) -%.5 : %.5.txt - a2x -f manpage $< +$(DOC_MAN5): $(BUILDDIR)/%.5 : %.5.txt + @mkdir -p $(BUILDDIR) + a2x -f manpage -D $(BUILDDIR) $< -$(DOC_HTML): %.html : %.txt - $(TXT_TO_HTML) -o $@+ $< && \ - mv $@+ $@ +$(DOC_HTML): $(BUILDDIR)/%.html : %.txt + @mkdir -p $(BUILDDIR) + $(TXT_TO_HTML) -o $@ $< -$(DOC_PDF): %.pdf : %.txt - a2x -f pdf cgitrc.5.txt +$(DOC_PDF): $(BUILDDIR)/%.pdf : %.txt + @mkdir -p $(BUILDDIR) + a2x -f pdf -D $(BUILDDIR) $< -clean: clean-doc - $(RM) cgit VERSION CGIT-CFLAGS *.o tags - $(RM) -r .deps +# Everything generated lives under build/, so cleaning is a single remove. +clean: + $(RM) -r $(BUILDDIR) cleanall: clean - $(MAKE) -C git clean - -clean-doc: - $(RM) cgitrc.5 cgitrc.5.html cgitrc.5.pdf cgitrc.5.xml cgitrc.5.fo + @if test -e $(GITDIR)/Makefile; then $(MAKE) -C $(GITDIR) clean; fi +# Fetch a Git release tarball for builds without the submodule checked out. get-git: - curl -L $(GIT_URL) | tar -xJf - && rm -rf git && mv git-$(GIT_VER) git + mkdir -p $(dir $(GITDIR)) + curl -L $(GIT_URL) | tar -xJf - && rm -rf $(GITDIR) && mv git-$(GIT_VER) $(GITDIR) tags: - $(QUIET_TAGS)find . -name '*.[ch]' | xargs ctags + @mkdir -p $(BUILDDIR) + find $(SRCDIR) -name '*.[ch]' | xargs ctags -f $(BUILDDIR)/tags -.PHONY: all cgit git get-git -.PHONY: clean clean-doc cleanall -.PHONY: doc doc-html doc-man doc-pdf +.PHONY: all cgit cgit-with-git sparse test get-git tags +.PHONY: clean cleanall +.PHONY: doc doc-html doc-man doc-man5 doc-pdf .PHONY: install install-doc install-html install-man install-pdf -.PHONY: tags test .PHONY: uninstall uninstall-doc uninstall-html uninstall-man uninstall-pdf -- cgit v2.8.0