[Numpy-svn] r3485 - in branches/distutils-revamp: . command fcompiler

numpy-svn at scipy.org numpy-svn at scipy.org
Wed Dec 13 00:16:19 EST 2006


Author: cookedm
Date: 2006-12-12 23:16:09 -0600 (Tue, 12 Dec 2006)
New Revision: 3485

Modified:
   branches/distutils-revamp/
   branches/distutils-revamp/ccompiler.py
   branches/distutils-revamp/command/
   branches/distutils-revamp/command/build_clib.py
   branches/distutils-revamp/command/build_ext.py
   branches/distutils-revamp/command/build_src.py
   branches/distutils-revamp/command/config_compiler.py
   branches/distutils-revamp/core.py
   branches/distutils-revamp/fcompiler/
   branches/distutils-revamp/fcompiler/__init__.py
   branches/distutils-revamp/fcompiler/g95.py
   branches/distutils-revamp/fcompiler/gnu.py
   branches/distutils-revamp/fcompiler/intel.py
   branches/distutils-revamp/fcompiler/nag.py
   branches/distutils-revamp/misc_util.py
   branches/distutils-revamp/system_info.py
Log:
[distutils-rework] Merged revisions 2922,2924-3484 via svnmerge from 
http://svn.scipy.org/svn/numpy/trunk/numpy/distutils

Biggest problem in merging was appropiately choosing a f90 compiler in
build_clib and build_ext.

........
  r2979 | cookedm | 2006-08-08 17:16:05 -0400 (Tue, 08 Aug 2006) | 1 line
  
  fix #234: IntelVisualFCompiler is broken
........
  r3014 | stefan | 2006-08-14 06:05:22 -0400 (Mon, 14 Aug 2006) | 2 lines
  
  Ignore *.pyc files [for Albert Strasheim].
........
  r3061 | oliphant | 2006-08-24 16:07:59 -0400 (Thu, 24 Aug 2006) | 1 line
  
  update g95 version pattern
........
  r3138 | rkern | 2006-09-08 12:56:50 -0400 (Fri, 08 Sep 2006) | 1 line
  
  Fix #198
........
  r3164 | oliphant | 2006-09-15 17:06:47 -0400 (Fri, 15 Sep 2006) | 1 line
  
  Fix subversion number getting for 1.4 clients.  Also works for pre 1.4 clients.
........
  r3165 | oliphant | 2006-09-15 17:13:09 -0400 (Fri, 15 Sep 2006) | 1 line
  
  Fix when svnversion is not present.
........
  r3166 | oliphant | 2006-09-15 17:18:33 -0400 (Fri, 15 Sep 2006) | 1 line
  
  Small code re-org in _get_svn_revision
........
  r3228 | cookedm | 2006-09-28 07:23:18 -0400 (Thu, 28 Sep 2006) | 1 line
  
  For the MKL library, define the macro SCIPY_MKL_H
........
  r3240 | rkern | 2006-10-02 12:41:47 -0400 (Mon, 02 Oct 2006) | 1 line
  
  Add .dylib as a valid OS X shared library extension.
........
  r3290 | pearu | 2006-10-08 05:30:17 -0400 (Sun, 08 Oct 2006) | 1 line
  
  numpy.distutils: use language flag or source file extension to select default f77 or f90 compiler.
........
  r3291 | pearu | 2006-10-08 05:38:12 -0400 (Sun, 08 Oct 2006) | 1 line
  
  numpy.distutils: fixed bug.
........
  r3302 | pearu | 2006-10-10 16:27:23 -0400 (Tue, 10 Oct 2006) | 1 line
  
  Improved is_free_format.
........
  r3371 | pearu | 2006-10-19 18:03:23 -0400 (Thu, 19 Oct 2006) | 1 line
  
  Add Intel Itanium compiler 9.x support (needs testing).
