Browse Source

add support to play with LLVM/clang

Waldemar Brodkorb 8 years ago
parent
commit
84bce19467

+ 1 - 1
Config.in

@@ -69,7 +69,7 @@ source "target/config/Config.in.binfmt"
 source "target/config/Config.in.libc"
 source "target/config/Config.in.abi"
 source "target/config/Config.in.binutils"
-source "target/config/Config.in.gcc"
+source "target/config/Config.in.compiler"
 source "target/config/Config.in.gdb"
 source "target/config/Config.in.toolchain"
 endmenu

+ 9 - 0
mk/vars.mk

@@ -95,8 +95,15 @@ TARGET_COMPILER_PREFIX=$(STAGING_HOST_DIR)/usr/bin/ccache ${TARGET_CROSS}
 endif
 
 # target tools
+ifeq ($(ADK_BUILD_COMPILER_GCC),y)
 TARGET_CC:=		${TARGET_COMPILER_PREFIX}gcc
 TARGET_CXX:=		${TARGET_COMPILER_PREFIX}g++
+endif
+ifeq ($(ADK_BUILD_COMPILER_LLVM),y)
+TARGET_CC:=		clang --target=${GNU_TARGET_NAME} --sysroot=$(STAGING_TARGET_DIR)
+TARGET_CXX:=		clang++ --target=${GNU_TARGET_NAME} --sysroot=$(STAGING_TARGET_DIR)
+endif
+
 TARGET_LD:=		${TARGET_COMPILER_PREFIX}ld
 ifneq ($(ADK_TARGET_USE_LTO),)
 TARGET_AR:=		${TARGET_COMPILER_PREFIX}gcc-ar
@@ -113,10 +120,12 @@ TARGET_LDFLAGS:=	-L$(STAGING_TARGET_DIR)/lib -L$(STAGING_TARGET_DIR)/usr/lib \
 			-Wl,-O1 -Wl,-rpath -Wl,/usr/lib \
 			-Wl,-rpath-link -Wl,${STAGING_TARGET_DIR}/usr/lib
 
+ifeq ($(ADK_BUILD_COMPILER_GCC),y)
 ifeq ($(ADK_DISABLE_HONOUR_CFLAGS),)
 TARGET_CFLAGS+=		-fhonour-copts
 TARGET_CXXFLAGS+=	-fhonour-copts
 endif
+endif
 
 # for architectures where gcc --with-cpu matches -mcpu=
 ifneq ($(ADK_TARGET_GCC_CPU),)

+ 12 - 0
target/config/Config.in.gcc → target/config/Config.in.compiler

@@ -1,8 +1,20 @@
 # This file is part of the OpenADK project. OpenADK is copyrighted
 # material, please see the LICENCE file in the top-level directory.
 
+choice
+prompt "Compiler"
+
+config ADK_BUILD_COMPILER_GCC
+	bool "gcc"
+
+config ADK_BUILD_COMPILER_LLVM
+	bool "llvm"
+
+endchoice
+
 choice
 prompt "GCC version"
+depends on ADK_BUILD_COMPILER_GCC
 default ADK_TOOLCHAIN_GCC_4_2_4 if ADK_TARGET_ARCH_METAG
 default ADK_TOOLCHAIN_GCC_4_4_7 if ADK_TARGET_ARCH_AVR32
 default ADK_TOOLCHAIN_GCC_4_8_5 if ADK_TARGET_ARCH_C6X

+ 5 - 0
target/config/Config.in.tools

@@ -57,6 +57,11 @@ config ADK_HOST_BUILD_BZIP2
 	bool
 	default n
 
+config ADK_HOST_BUILD_CMAKE
+	bool
+	default y if ADK_BUILD_COMPILER_LLVM
+	default n
+
 config ADK_HOST_BUILD_FILE
 	bool
 	default n

+ 16 - 7
toolchain/Makefile

@@ -12,7 +12,16 @@
 
 include $(ADK_TOPDIR)/rules.mk
 
-TARGETS:=binutils gmp mpfr mpc libelf gcc
+TARGETS:=binutils gmp mpfr mpc libelf
+
+ifeq ($(ADK_BUILD_COMPILER_GCC),y)
+TARGETS+=gcc
+COMPILER:=gcc
+endif
+ifeq ($(ADK_BUILD_COMPILER_LLVM),y)
+TARGETS+=llvm
+COMPILER:=llvm
+endif
 
 ifeq ($(ADK_TARGET_LIB_GLIBC),y)
 TARGETS+=glibc
