From cec620c00e80cd110d99de9e62914ac1ab6fee90 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Wed, 27 Feb 2019 16:44:02 +0000 Subject: [PATCH] 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 --- make/defs.mk | 109 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 43 deletions(-) diff --git a/make/defs.mk b/make/defs.mk index 55bb9494..515cf61e 100644 --- a/make/defs.mk +++ b/make/defs.mk @@ -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