........
  r3372 | oliphant | 2006-10-19 18:55:23 -0400 (Thu, 19 Oct 2006) | 1 line
  
  Fix missing comment characters in intel.py.  Check for None in .reshape and .resize
........
  r3430 | stefan | 2006-11-04 16:19:03 -0500 (Sat, 04 Nov 2006) | 2 lines
  
  Fix typo.
........
  r3450 | pearu | 2006-11-19 15:56:57 -0500 (Sun, 19 Nov 2006) | 1 line
  
  Skip interactive mode when using script_args argument.
........
  r3467 | oliphant | 2006-12-01 23:34:25 -0500 (Fri, 01 Dec 2006) | 1 line
  
  Try updating version command for NAG compiler.
........



Property changes on: branches/distutils-revamp
___________________________________________________________________
Name: svnmerge-integrated
   - /branches/distutils-revamp:1-2756 /trunk/numpy/distutils:1-2921,2923
   + /branches/distutils-revamp:1-2756 /trunk/numpy/distutils:1-3484
Name: svn:ignore
   + *.pyc


Modified: branches/distutils-revamp/ccompiler.py
===================================================================
--- branches/distutils-revamp/ccompiler.py	2006-12-12 01:07:51 UTC (rev 3484)
+++ branches/distutils-revamp/ccompiler.py	2006-12-13 05:16:09 UTC (rev 3485)
@@ -198,7 +198,7 @@
         # 'CCSHARED', 'LDSHARED', 'SO')
         try:
             self.compiler_so.remove('-Wstrict-prototypes')
-        except ValueError:
+        except (AttributeError, ValueError):
             pass
         
         if hasattr(self,'compiler') and self.compiler[0].find('cc')>=0:


Property changes on: branches/distutils-revamp/command
___________________________________________________________________
Name: svn:ignore
   + *.pyc


Modified: branches/distutils-revamp/command/build_clib.py
===================================================================
--- branches/distutils-revamp/command/build_clib.py	2006-12-12 01:07:51 UTC (rev 3484)
+++ branches/distutils-revamp/command/build_clib.py	2006-12-13 05:16:09 UTC (rev 3485)
@@ -9,6 +9,11 @@
 from numpy.distutils.misc_util import filter_sources, has_f_sources,\
      has_cxx_sources, all_strings, get_lib_source_files, is_sequence
 
+try:
+    set
+except NameError:
+    from sets import Set as set
+
 class build_clib(old_build_clib):
 
     description = "build C/C++/F libraries used by Python extensions"
@@ -24,29 +29,41 @@
 
     def finalize_options(self):
         old_build_clib.finalize_options(self)
-        self.set_undefined_options('build_ext',
+        self._languages = None
+        self.set_undefined_options('config_fc',
                                    ('fcompiler', 'fcompiler'))
 
+    def get_languages(self):
+        """Return a set of language names used in this library.
+        Valid language names are 'c', 'f77', and 'f90'.
+
+        Note that this has a side effect of running 'build_src'.
+        """
+        if self._languages is None:
+            languages = set()
+            for (lib_name, build_info) in self.libraries:
+                if not all_strings(build_info.get('sources',[])):
+                    self.run_command('build_src')
+                l = build_info.get('language',None)
+                if l:
+                    languages.add(l)
+            self._languages = languages
+        return self._languages
+
     def have_f_sources(self):
-        for (lib_name, build_info) in self.libraries:
-            if has_f_sources(build_info.get('sources',[])):
-                return True
-        return False
+        l = self.get_languages()
+        return 'f90' in l or 'f77' in l
 
     def have_cxx_sources(self):
-        for (lib_name, build_info) in self.libraries:
-            if has_cxx_sources(build_info.get('sources',[])):
-                return True
-        return False
+        l = self.get_languages()
+        return 'c' in l
 
     def run(self):
         if not self.libraries:
             return
 
         # Make sure that library sources are complete.
-        for (lib_name, build_info) in self.libraries:
-            if not all_strings(build_info.get('sources',[])):
-                self.run_command('build_src')
+        languages = self.get_languages()
 
         from distutils.ccompiler import new_compiler
         self.compiler = new_compiler(compiler=self.compiler,
@@ -63,6 +80,11 @@
         self.compiler.show_customization()
 
         if self.have_f_sources():
+            cf = self.get_finalized_command('config_fc')
+            if 'f90' in languages:
+                self.fcompiler = cf.get_f90_compiler()
+            else:
+                self.fcompiler = cf.get_f77_compiler()
             libraries = self.libraries
             self.libraries = None
             self.fcompiler.customize_cmd(self)
@@ -111,10 +133,12 @@
                          'for fortran compiler: %s' \
                          % (config_fc))
                 from numpy.distutils.fcompiler import new_fcompiler
+                requiref90 = build_info.get('language','c')=='f90'
                 fcompiler = new_fcompiler(compiler=self.fcompiler.compiler_type,
                                           verbose=self.verbose,
                                           dry_run=self.dry_run,
-                                          force=self.force)
+                                          force=self.force,
+                                          requiref90=requiref90)
                 fcompiler.customize(config_fc)
 
             macros = build_info.get('macros')

