Makefile: Only build dtc if needed

At present U-Boot always builds dtc if CONFIG_OF_CONTROL is defined, even
when DTC is provided. The built dtc is not actually used, so this is a
waste of time.

Update the Makefile logic to build dtc only if one is not provided to the
build with the DTC variable. Add documentation to explain this.

This saves about 3.5 seconds of elapsed time on a clean build of
sandbox_spl for me.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2021-09-22 11:34:44 -06:00 committed by Tom Rini
parent d7faa082a5
commit 93b1965322
5 changed files with 55 additions and 8 deletions

View File

@ -415,7 +415,13 @@ PERL = perl
PYTHON ?= python PYTHON ?= python
PYTHON2 = python2 PYTHON2 = python2
PYTHON3 ?= python3 PYTHON3 ?= python3
DTC ?= $(objtree)/scripts/dtc/dtc
# The devicetree compiler and pylibfdt are automatically built unless DTC is
# provided. If DTC is provided, it is assumed the pylibfdt is available too.
DTC_INTREE := $(objtree)/scripts/dtc/dtc
DTC ?= $(DTC_INTREE)
DTC_MIN_VERSION := 010406
CHECK = sparse CHECK = sparse
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \ CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
@ -1954,9 +1960,29 @@ endif
endif endif
# Check dtc and pylibfdt, if DTC is provided, else build them
PHONY += scripts_dtc PHONY += scripts_dtc
scripts_dtc: scripts_basic scripts_dtc: scripts_basic
$(Q)$(MAKE) $(build)=scripts/dtc $(Q)if test "$(DTC)" = "$(DTC_INTREE)"; then \
$(MAKE) $(build)=scripts/dtc; \
else \
if ! $(DTC) -v >/dev/null; then \
echo '*** Failed to check dtc version: $(DTC)'; \
false; \
else \
if test "$(call dtc-version)" -lt $(DTC_MIN_VERSION); then \
echo '*** Your dtc is too old, please upgrade to dtc $(DTC_MIN_VERSION) or newer'; \
false; \
else \
if [ -n "$(CONFIG_PYLIBFDT)" ]; then \
if ! echo "import libfdt" | $(PYTHON3) 2>/dev/null; then \
echo '*** pylibfdt does not seem to be available with $(PYTHON3)'; \
false; \
fi; \
fi; \
fi; \
fi; \
fi
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
quiet_cmd_cpp_lds = LDS $@ quiet_cmd_cpp_lds = LDS $@

21
doc/build/gcc.rst vendored
View File

@ -120,6 +120,27 @@ Further important build parameters are
* O=<dir> - generate all output files in directory <dir>, including .config * O=<dir> - generate all output files in directory <dir>, including .config
* V=1 - verbose build * V=1 - verbose build
Devicetree compiler
~~~~~~~~~~~~~~~~~~~
Boards that use `CONFIG_OF_CONTROL` (i.e. almost all of them) need the
devicetree compiler (dtc). Those with `CONFIG_PYLIBFDT` need pylibfdt, a Python
library for accessing devicetree data. Suitable versions of these are included
in the U-Boot tree in `scripts/dtc` and built automatically as needed.
To use the system versions of these, use the DTC parameter, for example
.. code-block:: bash
DTC=/usr/bin/dtc make
In this case, dtc and pylibfdt are not built. The build checks that the version
of dtc is new enough. It also makes sure that pylibfdt is present, if needed
(see `scripts_dtc` in the Makefile).
Note that the :doc:`tools` are always built with the included version of libfdt
so it is not possible to build U-Boot tools with a system libfdt, at present.
Other build targets Other build targets
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~

View File

@ -5,9 +5,6 @@
config SUPPORT_OF_CONTROL config SUPPORT_OF_CONTROL
bool bool
config DTC
bool
config PYLIBFDT config PYLIBFDT
bool bool
@ -42,7 +39,6 @@ menu "Device Tree Control"
config OF_CONTROL config OF_CONTROL
bool "Run-time configuration via Device Tree" bool "Run-time configuration via Device Tree"
select DTC
select OF_LIBFDT if !OF_PLATDATA select OF_LIBFDT if !OF_PLATDATA
select OF_REAL if !OF_PLATDATA select OF_REAL if !OF_PLATDATA
help help

View File

@ -10,4 +10,3 @@ always := $(hostprogs-y)
# Let clean descend into subdirs # Let clean descend into subdirs
subdir- += basic kconfig subdir- += basic kconfig
subdir-$(CONFIG_DTC) += dtc

View File

@ -10,11 +10,16 @@
dtc="$*" dtc="$*"
if [ ${#dtc} -eq 0 ]; then if [ ${#dtc} -eq 0 ]; then
echo "Error: No dtc command specified." echo "Error: No dtc command specified"
printf "Usage:\n\t$0 <dtc-command>\n" printf "Usage:\n\t$0 <dtc-command>\n"
exit 1 exit 1
fi fi
if ! which $dtc >/dev/null ; then
echo "Error: Cannot find dtc: $dtc"
exit 1
fi
MAJOR=$($dtc -v | head -1 | awk '{print $NF}' | cut -d . -f 1) MAJOR=$($dtc -v | head -1 | awk '{print $NF}' | cut -d . -f 1)
MINOR=$($dtc -v | head -1 | awk '{print $NF}' | cut -d . -f 2) MINOR=$($dtc -v | head -1 | awk '{print $NF}' | cut -d . -f 2)
PATCH=$($dtc -v | head -1 | awk '{print $NF}' | cut -d . -f 3 | cut -d - -f 1) PATCH=$($dtc -v | head -1 | awk '{print $NF}' | cut -d . -f 3 | cut -d - -f 1)