mirror of
https://github.com/openwrt/openwrt.git
synced 2024-11-23 18:05:20 +08:00
14a3eadf05
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 Commitaee3594ffc
("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>
73 lines
1.6 KiB
Makefile
73 lines
1.6 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0-only
|
|
#
|
|
# Copyright (C) 2006-2020 OpenWrt.org
|
|
|
|
ifndef OPENWRT_VERBOSE
|
|
OPENWRT_VERBOSE:=
|
|
endif
|
|
ifeq ("$(origin V)", "command line")
|
|
OPENWRT_VERBOSE:=$(V)
|
|
endif
|
|
|
|
ifeq ($(OPENWRT_VERBOSE),1)
|
|
OPENWRT_VERBOSE:=w
|
|
endif
|
|
ifeq ($(OPENWRT_VERBOSE),99)
|
|
OPENWRT_VERBOSE:=s
|
|
endif
|
|
|
|
ifeq ($(NO_TRACE_MAKE),)
|
|
NO_TRACE_MAKE := $(MAKE) V=s$(OPENWRT_VERBOSE)
|
|
export NO_TRACE_MAKE
|
|
endif
|
|
|
|
ifeq ($(IS_TTY),1)
|
|
ifneq ($(strip $(NO_COLOR)),1)
|
|
_Y:=\\033[33m
|
|
_R:=\\033[31m
|
|
_N:=\\033[m
|
|
endif
|
|
endif
|
|
|
|
define ERROR_MESSAGE
|
|
{ \
|
|
printf "$(_R)%s$(_N)\n" "$(1)" >&9 || \
|
|
printf "$(_R)%s$(_N)\n" "$(1)"; \
|
|
} >&2 2>/dev/null
|
|
endef
|
|
|
|
ifeq ($(findstring s,$(OPENWRT_VERBOSE)),)
|
|
define MESSAGE
|
|
{ \
|
|
printf "$(_Y)%s$(_N)\n" "$(1)" >&8 || \
|
|
printf "$(_Y)%s$(_N)\n" "$(1)"; \
|
|
} 2>/dev/null
|
|
endef
|
|
|
|
ifeq ($(QUIET),1)
|
|
ifneq ($(CURDIR),$(TOPDIR))
|
|
_DIR:=$(patsubst $(TOPDIR)/%,%,${CURDIR})
|
|
else
|
|
_DIR:=
|
|
endif
|
|
_MESSAGE:=$(if $(MAKECMDGOALS),$(shell \
|
|
$(call MESSAGE, make[$(MAKELEVEL)]$(if $(_DIR), -C $(_DIR)) $(MAKECMDGOALS)); \
|
|
))
|
|
ifneq ($(strip $(_MESSAGE)),)
|
|
$(info $(_MESSAGE))
|
|
endif
|
|
SUBMAKE=$(MAKE)
|
|
else
|
|
SILENT:=>/dev/null $(if $(findstring w,$(OPENWRT_VERBOSE)),,2>&1)
|
|
export QUIET:=1
|
|
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
|
|
endif
|
|
|
|
.SILENT: $(MAKECMDGOALS)
|
|
else
|
|
SUBMAKE=$(MAKE) -w
|
|
define MESSAGE
|
|
printf "%s\n" "$(1)"
|
|
endef
|
|
endif
|