linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, Alexey Brodkin <abrodkin@synopsys.com>,
	Masahiro Yamada <yamada.masahiro@socionext.com>
Subject: [PATCH 5.1 35/70] kbuild: use more portable command -v for cc-cross-prefix
Date: Sun,  9 Jun 2019 18:41:46 +0200	[thread overview]
Message-ID: <20190609164130.078925185@linuxfoundation.org> (raw)
In-Reply-To: <20190609164127.541128197@linuxfoundation.org>

From: Masahiro Yamada <yamada.masahiro@socionext.com>

commit 913ab9780fc021298949cc5514d6255a008e69f9 upstream.

To print the pathname that will be used by shell in the current
environment, 'command -v' is a standardized way. [1]

'which' is also often used in scripts, but it is less portable.

When I worked on commit bd55f96fa9fc ("kbuild: refactor cc-cross-prefix
implementation"), I was eager to use 'command -v' but it did not work.
(The reason is explained below.)

I kept 'which' as before but got rid of '> /dev/null 2>&1' as I
thought it was no longer needed. Sorry, I was wrong.

It works well on my Ubuntu machine, but Alexey Brodkin reports noisy
warnings on CentOS7 when 'which' fails to find the given command in
the PATH environment.

  $ which foo
  which: no foo in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)

Given that behavior of 'which' depends on system (and it may not be
installed by default), I want to try 'command -v' once again.

The specification [1] clearly describes the behavior of 'command -v'
when the given command is not found:

  Otherwise, no output shall be written and the exit status shall reflect
  that the name was not found.

However, we need a little magic to use 'command -v' from Make.

$(shell ...) passes the argument to a subshell for execution, and
returns the standard output of the command.

Here is a trick. GNU Make may optimize this by executing the command
directly instead of forking a subshell, if no shell special characters
are found in the command and omitting the subshell will not change the
behavior.

In this case, no shell special character is used. So, Make will try
to run it directly. However, 'command' is a shell-builtin command,
then Make would fail to find it in the PATH environment:

  $ make ARCH=m68k defconfig
  make: command: Command not found
  make: command: Command not found
  make: command: Command not found

In fact, Make has a table of shell-builtin commands because it must
ask the shell to execute them.

Until recently, 'command' was missing in the table.

This issue was fixed by the following commit:

| commit 1af314465e5dfe3e8baa839a32a72e83c04f26ef
| Author: Paul Smith <psmith@gnu.org>
| Date:   Sun Nov 12 18:10:28 2017 -0500
|
|     * job.c: Add "command" as a known shell built-in.
|
|     This is not a POSIX shell built-in but it's common in UNIX shells.
|     Reported by Nick Bowler <nbowler@draconx.ca>.

Because the latest release is GNU Make 4.2.1 in 2016, this commit is
not included in any released versions. (But some distributions may
have back-ported it.)

We need to trick Make to spawn a subshell. There are various ways to
do so:

 1) Use a shell special character '~' as dummy

    $(shell : ~; command -v $(c)gcc)

 2) Use a variable reference that always expands to the empty string
    (suggested by David Laight)

    $(shell command$${x:+} -v $(c)gcc)

 3) Use redirect

    $(shell command -v $(c)gcc 2>/dev/null)

I chose 3) to not confuse people. The stderr would not be polluted
anyway, but it will provide extra safety, and is easy to understand.

Tested on Make 3.81, 3.82, 4.0, 4.1, 4.2, 4.2.1

[1] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/command.html

Fixes: bd55f96fa9fc ("kbuild: refactor cc-cross-prefix implementation")
Cc: linux-stable <stable@vger.kernel.org> # 5.1
Reported-by: Alexey Brodkin <abrodkin@synopsys.com>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Tested-by: Alexey Brodkin <abrodkin@synopsys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 scripts/Kbuild.include |    7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -73,8 +73,13 @@ endef
 # Usage: CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu- m68k-linux-)
 # Return first <prefix> where a <prefix>gcc is found in PATH.
 # If no gcc found in PATH with listed prefixes return nothing
