[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH] Add support for clang compilation
Hi Alice,thanks a lot for this work! It will (unfortunately) need a some rtework because we had recently changes on how build flags are propagated. On 01.03.20 20:13, alicesuiu wrote: Remove some flags (-fno-tree-sra, -mno-fp-ret-in-387, -fno-reorder-blocks) to add support for clang compilation. Add the CONFIG_COMPILER variable to define the compiler to be used (gcc or clang). By default the variable is set to gcc. Use 'make COMPILER=clang' to compile with clang. Signed-off-by: Alice Suiu <alicesuiu17@xxxxxxxxx> --- Makefile | 12 ++++++++++-- Makefile.uk | 6 +++--- arch/x86/x86_64/Makefile.uk | 6 +++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 84adb16..5828891 100644 --- a/Makefile +++ b/Makefile @@ -481,11 +481,19 @@ ifneq ("$(origin CROSS_COMPILE)","undefined") CONFIG_CROSS_COMPILE := $(CROSS_COMPILE:"%"=%) endif+# Use 'make COMPILER=clang' to compile with clang+ifeq ("$(origin COMPILER)", "command line") + CONFIG_COMPILER := $(COMPILER) +endif +ifndef CONFIG_COMPILER + CONFIG_COMPILER = gcc +endif + include $(CONFIG_UK_BASE)/arch/$(UK_FAMILY)/Compiler.uk# Make variables (CC, etc...)-LD := $(CONFIG_CROSS_COMPILE)gcc -CC := $(CONFIG_CROSS_COMPILE)gcc +LD := $(CONFIG_CROSS_COMPILE)$(CONFIG_COMPILER) +CC := $(CONFIG_CROSS_COMPILE)$(CONFIG_COMPILER) CPP := $(CC) CXX := $(CPP) GOC := $(CONFIG_CROSS_COMPILE)gccgo-7 I guess Go can also compiled with clang? It is fine to add support later, I am asking out of curiosity. diff --git a/Makefile.uk b/Makefile.uk index 3f01a25..3890d62 100644 --- a/Makefile.uk +++ b/Makefile.uk @@ -8,17 +8,17 @@ ASFLAGS += -U __linux__ -U __FreeBSD__ -U __sun__ -D__ASSEMBLY__ ASINCLUDES += -nostdinc -nostdlib -I$(CONFIG_UK_BASE)/includeCFLAGS += -U __linux__ -U __FreeBSD__ -U __sun__-CFLAGS += -fno-stack-protector -fno-omit-frame-pointer -fno-tree-sra +CFLAGS += -fno-stack-protector -fno-omit-frame-pointer CFLAGS += -Wall -Wextra CINCLUDES += -nostdinc -nostdlib -I$(CONFIG_UK_BASE)/includeCXXFLAGS += -U __linux__ -U __FreeBSD__ -U __sun__-CXXFLAGS += -fno-stack-protector -fno-omit-frame-pointer -fno-tree-sra +CXXFLAGS += -fno-stack-protector -fno-omit-frame-pointer CXXFLAGS += -Wall -Wextra CXXINCLUDES += -nostdinc -nostdlib -I$(CONFIG_UK_BASE)/includeGOCFLAGS += -U __linux__ -U __FreeBSD__ -U __sun__-GOCFLAGS += -fno-stack-protector -fno-omit-frame-pointer -fno-tree-sra +GOCFLAGS += -fno-stack-protector -fno-omit-frame-pointer GOCFLAGS += -fno-split-stack -Wall -Wextra GOCINCLUDES += -nostdinc -nostdlib -I$(CONFIG_UK_BASE)/include Please note that all language-independent flags moved to: ARCHFLAGS, ISR_ARCHFLAGS, COMPFLAGS diff --git a/arch/x86/x86_64/Makefile.uk b/arch/x86/x86_64/Makefile.ukindex 8ec7d6b..285a4e9 100644 --- a/arch/x86/x86_64/Makefile.uk +++ b/arch/x86/x86_64/Makefile.uk @@ -1,9 +1,9 @@ ASFLAGS += -D__X86_64__ ASFLAGS += -m64 CFLAGS += -D__X86_64__ -CFLAGS += -m64 -mno-red-zone -fno-reorder-blocks -fno-asynchronous-unwind-tables +CFLAGS += -m64 -mno-red-zone -fno-asynchronous-unwind-tables CXXFLAGS += -D__X86_64__ -CXXFLAGS += -m64 -mno-red-zone -fno-reorder-blocks -fno-asynchronous-unwind-tables +CXXFLAGS += -m64 -mno-red-zone -fno-asynchronous-unwind-tables Also those, while we still have the language-specific flags (ASFLAGS, CFLAGS, etc.). We separate them now. CINCLUDES += -I$(CONFIG_UK_BASE)/arch/x86/x86_64/include ASINCLUDES += -I$(CONFIG_UK_BASE)/arch/x86/x86_64/include @@ -11,7 +11,7 @@ CXXINCLUDES += -I$(CONFIG_UK_BASE)/arch/x86/x86_64/include# compiler flags to prevent use of extended (FP, SSE, AVX) registers.# This is for files that contain trap/exception/interrupt handlers -NO_X86_EXTREGS_FLAGS := -mno-80387 -mno-fp-ret-in-387 -mno-mmx -mno-sse -mno-avx +NO_X86_EXTREGS_FLAGS := -mno-80387 -mno-mmx -mno-sse -mno-avxASFLAGS-$(CONFIG_MARCH_X86_64_GENERIC) += -mtune=genericCFLAGS-$(CONFIG_MARCH_X86_64_GENERIC) += -mtune=generic I think we should add and modify the compiler-related Makefile rules within `support/build/Makefile.rules`. We have there so far: gcc_version_ge returns 'y' if current GCC version is >= 'y', otherwise 'n' gcc_version_lt returns 'y' if current GCC version is < 'y', otherwise 'n'These two are used to populate flags according to the current used GCC version. For instance: COMPFLAGS-$(call gcc_version_ge,7,0) += -flag_supported_with_gcc70 error_if_gcc_version_lt Will output an error that a newer GCC is neededI think I would add two functions that return 'y' and 'n' when clang and GCC is detected: have_clang have_gccUsing those, it probably makes sense to update the three existing functions so that the first two return 'n' and the last one never fails when have_gcc returned 'n' (when clang is used). Additionally, I would add the same set of functions for clang: clang_version_ge clang_version_le error_if_clang_version_ltThey behave equivalently to the gcc functions so that nothing breaks when GCC is used instead of clang (have_clang). With all of this you are able to re-coordinate the flags. All flags that fail with clang, you would keep for GCC with COMPFLAGS-$(call have_gcc) += -gcc_only_flagWith this you can also introduce clang specific flags and it can be applied to all flag variables, including the language specific ones and the ones concerning linking. What do you think? Thanks, Simon _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |