cross-canadian.bbclass 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #
  2. # Copyright OpenEmbedded Contributors
  3. #
  4. # NOTE - When using this class the user is responsible for ensuring that
  5. # TRANSLATED_TARGET_ARCH is added into PN. This ensures that if the TARGET_ARCH
  6. # is changed, another nativesdk xxx-canadian-cross can be installed
  7. #
  8. # SDK packages are built either explicitly by the user,
  9. # or indirectly via dependency. No need to be in 'world'.
  10. EXCLUDE_FROM_WORLD = "1"
  11. NATIVESDKLIBC ?= "libc-glibc"
  12. LIBCOVERRIDE = ":${NATIVESDKLIBC}"
  13. CLASSOVERRIDE = "class-cross-canadian"
  14. STAGING_BINDIR_TOOLCHAIN = "${STAGING_DIR_NATIVE}${bindir_native}/${SDK_ARCH}${SDK_VENDOR}-${SDK_OS}:${STAGING_DIR_NATIVE}${bindir_native}/${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS}"
  15. #
  16. # Update BASE_PACKAGE_ARCH and PACKAGE_ARCHS
  17. #
  18. PACKAGE_ARCH = "${SDK_ARCH}-${SDKPKGSUFFIX}"
  19. BASECANADIANEXTRAOS ?= "linux-musl"
  20. CANADIANEXTRAOS = "${BASECANADIANEXTRAOS}"
  21. CANADIANEXTRAVENDOR = ""
  22. MODIFYTOS ??= "1"
  23. python () {
  24. archs = d.getVar('PACKAGE_ARCHS').split()
  25. sdkarchs = []
  26. for arch in archs:
  27. sdkarchs.append(arch + '-${SDKPKGSUFFIX}')
  28. d.setVar('PACKAGE_ARCHS', " ".join(sdkarchs))
  29. # Allow the following code segment to be disabled, e.g. meta-environment
  30. if d.getVar("MODIFYTOS") != "1":
  31. return
  32. if d.getVar("TCLIBC") in [ 'baremetal', 'newlib' ]:
  33. return
  34. tos = d.getVar("TARGET_OS")
  35. tos_known = ["mingw32"]
  36. extralibcs = [""]
  37. if "musl" in d.getVar("BASECANADIANEXTRAOS"):
  38. extralibcs.append("musl")
  39. if "android" in tos:
  40. extralibcs.append("android")
  41. for variant in ["", "spe", "x32", "eabi", "n32", "_ilp32"]:
  42. for libc in extralibcs:
  43. entry = "linux"
  44. if variant and libc:
  45. entry = entry + "-" + libc + variant
  46. elif variant:
  47. entry = entry + "-gnu" + variant
  48. elif libc:
  49. entry = entry + "-" + libc
  50. tos_known.append(entry)
  51. if tos not in tos_known:
  52. bb.fatal("Building cross-candian for an unknown TARGET_SYS (%s), please update cross-canadian.bbclass" % d.getVar("TARGET_SYS"))
  53. for n in ["PROVIDES", "DEPENDS"]:
  54. d.setVar(n, d.getVar(n))
  55. d.setVar("STAGING_BINDIR_TOOLCHAIN", d.getVar("STAGING_BINDIR_TOOLCHAIN"))
  56. for prefix in ["AR", "AS", "DLLTOOL", "CC", "CXX", "GCC", "LD", "LIPO", "NM", "OBJDUMP", "RANLIB", "STRIP", "WINDRES"]:
  57. n = prefix + "_FOR_TARGET"
  58. d.setVar(n, d.getVar(n))
  59. # This is a bit ugly. We need to zero LIBC/ABI extension which will change TARGET_OS
  60. # however we need the old value in some variables. We expand those here first.
  61. tarch = d.getVar("TARGET_ARCH")
  62. if tarch == "x86_64":
  63. d.setVar("LIBCEXTENSION", "")
  64. d.setVar("ABIEXTENSION", "")
  65. d.appendVar("CANADIANEXTRAOS", " linux-gnux32")
  66. for extraos in d.getVar("BASECANADIANEXTRAOS").split():
  67. d.appendVar("CANADIANEXTRAOS", " " + extraos + "x32")
  68. elif tarch == "powerpc":
  69. # PowerPC can build "linux" and "linux-gnuspe"
  70. d.setVar("LIBCEXTENSION", "")
  71. d.setVar("ABIEXTENSION", "")
  72. d.appendVar("CANADIANEXTRAOS", " linux-gnuspe")
  73. for extraos in d.getVar("BASECANADIANEXTRAOS").split():
  74. d.appendVar("CANADIANEXTRAOS", " " + extraos + "spe")
  75. elif tarch == "mips64":
  76. d.appendVar("CANADIANEXTRAOS", " linux-gnun32")
  77. for extraos in d.getVar("BASECANADIANEXTRAOS").split():
  78. d.appendVar("CANADIANEXTRAOS", " " + extraos + "n32")
  79. if tarch == "arm" or tarch == "armeb":
  80. d.appendVar("CANADIANEXTRAOS", " linux-gnueabi linux-musleabi")
  81. d.setVar("TARGET_OS", "linux-gnueabi")
  82. else:
  83. d.setVar("TARGET_OS", "linux")
  84. # Also need to handle multilib target vendors
  85. vendors = d.getVar("CANADIANEXTRAVENDOR")
  86. if not vendors:
  87. vendors = all_multilib_tune_values(d, 'TARGET_VENDOR')
  88. origvendor = d.getVar("TARGET_VENDOR_MULTILIB_ORIGINAL")
  89. if origvendor:
  90. d.setVar("TARGET_VENDOR", origvendor)
  91. if origvendor not in vendors.split():
  92. vendors = origvendor + " " + vendors
  93. d.setVar("CANADIANEXTRAVENDOR", vendors)
  94. }
  95. MULTIMACH_TARGET_SYS = "${PACKAGE_ARCH}${HOST_VENDOR}-${HOST_OS}"
  96. INHIBIT_DEFAULT_DEPS = "1"
  97. STAGING_DIR_HOST = "${RECIPE_SYSROOT}"
  98. TOOLCHAIN_OPTIONS = " --sysroot=${RECIPE_SYSROOT}"
  99. PATH:append = ":${TMPDIR}/sysroots/${HOST_ARCH}/${bindir_cross}"
  100. PKGHIST_DIR = "${TMPDIR}/pkghistory/${HOST_ARCH}-${SDKPKGSUFFIX}${HOST_VENDOR}-${HOST_OS}/"
  101. HOST_ARCH = "${SDK_ARCH}"
  102. HOST_VENDOR = "${SDK_VENDOR}"
  103. HOST_OS = "${SDK_OS}"
  104. HOST_PREFIX = "${SDK_PREFIX}"
  105. HOST_CC_ARCH = "${SDK_CC_ARCH}"
  106. HOST_LD_ARCH = "${SDK_LD_ARCH}"
  107. HOST_AS_ARCH = "${SDK_AS_ARCH}"
  108. #assign DPKG_ARCH
  109. DPKG_ARCH = "${@debian_arch_map(d.getVar('SDK_ARCH'), '')}"
  110. CPPFLAGS = "${BUILDSDK_CPPFLAGS}"
  111. CFLAGS = "${BUILDSDK_CFLAGS}"
  112. CXXFLAGS = "${BUILDSDK_CFLAGS}"
  113. LDFLAGS = "${BUILDSDK_LDFLAGS} \
  114. -Wl,-rpath-link,${STAGING_LIBDIR}/.. \
  115. -Wl,-rpath,${libdir}/.. "
  116. #
  117. # We need chrpath >= 0.14 to ensure we can deal with 32 and 64 bit
  118. # binaries
  119. #
  120. DEPENDS:append = " chrpath-replacement-native"
  121. EXTRANATIVEPATH += "chrpath-native"
  122. # Path mangling needed by the cross packaging
  123. # Note that we use := here to ensure that libdir and includedir are
  124. # target paths.
  125. target_base_prefix := "${base_prefix}"
  126. target_prefix := "${prefix}"
  127. target_exec_prefix := "${exec_prefix}"
  128. target_base_libdir = "${target_base_prefix}/${baselib}"
  129. target_libdir = "${target_exec_prefix}/${baselib}"
  130. target_includedir := "${includedir}"
  131. # Change to place files in SDKPATH
  132. base_prefix = "${SDKPATHNATIVE}"
  133. prefix = "${SDKPATHNATIVE}${prefix_nativesdk}"
  134. exec_prefix = "${SDKPATHNATIVE}${prefix_nativesdk}"
  135. bindir = "${exec_prefix}/bin/${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS}"
  136. sbindir = "${bindir}"
  137. base_bindir = "${bindir}"
  138. base_sbindir = "${bindir}"
  139. libdir = "${exec_prefix}/lib/${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS}"
  140. libexecdir = "${exec_prefix}/libexec/${TARGET_ARCH}${TARGET_VENDOR}-${TARGET_OS}"
  141. FILES:${PN} = "${prefix}"
  142. export PKG_CONFIG_DIR = "${STAGING_DIR_HOST}${exec_prefix}/lib/pkgconfig"
  143. export PKG_CONFIG_SYSROOT_DIR = "${STAGING_DIR_HOST}"
  144. do_populate_sysroot[stamp-extra-info] = ""
  145. do_packagedata[stamp-extra-info] = ""
  146. USE_NLS = "${SDKUSE_NLS}"
  147. # We have to us TARGET_ARCH but we care about the absolute value
  148. # and not any particular tune that is enabled.
  149. TARGET_ARCH[vardepsexclude] = "TUNE_ARCH"
  150. PKGDATA_DIR = "${PKGDATA_DIR_SDK}"
  151. # If MLPREFIX is set by multilib code, shlibs
  152. # points to the wrong place so force it
  153. SHLIBSDIRS = "${PKGDATA_DIR}/nativesdk-shlibs2"
  154. SHLIBSWORKDIR = "${PKGDATA_DIR}/nativesdk-shlibs2"
  155. cross_canadian_bindirlinks () {
  156. for i in linux ${CANADIANEXTRAOS}
  157. do
  158. for v in ${CANADIANEXTRAVENDOR}
  159. do
  160. d=${D}${bindir}/../${TARGET_ARCH}$v-$i
  161. if [ -d $d ];
  162. then
  163. continue
  164. fi
  165. install -d $d
  166. for j in `ls ${D}${bindir}`
  167. do
  168. p=${TARGET_ARCH}$v-$i-`echo $j | sed -e s,${TARGET_PREFIX},,`
  169. ln -s ../${TARGET_SYS}/$j $d/$p
  170. done
  171. done
  172. done
  173. }