All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] On-target multilib gcc enhancement
@ 2013-01-09  9:00 Constantin Musca
  2013-01-09  9:00 ` [PATCH 1/3] gcc: add missing dependency (zlib) Constantin Musca
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Constantin Musca @ 2013-01-09  9:00 UTC (permalink / raw)
  To: openembedded-core

This patchset enables the user to build gcc with configurable multilib options.
The following changes since commit 7e1f8faad0c4b6f490c26f87acc698dd6e002b15:

  perl: Remove bashism from perl-tests.inc (2013-01-07 22:37:37 +0000)

are available in the git repository at:

  git://git.pokylinux.org/poky-contrib cmuscax/gcc_enhan
  http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=cmuscax/gcc_enhan

Constantin Musca (3):
  gcc: add missing dependency (zlib)
  gcc: remove the 64bithack patch
  gcc: enable multilib for target gcc

 meta/recipes-devtools/gcc/gcc-4.7.inc              |   5 +-
 meta/recipes-devtools/gcc/gcc-4.7/64bithack.patch  |  63 ----------
 meta/recipes-devtools/gcc/gcc-common.inc           |  23 ++++
 meta/recipes-devtools/gcc/gcc-configure-common.inc |   2 +-
 meta/recipes-devtools/gcc/gcc-configure-target.inc |   1 +
 meta/recipes-devtools/gcc/gcc-multilib-config.inc  | 132 +++++++++++++++++++++
 meta/recipes-devtools/gcc/libgcc_4.7.bb            |  44 +++++++
 7 files changed, 203 insertions(+), 67 deletions(-)
 delete mode 100644 meta/recipes-devtools/gcc/gcc-4.7/64bithack.patch
 create mode 100644 meta/recipes-devtools/gcc/gcc-multilib-config.inc

-- 
1.7.11.7




^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/3] gcc: add missing dependency (zlib)
  2013-01-09  9:00 [PATCH 0/3] On-target multilib gcc enhancement Constantin Musca
@ 2013-01-09  9:00 ` Constantin Musca
  2013-01-09  9:00 ` [PATCH 2/3] gcc: remove the 64bithack patch Constantin Musca
  2013-01-09  9:00 ` [PATCH 3/3] gcc: enable multilib for target gcc Constantin Musca
  2 siblings, 0 replies; 8+ messages in thread
From: Constantin Musca @ 2013-01-09  9:00 UTC (permalink / raw)
  To: openembedded-core

- add zlib to DEPENDS (it fails otherwise)

Signed-off-by: Constantin Musca <constantinx.musca@intel.com>
---
 meta/recipes-devtools/gcc/gcc-4.7.inc | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/meta/recipes-devtools/gcc/gcc-4.7.inc b/meta/recipes-devtools/gcc/gcc-4.7.inc
index 378caf0..08a0103 100644
--- a/meta/recipes-devtools/gcc/gcc-4.7.inc
+++ b/meta/recipes-devtools/gcc/gcc-4.7.inc
@@ -1,6 +1,6 @@
 require gcc-common.inc
 
-PR = "r13"
+PR = "r14"
 
 # Third digit in PV should be incremented after a minor release
 # happens from this branch on gcc e.g. currently its 4.7.1
@@ -20,7 +20,7 @@ BINV = "4.7.2"
 
 FILESPATH = "${@base_set_filespath([ '${FILE_DIRNAME}/gcc-4.7' ], d)}"
 
-DEPENDS =+ "mpfr gmp libmpc"
+DEPENDS =+ "mpfr gmp libmpc zlib"
 NATIVEDEPS = "mpfr-native gmp-native libmpc-native zlib-native"
 
 LICENSE="GPL-3.0-with-GCC-exception & GPLv3"
-- 
1.7.11.7




^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/3] gcc: remove the 64bithack patch
  2013-01-09  9:00 [PATCH 0/3] On-target multilib gcc enhancement Constantin Musca
  2013-01-09  9:00 ` [PATCH 1/3] gcc: add missing dependency (zlib) Constantin Musca
@ 2013-01-09  9:00 ` Constantin Musca
  2013-01-09 13:45   ` Richard Purdie
  2013-01-09  9:00 ` [PATCH 3/3] gcc: enable multilib for target gcc Constantin Musca
  2 siblings, 1 reply; 8+ messages in thread
From: Constantin Musca @ 2013-01-09  9:00 UTC (permalink / raw)
  To: openembedded-core

Signed-off-by: Constantin Musca <constantinx.musca@intel.com>
---
 meta/recipes-devtools/gcc/gcc-4.7.inc             |  1 -
 meta/recipes-devtools/gcc/gcc-4.7/64bithack.patch | 63 -----------------------
 2 files changed, 64 deletions(-)
 delete mode 100644 meta/recipes-devtools/gcc/gcc-4.7/64bithack.patch

