Am April 27, 2020 12:29:29 AM UTC schrieb Simon Glass <[email protected]>: >At present U-Boot always builds dtc if CONFIG_OF_CONTROL is defined. >This >is wasteful when the system already has a suitable version available. > >Update the Makefile logic to build dtc only if the version available is >too old. > >This saves about 2.5 seconds of elapsed time on a clean build for me. > >- Add a patch to bring back the dtc-version.sh script >- Update the check to make sure libfdt is available if needed
U -Boot has been set up to create reproducible builds. With this patch dtc will have to be made a build dependency to provide reproducibility. Cf. https://www.debian.org/doc/debian-policy/ch-source.html#reproducibility This may require changes in the packaging of U-Boot in Linux distributions. Nothing to stop this patch, just something to keep in mind. You presume that future versions of dtc will always be backward compatible with U-Boot. Ok, we do the same for other tools like gcc too (with surprises at each new major release). Cc: Vagrant Best regards Heinrich > >Signed-off-by: Simon Glass <[email protected]> >--- > > Makefile | 21 ++++++++++++++++++--- > dts/Kconfig | 4 ---- > scripts/Kbuild.include | 5 ++++- > scripts/Makefile | 1 - > scripts/dtc-version.sh | 36 +++++++++++++++++++++++++++++++----- > 5 files changed, 53 insertions(+), 14 deletions(-) > >diff --git a/Makefile b/Makefile >index b8a4b5058a..90cb83ed32 100644 >--- a/Makefile >+++ b/Makefile >@@ -410,7 +410,12 @@ PERL = perl > PYTHON ?= python > PYTHON2 = python2 > PYTHON3 = python3 >-DTC ?= $(objtree)/scripts/dtc/dtc >+ >+# DTC is automatically built if the version of $(DTC) is older that >needed. >+# Use the system dtc if it is new enough. >+DTC ?= dtc >+DTC_MIN_VERSION := 010406 >+ > CHECK = sparse > > CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \ >@@ -1797,12 +1802,12 @@ include/config/uboot.release: >include/config/auto.conf FORCE > # version.h and scripts_basic is processed / created. > > # Listed in dependency order >-PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3 >+PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3 >prepare4 > ># prepare3 is used to check if we are building in a separate output >directory, > # and if so do: ># 1) Check that make has not been executed in the kernel src $(srctree) >-prepare3: include/config/uboot.release >+prepare4: include/config/uboot.release > ifneq ($(KBUILD_SRC),) > @$(kecho) ' Using $(srctree) as source for U-Boot' > $(Q)if [ -f $(srctree)/.config -o -d $(srctree)/include/config ]; then >\ >@@ -1812,6 +1817,14 @@ ifneq ($(KBUILD_SRC),) > fi; > endif > >+# Checks for dtc and builds it if needed >+prepare3: prepare4 >+ $(eval DTC := $(call >dtc-version,010406,$(build_dtc),$(CONFIG_PYLIBFDT))) >+ echo here $(DTC) $(build_dtc) >+ if test "$(DTC)" = "$(build_dtc)"; then \ >+ $(MAKE) $(build)=scripts/dtc; \ >+ fi >+ > # prepare2 creates a makefile if using a separate output directory > prepare2: prepare3 outputmakefile cfg > >@@ -1963,6 +1976,8 @@ SYSTEM_MAP = \ > System.map: u-boot > @$(call SYSTEM_MAP,$<) > $@ > >+build_dtc := $(objtree)/scripts/dtc/dtc >+ >######################################################################### > > # ARM relocations should all be R_ARM_RELATIVE (32-bit) or >diff --git a/dts/Kconfig b/dts/Kconfig >index 046a54a173..f8b808606c 100644 >--- a/dts/Kconfig >+++ b/dts/Kconfig >@@ -5,9 +5,6 @@ > config SUPPORT_OF_CONTROL > bool > >-config DTC >- bool >- > config PYLIBFDT > bool > >@@ -24,7 +21,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/Kbuild.include b/scripts/Kbuild.include >index b34dedade7..8c167cef2d 100644 >--- a/scripts/Kbuild.include >+++ b/scripts/Kbuild.include >@@ -151,8 +151,11 @@ cc-fullversion = $(shell $(CONFIG_SHELL) \ >cc-ifversion = $(shell [ $(cc-version) $(1) $(2) ] && echo $(3) || echo >$(4)) > > # added for U-Boot >+# $1: min_version >+# 32: build_dtc >+# $3: need_pylibfdt >binutils-version = $(shell $(CONFIG_SHELL) >$(srctree)/scripts/binutils-version.sh $(AS)) >-dtc-version = $(shell $(CONFIG_SHELL) >$(srctree)/scripts/dtc-version.sh $(DTC)) >+dtc-version = $(shell $(CONFIG_SHELL) >$(srctree)/scripts/dtc-version.sh $(DTC) $1 $2 $3) > > # cc-ldoption > # Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both) >diff --git a/scripts/Makefile b/scripts/Makefile >index e7b353f77f..cfe9fef804 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 0744c39eb0..75ba82830d 100755 >--- a/scripts/dtc-version.sh >+++ b/scripts/dtc-version.sh >@@ -1,12 +1,26 @@ > #!/bin/sh > # >-# dtc-version dtc-command >+# dtc-version dtc_command min_version build_dtc need_pylibfdt > # >-# Prints the dtc version of `dtc-command' in a canonical 6-digit form >-# such as `010404' for dtc 1.4.4 >+# Selects which version of dtc to use >+# >+# If need_pylibfdt is non-empty then the script first checks that the >Python >+# libfdt library is available. If not it outputs $build_dtc and exits >+# >+# Otherwise, if the version of dtc_command is < min_version, prints >build_dtc >+# else prints dtc_command. The min_version is in the format MMmmpp >where: >+# >+# MM is the major version >+# mm is the minor version >+# pp is the patch level >+# >+# For example 010406 means 1.4.6 > # > >-dtc="$*" >+dtc="$1" >+min_version="$2" >+build_dtc="$3" >+need_pylibfdt="$4" > > if [ ${#dtc} -eq 0 ]; then > echo "Error: No dtc command specified." >@@ -14,8 +28,20 @@ if [ ${#dtc} -eq 0 ]; then > exit 1 > fi > >+if [ -n "${need_pylibfdt}" ]; then >+ if ! echo "import libfdt" | python3 2>/dev/null; then >+ echo $build_dtc >+ exit 0 >+ fi >+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 >+version="$(printf "%02d%02d%02d" $MAJOR $MINOR $PATCH)" >+if test $version -lt $min_version; then \ >+ echo $build_dtc >+else >+ echo $dtc >+fi

