Skip to contentSkip to conversation

cross-canadian/libgcc: fix aarch64's multilib SDK

PATCH In review Robert Yang 3 participants 7 messages Nov 4, 2015 – Jan 4, 2016

lore
Share & tools
lore
#0 lore raw

cover cross-canadian/libgcc: fix aarch64's multilib SDK

The following changes since commit e44ed8c18e395b9c055aefee113b90708e8a8a2f:

build-appliance-image: Update to jethro head revision (2015-11-03 14:02:57 +0000)

are available in the git repository at:

git://git.openembedded.org/openembedded-core-contrib rbt/aarch64_lib32
http://cgit.openembedded.org/cgit.cgi/openembedded-core-contrib/log/?h=rbt/aarch64_lib32

Robert Yang (1):
cross-canadian/libgcc: fix aarch64's multilib SDK

 meta/classes/cross-canadian.bbclass         |    3 +++
 meta/recipes-devtools/gcc/libgcc-common.inc |   24 +++++++++++++++++-------
 meta/recipes-devtools/gcc/libgcc.inc        |    2 +-
 3 files changed, 21 insertions(+), 8 deletions(-)
Signature · 1 line
1.7.9.5
#1 lore raw

PATCH 1/1 cross-canadian/libgcc: fix aarch64's multilib SDK

The arm toolchain has a "-gnueabi" suffix, but aarch64 doesn't, this makes multilib sdk doesn't work, for example:

MACHINE = qemuarm64
require conf/multilib.conf
MULTILIBS = "multilib:lib32" DEFAULTTUNE_virtclass-multilib-lib32 = "armv7at-neon"

$ bitbake core-image-minimal -cpopulate_sdk

Then extract SDK, the environment-setup-armv7a-vfp-neon-pokymllib32-linux-gnueabi doesn't work since:
* The CC is arm-pokymllib32-linux-gnueabi-gcc
which doesn't exist, the patch for cross-canadian.bbclass fixes problem.
* Need aarch64-poky-linux/usr/lib/arm-poky-linux-linux-gnueabi which doesn't exist, the patch for libgcc-common.inc fixes the problem.