diff --git a/meta/recipes-devtools/gcc/gcc-4.7.inc b/meta/recipes-devtools/gcc/gcc-4.7.inc
index 08a0103..2fad764 100644
--- a/meta/recipes-devtools/gcc/gcc-4.7.inc
+++ b/meta/recipes-devtools/gcc/gcc-4.7.inc
@@ -50,7 +50,6 @@ SRC_URI = "${GNU_MIRROR}/gcc/gcc-${PV}/gcc-${PV}.tar.bz2 \
            file://gcc-poison-system-directories.patch \
            file://gcc-poison-dir-extend.patch \
            file://gcc-4.3.3-SYSROOT_CFLAGS_FOR_TARGET.patch \
-	   file://64bithack.patch \
 	   file://optional_libstdc.patch \
 	   file://disable_relax_pic_calls_flag.patch \
 	   file://COLLECT_GCC_OPTIONS.patch \
diff --git a/meta/recipes-devtools/gcc/gcc-4.7/64bithack.patch b/meta/recipes-devtools/gcc/gcc-4.7/64bithack.patch
deleted file mode 100644
index f475669..0000000
--- a/meta/recipes-devtools/gcc/gcc-4.7/64bithack.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-Upstream-Status: Inappropriate [embedded specific]
-
-GCC has internal multilib handling code but it assumes a very specific rigid directory
-layout. The build system implementation of multilib layout is very generic and allows
-complete customisation of the library directories.
-
-This patch is a partial solution to allow any custom directories to be passed into gcc
-and handled correctly. It forces gcc to use the base_libdir (which is the current 
-directory, "."). We need to do this for each multilib that is configured as we don't
-know which compiler options may be being passed into the compiler. Since we have a compiler
-per mulitlib at this point that isn't an issue.
-
-The one problem is the target compiler is only going to work for the default multlilib at
-this point. Ideally we'd figure out which multilibs were being enabled with which paths
-and be able to patch these entries with a complete set of correct paths but this we
-don't have such code at this point. This is something the target gcc recipe should do 
-and override these platform defaults in its build config.
-
-RP 15/8/11
-
-Index: trunk/gcc/config/i386/t-linux64
-===================================================================
---- trunk.orig/gcc/config/i386/t-linux64	2012-02-22 09:44:48.000000000 -0800
-+++ trunk/gcc/config/i386/t-linux64	2012-02-22 12:31:01.836462957 -0800
-@@ -33,7 +33,6 @@
- #
- comma=,
- MULTILIB_OPTIONS    = $(subst $(comma),/,$(TM_MULTILIB_CONFIG))
--MULTILIB_DIRNAMES   = $(patsubst m%, %, $(subst /, ,$(MULTILIB_OPTIONS)))
--MULTILIB_OSDIRNAMES = m64=../lib64
--MULTILIB_OSDIRNAMES+= m32=$(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)
--MULTILIB_OSDIRNAMES+= mx32=../libx32
-+MULTILIB_DIRNAMES = . .
-+MULTILIB_OSDIRNAMES = ../$(shell basename $(base_libdir)) ../$(shell basename $(base_libdir))
-+
-Index: trunk/gcc/config/mips/t-linux64
-===================================================================
---- trunk.orig/gcc/config/mips/t-linux64	2012-02-22 09:44:58.000000000 -0800
-+++ trunk/gcc/config/mips/t-linux64	2012-02-22 12:32:01.132465823 -0800
-@@ -17,5 +17,5 @@
- # <http://www.gnu.org/licenses/>.
- 
- MULTILIB_OPTIONS = mabi=n32/mabi=32/mabi=64
--MULTILIB_DIRNAMES = n32 32 64
--MULTILIB_OSDIRNAMES = ../lib32 ../lib ../lib64
-+MULTILIB_DIRNAMES = . . .
-+MULTILIB_OSDIRNAMES = ../$(shell basename $(base_libdir)) ../$(shell basename $(base_libdir)) ../$(shell basename $(base_libdir))
-Index: trunk/gcc/config/rs6000/t-linux64
-===================================================================
---- trunk.orig/gcc/config/rs6000/t-linux64	2012-02-22 09:44:54.000000000 -0800
-+++ trunk/gcc/config/rs6000/t-linux64	2012-02-22 12:28:17.960454968 -0800
-@@ -27,9 +27,9 @@
- # MULTILIB_OSDIRNAMES according to what is found on the target.
- 
- MULTILIB_OPTIONS        = m64/m32 msoft-float
--MULTILIB_DIRNAMES       = 64 32 nof
-+MULTILIB_DIRNAMES       = . . .
- MULTILIB_EXTRA_OPTS     = fPIC mstrict-align
- MULTILIB_EXCEPTIONS     = m64/msoft-float
- MULTILIB_EXCLUSIONS     = m64/!m32/msoft-float
--MULTILIB_OSDIRNAMES	= ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) nof
-+MULTILIB_OSDIRNAMES	= ../$(shell basename $(base_libdir)) ../$(shell basename $(base_libdir)) ../$(shell basename $(base_libdir))
- MULTILIB_MATCHES        = $(MULTILIB_MATCHES_FLOAT)
-- 
1.7.11.7




^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/3] gcc: enable multilib for target gcc
  2013-01-09  9:00 [PATCH 0/3] On-target multilib gcc enhancement Constantin Musca
  2013-01-09  9:00 ` [PATCH 1/3] gcc: add missing dependency (zlib) Constantin Musca
  2013-01-09  9:00 ` [PATCH 2/3] gcc: remove the 64bithack patch Constantin Musca
@ 2013-01-09  9:00 ` Constantin Musca
  2013-01-11 15:20   ` Richard Purdie
  2 siblings, 1 reply; 8+ messages in thread
From: Constantin Musca @ 2013-01-09  9:00 UTC (permalink / raw)
  To: openembedded-core

- add a task to setup multilib configuration for target gcc
- this commit adapts Nitin Kamble's work to gcc 4.7

Tests:
root@qemux86-64:~# gcc -m64 t.c -o t
root@qemux86-64:~# file t
t: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
root@qemux86-64:~# ./t
Hello World !
root@qemux86-64:~# gcc -m32 t.c -o t
root@qemux86-64:~# file t
t: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
root@qemux86-64:~# ./t
Hello World !

[YOCTO #1369]

Signed-off-by: Constantin Musca <constantinx.musca@intel.com>
---
 meta/recipes-devtools/gcc/gcc-4.7.inc              |   2 +-
 meta/recipes-devtools/gcc/gcc-common.inc           |  23 ++++
 meta/recipes-devtools/gcc/gcc-configure-common.inc |   2 +-
 meta/recipes-devtools/gcc/gcc-configure-target.inc |   1 +
 meta/recipes-devtools/gcc/gcc-multilib-config.inc  | 132 +++++++++++++++++++++
 meta/recipes-devtools/gcc/libgcc_4.7.bb            |  44 +++++++
 6 files changed, 202 insertions(+), 2 deletions(-)
 create mode 100644 meta/recipes-devtools/gcc/gcc-multilib-config.inc

diff --git a/meta/recipes-devtools/gcc/gcc-4.7.inc b/meta/recipes-devtools/gcc/gcc-4.7.inc
index 2fad764..13a1e7e 100644
--- a/meta/recipes-devtools/gcc/gcc-4.7.inc
+++ b/meta/recipes-devtools/gcc/gcc-4.7.inc
@@ -1,6 +1,6 @@
 require gcc-common.inc
 
-PR = "r14"
+PR = "r15"
 
 # Third digit in PV should be incremented after a minor release
 # happens from this branch on gcc e.g. currently its 4.7.1
diff --git a/meta/recipes-devtools/gcc/gcc-common.inc b/meta/recipes-devtools/gcc/gcc-common.inc
index 6e64441..0d29800 100644
--- a/meta/recipes-devtools/gcc/gcc-common.inc
+++ b/meta/recipes-devtools/gcc/gcc-common.inc
@@ -34,6 +34,29 @@ def get_gcc_multiarch_setting(bb, d):
             return multiarch_options[target_arch]
     return ""
 
+# this is used by the multilib setup of gcc
+def get_tune_parameters(tune, d):
+    availtunes = d.getVar('AVAILTUNES', True)
+    if tune not in availtunes.split():
+        bb.error('The tune: %s is not one of the available tunes: %s', tune, availtunes)
+
+    localdata = bb.data.createCopy(d)
+    override = ':tune-' + tune
+    localdata.setVar('OVERRIDES', localdata.getVar('OVERRIDES', False) + override)
+    bb.data.update_data(localdata)
+
+    retdict = {}
+    retdict['tune'] = tune
+    retdict['ccargs'] = localdata.getVar('TUNE_CCARGS', True)
+    retdict['features'] = localdata.getVar('TUNE_FEATURES', True)
+    retdict['baselib'] = localdata.getVar('BASE_LIB', True)
+    retdict['arch'] = localdata.getVar('TUNE_ARCH', True)
+    retdict['abiextension'] = localdata.getVar('ABIEXTENSION', True)
+    retdict['target_fpu'] = localdata.getVar('TARGET_FPU', True)
+    retdict['pkgarch'] = localdata.getVar('TUNE_PKGARCH', True)
+    retdict['package_extra_archs'] = localdata.getVar('PACKAGE_EXTRA_ARCHS', True)
+    return retdict
+
 # We really need HOST_SYS here for some packages and TARGET_SYS for others.
 # For now, libgcc is most important so we fix for that - RP.
 SHLIBSDIR = "${STAGING_DIR_TARGET}/shlibs"
diff --git a/meta/recipes-devtools/gcc/gcc-configure-common.inc b/meta/recipes-devtools/gcc/gcc-configure-common.inc
index 4eb59fd..08cc98e 100644
--- a/meta/recipes-devtools/gcc/gcc-configure-common.inc
+++ b/meta/recipes-devtools/gcc/gcc-configure-common.inc
@@ -25,7 +25,7 @@ EXTRA_OECONF_PATHS ?= ""
 EXTRA_OECONF_INITIAL ?= ""
 EXTRA_OECONF_INTERMEDIATE ?= ""
 
-GCCMULTILIB = "--disable-multilib"
+GCCMULTILIB ?= "--disable-multilib"
 GCCTHREADS ?= "posix"
 
 EXTRA_OECONF = "${@['--enable-clocale=generic', ''][d.getVar('USE_NLS', True) != 'no']} \
diff --git a/meta/recipes-devtools/gcc/gcc-configure-target.inc b/meta/recipes-devtools/gcc/gcc-configure-target.inc
index f41301f..809f937 100644
--- a/meta/recipes-devtools/gcc/gcc-configure-target.inc
+++ b/meta/recipes-devtools/gcc/gcc-configure-target.inc
@@ -1,4 +1,5 @@
 require gcc-configure-common.inc
+require gcc-multilib-config.inc
 
 EXTRA_OECONF_PATHS = " \
     --with-sysroot=/ \
diff --git a/meta/recipes-devtools/gcc/gcc-multilib-config.inc b/meta/recipes-devtools/gcc/gcc-multilib-config.inc
new file mode 100644
index 0000000..3d9c026
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-multilib-config.inc
@@ -0,0 +1,132 @@
+GCCMULTILIB = "--enable-multilib"
+
+addtask gcc_multilib_setup after do_patch before do_configure
+
+# following code modifies these definitions in the gcc config
+#    MULTILIB_OPTIONS
+#    MULTILIB_DIRNAMES
+#    MULTILIB_OSDIRNAMES
+#    GLIBC_DYNAMIC_LINKER32
+#    GLIBC_DYNAMIC_LINKER64
+#    GLIBC_DYNAMIC_LINKERX32
+#    GLIBC_DYNAMIC_LINKERN32
+#  For more information on use of these variables look at these files in the gcc source code
+#    gcc/config/i386/t-linux64
+#    gcc/config/mips/t-linux64
+#    gcc/config/rs6000/t-linux64
+#    gcc/config/i386/linux64.h
+#    gcc/config/mips/linux64.h
+#    gcc/config/rs6000/linux64.h
+
+python do_gcc_multilib_setup() {
+    import re
+
+    # do this only for target recipe
+    if d.getVar('PN', True) != 'gcc':
+        return
+
+    srcdir = d.getVar('S', True)
+    multilibs = d.getVar('MULTILIB_VARIANTS', True)
+    target_arch = d.getVar('TARGET_ARCH', True)
+
+    gcc_target_config_files = {
+        'x86_64'    : ['gcc/config/i386/t-linux64'],
+        'mips'      : ['gcc/config/mips/t-linux64'],
+        'ppc'       : ['gcc/config/rs6000/t-linux64']
+    }
+
+    gcc_header_config_files = {
+        'x86_64'    : ['gcc/config/i386/linux64.h'],
+        'mips'      : ['gcc/config/mips/linux64.h'],
+        'ppc'       : ['gcc/config/rs6000/linux64.h']
+    }
+
+    if target_arch not in gcc_target_config_files:
+        if multilibs:
+            bb.warn('gcc multilib setup is not supported for TARGET_ARCH=' + target_arch)
+        return
+
+    gcc_multilib_target_config_files = gcc_target_config_files[target_arch]
+    gcc_multilib_header_config_files = gcc_header_config_files[target_arch]
+
+    ml_list = ['DEFAULTTUNE']
+    if multilibs != '':
+        for ml in multilibs.split(' '):
+            ml_list.append('DEFAULTTUNE_virtclass-multilib-' + ml)
+
+    libdir32 = 'SYSTEMLIBS_DIR'
+    libdir64 = 'SYSTEMLIBS_DIR'
+    libdirx32 = 'SYSTEMLIBS_DIR'
+    libdirn32 = 'SYSTEMLIBS_DIR'
+
+    multilib_options = []
+    multilib_dirnames = []
+    multilib_osdirnames = []
+
+    for ml in ml_list:
+        tune = d.getVar(ml, True)
+        tune_parameters = get_tune_parameters(tune, d)
+
+        tune_baselib = tune_parameters['baselib']
+
+        if tune_baselib == 'lib64':
+            libdir64 = tune_baselib
+        elif tune_baselib == 'libx32':
+            libdirx32 = tune_baselib
+        elif tune_baselib == 'lib32':
+            libdirn32 = tune_baselib
+        elif tune_baselib == 'lib':
+            libdir32 = tune_baselib
+        else:
+            bb.error('Unknown libdir (%s) of the tune : %s' % (tune_baselib, tune))
+
+        # take out '-' in parameters
+        multilib_options.append(re.sub(r' +\-+', ' ', re.sub(r'^ *\-+', '', tune_parameters['ccargs'])))
+        if tune_baselib == 'lib':
+            multilib_dirnames.append('32')  # /lib => 32bit lib
+        else:
+            multilib_dirnames.append(tune_baselib.replace('lib', ''))
+        multilib_osdirnames.append('../' + tune_baselib)
+
+    # go over t-linux64 kind target files
+    for ml_conf_file in gcc_multilib_target_config_files:
+        # recreate multilib configuration variables
+        lines = []
+
+        lines.append('MULTILIB_OPTIONS = ' + '/'.join(multilib_options))
+        lines.append('MULTILIB_DIRNAMES = ' + ' '.join(multilib_dirnames))
+        lines.append('MULTILIB_OSDIRNAMES = ' + ' '.join(multilib_osdirnames))
+
+        with open(srcdir + '/' + ml_conf_file, 'w') as f:
+            f.write('\n'.join(lines))
+
+    # go over linux64.h kind header files
+    for ml_conf_file in gcc_multilib_header_config_files:
+        with open(srcdir + '/' + ml_conf_file, 'r') as f:
+            filelines = f.read()
+
+            # replace lines like
+            # #define GLIBC_DYNAMIC_LINKER32 SYSTEMLIBS_DIR "ld-linux.so.2"
+            # by
+            # #define GLIBC_DYNAMIC_LINKER32 "/lib/" "ld-linux.so.2"
+            # this is needed to put the correct dynamic loader path in the generated binaries
+
+            filelines = re.sub(r'^(#define\s*GLIBC_DYNAMIC_LINKER32\s*)(SYSTEMLIBS_DIR)(\s*\".*\")$',
+                r'\1"/' + libdir32 + r'/"\3',
+                filelines, flags=re.MULTILINE)
+
+            filelines = re.sub(r'^(#define\s*GLIBC_DYNAMIC_LINKER64\s*)(SYSTEMLIBS_DIR)(\s*\".*\")$',
+                r'\1"/' + libdir64 + r'/"\3',
+                filelines, flags=re.MULTILINE)
+
+            filelines = re.sub(r'^(#define\s*GLIBC_DYNAMIC_LINKERX32\s*)(SYSTEMLIBS_DIR)(\s*\".*\")$',
+                r'\1"/' + libdirx32 + r'/"\3',
+                filelines, flags=re.MULTILINE)
+
+            filelines = re.sub(r'^(#define\s*GLIBC_DYNAMIC_LINKERN32\s*)(SYSTEMLIBS_DIR)(\s*\".*\")$',
+                r'\1"/' + libdirn32 + r'/"\3',
+                filelines, flags=re.MULTILINE)
+
+            with open(srcdir + '/' + ml_conf_file, 'w') as f:
+                f.write(filelines)
+}
diff --git a/meta/recipes-devtools/gcc/libgcc_4.7.bb b/meta/recipes-devtools/gcc/libgcc_4.7.bb
index 5eaa515..c17c78a 100644
--- a/meta/recipes-devtools/gcc/libgcc_4.7.bb
+++ b/meta/recipes-devtools/gcc/libgcc_4.7.bb
@@ -15,6 +15,10 @@ FILES_${PN} = "${base_libdir}/libgcc*.so.*"
 FILES_${PN}-dev = " \
   ${base_libdir}/libgcc*.so \
   ${libdir}/${TARGET_SYS}/${BINV}/*crt* \
+  ${libdir}/${TARGET_SYS}/${BINV}/64 \
+  ${libdir}/${TARGET_SYS}/${BINV}/32 \
+  ${libdir}/${TARGET_SYS}/${BINV}/x32 \
+  ${libdir}/${TARGET_SYS}/${BINV}/n32 \
   ${libdir}/${TARGET_SYS}/${BINV}/libgcc*"
 FILES_libgcov-dev = " \
   ${libdir}/${TARGET_SYS}/${BINV}/libgcov.a \
@@ -70,3 +74,43 @@ BBCLASSEXTEND = "nativesdk"
 
 INSANE_SKIP_${PN}-dev = "staticdev"
 INSANE_SKIP_${MLPREFIX}libgcov-dev = "staticdev"
+
+addtask multilib_install after do_install before do_package
+# this makes multilib gcc files findable for target gcc
+# e.g.
+#    /usr/lib/i586-pokymllib32-linux/4.7/
+# by creating this symlink to it
+#    /usr/lib64/x86_64-poky-linux/4.7/32
+
+python do_multilib_install() {
+    import re
+    # do this only for multilib extended recipe
+    if d.getVar('PN', True) != 'libgcc':
+        return
+
+    multilibs = d.getVar('MULTILIB_VARIANTS', True) or ''
+    if multilibs == '':
+        return
+
+    binv = d.getVar('BINV', True) or ''
+
+    for ml in multilibs.split(' '):
+        tune = d.getVar('DEFAULTTUNE_virtclass-multilib-' + ml, True) or ''
+        tune_parameters = get_tune_parameters(tune, d)
+        tune_baselib = tune_parameters['baselib']
+        tune_arch = tune_parameters['arch']
+        tune_bitness = tune_baselib.replace('lib', '')
+        if tune_bitness == '' :
+            tune_bitness = '32' # /lib => 32bit lib
+
+        src = '../../../' + tune_baselib + '/' + \
+            tune_arch + d.getVar('TARGET_VENDOR', True) + 'ml' + ml + \
+            '-' + d.getVar('TARGET_OS', True) + '/' + binv + '/'
+
+        dest = d.getVar('D', True) + d.getVar('libdir', True) + '/' + \
+            d.getVar('TARGET_SYS', True) + '/' + binv + '/' + tune_bitness
+
+        if os.path.lexists(dest):
+            os.unlink(dest)
+        os.symlink(src, dest)
+}
-- 
1.7.11.7




^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/3] gcc: remove the 64bithack patch
  2013-01-09  9:00 ` [PATCH 2/3] gcc: remove the 64bithack patch Constantin Musca
@ 2013-01-09 13:45   ` Richard Purdie
  2013-01-09 14:30     ` Constantin Musca
  0 siblings, 1 reply; 8+ messages in thread
From: Richard Purdie @ 2013-01-09 13:45 UTC (permalink / raw)
  To: Constantin Musca; +Cc: openembedded-core

On Wed, 2013-01-09 at 11:00 +0200, Constantin Musca wrote:
> Signed-off-by: Constantin Musca <constantinx.musca@intel.com>
> ---
>  meta/recipes-devtools/gcc/gcc-4.7.inc             |  1 -
>  meta/recipes-devtools/gcc/gcc-4.7/64bithack.patch | 63 -----------------------
>  2 files changed, 64 deletions(-)
>  delete mode 100644 meta/recipes-devtools/gcc/gcc-4.7/64bithack.patch

Does removing this break multilib builds? For example, with different
libdir layouts? 

Note that gcc has a shared source tree so patches cannot by applied in
say the cross case when we need this yet not in the target case when we
probably don't want it. We need to make a patch which works in all
cases.


Cheers,

Richard





^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/3] gcc: remove the 64bithack patch
  2013-01-09 13:45   ` Richard Purdie
@ 2013-01-09 14:30     ` Constantin Musca
  0 siblings, 0 replies; 8+ messages in thread
From: Constantin Musca @ 2013-01-09 14:30 UTC (permalink / raw)
  To: Richard Purdie; +Cc: openembedded-core

On 01/09/2013 03:45 PM, Richard Purdie wrote:
> On Wed, 2013-01-09 at 11:00 +0200, Constantin Musca wrote:
>> Signed-off-by: Constantin Musca <constantinx.musca@intel.com>
>> ---
>>   meta/recipes-devtools/gcc/gcc-4.7.inc             |  1 -
>>   meta/recipes-devtools/gcc/gcc-4.7/64bithack.patch | 63 -----------------------
>>   2 files changed, 64 deletions(-)
>>   delete mode 100644 meta/recipes-devtools/gcc/gcc-4.7/64bithack.patch
> Does removing this break multilib builds? For example, with different
> libdir layouts?
I think it's going to break other multilib builds. The solution is to 
keep the 64bithack.patch for setting the default multilib options.  The 
3/3 patch can be used without PATCH 2/3.
> Note that gcc has a shared source tree so patches cannot by applied in
> say the cross case when we need this yet not in the target case when we
> probably don't want it. We need to make a patch which works in all
> cases.
The other gcc variants (e.g. gcc-cross) are configured using 
--disable-multilib as option and they will not be influenced if we 
modify the multilib files.
>
> Cheers,
>
> Richard
>
>

Cheers,
Constantin



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/3] gcc: enable multilib for target gcc
  2013-01-09  9:00 ` [PATCH 3/3] gcc: enable multilib for target gcc Constantin Musca
