public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [PATCH v3 1/2] Revert "kbuild: remove unused dtc-version.sh script"
@ 2021-09-22 17:34 Simon Glass
  2021-09-22 17:34 ` [PATCH v3 2/2] Makefile: Only build dtc if needed Simon Glass
  2021-10-20  0:45 ` [PATCH v3 1/2] Revert "kbuild: remove unused dtc-version.sh script" Tom Rini
  0 siblings, 2 replies; 4+ messages in thread
From: Simon Glass @ 2021-09-22 17:34 UTC (permalink / raw)
  To: Tom Rini
  Cc: Marek Vasut, Vagrant Cascadian, Masahiro Yamada,
	Heinrich Schuchardt, Simon Glass, u-boot

We need this to make building dtc optional. It makes no sense to build our
own dtc if the system one works correctly.

This reverts commit ddb87a0b40262ff99d675e946f57427642303938.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v3:
- Add an SPDX header and MAINTAINERS entry

 MAINTAINERS            |  1 +
 scripts/Kbuild.include |  1 +
 scripts/dtc-version.sh | 22 ++++++++++++++++++++++
 3 files changed, 24 insertions(+)
 create mode 100755 scripts/dtc-version.sh

diff --git a/MAINTAINERS b/MAINTAINERS
index 67c96a60454..294d78b52e2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -757,6 +757,7 @@ F:	include/fdt*
 F:	include/linux/libfdt*
 F:	cmd/fdt.c
 F:	common/fdt_support.c
+F:	scripts/dtc-version.sh
 
 FREEBSD
 M:	Rafal Jaworowski <raj@semihalf.com>
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
index a745cc4fccd..09506cb9a7e 100644
--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -148,6 +148,7 @@ cc-ifversion = $(shell [ $(cc-version) $(1) $(2) ] && echo $(3) || echo $(4))
 
 # added for U-Boot
 binutils-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/binutils-version.sh $(AS))
+dtc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/dtc-version.sh $(DTC))
 
 # cc-ldoption
 # Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both)
diff --git a/scripts/dtc-version.sh b/scripts/dtc-version.sh
new file mode 100755
index 00000000000..bd4e818e92d
--- /dev/null
+++ b/scripts/dtc-version.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0+
+#
+# dtc-version dtc-command
+#
+# Prints the dtc version of `dtc-command' in a canonical 6-digit form
+# such as `010404'  for dtc 1.4.4
+#
+
+dtc="$*"
+
+if [ ${#dtc} -eq 0 ]; then
+	echo "Error: No dtc command specified."
+	printf "Usage:\n\t$0 <dtc-command>\n"
+	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)
+
+printf "%02d%02d%02d\\n" $MAJOR $MINOR $PATCH
-- 
2.33.0.685.g46640cef36-goog


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v3 2/2] Makefile: Only build dtc if needed
  2021-09-22 17:34 [PATCH v3 1/2] Revert "kbuild: remove unused dtc-version.sh script" Simon Glass
@ 2021-09-22 17:34 ` Simon Glass
  2021-10-20  0:46   ` Tom Rini
  2021-10-20  0:45 ` [PATCH v3 1/2] Revert "kbuild: remove unused dtc-version.sh script" Tom Rini
  1 sibling, 1 reply; 4+ messages in thread
From: Simon Glass @ 2021-09-22 17:34 UTC (permalink / raw)
  To: Tom Rini
  Cc: Marek Vasut, Vagrant Cascadian, Masahiro Yamada,
	Heinrich Schuchardt, Simon Glass, Bin Meng, Marek Behún,
	Pali Rohár, u-boot

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

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)
-- 
2.33.0.685.g46640cef36-goog


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v3 1/2] Revert "kbuild: remove unused dtc-version.sh script"
  2021-09-22 17:34 [PATCH v3 1/2] Revert "kbuild: remove unused dtc-version.sh script" Simon Glass
  2021-09-22 17:34 ` [PATCH v3 2/2] Makefile: Only build dtc if needed Simon Glass
@ 2021-10-20  0:45 ` Tom Rini
  1 sibling, 0 replies; 4+ messages in thread
From: Tom Rini @ 2021-10-20  0:45 UTC (permalink / raw)
  To: Simon Glass
  Cc: Marek Vasut, Vagrant Cascadian, Masahiro Yamada,
	Heinrich Schuchardt, u-boot

[-- Attachment #1: Type: text/plain, Size: 359 bytes --]

On Wed, Sep 22, 2021 at 11:34:43AM -0600, Simon Glass wrote:

> We need this to make building dtc optional. It makes no sense to build our
> own dtc if the system one works correctly.
> 
> This reverts commit ddb87a0b40262ff99d675e946f57427642303938.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>

Applied to u-boot/master, thanks!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v3 2/2] Makefile: Only build dtc if needed
  2021-09-22 17:34 ` [PATCH v3 2/2] Makefile: Only build dtc if needed Simon Glass
@ 2021-10-20  0:46   ` Tom Rini
  0 siblings, 0 replies; 4+ messages in thread
From: Tom Rini @ 2021-10-20  0:46 UTC (permalink / raw)
  To: Simon Glass
  Cc: Marek Vasut, Vagrant Cascadian, Masahiro Yamada,
	Heinrich Schuchardt, Bin Meng, Marek Behún, Pali Rohár,
	u-boot

[-- Attachment #1: Type: text/plain, Size: 578 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-10-20  0:46 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-09-22 17:34 [PATCH v3 1/2] Revert "kbuild: remove unused dtc-version.sh script" Simon Glass
2021-09-22 17:34 ` [PATCH v3 2/2] Makefile: Only build dtc if needed Simon Glass
2021-10-20  0:46   ` Tom Rini
2021-10-20  0:45 ` [PATCH v3 1/2] Revert "kbuild: remove unused dtc-version.sh script" Tom Rini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox