[OE-core] [PATCH 08/10] target gcc: gcc-multilib-setup
nitin.a.kamble at intel.com
nitin.a.kamble at intel.com
Wed Feb 22 06:37:51 UTC 2012
From: Nitin A Kamble <nitin.a.kamble at intel.com>
add a task to setup multilib configuration for target gcc.
now the multilib setup file is tweeked as needed.
Signed-off-by: Nitin A Kamble <nitin.a.kamble at intel.com>
gcc-multilib-config.inc: tail
Signed-off-by: Nitin A Kamble <nitin.a.kamble at intel.com>
---
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 | 149 ++++++++++++++++++++
3 files changed, 151 insertions(+), 1 deletions(-)
create mode 100644 meta/recipes-devtools/gcc/gcc-multilib-config.inc
diff --git a/meta/recipes-devtools/gcc/gcc-configure-common.inc b/meta/recipes-devtools/gcc/gcc-configure-common.inc
index c4b6ac1..f4f0112 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"
EXTRA_OECONF = "${@['--enable-clocale=generic', ''][d.getVar('USE_NLS', 1) != 'no']} \
--with-gnu-ld \
diff --git a/meta/recipes-devtools/gcc/gcc-configure-target.inc b/meta/recipes-devtools/gcc/gcc-configure-target.inc
index 8b169a7..9001bcf 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-local-prefix=${STAGING_DIR_TARGET}${prefix} \
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..173c2fe
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-multilib-config.inc
@@ -0,0 +1,149 @@
+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
+# Nitin Kamble 2012/02/13
+
+python do_gcc_multilib_setup() {
+ import re
+
+ # do this only for target recipe
+ if d.getVar('PN', 1) != 'gcc':
+ return
+
+ srcdir = d.getVar('S', 1) or ''
+
+ multilibs = d.getVar('MULTILIB_VARIANTS', 1) or ''
+ if multilibs == '':
+ return
+
+ 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' }
+
+ target_arch = d.getVar('TARGET_ARCH', 1) or ''
+
+ if target_arch not in gcc_target_config_files:
+ bb.warn('gcc multilib setup is not supported for TARGET_ARCH=' + target_arch)
+ return
+
+ gcc_multilib_target_config_file = gcc_target_config_files[target_arch]
+
+ gcc_multilib_header_config_file = gcc_header_config_files[target_arch]
+
+ ml_list = ['DEFAULTTUNE']
+ for ml in multilibs.split(' '):
+ ml_list.append('DEFAULTTUNE_virtclass-multilib-' + ml)
+
+ tunes_32 = ['x86', 'core2', 'i586', 'mips', 'mipsel', 'mips-nf', 'mipsel-nf', 'powerpc', 'powerpc-nf']
+ tunes_64 = ['x86-64', 'core2-64', 'mips64', 'mips64el', 'mips64-nf', 'mips64el-nf', 'powerpc64']
+ tunes_x32 = ['x86-64-x32', 'core2-64-x32']
+ tunes_n32 = ['mips64-n32', 'mips64el-n32', 'mips64-nf-n32', 'mips64el-nf-n32']
+
+ libdir32 = 'SYSTEMLIBS_DIR'
+ libdir64 = 'SYSTEMLIBS_DIR'
+ libdirx32 = 'SYSTEMLIBS_DIR'
+ libdirn32 = 'SYSTEMLIBS_DIR'
+
+ multilib_options = []
+ multilib_dirnames = []
+ multilib_osdirnames = []
+
+ for ml in ml_list:
+ ml_tune = d.getVar(ml, 1) or ''
+ ml_tune_features = d.getVar('TUNE_FEATURES_tune-' + ml_tune, 1) or ''
+ ml_baselib = d.getVar('BASE_LIB_tune-' + ml_tune, 1) or ''
+
+ if ml_tune in tunes_32:
+ libdir32 = ml_baselib
+ elif ml_tune in tunes_64:
+ libdir64 = ml_baselib
+ elif ml_tune in tunes_x32:
+ libdirx32 = ml_baselib
+ elif ml_tune in tunes_n32:
+ libdirn32 = ml_baselib
+
+ ml_tune_ccargs_list = []
+ for feature in ml_tune_features.split():
+ ml_feature_ccargs = d.getVar('TUNE_FEATURE_CCARGS-' + feature, 1) or ''
+ ml_tune_ccargs_list.append(ml_feature_ccargs)
+ ml_tune_ccargs = ' '.join(ml_tune_ccargs_list)
+ # take out '-' in parameters
+ multilib_options.append(re.sub(r'^\-+', '', re.sub(r' \-+', ' ', ml_tune_ccargs)))
+ if ml_baselib == 'lib':
+ multilib_dirnames.append('32')
+ else:
+ multilib_dirnames.append(ml_baselib.replace('lib', ''))
+ multilib_osdirnames.append('../' + ml_baselib)
+
+ with open(srcdir + '/' + gcc_multilib_target_config_file, 'r') as f:
+ filelines = f.read()
+ f.close()
+
+ # recreate multilib configuration variables
+
+ filelines = re.sub(r'^\s*MULTILIB_OPTIONS\s*=.*$',
+ 'MULTILIB_OPTIONS = ' + '/'.join(multilib_options),
+ filelines, flags=re.MULTILINE)
+
+ filelines = re.sub(r'^\s*MULTILIB_DIRNAMES\s*=.*$',
+ 'MULTILIB_DIRNAMES = ' + ' '.join(multilib_dirnames),
+ filelines, flags=re.MULTILINE)
+
+ filelines = re.sub(r'^\s*MULTILIB_OSDIRNAMES\s*=.*$',
+ 'MULTILIB_OSDIRNAMES = ' + ' '.join(multilib_osdirnames),
+ filelines, flags=re.MULTILINE)
+
+ with open(srcdir + '/' + gcc_multilib_target_config_file, 'w') as f:
+ f.write(filelines)
+ f.close()
+
+ with open(srcdir + '/' + gcc_multilib_header_config_file, 'r') as f:
+ filelines = f.read()
+ f.close()
+
+ # 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 + '/' + gcc_multilib_header_config_file, 'w') as f:
+ f.write(filelines)
+ f.close()
+}
--
1.7.6.4
More information about the Openembedded-core
mailing list