Message ID | 20201222094648.32579-1-ynezz@true.cz |
---|---|
State | Accepted |
Delegated to: | Petr Štetiar |
Headers | show |
Series | build: replace which with Bash command built-in | expand |
On Tue, Dec 22, 2020 at 1:50 AM Petr Štetiar <ynezz@true.cz> wrote: > > `which` utility is not shipped by default for example on recent Arch > Linux and then any steps relying on its presence fails, like for example > following Python3 prereq build check: Funny. I have a different error on my barebones Manjaro VM: which: no pkg-config in (/home/mangix/.local/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl) But yes, getting rid of which is good. > > $ python3 --version > Python 3.9.1 > > $ make > /bin/sh: line 1: which: command not found > /bin/sh: line 1: which: command not found > /bin/sh: line 1: which: command not found > ... > Checking 'python3'... failed. > ... > > Fix this by switching to Bash builtin `command` which should provide > same functionality. > > Fixes: FS#3525 > Signed-off-by: Petr Štetiar <ynezz@true.cz> > --- > > Other option is to check for `which` util presence in prereq-build and adding > `which` to the list of required host build utils. > > Makefile | 3 ++- > include/cmake.mk | 2 +- > include/prereq.mk | 4 ++-- > 3 files changed, 5 insertions(+), 4 deletions(-) > > diff --git a/Makefile b/Makefile > index 24f5955c9066..f4519e00d28d 100644 > --- a/Makefile > +++ b/Makefile > @@ -18,7 +18,8 @@ $(if $(findstring $(space),$(TOPDIR)),$(error ERROR: The path to the OpenWrt dir > > world: > > -DISTRO_PKG_CONFIG:=$(shell which -a pkg-config | grep -E '\/usr' | head -n 1) > +WHICH:=command -pv > +DISTRO_PKG_CONFIG:=$(shell $(WHICH) pkg-config | grep -E '\/usr' | head -n 1) > export PATH:=$(TOPDIR)/staging_dir/host/bin:$(PATH) > > ifneq ($(OPENWRT_BUILD),1) > diff --git a/include/cmake.mk b/include/cmake.mk > index 0a20530a16fe..ff00b5e779b5 100644 > --- a/include/cmake.mk > +++ b/include/cmake.mk > @@ -15,7 +15,7 @@ MAKE_PATH = $(firstword $(CMAKE_BINARY_SUBDIR) .) > ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) > cmake_tool=$(TOOLCHAIN_DIR)/bin/$(1) > else > - cmake_tool=$(shell which $(1)) > + cmake_tool=$(shell $(WHICH) $(1)) > endif > > ifeq ($(CONFIG_CCACHE),) > diff --git a/include/prereq.mk b/include/prereq.mk > index 83ac21242c65..a6ee2bb637f5 100644 > --- a/include/prereq.mk > +++ b/include/prereq.mk > @@ -52,7 +52,7 @@ endef > > define RequireCommand > define Require/$(1) > - which $(1) > + $(WHICH) $(1) > endef > > $$(eval $$(call Require,$(1),$(2))) > @@ -106,7 +106,7 @@ define SetupHostCommand > $(call QuoteHostCommand,$(11)) $(call QuoteHostCommand,$(12)); do \ > if [ -n "$$$$$$$$cmd" ]; then \ > bin="$$$$$$$$(PATH="$(subst $(space),:,$(filter-out $(STAGING_DIR_HOST)/%,$(subst :,$(space),$(PATH))))" \ > - which "$$$$$$$${cmd%% *}")"; \ > + $(WHICH) "$$$$$$$${cmd%% *}")"; \ > if [ -x "$$$$$$$$bin" ] && eval "$$$$$$$$cmd" >/dev/null 2>/dev/null; then \ > mkdir -p "$(STAGING_DIR_HOST)/bin"; \ > ln -sf "$$$$$$$$bin" "$(STAGING_DIR_HOST)/bin/$(strip $(1))"; \ > > _______________________________________________ > openwrt-devel mailing list > openwrt-devel@lists.openwrt.org > https://lists.openwrt.org/mailman/listinfo/openwrt-devel
On Tue, 22 Dec 2020 at 17:51, Petr Štetiar <ynezz@true.cz> wrote: > > `which` utility is not shipped by default for example on recent Arch > Linux and then any steps relying on its presence fails, like for example > following Python3 prereq build check: > > $ python3 --version > Python 3.9.1 > > $ make > /bin/sh: line 1: which: command not found > /bin/sh: line 1: which: command not found > /bin/sh: line 1: which: command not found > ... > Checking 'python3'... failed. > ... > > Fix this by switching to Bash builtin `command` which should provide > same functionality. > > Fixes: FS#3525 > Signed-off-by: Petr Štetiar <ynezz@true.cz> > --- > > Other option is to check for `which` util presence in prereq-build and adding > `which` to the list of required host build utils. > > Makefile | 3 ++- > include/cmake.mk | 2 +- > include/prereq.mk | 4 ++-- > 3 files changed, 5 insertions(+), 4 deletions(-) > > diff --git a/Makefile b/Makefile > index 24f5955c9066..f4519e00d28d 100644 > --- a/Makefile > +++ b/Makefile > @@ -18,7 +18,8 @@ $(if $(findstring $(space),$(TOPDIR)),$(error ERROR: The path to the OpenWrt dir > > world: > > -DISTRO_PKG_CONFIG:=$(shell which -a pkg-config | grep -E '\/usr' | head -n 1) > +WHICH:=command -pv > +DISTRO_PKG_CONFIG:=$(shell $(WHICH) pkg-config | grep -E '\/usr' | head -n 1) > export PATH:=$(TOPDIR)/staging_dir/host/bin:$(PATH) > > ifneq ($(OPENWRT_BUILD),1) > diff --git a/include/cmake.mk b/include/cmake.mk > index 0a20530a16fe..ff00b5e779b5 100644 > --- a/include/cmake.mk > +++ b/include/cmake.mk > @@ -15,7 +15,7 @@ MAKE_PATH = $(firstword $(CMAKE_BINARY_SUBDIR) .) > ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) > cmake_tool=$(TOOLCHAIN_DIR)/bin/$(1) > else > - cmake_tool=$(shell which $(1)) > + cmake_tool=$(shell $(WHICH) $(1)) Will "-p" in "command -pv" ignore those paths in staging_dir? If that is so, maybe we should only use that flag in prereq.mk Regards, yousong > endif > > ifeq ($(CONFIG_CCACHE),) > diff --git a/include/prereq.mk b/include/prereq.mk > index 83ac21242c65..a6ee2bb637f5 100644 > --- a/include/prereq.mk > +++ b/include/prereq.mk > @@ -52,7 +52,7 @@ endef > > define RequireCommand > define Require/$(1) > - which $(1) > + $(WHICH) $(1) > endef > > $$(eval $$(call Require,$(1),$(2))) > @@ -106,7 +106,7 @@ define SetupHostCommand > $(call QuoteHostCommand,$(11)) $(call QuoteHostCommand,$(12)); do \ > if [ -n "$$$$$$$$cmd" ]; then \ > bin="$$$$$$$$(PATH="$(subst $(space),:,$(filter-out $(STAGING_DIR_HOST)/%,$(subst :,$(space),$(PATH))))" \ > - which "$$$$$$$${cmd%% *}")"; \ > + $(WHICH) "$$$$$$$${cmd%% *}")"; \ > if [ -x "$$$$$$$$bin" ] && eval "$$$$$$$$cmd" >/dev/null 2>/dev/null; then \ > mkdir -p "$(STAGING_DIR_HOST)/bin"; \ > ln -sf "$$$$$$$$bin" "$(STAGING_DIR_HOST)/bin/$(strip $(1))"; \ > > _______________________________________________ > openwrt-devel mailing list > openwrt-devel@lists.openwrt.org > https://lists.openwrt.org/mailman/listinfo/openwrt-devel
Hi, > -----Original Message----- > From: openwrt-devel [mailto:openwrt-devel-bounces@lists.openwrt.org] > On Behalf Of Petr Štetiar > Sent: Dienstag, 22. Dezember 2020 10:47 > To: openwrt-devel@lists.openwrt.org > Cc: Petr Štetiar <ynezz@true.cz> > Subject: [PATCH] build: replace which with Bash command built-in > > `which` utility is not shipped by default for example on recent Arch Linux and > then any steps relying on its presence fails, like for example following > Python3 prereq build check: > > $ python3 --version > Python 3.9.1 > > $ make > /bin/sh: line 1: which: command not found > /bin/sh: line 1: which: command not found > /bin/sh: line 1: which: command not found ... > Checking 'python3'... failed. > ... > > Fix this by switching to Bash builtin `command` which should provide same > functionality. > > Fixes: FS#3525 > Signed-off-by: Petr Štetiar <ynezz@true.cz> > --- > > Other option is to check for `which` util presence in prereq-build and adding > `which` to the list of required host build utils. > > Makefile | 3 ++- > include/cmake.mk | 2 +- > include/prereq.mk | 4 ++-- > 3 files changed, 5 insertions(+), 4 deletions(-) > > diff --git a/Makefile b/Makefile > index 24f5955c9066..f4519e00d28d 100644 > --- a/Makefile > +++ b/Makefile > @@ -18,7 +18,8 @@ $(if $(findstring $(space),$(TOPDIR)),$(error ERROR: The > path to the OpenWrt dir > > world: > > -DISTRO_PKG_CONFIG:=$(shell which -a pkg-config | grep -E '\/usr' | head -n > 1) > +WHICH:=command -pv > +DISTRO_PKG_CONFIG:=$(shell $(WHICH) pkg-config | grep -E '\/usr' | head > +-n 1) Since we have to replace 'which' everywhere anyway, I'd personally prefer to have/see the actual command in place. $(WHICH) implies that 'which' is still used, and I don't see a reason to not just use command -pv/-v directly so everybody knows what's happening. Best Adrian > export PATH:=$(TOPDIR)/staging_dir/host/bin:$(PATH) > > ifneq ($(OPENWRT_BUILD),1) > diff --git a/include/cmake.mk b/include/cmake.mk index > 0a20530a16fe..ff00b5e779b5 100644 > --- a/include/cmake.mk > +++ b/include/cmake.mk > @@ -15,7 +15,7 @@ MAKE_PATH = $(firstword $(CMAKE_BINARY_SUBDIR) > .) ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) > cmake_tool=$(TOOLCHAIN_DIR)/bin/$(1) > else > - cmake_tool=$(shell which $(1)) > + cmake_tool=$(shell $(WHICH) $(1)) > endif > > ifeq ($(CONFIG_CCACHE),) > diff --git a/include/prereq.mk b/include/prereq.mk index > 83ac21242c65..a6ee2bb637f5 100644 > --- a/include/prereq.mk > +++ b/include/prereq.mk > @@ -52,7 +52,7 @@ endef > > define RequireCommand > define Require/$(1) > - which $(1) > + $(WHICH) $(1) > endef > > $$(eval $$(call Require,$(1),$(2))) > @@ -106,7 +106,7 @@ define SetupHostCommand > $(call QuoteHostCommand,$(11)) $(call > QuoteHostCommand,$(12)); do \ > if [ -n "$$$$$$$$cmd" ]; then \ > bin="$$$$$$$$(PATH="$(subst $(space),:,$(filter-out > $(STAGING_DIR_HOST)/%,$(subst :,$(space),$(PATH))))" \ > - which "$$$$$$$${cmd%% *}")"; \ > + $(WHICH) "$$$$$$$${cmd%% *}")"; \ > if [ -x "$$$$$$$$bin" ] && eval "$$$$$$$$cmd" > >/dev/null 2>/dev/null; then \ > mkdir -p "$(STAGING_DIR_HOST)/bin"; \ > ln -sf "$$$$$$$$bin" > "$(STAGING_DIR_HOST)/bin/$(strip $(1))"; \ > > _______________________________________________ > openwrt-devel mailing list > openwrt-devel@lists.openwrt.org > https://lists.openwrt.org/mailman/listinfo/openwrt-devel
diff --git a/Makefile b/Makefile index 24f5955c9066..f4519e00d28d 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,8 @@ $(if $(findstring $(space),$(TOPDIR)),$(error ERROR: The path to the OpenWrt dir world: -DISTRO_PKG_CONFIG:=$(shell which -a pkg-config | grep -E '\/usr' | head -n 1) +WHICH:=command -pv +DISTRO_PKG_CONFIG:=$(shell $(WHICH) pkg-config | grep -E '\/usr' | head -n 1) export PATH:=$(TOPDIR)/staging_dir/host/bin:$(PATH) ifneq ($(OPENWRT_BUILD),1) diff --git a/include/cmake.mk b/include/cmake.mk index 0a20530a16fe..ff00b5e779b5 100644 --- a/include/cmake.mk +++ b/include/cmake.mk @@ -15,7 +15,7 @@ MAKE_PATH = $(firstword $(CMAKE_BINARY_SUBDIR) .) ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) cmake_tool=$(TOOLCHAIN_DIR)/bin/$(1) else - cmake_tool=$(shell which $(1)) + cmake_tool=$(shell $(WHICH) $(1)) endif ifeq ($(CONFIG_CCACHE),) diff --git a/include/prereq.mk b/include/prereq.mk index 83ac21242c65..a6ee2bb637f5 100644 --- a/include/prereq.mk +++ b/include/prereq.mk @@ -52,7 +52,7 @@ endef define RequireCommand define Require/$(1) - which $(1) + $(WHICH) $(1) endef $$(eval $$(call Require,$(1),$(2))) @@ -106,7 +106,7 @@ define SetupHostCommand $(call QuoteHostCommand,$(11)) $(call QuoteHostCommand,$(12)); do \ if [ -n "$$$$$$$$cmd" ]; then \ bin="$$$$$$$$(PATH="$(subst $(space),:,$(filter-out $(STAGING_DIR_HOST)/%,$(subst :,$(space),$(PATH))))" \ - which "$$$$$$$${cmd%% *}")"; \ + $(WHICH) "$$$$$$$${cmd%% *}")"; \ if [ -x "$$$$$$$$bin" ] && eval "$$$$$$$$cmd" >/dev/null 2>/dev/null; then \ mkdir -p "$(STAGING_DIR_HOST)/bin"; \ ln -sf "$$$$$$$$bin" "$(STAGING_DIR_HOST)/bin/$(strip $(1))"; \
`which` utility is not shipped by default for example on recent Arch Linux and then any steps relying on its presence fails, like for example following Python3 prereq build check: $ python3 --version Python 3.9.1 $ make /bin/sh: line 1: which: command not found /bin/sh: line 1: which: command not found /bin/sh: line 1: which: command not found ... Checking 'python3'... failed. ... Fix this by switching to Bash builtin `command` which should provide same functionality. Fixes: FS#3525 Signed-off-by: Petr Štetiar <ynezz@true.cz> --- Other option is to check for `which` util presence in prereq-build and adding `which` to the list of required host build utils. Makefile | 3 ++- include/cmake.mk | 2 +- include/prereq.mk | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-)