123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- #
- # Configuration to use external Sourcery G++ toolchain
- #
- EXTERNAL_TOOLCHAIN ?= "UNDEFINED"
- # Ensure that pseudo builds both 32 bit and 64 bit binaries, as we need the
- # 32 bit pseudo to execute the 32 bit external toolchain binaries without
- # errors or warnings.
- NO32LIBS ?= "0"
- # We don't need or want to build a cross-compiler to ship in the sdk/ade, as
- # we expect folks to use the Sourcery G++ toolchain on the SDKMACHINE as well.
- TOOLCHAIN_HOST_TASK_remove = "packagegroup-cross-canadian-${MACHINE}"
- # Ensure that we only attempt to package up locales which are available in the
- # external toolchain. In the future, we should examine the external toolchain
- # sysroot and determine this accurately.
- GLIBC_GENERATE_LOCALES_remove = "en_US.UTF-8"
- # The binary locale files are common to the multilibs
- localedir = "${exec_prefix}/lib/locale"
- # No need to re-compile the locale files
- GLIBC_INTERNAL_USE_BINARY_LOCALE ?= "precompiled"
- ENABLE_BINARY_LOCALE_GENERATION = ""
- # Prefer our recipes which extract files from the external toolchain
- PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc ?= "gcc-external-cross-${TARGET_ARCH}"
- PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-initial ?= "gcc-external-cross-${TARGET_ARCH}"
- PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-intermediate ?= "gcc-external-cross-${TARGET_ARCH}"
- PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}g++ ?= "gcc-external-cross-${TARGET_ARCH}"
- PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}binutils ?= "binutils-external-cross-${TARGET_ARCH}"
- PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}compilerlibs ?= "gcc-runtime-external"
- PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}libc-for-gcc ?= "glibc-external"
- PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}libc-initial ?= "glibc-external"
- PREFERRED_PROVIDER_glibc ?= "glibc-external"
- PREFERRED_PROVIDER_virtual/libc ?= "glibc-external"
- PREFERRED_PROVIDER_virtual/libintl ?= "glibc-external"
- PREFERRED_PROVIDER_virtual/libiconv ?= "glibc-external"
- PREFERRED_PROVIDER_gdbserver ??= "gdbserver-external"
- PREFERRED_PROVIDER_oprofile ??= "oprofile"
- # These are defined in default-providers.inc, which is parsed before the
- # tcmode, so we can't use ?= for them.
- PREFERRED_PROVIDER_libgcc = "libgcc-external"
- PREFERRED_PROVIDER_linux-libc-headers = "linux-libc-headers-external"
- # Ensure that we don't pull in any internal toolchain recipes
- INHERIT += "blacklist"
- PNBLACKLIST[uclibc] = "not building with an external toolchain"
- PNBLACKLIST[uclibc-initial] = "not building with an external toolchain"
- PNBLACKLIST[glibc] = "not building with an external toolchain"
- PNBLACKLIST[glibc-initial] = "not building with an external toolchain"
- PNBLACKLIST[glibc-intermediate] = "not building with an external toolchain"
- PNBLACKLIST[binutils-cross] = "not building with an external toolchain"
- PNBLACKLIST[gcc-cross] = "not building with an external toolchain"
- PNBLACKLIST[gcc-cross-initial] = "not building with an external toolchain"
- PNBLACKLIST[gcc-cross-intermediate] = "not building with an external toolchain"
- PNBLACKLIST[gcc-runtime] = "not building with an external toolchain"
- PNBLACKLIST[libgcc] = "not building with an external toolchain"
- PNBLACKLIST[linux-libc-headers] = "not building with an external toolchain"
- PNBLACKLIST[linux-libc-headers-yocto] = "not building with an external toolchain"
- PNBLACKLIST[external-sourcery-toolchain] = "using meta-sourcery, not poky's external toolchain"
- # Determine the prefixes to check for based on the target architecture (before
- # any classes alter TARGET_ARCH)
- EXTERNAL_TARGET_SYSTEMS[powerpc] ?= "powerpc-linux-gnu powerpc-mentor-linux-gnu"
- EXTERNAL_TARGET_SYSTEMS[powerpc64] ?= "powerpc-linux-gnu powerpc-mentor-linux-gnu"
- EXTERNAL_TARGET_SYSTEMS[arm] ?= "arm-none-linux-gnueabi arm-mentor-linux-gnueabi"
- EXTERNAL_TARGET_SYSTEMS[mips] ?= "mips-linux-gnu mips-mentor-linux-gnu"
- EXTERNAL_TARGET_SYSTEMS[mipsel] ?= "mips-linux-gnu mips-mentor-linux-gnu"
- EXTERNAL_TARGET_SYSTEMS[mips64] ?= "mips64-nlm-linux-gnu mips-linux-gnu mips-mentor-linux-gnu"
- EXTERNAL_TARGET_SYSTEMS[x86_64] ?= "i686-pc-linux-gnu i686-mentor-linux-gnu x86_64-linux-gnu x86_64-amd-linux-gnu"
- EXTERNAL_TARGET_SYSTEMS[i686] ?= "i686-pc-linux-gnu i686-mentor-linux-gnu"
- EXTERNAL_TARGET_SYSTEMS[i586] ?= "i686-pc-linux-gnu i686-mentor-linux-gnu"
- EXTERNAL_TARGET_SYSTEMS = "${TARGET_SYS}"
- def external_target_sys(d):
- toolchain_path = d.getVar('EXTERNAL_TOOLCHAIN', True)
- for triplet in d.getVar('EXTERNAL_TARGET_SYSTEMS', True).split():
- gcc = os.path.join(toolchain_path, 'bin', triplet + '-gcc')
- if os.path.exists(gcc):
- return triplet
- return '${TARGET_SYS}'
- EXTERNAL_TARGET_SYS ?= "${@external_target_sys(d)}"
- TARGET_PREFIX = "${EXTERNAL_TARGET_SYS}-"
- TOOLCHAIN_OPTIONS = " --sysroot=${STAGING_DIR_HOST}"
- CSL_IS_PRO = "${@'1' if os.path.exists('${EXTERNAL_TOOLCHAIN}/license') else '0'}"
- LDEMULATION = ""
- LDEMULATION_ENDIAN = "${@'bt' if 'bigendian' in TUNE_FEATURES.split() else 'lt'}"
- LDEMULATION_BITS = "${@'64' if 'n64' in TUNE_FEATURES.split() else '32'}"
- LDEMULATION_mips64 = "elf${LDEMULATION_BITS}${LDEMULATION_ENDIAN}smip${@bb.utils.contains('TUNE_FEATURES', 'n32', 'n32', '', d)}"
- TUNE_LDARGS += "${@'-m ${LDEMULATION}' if LDEMULATION else ''}"
- # Ensure that the licensing variables are available to the toolchain.
- export MGLS_LICENSE_FILE
- export LM_LICENSE_FILE
- python toolchain_metadata_setup () {
- import subprocess
- import tempfile
- d = e.data
- # Ensure that changes to toolchain licensing don't affect checksums
- d.appendVar('BB_HASHBASE_WHITELIST', ' MGLS_LICENSE_FILE LM_LICENSE_FILE')
- l = d.createCopy()
- l.finalize()
- systems = l.getVarFlag('EXTERNAL_TARGET_SYSTEMS', l.getVar('TARGET_ARCH', True), True)
- if systems:
- d.setVar('EXTERNAL_TARGET_SYSTEMS', systems)
- # Remove already-added toolchain install paths from the PATH, as they can
- # break the build (in particular, the ia32 toolchain, as it provdes
- # non-prefixed binaries).
- install_prefix_default = bb.data.expand('${HOME}/CodeSourcery/', l)
- path = d.getVar('PATH', False).split(':')
- path = filter(lambda p: not p.startswith(install_prefix_default), path)
- d.setVar('PATH', ':'.join(path))
- # The external toolchain may not have been built with the yocto preferred
- # gnu hash setting, so ensure that the corresponding sanity check is a
- # warning, not an error.
- error_qa = (l.getVar('ERROR_QA', True) or '').split()
- if 'ldflags' in error_qa:
- error_qa.remove('ldflags')
- d.setVar('ERROR_QA', ' '.join(error_qa))
- d.appendVar('WARN_QA', ' ldflags')
- # Determine if '-msgxx-glibc' is a valid toolchain option.
- # If so then we need to use it to ensure that the libraries included with
- # the toolchain are used rather than the build host native libraries.
- with tempfile.NamedTemporaryFile(suffix='.c') as f:
- try:
- subprocess.check_output([d.expand('${EXTERNAL_TOOLCHAIN}/bin/${EXTERNAL_TARGET_SYS}-gcc'), '-msgxx-glibc', '-E', f.name], cwd=d.getVar('TOPDIR', True), stderr=subprocess.STDOUT)
- except (OSError, subprocess.CalledProcessError):
- return
- else:
- d.appendVar('TUNE_CCARGS', ' -msgxx-glibc')
- }
- toolchain_metadata_setup[eventmask] = "bb.event.ConfigParsed"
- addhandler toolchain_metadata_setup
- python toolchain_sanity_check () {
- external_toolchain = e.data.getVar('EXTERNAL_TOOLCHAIN', True)
- if not external_toolchain or external_toolchain == 'UNDEFINED':
- bb.fatal("Error: EXTERNAL_TOOLCHAIN must be set to the path to your sourcery toolchain")
- if not os.path.exists(external_toolchain):
- bb.fatal("Error: EXTERNAL_TOOLCHAIN path '%s' does not exist" % external_toolchain)
- }
- toolchain_sanity_check[eventmask] = "bb.event.BuildStarted"
- addhandler toolchain_sanity_check
- require conf/distro/include/external-run.inc
- GCC_VERSION = "${@external_run(d, 'gcc', '-dumpversion').rstrip()}"
- GCC_VERSION_allarch = ""
- GCC_VERSION[vardepvalue] = "${GCC_VERSION}"
- def sourcery_version(d):
- version = external_run(d, 'gcc', '-v').splitlines()[-1]
- if version != 'UNKNOWN':
- main_version = version.split()[-1].rstrip(')')
- if main_version == 'Preview':
- main_version = version.split()[-3]
- return main_version
- else:
- return version
- SOURCERY_VERSION = "${@sourcery_version(d)}"
- SOURCERY_VERSION_allarch = ""
- # Add sourcery toolchain version to external recipe versions
- EXTERNAL_PV_SUFFIX ?= "-${SOURCERY_VERSION}"
- EXTERNAL_PV_SUFFIX_allarch = ""
- BUILDCFG_VARS += "SOURCERY_VERSION GCC_VERSION EXTERNAL_TOOLCHAIN"
- # Adjust tunings to ensure we're using Sourcery G++ multilibs
- require conf/distro/include/sourcery-tuning.inc
|