make: Improve make variable caching machinery #50

Merged
Jan Lindemann merged 4 commits from jan/feature/20260722-make-improve-make-variable-caching-machinery into master 2026-07-22 14:53:17 +02:00 AGit
14 changed files with 61 additions and 43 deletions

2
.gitignore vendored
View file

@ -12,3 +12,5 @@ pkg-build.dist
pkgconfig/
rebase.sh
__pycache__
.cache-project.mk
.cache-projects.mk

View file

@ -1,14 +1,24 @@
TOPDIR = .
PKG_UPLOAD_URLPREFIX ?= rsync_ssh://$(JANWARE_USER)@pkg.janware.com:/srv/dav/pub/packages/jw-foss/$(PKG_UPLOAD_OS_NAME)/$(PKG_UPLOAD_OS_VERSION)
all:
all: cache-projects
include $(TOPDIR)/make/proj.mk
include $(JWBDIR)/make/topdir.mk
include $(JWBDIR)/make/srcdist.mk
include $(JWBDIR)/make/git-cvs-bridge.mk
include $(JWBDIR)/make/py-topdir.mk
all:
clean: clean.pkgconfig
clean.pkgconfig:
rm -rf pkgconfig
# -- Cache for all projects
cache-projects: $(CACHE_PROJECTS_MK)
clean.cache-projects:
rm -f $(CACHE_PROJECTS_MK)
topdir.clean: clean.cache-projects
$(CACHE_PROJECTS_MK): $(CACHE_PROJECT_MK)
sed -E '/^[[:blank:]]*ifndef[[:blank:]]+($(subst $(space),|,$(CACHED_VARS_ONLY_PROJECT)))[[:blank:]]*$$/,/^[[:blank:]]*endif[[:blank:]]*$$/d' $< > $@.tmp
mv $@.tmp $@

View file

@ -13,19 +13,9 @@ endif
include $(JWBDIR)/make/dev-utils.mk
all: cache-projects
clean: clean-cache-projects
ifeq ($(TARGET),mingw)
install: $(INSTALL_MAKEDIR)/winres.rc.tmpl
endif
grep-vars:
$(Q)sed '/^ *[A-Z]/!d; s/^[ ]*//g; s/[=+?:].*//g; s/[ ]*//g' *.mk | sort -u
cache-projects: $(CACHE_PROJECTS_MK)
clean-cache-projects:
rm -f $(CACHE_PROJECTS_MK)
$(CACHE_PROJECTS_MK): $(CACHE_PROJECT_MK)
sed -E '/^[[:blank:]]*ifndef[[:blank:]]+($(subst $(space),|,$(CACHED_VARS_ONLY_PROJECT)))[[:blank:]]*$$/,/^[[:blank:]]*endif[[:blank:]]*$$/d' $< > $@.tmp
mv $@.tmp $@

View file

@ -1,9 +1,15 @@
# ----- define these variables
# CACHED_FILES = $(TOPDIR)/VERSION
# CACHED_VARS = VERSION
.PHONY: cache clean-cache clean-cache-projects
.PHONY: cache clean.cache
CACHED_FILES ?= $(VERSION_FILE) $(wildcard $(TOPDIR)/make/project.conf)
CACHED_VARS ?= PROJECT PREREQ_BUILD PREREQ_RUN PREREQ VERSION HEX_VERSION \
FULL_NAME WHICH PYTHON ECHO TEST BROWSER SED RM PWD ID CUT TR \
AWK GETENT XARGS FIND PRINTF PLATFORM_INFO OS_NAME_VERSION \
CAT BIN_INSTALL SUDO \
JW_PKG_LD_LIBRARY_PATH JW_PKG_EXE_PATH JW_PKG_PYTHON_PATH
CACHE_PROJECT_MK ?= .cache-project.mk
CACHED_VARS_ONLY_PROJECT ?= \
PROJECT \
PREREQ_BUILD \
@ -15,9 +21,13 @@ CACHED_VARS_ONLY_PROJECT ?= \
JW_PKG_LD_LIBRARY_PATH \
JW_PKG_EXE_PATH \
JW_PKG_PYTHON_PATH
# We need this to cache JW_PKG_PYTHON_PATH
include $(JWBDIR)/make/py-path.mk
all: cache
clean: clean-cache
clean-cache:
clean: clean.cache
clean.cache:
rm -f $(CACHE_PROJECT_MK)
cache: $(CACHE_PROJECT_MK)

View file

@ -8,15 +8,6 @@ include $(JWBDIR)/make/ldlibpath.mk
include $(JWBDIR)/make/defs-dirs.mk
include $(JWBDIR)/make/dev-utils.mk
CACHED_FILES ?= $(VERSION_FILE) $(wildcard $(TOPDIR)/make/project.conf)
CACHED_VARS ?= PROJECT PREREQ_BUILD PREREQ_RUN PREREQ VERSION HEX_VERSION \
FULL_NAME WHICH PYTHON ECHO TEST BROWSER SED RM PWD ID CUT TR \
AWK GETENT XARGS FIND PRINTF PLATFORM_INFO OS_NAME_VERSION \
CAT BIN_INSTALL SUDO \
JW_PKG_LD_LIBRARY_PATH JW_PKG_EXE_PATH JW_PKG_PYTHON_PATH
include $(JWBDIR)/make/cache.mk
ifneq ($(CREATE_DEVEL),false)
MKFILES += $(wildcard project.conf)
DEVEL_TARGETS += install_MAKE $(INSTALLED_PKG_MK)

View file

@ -128,7 +128,7 @@ pkg-update: pkgupdate.dist
pkg-upload-local: pkg-upload-local.dist
clean.rpm:
$(RM) -rf $(DIST_DIR) *.dist make/.cache-project.mk
$(RM) -rf $(DIST_DIR) *.dist
pkg-build.dist: $(VERSION_FILE)
$(PKG_SH) build $(PKG_SH_BUILD_OPTS)

View file

@ -3,6 +3,16 @@
ifndef PLATFORM_MK_INCLUDED
PLATFORM_MK_INCLUDED = true
CACHE_PROJECT_MK ?= $(TOPDIR)/.cache-project.mk
CACHE_PROJECTS_MK := $(JWBDIR)/.cache-projects.mk
JW_PKG_NO_CACHE ?= false
ifneq ($(filter clean distclean,$(MAKECMDGOALS)),)
ifeq ($(TOPDIR),.)
JW_PKG_NO_CACHE = true
endif
endif
# "-include" tries search path, we don't want that
define try_include
ifneq ($$(wildcard $(1)),)
@ -10,10 +20,11 @@ define try_include
endif
endef
CACHE_PROJECTS_MK := $(JWBDIR)/cache-projects.mk
ifneq ($(JW_PKG_NO_CACHE),true)
$(eval $(call try_include,$(CACHE_PROJECT_MK)))
$(eval $(call try_include,$(CACHE_PROJECTS_MK)))
endif
$(eval $(call try_include,$(TOPDIR)/make/.cache-project.mk))
$(eval $(call try_include,$(CACHE_PROJECTS_MK)))
$(eval $(call try_include,$(JWBDIR)/make/pre-local.mk))
$(eval $(call try_include,$(TOPDIR)/make/pre-local.mk))
$(eval $(call try_include,pre-local.mk))

View file

@ -73,7 +73,6 @@ endif
ifneq ($(PY_DEFS_MK_INCLUDED),true)
all:
clean: pyc.clean
echo-py:
@echo 'PYTHON = $(PYTHON)'
@ -86,8 +85,6 @@ echo-py:
@echo 'PY_INSTALL_MOD = $(PY_INSTALL_MOD)'
@echo 'PY_INSTALL_SUB_MOD = $(PY_INSTALL_SUB_MOD)'
pyc.clean:
$(RM) -rf $(wildcard *.pyc) __pycache__
libpath: py-libpath
py-libpath:
@echo 'export PYTHONPATH = $(PYTHONPATH)'

