2020-09-22 10:48:37 +08:00
# SPDX-License-Identifier: GPL-2.0-only
2015-03-29 15:29:18 +08:00
#
2020-09-22 10:48:37 +08:00
# Copyright (C) 2006-2020 OpenWrt.org
2006-06-24 01:14:34 +08:00
2012-04-27 01:53:56 +08:00
i f n d e f O P E N W R T _ V E R B O S E
OPENWRT_VERBOSE:=
e n d i f
i f e q ( "$(origin V)" , "command line" )
OPENWRT_VERBOSE:= $( V)
2006-07-22 20:16:26 +08:00
e n d i f
2006-07-02 08:56:53 +08:00
2012-04-27 01:53:56 +08:00
i f e q ( $( OPENWRT_VERBOSE ) , 1 )
OPENWRT_VERBOSE:= w
2006-07-22 20:16:26 +08:00
e n d i f
2012-04-27 01:53:56 +08:00
i f e q ( $( OPENWRT_VERBOSE ) , 9 9 )
OPENWRT_VERBOSE:= s
e n d i f
i f e q ( $( NO_TRACE_MAKE ) , )
2012-04-27 02:13:17 +08:00
NO_TRACE_MAKE := $( MAKE) V = s$( OPENWRT_VERBOSE)
2012-04-27 01:53:56 +08:00
export NO_TRACE_MAKE
2006-06-24 05:47:24 +08:00
e n d i f
2006-11-12 09:55:28 +08:00
i f e q ( $( IS_TTY ) , 1 )
2010-02-09 06:28:19 +08:00
ifneq ( $( strip $( NO_COLOR) ) ,1)
_Y:= \\ 033[ 33m
2013-03-18 05:12:02 +08:00
_R:= \\ 033[ 31m
2010-02-09 06:28:19 +08:00
_N:= \\ 033[ m
endif
2006-08-05 04:46:47 +08:00
e n d i f
2022-02-28 17:14:25 +08:00
d e f i n e E R R O R _ M E S S A G E
verbose.mk: fallback to standard file descriptors
In order to pass a status message at runtime,
which is usually listing subtargets
of a Makefile target or an error message,
from a child invocation of Make (submake)
through the parent process to the terminal,
the file descriptors 8 and 9 are opened to be used
by the functions MESSAGE and ERROR_MESSAGE.
However, there are situations where those functions
can be called while not in a submake or a subshell
or a child process which results in a shell error:
/bin/bash: 8: Bad file descriptor
Commit aee3594ffcb72ae3e18c3719012d52519ee2d160
("verbose.mk: print ERROR messages in non-verbose")
has exposed this issue to more cases, but it is not the root cause.
To solve this, use the exit code of the first printf attempt
to the alternative file descriptors in order to tell whether
the standard file descriptors need to be used instead.
In order to get rid of the "Bad file descriptor" error, stderr is
redirected to null after grouping the two printf alternatives
into one command to combine outputs.
For ERROR_MESSAGE, the real message is redirected to stderr
after redirecting the error from the attempted printing to null.
For MESSAGE, without redirection, the Make function "shell"
will absorb the actual message from stdout and input the value into the Makefile,
therefore the dummy variable "_NULL", previously used merely for causing
a call to the MESSAGE function to trigger without writing target rules,
now has and a real value when defined, so rename it to "_MESSAGE"
as a placeholder for the real message when the output should be stdout.
When "_MESSAGE" has a value, use Make function "info" to
finally bring it from the Makefile to the terminal.
This also fixes what is likely a typo, in that
while file descriptor 9 is meant to redirect to stderr
for use in error messages like in the function ERROR_MESSAGE,
that function has printf redirecting to file descriptor 8 instead.
Fixes: a4c8d4e37 ("build: make the color of the 'configuration out of sync' warning red")
Signed-off-by: Michael Pratt <mcpratt@pm.me>
2022-05-18 11:06:36 +08:00
{ \
printf " $( _R) %s $( _N) \n " " $( 1) " >& 9 || \
printf " $( _R) %s $( _N) \n " " $( 1) " ; \
} >& 2 2>/dev/null
2022-02-28 17:14:25 +08:00
e n d e f
2012-04-27 01:53:56 +08:00
i f e q ( $( findstring s ,$ ( OPENWRT_VERBOSE ) ) , )
2008-05-08 00:45:00 +08:00
define MESSAGE
verbose.mk: fallback to standard file descriptors
In order to pass a status message at runtime,
which is usually listing subtargets
of a Makefile target or an error message,
from a child invocation of Make (submake)
through the parent process to the terminal,
the file descriptors 8 and 9 are opened to be used
by the functions MESSAGE and ERROR_MESSAGE.
However, there are situations where those functions
can be called while not in a submake or a subshell
or a child process which results in a shell error:
/bin/bash: 8: Bad file descriptor
Commit aee3594ffcb72ae3e18c3719012d52519ee2d160
("verbose.mk: print ERROR messages in non-verbose")
has exposed this issue to more cases, but it is not the root cause.
To solve this, use the exit code of the first printf attempt
to the alternative file descriptors in order to tell whether
the standard file descriptors need to be used instead.
In order to get rid of the "Bad file descriptor" error, stderr is
redirected to null after grouping the two printf alternatives
into one command to combine outputs.
For ERROR_MESSAGE, the real message is redirected to stderr
after redirecting the error from the attempted printing to null.
For MESSAGE, without redirection, the Make function "shell"
will absorb the actual message from stdout and input the value into the Makefile,
therefore the dummy variable "_NULL", previously used merely for causing
a call to the MESSAGE function to trigger without writing target rules,
now has and a real value when defined, so rename it to "_MESSAGE"
as a placeholder for the real message when the output should be stdout.
When "_MESSAGE" has a value, use Make function "info" to
finally bring it from the Makefile to the terminal.
This also fixes what is likely a typo, in that
while file descriptor 9 is meant to redirect to stderr
for use in error messages like in the function ERROR_MESSAGE,
that function has printf redirecting to file descriptor 8 instead.
Fixes: a4c8d4e37 ("build: make the color of the 'configuration out of sync' warning red")
Signed-off-by: Michael Pratt <mcpratt@pm.me>
2022-05-18 11:06:36 +08:00
{ \
printf " $( _Y) %s $( _N) \n " " $( 1) " >& 8 || \
printf " $( _Y) %s $( _N) \n " " $( 1) " ; \
} 2>/dev/null
2008-05-08 00:45:00 +08:00
endef
2007-04-12 06:59:42 +08:00
2006-06-24 01:14:34 +08:00
ifeq ( $( QUIET) ,1)
2007-07-28 21:00:43 +08:00
ifneq ( $( CURDIR) ,$( TOPDIR) )
_DIR:= $( patsubst $( TOPDIR) /%,%,${ CURDIR } )
else
_DIR:=
endif
verbose.mk: fallback to standard file descriptors
In order to pass a status message at runtime,
which is usually listing subtargets
of a Makefile target or an error message,
from a child invocation of Make (submake)
through the parent process to the terminal,
the file descriptors 8 and 9 are opened to be used
by the functions MESSAGE and ERROR_MESSAGE.
However, there are situations where those functions
can be called while not in a submake or a subshell
or a child process which results in a shell error:
/bin/bash: 8: Bad file descriptor
Commit aee3594ffcb72ae3e18c3719012d52519ee2d160
("verbose.mk: print ERROR messages in non-verbose")
has exposed this issue to more cases, but it is not the root cause.
To solve this, use the exit code of the first printf attempt
to the alternative file descriptors in order to tell whether
the standard file descriptors need to be used instead.
In order to get rid of the "Bad file descriptor" error, stderr is
redirected to null after grouping the two printf alternatives
into one command to combine outputs.
For ERROR_MESSAGE, the real message is redirected to stderr
after redirecting the error from the attempted printing to null.
For MESSAGE, without redirection, the Make function "shell"
will absorb the actual message from stdout and input the value into the Makefile,
therefore the dummy variable "_NULL", previously used merely for causing
a call to the MESSAGE function to trigger without writing target rules,
now has and a real value when defined, so rename it to "_MESSAGE"
as a placeholder for the real message when the output should be stdout.
When "_MESSAGE" has a value, use Make function "info" to
finally bring it from the Makefile to the terminal.
This also fixes what is likely a typo, in that
while file descriptor 9 is meant to redirect to stderr
for use in error messages like in the function ERROR_MESSAGE,
that function has printf redirecting to file descriptor 8 instead.
Fixes: a4c8d4e37 ("build: make the color of the 'configuration out of sync' warning red")
Signed-off-by: Michael Pratt <mcpratt@pm.me>
2022-05-18 11:06:36 +08:00
_MESSAGE:= $( if $( MAKECMDGOALS) ,$( shell \
2007-12-27 04:54:39 +08:00
$( call MESSAGE, make[ $( MAKELEVEL) ] $( if $( _DIR) , -C $( _DIR) ) $( MAKECMDGOALS) ) ; \
2007-07-28 21:00:43 +08:00
) )
verbose.mk: fallback to standard file descriptors
In order to pass a status message at runtime,
which is usually listing subtargets
of a Makefile target or an error message,
from a child invocation of Make (submake)
through the parent process to the terminal,
the file descriptors 8 and 9 are opened to be used
by the functions MESSAGE and ERROR_MESSAGE.
However, there are situations where those functions
can be called while not in a submake or a subshell
or a child process which results in a shell error:
/bin/bash: 8: Bad file descriptor
Commit aee3594ffcb72ae3e18c3719012d52519ee2d160
("verbose.mk: print ERROR messages in non-verbose")
has exposed this issue to more cases, but it is not the root cause.
To solve this, use the exit code of the first printf attempt
to the alternative file descriptors in order to tell whether
the standard file descriptors need to be used instead.
In order to get rid of the "Bad file descriptor" error, stderr is
redirected to null after grouping the two printf alternatives
into one command to combine outputs.
For ERROR_MESSAGE, the real message is redirected to stderr
after redirecting the error from the attempted printing to null.
For MESSAGE, without redirection, the Make function "shell"
will absorb the actual message from stdout and input the value into the Makefile,
therefore the dummy variable "_NULL", previously used merely for causing
a call to the MESSAGE function to trigger without writing target rules,
now has and a real value when defined, so rename it to "_MESSAGE"
as a placeholder for the real message when the output should be stdout.
When "_MESSAGE" has a value, use Make function "info" to
finally bring it from the Makefile to the terminal.
This also fixes what is likely a typo, in that
while file descriptor 9 is meant to redirect to stderr
for use in error messages like in the function ERROR_MESSAGE,
that function has printf redirecting to file descriptor 8 instead.
Fixes: a4c8d4e37 ("build: make the color of the 'configuration out of sync' warning red")
Signed-off-by: Michael Pratt <mcpratt@pm.me>
2022-05-18 11:06:36 +08:00
ifneq ( $( strip $( _MESSAGE) ) ,)
$( info $( _MESSAGE) )
endif
2008-06-09 23:38:45 +08:00
SUBMAKE = $( MAKE)
2006-06-24 01:14:34 +08:00
else
2012-04-27 01:53:56 +08:00
SILENT:= >/dev/null $( if $( findstring w,$( OPENWRT_VERBOSE) ) ,,2>& 1)
2007-07-28 21:00:43 +08:00
export QUIET:= 1
2018-07-24 17:09:17 +08:00
SUBMAKE = cmd( ) { $( SILENT) $( MAKE) -s " $$ @ " < /dev/null || { echo " make $$ *: build failed. Please re-run make with -j1 V=s or V=sc for a higher verbosity level to see what's going on " ; false; } } 8>& 1 9>& 2; cmd
2006-06-24 01:14:34 +08:00
endif
.SILENT: $( MAKECMDGOALS)
2008-05-08 00:45:00 +08:00
e l s e
2010-01-17 06:18:56 +08:00
SUBMAKE = $( MAKE) -w
2008-05-08 00:45:00 +08:00
define MESSAGE
printf "%s\n" " $( 1) "
endef
2006-06-24 01:14:34 +08:00
e n d i f