+#
+# Note: '2>/dev/null' is here to force Make to invoke a shell. Otherwise, it
+# would try to directly execute the shell builtin 'command'. This workaround
+# should be kept for a long time since this issue was fixed only after the
+# GNU Make 4.2.1 release.
 cc-cross-prefix = $(firstword $(foreach c, $(filter-out -%, $(1)), \
-					$(if $(shell which $(c)gcc), $(c))))
+			$(if $(shell command -v $(c)gcc 2>/dev/null), $(c))))
 
 # output directory for tests below
 TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/)



  parent reply	other threads:[~2019-06-09 16:47 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-09 16:41 [PATCH 5.1 00/70] 5.1.9-stable review Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 01/70] ethtool: fix potential userspace buffer overflow Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 02/70] Fix memory leak in sctp_process_init Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 03/70] ipv4: not do cache for local delivery if bc_forwarding is enabled Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 04/70] ipv6: fix the check before getting the cookie in rt6_get_cookie Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 05/70] net: ethernet: ti: cpsw_ethtool: fix ethtool ring param set Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 06/70] net: mvpp2: Use strscpy to handle stat strings Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 07/70] net: rds: fix memory leak in rds_ib_flush_mr_pool Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 08/70] net: sfp: read eeprom in maximum 16 byte increments Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 09/70] packet: unconditionally free po->rollover Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 10/70] pktgen: do not sleep with the thread lock held Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 11/70] Revert "fib_rules: return 0 directly if an exactly same rule exists when NLM_F_EXCL not supplied" Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 12/70] udp: only choose unbound UDP socket for multicast when not in a VRF Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 13/70] ipv6: use READ_ONCE() for inet->hdrincl as in ipv4 Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 14/70] ipv6: fix EFAULT on sendto with icmpv6 and hdrincl Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 15/70] net: aquantia: fix wol configuration not applied sometimes Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 16/70] neighbor: Reset gc_entries counter if new entry is released before insert Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 17/70] neighbor: Call __ipv4_neigh_lookup_noref in neigh_xmit Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 18/70] cls_matchall: avoid panic when receiving a packet before filter set Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 19/70] ipmr_base: Do not reset index in mr_table_dump Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 20/70] net/mlx4_en: ethtool, Remove unsupported SFP EEPROM high pages query Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 21/70] net/tls: replace the sleeping lock around RX resync with a bit lock Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 22/70] rcu: locking and unlocking need to always be at least barriers Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 23/70] habanalabs: fix debugfs code Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 24/70] ARC: mm: SIGSEGV userspace trying to access kernel virtual memory Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 25/70] parisc: Use implicit space register selection for loading the coherence index of I/O pdirs Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 26/70] parisc: Fix crash due alternative coding for NP iopdir_fdc bit Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 27/70] SUNRPC fix regression in umount of a secure mount Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 28/70] SUNRPC: Fix a use after free when a server rejects the RPCSEC_GSS credential Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 29/70] NFSv4.1: Again fix a race where CB_NOTIFY_LOCK fails to wake a waiter Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 30/70] NFSv4.1: Fix bug only first CB_NOTIFY_LOCK is handled Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 31/70] fuse: fallocate: fix return with locked inode Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 32/70] fuse: fix copy_file_range() in the writeback case Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 33/70] pstore: Set tfm to NULL on free_buf_for_compression Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 34/70] pstore/ram: Run without kernel crash dump region Greg Kroah-Hartman
2019-06-09 16:41 ` Greg Kroah-Hartman [this message]
2019-06-09 16:41 ` [PATCH 5.1 36/70] memstick: mspro_block: Fix an error code in mspro_block_issue_req() Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 37/70] mmc: tmio: fix SCC error handling to avoid false positive CRC error Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 38/70] mmc: sdhci_am654: Fix SLOTTYPE write Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 39/70] x86/power: Fix nosmt vs hibernation triple fault during resume Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 40/70] x86/insn-eval: Fix use-after-free access to LDT entry Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 41/70] i2c: xiic: Add max_read_len quirk Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 42/70] s390/mm: fix address space detection in exception handling Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 43/70] nvme-rdma: fix queue mapping when queue count is limited Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 44/70] xen-blkfront: switch kcalloc to kvcalloc for large array allocation Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 45/70] MIPS: Bounds check virt_addr_valid Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 46/70] MIPS: pistachio: Build uImage.gz by default Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 47/70] genwqe: Prevent an integer overflow in the ioctl Greg Kroah-Hartman
2019-06-09 16:41 ` [PATCH 5.1 48/70] test_firmware: Use correct snprintf() limit Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 49/70] drm/rockchip: fix fb references in async update Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 50/70] drm/vc4: " Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 51/70] drm/gma500/cdv: Check vbt config bits when detecting lvds panels Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 52/70] drm/msm: fix fb references in async update Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 53/70] drm: add non-desktop quirk for Valve HMDs Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 54/70] drm/nouveau: add kconfig option to turn off nouveau legacy contexts. (v3) Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 55/70] drm: add non-desktop quirks to Sensics and OSVR headsets Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 56/70] drm: Fix timestamp docs for variable refresh properties Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 57/70] drm/amdgpu/psp: move psp version specific function pointers to early_init Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 58/70] drm/radeon: prefer lower reference dividers Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 59/70] drm/amdgpu: remove ATPX_DGPU_REQ_POWER_FOR_DISPLAYS check when hotplug-in Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 60/70] drm/i915: Fix I915_EXEC_RING_MASK Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 61/70] drm/amdgpu/soc15: skip reset on init Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 62/70] drm/amd/display: Add ASICREV_IS_PICASSO Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 63/70] drm/amdgpu: fix ring test failure issue during s3 in vce 3.0 (V2) Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 64/70] drm/i915/fbc: disable framebuffer compression on GeminiLake Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 65/70] drm/i915/gvt: emit init breadcrumb for gvt request Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 66/70] drm/i915: Maintain consistent documentation subsection ordering Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 67/70] drm: dont block fb changes for async plane updates Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 68/70] drm/i915/gvt: Initialize intel_gvt_gtt_entry in stack Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 69/70] drm/amd: fix fb references in async update Greg Kroah-Hartman
2019-06-09 16:42 ` [PATCH 5.1 70/70] TTY: serial_core, add ->install Greg Kroah-Hartman
2019-06-09 22:37 ` [PATCH 5.1 00/70] 5.1.9-stable review Jiunn Chang
2019-06-10  5:57   ` Greg Kroah-Hartman
2019-06-10  6:03 ` Naresh Kamboju
2019-06-10 14:26   ` Greg Kroah-Hartman
2019-06-10  8:52 ` Jon Hunter
2019-06-10 14:25   ` Greg Kroah-Hartman
2019-06-10 14:45 ` Guenter Roeck
2019-06-10 14:51   ` Greg Kroah-Hartman
2019-06-10 22:01 ` shuah
2019-06-11  7:21   ` Greg Kroah-Hartman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190609164130.078925185@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=abrodkin@synopsys.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=yamada.masahiro@socionext.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).