View file

@ -5,3 +5,9 @@ ifeq ($(origin JW_PKG_PYTHON_PATH),undefined)
endif
export PYTHONPATH := $(subst $(space),:,$(JW_PKG_PYTHON_PATH))
export MYPYPATH := $(PYTHONPATH)
all:
clean: py-tools.clean
py-tools.clean:
$(RM) -rf $(wildcard *.pyc) __pycache__ .mypy_cache .ruff_cache .pytest_cache

View file

@ -20,6 +20,6 @@ run.sh:
echo -e "#!/bin/bash\n\nexport PYTHONPATH=$(PYTHONPATH)\nset -x\nexec $(PYTHON) $(EXE)" '"$$@"' > $@.tmp
chmod 755 $@.tmp
mv $@.tmp $@
clean-run-sh:
rm -f run.sh
clean: clean-run-sh
clean.py-run:
rm -rf run.sh
clean: clean.py-run

View file

@ -18,6 +18,6 @@ $(PY_CONFTEST):
$(PY_CONFTEST_CMD) > $@.tmp
mv $@.tmp $@
clean: clean.generated
clean.generated:
rm -f $(PY_GENERATED)
clean: clean.py-test
clean.py-test:
rm -rf $(PY_GENERATED) .pytest-cache

View file

@ -8,7 +8,7 @@ MYPY_CONFIG_PATH = $(shell $(JW_PKG_PY) --topdir-format relative pro
MYPY_PATH_DIRECTIVE = mypy_path = "$(MYPY_CONFIG_PATH)"
ifndef PY_CHECK_ROOTS
PY_CHECK_ROOTS += $(wildcard $(TOPDIR)/src $(TOPDIR)/tools)
PY_CHECK_ROOTS = $(wildcard $(TOPDIR)/src $(TOPDIR)/tools)
endif
ifndef PY_CHECK_RUFF
@ -72,9 +72,10 @@ ifneq ($(PY_CHECK_RUFF),)
$(PY_CHECK_RUFF) check --select TC,FA --fix --unsafe-fixes $(PY_CHECK_ROOTS)
endif
clean: clean.topdir
clean.topdir: clean.py-check
clean.py-check:
rm -rf .mypy_cache
rm -rf .mypy_cache .ruff_cache .pytest_cache
pyproject.toml:
$(PYTHON) $(JWB_SCRIPT_DIR)/jw-pkg.py -p $(PROJECTS_DIR) -t $(TOPDIR) --topdir-format unaltered projects create-file --format tmpl \

View file

@ -104,6 +104,7 @@ include $(JWBDIR)/make/rules.mk
include $(JWBDIR)/make/doc-rules.mk
include $(JWBDIR)/make/list-files.mk
include $(JWBDIR)/make/projects+project.mk
include $(JWBDIR)/make/cache.mk
STREAMLINE_PROJECT ?= bash $(JWB_SCRIPT_DIR)/streamline-project.sh
@ -115,7 +116,7 @@ TD_COPY_FILES ?= $(filter-out Makefile,$(notdir $(wildcard $(TD_CO
# -- Internal variables, define JW_PKG_TOPDIR_COPY_PATH if you want to
# add more files appended to the target files
TD_COPY_SRC_PATH = $(subst :,$(space),$(JW_PKG_TOPDIR_COPY_PATH))
TD_GENERATE_FILES += $(TD_COPY_FILES)
TD_GENERATE_FILES += $(TD_COPY_FILES) $(CACHE_PROJECT_MK)
test: all
format: topdir

View file

@ -103,8 +103,7 @@ cat_gitignore()
*.done
*.dist
*.dep.mk
.cache.mk
make/.cache-project.mk
.cache-project.mk
*.o
*.so.*
*.so