From cf9571203be0af5fc654952d3f00e0a7e0fb1174 Mon Sep 17 00:00:00 2001 From: Nathan Rossi Date: Fri, 20 Sep 2013 17:57:51 +1000 Subject: external-xilinx-toochain: Created recipe * Allows use of external Xilinx MicroBlaze and Zynq pre-built toolchains * Does not require additional layer dependencies * Backported from master Signed-off-by: Nathan Rossi --- conf/distro/include/tcmode-external-xilinx.inc | 79 ++++++++++++++++++ conf/distro/include/xilinx-versions.inc | 108 +++++++++++++++++++++++++ 2 files changed, 187 insertions(+) create mode 100644 conf/distro/include/tcmode-external-xilinx.inc create mode 100644 conf/distro/include/xilinx-versions.inc (limited to 'conf') diff --git a/conf/distro/include/tcmode-external-xilinx.inc b/conf/distro/include/tcmode-external-xilinx.inc new file mode 100644 index 00000000..6859f8f9 --- /dev/null +++ b/conf/distro/include/tcmode-external-xilinx.inc @@ -0,0 +1,79 @@ +# +# Configuration to use external Xilinx toolchain +# + +TOOLCHAIN_PATH_ADD = "${EXTERNAL_TOOLCHAIN}/bin:" +PATH =. "${TOOLCHAIN_PATH_ADD}" + +CSL_TARGET_SYS_armv7a ?= "arm-xilinx-linux-gnueabi" +CSL_TARGET_SYS_microblazeel ?= "microblazeel-xilinx-linux-gnu" +CSL_TARGET_SYS = "${TARGET_SYS}" + +TARGET_PREFIX = "${CSL_TARGET_SYS}-" + +PREFERRED_PROVIDER_linux-libc-headers = "external-xilinx-toolchain" +PREFERRED_PROVIDER_linux-libc-headers-dev = "external-xilinx-toolchain" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc = "external-xilinx-toolchain" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-initial = "external-xilinx-toolchain" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-intermediate = "external-xilinx-toolchain" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}g++ = "external-xilinx-toolchain" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}binutils = "external-xilinx-toolchain" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}libc-for-gcc = "external-xilinx-toolchain" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}libc-initial = "external-xilinx-toolchain" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}compilerlibs = "external-xilinx-toolchain" +PREFERRED_PROVIDER_libgcc = "external-xilinx-toolchain" +PREFERRED_PROVIDER_eglibc = "external-xilinx-toolchain" +PREFERRED_PROVIDER_virtual/libc = "external-xilinx-toolchain" +PREFERRED_PROVIDER_virtual/libintl = "external-xilinx-toolchain" +PREFERRED_PROVIDER_virtual/libiconv = "external-xilinx-toolchain" +PREFERRED_PROVIDER_glibc-thread-db = "external-xilinx-toolchain" +PREFERRED_PROVIDER_virtual/linux-libc-headers = "external-xilinx-toolchain" +PREFERRED_PROVIDER_virtual/linux-libc-headers-dev = "external-xilinx-toolchain" +PREFERRED_PROVIDER_gdbserver ?= "external-xilinx-toolchain" + +# No need to re-compile the locale files +GLIBC_INTERNAL_USE_BINARY_LOCALE = "precompiled" +ENABLE_BINARY_LOCALE_GENERATION = "" + +TOOLCHAIN_OPTIONS = " --sysroot=${STAGING_DIR_HOST}" + +# Default sysroot is inside the Xilinx ARM v7-A toolchain in the '/libc' (no debug-root) +EXTERNAL_TOOLCHAIN_SYSROOT_armv7a ?= "${EXTERNAL_TOOLCHAIN}/${CSL_TARGET_SYS}/libc" +EXTERNAL_TOOLCHAIN_DBGROOT_armv7a ?= "" + +# Default sysroot is inside the Xilinx MicroBlaze toolchain in the '/sys-root' +EXTERNAL_TOOLCHAIN_SYSROOT_microblaze ?= "${EXTERNAL_TOOLCHAIN}/${CSL_TARGET_SYS}/sys-root" +EXTERNAL_TOOLCHAIN_DBGROOT_microblaze ?= "${EXTERNAL_TOOLCHAIN}/${CSL_TARGET_SYS}/debug-root" + +addhandler toolchain_setup +python toolchain_setup () { + if not isinstance(e, bb.event.BuildStarted): + return + import errno + + d = e.data + d = d.createCopy() + d.finalize() + + tarprefix = d.expand('${TARGET_PREFIX}') + files = [] + if tarprefix == "arm-xilinx-linux-gnueabi-": + files.append((tarprefix + "ld", tarprefix + "ld.bfd")) + + if len(files) > 0: + ext_bindir = d.expand('${EXTERNAL_TOOLCHAIN}/bin') + loc_bindir = d.getVar('STAGING_BINDIR_TOOLCHAIN', True) + bb.mkdirhier(loc_bindir) + for f in files: + source = os.path.join(ext_bindir, f[0]) + dest = os.path.join(loc_bindir, f[1]) + try: + os.symlink(source, dest) + except OSError as exc: + if exc.errno == errno.EEXIST: + break + bb.fatal("Unable to populate toolchain binary symlink for %s: %s" % (f[0], f[1])) +} + +require conf/distro/include/xilinx-versions.inc + diff --git a/conf/distro/include/xilinx-versions.inc b/conf/distro/include/xilinx-versions.inc new file mode 100644 index 00000000..a65358d4 --- /dev/null +++ b/conf/distro/include/xilinx-versions.inc @@ -0,0 +1,108 @@ +def csl_run(d, cmd, *args): + import bb.process + import subprocess + + topdir = d.getVar('TOPDIR', True) + toolchain_path = d.getVar('EXTERNAL_TOOLCHAIN', True) + if not toolchain_path: + return 'UNKNOWN', 'UNKNOWN' + + target_prefix = d.getVar('TARGET_PREFIX', True) + path = os.path.join(toolchain_path, 'bin', target_prefix + cmd) + args = [path] + list(args) + + return bb.process.run(args, cwd=topdir, stderr=subprocess.PIPE) + +def csl_get_version(d): + try: + stdout, stderr = csl_run(d, 'gcc', '-v') + except bb.process.CmdError as exc: + bb.error('Failed to obtain CodeSourcery toolchain version: %s' % exc) + bb.error('Make sure that MACHINE is set correctly in your local.conf and the toolchain supports %s.' % d.getVar("TARGET_ARCH", True)) + return 'UNKNOWN' + else: + last_line = stderr.splitlines()[-1] + return last_line + +def csl_get_main_version(d): + version = csl_get_version(d) + if version != 'UNKNOWN': + return version.split()[-1].rstrip(')') + else: + return version + +def csl_get_gcc_version(d): + version = csl_get_version(d) + if version != 'UNKNOWN': + return version.split()[2] + else: + return version + +def xilinx_get_libc_version(d): + syspath = d.expand('${EXTERNAL_TOOLCHAIN_SYSROOT}') + if not syspath: + return 'UNKNOWN' + + libpath = syspath + '/lib/' + if not os.path.exists(libpath): + libpath = syspath + '/sgxx-glibc/lib/' + + if os.path.exists(libpath): + for file in os.listdir(libpath): + if file.find('libc-') == 0: + return file[5:-3] + return 'UNKNOWN' + +def xilinx_get_kernel_version(d): + syspath = d.expand('${EXTERNAL_TOOLCHAIN_SYSROOT}') + if not syspath: + return 'UNKNOWN' + + vf = syspath + '/usr/include/linux/version.h' + if not os.path.exists(vf): + vf = syspath + '/sgxx-glibc/usr/include/linux/version.h' + + try: + f = open(vf, 'r') + except (OSError, IOError): + return 'UNKNOWN' + + l = f.readlines(); + f.close(); + for s in l: + if s.find('LINUX_VERSION_CODE') > 0: + ver = int(s.split()[2]) + maj = ver / 65536 + ver = ver % 65536 + min = ver / 256 + ver = ver % 256 + return str(maj)+'.'+str(min)+'.'+str(ver) + return 'UNKNOWN' + +def csl_get_gdb_version(d): + try: + stdout, stderr = csl_run(d, 'gdb', '-v') + except bb.process.CmdError: + return 'UNKNOWN' + else: + first_line = stdout.splitlines()[0] + return first_line.split()[-1] + +python xilinx_version_handler () { + if not isinstance(e, bb.event.ConfigParsed): + return + d = e.data + ld = d.createCopy() + ld.finalize() + + d.setVar('CSL_VER_MAIN', csl_get_main_version(ld)) + d.setVar('CSL_VER_GCC', csl_get_gcc_version(ld)) + d.setVar('CSL_VER_LIBC', xilinx_get_libc_version(ld)) + d.setVar('CSL_VER_KERNEL', xilinx_get_kernel_version(ld)) + d.setVar('CSL_VER_GDB', csl_get_gdb_version(ld)) +} +addhandler xilinx_version_handler + +# Ensure that any variable which includes the --sysroot (CC, CXX, etc) also +# depends on the toolchain version +TOOLCHAIN_OPTIONS[vardeps] += "CSL_VER_MAIN CSL_VER_GCC" -- cgit v1.2.3-54-g00ecf