diff mbox series

build: replace which with Bash command built-in

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

Commit Message

Petr Štetiar Dec. 22, 2020, 9:46 a.m. UTC
`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(-)

Comments

Rosen Penev Dec. 22, 2020, 10:04 a.m. UTC | #1
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
Yousong Zhou Dec. 22, 2020, 10:30 a.m. UTC | #2
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
Adrian Schmutzler Dec. 22, 2020, 12:20 p.m. UTC | #3
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 mbox series

Patch

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))"; \