@@ -47,7 +56,7 @@ endif
 
 DOWNLOAD:=kernel-headers-download $(patsubst %,%-download,$(TARGETS))
 TARGETS_INSTALL:=$(patsubst %,%-install,$(TARGETS))
-FINAL:=$(patsubst %,%-final,gcc)
+FINAL:=$(patsubst %,%-final,$(COMPILER))
 TARGETS_CLEAN:=$(patsubst %,%-clean,$(TARGETS))
 
 install: $(TARGETS_INSTALL)
@@ -55,14 +64,14 @@ clean: $(TARGETS_CLEAN)
 download: $(DOWNLOAD)
 final: $(FINAL)
 
-gcc-configure: binutils-install gmp-install mpfr-install mpc-install libelf-install
+$(COMPILER)-configure: binutils-install gmp-install mpfr-install mpc-install libelf-install
 ifeq ($(ADK_TARGET_LIB_NEWLIB),y)
-$(CLIB)-install: gcc-configure
+$(CLIB)-install: $(COMPILER)-configure
 else
-$(CLIB)-install: gcc-configure kernel-headers-configure
+$(CLIB)-install: $(COMPILER)-configure kernel-headers-configure
 endif
-gcc-install: $(ELF2FLT) $(CLIB)-install
-gcc-final: gcc-install $(GDB)
+$(COMPILER)-install: $(ELF2FLT) $(CLIB)-install
+$(COMPILER)-final: $(COMPILER)-install $(GDB)
 
 %-download:
 	$(START_TRACE) "toolchain/$(patsubst %-download,%,$@)/download.. "

+ 50 - 0
toolchain/llvm/Makefile