Modified: branches/distutils-revamp/command/build_ext.py
===================================================================
--- branches/distutils-revamp/command/build_ext.py	2006-12-12 01:07:51 UTC (rev 3484)
+++ branches/distutils-revamp/command/build_ext.py	2006-12-13 05:16:09 UTC (rev 3485)
@@ -75,8 +75,15 @@
                     need_f_compiler = True
                     break
 
+        requiref90 = False
+        if need_f_compiler:
+            for ext in self.extensions:
+                if getattr(ext,'language','c')=='f90':
+                    requiref90 = True
+                    break
+
         # Determine if C++ compiler is needed.
-        need_cxx_compiler = 0
+        need_cxx_compiler = False
         for ext in self.extensions:
             if has_cxx_sources(ext.sources):
                 need_cxx_compiler = True
@@ -96,6 +103,11 @@
 
         # Initialize Fortran/C++ compilers if needed.
         if need_f_compiler:
+            cf = self.get_finalized_command('config_fc')
+            if requiref90:
+                self.fcompiler = cf.get_f90_compiler()
+            else:
+                self.fcompiler = cf.get_f77_compiler()
             if self.fcompiler.get_version():
                 self.fcompiler.customize_cmd(self)
                 self.fcompiler.show_customization()
@@ -343,7 +355,7 @@
         # make g77-compiled static libs available to MSVC
         lib_added = False
         for lib in self.fcompiler.libraries:
-            if not lib.startswtih('msvcr'):
+            if not lib.startswith('msvcr'):
                 c_libraries.append(lib)
                 p = combine_paths(f_lib_dirs, 'lib' + lib + '.a')
                 if p:

Modified: branches/distutils-revamp/command/build_src.py
===================================================================
--- branches/distutils-revamp/command/build_src.py	2006-12-12 01:07:51 UTC (rev 3484)
+++ branches/distutils-revamp/command/build_src.py	2006-12-13 05:16:09 UTC (rev 3485)
@@ -438,7 +438,8 @@
             if (self.force or newer_group(depends, target_file,'newer')) \
                    and not skip_f2py:
                 log.info("f2py: %s" % (source))
-                f2py.run_main(f2py_options + ['--build-dir',target_dir,source])
+                numpy.f2py.run_main(f2py_options
+                                    + ['--build-dir',target_dir,source])
             else:
                 log.debug("  skipping '%s' f2py interface (up-to-date)" % (source))
         else:
@@ -455,7 +456,7 @@
                    and not skip_f2py:
                 log.info("f2py:> %s" % (target_file))
                 self.mkpath(target_dir)
