Improve Makefile variable caching: PREREQ, JW_PKG_NO_CACHE, subsections #28

Merged
Jan Lindemann merged 6 commits from jan/feature/20260617-py-path-ldlibpath-mk-space-separate-jw-pkg-xxx-path into master 2026-06-17 20:46:13 +02:00 AGit
10 changed files with 61 additions and 27 deletions

View file

@ -27,5 +27,5 @@ cache-projects: $(CACHE_PROJECTS_MK)
clean-cache-projects:
rm -f $(CACHE_PROJECTS_MK)
$(CACHE_PROJECTS_MK): $(CACHE_PROJECT_MK)
sed '/\($(subst $(space),\|,$(CACHED_VARS_ONLY_PROJECT))\)\s*[:?]\?=/ d' $< > $@.tmp
sed -E '/^[[:blank:]]*ifndef[[:blank:]]+($(subst $(space),|,$(CACHED_VARS_ONLY_PROJECT)))[[:blank:]]*$$/,/^[[:blank:]]*endif[[:blank:]]*$$/d' $< > $@.tmp
mv $@.tmp $@

View file

@ -6,6 +6,8 @@
CACHE_PROJECT_MK ?= .cache-project.mk
CACHED_VARS_ONLY_PROJECT ?= \
PROJECT \
PREREQ_BUILD \
PREREQ_RUN \
PREREQ \
VERSION \
HEX_VERSION \
@ -20,11 +22,13 @@ clean-cache:
cache: $(CACHE_PROJECT_MK)
$(CACHE_PROJECT_MK): $(CACHED_FILES) $(JWBDIR)/make/cache.mk
@echo 'ifneq ($$(JW_PKG_NO_CACHE),true)' | tee $@.tmp
@echo $(foreach v,$(CACHED_VARS),$v = $(value $(v)) EOL) | \
$(SED) 's/\s\+EOL/\n/g;' | \
$(SED) 's/\s*\(\S\+\)\s*=\s*\(.*\)\s*/ifndef \1\n \1 = \2\nendif\n/g;' | \
$(SED) 's|$(realpath $(TOPDIR))|$$(TOPDIR)|g' | \
$(SED) 's|$(realpath $(PROJECTS_DIR))|$$(PROJECTS_DIR)|g' | \
$(GREP) . | \
tee $@.tmp
tee -a $@.tmp
@echo 'endif # ifneq ($$(JW_PKG_NO_CACHE),true)' | tee -a $@.tmp
mv $@.tmp $@

View file

@ -503,6 +503,18 @@ endif
INSTALL_FILE ?= $(INSTALL)
INSTALL_DIR ?= $(INSTALL)
ifeq ($(origin PREREQ_BUILD),undefined)
PREREQ_BUILD := $(call proj_query, pkg-requires --no-subpackages --subsections=jw --syntax names-only --delimiter ' ' 'build devel' $(PROJECT))
endif
ifeq ($(origin PREREQ_RUN),undefined)
PREREQ_RUN := $(call proj_query, pkg-requires --no-subpackages --subsections=jw --syntax names-only --delimiter ' ' 'run' $(PROJECT))
endif
ifeq ($(origin PREREQ),undefined)
PREREQ := $(sort $(PREREQ_BUILD) $(PREREQ_RUN))
endif
# ----- local.mk
$(eval $(call try_include,$(JWBDIR)/make/local.mk))

View file

@ -3,18 +3,18 @@
# -- LD_LIBRARY_PATH
LD_LIBRARY_PATH_ENV = $(shell echo $(FINAL_LDFLAGS) | $(SED) 's/^-[^L] *[^ ]*/ /g; s/[ ]-[^L] *[^ ]*/ /g; s/-L[ ]*\([^ ]*\)[ ]*/\1:/g')
ifeq ($(origin JW_PKG_LD_LIBRARY_PATH),undefined)
JW_PKG_LD_LIBRARY_PATH := $(call proj_query, ldlibpath $(PROJECT) $(PREREQ_BUILD))
JW_PKG_LD_LIBRARY_PATH := $(call proj_query, ldlibpath --delimiter ' ' $(PROJECT) $(PREREQ_RUN))
endif
export LD_LIBRARY_PATH := $(JW_PKG_LD_LIBRARY_PATH)
export LD_LIBRARY_PATH := $(subst $(space),:,$(JW_PKG_LD_LIBRARY_PATH)):$(LD_LIBRARY_PATH_ENV)
ifeq ($(TARGET),mingw)
DLL_PATH = $(shell echo $(LD_LIBRARY_PATH) | $(SED) 's/:/;/g');$(CROSS_TOOL_DIR)/bin
DLL_PATH = $(subst :,;,$(LD_LIBRARY_PATH));$(CROSS_TOOL_DIR)/bin
endif
# -- PATH
EXE_SEARCH_PATH_ENV := $(PATH)
ifeq ($(origin JW_PKG_EXE_PATH),undefined)
JW_PKG_EXE_PATH := $(call proj_query, exepath $(PROJECT) $(PREREQ_BUILD)):$(EXE_SEARCH_PATH_ENV)
JW_PKG_EXE_PATH := $(call proj_query, exepath --delimiter ' ' $(PROJECT) $(PREREQ_RUN))
endif
export PATH := $(JW_PKG_EXE_PATH)
export PATH := $(subst $(space),:,$(JW_PKG_EXE_PATH)):$(EXE_SEARCH_PATH_ENV)
include $(JWBDIR)/make/py-path.mk

View file

@ -9,8 +9,8 @@ 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 VERSION HEX_VERSION FULL_NAME \
WHICH PYTHON ECHO TEST BROWSER SED RM PWD ID CUT TR \
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

