defs.mk: Reduce multiple invocations of external commands

Many external commands are called unnecessarily often, because either there's a
GNU Make internal alternative, or because they are invoked from within a
recursively defined variable. This patch adresses that and lessens make
invocation time per directory by factor 3.

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2019-02-27 16:44:02 +00:00
commit cec620c00e

View file

@ -11,7 +11,7 @@ include $(MODDIR)/make/platform.mk
include $(MODDIR)/make/projects.mk
ifeq ($(MAKE_BENCHMARK),true)
SHELL = /bin/bash $(MOD_SCRIPT_DIR)/timed-make-shell.sh
SHELL := /bin/bash $(MOD_SCRIPT_DIR)/timed-make-shell.sh
endif
# ----- pre-local.mk
@ -29,17 +29,31 @@ ifneq ($(wildcard pre-local.mk),)
endif
# ----- executables
SED := $(shell which sed)
WHICH := $(firstword $(wildcard /usr/bin/which) $(shell which which))
SED := $(shell $(WHICH) sed)
CAT := /bin/cat
SHELL ?= /bin/bash
#ifeq ($(SHELL),)
export SHELL := /bin/bash
#endif
BROWSER ?= xdg-open
RM := $(shell which rm)
RM := $(shell $(WHICH) rm)
AR = /usr/bin/ar
PWD := $(shell which pwd)
PWD := $(shell $(WHICH) pwd)
CWD := $(shell $(PWD))
BIN_INSTALL := /usr/bin/install
SUDO ?= /usr/bin/sudo
GET_OS_SH ?= /bin/bash $(MOD_SCRIPT_DIR)/get-os.sh
MY_SHELL := /bin/bash
GET_OS_SH := $(SHELL) $(MOD_SCRIPT_DIR)/get-os.sh
ID := $(shell $(WHICH) id)
CUT := $(shell $(WHICH) cut)
TR := $(shell $(WHICH) tr)
AWK := $(shell $(WHICH) awk)
GETENT := $(shell $(WHICH) getent)
XARGS := $(shell $(WHICH) xargs)
FIND := $(shell $(WHICH) find)
# ----- custom functions
reverse = $(if $(wordlist 2,2,$(1)),$(call reverse,$(wordlist 2,$(words $(1)),$(1))) $(firstword $(1)),$(1))
# ----- standard variables
ifneq ($(wildcard $(TOPDIR)/.git),)
@ -56,7 +70,9 @@ endif
# ----- host and target variables
OS_TUPLE ?= $(shell $(GET_OS_SH) tuple)
ifeq ($(OS_TUPLE),)
OS_TUPLE := $(shell $(GET_OS_SH) tuple)
endif
ifneq ($(TARGET_TUPLE),)
TARGET_TUPLE_WORDS ?= $(subst -, ,$(TARGET_TUPLE))
@ -82,9 +98,9 @@ else
TARGET_TRIPLET ?= $(TARGET_ARCH)-$(TARGET_OS)-$(TARGET_ABI)
endif
ifeq ($(TARGET_TUPLE),)
$(error TARGET_TUPLE is undefined)
endif
#ifeq ($(TARGET_TUPLE),)
# $(error TARGET_TUPLE is undefined)
#endif
# - support legacy jw-build target variables
ifeq ($(TARGET_ABI),mingw32)
@ -95,8 +111,13 @@ else
TARGET ?= $(TARGET_OS)
endif
OS_NAME_VERSION ?= $(shell $(GET_OS_SH))
OS_NAME ?= $(shell $(GET_OS_SH) name)
ifeq ($(OS_NAME_VERSION),)
OS_NAME_VERSION := $(shell $(GET_OS_SH))
endif
ifeq ($(OS_NAME),)
OS_NAME := $(shell $(GET_OS_SH) name)
endif
ARCH ?= $(TARGET_ARCH)
ARCH_32 = i586
@ -149,7 +170,7 @@ endif
ifeq ($(PKG_FORMAT),debian)
RPM ?= /bin/bash $(MOD_SCRIPT_DIR)/dpm.sh
RPM_ARCH ?= $(shell dpkg --print-architecture)
RPM_ARCH := $(shell dpkg --print-architecture)
RPM_SUFFIX ?= deb
else
RPM ?= /bin/rpm
@ -163,7 +184,7 @@ endif
PROJECT_DESCR_FILE ?= $(wildcard $(TOPDIR)/make/project.conf)
PROJECT_SHORT_NAME ?= $(PROJECT)
PROJECT_CAPNAME = $(shell echo $(PROJECT) | tr [a-z] [A-Z] | $(SED) 's/-/_/g')
PROJECT_CAPNAME := $(shell echo $(PROJECT) | tr [a-z] [A-Z] | $(SED) 's/-/_/g')
PROJECT_DESCR ?= $(call proj_query, summary $(PROJECT))
PROJECT_SUMMARY ?= $(PROJECT_DESCR)
CUSTOMER ?= jannet
@ -174,25 +195,28 @@ CREATE_DEVEL = false
endif
endif
ifneq ($(wildcard $(VERSION_FILE)),)
VERSION ?= $(shell $(CAT) $(VERSION_FILE))
ifeq ($(VERSION),)
ifneq ($(wildcard $(VERSION_FILE)),)
VERSION := $(shell $(CAT) $(VERSION_FILE))
endif
endif
DIST_VERSION ?= $(patsubst %-dev,%,$(VERSION))
HEX_VERSION = $(shell echo $(DIST_VERSION) | \
$(SED) 's/-dev//; s/pre[^\.]*//; s/F[^\.]//; s/[\.-]/ /g' | xargs printf "0x%02x%02x%02x%02x")
BINARY_VERSION = $(shell echo $(PROJECT)_$(DIST_VERSION) | tr [a-z] [A-Z] | $(SED) 's/-[^-]*$$//; s/-/_/g')
WINVERSION = $(shell echo $(VERSION) | $(SED) -e "s/\./_/g")
LOCAL_VERSION = $(shell echo $(VERSION))
LOCAL_WINVERSION = $(shell echo $(VERSION) | $(SED) -e "s/\./_/g")
DIST_VERSION = $(shell echo $(VERSION) | $(SED) -e "s/-dev//")
DIST_WINVERSION = $(shell echo $(WINVERSION) | $(SED) -e "s/-dev//")
LOCAL_DIST_VERSION = $(shell echo $(LOCAL_VERSION) | $(SED) -e "s/-dev//")
LOCAL_DIST_WINVERSION = $(shell echo $(LOCAL_WINVERSION) | $(SED) -e "s/-dev//")
MAJOR_MINOR_RELEASE = $(shell echo $(DIST_VERSION) | cut -d- -f1)
MAJOR_VERSION = $(shell echo $(MAJOR_MINOR_RELEASE) | cut -d. -f1)
MINOR_VERSION = $(shell echo $(MAJOR_MINOR_RELEASE) | cut -d. -f2)
RELEASE_VERSION = $(shell echo $(MAJOR_MINOR_RELEASE) | cut -d. -f3)
BUILD_NUMBER = $(shell echo $(DIST_VERSION) | cut -d- -f2)
HEX_VERSION := $(shell echo $(DIST_VERSION) | \
$(SED) 's/-dev//; s/pre[^\.]*//; s/F[^\.]//; s/[\.-]/ /g' | $(XARGS) printf "0x%02x%02x%02x%02x")
BINARY_VERSION := $(shell echo $(PROJECT)_$(DIST_VERSION) | tr [a-z] [A-Z] | $(SED) 's/-[^-]*$$//; s/-/_/g')
WINVERSION = $(subst .,_,$(VERSION))
LOCAL_VERSION = $(VERSION)
LOCAL_WINVERSION = $(subst .,_,$(VERSION))
DIST_VERSION = $(patsubst %-dev,%,$(VERSION))
DIST_WINVERSION = $(patsubst %-dev,%,$(WINVERSION))
LOCAL_DIST_VERSION = $(patsubst %-dev,%,$(LOCAL_VERSION))
LOCAL_DIST_WINVERSION = $(patsubst %-dev,%,$(LOCAL_WINVERSION))
DIST_VERSION_WORDS = $(subst ., ,$(subst -, ,$(DIST_VERSION)))
MAJOR_VERSION = $(word 1,$(DIST_VERSION_WORDS))
MINOR_VERSION = $(word 2,$(DIST_VERSION_WORDS))
RELEASE_VERSION = $(word 2,$(DIST_VERSION_WORDS))
BUILD_NUMBER = $(word 4,$(DIST_VERSION_WORDS))
MAJOR_MINOR_RELEASE = $(MAJOR_VERSION).$(MINOR_VERSION).$(RELEASE_VERSION)
CVS_RSH ?= /usr/bin/ssh
# ----- input dirs
@ -205,7 +229,7 @@ ifeq ($(VCS),cvs)
CVS_ROOT_DIR = $(patsubst %/$(CVS_MODULE),%,$(CWD))
endif
REV_SUBDIRS = $(shell echo $(SUBDIRS) | awk '{for (i=NF; i>=1; i--) printf ("%s ",$$i)}')
REV_SUBDIRS = $(call reverse $(SUBDIRS))
FRESH_CVSDIR = $(HOME)/local/src/cvs.fresh
IMAGE_DIR ?= $(CVS_ROOT_DIR)/images
PCKG_DEPS_DIR = $(MODDIR)/make/deps.d
@ -240,7 +264,7 @@ JANWARE_URL_DOC_MODULE ?= https://janware.com/wiki/$(JANWARE_WIKI)/assets/type
JANWARE_URL_DOC_PROJECT ?= https://janware.com/wiki/$(JANWARE_WIKI)/assets/types/data/sw/$(PROJECT)/$(PROJECT)
PKG_VENDOR ?= janware GmbH
FULL_NAME ?= $(shell id -nu | xargs getent passwd | cut -d: -f5)
FULL_NAME := $(shell $(ID) -nu | $(XARGS) $(GETENT) passwd | $(CUT) -d: -f5)
USE_PROJECT_LIB ?= true
EXPORT_PROJECT_LIB ?= $(USE_PROJECT_LIB)
USE_JW_BUILD ?= true
@ -291,13 +315,8 @@ BUILD_CFLAGS += -DCATCH_ONLY_YERROR
BUILD_CPPFLAGS += -DCATCH_ONLY_YERROR
endif
ifneq ($(shell echo $(OS_NAME_VERSION) | cut -d: -f1),suse-9)
SYSCFG_DIR ?= /etc
SYSCFG_FILE ?= /etc/rc.config
else
SYSCFG_DIR ?= /etc/sysconfig
SYSCFG_FILE ?= $(SYSCFG_DIR)/$(PROJECT)
endif
OPTS_PID_FILE ?= $(PIDDIR)/$(PROJECT).pid
USE_VERSION_MACROS ?= true
@ -340,8 +359,8 @@ else
endif
# makefile helpers
FIND_SUBDIRS = $(filter-out . .. nomake CVS $(IGNORE_SUBDIRS),\
$(patsubst ./%,%,$(patsubst %/,%,$(dir $(shell find . -maxdepth 2 -mindepth 2 -a \( -iname Makefile -o -iname GNUmakefile \))))))
FIND_SUBDIRS := $(filter-out . .. nomake CVS $(IGNORE_SUBDIRS),\
$(patsubst ./%,%,$(patsubst %/,%,$(dir $(shell $(FIND) . -maxdepth 2 -mindepth 2 -a \( -iname Makefile -o -iname GNUmakefile \))))))
SUBDIRS_TO_ITERATE = $(filter-out $(IGNORE_SUBDIRS),$(SUBDIRS))
# compiler and linker
@ -501,7 +520,7 @@ VERSION_SCRIPT = $(BUILD_LIBDIR)/version.ldscript
LOCAL_LIBS +=
ifneq ($(TARGET),mingw)
LIB_A = $(BUILD_LIBDIR)/lib$(LIBNAME).a
SO_SUFFIX = so.$(shell echo $(VERSION) | cut -d- -f1)
SO_SUFFIX = so.$(MAJOR_MINOR_RELEASE)
SO_PREFIX ?= lib
LIB_SO = $(BUILD_LIBDIR)/lib$(LIBNAME).$(SO_SUFFIX)
LINKS_SO += $(shell echo $(LIB_SO) | $(SED) -e "s/\.so\..*$$/.so/" | grep -v $(LIB_SO))
@ -572,7 +591,9 @@ INSTALLED_CGI += $(addprefix $(INSTALL_CGIDIR)/,$(EXE_CGI))
INSTALLATION_FILE_TYPES += HTML
BUILD_HTMLDIR = $(TOPDIR)/htdocs
LOCAL_HTML += $(filter-out $(DONT_INSTALL),$(wildcard *.html *.css *.php *.js) $(FONTS) $(IMAGES))
HTML_SUBDIR ?= $(shell $(PWD) | $(SED) '/.*\/htdocs\(\/\|$$\)/!d; s%.*/htdocs\(/\|$$\)%%')
ifeq ($(HTML_SUBDIR),)
HTML_SUBDIR := $(shell $(PWD) | $(SED) '/.*\/htdocs\(\/\|$$\)/!d; s%.*/htdocs\(/\|$$\)%%')
endif
ifeq ($(HTML_SUBDIR),)
INSTALL_HTMLDIR ?= $(PROJECT_HTMLDIR)
else
@ -584,7 +605,9 @@ INSTALLED_HTML += $(addprefix $(INSTALL_HTMLDIR)/,$(LOCAL_HTML))
INSTALLATION_FILE_TYPES += TMPL
BUILD_TMPLDIR = $(TOPDIR)/tmpl
LOCAL_TMPL += $(filter-out $(DONT_INSTALL),$(wildcard *.tmpl))
TMPL_SUBDIR ?= $(shell $(PWD) | $(SED) '/.*\/tmpl\(\/\|$$\)/!d; s%.*/tmpl\(/\|$$\)%%')
ifndef TMPL_SUBDIR
TMPL_SUBDIR := $(shell $(PWD) | $(SED) '/.*\/tmpl\(\/\|$$\)/!d; s%.*/tmpl\(/\|$$\)%%')
endif
ifeq ($(TMPL_SUBDIR),)
INSTALL_TMPLDIR = $(PROJECT_TMPLDIR)
else