[PATCH v4 3/4] sandbox: Detect the host bit size automatically

Simon Glass sjg at chromium.org
Sat Jan 22 02:27:35 CET 2022


At present if you build sandbox on a 32-bit host a lot of errors are
produced. This is because CONFIG_HOST_64BIT is enabled by default.

It is quite annoying to have to change that manually before building
sandbox. It is also quite confusing for new users.

Add a way to detect the setting and add the appropriate
CONFIG_HOST_64BIT=y or CONFIG_HOST_32BIT=y to the defconfig, to avoid
this issue.

Tidy up the Kconfig help for the above two options while we are here.

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

Changes in v4:
- Use $(HOSTCC) instead of gcc
- Add proper Kconfig help

Changes in v3:
- Use 'bitness' instead of 'bit'

Changes in v2:
- Drop patches previously applied
- Put all the packages in gcc.rst

 Makefile                 | 11 ++++++++++-
 arch/sandbox/Kconfig     | 33 ++++++++++++++++++++++++++++-----
 scripts/kconfig/Makefile | 14 +++++++++++++-
 3 files changed, 51 insertions(+), 7 deletions(-)

diff --git a/Makefile b/Makefile
index b08bad48738..da9b5e494f8 100644
--- a/Makefile
+++ b/Makefile
@@ -570,8 +570,17 @@ export KBUILD_DEFCONFIG KBUILD_KCONFIG
 config: scripts_basic outputmakefile FORCE
 	$(Q)$(MAKE) $(build)=scripts/kconfig $@
 
+# If nothing is specified explicitly, detect the bit size for sandbox,
+# referred to from arch/sandbox/Kconfig
+# Add it to the end of the defconfig file
 %config: scripts_basic outputmakefile FORCE
-	$(Q)$(MAKE) $(build)=scripts/kconfig $@
+	$(Q)if test -f $(srctree)/configs/$@ && \
+		! grep -Eq "CONFIG_HOST_(32|64)BIT=y" $(srctree)/configs/$@; then \
+		echo '#include <stdio.h>\nint main(void) { printf("CONFIG_HOST_%dBIT=y\\n", __WORDSIZE); return 0; }' \
+			 | $(HOSTCC) -x c - -o get_word_size; \
+		extra=$$(./get_word_size); \
+	fi; \
+	$(MAKE) $(build)=scripts/kconfig EXTRA_DEFCONFIG=$$extra $@
 
 else
 # ===========================================================================
diff --git a/arch/sandbox/Kconfig b/arch/sandbox/Kconfig
index 477c51960da..08d7f3bded6 100644
--- a/arch/sandbox/Kconfig
+++ b/arch/sandbox/Kconfig
@@ -35,19 +35,42 @@ config SYS_CONFIG_NAME
 
 choice
 	prompt "Run sandbox on 32/64-bit host"
-	default HOST_64BIT
+	default HOST_DETECT_BITNESS
 	help
-	  Sandbox can be built on 32-bit and 64-bit hosts.
-	  The default is to build on a 64-bit host and run
-	  on a 64-bit host. If you want to run sandbox on
-	  a 32-bit host, change it here.
+	  Sandbox can be built on 32-bit and 64-bit hosts. This is generally
+	  auto-detected but you can force a particular word size here. If you
+	  see strange warnings about SANDBOX_BITS_PER_LONG then you may have
+	  selected the wrong value.
 
 config HOST_32BIT
 	bool "32-bit host"
 	depends on !PHYS_64BIT
+	help
+	  Select this if the host is a 32-bit machine. This adjusts various
+	  tests and other features to work correctly in this environment. If
+	  this option is enabled on 64-bit machines you may get build warnings
+	  and/or errors.
 
 config HOST_64BIT
 	bool "64-bit host"
+	help
+	  Select this if the host is a 64-bit machine. This adjusts various
+	  tests and other features to work correctly in this environment. If
+	  this option is enabled on 32-bit machines you may get build warnings
+	  and/or errors.
+
+config HOST_DETECT_BITNESS
+	bool "Auto-detect host bitness"
+	help
+	  Select this if you want the build system to determine the bitness
+	  automatically. This compiles a small program during the build, then
+	  runs it to determine the bitness using __WORDSIZE (32 or 64 bits).
+	  Then it adds one of the above options (CONFIG_HOST_32 or
+	  CONFIG_HOST_64) to the configuration when creating it.
+
+	  In rare situations this may fail, e.g. on an unsupported Operating
+	  System or toolchain, in which case you will likely get build warnings
+	  and errors.
 
 endchoice
 
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile
index 12e525ee31f..4e28a7e5973 100644
--- a/scripts/kconfig/Makefile
+++ b/scripts/kconfig/Makefile
@@ -12,6 +12,9 @@ PHONY += xconfig gconfig menuconfig config localmodconfig localyesconfig \
 #  Set SRCARCH to .. fake this Makefile.
 SRCARCH := ..
 
+# For U-Boot, EXTRA_DEFCONFIG contains a line to be added to the defconfig
+# before processing. If empty, no line is added.
+
 ifdef KBUILD_KCONFIG
 Kconfig := $(KBUILD_KCONFIG)
 else
@@ -92,8 +95,17 @@ else
 endif
 endif
 
+# If EXTRA_DEFCONFIG is defined, add it to the end of the defconfig, before
+# processing. This allows the caller to change a setting on the fly
 %_defconfig: $(obj)/conf
-	$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
+	$(Q)defconfig="$(srctree)/arch/$(SRCARCH)/configs/$@"; \
+	if [ -n "$(EXTRA_DEFCONFIG)" ]; then \
+		cat $$defconfig >defconfig_tmp; \
+		echo $(EXTRA_DEFCONFIG) >>defconfig_tmp; \
+		$< $(silent) --defconfig=defconfig_tmp $(Kconfig); \
+	else \
+		$< $(silent) --defconfig=$$defconfig $(Kconfig); \
+	fi
 
 # Added for U-Boot (backward compatibility)
 %_config: %_defconfig
-- 
2.35.0.rc0.227.g00780c9af4-goog



More information about the U-Boot mailing list