diff mbox series

[v3] Xen: Update compiler checks

Message ID 20250327174302.412821-1-andrew.cooper3@citrix.com (mailing list archive)
State New
Headers show
Series [v3] Xen: Update compiler checks | expand

Commit Message

Andrew Cooper March 27, 2025, 5:43 p.m. UTC
We have checks in both xen/compiler.h, and Config.mk.  Both are incomplete.

The check in Config.mk sees $(CC) in system and cross-compiler form, so cannot
express anything more than the global baseline.  Change it to simply 5.1.

In xen/compiler.h, rewrite the expression for clarity/brevity.

Include a GCC 12.2 check for RISCV, and include a Clang 11 baseline check.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Anthony PERARD <anthony.perard@vates.tech>
CC: Michal Orzel <michal.orzel@amd.com>
CC: Jan Beulich <jbeulich@suse.com>
CC: Julien Grall <julien@xen.org>
CC: Roger Pau Monné <roger.pau@citrix.com>
CC: Stefano Stabellini <sstabellini@kernel.org>
CC: Oleksii Kurochko <oleksii.kurochko@gmail.com>

v3:
 * Reinstate the xen/compiler.h block
 * Restrict Config.mk to the baseline only
v2:
 * Change to altering Config.mk

https://gitlab.com/xen-project/people/andyhhp/xen/-/pipelines/1738778376 with
the CI changes reverted, so as to expect failures for CentOS 7 and earlier
Ubuntu Clangs.

The $(eval $(check-y)) is badly positioned:

  xen.git/xen$ make
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
    HOSTCC  tools/fixdep
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  make[1]: *** [scripts/Makefile.host:108: tools/fixdep] Error 1
    HOSTCC  tools/symbols
  *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
  make[1]: *** [scripts/Makefile.host:108: tools/symbols] Error 1
  make: *** [Makefile:610: xen] Error 2

It is involved every time Config.mk is included, rather than once per `make`
invocation.
---
 Config.mk                  |  4 ++--
 xen/include/xen/compiler.h | 26 ++++++++++++++------------
 2 files changed, 16 insertions(+), 14 deletions(-)

Comments

Jan Beulich March 28, 2025, 7:43 a.m. UTC | #1
On 27.03.2025 18:43, Andrew Cooper wrote:
> We have checks in both xen/compiler.h, and Config.mk.  Both are incomplete.
> 
> The check in Config.mk sees $(CC) in system and cross-compiler form, so cannot
> express anything more than the global baseline.  Change it to simply 5.1.
> 
> In xen/compiler.h, rewrite the expression for clarity/brevity.
> 
> Include a GCC 12.2 check for RISCV, and include a Clang 11 baseline check.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

Reviewed-by: Jan Beulich <jbeulich@suse.com>
Anthony PERARD March 28, 2025, 2:05 p.m. UTC | #2
On Thu, Mar 27, 2025 at 05:43:02PM +0000, Andrew Cooper wrote:
> The $(eval $(check-y)) is badly positioned:
> 
>   xen.git/xen$ make
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>     HOSTCC  tools/fixdep
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   make[1]: *** [scripts/Makefile.host:108: tools/fixdep] Error 1
>     HOSTCC  tools/symbols
>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>   make[1]: *** [scripts/Makefile.host:108: tools/symbols] Error 1
>   make: *** [Makefile:610: xen] Error 2
> 
> It is involved every time Config.mk is included, rather than once per `make`
> invocation.

It's worth than that ;-). $(eval $(check-y)) doesn't print anything, it
actually replace $(CC) by something that just print this error message
and thus refuse to build anything. So even if the eval was only done
once, you'll still have this stream of error message.

Anyway, is this check still useful somehow? Or could we replace it by a
check in ./configure for the tools and one in either Kconfig or
"xen/Makefile" for the hypervisor?

