[yocto] Cross compiler which runs on the target architecture.

Richard Purdie richard.purdie at linuxfoundation.org
Tue Dec 23 01:08:45 PST 2014


On Sat, 2014-12-20 at 14:43 +0000, Peter Saunderson wrote:
> I have seen a brief IRC chat 
> (https://www.yoctoproject.org/irc/%23yocto.2013-09-23.log.html talking 
> about https://github.com/nathanrossi/meta-parallella) about this 
> question but nothing much else so this is an attempt to get more public 
> feedback on this request.
> 
> I am trying to build a cross compiler that runs on the target processor 
> and a cross compiler that runs on the host processor so that I can build 
> code for a third processor (Epiphany).  If you want examples of the 
> traditional way to build this compiler look at 
> https://github.com/adapteva/epiphany-sdk epiphany-gcc epiphany-newlib 
> epiphany-binutils... The end result would be a set of recipes that run 
> on a pc build machine that build both arm code for the interim target 
> and epiphany code for the final target and provides an SDK for the pc 
> that enables you to cross compile for both arm and epiphany.
> 
> As I am just starting to look at this I would like to know what size of 
> task I am up against!  My initial efforts based on review of 
> poky/meta/recipes-devtools/binutils etc seem to suggest that I have to 
> modify at least ${HOST_PREFIX}, ${TARGET_PREFIX}, ${TARGET_ARCH} etc for 
> my epiphany-??? recipes so that the I can install the compiler in a 
> suitable location with a suitable prefix, the IRC chat indicates that 
> there are more things to consider also.
> 
> The question I have is about how easy it will be to use existing recipes 
> for existing compiler / binutils etc... or is this likely to end up as a 
> completely new set of recipes from the ground up because the existing 
> recipes cant cope with building cross / cross compilers where there are 
> three processors to consider (host (intel based pc), interim target 
> (arm) and final target (epiphany)), or at least a lot of changes in the 
> existing recipes to cope with something like TARGET_TARGET_ARCH = 
> ${TARGET_ARCH}_${FINAL_TARGET_ARCH}??

As mentioned, I had need to do something like this for an avr target.
I've created some *extremely* hacky recipes which do this and the
resulting toolchain does actually work, much to my surprise. I've
included the recipes I created below, warts and all in case it helps.

Basically, its all a bit of a hack, the trouble is the system is very
much tuned to have TARGET pointed at HOST for standard recipes. In the
end I found it easier to 'sed' in the right target values into configure
and then 'sed' other variables to change TARGET_PREFIX/TARGET_SYS where
needed.

Ultimately if we were doing a lot of this, we may be able to use a
different variable name to make the recipes a lot neater.

Cheers,

Richard


>From f58f90257a5af3e6b6974090e62cad9d90d53ae5 Mon Sep 17 00:00:00 2001
From: Richard Purdie <richard.purdie at linuxfoundation.org>
Date: Tue, 23 Dec 2014 09:01:34 +0000
Subject: Add target avr support

Known issues:

* dependencies between the recipes is missing/incorrect
* on target avr libgcc isn't installed

Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>

diff --git a/meta/recipes-devtools/avr-libc/avr-libc_1.8.1.bb b/meta/recipes-devtools/avr-libc/avr-libc_1.8.1.bb
new file mode 100644
index 0000000..81481ba
--- /dev/null
+++ b/meta/recipes-devtools/avr-libc/avr-libc_1.8.1.bb
@@ -0,0 +1,31 @@
+SRC_URI = "http://download.savannah.gnu.org/releases/avr-libc/avr-libc-1.8.1.tar.bz2"
+LICENSE = "BSD"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8d91a8f153d3de715f67a5df0d841c43"
+
+SRC_URI[md5sum] = "0caccead59eaaa61ac3f060ca3a803ef"
+SRC_URI[sha256sum] = "c3062a481b6b2c6959dc708571c00b0e26301897ba21171ed92acd0af7c4a969"
+
+inherit autotools
+
+TOOLCHAIN_OPTIONS = ""
+
+TARGET_CFLAGS = ""
+TARGET_LDFLAGS = ""
+
+export CC = "avr-gcc"
+export AS = "avr-as"
+export RANLIB = "avr-ranlib"
+export AR = "avr-ar"
+
+FILES_${PN} += "${exec_prefix}/avr"
+INSANE_SKIP_${PN} = "arch staticdev"
+
+python () {
+    def replace(var, x, y):
+        d.setVar(var, d.getVar(var, True).replace(d.expand(x),y))
+
+    replace('CONFIGUREOPTS', '--host=${HOST_SYS}','--host=avr')
+    replace('CONFIGUREOPTS', '--target=${TARGET_SYS}','--target=avr')
+}
+
+
diff --git a/meta/recipes-devtools/binutils/binutils-cross-target-avr_2.24.bb b/meta/recipes-devtools/binutils/binutils-cross-target-avr_2.24.bb
new file mode 100644
index 0000000..e19cf54
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils-cross-target-avr_2.24.bb
@@ -0,0 +1,37 @@
+require binutils.inc
+require binutils-${PV}.inc
+require binutils-cross.inc
+
+DEPENDS += "flex bison zlib"
+PROVIDES = "virtual/binutils-target-avr"
+
+BPN = "binutils"
+
+
+
+python () {
+    def replace(var, x, y):
+        d.setVar(var, d.getVar(var, True).replace(d.expand(x),y))
+
+    replace('CONFIGUREOPTS', '--target=${TARGET_SYS}','--target=avr')
+    replace('EXTRA_OECONF', '--program-prefix=${TARGET_PREFIX}' ,'--program-prefix=avr-')
+    replace('do_install', '${TARGET_PREFIX}' ,'avr-')
+    replace('do_install', '${TARGET_SYS}' ,'avr')
+}
+
+EXTRA_OECONF += "--with-sysroot=/ \
+                --enable-install-libbfd \
+                --enable-install-libiberty \
+                --enable-shared \
+                "
+
+do_install () {
+    oe_runmake 'DESTDIR=${D}' install
+}
+
+sysroot_stage_all() {
+    sysroot_stage_dirs ${D} ${SYSROOT_DESTDIR}
+    sysroot_stage_dir ${D}${STAGING_DIR_NATIVE}${prefix_native}/avr ${SYSROOT_DESTDIR}${STAGING_DIR_NATIVE}${prefix_native}/avr
+    sysroot_stage_dir ${D}${STAGING_DIR_NATIVE}${prefix_native}/${BUILD_SYS} ${SYSROOT_DESTDIR}${STAGING_DIR_NATIVE}${prefix_native}/${BUILD_SYS}
+}
+
diff --git a/meta/recipes-devtools/binutils/binutils-target-avr_2.24.bb b/meta/recipes-devtools/binutils/binutils-target-avr_2.24.bb
new file mode 100644
index 0000000..66a899c
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils-target-avr_2.24.bb
@@ -0,0 +1,57 @@
+require binutils.inc
+require binutils-${PV}.inc
+
+DEPENDS += "flex bison zlib"
+
+BPN = "binutils"
+
+FILES_${PN}-dev += " \
+    ${exec_prefix}/${HOST_SYS}/avr/lib/lib*.la \
+    ${exec_prefix}/${HOST_SYS}/avr/lib/libopcodes.so \
+    ${exec_prefix}/${HOST_SYS}/avr/lib/libbfd.so \
+    ${exec_prefix}/${HOST_SYS}/avr/include \
+"
+FILES_${PN}-staticdev += " \
+    ${exec_prefix}/${HOST_SYS}/avr/lib/lib*.a \
+"
+
+USE_ALTERNATIVES_FOR = ""
+
+python () {
+    def replace(var, x, y):
+        d.setVar(var, d.getVar(var, True).replace(d.expand(x),y))
+
+    replace('CONFIGUREOPTS', '--target=${TARGET_SYS}','--target=avr')
+    replace('EXTRA_OECONF', '--program-prefix=${TARGET_PREFIX}' ,'--program-prefix=avr-')
+    replace('do_install', '${TARGET_PREFIX}' ,'avr-')
+    replace('do_install', '${TARGET_SYS}' ,'avr')
+    replace(d.expand('FILES_${PN}'), '${TARGET_PREFIX}' ,'avr-')
+    replace(d.expand('FILES_${PN}'), '${TARGET_SYS}' ,'avr')
+    d.appendVar(d.expand('FILES_${PN}'), " ${exec_prefix}/${HOST_SYS}/avr/lib/*-*.so ${libdir}/ldscripts")
+    d.appendVar(d.expand('FILES_${PN}-dbg'), " ${exec_prefix}/${HOST_SYS}/avr/lib/.debug")
+}
+
+EXTRA_OECONF += "--with-sysroot=/ \
+                --enable-install-libbfd \
+                --enable-install-libiberty \
+                --enable-shared \
+                "
+
+#do_install_append() {
+#	# Remove symlinks created by do_install
+#	for p in ${TARGET_PREFIX}* ; do
+#		rm `echo $p | sed -e s,${TARGET_PREFIX},,`
+#	done
+#}
+
+do_install () {
+    autotools_do_install
+
+    # Fix the /usr/${TARGET_SYS}/bin/* links
+    for l in ${D}${prefix}/${TARGET_SYS}/bin/*; do
+	rm -f $l
+	ln -sf `echo ${prefix}/${TARGET_SYS}/bin \
+	    | tr -s / \
+	    | sed -e 's,^/,,' -e 's,[^/]*,..,g'`${bindir}/${TARGET_PREFIX}`basename $l` $l
+    done
+}
\ No newline at end of file
diff --git a/meta/recipes-devtools/gcc/gcc-cross-target-avr_4.8.bb b/meta/recipes-devtools/gcc/gcc-cross-target-avr_4.8.bb
new file mode 100644
index 0000000..aa5c469
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-cross-target-avr_4.8.bb
@@ -0,0 +1,41 @@
+require recipes-devtools/gcc/gcc-${PV}.inc
+require gcc-cross.inc
+
+BPN = "gcc"
+PROVIDES = "virtual/gcc-target-avr"
+
+ARCH_FLAGS_FOR_TARGET = ""
+TARGET_CFLAGS = ""
+
+EXTRA_OECONF = "${@['--enable-clocale=generic', ''][d.getVar('USE_NLS', True) != 'no']} \
+                --with-gnu-ld \
+                --enable-languages=c \
+                ${GCCMULTILIB} \
+                --disable-libssp \
+                --program-prefix=avr- \
+                --without-local-prefix \
+                ${OPTSPACE} \
+                --enable-lto \
+                --disable-bootstrap \
+                --disable-libmudflap \
+                --with-system-zlib \
+                --enable-linker-build-id \
+                --with-ppl=no \
+                --with-cloog=no \
+                --enable-checking=release \
+                ${EXTRA_OECONF_PATHS}"
+
+python () {
+    def replace(var, x, y):
+        #bb.warn(x)
+        #bb.warn(d.expand(x))
+        #bb.warn(d.getVar(var))
+        #bb.warn(d.getVar(var, True).replace(d.expand(x),y))
+        d.setVar(var, d.getVar(var, True).replace(d.expand(x),y))
+
+    replace('CONFIGUREOPTS', '--target=${TARGET_SYS}','--target=avr')
+    #replace('do_configure', '${HOST_PREFIX}' ,'avr-')
+    replace('do_install', '${TARGET_PREFIX}' ,'avr-')
+    replace('do_install', '${TARGET_SYS}' ,'avr')
+}
+
diff --git a/meta/recipes-devtools/gcc/gcc-target-avr_4.8.bb b/meta/recipes-devtools/gcc/gcc-target-avr_4.8.bb
new file mode 100644
index 0000000..b2be069
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-target-avr_4.8.bb
@@ -0,0 +1,50 @@
+require recipes-devtools/gcc/gcc-${PV}.inc
+require gcc-target.inc
+
+BPN = "gcc"
+
+ARCH_FLAGS_FOR_TARGET = ""
+
+EXTRA_OECONF = "${@['--enable-clocale=generic', ''][d.getVar('USE_NLS', True) != 'no']} \
+                --with-gnu-ld \
+                --enable-languages=c \
+                ${GCCMULTILIB} \
+                --disable-libssp \
+                --program-prefix=avr- \
+                --without-local-prefix \
+                ${OPTSPACE} \
+                --enable-lto \
+                --disable-bootstrap \
+                --disable-libmudflap \
+                --with-system-zlib \
+                --with-ppl=no \
+                --with-cloog=no \
+                --enable-checking=release \
+                ${EXTRA_OECONF_PATHS}"
+
+
+python () {
+    def replace(var, x, y, d):
+        d.setVar(var, d.getVar(var, True).replace(d.expand(x),y))
+
+    ld = bb.data.createCopy(d)
+    ld.setVar("TARGET_CFLAGS", "")
+    ld.setVar("HOST_CC_ARCH", "")
+    ld.setVar("TOOLCHAIN_OPTIONS", "")
+
+    replace('CONFIGUREOPTS', '--target=${TARGET_SYS}','--target=avr', d)
+    replace('EXTRA_OECONF', '--program-prefix=${TARGET_PREFIX}' ,'--program-prefix=avr-', d)
+    replace('do_configure', '${HOST_PREFIX}' ,'avr-', ld)
+    d.setVar('do_configure', ld.getVar('do_configure'))
+    replace('do_install', '${TARGET_PREFIX}' ,'avr-', d)
+    replace('do_install', '${TARGET_SYS}' ,'avr', d)
+    replace(d.expand('FILES_${PN}'), '${TARGET_PREFIX}' ,'avr-', d)
+    replace(d.expand('FILES_cpp'), '${TARGET_PREFIX}' ,'avr-', d)
+    replace(d.expand('FILES_gcov'), '${TARGET_PREFIX}' ,'avr-', d)
+    replace(d.expand('FILES_${PN}'), '${TARGET_SYS}' ,'avr', d)
+    replace(d.expand('FILES_${PN}-plugin-dev'), '${TARGET_SYS}' ,'avr', d)
+    replace(d.expand('FILES_${PN}-dbg'), '${TARGET_SYS}' ,'avr', d)
+    replace(d.expand('FILES_${PN}-dev'), '${TARGET_SYS}' ,'avr', d)
+    #d.appendVar(d.expand('FILES_${PN}'), " ${exec_prefix}/${HOST_SYS}/avr/lib/*-*.so")
+    #d.appendVar(d.expand('FILES_${PN}-dbg'), " ${exec_prefix}/${HOST_SYS}/avr/lib/.debug")
+}





More information about the yocto mailing list