-                f2py.run_main(f2py_options + ['--lower',
+                numpy.f2py.run_main(f2py_options + ['--lower',
                                                 '--build-dir',target_dir]+\
                                 ['-m',ext_name]+f_sources)
             else:
@@ -475,7 +476,7 @@
             extension.include_dirs.append(self.build_src)
 
         if not skip_f2py:
-            d = os.path.dirname(f2py.__file__)
+            d = os.path.dirname(numpy.f2py.__file__)
             source_c = os.path.join(d,'src','fortranobject.c')
             source_h = os.path.join(d,'src','fortranobject.h')
             if newer(source_c,target_c) or newer(source_h,target_h):

Modified: branches/distutils-revamp/command/config_compiler.py
===================================================================
--- branches/distutils-revamp/command/config_compiler.py	2006-12-12 01:07:51 UTC (rev 3484)
+++ branches/distutils-revamp/command/config_compiler.py	2006-12-13 05:16:09 UTC (rev 3485)
@@ -2,6 +2,7 @@
 import sys
 import distutils.core
 from distutils.core import Command
+from distutils.errors import DistutilsSetupError
 from distutils import log
 from numpy.distutils.fcompiler import show_fcompilers, new_fcompiler
 
@@ -76,7 +77,28 @@
                            verbose=self.distribution.verbose)
         fc.customize(self.distribution)
         self.fcompiler = fc
+        if self.fcompiler.compiler_f90 is not None:
+            self.f90compiler = fc
+        else:
+            self.f90compiler = None
         log.info('%s (%s)' % (fc.description, fc.get_version()))
 
     def run(self):
         pass
+
+    def get_f77_compiler(self):
+        if self.fcompiler.compiler_f77 is None:
+            raise DistutilsSetupError("could not find a Fortran 77 compiler")
+        return self.fcompiler
+
+    def get_f90_compiler(self):
+        if self.f90compiler is not None:
+            return self.f90compiler
+        if self.fcompiler.compiler_f90 is None:
+            fc = new_fcompiler(compiler=self.fcompiler,
+                               verbose=self.distribution.verbose,
+                               requiref90=True)
+            if fc is None:
+                raise DistutilsSetupError("could not find a Fortran 90 compiler")
+            self.f90compiler = fc
+            return fc

Modified: branches/distutils-revamp/core.py
===================================================================
--- branches/distutils-revamp/core.py	2006-12-12 01:07:51 UTC (rev 3484)
+++ branches/distutils-revamp/core.py	2006-12-13 05:16:09 UTC (rev 3485)
@@ -117,7 +117,7 @@
 
 def setup(**attr):
 
-    if len(sys.argv)<=1:
+    if len(sys.argv)<=1 and not attr.get('script_args',[]):
         from interactive import interactive_sys_argv
         import atexit
         atexit.register(_exit_interactive_session)


Property changes on: branches/distutils-revamp/fcompiler
___________________________________________________________________
Name: svn:ignore
   + *.pyc


Modified: branches/distutils-revamp/fcompiler/__init__.py
===================================================================
--- branches/distutils-revamp/fcompiler/__init__.py	2006-12-12 01:07:51 UTC (rev 3484)
+++ branches/distutils-revamp/fcompiler/__init__.py	2006-12-13 05:16:09 UTC (rev 3485)
@@ -49,7 +49,7 @@
     DON'T call these methods (except get_version) after
     constructing a compiler instance or inside any other method.
     All methods, except get_version_cmd() and get_flags_version(), may
-    call get_version() method.
+    call the get_version() method.
 
     After constructing a compiler instance, always call customize(dist=None)
     method that finalizes compiler construction and makes the following
@@ -171,6 +171,11 @@
             if e not in self.executables:
                 self.executables[e] = None
 
+    # If compiler does not support compiling Fortran 90 then it can
+    # suggest using another compiler. For example, gnu would suggest
+    # gnu95 compiler type when there are F90 sources.
+    suggested_f90_compiler = None
+
     ######################################################################
     ## Methods that subclasses may redefine. But don't call these methods!
     ## They are private to FCompiler class and may return unexpected
@@ -471,14 +476,14 @@
             flavor = ':f90'
             compiler = self.compiler_f90
             if compiler is None:
-                raise DistutilsExecError, 'f90 not supported by '\
-                      +self.__class__.__name__
+                raise DistutilsExecError, 'f90 not supported by %s needed for %s'\
+                      % (self.__class__.__name__,src)
         else:
             flavor = ':fix'
             compiler = self.compiler_fix
             if compiler is None:
-                raise DistutilsExecError, 'f90 (fixed) not supported by '\
-                      +self.__class__.__name__
+                raise DistutilsExecError, 'f90 (fixed) not supported by %s needed for %s'\
+                      % (self.__class__.__name__,src)
         if self.object_switch[-1]==' ':
             o_args = [self.object_switch.strip(),obj]
         else:
@@ -642,7 +647,8 @@
                                                         klass,
                                                         klass.description)
 