[YOCTO #8616]

---
 meta/classes/cross-canadian.bbclass         |    3 +++
 meta/recipes-devtools/gcc/libgcc-common.inc |   24 +++++++++++++++++-------
 meta/recipes-devtools/gcc/libgcc.inc        |    2 +-
 3 files changed, 21 insertions(+), 8 deletions(-)
meta/classes/cross-canadian.bbclass +3 -0
index ea17f09..bf016de 100644
@@ -18,6 +18,7 @@ PACKAGE_ARCH = "${SDK_ARCH}-${SDKPKGSUFFIX}"
 CANADIANEXTRAOS = "linux-uclibc linux-musl"
 CANADIANEXTRAVENDOR = ""
 MODIFYTOS ??= "1"
+GNUEABI_SUFFIX = ""
 python () {
     archs = d.getVar('PACKAGE_ARCHS', True).split()
     sdkarchs = []
@@ -69,6 +70,7 @@ python () {
         d.appendVar("CANADIANEXTRAOS", " linux-gnun32 linux-uclibcn32 linux-musln32")
     if tarch == "arm" or tarch == "armeb":
         d.setVar("TARGET_OS", "linux-gnueabi")
+        d.setVar("GNUEABI_SUFFIX", "-gnueabi")
     else:
         d.setVar("TARGET_OS", "linux")
 
@@ -167,6 +169,7 @@ SHLIBSWORKDIR = "${PKGDATA_DIR}/nativesdk-shlibs2"
 cross_canadian_bindirlinks () {
 	for i in linux ${CANADIANEXTRAOS}
 	do
+		i="$i${GNUEABI_SUFFIX}"
 		for v in ${CANADIANEXTRAVENDOR}
 		do
 			d=${D}${bindir}/../${TARGET_ARCH}$v-$i
meta/recipes-devtools/gcc/libgcc-common.inc +17 -7
index b09ea65..71e09d8 100644
@@ -134,11 +134,21 @@ BASETARGET_SYS = "${TARGET_ARCH}${ORIG_TARGET_VENDOROS}"
 
 addtask extra_symlinks after do_multilib_install before do_package do_populate_sysroot
 fakeroot python do_extra_symlinks() {
-    targetsys = d.getVar('BASETARGET_SYS', True)
-
-    if targetsys != d.getVar('TARGET_SYS', True):
-        dest = d.getVar('D', True) + d.getVar('libdir', True) + '/' + targetsys
-        src = d.getVar('TARGET_SYS', True)
-        if not os.path.lexists(dest) and os.path.lexists(d.getVar('D', True) + d.getVar('libdir', True)):
-            os.symlink(src, dest)
+    base_targetsys = d.getVar('BASETARGET_SYS', True)
+    targetsys = d.getVar('TARGET_SYS', True)
+
+    if base_targetsys != targetsys:
+        dest = d.getVar('D', True) + d.getVar('libdir', True) + '/' + base_targetsys
+        dest_list = [dest]
+        # For multilib like aarch64 + arm, need 2 symlinks:
+        # 1) BASETARGET_SYS as usual
+        # 2) BASETARGET_SYS + "-gnueabi" for multilib
+        libce = d.getVar('LIBCEXTENSION', True)
+        abie = d.getVar('ABIEXTENSION', True)
+        if abie and libce and targetsys.endswith(libce + abie):
+            dest_list.append(dest + libce + abie)
+        src = targetsys
+        for dir in dest_list:
+            if not os.path.lexists(dir) and os.path.lexists(d.getVar('D', True) + d.getVar('libdir', True)):
+                os.symlink(src, dir)
 }
meta/recipes-devtools/gcc/libgcc.inc +1 -1
index 95fa3f4..94cde2e 100644
@@ -17,7 +17,7 @@ LICENSE_${PN}-dbg = "GPL-3.0-with-GCC-exception"
 
 FILES_${PN}-dev = "\
     ${base_libdir}/libgcc*.so \
-    ${@base_conditional('BASETARGET_SYS', '${TARGET_SYS}', '', '${libdir}/${BASETARGET_SYS}', d)} \
+    ${@base_conditional('BASETARGET_SYS', '${TARGET_SYS}', '', '${libdir}/${BASETARGET_SYS}', d)}* \
     ${libdir}/${TARGET_SYS}/${BINV}* \
 "
 
Signature · 1 line
1.7.9.5
#2 lore raw
Quoted 95 lines · Robert Yang

The arm toolchain has a "-gnueabi" suffix, but aarch64 doesn't, this makes multilib sdk doesn't work, for example:

MACHINE = qemuarm64
require conf/multilib.conf
MULTILIBS = "multilib:lib32" DEFAULTTUNE_virtclass-multilib-lib32 = "armv7at-neon"

$ bitbake core-image-minimal -cpopulate_sdk

Then extract SDK, the environment-setup-armv7a-vfp-neon-pokymllib32-linux-gnueabi doesn't work since:
* The CC is arm-pokymllib32-linux-gnueabi-gcc
which doesn't exist, the patch for cross-canadian.bbclass fixes problem.
* Need aarch64-poky-linux/usr/lib/arm-poky-linux-linux-gnueabi which doesn't exist, the patch for libgcc-common.inc fixes the problem.

[YOCTO #8616]

---
  meta/classes/cross-canadian.bbclass         |    3 +++
  meta/recipes-devtools/gcc/libgcc-common.inc |   24 +++++++++++++++++-------
  meta/recipes-devtools/gcc/libgcc.inc        |    2 +-
  3 files changed, 21 insertions(+), 8 deletions(-)
meta/classes/cross-canadian.bbclass +3 -0
index ea17f09..bf016de 100644
@@ -18,6 +18,7 @@ PACKAGE_ARCH = "${SDK_ARCH}-${SDKPKGSUFFIX}"
  CANADIANEXTRAOS = "linux-uclibc linux-musl"
  CANADIANEXTRAVENDOR = ""
  MODIFYTOS ??= "1"
+GNUEABI_SUFFIX = ""
  python () {
      archs = d.getVar('PACKAGE_ARCHS', True).split()
      sdkarchs = []
@@ -69,6 +70,7 @@ python () {
          d.appendVar("CANADIANEXTRAOS", " linux-gnun32 linux-uclibcn32 linux-musln32")
      if tarch == "arm" or tarch == "armeb":
          d.setVar("TARGET_OS", "linux-gnueabi")
+        d.setVar("GNUEABI_SUFFIX", "-gnueabi")
      else:
          d.setVar("TARGET_OS", "linux")
 
@@ -167,6 +169,7 @@ SHLIBSWORKDIR = "${PKGDATA_DIR}/nativesdk-shlibs2"
  cross_canadian_bindirlinks () {
  	for i in linux ${CANADIANEXTRAOS}
  	do
+		i="$i${GNUEABI_SUFFIX}"
  		for v in ${CANADIANEXTRAVENDOR}
  		do
  			d=${D}${bindir}/../${TARGET_ARCH}$v-$i
meta/recipes-devtools/gcc/libgcc-common.inc +17 -7
index b09ea65..71e09d8 100644
@@ -134,11 +134,21 @@ BASETARGET_SYS = "${TARGET_ARCH}${ORIG_TARGET_VENDOROS}"
 
  addtask extra_symlinks after do_multilib_install before do_package do_populate_sysroot
  fakeroot python do_extra_symlinks() {
-    targetsys = d.getVar('BASETARGET_SYS', True)
-
-    if targetsys != d.getVar('TARGET_SYS', True):
-        dest = d.getVar('D', True) + d.getVar('libdir', True) + '/' + targetsys
-        src = d.getVar('TARGET_SYS', True)
-        if not os.path.lexists(dest) and os.path.lexists(d.getVar('D', True) + d.getVar('libdir', True)):
-            os.symlink(src, dest)
+    base_targetsys = d.getVar('BASETARGET_SYS', True)
+    targetsys = d.getVar('TARGET_SYS', True)
+
+    if base_targetsys != targetsys:
+        dest = d.getVar('D', True) + d.getVar('libdir', True) + '/' + base_targetsys
+        dest_list = [dest]
+        # For multilib like aarch64 + arm, need 2 symlinks:
+        # 1) BASETARGET_SYS as usual
+        # 2) BASETARGET_SYS + "-gnueabi" for multilib
+        libce = d.getVar('LIBCEXTENSION', True)
+        abie = d.getVar('ABIEXTENSION', True)
+        if abie and libce and targetsys.endswith(libce + abie):
+            dest_list.append(dest + libce + abie)
+        src = targetsys
+        for dir in dest_list:
+            if not os.path.lexists(dir) and os.path.lexists(d.getVar('D', True) + d.getVar('libdir', True)):
+                os.symlink(src, dir)
  }
meta/recipes-devtools/gcc/libgcc.inc +0 -0
index 95fa3f4..94cde2e 100644

meta/recipes-devtools/gcc/libgcc.inc LICENSE_${PN}-dbg = "GPL-3.0-with-GCC-exception" · line 20

Quoted 5 lines
meta/recipes-devtools/gcc/libgcc.inc +1 -1
@@ -17,7 +17,7 @@ LICENSE_${PN}-dbg = "GPL-3.0-with-GCC-exception"
 
  FILES_${PN}-dev = "\
      ${base_libdir}/libgcc*.so \
-    ${@base_conditional('BASETARGET_SYS', '${TARGET_SYS}', '', '${libdir}/${BASETARGET_SYS}', d)} \
+    ${@base_conditional('BASETARGET_SYS', '${TARGET_SYS}', '', '${libdir}/${BASETARGET_SYS}', d)}* \

The "*" should be after ${libdir}/${BASETARGET_SYS} rather than in the end, I updated it in the repo.

// Robert

Quoted 4 lines
meta/recipes-devtools/gcc/libgcc.inc +0 -0
      ${libdir}/${TARGET_SYS}/${BINV}* \
  "
 
#3 lore raw
In reply to Robert Yang
Quoted 20 lines · Robert Yang

The arm toolchain has a "-gnueabi" suffix, but aarch64 doesn't, this makes multilib sdk doesn't work, for example:

MACHINE = qemuarm64
require conf/multilib.conf
MULTILIBS = "multilib:lib32" DEFAULTTUNE_virtclass-multilib-lib32 = "armv7at-neon"

$ bitbake core-image-minimal -cpopulate_sdk

Then extract SDK, the environment-setup-armv7a-vfp-neon-pokymllib32-linux-gnueabi doesn't work since:
* The CC is arm-pokymllib32-linux-gnueabi-gcc
which doesn't exist, the patch for cross-canadian.bbclass fixes problem.
* Need aarch64-poky-linux/usr/lib/arm-poky-linux-linux-gnueabi which doesn't exist, the patch for libgcc-common.inc fixes the problem.

Quoted 2 lines

[YOCTO #8616]

This breaks the allarch sstate sanity test on the autobuilder which verifies that allarch recipes don't have different hashes for a no-op change to the machine.

https://autobuilder.yoctoproject.org/main/builders/nightly-oe-selftest/builds/242/steps/Running%20oe-selftest/logs/stdio

Ross

#4 lore raw
Quoted 24 lines · Ross

On 4 November 2015 at 13:58, Robert Yang <[email protected] <mailto:[email protected]>> wrote:

The arm toolchain has a "-gnueabi" suffix, but aarch64 doesn't, this makes multilib sdk doesn't work, for example:

MACHINE = qemuarm64
require conf/multilib.conf
MULTILIBS = "multilib:lib32" DEFAULTTUNE_virtclass-multilib-lib32 = "armv7at-neon"

$ bitbake core-image-minimal -cpopulate_sdk

Then extract SDK, the environment-setup-armv7a-vfp-neon-pokymllib32-linux-gnueabi doesn't work since:
* The CC is arm-pokymllib32-linux-gnueabi-gcc
which doesn't exist, the patch for cross-canadian.bbclass fixes problem.
* Need aarch64-poky-linux/usr/lib/arm-poky-linux-linux-gnueabi which doesn't exist, the patch for libgcc-common.inc fixes the problem.

Quoted 5 lines

[YOCTO #8616]

This breaks the allarch sstate sanity test on the autobuilder which verifies that allarch recipes don't have different hashes for a no-op change to the machine.

Sorry, I will check and update it.

// Robert

Quoted 4 lines

https://autobuilder.yoctoproject.org/main/builders/nightly-oe-selftest/builds/242/steps/Running%20oe-selftest/logs/stdio

Ross

#5 lore raw
In reply to Burton, Ross
Quoted 24 lines · Ross

On 4 November 2015 at 13:58, Robert Yang <[email protected] <mailto:[email protected]>> wrote:

The arm toolchain has a "-gnueabi" suffix, but aarch64 doesn't, this makes multilib sdk doesn't work, for example:

MACHINE = qemuarm64
require conf/multilib.conf
MULTILIBS = "multilib:lib32" DEFAULTTUNE_virtclass-multilib-lib32 = "armv7at-neon"

$ bitbake core-image-minimal -cpopulate_sdk

Then extract SDK, the environment-setup-armv7a-vfp-neon-pokymllib32-linux-gnueabi doesn't work since:
* The CC is arm-pokymllib32-linux-gnueabi-gcc
which doesn't exist, the patch for cross-canadian.bbclass fixes problem.
* Need aarch64-poky-linux/usr/lib/arm-poky-linux-linux-gnueabi which doesn't exist, the patch for libgcc-common.inc fixes the problem.

Quoted 5 lines

[YOCTO #8616]

This breaks the allarch sstate sanity test on the autobuilder which verifies that allarch recipes don't have different hashes for a no-op change to the machine.

Hi Ross,

After more investigations, the different between:
MACHINE=qemux86 bitbake -Snone meta-toolchain
MACHINE=qemuarm bitbake -Snone meta-toolchain

is do_extra_symlinks' checksum, there is an ABIEXTENSION for nativesdk-libgcc-initial when qemuarm (eabi), and no "eabi" when qemux86.

But as the commit said, the "eabi" is a must for qemuarm since its compiler arm-pokymllib32-linux-gnueabi-gcc contains eabi, otherwise it doesn't work.

Maybe let the test case don't compare between qemuarm and qemux86 since arm is special ? Or do you have any other suggestions, please ?

// Robert

Quoted 4 lines

https://autobuilder.yoctoproject.org/main/builders/nightly-oe-selftest/builds/242/steps/Running%20oe-selftest/logs/stdio

Ross

#6 lore raw
Quoted 43 lines · Robert Yang
Quoted 24 lines · Ross

On 4 November 2015 at 13:58, Robert Yang <[email protected] <mailto:[email protected]>> wrote:

The arm toolchain has a "-gnueabi" suffix, but aarch64 doesn't, this makes multilib sdk doesn't work, for example:

MACHINE = qemuarm64
require conf/multilib.conf
MULTILIBS = "multilib:lib32" DEFAULTTUNE_virtclass-multilib-lib32 = "armv7at-neon"

$ bitbake core-image-minimal -cpopulate_sdk

Then extract SDK, the environment-setup-armv7a-vfp-neon-pokymllib32-linux-gnueabi doesn't work since:
* The CC is arm-pokymllib32-linux-gnueabi-gcc
which doesn't exist, the patch for cross-canadian.bbclass fixes problem.
* Need aarch64-poky-linux/usr/lib/arm-poky-linux-linux-gnueabi which doesn't exist, the patch for libgcc-common.inc fixes the problem.

Quoted 5 lines

[YOCTO #8616]

This breaks the allarch sstate sanity test on the autobuilder which verifies that allarch recipes don't have different hashes for a no-op change to the machine.

Hi Ross,

After more investigations, the different between:
MACHINE=qemux86 bitbake -Snone meta-toolchain
MACHINE=qemuarm bitbake -Snone meta-toolchain

is do_extra_symlinks' checksum, there is an ABIEXTENSION for nativesdk-libgcc-initial when qemuarm (eabi), and no "eabi" when qemux86.

Quoted 9 lines

But as the commit said, the "eabi" is a must for qemuarm since its compiler arm-pokymllib32-linux-gnueabi-gcc contains eabi, otherwise it doesn't work.

Maybe let the test case don't compare between qemuarm and qemux86 since arm is special ? Or do you have any other suggestions, please ?

// Robert

Ping ...

Quoted 5 lines
Quoted 5 lines

https://autobuilder.yoctoproject.org/main/builders/nightly-oe-selftest/builds/242/steps/Running%20oe-selftest/logs/stdio

Ross