build: unify verbosity handling
This change introduces a few helper variables for dealing with verbose
and silent build modes: `silent`, `verbose`, `q` and `s`.
The `silent` and `verbose` variables are boolean values determining
whether the build system has been configured to run silently or
verbosely respectively (i.e. with `--silent` or `V=1`).
These two modes cannot be used together - if `silent` is truthy then
`verbose` is always falsy. As such:
make --silent V=1
... results in a silent build.
In addition to these boolean variables, we also introduce two new
variables - `s` and `q` - for use in rule recipes to conditionally
suppress the output of commands.
When building silently, `s` expands to a value which disables the
command that follows, and `q` expands to a value which supppresses
echoing of the command:
$(s)echo 'This command is neither echoed nor executed'
$(q)echo 'This command is executed but not echoed'
When building verbosely, `s` expands to a value which disables the
command that follows, and `q` expands to nothing:
$(s)echo 'This command is neither echoed nor executed'
$(q)echo 'This command is executed and echoed'
In all other cases, both `s` and `q` expand to a value which suppresses
echoing of the command that follows:
$(s)echo 'This command is executed but not echoed'
$(q)echo 'This command is executed but not echoed'
The `s` variable is predominantly useful for `echo` commands, where you
always want to suppress echoing of the command itself, whilst `q` is
more useful for all other commands.
Change-Id: I8d8ff6ed714d3cb401946c52955887ed7dca602b
Signed-off-by: Chris Kay <chris.kay@arm.com>
diff --git a/Makefile b/Makefile
index d73fc87..bbde1a7 100644
--- a/Makefile
+++ b/Makefile
@@ -24,6 +24,7 @@
MAKE_HELPERS_DIRECTORY := make_helpers/
include ${MAKE_HELPERS_DIRECTORY}build_macros.mk
include ${MAKE_HELPERS_DIRECTORY}build_env.mk
+include ${MAKE_HELPERS_DIRECTORY}common.mk
################################################################################
# Default values for build configurations, and their dependencies
@@ -93,23 +94,10 @@
# Process build options
################################################################################
-# Verbose flag
-ifeq (${V},0)
- Q:=@
- ECHO:=@echo
+ifeq ($(verbose),)
CHECKCODE_ARGS += --no-summary --terse
-else
- Q:=
- ECHO:=$(ECHO_QUIET)
-endif
-
-ifneq ($(findstring s,$(filter-out --%,$(MAKEFLAGS))),)
- Q:=@
- ECHO:=$(ECHO_QUIET)
endif
-export Q ECHO
-
################################################################################
# Auxiliary tools (fiptool, cert_create, etc)
################################################################################
@@ -1477,7 +1465,7 @@
all: msg_start
msg_start:
- @echo "Building ${PLAT}"
+ $(s)echo "Building ${PLAT}"
ifeq (${ERROR_DEPRECATED},0)
# Check if deprecated declarations and cpp warnings should be treated as error or not.
@@ -1573,11 +1561,11 @@
# Add Secure Partition packages
ifeq (${NEED_SP_PKG},yes)
$(BUILD_PLAT)/sp_gen.mk: ${SP_MK_GEN} ${SP_LAYOUT_FILE} | ${BUILD_PLAT}
- @${PYTHON} "$<" "$@" $(filter-out $<,$^) $(BUILD_PLAT) ${COT} ${SP_DTS_LIST_FRAGMENT}
+ $(q)${PYTHON} "$<" "$@" $(filter-out $<,$^) $(BUILD_PLAT) ${COT} ${SP_DTS_LIST_FRAGMENT}
sp: $(DTBS) $(BUILD_PLAT)/sp_gen.mk $(SP_PKGS)
- @${ECHO_BLANK_LINE}
- @echo "Built SP Images successfully"
- @${ECHO_BLANK_LINE}
+ $(s)echo
+ $(s)echo "Built SP Images successfully"
+ $(s)echo
endif #(NEED_SP_PKG)
locate-checkpatch:
@@ -1590,37 +1578,37 @@
endif #(CHECKPATCH)
clean:
- @echo " CLEAN"
+ $(s)echo " CLEAN"
$(call SHELL_REMOVE_DIR,${BUILD_PLAT})
ifdef UNIX_MK
- ${Q}${MAKE} --no-print-directory -C ${FIPTOOLPATH} clean
+ $(q)${MAKE} --no-print-directory -C ${FIPTOOLPATH} clean
else
# Clear the MAKEFLAGS as we do not want
# to pass the gnumake flags to nmake.
- ${Q}set MAKEFLAGS= && ${MSVC_NMAKE} /nologo /f ${FIPTOOLPATH}/Makefile.msvc FIPTOOLPATH=$(subst /,\,$(FIPTOOLPATH)) FIPTOOL=$(subst /,\,$(FIPTOOL)) clean
+ $(q)set MAKEFLAGS= && ${MSVC_NMAKE} /nologo /f ${FIPTOOLPATH}/Makefile.msvc FIPTOOLPATH=$(subst /,\,$(FIPTOOLPATH)) FIPTOOL=$(subst /,\,$(FIPTOOL)) clean
endif #(UNIX_MK)
- ${Q}${MAKE} PLAT=${PLAT} --no-print-directory -C ${CRTTOOLPATH} clean
- ${Q}${MAKE} PLAT=${PLAT} --no-print-directory -C ${ENCTOOLPATH} clean
- ${Q}${MAKE} --no-print-directory -C ${ROMLIBPATH} clean
+ $(q)${MAKE} PLAT=${PLAT} --no-print-directory -C ${CRTTOOLPATH} clean
+ $(q)${MAKE} PLAT=${PLAT} --no-print-directory -C ${ENCTOOLPATH} clean
+ $(q)${MAKE} --no-print-directory -C ${ROMLIBPATH} clean
realclean distclean:
- @echo " REALCLEAN"
+ $(s)echo " REALCLEAN"
$(call SHELL_REMOVE_DIR,${BUILD_BASE})
$(call SHELL_DELETE_ALL, ${CURDIR}/cscope.*)
ifdef UNIX_MK
- ${Q}${MAKE} --no-print-directory -C ${FIPTOOLPATH} clean
+ $(q)${MAKE} --no-print-directory -C ${FIPTOOLPATH} clean
else
# Clear the MAKEFLAGS as we do not want
# to pass the gnumake flags to nmake.
- ${Q}set MAKEFLAGS= && ${MSVC_NMAKE} /nologo /f ${FIPTOOLPATH}/Makefile.msvc FIPTOOLPATH=$(subst /,\,$(FIPTOOLPATH)) FIPTOOL=$(subst /,\,$(FIPTOOL)) realclean
+ $(q)set MAKEFLAGS= && ${MSVC_NMAKE} /nologo /f ${FIPTOOLPATH}/Makefile.msvc FIPTOOLPATH=$(subst /,\,$(FIPTOOLPATH)) FIPTOOL=$(subst /,\,$(FIPTOOL)) realclean
endif #(UNIX_MK)
- ${Q}${MAKE} PLAT=${PLAT} --no-print-directory -C ${CRTTOOLPATH} realclean
- ${Q}${MAKE} PLAT=${PLAT} --no-print-directory -C ${ENCTOOLPATH} realclean
- ${Q}${MAKE} --no-print-directory -C ${ROMLIBPATH} clean
+ $(q)${MAKE} PLAT=${PLAT} --no-print-directory -C ${CRTTOOLPATH} realclean
+ $(q)${MAKE} PLAT=${PLAT} --no-print-directory -C ${ENCTOOLPATH} realclean
+ $(q)${MAKE} --no-print-directory -C ${ROMLIBPATH} clean
checkcodebase: locate-checkpatch
- @echo " CHECKING STYLE"
- @if test -d .git ; then \
+ $(s)echo " CHECKING STYLE"
+ $(q)if test -d .git ; then \
git ls-files | grep -E -v 'libfdt|libc|docs|\.rst' | \
while read GIT_FILE ; \
do ${CHECKPATCH} ${CHECKCODE_ARGS} -f $$GIT_FILE ; \
@@ -1636,11 +1624,11 @@
fi
checkpatch: locate-checkpatch
- @echo " CHECKING STYLE"
- @if test -n "${CHECKPATCH_OPTS}"; then \
+ $(s)echo " CHECKING STYLE"
+ $(q)if test -n "${CHECKPATCH_OPTS}"; then \
echo " with ${CHECKPATCH_OPTS} option(s)"; \
fi
- ${Q}COMMON_COMMIT=$$(git merge-base HEAD ${BASE_COMMIT}); \
+ $(q)COMMON_COMMIT=$$(git merge-base HEAD ${BASE_COMMIT}); \
for commit in `git rev-list --no-merges $$COMMON_COMMIT..HEAD`; \
do \
printf "\n[*] Checking style of '$$commit'\n\n"; \
@@ -1655,44 +1643,44 @@
certtool: ${CRTTOOL}
${CRTTOOL}: FORCE
- ${Q}${MAKE} PLAT=${PLAT} USE_TBBR_DEFS=${USE_TBBR_DEFS} COT=${COT} OPENSSL_DIR=${OPENSSL_DIR} CRTTOOL=${CRTTOOL} DEBUG=${DEBUG} V=${V} --no-print-directory -C ${CRTTOOLPATH} all
- @${ECHO_BLANK_LINE}
- @echo "Built $@ successfully"
- @${ECHO_BLANK_LINE}
+ $(q)${MAKE} PLAT=${PLAT} USE_TBBR_DEFS=${USE_TBBR_DEFS} COT=${COT} OPENSSL_DIR=${OPENSSL_DIR} CRTTOOL=${CRTTOOL} DEBUG=${DEBUG} --no-print-directory -C ${CRTTOOLPATH} all
+ $(s)echo
+ $(s)echo "Built $@ successfully"
+ $(s)echo
ifneq (${GENERATE_COT},0)
certificates: ${CRT_DEPS} ${CRTTOOL}
- ${Q}${CRTTOOL} ${CRT_ARGS}
- @${ECHO_BLANK_LINE}
- @echo "Built $@ successfully"
- @echo "Certificates can be found in ${BUILD_PLAT}"
- @${ECHO_BLANK_LINE}
+ $(q)${CRTTOOL} ${CRT_ARGS}
+ $(s)echo
+ $(s)echo "Built $@ successfully"
+ $(s)echo "Certificates can be found in ${BUILD_PLAT}"
+ $(s)echo
endif #(GENERATE_COT)
${BUILD_PLAT}/${FIP_NAME}: ${FIP_DEPS} ${FIPTOOL}
$(eval ${CHECK_FIP_CMD})
- ${Q}${FIPTOOL} create ${FIP_ARGS} $@
- ${Q}${FIPTOOL} info $@
- @${ECHO_BLANK_LINE}
- @echo "Built $@ successfully"
- @${ECHO_BLANK_LINE}
+ $(q)${FIPTOOL} create ${FIP_ARGS} $@
+ $(q)${FIPTOOL} info $@
+ $(s)echo
+ $(s)echo "Built $@ successfully"
+ $(s)echo
ifneq (${GENERATE_COT},0)
fwu_certificates: ${FWU_CRT_DEPS} ${CRTTOOL}
- ${Q}${CRTTOOL} ${FWU_CRT_ARGS}
- @${ECHO_BLANK_LINE}
- @echo "Built $@ successfully"
- @echo "FWU certificates can be found in ${BUILD_PLAT}"
- @${ECHO_BLANK_LINE}
+ $(q)${CRTTOOL} ${FWU_CRT_ARGS}
+ $(s)echo
+ $(s)echo "Built $@ successfully"
+ $(s)echo "FWU certificates can be found in ${BUILD_PLAT}"
+ $(s)echo
endif #(GENERATE_COT)
${BUILD_PLAT}/${FWU_FIP_NAME}: ${FWU_FIP_DEPS} ${FIPTOOL}
$(eval ${CHECK_FWU_FIP_CMD})
- ${Q}${FIPTOOL} create ${FWU_FIP_ARGS} $@
- ${Q}${FIPTOOL} info $@
- @${ECHO_BLANK_LINE}
- @echo "Built $@ successfully"
- @${ECHO_BLANK_LINE}
+ $(q)${FIPTOOL} create ${FWU_FIP_ARGS} $@
+ $(q)${FIPTOOL} info $@
+ $(s)echo
+ $(s)echo "Built $@ successfully"
+ $(s)echo
fiptool: ${FIPTOOL}
fip: ${BUILD_PLAT}/${FIP_NAME}
@@ -1700,85 +1688,85 @@
${FIPTOOL}: FORCE
ifdef UNIX_MK
- ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" FIPTOOL=${FIPTOOL} OPENSSL_DIR=${OPENSSL_DIR} DEBUG=${DEBUG} V=${V} --no-print-directory -C ${FIPTOOLPATH} all
+ $(q)${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" FIPTOOL=${FIPTOOL} OPENSSL_DIR=${OPENSSL_DIR} DEBUG=${DEBUG} --no-print-directory -C ${FIPTOOLPATH} all
else
# Clear the MAKEFLAGS as we do not want
# to pass the gnumake flags to nmake.
- ${Q}set MAKEFLAGS= && ${MSVC_NMAKE} /nologo /f ${FIPTOOLPATH}/Makefile.msvc FIPTOOLPATH=$(subst /,\,$(FIPTOOLPATH)) FIPTOOL=$(subst /,\,$(FIPTOOL))
+ $(q)set MAKEFLAGS= && ${MSVC_NMAKE} /nologo /f ${FIPTOOLPATH}/Makefile.msvc FIPTOOLPATH=$(subst /,\,$(FIPTOOLPATH)) FIPTOOL=$(subst /,\,$(FIPTOOL))
endif #(UNIX_MK)
romlib.bin: libraries FORCE
- ${Q}${MAKE} PLAT_DIR=${PLAT_DIR} BUILD_PLAT=${BUILD_PLAT} ENABLE_BTI=${ENABLE_BTI} ARM_ARCH_MINOR=${ARM_ARCH_MINOR} INCLUDES=$(call escape-shell,$(INCLUDES)) DEFINES=$(call escape-shell,$(DEFINES)) --no-print-directory -C ${ROMLIBPATH} all
+ $(q)${MAKE} PLAT_DIR=${PLAT_DIR} BUILD_PLAT=${BUILD_PLAT} ENABLE_BTI=${ENABLE_BTI} ARM_ARCH_MINOR=${ARM_ARCH_MINOR} INCLUDES=$(call escape-shell,$(INCLUDES)) DEFINES=$(call escape-shell,$(DEFINES)) --no-print-directory -C ${ROMLIBPATH} all
memmap: all
ifdef UNIX_MK
- ${Q}PYTHONPATH=${CURDIR}/tools/memory \
+ $(q)PYTHONPATH=${CURDIR}/tools/memory \
${PYTHON} -m memory.memmap -sr ${BUILD_PLAT}
else
- ${Q}set PYTHONPATH=${CURDIR}/tools/memory && \
+ $(q)set PYTHONPATH=${CURDIR}/tools/memory && \
${PYTHON} -m memory.memmap -sr ${BUILD_PLAT}
endif
doc:
- @echo " BUILD DOCUMENTATION"
- ${Q}${MAKE} --no-print-directory -C ${DOCS_PATH} html
+ $(s)echo " BUILD DOCUMENTATION"
+ $(q)${MAKE} --no-print-directory -C ${DOCS_PATH} html
enctool: ${ENCTOOL}
${ENCTOOL}: FORCE
- ${Q}${MAKE} PLAT=${PLAT} BUILD_INFO=0 OPENSSL_DIR=${OPENSSL_DIR} ENCTOOL=${ENCTOOL} DEBUG=${DEBUG} V=${V} --no-print-directory -C ${ENCTOOLPATH} all
- @${ECHO_BLANK_LINE}
- @echo "Built $@ successfully"
- @${ECHO_BLANK_LINE}
+ $(q)${MAKE} PLAT=${PLAT} BUILD_INFO=0 OPENSSL_DIR=${OPENSSL_DIR} ENCTOOL=${ENCTOOL} DEBUG=${DEBUG} --no-print-directory -C ${ENCTOOLPATH} all
+ $(s)echo
+ $(s)echo "Built $@ successfully"
+ $(s)echo
cscope:
- @echo " CSCOPE"
- ${Q}find ${CURDIR} -name "*.[chsS]" > cscope.files
- ${Q}cscope -b -q -k
+ $(s)echo " CSCOPE"
+ $(q)find ${CURDIR} -name "*.[chsS]" > cscope.files
+ $(q)cscope -b -q -k
help:
- @echo "usage: ${MAKE} [PLAT=<platform>] [OPTIONS] [TARGET]"
- @echo ""
- @echo "PLAT is used to specify which platform you wish to build."
- @echo "If no platform is specified, PLAT defaults to: ${DEFAULT_PLAT}"
- @echo ""
- @echo "platform = ${PLATFORM_LIST}"
- @echo ""
- @echo "Please refer to the User Guide for a list of all supported options."
- @echo "Note that the build system doesn't track dependencies for build "
- @echo "options. Therefore, if any of the build options are changed "
- @echo "from a previous build, a clean build must be performed."
- @echo ""
- @echo "Supported Targets:"
- @echo " all Build all individual bootloader binaries"
- @echo " bl1 Build the BL1 binary"
- @echo " bl2 Build the BL2 binary"
- @echo " bl2u Build the BL2U binary"
- @echo " bl31 Build the BL31 binary"
- @echo " bl32 Build the BL32 binary. If ARCH=aarch32, then "
- @echo " this builds secure payload specified by AARCH32_SP"
- @echo " certificates Build the certificates (requires 'GENERATE_COT=1')"
- @echo " fip Build the Firmware Image Package (FIP)"
- @echo " fwu_fip Build the FWU Firmware Image Package (FIP)"
- @echo " checkcodebase Check the coding style of the entire source tree"
- @echo " checkpatch Check the coding style on changes in the current"
- @echo " branch against BASE_COMMIT (default origin/master)"
- @echo " clean Clean the build for the selected platform"
- @echo " cscope Generate cscope index"
- @echo " distclean Remove all build artifacts for all platforms"
- @echo " certtool Build the Certificate generation tool"
- @echo " enctool Build the Firmware encryption tool"
- @echo " fiptool Build the Firmware Image Package (FIP) creation tool"
- @echo " sp Build the Secure Partition Packages"
- @echo " sptool Build the Secure Partition Package creation tool"
- @echo " dtbs Build the Device Tree Blobs (if required for the platform)"
- @echo " memmap Print the memory map of the built binaries"
- @echo " doc Build html based documentation using Sphinx tool"
- @echo ""
- @echo "Note: most build targets require PLAT to be set to a specific platform."
- @echo ""
- @echo "example: build all targets for the FVP platform:"
- @echo " CROSS_COMPILE=aarch64-none-elf- make PLAT=fvp all"
+ $(s)echo "usage: ${MAKE} [PLAT=<platform>] [OPTIONS] [TARGET]"
+ $(s)echo ""
+ $(s)echo "PLAT is used to specify which platform you wish to build."
+ $(s)echo "If no platform is specified, PLAT defaults to: ${DEFAULT_PLAT}"
+ $(s)echo ""
+ $(s)echo "platform = ${PLATFORM_LIST}"
+ $(s)echo ""
+ $(s)echo "Please refer to the User Guide for a list of all supported options."
+ $(s)echo "Note that the build system doesn't track dependencies for build "
+ $(s)echo "options. Therefore, if any of the build options are changed "
+ $(s)echo "from a previous build, a clean build must be performed."
+ $(s)echo ""
+ $(s)echo "Supported Targets:"
+ $(s)echo " all Build all individual bootloader binaries"
+ $(s)echo " bl1 Build the BL1 binary"
+ $(s)echo " bl2 Build the BL2 binary"
+ $(s)echo " bl2u Build the BL2U binary"
+ $(s)echo " bl31 Build the BL31 binary"
+ $(s)echo " bl32 Build the BL32 binary. If ARCH=aarch32, then "
+ $(s)echo " this builds secure payload specified by AARCH32_SP"
+ $(s)echo " certificates Build the certificates (requires 'GENERATE_COT=1')"
+ $(s)echo " fip Build the Firmware Image Package (FIP)"
+ $(s)echo " fwu_fip Build the FWU Firmware Image Package (FIP)"
+ $(s)echo " checkcodebase Check the coding style of the entire source tree"
+ $(s)echo " checkpatch Check the coding style on changes in the current"
+ $(s)echo " branch against BASE_COMMIT (default origin/master)"
+ $(s)echo " clean Clean the build for the selected platform"
+ $(s)echo " cscope Generate cscope index"
+ $(s)echo " distclean Remove all build artifacts for all platforms"
+ $(s)echo " certtool Build the Certificate generation tool"
+ $(s)echo " enctool Build the Firmware encryption tool"
+ $(s)echo " fiptool Build the Firmware Image Package (FIP) creation tool"
+ $(s)echo " sp Build the Secure Partition Packages"
+ $(s)echo " sptool Build the Secure Partition Package creation tool"
+ $(s)echo " dtbs Build the Device Tree Blobs (if required for the platform)"
+ $(s)echo " memmap Print the memory map of the built binaries"
+ $(s)echo " doc Build html based documentation using Sphinx tool"
+ $(s)echo ""
+ $(s)echo "Note: most build targets require PLAT to be set to a specific platform."
+ $(s)echo ""
+ $(s)echo "example: build all targets for the FVP platform:"
+ $(s)echo " CROSS_COMPILE=aarch64-none-elf- make PLAT=fvp all"
.PHONY: FORCE
FORCE:;