summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2016-05-12 21:55:06 +0200
committerWaldemar Brodkorb <wbx@openadk.org>2016-05-12 21:55:06 +0200
commit84bce194674cc57e556ec52826a6014518eb4dd1 (patch)
treee69db53d08c10adb244576950bdec51c6ab5f153
parentd9b890f651d639cae06fa2c475a49722c3ea356f (diff)
add support to play with LLVM/clang
-rw-r--r--Config.in2
-rw-r--r--mk/vars.mk9
-rw-r--r--target/config/Config.in.compiler (renamed from target/config/Config.in.gcc)12
-rw-r--r--target/config/Config.in.tools5
-rw-r--r--toolchain/Makefile23
-rw-r--r--toolchain/llvm/Makefile50
-rw-r--r--toolchain/llvm/Makefile.inc10
-rw-r--r--toolchain/musl/Makefile13
-rw-r--r--toolchain/uclibc-ng/Makefile3
9 files changed, 113 insertions, 14 deletions
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.gcc b/target/config/Config.in.compiler
index 0c0cc3fc2..379046a5a 100644
--- a/target/config/Config.in.gcc
+++ b/target/config/Config.in.compiler
@@ -2,7 +2,19 @@
# 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
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) \