-def _find_existing_fcompiler(compiler_types, osname=None, platform=None):
+def _find_existing_fcompiler(compiler_types, osname=None, platform=None,
+                             requiref90=False):
     from numpy.distutils.core import get_distribution
     dist = get_distribution(always=True)
     for compiler_type in compiler_types:
@@ -651,6 +657,21 @@
             c = new_fcompiler(plat=platform, compiler=compiler_type)
             c.customize(dist)
             v = c.get_version()
+            if requiref90 and c.compiler_f90 is None:
+                v = None
+                new_compiler = c.suggested_f90_compiler
+                if new_compiler:
+                    log.warn('Trying %r compiler as suggested by %r '
+                             'compiler for f90 support.' % (compiler,
+                                                            new_compiler))
+                    c = new_fcompiler(plat=platform, compiler=new_compiler)
+                    c.customize(dist)
+                    v = c.get_version()
+                    if v is not None:
+                        compiler_type = new_compiler
+            if requiref90 and c.compiler_f90 is None:
+                raise ValueError('%s does not support compiling f90 codes, '
+                                 'skipping.' % (c.__class__.__name__))
         except DistutilsModuleError:
             pass
         except CompilerNotFound:
@@ -659,7 +680,7 @@
             return compiler_type
     return None
 
-def get_default_fcompiler(osname=None, platform=None):
+def get_default_fcompiler(osname=None, platform=None, requiref90=False):
     """Determine the default Fortran compiler to use for the given platform."""
     if osname is None:
         osname = os.name
@@ -673,14 +694,16 @@
         matching_compiler_types.append('gnu')
     compiler_type =  _find_existing_fcompiler(matching_compiler_types,
                                               osname=osname,
-                                              platform=platform)
+                                              platform=platform,
+                                              requiref90=requiref90)
     return compiler_type
 
 def new_fcompiler(plat=None,
                   compiler=None,
                   verbose=0,
                   dry_run=0,
-                  force=0):
+                  force=0,
+                  requiref90=False):
     """Generate an instance of some FCompiler subclass for the supplied
     platform/compiler combination.
     """
@@ -688,7 +711,7 @@
     if plat is None:
         plat = os.name
     if compiler is None:
-        compiler = get_default_fcompiler(plat)
+        compiler = get_default_fcompiler(plat, requiref90=requiref90)
     try:
         module_name, klass, long_description = fcompiler_class[compiler]
     except KeyError:
@@ -774,7 +797,8 @@
 _has_f_header = re.compile(r'-[*]-\s*fortran\s*-[*]-',re.I).search
 _has_f90_header = re.compile(r'-[*]-\s*f90\s*-[*]-',re.I).search
 _has_fix_header = re.compile(r'-[*]-\s*fix\s*-[*]-',re.I).search
-_free_f90_start = re.compile(r'[^c*]\s*[^\s\d\t]',re.I).match
+_free_f90_start = re.compile(r'[^c*!]\s*[^\s\d\t]',re.I).match
+
 def is_free_format(file):
     """Check if file is in free format Fortran."""
     # f90 allows both fixed and free format, assuming fixed unless