Cheers,
Andrew Cooper March 28, 2025, 4:30 p.m. UTC | #3
On 28/03/2025 2:05 pm, Anthony PERARD wrote:
> On Thu, Mar 27, 2025 at 05:43:02PM +0000, Andrew Cooper wrote:
>> The $(eval $(check-y)) is badly positioned:
>>
>>   xen.git/xen$ make
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>     HOSTCC  tools/fixdep
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   make[1]: *** [scripts/Makefile.host:108: tools/fixdep] Error 1
>>     HOSTCC  tools/symbols
>>   *** FATAL BUILD ERROR: Xen requires at least GCC 0x150100
>>   make[1]: *** [scripts/Makefile.host:108: tools/symbols] Error 1
>>   make: *** [Makefile:610: xen] Error 2
>>
>> It is involved every time Config.mk is included, rather than once per `make`
>> invocation.
> It's worth than that ;-). $(eval $(check-y)) doesn't print anything, it
> actually replace $(CC) by something that just print this error message
> and thus refuse to build anything.

Oh, that's far worse.

>  So even if the eval was only done
> once, you'll still have this stream of error message.

It appears the author didn't know about $(error).

> Anyway, is this check still useful somehow? Or could we replace it by a
> check in ./configure for the tools and one in either Kconfig or
> "xen/Makefile" for the hypervisor?

I'm quite sure it predates ./configure.  But I don't think there's any
reason to keep it around in this form - like this it's borderline useless.

~Andrew
diff mbox series

Patch

diff --git a/Config.mk b/Config.mk
index 8a73f3da62b4..8a60d4a55abf 100644
--- a/Config.mk
+++ b/Config.mk
@@ -125,8 +125,8 @@  define cc-ver-check-closure
     endif
 endef
 
-# Require GCC v4.1+
-check-$(gcc) = $(call cc-ver-check,CC,0x040100,"Xen requires at least gcc-4.1")
+# Require GCC v5.1 as the project global baseline
+check-$(gcc) = $(call cc-ver-check,CC,0x050100,"Xen requires at least GCC 5.1")
 $(eval $(check-y))
 
 ld-ver-build-id = $(shell $(1) --build-id 2>&1 | \
diff --git a/xen/include/xen/compiler.h b/xen/include/xen/compiler.h
index 636a85bc417d..38b8fa3d386d 100644
--- a/xen/include/xen/compiler.h
+++ b/xen/include/xen/compiler.h
@@ -1,19 +1,21 @@ 
 #ifndef __LINUX_COMPILER_H
 #define __LINUX_COMPILER_H
 
-#if !defined(__GNUC__) || (__GNUC__ < 4)
-#error Sorry, your compiler is too old/not recognized.
-#elif CONFIG_CC_IS_GCC
-# if defined(CONFIG_ARM_32) && CONFIG_GCC_VERSION < 40900
-#  error Sorry, your version of GCC is too old - please use 4.9 or newer.
-# elif defined(CONFIG_ARM_64) && CONFIG_GCC_VERSION < 50100
-/*
- * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63293
- * https://lore.kernel.org/r/20210107111841.GN1551@shell.armlinux.org.uk
- */
-#  error Sorry, your version of GCC is too old - please use 5.1 or newer.
+#if CONFIG_CC_IS_GCC
+
+# if defined(CONFIG_RISCV) && CONFIG_GCC_VERSION < 120200
+#  error Sorry, please use GCC >= 12.2
+# elif CONFIG_GCC_VERSION < 50100
+#  error Sorry, please use GCC >= 5.1
 # endif
-#endif
+
+#elif CONFIG_CC_IS_CLANG
+
+# if CONFIG_CLANG_VERSION < 110000
+#  error Sorry, please use Clang >= 11
+# endif
+
+#endif /* Compiler checks. */
 
 #ifdef CONFIG_CC_HAS_VISIBILITY_ATTRIBUTE
 /* Results in more efficient PIC code (no indirections through GOT or PLT). */