aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2021-09-22 11:34:44 -0600
committerTom Rini <trini@konsulko.com>2021-10-19 11:23:07 -0400
commit93b196532254366f653b4d763f69e49ff193f06c (patch)
treef0768d3161c33bd110bd30359517b2ed9fec429d
parentd7faa082a57eeeff9b4bbcc45d3dfed747d99a70 (diff)
downloadu-boot-93b196532254366f653b4d763f69e49ff193f06c.zip
u-boot-93b196532254366f653b4d763f69e49ff193f06c.tar.gz
u-boot-93b196532254366f653b4d763f69e49ff193f06c.tar.bz2
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>
-rw-r--r--Makefile30
-rw-r--r--doc/build/gcc.rst21
-rw-r--r--dts/Kconfig4
-rw-r--r--scripts/Makefile1
-rwxr-xr-xscripts/dtc-version.sh7
5 files changed, 55 insertions, 8 deletions
diff --git a/Makefile b/Makefile
index f911f70..32d29b8 100644
--- a/Makefile
+++ b/Makefile
@@ -415,7 +415,13 @@ PERL = perl
PYTHON ?= python
PYTHON2 = python2
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
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
@@ -1954,9 +1960,29 @@ endif
endif
+# Check dtc and pylibfdt, if DTC is provided, else build them
PHONY += scripts_dtc
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 $@
diff --git a/doc/build/gcc.rst b/doc/build/gcc.rst
index 0cdc307..6c4b4ad 100644
--- a/doc/build/gcc.rst
+++ b/doc/build/gcc.rst
@@ -120,6 +120,27 @@ Further important build parameters are
* O=<dir> - generate all output files in directory <dir>, including .config
* 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
~~~~~~~~~~~~~~~~~~~
diff --git a/dts/Kconfig b/dts/Kconfig
index fc41305..90c7a1c 100644
--- a/dts/Kconfig
+++ b/dts/Kconfig
@@ -5,9 +5,6 @@
config SUPPORT_OF_CONTROL
bool
-config DTC
- bool
-
config PYLIBFDT
bool
@@ -42,7 +39,6 @@ menu "Device Tree Control"
config OF_CONTROL
bool "Run-time configuration via Device Tree"
- select DTC
select OF_LIBFDT if !OF_PLATDATA
select OF_REAL if !OF_PLATDATA
help
diff --git a/scripts/Makefile b/scripts/Makefile
index e7b353f..cfe9fef 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -10,4 +10,3 @@ always := $(hostprogs-y)
# Let clean descend into subdirs
subdir- += basic kconfig
-subdir-$(CONFIG_DTC) += dtc
diff --git a/scripts/dtc-version.sh b/scripts/dtc-version.sh
index bd4e818..bfb514e 100755
--- a/scripts/dtc-version.sh
+++ b/scripts/dtc-version.sh
@@ -10,11 +10,16 @@
dtc="$*"
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"
exit 1
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)
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)