Do not hard-code the command name 'make' in upper-level tools
cover Do not hard-code the command name 'make' in upper-level tools
Masahiro Yamada (3):
scripts: add scripts/gnu_make to not hard-code make command
MAKEALL: make sure to invoke GNU Make
buildman: make sure to invoke GNU Make
MAKEALL | 8 +++++--- scripts/gnu_make | 30 ++++++++++++++++++++++++++++++ tools/buildman/builder.py | 3 ++- 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100755 scripts/gnu_make
Signature · 1 line
1.9.1
PATCH 1/3 scripts: add scripts/gnu_make to not hard-code make command
U-Boot is expected to be built on various platforms but makefiles are written for GNU Make.
We should keep in mind that the command 'make' is not always GNU Make.
For example, on Linux, people generally do:
make <board>_config; make
But FreeBSD folks do
gmake <board>_config; gmake
(The command 'make' on FreeBSD is BSD Make, not GNU Make)
It is not a good idea to hard-code the command name 'make' in MAKEALL or buildman.
Instead, they should call the make command via this helper script to make sure it is GNU Make.
---
scripts/gnu_make | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100755 scripts/gnu_make
scripts/gnu_make new file +30 -0
@@ -0,0 +1,30 @@ +#!/bin/sh +# +# Call GNU Make +# +# U-Boot is supposed to be built on various platforms. +# One problem is that the command 'make' is not always GNU Make. +# (For ex. the command name for GNU Make on FreeBSD is usually 'gmake'.) +# It is not a good idea to hard-code the command name 'make' +# in scripts where where GNU Make is expected. +# In that case, call this helper script to make sure to invoke GNU Make. +# +# SPDX-License-Identifier: GPL-2.0+ +# + +gnu_make= + +for m in make gmake +do + if $m --version 2>/dev/null | grep -q GNU; then + gnu_make=$m + break + fi +done + +if [ -z "$gnu_make" ]; then + echo "GNU Make not found" >&2 + exit 1 +fi + +$gnu_make "$@"
Signature · 1 line
1.9.1
PATCH 1/3 scripts: add scripts/gnu_make to not hard-code make command
Hello Masahiro,
Quoted 9 lines · Masahiro Yamada
U-Boot is expected to be built on various platforms but makefiles are written for GNU Make.
We should keep in mind that the command 'make' is not always GNU Make.
For example, on Linux, people generally do:
make <board>_config; make
Quoted 8 lines
But FreeBSD folks do
gmake <board>_config; gmake
(The command 'make' on FreeBSD is BSD Make, not GNU Make)
It is not a good idea to hard-code the command name 'make' in MAKEALL or buildman.
indeed, not a good idea.
Quoted 2 lines
Instead, they should call the make command via this helper script to make sure it is GNU Make.
yup, or the name of the executable could be displayed, so it only needs to be checked once at startup (and error out if no GNU make is found at all).
Quoted 1 line
+++ b/scripts/gnu_make
nitpicking, most script use a dash instead of an underscore.
Quoted 22 lines
scripts/gnu_make new file +20
-0@@ -0,0 +1,30 @@ +#!/bin/sh +# +# Call GNU Make +# +# U-Boot is supposed to be built on various platforms. +# One problem is that the command 'make' is not always GNU Make. +# (For ex. the command name for GNU Make on FreeBSD is usually 'gmake'.) +# It is not a good idea to hard-code the command name 'make' +# in scripts where where GNU Make is expected. +# In that case, call this helper script to make sure to invoke GNU Make. +# +# SPDX-License-Identifier: GPL-2.0+ +# + +gnu_make= + +for m in make gmake +do + if $m --version 2>/dev/null | grep -q GNU; then + gnu_make=$m
scripts/gnu_make line 30
Quoted 10 lines
scripts/gnu_make new file +10
-0+ break + fi +done + +if [ -z "$gnu_make" ]; then + echo "GNU Make not found" >&2 + exit 1 +fi + +$gnu_make "$@"
I guess, it could use exec here, since the script itself is no longer needed.
Regards,
Jeroen
PATCH 1/3 scripts: add scripts/gnu_make to not hard-code make command
Hi Jeroen,
Quoted 6 lines · On Fri, 18 Jul 2014 20:19:52 +0200 Jeroen Hofstee <[email protected]> wrote:
Quoted 2 lines
Instead, they should call the make command via this helper script to make sure it is GNU Make.
yup, or the name of the executable could be displayed, so it only needs to be checked once at startup (and error out if no GNU make is found at all).
Good idea!
MAKEALL and buildman generally invoke make for a lot of boards. Searching it once at startup seems better.
Quoted 3 lines
Quoted 1 line
+++ b/scripts/gnu_make
nitpicking, most script use a dash instead of an underscore.
Renamed in v2.
Best Regards
Masahiro Yamada
PATCH 2/3 MAKEALL: make sure to invoke GNU Make
In reply to Masahiro YamadaSince the command name 'make' is not GNU Make on some platforms such as FreeBSD, MAKEALL should call the make via scripts/gnu_make.
---
MAKEALL | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
MAKEALL +5 -3
@@ -630,14 +630,16 @@ build_target() { output_dir="${OUTPUT_PREFIX}" fi + GNU_MAKE=scripts/gnu_make + target_arch=$(get_target_arch ${target}) eval cross_toolchain=\$CROSS_COMPILE_`echo $target_arch | tr '[:lower:]' '[:upper:]'` if [ "${cross_toolchain}" ] ; then - MAKE="make CROSS_COMPILE=${cross_toolchain}" + MAKE="$GNU_MAKE CROSS_COMPILE=${cross_toolchain}" elif [ "${CROSS_COMPILE}" ] ; then - MAKE="make CROSS_COMPILE=${CROSS_COMPILE}" + MAKE="$GNU_MAKE CROSS_COMPILE=${CROSS_COMPILE}" else - MAKE=make + MAKE=$GNU_MAKE fi if [ "${output_dir}" != "." ] ; then
Signature · 1 line
1.9.1
PATCH 2/3 MAKEALL: make sure to invoke GNU Make
Hello Masahiro,
Quoted 23 lines · Masahiro Yamada
Since the command name 'make' is not GNU Make on some platforms such as FreeBSD, MAKEALL should call the make via
scripts/gnu_make.Signed-off-by Masahiro Yamada <[email protected]>---
MAKEALL | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)MAKEALL +2
-1@@ -630,14 +630,16 @@ build_target() { output_dir="${OUTPUT_PREFIX}" fi + GNU_MAKE=scripts/gnu_make + target_arch=$(get_target_arch ${target}) eval cross_toolchain=\$CROSS_COMPILE_`echo $target_arch | tr '[:lower:]' '[:upper:]'` if [ "${cross_toolchain}" ] ; then - MAKE="make CROSS_COMPILE=${cross_toolchain}"
MAKEALL build_target() { · line 645
Quoted 10 lines
MAKEALL +3
-2+ MAKE="$GNU_MAKE CROSS_COMPILE=${cross_toolchain}" elif [ "${CROSS_COMPILE}" ] ; then - MAKE="make CROSS_COMPILE=${CROSS_COMPILE}" + MAKE="$GNU_MAKE CROSS_COMPILE=${CROSS_COMPILE}" else - MAKE=make + MAKE=$GNU_MAKE fi if [ "${output_dir}" != "." ] ; then
while by itself this might be correct, opt is not a POSIX command and MAKEALL will not work at all on a BSD host. Perhaps it is time I have a look at what buildman is....
Regards,
Jeroen
PATCH 2/3 MAKEALL: make sure to invoke GNU Make
Hi Jeroen,
Quoted 34 lines · Jeroen Hofstee
Hello Masahiro,
Quoted 30 lines · Masahiro Yamada
Since the command name 'make' is not GNU Make on some platforms such as FreeBSD, MAKEALL should call the make via
scripts/gnu_make.Signed-off-by Masahiro Yamada <[email protected]>---
MAKEALL | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)MAKEALL +1
-0@@ -630,14 +630,16 @@ build_target() { output_dir="${OUTPUT_PREFIX}" fi + GNU_MAKE=scripts/gnu_make + target_arch=$(get_target_arch ${target}) eval cross_toolchain=\$CROSS_COMPILE_`echo $target_arch | tr'[:lower:]' '[:upper:]'`
if [ "${cross_toolchain}" ] ; thenMAKEALL +2
-3- MAKE="make CROSS_COMPILE=${cross_toolchain}" + MAKE="$GNU_MAKE CROSS_COMPILE=${cross_toolchain}" elif [ "${CROSS_COMPILE}" ] ; then - MAKE="make CROSS_COMPILE=${CROSS_COMPILE}" + MAKE="$GNU_MAKE CROSS_COMPILE=${CROSS_COMPILE}" else - MAKE=make
Quoted 8 lines
Quoted 3 lines
+ MAKE=$GNU_MAKE
fi if [ "${output_dir}" != "." ] ; thenwhile by itself this might be correct, opt is not a POSIX command and MAKEALL will not work at all on a BSD host. Perhaps it is time I have a look at what buildman is....
http://patchwork.ozlabs.org/patch/369788/
:-)
Regards,
Simon
PATCH 3/3 buildman: make sure to invoke GNU Make
In reply to Masahiro YamadaSince the command name 'make' is not GNU Make on some platforms such as FreeBSD, MAKEALL should call the make via scripts/gnu_make.
---
tools/buildman/builder.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/buildman/builder.py +2 -1
@@ -667,7 +667,8 @@ class Builder: args: Arguments to pass to make kwargs: Arguments to pass to command.RunPipe() """ - cmd = ['make'] + list(args) + gnu_make = os.path.join(self.git_dir, '../scripts/gnu_make') + cmd = [gnu_make] + list(args) result = command.RunPipe([cmd], capture=True, capture_stderr=True, cwd=cwd, raise_on_error=False, **kwargs) return result
Signature · 1 line
1.9.1
PATCH 3/3 buildman: make sure to invoke GNU Make
Quoted 4 lines · Masahiro Yamada
Since the command name 'make' is not GNU Make on some platforms such as FreeBSD, MAKEALL should call the make via
scripts/gnu_make.Signed-off-by Masahiro Yamada <[email protected]>
Maybe you will rename the script, but the code looks good.
PATCH 3/3 buildman: make sure to invoke GNU Make
In reply to Masahiro YamadaHello Masahiro,
Quoted 14 lines · Masahiro Yamada
Since the command name 'make' is not GNU Make on some platforms such as FreeBSD, MAKEALL should call the make via
scripts/gnu_make.Signed-off-by Masahiro Yamada <[email protected]>---
tools/buildman/builder.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)tools/buildman/builder.py +0
-0
tools/buildman/builder.py class Builder: · line 674
Quoted 9 lines
tools/buildman/builder.py +2
-1@@ -667,7 +667,8 @@ class Builder: args: Arguments to pass to make kwargs: Arguments to pass to command.RunPipe() """ - cmd = ['make'] + list(args) + gnu_make = os.path.join(self.git_dir, '../scripts/gnu_make') + cmd = [gnu_make] + list(args) result = command.RunPipe([cmd], capture=True, capture_stderr=True, cwd=cwd, raise_on_error=False, **kwargs) return result
with a trick to let buildman call clang, this works fine on FreeBSD.
Regards,
Jeroen