From 84bce194674cc57e556ec52826a6014518eb4dd1 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Thu, 12 May 2016 21:55:06 +0200 Subject: add support to play with LLVM/clang --- Config.in | 2 +- mk/vars.mk | 9 +++ target/config/Config.in.compiler | 117 +++++++++++++++++++++++++++++++++++++++ target/config/Config.in.gcc | 105 ----------------------------------- target/config/Config.in.tools | 5 ++ toolchain/Makefile | 23 +++++--- toolchain/llvm/Makefile | 50 +++++++++++++++++ toolchain/llvm/Makefile.inc | 10 ++++ toolchain/musl/Makefile | 13 +++-- toolchain/uclibc-ng/Makefile | 3 + 10 files changed, 218 insertions(+), 119 deletions(-) create mode 100644 target/config/Config.in.compiler delete mode 100644 target/config/Config.in.gcc create mode 100644 toolchain/llvm/Makefile create mode 100644 toolchain/llvm/Makefile.inc diff --git a/Config.in b/Config.in index 83eeaa00c..9e99e5c21 100644 --- a/Config.in +++ b/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 diff --git a/mk/vars.mk b/mk/vars.mk index 157bba30c..41d74e78a 100644 --- a/mk/vars.mk +++ b/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),) diff --git a/target/config/Config.in.compiler b/target/config/Config.in.compiler new file mode 100644 index 000000000..379046a5a --- /dev/null +++ b/target/config/Config.in.compiler @@ -0,0 +1,117 @@ +# 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 +default ADK_TOOLCHAIN_GCC_4_9_3 if ADK_TARGET_LIB_GLIBC && ADK_TARGET_ARCH_SH +default ADK_TOOLCHAIN_GCC_4_9_3 if ADK_TARGET_SYSTEM_KINETIS_K70 +default ADK_TOOLCHAIN_GCC_4_8_ARC if ADK_TARGET_ARCH_ARC +default ADK_TOOLCHAIN_GCC_5_3_OR1K if ADK_TARGET_ARCH_OR1K +default ADK_TOOLCHAIN_GCC_6_1_0 if ADK_TARGET_ARCH_XTENSA +default ADK_TOOLCHAIN_GCC_6_1_0 if ADK_TARGET_ARCH_BFIN +default ADK_TOOLCHAIN_GCC_5_3_0 + +config ADK_TOOLCHAIN_GCC_GIT + bool "git" + depends on !ADK_TARGET_ARCH_ARC + depends on !ADK_TARGET_ARCH_AVR32 + depends on !ADK_TARGET_ARCH_METAG + depends on !ADK_TARGET_ARCH_OR1K + select ADK_DISABLE_HONOUR_CFLAGS + +config ADK_TOOLCHAIN_GCC_6_1_0 + bool "6.1.0" + depends on !ADK_TARGET_ARCH_ARC + depends on !ADK_TARGET_ARCH_AVR32 + depends on !ADK_TARGET_ARCH_METAG + depends on !ADK_TARGET_ARCH_OR1K + select ADK_DISABLE_HONOUR_CFLAGS + +config ADK_TOOLCHAIN_GCC_5_3_0 + bool "5.3.0" + depends on !ADK_TARGET_ARCH_ARC + depends on !ADK_TARGET_ARCH_AVR32 + depends on !ADK_TARGET_ARCH_BFIN + depends on !ADK_TARGET_ARCH_C6X + depends on !ADK_TARGET_ARCH_FRV + depends on !ADK_TARGET_ARCH_H8300 + depends on !ADK_TARGET_ARCH_M32R + depends on !ADK_TARGET_ARCH_METAG + depends on !ADK_TARGET_ARCH_OR1K + depends on !ADK_TARGET_SYSTEM_KINETIS_K70 + depends on !(ADK_TARGET_LIB_GLIBC && ADK_TARGET_ARCH_SH) + +config ADK_TOOLCHAIN_GCC_4_9_3 + bool "4.9.3" + depends on !ADK_TARGET_ARCH_ARC + depends on !ADK_TARGET_ARCH_AVR32 + depends on !ADK_TARGET_ARCH_BFIN + depends on !ADK_TARGET_ARCH_C6X + depends on !ADK_TARGET_ARCH_H8300 + depends on !ADK_TARGET_ARCH_METAG + depends on !ADK_TARGET_ARCH_OR1K + depends on !ADK_TARGET_ARCH_TILE + +config ADK_TOOLCHAIN_GCC_4_8_5 + bool "4.8.5" + depends on !ADK_TARGET_ARCH_BFIN + depends on !ADK_TARGET_ARCH_AARCH64 + depends on !ADK_TARGET_ARCH_ARC + depends on !ADK_TARGET_ARCH_AVR32 + depends on !ADK_TARGET_ARCH_CRIS + depends on !ADK_TARGET_ARCH_TILE + depends on !ADK_TARGET_ARCH_H8300 + depends on !ADK_TARGET_ARCH_METAG + depends on !ADK_TARGET_ARCH_OR1K + +config ADK_TOOLCHAIN_GCC_5_3_OR1K + bool "5.3-or1k" + select ADK_DISABLE_HONOUR_CFLAGS + depends on ADK_TARGET_ARCH_OR1K + +config ADK_TOOLCHAIN_GCC_4_8_ARC + bool "4.8-arc" + depends on ADK_TARGET_ARCH_ARC + select ADK_DISABLE_HONOUR_CFLAGS + +config ADK_TOOLCHAIN_GCC_4_7_4 + bool "4.7.4" + depends on !ADK_TARGET_ARCH_BFIN + depends on !ADK_TARGET_ARCH_AARCH64 + depends on !ADK_TARGET_ARCH_ARC + depends on !ADK_TARGET_ARCH_AVR32 + depends on !ADK_TARGET_ARCH_CRIS + depends on !ADK_TARGET_ARCH_TILE + depends on !ADK_TARGET_ARCH_H8300 + depends on !ADK_TARGET_ARCH_METAG + depends on !ADK_TARGET_ARCH_OR1K + +config ADK_TOOLCHAIN_GCC_4_4_7 + bool "4.4.7" + depends on ADK_TARGET_ARCH_AVR32 + +config ADK_TOOLCHAIN_GCC_4_2_4 + bool "4.2.4" + depends on ADK_TARGET_ARCH_METAG + select ADK_DISABLE_HONOUR_CFLAGS + select ADK_TOOLCHAIN_GCC_OLD + +endchoice + +config ADK_TOOLCHAIN_GCC_OLD + bool diff --git a/target/config/Config.in.gcc b/target/config/Config.in.gcc deleted file mode 100644 index 0c0cc3fc2..000000000 --- a/target/config/Config.in.gcc +++ /dev/null @@ -1,105 +0,0 @@ -# This file is part of the OpenADK project. OpenADK is copyrighted -# material, please see the LICENCE file in the top-level directory. - -choice -prompt "GCC version" -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 -default ADK_TOOLCHAIN_GCC_4_9_3 if ADK_TARGET_LIB_GLIBC && ADK_TARGET_ARCH_SH -default ADK_TOOLCHAIN_GCC_4_9_3 if ADK_TARGET_SYSTEM_KINETIS_K70 -default ADK_TOOLCHAIN_GCC_4_8_ARC if ADK_TARGET_ARCH_ARC -default ADK_TOOLCHAIN_GCC_5_3_OR1K if ADK_TARGET_ARCH_OR1K -default ADK_TOOLCHAIN_GCC_6_1_0 if ADK_TARGET_ARCH_XTENSA -default ADK_TOOLCHAIN_GCC_6_1_0 if ADK_TARGET_ARCH_BFIN -default ADK_TOOLCHAIN_GCC_5_3_0 - -config ADK_TOOLCHAIN_GCC_GIT - bool "git" - depends on !ADK_TARGET_ARCH_ARC - depends on !ADK_TARGET_ARCH_AVR32 - depends on !ADK_TARGET_ARCH_METAG - depends on !ADK_TARGET_ARCH_OR1K - select ADK_DISABLE_HONOUR_CFLAGS - -config ADK_TOOLCHAIN_GCC_6_1_0 - bool "6.1.0" - depends on !ADK_TARGET_ARCH_ARC - depends on !ADK_TARGET_ARCH_AVR32 - depends on !ADK_TARGET_ARCH_METAG - depends on !ADK_TARGET_ARCH_OR1K - select ADK_DISABLE_HONOUR_CFLAGS - -config ADK_TOOLCHAIN_GCC_5_3_0 - bool "5.3.0" - depends on !ADK_TARGET_ARCH_ARC - depends on !ADK_TARGET_ARCH_AVR32 - depends on !ADK_TARGET_ARCH_BFIN - depends on !ADK_TARGET_ARCH_C6X - depends on !ADK_TARGET_ARCH_FRV - depends on !ADK_TARGET_ARCH_H8300 - depends on !ADK_TARGET_ARCH_M32R - depends on !ADK_TARGET_ARCH_METAG - depends on !ADK_TARGET_ARCH_OR1K - depends on !ADK_TARGET_SYSTEM_KINETIS_K70 - depends on !(ADK_TARGET_LIB_GLIBC && ADK_TARGET_ARCH_SH) - -config ADK_TOOLCHAIN_GCC_4_9_3 - bool "4.9.3" - depends on !ADK_TARGET_ARCH_ARC - depends on !ADK_TARGET_ARCH_AVR32 - depends on !ADK_TARGET_ARCH_BFIN - depends on !ADK_TARGET_ARCH_C6X - depends on !ADK_TARGET_ARCH_H8300 - depends on !ADK_TARGET_ARCH_METAG - depends on !ADK_TARGET_ARCH_OR1K - depends on !ADK_TARGET_ARCH_TILE - -config ADK_TOOLCHAIN_GCC_4_8_5 - bool "4.8.5" - depends on !ADK_TARGET_ARCH_BFIN - depends on !ADK_TARGET_ARCH_AARCH64 - depends on !ADK_TARGET_ARCH_ARC - depends on !ADK_TARGET_ARCH_AVR32 - depends on !ADK_TARGET_ARCH_CRIS - depends on !ADK_TARGET_ARCH_TILE - depends on !ADK_TARGET_ARCH_H8300 - depends on !ADK_TARGET_ARCH_METAG - depends on !ADK_TARGET_ARCH_OR1K - -config ADK_TOOLCHAIN_GCC_5_3_OR1K - bool "5.3-or1k" - select ADK_DISABLE_HONOUR_CFLAGS - depends on ADK_TARGET_ARCH_OR1K - -config ADK_TOOLCHAIN_GCC_4_8_ARC - bool "4.8-arc" - depends on ADK_TARGET_ARCH_ARC - select ADK_DISABLE_HONOUR_CFLAGS - -config ADK_TOOLCHAIN_GCC_4_7_4 - bool "4.7.4" - depends on !ADK_TARGET_ARCH_BFIN - depends on !ADK_TARGET_ARCH_AARCH64 - depends on !ADK_TARGET_ARCH_ARC - depends on !ADK_TARGET_ARCH_AVR32 - depends on !ADK_TARGET_ARCH_CRIS - depends on !ADK_TARGET_ARCH_TILE - depends on !ADK_TARGET_ARCH_H8300 - depends on !ADK_TARGET_ARCH_METAG - depends on !ADK_TARGET_ARCH_OR1K - -config ADK_TOOLCHAIN_GCC_4_4_7 - bool "4.4.7" - depends on ADK_TARGET_ARCH_AVR32 - -config ADK_TOOLCHAIN_GCC_4_2_4 - bool "4.2.4" - depends on ADK_TARGET_ARCH_METAG - select ADK_DISABLE_HONOUR_CFLAGS - select ADK_TOOLCHAIN_GCC_OLD - -endchoice - -config ADK_TOOLCHAIN_GCC_OLD - bool diff --git a/target/config/Config.in.tools b/target/config/Config.in.tools index 51765ca33..9d9e874a4 100644 --- a/target/config/Config.in.tools +++ b/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 diff --git a/toolchain/Makefile b/toolchain/Makefile index b80782081..5e19998eb 100644 --- a/toolchain/Makefile +++ b/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.. " diff --git a/toolchain/llvm/Makefile b/toolchain/llvm/Makefile new file mode 100644 index 000000000..52228f221 --- /dev/null +++ b/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 diff --git a/toolchain/llvm/Makefile.inc b/toolchain/llvm/Makefile.inc new file mode 100644 index 000000000..1c66bedc5 --- /dev/null +++ b/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 diff --git a/toolchain/musl/Makefile b/toolchain/musl/Makefile index 1bbb2d190..c2ad85706 100644 --- a/toolchain/musl/Makefile +++ b/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 diff --git a/toolchain/uclibc-ng/Makefile b/toolchain/uclibc-ng/Makefile index 80b6e1b28..91722f968 100644 --- a/toolchain/uclibc-ng/Makefile +++ b/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) \ -- cgit v1.2.3