jw-pkg/make/projects-dir.mk

320 lines
9 KiB
Makefile
Raw Normal View History

#
# This is the top-level Makefile for a janware software build tree. It is
# provided under the terms of the GNU Lesser Public License, Version 2.
#
# Some of its targets download software from janware GmbH servers. For those,
# you will need a janware.com user account. Ask admin@janware.com if you want
# one.
#
# Current documentation on how this Makefile is meant to be used can be found
# under https://janware.com/wiki/pub/en/sw/build/. Running "make doc-module"
# might take you there semi-automatically.
#
# ------------ Makefile and environment variables
-include local.mk
SHELL = /bin/bash -o pipefail
ifneq ($(PROJECTS),)
export PGIT_CLONE_PROJECTS = $(PROJECTS)
endif
ifneq ($(wildcard projects.txt),)
PROJECTS ?= $(shell cat projects.txt | sed '/^ *\#/ d')
# TODO: this could be nicer
CVS_PROJECTS = $(PROJECTS)
else
PROJECTS ?= $(shell ls -d */CVS */.git 2>/dev/null | sed 's%/[^/]*%%')
CVS_PROJECTS = $(filter $(dir $(wildcard */CVS)),$(PROJECTS))
endif
EXCLUDE_FROM_BUILD += \
dspider-btools \
dspider-shared \
feedfs-dspcd \
casview \
dspfs \
jux3
EXCLUDES_FILE ?= exclude.txt
ifneq ($(wildcard $(EXCLUDES_FILE)),)
EXCLUDE_FROM_BUILD += $(shell cat $(EXCLUDES_FILE))
endif
BUILD_PROJECTS = $(filter-out $(EXCLUDE_FROM_BUILD),$(PROJECTS))
ifeq ($(JANWARE_USER),)
export JANWARE_USER = $(shell id -un)
endif
CWD := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
export CVSROOT = :ext:$(JANWARE_USER)@cvs.jannet.de:/home/jannet/arc/cvs
ifneq ($(JW_BUILD_SSH),)
export CVS_RSH := $(JW_BUILD_SSH)
else
export CVS_RSH := $(CWD)/ssh-wrapper.sh
endif
export GIT_SSH := $(CVS_RSH)
ifeq ($(filter pkg-%,$(MAKECMDGOALS)),)
export JW_BUILD_SSH_EXTRA_OPTS += -o ControlMaster=auto -o ControlPath=/tmp/%r@jw-build:%p -o ControlPersist=3m
endif
ifneq ($(CLONE_FROM_USER),)
export PGIT_CLONE_FROM_USER = $(CLONE_FROM_USER)
else
export PGIT_CLONE_FROM_USER = $(JANWARE_USER)
endif
ifneq ($(EXCLUDE_FROM_BUILD),)
BUILD_PY_EXTRA_ARGS += --exclude "$(EXCLUDE_FROM_BUILD)"
endif
# ------------ external programs
MOD_SCRIPT_DIR = ./jw-build/scripts
PGIT = CLONE_PROJECTS="$(PROJECTS)" /bin/bash $(firstword $(wildcard $(MOD_SCRIPT_DIR)/pgit.sh /opt/jw-build/bin/pgit.sh) pgit.sh-not-found)
BUILD_PY = python $(MOD_SCRIPT_DIR)/build.py -b $(shell pwd) $(BUILD_PY_EXTRA_ARGS)
PROJECTS_PY = python $(MOD_SCRIPT_DIR)/projects.py --prefix $(shell pwd) $(PROJECTS_PY_EXTRA_ARGS)
PURGE_SH = /bin/bash $(firstword $(wildcard $(MOD_SCRIPT_DIR)/purge-stale-projects.sh /opt/jw-build/bin/purge-stale-projects.sh) purge-not-found)
RELEASE_SH = /bin/bash $(firstword $(wildcard $(MOD_SCRIPT_DIR)/build-release.sh /opt/jw-build/bin/build-release.sh) release-not-found)
PKG_MANAGER_SH ?= /bin/bash $(firstword $(wildcard $(MOD_SCRIPT_DIR)/pkg-manager.sh /opt/jw-build/bin/pkg-manager.sh) pkg-manager-not-found)
CREATE_PROJECT_SH ?= /bin/bash $(firstword $(wildcard $(MOD_SCRIPT_DIR)/jw-build-create-project.sh /opt/jw-build/bin/jw-build-create-project.sh) jw-build-create-project-not-found)
LIST_VCS_FILES = /bin/bash $(firstword $(wildcard $(MOD_SCRIPT_DIR)/list-cvs-files.sh /opt/jw-build/bin/list-cvs-files.sh) list-cvs-files-not-found)
JANWARE_PKG = /bin/bash $(firstword $(wildcard $(MOD_SCRIPT_DIR)/jannet /opt/jw-build/bin/jannet) jannet-not-found)
BROWSER ?= firefox
GIT_SRV_ADMIN_SH = JW_BUILD_SSH_EXTRA_OPTS="$(JW_BUILD_SSH_EXTRA_OPTS)" $(GIT_SSH) $(JANWARE_USER)@git.jannet.de /opt/jw-build/bin/git-srv-admin.sh
CVS_ADMIN_SH = JW_BUILD_SSH_EXTRA_OPTS="$(JW_BUILD_SSH_EXTRA_OPTS)" $(GIT_SSH) $(JANWARE_USER)@git.jannet.de /opt/jw-build/bin/cvs-admin.sh
# ------------ targets
all: pull.done
$(BUILD_PY) $@ $(BUILD_PROJECTS)
clean: clean-dirs done.clean
distclean: clean-all-dirs done.clean
install:
@echo
@echo " Target install is not supported by this Makefile."
@echo " Target pkg-rebuild-reinstall might be what you are looking for."
@echo
@exit 1
build-order: pull.done
$(BUILD_PY) order $(BUILD_PROJECTS) | sed 's/ */\n/g'
clean-dirs:
ls */dirs-started-all.done 2>/dev/null | sed 's%/.*%%' | xargs -r $(BUILD_PY) clean
clean-all-dirs:
$(BUILD_PY) clean $(PROJECTS)
echo-prereq-build:
@$(PROJECTS_PY) requires-pkg --flavours "build" $(BUILD_PROJECTS)
echo-prereq-release:
@$(PROJECTS_PY) requires-pkg --flavours "build run release" $(BUILD_PROJECTS)
pkg-manager-refresh:
$(PKG_MANAGER_SH) refresh -y
pkg-install-prereq-build:
@$(PROJECTS_PY) requires-pkg --flavours "build" $(BUILD_PROJECTS) | xargs -r $(PKG_MANAGER_SH) install -y
pkg-install-prereq-release:
@$(PROJECTS_PY) requires-pkg --flavours "build run release" $(BUILD_PROJECTS) | xargs -r $(PKG_MANAGER_SH) install -y
pkg-exclude-built-today:
$(JANWARE_PKG) built-today > $(EXCLUDES_FILE)
pkg-list-groups:
@find . -name project.conf | xargs sed '/^ *group *=/!d; s/group *= *//; s/"//g' | sort -u
pkg-fetch-from-%:
ssh $* /opt/jw-base/bin/jw-pkg info -s > projects.txt.tmp
mv projects.txt.tmp projects.txt
pkg-release-all:
/bin/bash ./packager-client/scripts/packager-client-2.sh
pkg-%: pull.done
$(BUILD_PY) $@ $(BUILD_PROJECTS)
init-project-%:
$(CREATE_PROJECT_SH) $*
doc-project doc-module:
$(BROWSER) $(firstword $(shell sed '/https:/ !d; s%.*https%https%; s/ .*//' $(firstword $(MAKEFILE_LIST))))
status: ssh-wrapper.sh
for p in $(CVS_PROJECTS); do test -f $$d/CVS || echo $$p; done
cvs status $(addsuffix VERSION,$(CVS_PROJECTS))
$(PGIT) status
purge: ssh-wrapper.sh
ifneq ($(wildcard CVS),)
$(PURGE_SH)
endif
update pull: purge cvs-update git-clone
touch pull.done
sync: pull push
sync-%:
ssh $* make -C $(shell pwd) sync
pull-all: purge cvs-update git-clone git-pull-all
touch clone.done
touch pull.done
diff-all diff: ssh-wrapper.sh
cvs diff -u; $(PGIT) diff
rebuild: clean purge pull subdirs-all
release: ssh-wrapper.sh
$(RELEASE_SH)
subdirs-%:
FORCE_REBUILD_SUBDIRS=true make $*
cvs-update: ssh-wrapper.sh
rm -f $@.done
make $@.done
cvs-diff: ssh-wrapper.sh
cvs diff -u
git-push push: ssh-wrapper.sh
$(PGIT) push
git-push-all: ssh-wrapper.sh
$(PGIT) push --all
git-diff: ssh-wrapper.sh
$(PGIT) diff
git-short-diff: ssh-wrapper.sh
$(PGIT) diff --shortstat
git-pull: ssh-wrapper.sh
$(PGIT) clone
git-pull-all: ssh-wrapper.sh
$(PGIT) pull --all
git-clone: ssh-wrapper.sh
$(PGIT) clone
touch clone.done
git-clone-%: ssh-wrapper.sh
PGIT_CLONE_FROM_USER=$* $(PGIT) clone
git-show-non-master-branches:
@$(PGIT) branch 2>&1 | \
sed '/^#\|^*/!d; s/.*git -C //; s/ *branch *//; s/ *\* *//' | \
while read p; do \
read b ;\
if [ "$$b" != "master" ]; then \
echo " * $$p: $$b" ;\
fi ;\
done
pull-%: ssh-wrapper.sh
PGIT_CLONE_FROM_USER=$* $(PGIT) clone
git-commit:
$(PGIT) commit
git-conv-%: ssh-wrapper.sh
[ -e $*/.git ] || { \
mv $* old/ ;\
if PROJECTS="$*" make clone; then \
sed -i "/^D\/$*\// d" CVS/Entries ;\
else \
mv old/$* . ;\
fi \
}
check-conv: ssh-wrapper.sh
for p in `$(GIT_SRV_ADMIN_SH) -u jan -j list-personal-projects`; do \
make git-conv-$$p ;\
done
list-maintainers: ssh-wrapper.sh
$(GIT_SRV_ADMIN_SH) $@
git-update-project-descriptions: ssh-wrapper.sh
$(GIT_SRV_ADMIN_SH) -j update-descriptions all
projects.txt:
echo $(PROJECTS) | sed 's/ /\n/g; s%/%%g' > $@
done.clean:
rm -f *.done
links.done:
if [ -d btools ]; then ln -sf btools dspider-btools; fi
if [ -d dspc/src/shared ]; then ln -sf dspc/src/shared dspider-shared; fi
touch $@
ssh-wrapper.sh: Makefile
/bin/echo -e '#!/bin/bash -x\n\nexec /usr/bin/ssh $$JW_BUILD_SSH_EXTRA_OPTS "$$@"' > $@.tmp
chmod 700 $@.tmp
mv $@.tmp $@
ssh-wrapper: ssh-wrapper.sh
clean.ssh-wrapper:
rm -f ssh-wrapper.sh
clean: clean.ssh-wrapper
cvsdir.done: ssh-wrapper.sh
if [ ! -d CVS ]; then \
mkdir CVS && \
echo :ext:$(JANWARE_USER)@cvs.jannet.de:/home/jannet/arc/cvs > CVS/Root && \
echo proj > CVS/Repository && \
echo "/Makefile/$Revision$ ///" | sed 's/ *evision: *\([0-9.]*\) */\1/; s/ *$$ *//' > CVS/Entries ;\
fi
touch $@
cvs-update.done: cvsdir.done ssh-wrapper.sh
cvs update -dP Makefile $(shell $(CVS_ADMIN_SH) list-projects)
touch $@
update.done: purge
pull.done: cvs-update.done clone.done links.done
touch $@
clone.done: ssh-wrapper.sh
$(PGIT) clone
touch $@
list-files:
@for p in $(PROJECTS); do \
$(LIST_VCS_FILES) -znf $$p | sed -z "s/^/$$p\//" | \
xargs -0 realpath --relative-to=. ;\
done
list-text-files:
@make --no-print-directory list-files | xargs file -N | grep ":.*text" | cut -d: -f1
loc-all:
@make --no-print-directory list-text-files | \
grep -v "iow-standalone\|jux3\|ntv2/contrib\|\.dia$$\|\.dat\$$\|bootsrap\.css\|mpegplayer/contrib\|gitweb.cgi" | \
xargs wc -l
find-code-files:
find . -name '*.c' -o -name '*.cpp' -o -name '*.h' \
-o -name Makefile -o -name '*.mk' \
-o -name '*.sh' -o -name '*.pl' -o -name '*.py' \
| grep -v "/dist/\|\.dep\.mk\|local.mk\|coordgen\|^\./[^/]\+/include/" \
| grep -v "contrib/wt\|/bin/\|contrib/bootstrap\|contrib/chntpw/src\|contrib/jquery/src\|contrib/ntv2linux" \
| grep -v "copilot-suse-tw-cf/initrd-tree" \
| grep -v "iow-standalone\|jux3" \
| grep -v "generated\|tmp\|old\|orig\|purged"