@ 2013-01-11 15:20   ` Richard Purdie
  2013-01-11 15:26     ` Richard Purdie
  0 siblings, 1 reply; 8+ messages in thread
From: Richard Purdie @ 2013-01-11 15:20 UTC (permalink / raw)
  To: Constantin Musca; +Cc: openembedded-core

On Wed, 2013-01-09 at 11:00 +0200, Constantin Musca wrote:
> - add a task to setup multilib configuration for target gcc
> - this commit adapts Nitin Kamble's work to gcc 4.7
> 
> Tests:
> root@qemux86-64:~# gcc -m64 t.c -o t
> root@qemux86-64:~# file t
> t: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
> root@qemux86-64:~# ./t
> Hello World !
> root@qemux86-64:~# gcc -m32 t.c -o t
> root@qemux86-64:~# file t
> t: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
> root@qemux86-64:~# ./t
> Hello World !
> 
> [YOCTO #1369]
> 
> Signed-off-by: Constantin Musca <constantinx.musca@intel.com>
> ---
>  meta/recipes-devtools/gcc/gcc-4.7.inc              |   2 +-
>  meta/recipes-devtools/gcc/gcc-common.inc           |  23 ++++
>  meta/recipes-devtools/gcc/gcc-configure-common.inc |   2 +-
>  meta/recipes-devtools/gcc/gcc-configure-target.inc |   1 +
>  meta/recipes-devtools/gcc/gcc-multilib-config.inc  | 132 +++++++++++++++++++++
>  meta/recipes-devtools/gcc/libgcc_4.7.bb            |  44 +++++++
>  6 files changed, 202 insertions(+), 2 deletions(-)
>  create mode 100644 meta/recipes-devtools/gcc/gcc-multilib-config.inc

This triggered some build failures:

http://autobuilder.yoctoproject.org:8010/builders/nightly-mips/builds/769/steps/shell_29/logs/stdio


> diff --git a/meta/recipes-devtools/gcc/gcc-4.7.inc b/meta/recipes-devtools/gcc/gcc-4.7.inc
> index 2fad764..13a1e7e 100644
> --- a/meta/recipes-devtools/gcc/gcc-4.7.inc
> +++ b/meta/recipes-devtools/gcc/gcc-4.7.inc
> @@ -1,6 +1,6 @@
>  require gcc-common.inc
>  
> -PR = "r14"
> +PR = "r15"
>  
>  # Third digit in PV should be incremented after a minor release
>  # happens from this branch on gcc e.g. currently its 4.7.1
> diff --git a/meta/recipes-devtools/gcc/gcc-common.inc b/meta/recipes-devtools/gcc/gcc-common.inc
> index 6e64441..0d29800 100644
> --- a/meta/recipes-devtools/gcc/gcc-common.inc
> +++ b/meta/recipes-devtools/gcc/gcc-common.inc
> @@ -34,6 +34,29 @@ def get_gcc_multiarch_setting(bb, d):
>              return multiarch_options[target_arch]
>      return ""
>  
> +# this is used by the multilib setup of gcc
> +def get_tune_parameters(tune, d):
> +    availtunes = d.getVar('AVAILTUNES', True)
> +    if tune not in availtunes.split():
> +        bb.error('The tune: %s is not one of the available tunes: %s', tune, availtunes)
> +
> +    localdata = bb.data.createCopy(d)
> +    override = ':tune-' + tune
> +    localdata.setVar('OVERRIDES', localdata.getVar('OVERRIDES', False) + override)
> +    bb.data.update_data(localdata)
> +
> +    retdict = {}
> +    retdict['tune'] = tune
> +    retdict['ccargs'] = localdata.getVar('TUNE_CCARGS', True)
> +    retdict['features'] = localdata.getVar('TUNE_FEATURES', True)
> +    retdict['baselib'] = localdata.getVar('BASE_LIB', True)
> +    retdict['arch'] = localdata.getVar('TUNE_ARCH', True)
> +    retdict['abiextension'] = localdata.getVar('ABIEXTENSION', True)
> +    retdict['target_fpu'] = localdata.getVar('TARGET_FPU', True)
> +    retdict['pkgarch'] = localdata.getVar('TUNE_PKGARCH', True)
> +    retdict['package_extra_archs'] = localdata.getVar('PACKAGE_EXTRA_ARCHS', True)
> +    return retdict
> +
>  # We really need HOST_SYS here for some packages and TARGET_SYS for others.
>  # For now, libgcc is most important so we fix for that - RP.
>  SHLIBSDIR = "${STAGING_DIR_TARGET}/shlibs"
> diff --git a/meta/recipes-devtools/gcc/gcc-configure-common.inc b/meta/recipes-devtools/gcc/gcc-configure-common.inc
> index 4eb59fd..08cc98e 100644
> --- a/meta/recipes-devtools/gcc/gcc-configure-common.inc
> +++ b/meta/recipes-devtools/gcc/gcc-configure-common.inc
> @@ -25,7 +25,7 @@ EXTRA_OECONF_PATHS ?= ""
>  EXTRA_OECONF_INITIAL ?= ""
>  EXTRA_OECONF_INTERMEDIATE ?= ""
>  
> -GCCMULTILIB = "--disable-multilib"
> +GCCMULTILIB ?= "--disable-multilib"
>  GCCTHREADS ?= "posix"
>  
>  EXTRA_OECONF = "${@['--enable-clocale=generic', ''][d.getVar('USE_NLS', True) != 'no']} \
> diff --git a/meta/recipes-devtools/gcc/gcc-configure-target.inc b/meta/recipes-devtools/gcc/gcc-configure-target.inc
> index f41301f..809f937 100644
> --- a/meta/recipes-devtools/gcc/gcc-configure-target.inc
> +++ b/meta/recipes-devtools/gcc/gcc-configure-target.inc
> @@ -1,4 +1,5 @@
>  require gcc-configure-common.inc
> +require gcc-multilib-config.inc
>  
>  EXTRA_OECONF_PATHS = " \
>      --with-sysroot=/ \
> diff --git a/meta/recipes-devtools/gcc/gcc-multilib-config.inc b/meta/recipes-devtools/gcc/gcc-multilib-config.inc
> new file mode 100644
> index 0000000..3d9c026
> --- /dev/null
> +++ b/meta/recipes-devtools/gcc/gcc-multilib-config.inc
> @@ -0,0 +1,132 @@
> +GCCMULTILIB = "--enable-multilib"
> +
> +addtask gcc_multilib_setup after do_patch before do_configure
> +
> +# following code modifies these definitions in the gcc config
> +#    MULTILIB_OPTIONS
> +#    MULTILIB_DIRNAMES
> +#    MULTILIB_OSDIRNAMES
> +#    GLIBC_DYNAMIC_LINKER32
> +#    GLIBC_DYNAMIC_LINKER64
> +#    GLIBC_DYNAMIC_LINKERX32
> +#    GLIBC_DYNAMIC_LINKERN32
> +#  For more information on use of these variables look at these files in the gcc source code
> +#    gcc/config/i386/t-linux64
> +#    gcc/config/mips/t-linux64
> +#    gcc/config/rs6000/t-linux64
> +#    gcc/config/i386/linux64.h
> +#    gcc/config/mips/linux64.h
> +#    gcc/config/rs6000/linux64.h
> +
> +python do_gcc_multilib_setup() {
> +    import re
> +
> +    # do this only for target recipe
> +    if d.getVar('PN', True) != 'gcc':
> +        return
> +
> +    srcdir = d.getVar('S', True)
> +    multilibs = d.getVar('MULTILIB_VARIANTS', True)
> +    target_arch = d.getVar('TARGET_ARCH', True)
> +
> +    gcc_target_config_files = {
> +        'x86_64'    : ['gcc/config/i386/t-linux64'],
> +        'mips'      : ['gcc/config/mips/t-linux64'],
> +        'ppc'       : ['gcc/config/rs6000/t-linux64']
> +    }
> +
> +    gcc_header_config_files = {
> +        'x86_64'    : ['gcc/config/i386/linux64.h'],
> +        'mips'      : ['gcc/config/mips/linux64.h'],
> +        'ppc'       : ['gcc/config/rs6000/linux64.h']
> +    }
> +
> +    if target_arch not in gcc_target_config_files:
> +        if multilibs:
> +            bb.warn('gcc multilib setup is not supported for TARGET_ARCH=' + target_arch)
> +        return
> +
> +    gcc_multilib_target_config_files = gcc_target_config_files[target_arch]
> +    gcc_multilib_header_config_files = gcc_header_config_files[target_arch]
> +
> +    ml_list = ['DEFAULTTUNE']
> +    if multilibs != '':
> +        for ml in multilibs.split(' '):
> +            ml_list.append('DEFAULTTUNE_virtclass-multilib-' + ml)
> +
> +    libdir32 = 'SYSTEMLIBS_DIR'
> +    libdir64 = 'SYSTEMLIBS_DIR'
> +    libdirx32 = 'SYSTEMLIBS_DIR'
> +    libdirn32 = 'SYSTEMLIBS_DIR'
> +
> +    multilib_options = []
> +    multilib_dirnames = []
> +    multilib_osdirnames = []
> +
> +    for ml in ml_list:
> +        tune = d.getVar(ml, True)
> +        tune_parameters = get_tune_parameters(tune, d)
> +
> +        tune_baselib = tune_parameters['baselib']
> +
> +        if tune_baselib == 'lib64':
> +            libdir64 = tune_baselib
> +        elif tune_baselib == 'libx32':
> +            libdirx32 = tune_baselib
> +        elif tune_baselib == 'lib32':
> +            libdirn32 = tune_baselib
> +        elif tune_baselib == 'lib':
> +            libdir32 = tune_baselib
> +        else:
> +            bb.error('Unknown libdir (%s) of the tune : %s' % (tune_baselib, tune))
> +
> +        # take out '-' in parameters
> +        multilib_options.append(re.sub(r' +\-+', ' ', re.sub(r'^ *\-+', '', tune_parameters['ccargs'])))
> +        if tune_baselib == 'lib':
> +            multilib_dirnames.append('32')  # /lib => 32bit lib
> +        else:
> +            multilib_dirnames.append(tune_baselib.replace('lib', ''))
> +        multilib_osdirnames.append('../' + tune_baselib)
> +
> +    # go over t-linux64 kind target files
> +    for ml_conf_file in gcc_multilib_target_config_files:
> +        # recreate multilib configuration variables
> +        lines = []
> +
> +        lines.append('MULTILIB_OPTIONS = ' + '/'.join(multilib_options))
> +        lines.append('MULTILIB_DIRNAMES = ' + ' '.join(multilib_dirnames))
> +        lines.append('MULTILIB_OSDIRNAMES = ' + ' '.join(multilib_osdirnames))
> +
> +        with open(srcdir + '/' + ml_conf_file, 'w') as f:
> +            f.write('\n'.join(lines))
> +
> +    # go over linux64.h kind header files
> +    for ml_conf_file in gcc_multilib_header_config_files:
> +        with open(srcdir + '/' + ml_conf_file, 'r') as f:
> +            filelines = f.read()
> +
> +            # replace lines like
> +            # #define GLIBC_DYNAMIC_LINKER32 SYSTEMLIBS_DIR "ld-linux.so.2"
> +            # by
> +            # #define GLIBC_DYNAMIC_LINKER32 "/lib/" "ld-linux.so.2"
> +            # this is needed to put the correct dynamic loader path in the generated binaries
> +
> +            filelines = re.sub(r'^(#define\s*GLIBC_DYNAMIC_LINKER32\s*)(SYSTEMLIBS_DIR)(\s*\".*\")$',
> +                r'\1"/' + libdir32 + r'/"\3',
> +                filelines, flags=re.MULTILINE)
> +
> +            filelines = re.sub(r'^(#define\s*GLIBC_DYNAMIC_LINKER64\s*)(SYSTEMLIBS_DIR)(\s*\".*\")$',
> +                r'\1"/' + libdir64 + r'/"\3',
> +                filelines, flags=re.MULTILINE)
> +
> +            filelines = re.sub(r'^(#define\s*GLIBC_DYNAMIC_LINKERX32\s*)(SYSTEMLIBS_DIR)(\s*\".*\")$',
> +                r'\1"/' + libdirx32 + r'/"\3',
> +                filelines, flags=re.MULTILINE)
> +
> +            filelines = re.sub(r'^(#define\s*GLIBC_DYNAMIC_LINKERN32\s*)(SYSTEMLIBS_DIR)(\s*\".*\")$',
> +                r'\1"/' + libdirn32 + r'/"\3',
> +                filelines, flags=re.MULTILINE)
> +
> +            with open(srcdir + '/' + ml_conf_file, 'w') as f:
> +                f.write(filelines)
> +}
> diff --git a/meta/recipes-devtools/gcc/libgcc_4.7.bb b/meta/recipes-devtools/gcc/libgcc_4.7.bb
> index 5eaa515..c17c78a 100644
> --- a/meta/recipes-devtools/gcc/libgcc_4.7.bb
> +++ b/meta/recipes-devtools/gcc/libgcc_4.7.bb
> @@ -15,6 +15,10 @@ FILES_${PN} = "${base_libdir}/libgcc*.so.*"
>  FILES_${PN}-dev = " \
>    ${base_libdir}/libgcc*.so \
>    ${libdir}/${TARGET_SYS}/${BINV}/*crt* \
> +  ${libdir}/${TARGET_SYS}/${BINV}/64 \
> +  ${libdir}/${TARGET_SYS}/${BINV}/32 \
> +  ${libdir}/${TARGET_SYS}/${BINV}/x32 \
> +  ${libdir}/${TARGET_SYS}/${BINV}/n32 \
>    ${libdir}/${TARGET_SYS}/${BINV}/libgcc*"
>  FILES_libgcov-dev = " \
>    ${libdir}/${TARGET_SYS}/${BINV}/libgcov.a \
> @@ -70,3 +74,43 @@ BBCLASSEXTEND = "nativesdk"
>  
>  INSANE_SKIP_${PN}-dev = "staticdev"
>  INSANE_SKIP_${MLPREFIX}libgcov-dev = "staticdev"
> +
> +addtask multilib_install after do_install before do_package
> +# this makes multilib gcc files findable for target gcc
> +# e.g.
> +#    /usr/lib/i586-pokymllib32-linux/4.7/
> +# by creating this symlink to it
> +#    /usr/lib64/x86_64-poky-linux/4.7/32
> +
> +python do_multilib_install() {
> +    import re
> +    # do this only for multilib extended recipe
> +    if d.getVar('PN', True) != 'libgcc':
> +        return
> +
> +    multilibs = d.getVar('MULTILIB_VARIANTS', True) or ''
> +    if multilibs == '':
> +        return
> +
> +    binv = d.getVar('BINV', True) or ''
> +
> +    for ml in multilibs.split(' '):
> +        tune = d.getVar('DEFAULTTUNE_virtclass-multilib-' + ml, True) or ''
> +        tune_parameters = get_tune_parameters(tune, d)
> +        tune_baselib = tune_parameters['baselib']
> +        tune_arch = tune_parameters['arch']
> +        tune_bitness = tune_baselib.replace('lib', '')
> +        if tune_bitness == '' :
> +            tune_bitness = '32' # /lib => 32bit lib
> +
> +        src = '../../../' + tune_baselib + '/' + \
> +            tune_arch + d.getVar('TARGET_VENDOR', True) + 'ml' + ml + \
> +            '-' + d.getVar('TARGET_OS', True) + '/' + binv + '/'
> +
> +        dest = d.getVar('D', True) + d.getVar('libdir', True) + '/' + \
> +            d.getVar('TARGET_SYS', True) + '/' + binv + '/' + tune_bitness
> +
> +        if os.path.lexists(dest):
> +            os.unlink(dest)
> +        os.symlink(src, dest)
> +}





^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/3] gcc: enable multilib for target gcc
  2013-01-11 15:20   ` Richard Purdie
@ 2013-01-11 15:26     ` Richard Purdie
  0 siblings, 0 replies; 8+ messages in thread