@@ -782,16 +806,17 @@
     result = 0
     f = open(file,'r')
     line = f.readline()
-    n = 15 # the number of non-comment lines to scan for hints
+    n = 10000 # the number of non-comment lines to scan for hints
     if _has_f_header(line):
         n = 0
     elif _has_f90_header(line):
         n = 0
         result = 1
     while n>0 and line:
-        if line[0]!='!':
+        line = line.rstrip()
+        if line and line[0]!='!':
             n -= 1
-            if (line[0]!='\t' and _free_f90_start(line[:5])) or line[-2:-1]=='&':
+            if (line[0]!='\t' and _free_f90_start(line[:5])) or line[-1:]=='&':
                 result = 1
                 break
         line = f.readline()

Modified: branches/distutils-revamp/fcompiler/g95.py
===================================================================
--- branches/distutils-revamp/fcompiler/g95.py	2006-12-12 01:07:51 UTC (rev 3484)
+++ branches/distutils-revamp/fcompiler/g95.py	2006-12-13 05:16:09 UTC (rev 3485)
@@ -12,11 +12,15 @@
 
     compiler_type = 'g95'
     description = 'G95 Fortran Compiler'
-    version_pattern = r'G95 \((GCC (?P<gccversion>[\d.]+)|.*?) \(g95!\) (?P<version>.*)\).*'
 
+#    version_pattern = r'G95 \((GCC (?P<gccversion>[\d.]+)|.*?) \(g95!\) (?P<version>.*)\).*'
     # $ g95 --version
     # G95 (GCC 4.0.3 (g95!) May 22 2006)
 
+    version_pattern = r'G95 \((GCC (?P<gccversion>[\d.]+)|.*?) \(g95 (?P<version>.*)!\) (?P<date>.*)\).*'
+    # $ g95 --version
+    # G95 (GCC 4.0.3 (g95 0.90!) Aug 22 2006)
+
     executables = {
         'version_cmd'  : ["<F90>", "--version"],
         'compiler_f77' : ["g95", "-ffixed-form"],

Modified: branches/distutils-revamp/fcompiler/gnu.py
===================================================================
--- branches/distutils-revamp/fcompiler/gnu.py	2006-12-12 01:07:51 UTC (rev 3484)
+++ branches/distutils-revamp/fcompiler/gnu.py	2006-12-13 05:16:09 UTC (rev 3485)
@@ -29,7 +29,7 @@
     executables = {
         'version_cmd'  : [None, "--version"],
         'compiler_f77' : [None, "-g", "-Wall","-fno-second-underscore"],
-        'compiler_f90' : None,
+        'compiler_f90' : None, # Use --fcompiler=gnu95 for f90 codes
         'compiler_fix' : None,
         'linker_so'    : [None, "-g", "-Wall"],
         'archiver'     : ["ar", "-cr"],
@@ -51,6 +51,8 @@
 
     g2c = 'g2c'
 
+    suggested_f90_compiler = 'gnu95'
+
     #def get_linker_so(self):
     #    # win32 linking should be handled by standard linker
     #    # Darwin g77 cannot be used as a linker.
@@ -279,3 +281,6 @@
     compiler = GnuFCompiler()
     compiler.customize()
     print compiler.get_version()
+    compiler = Gnu95FCompiler()
+    compiler.customize()
+    print compiler.get_version()

Modified: branches/distutils-revamp/fcompiler/intel.py
===================================================================
--- branches/distutils-revamp/fcompiler/intel.py	2006-12-12 01:07:51 UTC (rev 3484)
+++ branches/distutils-revamp/fcompiler/intel.py	2006-12-13 05:16:09 UTC (rev 3485)
@@ -78,10 +78,15 @@
 class IntelItaniumFCompiler(IntelFCompiler):
     compiler_type = 'intele'
     description = 'Intel Fortran Compiler for Itanium apps'
-    version_pattern = r'Intel\(R\) Fortran 90 Compiler Itanium\(TM\) Compiler'\
-                      ' for the Itanium\(TM\)-based applications,'\
-                      ' Version (?P<version>[^\s*]*)'
+    version_pattern = r'Intel\(R\) Fortran (90 Compiler Itanium\(TM\)|Itanium\(R\)) Compiler'\
+                      ' for (the Itanium\(TM\)|Itanium\(R\))-based applications(,|)'\
+                      '\s+Version (?P<version>[^\s*]*)'
 
+#Intel(R) Fortran Itanium(R) Compiler for Itanium(R)-based applications
+#Version 9.1    Build 20060928 Package ID: l_fc_c_9.1.039
+#Copyright (C) 1985-2006 Intel Corporation.  All rights reserved.
+#30 DAY EVALUATION LICENSE
+
     possible_executables = ['ifort', 'efort', 'efc']
 
     executables = {
@@ -130,9 +135,6 @@
 
     ar_exe = 'lib.exe'
     fc_exe = 'ifl'
-    if sys.platform=='win32':
-        from distutils.msvccompiler import MSVCCompiler
-        ar_exe = MSVCCompiler().lib
 
     executables = {
         'version_cmd'  : ['<F77>', "-FI -V -c %(fname)s.f -o %(fname)s.o" \
@@ -182,9 +184,9 @@
 
     compiler_type = 'intelev'
     description = 'Intel Visual Fortran Compiler for Itanium apps'
-    version_pattern = r'Intel\(R\) Fortran 90 Compiler Itanium\(TM\) Compiler'\
-                      ' for the Itanium\(TM\)-based applications,'\
-                      ' Version (?P<version>[^\s*]*)'
+    version_pattern = r'Intel\(R\) Fortran (90 Compiler Itanium\(TM\)|Itanium\(R\)) Compiler'\
+                      ' for (the Itanium\(TM\)|Itanium\(R\))-based applications(,|)'\
+                      '\s+Version (?P<version>[^\s*]*)'
 
     fc_exe = 'efl' # XXX this is a wild guess
     ar_exe = IntelVisualFCompiler.ar_exe

Modified: branches/distutils-revamp/fcompiler/nag.py
===================================================================
--- branches/distutils-revamp/fcompiler/nag.py	2006-12-12 01:07:51 UTC (rev 3484)
+++ branches/distutils-revamp/fcompiler/nag.py	2006-12-13 05:16:09 UTC (rev 3485)
@@ -29,7 +29,11 @@
     def get_flags_opt(self):
         return ['-O4']
     def get_flags_arch(self):
-        return ['-target=native']
+        version = self.get_version()
+        if version < '5.1':
+            return ['-target=native']
+        else:
+            return ['']
     def get_flags_debug(self):
         return ['-g','-gline','-g90','-nan','-C']
 

Modified: branches/distutils-revamp/misc_util.py
===================================================================
--- branches/distutils-revamp/misc_util.py	2006-12-12 01:07:51 UTC (rev 3484)
+++ branches/distutils-revamp/misc_util.py	2006-12-13 05:16:09 UTC (rev 3485)
@@ -19,7 +19,7 @@
            'get_dependencies', 'is_local_src_dir', 'get_ext_source_files',
            'get_script_files', 'get_lib_source_files', 'get_data_files',
            'dot_join', 'get_frame', 'minrelpath','njoin',
-           'is_sequence', 'is_string', 'as_list', 'gpaths']
+           'is_sequence', 'is_string', 'as_list', 'gpaths', 'get_language']
 
 def allpath(name):
     "Convert a /-separated pathname to one using the OS's path separator."
@@ -308,6 +308,18 @@
     else:
         return [seq]
 
+def get_language(sources):
+    """ Determine language value (c,f77,f90) from sources """
+    language = 'c'
+    for source in sources:
+        if isinstance(source, str):
+            if f90_ext_match(source):
+                language = 'f90'
+                break
+            elif fortran_ext_match(source):
+                language = 'f77'
+    return language
+
 def has_f_sources(sources):
     """ Return True if sources contains Fortran files """
     for source in sources:
@@ -1008,6 +1020,10 @@
         ext_args['name'] = dot_join(self.name,name)
         ext_args['sources'] = sources
 
+        language = ext_args.get('language',None)
+        if language is None:
+            ext_args['language'] = get_language(sources)
+
         if ext_args.has_key('extra_info'):
             extra_info = ext_args['extra_info']
             del ext_args['extra_info']
@@ -1066,11 +1082,16 @@
           include_dirs
           extra_compiler_args
           f2py_options
+          language
         """
         build_info = copy.copy(build_info)
         name = name #+ '__OF__' + self.name
         build_info['sources'] = sources
 
+        language = build_info.get('language',None)
+        if language is None:
+            build_info['language'] = get_language(sources)
+
         self._fix_paths_dict(build_info)
 
         self.libraries.append((name,build_info))
@@ -1191,14 +1212,32 @@
     def _get_svn_revision(self,path):
         """ Return path's SVN revision number.
         """
-        entries = njoin(path,'.svn','entries')
         revision = None
+        m = None
+        try:
+            sin, sout = os.popen4('svnversion')
+            m = re.match(r'(?P<revision>\d+)', sout.read())
+        except:
+            pass
+        if m:
+            revision = int(m.group('revision'))
+            return revision
+        if sys.platform=='win32' and os.environ.get('SVN_ASP_DOT_NET_HACK',None):
+            entries = njoin(path,'_svn','entries')
+        else:
+            entries = njoin(path,'.svn','entries')
         if os.path.isfile(entries):
             f = open(entries)
-            m = re.search(r'revision="(?P<revision>\d+)"',f.read())
+            fstr = f.read()
             f.close()
-            if m:
-                revision = int(m.group('revision'))
+            if fstr[:5] == '<?xml':  # pre 1.4
+                m = re.search(r'revision="(?P<revision>\d+)"',fstr)
+                if m:
+                    revision = int(m.group('revision'))
+            else:  # non-xml entries file --- check to be sure that
+                m = re.search(r'dir[\n\r]+(?P<revision>\d+)', fstr)
+                if m:
+                    revision = int(m.group('revision'))
         return revision
 
     def get_version(self, version_file=None, version_variable=None):
@@ -1351,7 +1390,11 @@
 def dict_append(d, **kws):
     for k, v in kws.items():
         if d.has_key(k):
-            d[k].extend(v)
+            ov = d[k]
+            if isinstance(ov,str):
+                d[k] = v
+            else:
+                d[k].extend(v)
         else:
             d[k] = v
 

Modified: branches/distutils-revamp/system_info.py
===================================================================
--- branches/distutils-revamp/system_info.py	2006-12-12 01:07:51 UTC (rev 3484)
+++ branches/distutils-revamp/system_info.py	2006-12-13 05:16:09 UTC (rev 3485)
@@ -502,6 +502,8 @@
             exts = [so_ext] + static_exts
         if sys.platform == 'cygwin':
             exts.append('.dll.a')
+        if sys.platform == 'darwin':
+            exts.append('.dylib')
         return exts
 
     def check_libs(self,lib_dir,libs,opt_libs =[]):
@@ -806,7 +808,10 @@
             return
         info = {}
         dict_append(info,**mkl)
-        dict_append(info,libraries = ['pthread'], include_dirs = incl_dirs)
+        dict_append(info,
+                    libraries = ['pthread'],
+                    define_macros=[('SCIPY_MKL_H',None)],
+                    include_dirs = incl_dirs)
         self.set_info(**info)
 
 class lapack_mkl_info(mkl_info):




More information about the Numpy-svn mailing list