View file

@ -1,6 +1,7 @@
# -- PYTHONPATH
PYTHONPATH_ENV := $(PYTHONPATH)
JW_PKG_PYTHON_PATH_PREREQ += $(PROJECT)
ifeq ($(origin JW_PKG_PYTHON_PATH),undefined)
JW_PKG_PYTHON_PATH := $(call proj_query, pythonpath $(PROJECT))
JW_PKG_PYTHON_PATH := $(shell $(JW_PKG_PY) --topdir-format absolute projects pythonpath --delimiter ' ' $(PROJECT) $(PREREQ_RUN))
endif
export PYTHONPATH := $(JW_PKG_PYTHON_PATH)
export PYTHONPATH := $(subst $(space),:,$(JW_PKG_PYTHON_PATH))

View file

@ -80,23 +80,18 @@ REMOTE_GIT_DIR = /$(JANWARE_USER)/$(REMOTE_GIT_FLAVOUR)/$(PROJECT)
REMOTE_GIT_URL = ssh://$(JANWARE_USER_PREFIX)devgit.janware.com$(REMOTE_GIT_DIR)
ifneq ($(DONT_CHECK_PREREQ_DONE),true)
ifndef PREREQ
PREREQ := $(call proj_query,pkg-requires --no-subpackages --subsections=jw --syntax names-only --delimiter=' ' build $(PROJECT))
ifndef PREREQ_DIRS_BUILD
PREREQ_DIRS_BUILD := $(call proj_query,proj-dir $(PREREQ_BUILD))
endif
ifndef PREREQ_DIRS
PREREQ_DIRS := $(call proj_query,proj-dir $(PREREQ))
endif
PREREQ_DIRS_DONE := $(addsuffix /dirs-all.done,$(filter-out $(TOPDIR) /opt/%,$(PREREQ_DIRS)))
PREREQ_DIRS_BUILD_DONE := $(addsuffix /dirs-all.done,$(filter-out $(TOPDIR) /opt/%,$(PREREQ_DIRS_BUILD)))
endif
ifneq ($(SUBDIRS_TO_ITERATE),)
ifeq ($(MAKECMDGOALS),)
SUBDIR_TARGETS = all
else
SUBDIR_TARGETS = $(filter $(ALLOWED_SUBDIR_TARGETS),$(MAKECMDGOALS))
endif
endif
all: topdir config

View file

@ -1,5 +1,7 @@
from __future__ import annotations
import re
from typing import TYPE_CHECKING
from .Cmd import Cmd, Parent
@ -11,23 +13,27 @@ if TYPE_CHECKING:
class BaseCmdPkgRelations(Cmd):
arg_sep = r'[,\s|]'
def pkg_relations(self, rel_type: str, args: Namespace) -> str:
return args.delimiter.join(
pkg_relations_list(
self.app,
rel_type = rel_type,
flavours = args.flavours.split(','),
flavours = re.split(self.arg_sep, args.flavours),
seed_pkgs = args.modules,
subsections = None
if args.subsections is None else args.subsections.split(','),
subsections = (
None if args.subsections is None else
re.split(self.arg_sep, args.subsections)
),
no_subpackages = args.no_subpackages,
dont_strip_revision = args.dont_strip_revision,
expand_semver_revision_range = args.expand_semver_revision_range,
syntax = VersionSyntax[args.syntax.replace('-', '_')],
recursive = args.recursive,
dont_expand_version_macros = args.dont_expand_version_macros,
ignore = set(args.ignore.split(',')),
ignore = set(re.split(self.arg_sep, args.ignore)),
quote = args.quote,
skip_excluded = args.skip_excluded,
hide_self = args.hide_self,
@ -49,7 +55,7 @@ class BaseCmdPkgRelations(Cmd):
'--subsections',
nargs = '?',
default = None,
help = 'Subsections to consider, comma-separated',
help = 'Subsections to consider, separated by comma or whitespace',
)
parser.add_argument(
'-d',
@ -59,7 +65,9 @@ class BaseCmdPkgRelations(Cmd):
help = 'Output words delimiter'
)
parser.add_argument(
'flavours', help = 'Dependency flavours (run, build, devel, release)'
'flavours',
help = 'Dependency flavours (run, build, devel, release), '
'separated by comma or whitespace'
)
parser.add_argument('modules', nargs = '*', help = 'Modules')
parser.add_argument(

View file

@ -14,6 +14,13 @@ class CmdExepath(Cmd): # export
def add_arguments(self, parser: ArgumentParser) -> None:
super().add_arguments(parser)
parser.add_argument(
'-d',
'--delimiter',
nargs = '?',
default = ':',
help = 'Output words delimiter'
)
parser.add_argument('module', nargs = '*', help = 'Modules')
async def _run(self, args: Namespace) -> None:
@ -30,4 +37,4 @@ class CmdExepath(Cmd): # export
path = self.app.find_dir(m, ['/bin'])
if path is not None:
out.append(path)
print(':'.join(out))
print(args.delimiter.join(out))

View file

@ -14,6 +14,13 @@ class CmdLdlibpath(Cmd): # export
def add_arguments(self, parser: ArgumentParser) -> None:
super().add_arguments(parser)
parser.add_argument(
'-d',
'--delimiter',
nargs = '?',
default = ':',
help = 'Output words delimiter'
)
parser.add_argument('module', nargs = '*', help = 'Modules')
async def _run(self, args: Namespace) -> None:
@ -30,4 +37,4 @@ class CmdLdlibpath(Cmd): # export
path = self.app.find_dir(m, ['/lib'])
if path is not None:
out.append(path)
print(':'.join(out))
print(args.delimiter.join(out))