]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
Makefile: Only build dtc if needed
authorSimon Glass <sjg@chromium.org>
Wed, 22 Sep 2021 17:34:44 +0000 (11:34 -0600)
committerTom Rini <trini@konsulko.com>
Tue, 19 Oct 2021 15:23:07 +0000 (11:23 -0400)
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>
Makefile
doc/build/gcc.rst
dts/Kconfig
scripts/Makefile
scripts/dtc-version.sh

index f911f70344305cc2565b856bb5e156f74a9957e0..32d29b87db45ce631a34d2ff73a18607577ae401 100644 (file)
--- 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     $@
index 0cdc307d57bfded2000aaf6e07f5284d9cce23ab..6c4b4ad7a0588d70de5e679751e3393a638a8274 100644 (file)
@@ -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
 ~~~~~~~~~~~~~~~~~~~
 
index fc4130545a924d7e7c70e7c04ba5ea1d8d449aff..90c7a1c5f49edc26da1f325dca42eb39a5ad1b37 100644 (file)
@@ -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
index e7b353f77f43e1d8b572826f3c1d619abd41f17b..cfe9fef804425fe8a0b35216233bd45e588e7e81 100644 (file)
@@ -10,4 +10,3 @@ always                := $(hostprogs-y)
 
 # Let clean descend into subdirs
 subdir-        += basic kconfig
-subdir-$(CONFIG_DTC)   += dtc
index bd4e818e92df61f8a49b41eac57fc77f7dd232b9..bfb514e179f3ec9f7508f7f311f164106d6632fa 100755 (executable)
 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)