summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Haubenwallner <haubi@gentoo.org>2014-05-15 11:07:44 +0200
committerMichael Haubenwallner <haubi@gentoo.org>2014-05-15 11:07:44 +0200
commitb224e56784d3f5f95a1fca78c4ba7b3a876bee98 (patch)
treef555b2cdfea0063ddcf2292a4d074e874223477c
parent8ba875c2d0a5954a0f29a6260cb4c109de17f641 (diff)
downloadscons-b224e56784d3f5f95a1fca78c4ba7b3a876bee98.tar.gz
The _r in AIX xlc_r means reentrant, not relocatable.
It does not make any sense to use 'xlc' for CC and 'xlc_r' for SHCC, as the '_r' does stand for 'reentrant' rather than 'relocatable' or similar. Avoid 'egrep' to parse the lslpp output, it's easy enough within python. Needs output streams of _subproc.dummyPopen to be iterable.
-rw-r--r--src/engine/SCons/Action.py1
-rw-r--r--src/engine/SCons/Platform/aix.py40
-rw-r--r--src/engine/SCons/Tool/aixc++.py19
-rw-r--r--src/engine/SCons/Tool/aixcc.py18
4 files changed, 47 insertions, 31 deletions
diff --git a/src/engine/SCons/Action.py b/src/engine/SCons/Action.py
index 33d87906..16866b67 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 0229112d..b6933a49 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..c86d5309 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 9668f799..a89a97e4 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):