diff options
author | Gary Oberbrunner <garyo@oberbrunner.com> | 2014-05-18 23:51:34 (GMT) |
---|---|---|
committer | Gary Oberbrunner <garyo@oberbrunner.com> | 2014-05-18 23:51:34 (GMT) |
commit | 995d4d8d85125e9cf30dca84979c78cc1735c8ee (patch) | |
tree | bb47ccb7b4705f82724646b5952c439bdd9f5650 | |
parent | 506f2c73e916b87e2755e7840bc114027a332381 (diff) | |
parent | 7f96f0f6c890a58a1a58c76b0e636024dec2628f (diff) | |
download | SCons-995d4d8d85125e9cf30dca84979c78cc1735c8ee.zip SCons-995d4d8d85125e9cf30dca84979c78cc1735c8ee.tar.gz SCons-995d4d8d85125e9cf30dca84979c78cc1735c8ee.tar.bz2 |
Merged in haubi/scons/aix-xlc_r-is-for-threads (pull request #140)
The _r in AIX xlc_r means reentrant, not relocatable.
-rw-r--r-- | src/engine/SCons/Action.py | 1 | ||||
-rw-r--r-- | src/engine/SCons/Platform/aix.py | 40 | ||||
-rw-r--r-- | src/engine/SCons/Tool/aixc++.py | 19 | ||||
-rw-r--r-- | src/engine/SCons/Tool/aixcc.py | 18 |
4 files changed, 47 insertions, 31 deletions
diff --git a/src/engine/SCons/Action.py b/src/engine/SCons/Action.py index 33d8790..16866b6 100644 --- a/src/engine/SCons/Action.py +++ b/src/engine/SCons/Action.py @@ -685,6 +685,7 @@ def _subproc(scons_env, cmd, error = 'ignore', **kw): class f(object): def read(self): return '' def readline(self): return '' + def __iter__(self): return iter(()) stdout = stderr = f() return dummyPopen(e) diff --git a/src/engine/SCons/Platform/aix.py b/src/engine/SCons/Platform/aix.py index 0229112..b6933a4 100644 --- a/src/engine/SCons/Platform/aix.py +++ b/src/engine/SCons/Platform/aix.py @@ -33,10 +33,14 @@ selection method. __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" import os +import subprocess import posix -def get_xlc(env, xlc=None, xlc_r=None, packages=[]): +import SCons.Util +import SCons.Action + +def get_xlc(env, xlc=None, packages=[]): # Use the AIX package installer tool lslpp to figure out where a # given xl* compiler is installed and what version it is. xlcPath = None @@ -44,18 +48,30 @@ def get_xlc(env, xlc=None, xlc_r=None, packages=[]): if xlc is None: xlc = env.get('CC', 'xlc') - if xlc_r is None: - xlc_r = xlc + '_r' + if SCons.Util.is_List(xlc): + xlc = xlc[0] for package in packages: - cmd = "lslpp -fc " + package + " 2>/dev/null | egrep '" + xlc + "([^-_a-zA-Z0-9].*)?$'" - line = os.popen(cmd).readline() - if line: - v, p = line.split(':')[1:3] - xlcVersion = v.split()[1] - xlcPath = p.split()[0] - xlcPath = xlcPath[:xlcPath.rindex('/')] - break - return (xlcPath, xlc, xlc_r, xlcVersion) + # find the installed filename, which may be a symlink as well + pipe = SCons.Action._subproc(env, ['lslpp', '-fc', package], + stdin = 'devnull', + stderr = 'devnull', + stdout = subprocess.PIPE) + # output of lslpp is something like this: + # #Path:Fileset:File + # /usr/lib/objrepos:vac.C 6.0.0.0:/usr/vac/exe/xlCcpp + # /usr/lib/objrepos:vac.C 6.0.0.0:/usr/vac/bin/xlc_r -> /usr/vac/bin/xlc + for line in pipe.stdout: + if xlcPath: + continue # read everything to let lslpp terminate + fileset, filename = line.split(':')[1:3] + filename = filename.split()[0] + if ('/' in xlc and filename == xlc) \ + or ('/' not in xlc and filename.endswith('/' + xlc)): + xlcVersion = fileset.split()[1] + xlcPath, sep, xlc = filename.rpartition('/') + pass + pass + return (xlcPath, xlc, xlcVersion) def generate(env): posix.generate(env) diff --git a/src/engine/SCons/Tool/aixc++.py b/src/engine/SCons/Tool/aixc++.py index 5aa1eeec..c86d530 100644 --- a/src/engine/SCons/Tool/aixc++.py +++ b/src/engine/SCons/Tool/aixc++.py @@ -43,8 +43,7 @@ packages = ['vacpp.cmp.core', 'vacpp.cmp.batch', 'vacpp.cmp.C', 'ibmcxx.cmp'] def get_xlc(env): xlc = env.get('CXX', 'xlC') - xlc_r = env.get('SHCXX', 'xlC_r') - return SCons.Platform.aix.get_xlc(env, xlc, xlc_r, packages) + return SCons.Platform.aix.get_xlc(env, xlc, packages) def smart_cxxflags(source, target, env, for_signature): build_dir = env.GetBuildPath() @@ -55,20 +54,20 @@ def smart_cxxflags(source, target, env, for_signature): def generate(env): """Add Builders and construction variables for xlC / Visual Age suite to an Environment.""" - path, _cxx, _shcxx, version = get_xlc(env) - if path: + path, _cxx, version = get_xlc(env) + if path and _cxx: _cxx = os.path.join(path, _cxx) - _shcxx = os.path.join(path, _shcxx) + + if 'CXX' not in env: + env['CXX'] = _cxx cplusplus.generate(env) - env['CXX'] = _cxx - env['SHCXX'] = _shcxx - env['CXXVERSION'] = version - env['SHOBJSUFFIX'] = '.pic.o' + if version: + env['CXXVERSION'] = version def exists(env): - path, _cxx, _shcxx, version = get_xlc(env) + path, _cxx, version = get_xlc(env) if path and _cxx: xlc = os.path.join(path, _cxx) if os.path.exists(xlc): diff --git a/src/engine/SCons/Tool/aixcc.py b/src/engine/SCons/Tool/aixcc.py index 9668f79..a89a97e 100644 --- a/src/engine/SCons/Tool/aixcc.py +++ b/src/engine/SCons/Tool/aixcc.py @@ -42,25 +42,25 @@ packages = ['vac.C', 'ibmcxx.cmp'] def get_xlc(env): xlc = env.get('CC', 'xlc') - xlc_r = env.get('SHCC', 'xlc_r') - return SCons.Platform.aix.get_xlc(env, xlc, xlc_r, packages) + return SCons.Platform.aix.get_xlc(env, xlc, packages) def generate(env): """Add Builders and construction variables for xlc / Visual Age suite to an Environment.""" - path, _cc, _shcc, version = get_xlc(env) - if path: + path, _cc, version = get_xlc(env) + if path and _cc: _cc = os.path.join(path, _cc) - _shcc = os.path.join(path, _shcc) + + if 'CC' not in env: + env['CC'] = _cc cc.generate(env) - env['CC'] = _cc - env['SHCC'] = _shcc - env['CCVERSION'] = version + if version: + env['CCVERSION'] = version def exists(env): - path, _cc, _shcc, version = get_xlc(env) + path, _cc, version = get_xlc(env) if path and _cc: xlc = os.path.join(path, _cc) if os.path.exists(xlc): |