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:
|
clean-cache-projects:
|
||||||
rm -f $(CACHE_PROJECTS_MK)
|
rm -f $(CACHE_PROJECTS_MK)
|
||||||
$(CACHE_PROJECTS_MK): $(CACHE_PROJECT_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 $@
|
mv $@.tmp $@
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,8 @@
|
||||||
CACHE_PROJECT_MK ?= .cache-project.mk
|
CACHE_PROJECT_MK ?= .cache-project.mk
|
||||||
CACHED_VARS_ONLY_PROJECT ?= \
|
CACHED_VARS_ONLY_PROJECT ?= \
|
||||||
PROJECT \
|
PROJECT \
|
||||||
|
PREREQ_BUILD \
|
||||||
|
PREREQ_RUN \
|
||||||
PREREQ \
|
PREREQ \
|
||||||
VERSION \
|
VERSION \
|
||||||
HEX_VERSION \
|
HEX_VERSION \
|
||||||
|
|
@ -20,11 +22,13 @@ clean-cache:
|
||||||
|
|
||||||
cache: $(CACHE_PROJECT_MK)
|
cache: $(CACHE_PROJECT_MK)
|
||||||
$(CACHE_PROJECT_MK): $(CACHED_FILES) $(JWBDIR)/make/cache.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) | \
|
@echo $(foreach v,$(CACHED_VARS),$v = $(value $(v)) EOL) | \
|
||||||
$(SED) 's/\s\+EOL/\n/g;' | \
|
$(SED) 's/\s\+EOL/\n/g;' | \
|
||||||
$(SED) 's/\s*\(\S\+\)\s*=\s*\(.*\)\s*/ifndef \1\n \1 = \2\nendif\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 $(TOPDIR))|$$(TOPDIR)|g' | \
|
||||||
$(SED) 's|$(realpath $(PROJECTS_DIR))|$$(PROJECTS_DIR)|g' | \
|
$(SED) 's|$(realpath $(PROJECTS_DIR))|$$(PROJECTS_DIR)|g' | \
|
||||||
$(GREP) . | \
|
$(GREP) . | \
|
||||||
tee $@.tmp
|
tee -a $@.tmp
|
||||||
|
@echo 'endif # ifneq ($$(JW_PKG_NO_CACHE),true)' | tee -a $@.tmp
|
||||||
mv $@.tmp $@
|
mv $@.tmp $@
|
||||||
|
|
|
||||||
12
make/defs.mk
12
make/defs.mk
|
|
@ -503,6 +503,18 @@ endif
|
||||||
INSTALL_FILE ?= $(INSTALL)
|
INSTALL_FILE ?= $(INSTALL)
|
||||||
INSTALL_DIR ?= $(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
|
# ----- local.mk
|
||||||
|
|
||||||
$(eval $(call try_include,$(JWBDIR)/make/local.mk))
|
$(eval $(call try_include,$(JWBDIR)/make/local.mk))
|
||||||
|
|
|
||||||
|
|
@ -3,18 +3,18 @@
|
||||||
# -- LD_LIBRARY_PATH
|
# -- LD_LIBRARY_PATH
|
||||||
LD_LIBRARY_PATH_ENV = $(shell echo $(FINAL_LDFLAGS) | $(SED) 's/^-[^L] *[^ ]*/ /g; s/[ ]-[^L] *[^ ]*/ /g; s/-L[ ]*\([^ ]*\)[ ]*/\1:/g')
|
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)
|
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
|
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)
|
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
|
endif
|
||||||
|
|
||||||
# -- PATH
|
# -- PATH
|
||||||
EXE_SEARCH_PATH_ENV := $(PATH)
|
EXE_SEARCH_PATH_ENV := $(PATH)
|
||||||
ifeq ($(origin JW_PKG_EXE_PATH),undefined)
|
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
|
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
|
include $(JWBDIR)/make/py-path.mk
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ include $(JWBDIR)/make/defs-dirs.mk
|
||||||
include $(JWBDIR)/make/dev-utils.mk
|
include $(JWBDIR)/make/dev-utils.mk
|
||||||
|
|
||||||
CACHED_FILES ?= $(VERSION_FILE) $(wildcard $(TOPDIR)/make/project.conf)
|
CACHED_FILES ?= $(VERSION_FILE) $(wildcard $(TOPDIR)/make/project.conf)
|
||||||
CACHED_VARS ?= PROJECT PREREQ VERSION HEX_VERSION FULL_NAME \
|
CACHED_VARS ?= PROJECT PREREQ_BUILD PREREQ_RUN PREREQ VERSION HEX_VERSION \
|
||||||
WHICH PYTHON ECHO TEST BROWSER SED RM PWD ID CUT TR \
|
FULL_NAME WHICH PYTHON ECHO TEST BROWSER SED RM PWD ID CUT TR \
|
||||||
AWK GETENT XARGS FIND PRINTF PLATFORM_INFO OS_NAME_VERSION \
|
AWK GETENT XARGS FIND PRINTF PLATFORM_INFO OS_NAME_VERSION \
|
||||||
CAT BIN_INSTALL SUDO \
|
CAT BIN_INSTALL SUDO \
|
||||||
JW_PKG_LD_LIBRARY_PATH JW_PKG_EXE_PATH JW_PKG_PYTHON_PATH
|
JW_PKG_LD_LIBRARY_PATH JW_PKG_EXE_PATH JW_PKG_PYTHON_PATH
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
# -- PYTHONPATH
|
# -- PYTHONPATH
|
||||||
PYTHONPATH_ENV := $(PYTHONPATH)
|
PYTHONPATH_ENV := $(PYTHONPATH)
|
||||||
|
JW_PKG_PYTHON_PATH_PREREQ += $(PROJECT)
|
||||||
ifeq ($(origin JW_PKG_PYTHON_PATH),undefined)
|
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
|
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)
|
REMOTE_GIT_URL = ssh://$(JANWARE_USER_PREFIX)devgit.janware.com$(REMOTE_GIT_DIR)
|
||||||
|
|
||||||
ifneq ($(DONT_CHECK_PREREQ_DONE),true)
|
ifneq ($(DONT_CHECK_PREREQ_DONE),true)
|
||||||
ifndef PREREQ
|
ifndef PREREQ_DIRS_BUILD
|
||||||
PREREQ := $(call proj_query,pkg-requires --no-subpackages --subsections=jw --syntax names-only --delimiter=' ' build $(PROJECT))
|
PREREQ_DIRS_BUILD := $(call proj_query,proj-dir $(PREREQ_BUILD))
|
||||||
endif
|
endif
|
||||||
ifndef PREREQ_DIRS
|
PREREQ_DIRS_BUILD_DONE := $(addsuffix /dirs-all.done,$(filter-out $(TOPDIR) /opt/%,$(PREREQ_DIRS_BUILD)))
|
||||||
PREREQ_DIRS := $(call proj_query,proj-dir $(PREREQ))
|
|
||||||
endif
|
|
||||||
PREREQ_DIRS_DONE := $(addsuffix /dirs-all.done,$(filter-out $(TOPDIR) /opt/%,$(PREREQ_DIRS)))
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(SUBDIRS_TO_ITERATE),)
|
ifneq ($(SUBDIRS_TO_ITERATE),)
|
||||||
|
|
||||||
ifeq ($(MAKECMDGOALS),)
|
ifeq ($(MAKECMDGOALS),)
|
||||||
SUBDIR_TARGETS = all
|
SUBDIR_TARGETS = all
|
||||||
else
|
else
|
||||||
SUBDIR_TARGETS = $(filter $(ALLOWED_SUBDIR_TARGETS),$(MAKECMDGOALS))
|
SUBDIR_TARGETS = $(filter $(ALLOWED_SUBDIR_TARGETS),$(MAKECMDGOALS))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
all: topdir config
|
all: topdir config
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from .Cmd import Cmd, Parent
|
from .Cmd import Cmd, Parent
|
||||||
|
|
@ -11,23 +13,27 @@ if TYPE_CHECKING:
|
||||||
|
|
||||||
class BaseCmdPkgRelations(Cmd):
|
class BaseCmdPkgRelations(Cmd):
|
||||||
|
|
||||||
|
arg_sep = r'[,\s|]'
|
||||||
|
|
||||||
def pkg_relations(self, rel_type: str, args: Namespace) -> str:
|
def pkg_relations(self, rel_type: str, args: Namespace) -> str:
|
||||||
|
|
||||||
return args.delimiter.join(
|
return args.delimiter.join(
|
||||||
pkg_relations_list(
|
pkg_relations_list(
|
||||||
self.app,
|
self.app,
|
||||||
rel_type = rel_type,
|
rel_type = rel_type,
|
||||||
flavours = args.flavours.split(','),
|
flavours = re.split(self.arg_sep, args.flavours),
|
||||||
seed_pkgs = args.modules,
|
seed_pkgs = args.modules,
|
||||||
subsections = None
|
subsections = (
|
||||||
if args.subsections is None else args.subsections.split(','),
|
None if args.subsections is None else
|
||||||
|
re.split(self.arg_sep, args.subsections)
|
||||||
|
),
|
||||||
no_subpackages = args.no_subpackages,
|
no_subpackages = args.no_subpackages,
|
||||||
dont_strip_revision = args.dont_strip_revision,
|
dont_strip_revision = args.dont_strip_revision,
|
||||||
expand_semver_revision_range = args.expand_semver_revision_range,
|
expand_semver_revision_range = args.expand_semver_revision_range,
|
||||||
syntax = VersionSyntax[args.syntax.replace('-', '_')],
|
syntax = VersionSyntax[args.syntax.replace('-', '_')],
|
||||||
recursive = args.recursive,
|
recursive = args.recursive,
|
||||||
dont_expand_version_macros = args.dont_expand_version_macros,
|
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,
|
quote = args.quote,
|
||||||
skip_excluded = args.skip_excluded,
|
skip_excluded = args.skip_excluded,
|
||||||
hide_self = args.hide_self,
|
hide_self = args.hide_self,
|
||||||
|
|
@ -49,7 +55,7 @@ class BaseCmdPkgRelations(Cmd):
|
||||||
'--subsections',
|
'--subsections',
|
||||||
nargs = '?',
|
nargs = '?',
|
||||||
default = None,
|
default = None,
|
||||||
help = 'Subsections to consider, comma-separated',
|
help = 'Subsections to consider, separated by comma or whitespace',
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-d',
|
'-d',
|
||||||
|
|
@ -59,7 +65,9 @@ class BaseCmdPkgRelations(Cmd):
|
||||||
help = 'Output words delimiter'
|
help = 'Output words delimiter'
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
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('modules', nargs = '*', help = 'Modules')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,13 @@ class CmdExepath(Cmd): # export
|
||||||
|
|
||||||
def add_arguments(self, parser: ArgumentParser) -> None:
|
def add_arguments(self, parser: ArgumentParser) -> None:
|
||||||
super().add_arguments(parser)
|
super().add_arguments(parser)
|
||||||
|
parser.add_argument(
|
||||||
|
'-d',
|
||||||
|
'--delimiter',
|
||||||
|
nargs = '?',
|
||||||
|
default = ':',
|
||||||
|
help = 'Output words delimiter'
|
||||||
|
)
|
||||||
parser.add_argument('module', nargs = '*', help = 'Modules')
|
parser.add_argument('module', nargs = '*', help = 'Modules')
|
||||||
|
|
||||||
async def _run(self, args: Namespace) -> None:
|
async def _run(self, args: Namespace) -> None:
|
||||||
|
|
@ -30,4 +37,4 @@ class CmdExepath(Cmd): # export
|
||||||
path = self.app.find_dir(m, ['/bin'])
|
path = self.app.find_dir(m, ['/bin'])
|
||||||
if path is not None:
|
if path is not None:
|
||||||
out.append(path)
|
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:
|
def add_arguments(self, parser: ArgumentParser) -> None:
|
||||||
super().add_arguments(parser)
|
super().add_arguments(parser)
|
||||||
|
parser.add_argument(
|
||||||
|
'-d',
|
||||||
|
'--delimiter',
|
||||||
|
nargs = '?',
|
||||||
|
default = ':',
|
||||||
|
help = 'Output words delimiter'
|
||||||
|
)
|
||||||
parser.add_argument('module', nargs = '*', help = 'Modules')
|
parser.add_argument('module', nargs = '*', help = 'Modules')
|
||||||
|
|
||||||
async def _run(self, args: Namespace) -> None:
|
async def _run(self, args: Namespace) -> None:
|
||||||
|
|
@ -30,4 +37,4 @@ class CmdLdlibpath(Cmd): # export
|
||||||
path = self.app.find_dir(m, ['/lib'])
|
path = self.app.find_dir(m, ['/lib'])
|
||||||
if path is not None:
|
if path is not None:
|
||||||
out.append(path)
|
out.append(path)
|
||||||
print(':'.join(out))
|
print(args.delimiter.join(out))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue