diff mbox series

[v3,2/2] Makefile: Only build dtc if needed

Message ID 20210922173444.192256-2-sjg@chromium.org
State Accepted
Delegated to: Tom Rini
Headers show
Series [v3,1/2] Revert "kbuild: remove unused dtc-version.sh script" | expand

Commit Message

Simon Glass Sept. 22, 2021, 5:34 p.m. UTC
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>
---

Changes in v3:
- Use DTC_MIN_VERSION instead of hard-coding in the dtc-version call
- Make the logic deterministic, failing if DTC is too old
- Move version checks into Makefile to avoid the complicated version script
- Add documentation
- Update the commit message

Changes in v2:
- Add a patch to bring back the dtc-version.sh script
- Update the check to make sure libfdt is available if needed

 Makefile               | 30 ++++++++++++++++++++++++++++--
 doc/build/gcc.rst      | 21 +++++++++++++++++++++
 dts/Kconfig            |  4 ----
 scripts/Makefile       |  1 -
 scripts/dtc-version.sh |  7 ++++++-
 5 files changed, 55 insertions(+), 8 deletions(-)

Comments

Tom Rini Oct. 20, 2021, 12:46 a.m. UTC | #1
On Wed, Sep 22, 2021 at 11:34:44AM -0600, Simon Glass wrote:

> 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>

Applied to u-boot/master, thanks!
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index 3014788e14e..74ca48c50c3 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__ \
@@ -1973,9 +1979,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 0cdc307d57b..6c4b4ad7a05 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 dabe0080c1e..85d9d397e58 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
 	help
 	  This feature provides for run-time configuration of U-Boot
diff --git a/scripts/Makefile b/scripts/Makefile
index e7b353f77f4..cfe9fef8044 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 bd4e818e92d..bfb514e179f 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)