tcmode-external.inc 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. # Configuration to use external Sourcery G++ toolchain
  2. EXTERNAL_TOOLCHAIN ??= "UNKNOWN"
  3. EXTERNAL_TARGET_SYS ??= "${TARGET_ARCH}-${TARGET_OS}"
  4. EXTERNAL_TOOLCHAIN_BIN ??= "${EXTERNAL_TOOLCHAIN}/bin"
  5. EXTERNAL_ENABLED = "1"
  6. # External toolchain features.
  7. #
  8. # locale-utf8-is-default: assume en_US is utf8, not en_US.UTF-8, as is the
  9. # case for OE.
  10. EXTERNAL_TOOLCHAIN_FEATURES_DEFAULT ??= ""
  11. EXTERNAL_TOOLCHAIN_FEATURES ?= "${EXTERNAL_TOOLCHAIN_FEATURES_DEFAULT}"
  12. python () {
  13. oe.utils.features_backfill("EXTERNAL_TOOLCHAIN_FEATURES", d)
  14. }
  15. # Prefer our recipes which extract files from the external toolchain
  16. PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc ?= "gcc-external-cross-${TARGET_ARCH}"
  17. PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-intermediate ?= "gcc-external-cross-${TARGET_ARCH}"
  18. PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}g++ ?= "gcc-external-cross-${TARGET_ARCH}"
  19. PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}binutils ?= "binutils-external-cross-${TARGET_ARCH}"
  20. PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}compilerlibs ?= "gcc-runtime-external"
  21. PREFERRED_PROVIDER_gcc-runtime = "gcc-runtime-external"
  22. PREFERRED_PROVIDER_gcc-sanitizers ?= "gcc-sanitizers-external"
  23. PREFERRED_PROVIDER_libgcc-initial = "libgcc-external"
  24. PREFERRED_PROVIDER_libnsl2 = "libnsl2"
  25. PREFERRED_PROVIDER_libtirpc = "libtirpc"
  26. # PREFERRED_PROVIDER_libgfortran = "libgfortran-external"
  27. PREFERRED_PROVIDER_glibc ?= "glibc-external"
  28. PREFERRED_PROVIDER_virtual/libc ?= "glibc-external"
  29. PREFERRED_PROVIDER_virtual/libintl ?= "glibc-external"
  30. PREFERRED_PROVIDER_virtual/libiconv ?= "glibc-external"
  31. PREFERRED_PROVIDER_virtual/crypt ?= "libxcrypt"
  32. PREFERRED_PROVIDER_gdb-cross-${TARGET_ARCH} ?= "gdb-external-cross-${TARGET_ARCH}"
  33. PREFERRED_PROVIDER_oprofile ??= "oprofile"
  34. # Work around bug where the implicitly created mlprefix preference isn't being
  35. # obeyed for the runtime package installation.
  36. PREFERRED_PROVIDER_${MLPREFIX}gdbserver ?= "${MLPREFIX}gdb"
  37. # This is defined in default-providers.inc, which is parsed before the tcmode,
  38. # so we can't use ?=
  39. PREFERRED_PROVIDER_linux-libc-headers = "glibc-external"
  40. SKIP_RECIPE[linux-libc-headers] = "not building with an external toolchain"
  41. SKIP_RECIPE[linux-libc-headers-yocto] = "not building with an external toolchain"
  42. PREFERRED_PROVIDER_gcc-cross-canadian-${TRANSLATED_TARGET_ARCH} ??= "gcc-external-cross-canadian-${TRANSLATED_TARGET_ARCH}"
  43. PREFERRED_PROVIDER_binutils-cross-canadian-${TRANSLATED_TARGET_ARCH} ??= "binutils-external-cross-canadian-${TRANSLATED_TARGET_ARCH}"
  44. PREFERRED_PROVIDER_gdb-cross-canadian-${TRANSLATED_TARGET_ARCH} ??= "gdb-external-cross-canadian-${TRANSLATED_TARGET_ARCH}"
  45. # This is defined in default-providers.inc, which is parsed before the tcmode,
  46. # so we can't use ?=
  47. PREFERRED_PROVIDER_libgcc = "libgcc-external"
  48. # Pass --no-sysroot-suffix when using an external toolchain with the SDK
  49. TOOLCHAIN_TARGET_TASK:append = " sdk-env-external-toolchain"
  50. # Sanity check the toolchain configuration and toolchain
  51. INHERIT += "sanity-external-toolchain"
  52. # Ensure that we don't pull in any internal toolchain recipes
  53. INHERIT += "skip_recipe_dynamic"
  54. SKIP_RECIPE[uclibc] = "not building with an external toolchain"
  55. SKIP_RECIPE[glibc] = "not building with an external toolchain"
  56. SKIP_RECIPE[glibc-intermediate] = "not building with an external toolchain"
  57. SKIP_RECIPE[gcc-runtime] = "not building with an external toolchain"
  58. SKIP_RECIPE[gcc-sanitizers] = "not building with an external toolchain"
  59. SKIP_RECIPE[gcc-source] = "not building with an external toolchain"
  60. SKIP_RECIPE[libgcc-initial] = "not building with an external toolchain"
  61. SKIP_RECIPE[libgcc] = "not building with an external toolchain"
  62. SKIP_RECIPE[libgfortran] = "not building with an external toolchain"
  63. SKIP_RECIPE_DYNAMIC += "\
  64. ${MLPREFIX}gcc-cross-${TARGET_ARCH} \
  65. \
  66. binutils-cross-canadian-${TRANSLATED_TARGET_ARCH} \
  67. gcc-cross-canadian-${TRANSLATED_TARGET_ARCH} \
  68. gdb-cross-canadian-${TRANSLATED_TARGET_ARCH} \
  69. \
  70. gcc-source-${@'${GCCVERSION}'.replace('%', '')} \
  71. "
  72. # We need our -cross recipes to rebuild when the external toolchain changes,
  73. # to recreate the links / wrapper scripts
  74. BB_BASEHASH_IGNORE_VARS:remove = "EXTERNAL_TOOLCHAIN"
  75. # For a toolchain built with multilibs, we don't want any suffix implicitly
  76. # added to the oe sysroot path, as those dirs will not exist.
  77. # TOOLCHAIN_OPTIONS would seem more appropriate, but that gets added to LD as
  78. # well, and --no-sysroot-suffix only works for gcc, not binutils.
  79. NO_SYSROOT_SUFFIX = " --no-sysroot-suffix"
  80. NO_SYSROOT_SUFFIX:toolchain-clang = ""
  81. HOST_CC_ARCH .= "${NO_SYSROOT_SUFFIX}"
  82. # Certain recipes call ld directly, so ensure the correct emulation is used,
  83. # particularly for multilib toolchains, since we can't rely on the default
  84. LDEMULATION = ""
  85. LDEMULATION_ENDIAN = "${@'bt' if 'bigendian' in '${TUNE_FEATURES}'.split() else 'lt'}"
  86. LDEMULATION_BITS = "${@'64' if 'n64' in '${TUNE_FEATURES}'.split() else '32'}"
  87. LDEMULATION:mips64 = "elf${LDEMULATION_BITS}${LDEMULATION_ENDIAN}smip${@bb.utils.contains('TUNE_FEATURES', 'n32', 'n32', '', d)}"
  88. LDEMULATION:x86-64 = "elf_${TARGET_ARCH}"
  89. LDEMULATION:x86-64:linux-gnux32 = "elf32_${TARGET_ARCH}"
  90. TUNE_LDARGS += "${@'-m ${LDEMULATION}' if '${LDEMULATION}' else ''}"
  91. # Additional search path for compiler component programs, to let us rebuild
  92. # binutils if necessary.
  93. gcc_bindir = "${STAGING_BINDIR_TOOLCHAIN}/gcc"
  94. TARGET_CC_ARCH .= "${@' -B${gcc_bindir}' if d.getVar('PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}binutils') != 'binutils-external-cross-${TARGET_ARCH}' else ''}"
  95. # Align the external toolchain ldflags with the internal
  96. TARGET_LDFLAGS_BUILD_ID = "-Wl,--build-id=sha1"
  97. TARGET_LDFLAGS += "${TARGET_LDFLAGS_BUILD_ID}"
  98. TCMODEOVERRIDES ?= "tcmode-external"
  99. OVERRIDES =. "${TCMODEOVERRIDES}:"
  100. python toolchain_metadata_setup () {
  101. # The external toolchain may not have been built with the yocto preferred
  102. # gnu hash setting, so ensure that the corresponding sanity check is a
  103. # warning, not an error.
  104. error_qa = (d.getVar('ERROR_QA', True) or '').split()
  105. if 'ldflags' in error_qa:
  106. error_qa.remove('ldflags')
  107. d.setVar('ERROR_QA', ' '.join(error_qa))
  108. d.appendVar('WARN_QA', ' ldflags')
  109. }
  110. toolchain_metadata_setup[eventmask] = "bb.event.ConfigParsed"
  111. addhandler toolchain_metadata_setup
  112. GCCVERSION ?= "${@'.'.join('${GCC_VERSION}'.split('.')[:2])}%"
  113. GCC_VERSION = "${@external_run(d, d.getVar('EXTERNAL_CC'), '-dumpversion').rstrip()}"
  114. GCC_VERSION_allarch = ""
  115. GCC_VERSION[vardepvalue] = "${GCC_VERSION}"
  116. # macro-prefix-map was introduced in gcc 8
  117. REMOVE_MACRO_PREFIX_MAP = "-fmacro-prefix-map=${WORKDIR}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}"
  118. DEBUG_PREFIX_MAP:remove:class-target = "${@'${REMOVE_MACRO_PREFIX_MAP}' if '${GCC_VERSION}' not in ['', 'UNKNOWN'] and [int(v) for v in '${GCC_VERSION}'.split('.')] < [8,0] else ''}"
  119. BUILDCFG_VARS += "EXTERNAL_TOOLCHAIN EXTERNAL_TARGET_SYS GCC_VERSION"