From: Richard Purdie @ 2013-01-11 15:26 UTC (permalink / raw)
  To: Constantin Musca; +Cc: openembedded-core

On Fri, 2013-01-11 at 15:20 +0000, Richard Purdie wrote:
> On Wed, 2013-01-09 at 11:00 +0200, Constantin Musca wrote:
> > - add a task to setup multilib configuration for target gcc
> > - this commit adapts Nitin Kamble's work to gcc 4.7
> > 
> > Tests:
> > root@qemux86-64:~# gcc -m64 t.c -o t
> > root@qemux86-64:~# file t
> > t: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
> > root@qemux86-64:~# ./t
> > Hello World !
> > root@qemux86-64:~# gcc -m32 t.c -o t
> > root@qemux86-64:~# file t
> > t: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
> > root@qemux86-64:~# ./t
> > Hello World !
> > 
> > [YOCTO #1369]
> > 
> > Signed-off-by: Constantin Musca <constantinx.musca@intel.com>
> > ---
> >  meta/recipes-devtools/gcc/gcc-4.7.inc              |   2 +-
> >  meta/recipes-devtools/gcc/gcc-common.inc           |  23 ++++
> >  meta/recipes-devtools/gcc/gcc-configure-common.inc |   2 +-
> >  meta/recipes-devtools/gcc/gcc-configure-target.inc |   1 +
> >  meta/recipes-devtools/gcc/gcc-multilib-config.inc  | 132 +++++++++++++++++++++
> >  meta/recipes-devtools/gcc/libgcc_4.7.bb            |  44 +++++++
> >  6 files changed, 202 insertions(+), 2 deletions(-)
> >  create mode 100644 meta/recipes-devtools/gcc/gcc-multilib-config.inc
> 
> This triggered some build failures:
> 
> http://autobuilder.yoctoproject.org:8010/builders/nightly-mips/builds/769/steps/shell_29/logs/stdio

and a different more subtle issue in:

http://autobuilder.yoctoproject.org:8010/builders/nightly-x86-64-lsb/builds/191/steps/shell_29/logs/stdio

which I suspect is related since a build of master just before this
without the patch worked.

Cheers,

Richard




^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-01-11 15:42 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-09  9:00 [PATCH 0/3] On-target multilib gcc enhancement Constantin Musca
2013-01-09  9:00 ` [PATCH 1/3] gcc: add missing dependency (zlib) Constantin Musca
2013-01-09  9:00 ` [PATCH 2/3] gcc: remove the 64bithack patch Constantin Musca
2013-01-09 13:45   ` Richard Purdie
2013-01-09 14:30     ` Constantin Musca
2013-01-09  9:00 ` [PATCH 3/3] gcc: enable multilib for target gcc Constantin Musca
2013-01-11 15:20   ` Richard Purdie
2013-01-11 15:26     ` Richard Purdie

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.