@@ -0,0 +1,50 @@
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include $(ADK_TOPDIR)/rules.mk
+include ../rules.mk
+include Makefile.inc
+
+include ${ADK_TOPDIR}/mk/buildhlp.mk
+
+BUILD_DIR_INITIAL:=	$(WRKBUILD)-initial
+BUILD_DIR_FINAL:=	$(WRKBUILD)-final
+
+LLVM_TARGETS:=ARM
+
+$(BUILD_DIR_INITIAL)/.configured:
+	(cd $(DL_DIR) && wget http://llvm.org/releases/3.8.0/cfe-3.8.0.src.tar.xz)
+	(cd $(DL_DIR) && wget http://llvm.org/releases/3.8.0/compiler-rt-3.8.0.src.tar.xz)
+	(cd $(WRKBUILD)/tools && tar xvf $(DL_DIR)/cfe-3.8.0.src.tar.xz && mv cfe-3.8.0.src clang)
+	(cd $(WRKBUILD)/projects && tar xvf $(DL_DIR)/compiler-rt-3.8.0.src.tar.xz && mv compiler-rt-3.8.0.src compiler-rt)
+	mkdir -p $(BUILD_DIR_INITIAL)
+	cd $(BUILD_DIR_INITIAL); \
+		PATH='$(HOST_PATH)' \
+		cmake -DCMAKE_BUILD_TYPE=Release \
+			-DCMAKE_INSTALL_PREFIX=$(TOOLCHAIN_DIR)/usr \
+			-DLLVM_DEFAULT_TARGET_TRIPLE="arm-none-eabi" \
+			-DCMAKE_CXX_FLAGS="-std=c++11" \
+			-DLLVM_TARGETS_TO_BUILD=$(LLVM_TARGETS) \
+			$(WRKBUILD)
+	touch $@
+
+$(BUILD_DIR_INITIAL)/.compiled: $(BUILD_DIR_INITIAL)/.configured
+	PATH='$(TARGET_PATH)' \
+		$(MAKE) -C $(BUILD_DIR_INITIAL) all
+	touch $@
+
+$(WRKBUILD)/.configured: $(BUILD_DIR_INITIAL)/.compiled
+	PATH='$(TARGET_PATH)' \
+		$(MAKE) -C $(BUILD_DIR_INITIAL) install
+	touch $@
+
+$(WRKBUILD)/.compiled:
+	touch $@
+
+$(WRKBUILD)/.installed: $(WRKBUILD)/.compiled
+	touch $@
+
+$(WRKBUILD)/.final:
+	touch $@
+
+include ${ADK_TOPDIR}/mk/toolchain.mk

+ 10 - 0
toolchain/llvm/Makefile.inc

@@ -0,0 +1,10 @@
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+PKG_NAME:=		llvm
+PKG_VERSION:=		3.8.0
+PKG_HASH:=		555b028e9ee0f6445ff8f949ea10e9cd8be0d084840e21fbbe1d31d51fc06e46
+PKG_SITES:=		http://llvm.org/releases/3.8.0/
+PKG_RELEASE:=		1
+DISTFILES:=		${PKG_NAME}-${PKG_VERSION}.src.tar.xz
+WRKDIST=		${WRKDIR}/${PKG_NAME}-${PKG_VERSION}.src

+ 7 - 6
toolchain/musl/Makefile

@@ -22,7 +22,9 @@ TARGET_LDFLAGS:=	$(filter-out -fstack-protector-all,$(TARGET_LDFLAGS))
 TARGET_CFLAGS:=         $(filter-out -ffast-math,$(TARGET_CFLAGS))
 
 $(WRKBUILD)/.configured:
-	(cd $(WRKBUILD); CC='$(TARGET_CC)' CROSS_COMPILE='$(TARGET_CROSS)' \
+	(cd $(WRKBUILD); PATH='$(HOST_PATH)' \
+		CROSS_COMPILE='$(TARGET_CROSS)' \
+		CC='$(TARGET_CC)' \
 		CFLAGS='$(TARGET_CFLAGS)' \
 		./configure --prefix=/usr \
 		--target=$(GNU_TARGET_NAME) \
@@ -31,14 +33,13 @@ $(WRKBUILD)/.configured:
 	touch $@
 
 $(WRKBUILD)/.compiled:
-	$(MAKE) -C $(WRKBUILD) CFLAGS='$(TARGET_CFLAGS)' all
+	PATH='$(HOST_PATH)' $(MAKE) -C $(WRKBUILD) \
+		CC='$(TARGET_CC)' CFLAGS='$(TARGET_CFLAGS)' all
 	touch $@
 
 $(WRKBUILD)/.installed: $(WRKBUILD)/.compiled
-	$(MAKE) -C $(WRKBUILD) CFLAGS='$(TARGET_CFLAGS)' DESTDIR=$(STAGING_TARGET_DIR) install
-	touch $@
-
-$(WRKBUILD)/.final:
+	PATH='$(HOST_PATH)' $(MAKE) -C $(WRKBUILD) \
+		CC='$(TARGET_CC)' CFLAGS='$(TARGET_CFLAGS)' DESTDIR=$(STAGING_TARGET_DIR) install
 	touch $@
 
 include ${ADK_TOPDIR}/mk/toolchain.mk

+ 3 - 0
toolchain/uclibc-ng/Makefile

@@ -16,6 +16,7 @@ TARGET_LDFLAGS:=$(filter-out -fstack-protector-all,$(TARGET_LDFLAGS))
 # don't use fast-math for C library
 TARGET_CFLAGS:=	$(filter-out -ffast-math,$(TARGET_CFLAGS))
 
+ifeq ($(ADK_BUILD_COMPILER_GCC),y)
 ifeq ($(ADK_TARGET_HARD_FLOAT),y)
 ifeq ($(ADK_TARGET_ARCH_ARM),y)
 TARGET_CFLAGS+=		-Wa,-mfloat-abi=hard
@@ -33,6 +34,7 @@ ifeq ($(ADK_TARGET_ARCH_MIPS),y)
 TARGET_CFLAGS+=		-Wa,-msoft-float
 endif
 endif
+endif
 
 ifeq (${ADK_MAKE_PARALLEL},y)
 UCLIBC_MAKEOPTS+=	-j${ADK_MAKE_JOBS}
@@ -270,6 +272,7 @@ endif
 endif
 	echo N|PATH='$(HOST_PATH)' $(MAKE) $(UCLIBC_MAKEOPTS) -C $(WRKBUILD) \
 		HOSTCC="$(HOST_CC)" \
+		CC='$(TARGET_CC)' \
 		PREFIX=$(STAGING_TARGET_DIR) \
 		DEVEL_PREFIX=/usr/ \
 		RUNTIME_PREFIX=$(STAGING_TARGET_DIR) \