summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Rossi <nathan.rossi@xilinx.com>2013-08-12 10:30:19 +1000
committerNathan Rossi <nathan.rossi@xilinx.com>2013-09-03 16:09:43 +1000
commit68464246815ed791919795e4610ed56c5c86f77c (patch)
treea492816f5e7b0abd511d43b3394768acf70ddd0a
parent0c3fd8774d5b8604d184449e8f7ebcbbe1a91425 (diff)
downloadmeta-xilinx-68464246815ed791919795e4610ed56c5c86f77c.tar.gz
external-xilinx-toolchain: Created recipe
* Allows use of external Xilinx MicroBlaze and Zynq pre-built toolchains * Does not require additional layer dependencies * Updated documentation regarding external toolchain Signed-off-by: Nathan Rossi <nathan.rossi@xilinx.com>
-rw-r--r--README45
-rw-r--r--conf/distro/include/tcmode-external-xilinx.inc78
-rw-r--r--conf/distro/include/xilinx-versions.inc107
-rw-r--r--recipes-core/meta/external-xilinx-toolchain.bb148
-rw-r--r--recipes-core/meta/external-xilinx-toolchain/SUPPORTED0
5 files changed, 339 insertions, 39 deletions
diff --git a/README b/README
index de3f1ee8..a8edf37b 100644
--- a/README
+++ b/README
@@ -33,10 +33,6 @@ This layer depends on:
33 URI: git://git.openembedded.org/openembedded-core 33 URI: git://git.openembedded.org/openembedded-core
34 layers: meta 34 layers: meta
35 35
36 (for external toolchains only)
37 URI: git://github.com/MentorEmbedded/meta-sourcery.git
38 layers: meta-sourcery
39
40Build Instructions 36Build Instructions
41================== 37==================
42 38
@@ -90,38 +86,9 @@ Configuring External Toolchain
90============================== 86==============================
91 87
92In order to build with an external toolchain some additional configuration must 88In order to build with an external toolchain some additional configuration must
93be set in the build environments local.conf. The 'meta-sourcery' layer must also 89be set in the build environments local.conf. First configure the use of an
94be setup in your bblayers.conf 90external toolchain, including the location to the toolchain:
95 91
96First configure the use of an external toolchain, including the location to the 92 TCMODE = "external-xilinx"
97toolchain (this example is for a microblazeel toolchain, ensure that you insert 93 EXTERNAL_TOOLCHAIN = "<path to toolchain>"
98the relevant information for your target machine and target toolchain): 94
99
100 TCMODE = "external-csl"
101 CSL_TARGET_SYS_<machine name> = "microblazeel-xilinx-linux-gnu"
102 EXTERNAL_TOOLCHAIN = "<path to toolchain>/microblazeel-xilinx-linux-gnu"
103 EXTERNAL_TOOLCHAIN_SYSROOT = "<path to toolchain>/microblazeel-xilinx-linux-gnu/microblazeel-xilinx-linux-gnu/libc"
104 INSANE_SKIP_external-sourcery-toolchain-dev += "ldflags"
105
106Additionally the preferred provider for various packages must be configured to
107use the external toolchain:
108
109 PREFERRED_PROVIDER_linux-libc-headers = "external-sourcery-toolchain"
110 PREFERRED_PROVIDER_linux-libc-headers-dev = "external-sourcery-toolchain"
111 PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc = "external-sourcery-toolchain"
112 PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-initial = "external-sourcery-toolchain"
113 PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-intermediate = "external-sourcery-toolchain"
114 PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}g++ = "external-sourcery-toolchain"
115 PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}binutils = "external-sourcery-toolchain"
116 PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}libc-initial = "external-sourcery-toolchain"
117 PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}libc-for-gcc = "external-sourcery-toolchain"
118 PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}compilerlibs = "external-sourcery-toolchain"
119 PREFERRED_PROVIDER_libgcc = "external-sourcery-toolchain"
120 PREFERRED_PROVIDER_eglibc = "external-sourcery-toolchain"
121 PREFERRED_PROVIDER_virtual/libc = "external-sourcery-toolchain"
122 PREFERRED_PROVIDER_virtual/libintl = "external-sourcery-toolchain"
123 PREFERRED_PROVIDER_virtual/libiconv = "external-sourcery-toolchain"
124 PREFERRED_PROVIDER_glibc-thread-db = "external-sourcery-toolchain"
125 PREFERRED_PROVIDER_virtual/linux-libc-headers = "external-sourcery-toolchain"
126 PREFERRED_PROVIDER_virtual/linux-libc-headers-dev = "external-sourcery-toolchain"
127 PREFERRED_PROVIDER_gdbserver = "external-sourcery-toolchain"
diff --git a/conf/distro/include/tcmode-external-xilinx.inc b/conf/distro/include/tcmode-external-xilinx.inc
new file mode 100644
index 00000000..972f9956
--- /dev/null
+++ b/conf/distro/include/tcmode-external-xilinx.inc
@@ -0,0 +1,78 @@
1#
2# Configuration to use external Xilinx toolchain
3#
4
5TOOLCHAIN_PATH_ADD = "${EXTERNAL_TOOLCHAIN}/bin:"
6PATH =. "${TOOLCHAIN_PATH_ADD}"
7
8CSL_TARGET_SYS_armv7a ?= "arm-xilinx-linux-gnueabi"
9CSL_TARGET_SYS_microblazeel ?= "microblazeel-xilinx-linux-gnu"
10CSL_TARGET_SYS = "${TARGET_SYS}"
11
12TARGET_PREFIX = "${CSL_TARGET_SYS}-"
13
14PREFERRED_PROVIDER_linux-libc-headers = "external-xilinx-toolchain"
15PREFERRED_PROVIDER_linux-libc-headers-dev = "external-xilinx-toolchain"
16PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc = "external-xilinx-toolchain"
17PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-initial = "external-xilinx-toolchain"
18PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-intermediate = "external-xilinx-toolchain"
19PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}g++ = "external-xilinx-toolchain"
20PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}binutils = "external-xilinx-toolchain"
21PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}libc-for-gcc = "external-xilinx-toolchain"
22PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}libc-initial = "external-xilinx-toolchain"
23PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}compilerlibs = "external-xilinx-toolchain"
24PREFERRED_PROVIDER_libgcc = "external-xilinx-toolchain"
25PREFERRED_PROVIDER_eglibc = "external-xilinx-toolchain"
26PREFERRED_PROVIDER_virtual/libc = "external-xilinx-toolchain"
27PREFERRED_PROVIDER_virtual/libintl = "external-xilinx-toolchain"
28PREFERRED_PROVIDER_virtual/libiconv = "external-xilinx-toolchain"
29PREFERRED_PROVIDER_glibc-thread-db = "external-xilinx-toolchain"
30PREFERRED_PROVIDER_virtual/linux-libc-headers = "external-xilinx-toolchain"
31PREFERRED_PROVIDER_virtual/linux-libc-headers-dev = "external-xilinx-toolchain"
32PREFERRED_PROVIDER_gdbserver ??= "external-xilinx-toolchain"
33
34# No need to re-compile the locale files
35GLIBC_INTERNAL_USE_BINARY_LOCALE = "precompiled"
36ENABLE_BINARY_LOCALE_GENERATION = ""
37
38TOOLCHAIN_OPTIONS = " --sysroot=${STAGING_DIR_HOST}"
39
40# Default sysroot is inside the Xilinx ARM v7-A toolchain in the '<CSL_TARGET_SYS>/libc' (no debug-root)
41EXTERNAL_TOOLCHAIN_SYSROOT_armv7a ??= "${EXTERNAL_TOOLCHAIN}/${CSL_TARGET_SYS}/libc"
42EXTERNAL_TOOLCHAIN_DBGROOT_armv7a ??= ""
43
44# Default sysroot is inside the Xilinx MicroBlaze toolchain in the '<CSL_TARGET_SYS>/sys-root'
45EXTERNAL_TOOLCHAIN_SYSROOT_microblaze ??= "${EXTERNAL_TOOLCHAIN}/${CSL_TARGET_SYS}/sys-root"
46EXTERNAL_TOOLCHAIN_DBGROOT_microblaze ??= "${EXTERNAL_TOOLCHAIN}/${CSL_TARGET_SYS}/debug-root"
47
48addhandler toolchain_setup
49toolchain_setup[eventmask] = "bb.event.BuildStarted"
50python toolchain_setup () {
51 import errno
52
53 d = e.data
54 d = d.createCopy()
55 d.finalize()
56
57 tarprefix = d.expand('${TARGET_PREFIX}')
58 files = []
59 if tarprefix == "arm-xilinx-linux-gnueabi-":
60 files.append((tarprefix + "ld", tarprefix + "ld.bfd"))
61
62 if len(files) > 0:
63 ext_bindir = d.expand('${EXTERNAL_TOOLCHAIN}/bin')
64 loc_bindir = d.getVar('STAGING_BINDIR_TOOLCHAIN', True)
65 bb.mkdirhier(loc_bindir)
66 for f in files:
67 source = os.path.join(ext_bindir, f[0])
68 dest = os.path.join(loc_bindir, f[1])
69 try:
70 os.symlink(source, dest)
71 except OSError as exc:
72 if exc.errno == errno.EEXIST:
73 break
74 bb.fatal("Unable to populate toolchain binary symlink for %s: %s" % (f[0], f[1]))
75}
76
77require conf/distro/include/xilinx-versions.inc
78
diff --git a/conf/distro/include/xilinx-versions.inc b/conf/distro/include/xilinx-versions.inc
new file mode 100644
index 00000000..8d39789c
--- /dev/null
+++ b/conf/distro/include/xilinx-versions.inc
@@ -0,0 +1,107 @@
1def csl_run(d, cmd, *args):
2 import bb.process
3 import subprocess
4
5 topdir = d.getVar('TOPDIR', True)
6 toolchain_path = d.getVar('EXTERNAL_TOOLCHAIN', True)
7 if not toolchain_path:
8 return 'UNKNOWN', 'UNKNOWN'
9
10 target_prefix = d.getVar('TARGET_PREFIX', True)
11 path = os.path.join(toolchain_path, 'bin', target_prefix + cmd)
12 args = [path] + list(args)
13
14 return bb.process.run(args, cwd=topdir, stderr=subprocess.PIPE)
15
16def csl_get_version(d):
17 try:
18 stdout, stderr = csl_run(d, 'gcc', '-v')
19 except bb.process.CmdError as exc:
20 bb.error('Failed to obtain CodeSourcery toolchain version: %s' % exc)
21 bb.error('Make sure that MACHINE is set correctly in your local.conf and the toolchain supports %s.' % d.getVar("TARGET_ARCH", True))
22 return 'UNKNOWN'
23 else:
24 last_line = stderr.splitlines()[-1]
25 return last_line
26
27def csl_get_main_version(d):
28 version = csl_get_version(d)
29 if version != 'UNKNOWN':
30 return version.split()[-1].rstrip(')')
31 else:
32 return version
33
34def csl_get_gcc_version(d):
35 version = csl_get_version(d)
36 if version != 'UNKNOWN':
37 return version.split()[2]
38 else:
39 return version
40
41def xilinx_get_libc_version(d):
42 syspath = d.expand('${EXTERNAL_TOOLCHAIN_SYSROOT}')
43 if not syspath:
44 return 'UNKNOWN'
45
46 libpath = syspath + '/lib/'
47 if not os.path.exists(libpath):
48 libpath = syspath + '/sgxx-glibc/lib/'
49
50 if os.path.exists(libpath):
51 for file in os.listdir(libpath):
52 if file.find('libc-') == 0:
53 return file[5:-3]
54 return 'UNKNOWN'
55
56def xilinx_get_kernel_version(d):
57 syspath = d.expand('${EXTERNAL_TOOLCHAIN_SYSROOT}')
58 if not syspath:
59 return 'UNKNOWN'
60
61 vf = syspath + '/usr/include/linux/version.h'
62 if not os.path.exists(vf):
63 vf = syspath + '/sgxx-glibc/usr/include/linux/version.h'
64
65 try:
66 f = open(vf, 'r')
67 except (OSError, IOError):
68 return 'UNKNOWN'
69
70 l = f.readlines();
71 f.close();
72 for s in l:
73 if s.find('LINUX_VERSION_CODE') > 0:
74 ver = int(s.split()[2])
75 maj = ver / 65536
76 ver = ver % 65536
77 min = ver / 256
78 ver = ver % 256
79 return str(maj)+'.'+str(min)+'.'+str(ver)
80 return 'UNKNOWN'
81
82def csl_get_gdb_version(d):
83 try:
84 stdout, stderr = csl_run(d, 'gdb', '-v')
85 except bb.process.CmdError:
86 return 'UNKNOWN'
87 else:
88 first_line = stdout.splitlines()[0]
89 return first_line.split()[-1]
90
91python xilinx_version_handler () {
92 d = e.data
93 ld = d.createCopy()
94 ld.finalize()
95
96 d.setVar('CSL_VER_MAIN', csl_get_main_version(ld))
97 d.setVar('CSL_VER_GCC', csl_get_gcc_version(ld))
98 d.setVar('CSL_VER_LIBC', xilinx_get_libc_version(ld))
99 d.setVar('CSL_VER_KERNEL', xilinx_get_kernel_version(ld))
100 d.setVar('CSL_VER_GDB', csl_get_gdb_version(ld))
101}
102addhandler xilinx_version_handler
103xilinx_version_handler[eventmask] = "bb.event.ConfigParsed"
104
105# Ensure that any variable which includes the --sysroot (CC, CXX, etc) also
106# depends on the toolchain version
107TOOLCHAIN_OPTIONS[vardeps] += "CSL_VER_MAIN CSL_VER_GCC"
diff --git a/recipes-core/meta/external-xilinx-toolchain.bb b/recipes-core/meta/external-xilinx-toolchain.bb
new file mode 100644
index 00000000..cc49a476
--- /dev/null
+++ b/recipes-core/meta/external-xilinx-toolchain.bb
@@ -0,0 +1,148 @@
1require recipes-core/eglibc/eglibc-package.inc
2
3INHIBIT_DEFAULT_DEPS = "1"
4
5# License applies to this recipe code, not the toolchain itself
6SUMMARY = "External Xilinx toolchain"
7LICENSE = "MIT"
8LIC_FILES_CHKSUM = " \
9 file://${COREBASE}/LICENSE;md5=3f40d7994397109285ec7b81fdeb3b58 \
10 file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420 \
11 "
12
13DEPENDS += "${@base_conditional('PREFERRED_PROVIDER_linux-libc-headers', PN, '', 'linux-libc-headers', d)}"
14PROVIDES += "\
15 linux-libc-headers \
16 virtual/${TARGET_PREFIX}gcc \
17 virtual/${TARGET_PREFIX}g++ \
18 virtual/${TARGET_PREFIX}gcc-initial \
19 virtual/${TARGET_PREFIX}gcc-intermediate \
20 virtual/${TARGET_PREFIX}binutils \
21 virtual/${TARGET_PREFIX}libc-for-gcc \
22 virtual/${TARGET_PREFIX}libc-initial \
23 virtual/${TARGET_PREFIX}compilerlibs \
24 virtual/libc \
25 virtual/libintl \
26 virtual/libiconv \
27 virtual/linux-libc-headers \
28 glibc-thread-db \
29 libgcc \
30 eglibc \
31 "
32
33PV = "${CSL_VER_MAIN}"
34PR = "r1"
35
36SRC_URI = "file://SUPPORTED"
37
38do_install() {
39 # Use optimized files if available
40 sysroot="${EXTERNAL_TOOLCHAIN_SYSROOT}"
41 dbgroot="${EXTERNAL_TOOLCHAIN_DBGROOT}"
42
43 cp -a $sysroot${base_libdir}/. ${D}${base_libdir}
44 cp -a $sysroot/sbin/. ${D}${base_sbindir}
45
46 install -d ${D}/usr
47 for usr_element in bin libexec sbin share ${base_libdir}; do
48 # Copy files from both the sysroot and the debugroot if they exist
49 if [ ! -z "$sysroot" -a -e $sysroot/usr/$usr_element ]; then
50 cp -a $sysroot/usr/$usr_element ${D}/usr/
51 fi
52 if [ ! -z "$dbgroot" -a -e $dbgroot/usr/$usr_element ]; then
53 cp -a $dbgroot/usr/$usr_element ${D}/usr/
54 fi
55 done
56
57 # Copy Include files
58 cp -a $sysroot/usr/include/. ${D}${includedir}
59
60 # strip out any multi-lib files (they are not supported)
61 for element in bs m ldscripts; do
62 if [ -e ${D}${libdir}/$element ]; then
63 rm -rf ${D}${libdir}/$element
64 fi
65 if [ -e ${D}${base_libdir}/$element ]; then
66 rm -rf ${D}${base_libdir}/$element
67 fi
68 done
69
70 # Clean up the image (remove files and directories that are not packaged)
71 ## ${D}${sysconfdir}
72 for i in ${D}/usr/share/zoneinfo ${D}/usr/lib/bin ${D}/usr/libexec ; do
73 if [ -e $i ]; then
74 rm -rf $i
75 fi
76 done
77
78 # Move libstdc++ to /usr/lib
79 if [ -e ${D}${base_libdir}/libstdc++.so ]; then
80 mv ${D}${base_libdir}/libstdc++.* ${D}${libdir}/
81 fi
82
83 sed -i -e 's/__packed/__attribute__ ((packed))/' ${D}${includedir}/mtd/ubi-user.h
84 sed -i -e "s# ${base_libdir}# ../..${base_libdir}#g" -e "s# ${libdir}# .#g" ${D}${libdir}/libc.so
85 sed -i -e "s# ${base_libdir}# ../..${base_libdir}#g" -e "s# ${libdir}# .#g" ${D}${libdir}/libpthread.so
86}
87
88PACKAGES =+ " \
89 libgcc libgcc-dev \
90 libstdc++ libstdc++-dev libstdc++-staticdev \
91 linux-libc-headers linux-libc-headers-dev \
92 gdbserver gdbserver-dbg \
93 "
94
95# This test should be fixed to ignore .a files in .debug dirs
96INSANE_SKIP_${PN}-dbg = "staticdev"
97
98# We don't care about GNU_HASH in prebuilt binaries
99INSANE_SKIP_${PN}-utils += "ldflags"
100INSANE_SKIP_${PN}-dev += "ldflags"
101INSANE_SKIP_libstdc++ += "ldflags"
102INSANE_SKIP_libgcc += "ldflags"
103INSANE_SKIP_gdbserver += "ldflags"
104
105PKG_${PN} = "eglibc"
106PKG_${PN}-dev = "eglibc-dev"
107PKG_${PN}-staticdev = "eglibc-staticdev"
108PKG_${PN}-doc = "eglibc-doc"
109PKG_${PN}-dbg = "eglibc-dbg"
110PKG_${PN}-pic = "eglibc-pic"
111PKG_${PN}-utils = "eglibc-utils"
112PKG_${PN}-gconv = "eglibc-gconv"
113PKG_${PN}-extra-nss = "eglibc-extra-nss"
114PKG_${PN}-thread-db = "eglibc-thread-db"
115PKG_${PN}-pcprofile = "eglibc-pcprofile"
116
117PKGV = "${CSL_VER_LIBC}"
118PKGV_libgcc = "${CSL_VER_GCC}"
119PKGV_libgcc-dev = "${CSL_VER_GCC}"
120PKGV_libstdc++ = "${CSL_VER_GCC}"
121PKGV_libstdc++-dev = "${CSL_VER_GCC}"
122PKGV_libstdc++-staticdev = "${CSL_VER_GCC}"
123PKGV_linux-libc-headers = "${CSL_VER_KERNEL}"
124PKGV_linux-libc-headers-dev = "${CSL_VER_KERNEL}"
125PKGV_gdbserver = "${CSL_VER_GDB}"
126PKGV_gdbserver-dbg = "${CSL_VER_GDB}"
127
128FILES_libgcc = "${base_libdir}/libgcc_s.so.1"
129FILES_libgcc-dev = "${base_libdir}/libgcc_s.so"
130FILES_libstdc++ = "${libdir}/libstdc++.so.*"
131FILES_libstdc++-dev = " \
132 ${includedir}/c++/${PV} \
133 ${libdir}/libstdc++.so \
134 ${libdir}/libstdc++.la \
135 ${libdir}/libsupc++.la \
136 "
137FILES_libstdc++-staticdev = "${libdir}/libstdc++.a ${libdir}/libsupc++.a"
138FILES_linux-libc-headers = " \
139 ${includedir}/asm* \
140 ${includedir}/linux \
141 ${includedir}/mtd \
142 ${includedir}/rdma \
143 ${includedir}/scsi \
144 ${includedir}/sound \
145 ${includedir}/video \
146 "
147FILES_gdbserver = "${bindir}/gdbserver"
148FILES_gdbserver-dbg = "${bindir}/.debug/gdbserver"
diff --git a/recipes-core/meta/external-xilinx-toolchain/SUPPORTED b/recipes-core/meta/external-xilinx-toolchain/SUPPORTED
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/recipes-core/meta/external-xilinx-toolchain/SUPPORTED