summaryrefslogtreecommitdiffstats
path: root/conf/distro/include
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 /conf/distro/include
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>
Diffstat (limited to 'conf/distro/include')
-rw-r--r--conf/distro/include/tcmode-external-xilinx.inc78
-rw-r--r--conf/distro/include/xilinx-versions.inc107
2 files changed, 185 insertions, 0 deletions
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"