Commits

Gary Oberbrunner committed b5b8b68 Merge

Merged in haubi/scons/aix-xlc_r-is-for-threads (pull request #140)

The _r in AIX xlc_r means reentrant, not relocatable.

Comments (0)

Files changed (4)

src/engine/SCons/Action.py

             class f(object):
                 def read(self): return ''
                 def readline(self): return ''
+                def __iter__(self): return iter(())
             stdout = stderr = f()
         return dummyPopen(e)
 

src/engine/SCons/Platform/aix.py

 __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
 
     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)

src/engine/SCons/Tool/aixc++.py

 
 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()
 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):

src/engine/SCons/Tool/aixcc.py

 
 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):