Improve Makefile variable caching: PREREQ, JW_PKG_NO_CACHE, subsections #28
10 changed files with 61 additions and 27 deletions
|
|
@ -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 $@
|
||||
|
|
|
|||
|
|
@ -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 $@
|
||||
|
|
|
|||
12
make/defs.mk
12
make/defs.mk
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue