Add support for newer ifort versions of the Intel Fortran compiler on Linux. (Jonath...
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 29 Jul 2004 22:44:51 +0000 (22:44 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 29 Jul 2004 22:44:51 +0000 (22:44 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@1012 fdb21ef1-2011-0410-befe-b5e4ea1792b1

doc/man/scons.1
src/CHANGES.txt
src/engine/MANIFEST.in
src/engine/SCons/Tool/__init__.py
src/engine/SCons/Tool/ifl.py
src/engine/SCons/Tool/ifort.py [new file with mode: 0644]
test/Fortran/F90.py
test/Fortran/F90FLAGS.py
test/import.py

index c9fed7ae9f49f9ed5b137fa2eb76e85600765a92..b3e4ad47117b80e7c52d7fc107755dc11ad60f67 100644 (file)
@@ -1010,6 +1010,7 @@ hplink
 icc
 icl
 ifl
+ifort
 ilink
 ilink32
 jar
index 6626a9043f3fa1011d6bae3dd5d91ed8f086f98a..9447c529fd18557a47f2eac1504d84090c21884e 100644 (file)
@@ -45,6 +45,11 @@ RELEASE 0.96 - XXX
   - Have SConsignFile() use, by default, a custom "dblite.py" that we can
     control and guarantee to work on all Python versions (or nearly so).
 
+  From Jonathan Gurley:
+
+  - Add support for the newer "ifort" versions of the Intel Fortran
+    Compiler for Linux.
+
   From Bob Halley:
 
   - Make the new *FLAGS variable type work with copied Environments.
index 4480713cec40bd207c9231cf4d7a40b8eb2b7f42..373279e10882a99c55385c9b2d2573efd0a64187 100644 (file)
@@ -85,6 +85,7 @@ SCons/Tool/javah.py
 SCons/Tool/icc.py
 SCons/Tool/icl.py
 SCons/Tool/ifl.py
+SCons/Tool/ifort.py
 SCons/Tool/ilink.py
 SCons/Tool/ilink32.py
 SCons/Tool/latex.py
index 53d288e030b0f8a655bb035dad800162f50676c6..a040a5509689ea948cb360c3cbea4aded537d30a 100644 (file)
@@ -297,7 +297,7 @@ def tool_list(platform, env):
         c_compilers = ['gcc', 'msvc', 'icc', 'cc']
         cxx_compilers = ['g++', 'msvc', 'icc', 'c++']
         assemblers = ['gas', 'nasm', 'masm']
-        fortran_compilers = ['g77', 'ifl', 'fortran']
+        fortran_compilers = ['g77', 'ifort', 'ifl', 'fortran']
         ars = ['ar', 'mslib']
 
     c_compiler = FindTool(c_compilers, env) or c_compilers[0]
index 04c9d39d68b2ca31fccd32810705186c38a3bcec..8d800e269fd8332a9107f426b02e84d678fd598a 100644 (file)
@@ -1,4 +1,4 @@
-"""engine.SCons.Tool.ifl
+"""SCons.Tool.ifl
 
 Tool-specific initialization for the Intel Fortran compiler.
 
@@ -33,22 +33,21 @@ selection method.
 
 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
 
-import SCons.Util
+import SCons.Defaults
 
-import f77
+import fortran
 
 def generate(env):
     """Add Builders and construction variables for ifl to an Environment."""
-    f77.generate(env)
-
-    env['F77']        = 'ifl'
-    env['F77FLAGS']   = SCons.Util.CLVar('')
-    env['F77COM']     = '$F77 $F77FLAGS $_F77INCFLAGS /c $SOURCES /Fo$TARGET'
-    env['F77PPCOM']   = '$F77 $F77FLAGS $CPPFLAGS $_CPPDEFFLAGS $_F77INCFLAGS /c $SOURCES /Fo$TARGET'
-    env['SHF77']      = '$F77'
-    env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS')
-    env['SHF77COM']   = '$SHF77 $SHF77FLAGS $_F77INCFLAGS /c $SOURCES /Fo$TARGET'
-    env['SHF77PPCOM'] = '$SHF77 $SHF77FLAGS $CPPFLAGS $_CPPDEFFLAGS $_F77INCFLAGS /c $SOURCES /Fo$TARGET'
+    SCons.Defaults.ObjSourceScan.add_scanner('.i90', fortran.FortranScan)
+    fortran.FortranSuffixes.extend(['.i90'])
+    fortran.generate(env)
+
+    env['_FORTRAND']      = 'ifl'
+    env['FORTRANCOM']     = '$FORTRAN $FORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
+    env['FORTRANPPCOM']   = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
+    env['SHFORTRANCOM']   = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
+    env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
 
 def exists(env):
     return env.Detect('ifl')
diff --git a/src/engine/SCons/Tool/ifort.py b/src/engine/SCons/Tool/ifort.py
new file mode 100644 (file)
index 0000000..519f266
--- /dev/null
@@ -0,0 +1,62 @@
+"""SCons.Tool.ifort
+
+Tool-specific initialization for newer versions of the Intel Fortran Compiler
+for Linux. 
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+
+import fortran
+
+def generate(env):
+    """Add Builders and construction variables for ifort to an Environment."""
+    # ifort supports Fortran 90 and Fortran 95
+    # Additionally, ifort recognizes more file extensions.
+    SCons.Defaults.ObjSourceScan.add_scanner('.i', fortran.FortranScan)
+    SCons.Defaults.ObjSourceScan.add_scanner('.i90', fortran.FortranScan)
+    fortran.FortranSuffixes.extend(['.i', '.i90'])
+    fortran.generate(env)
+
+    env['_FORTRAND'] = 'ifort'
+
+    # If files are compiled into objects, the Intel Fortran Compiler must use
+    # ld to link shared libraries.
+    env['SHLINK'] = 'ld'
+
+    # Additionally, no symbols can be defined in an archive file; to use
+    # Intel Fortran to create shared libraries, all external symbols must
+    # be in shared libraries.
+    env['SHLINKFLAGS'] = '-shared -no_archive'
+
+def exists(env):
+    return env.Detect('ifort')
index 4167410f97b045ee2ed191c676c268fff8a381ba..7825ae6a8a729b278ae58756bbf1f061ed268e87 100644 (file)
@@ -166,18 +166,38 @@ bar.Program(target = 'bar', source = 'bar.f')
 
     test.write('foo.f', r"""
       PROGRAM FOO
+      USE MOD_BAR
       PRINT *,'foo.f'
+      CALL P
       STOP
       END
+      MODULE MOD_BAR
+         IMPLICIT NONE
+         CONTAINS
+         SUBROUTINE P
+            PRINT *,'mod_bar'
+         END SUBROUTINE P
+      END MODULE MOD_BAR
 """)
 
     test.write('bar.f', r"""
       PROGRAM BAR
+      USE MOD_FOO
       PRINT *,'bar.f'
+      CALL P
       STOP
       END
 """)
 
+    test.write('foo_mod.f', r"""
+      MODULE MOD_FOO
+         IMPLICIT NONE
+         CONTAINS
+         SUBROUTINE P
+            PRINT *,'mod_foo'
+         END SUBROUTINE P
+      END MODULE MOD_FOO
+""")
 
     test.run(arguments = 'foo' + _exe, stderr = None)
 
index f5989860040f9196144ac9a5dc74568b101884ee..375df7109d06f653b2d09b9211ba5a1fa81bcfda 100644 (file)
@@ -170,18 +170,38 @@ bar.Program(target = 'bar', source = 'bar.f')
 
     test.write('foo.f', r"""
       PROGRAM FOO
+      USE MOD_BAR
       PRINT *,'foo.f'
+      CALL P
       STOP
       END
+      MODULE MOD_BAR
+         IMPLICIT NONE
+         CONTAINS
+         SUBROUTINE P
+            PRINT *,'mod_bar'
+         END SUBROUTINE P
+      END MODULE MOD_BAR
 """)
 
     test.write('bar.f', r"""
       PROGRAM BAR
+      USE MOD_FOO
       PRINT *,'bar.f'
+      CALL P
       STOP
       END
 """)
 
+    test.write('foo_mod.f', r"""
+      MODULE MOD_FOO
+         IMPLICIT NONE
+         CONTAINS
+         SUBROUTINE P
+            PRINT *,'mod_foo'
+         END SUBROUTINE P
+      END MODULE MOD_FOO
+""")
 
     test.run(arguments = 'foo' + _exe, stderr = None)
 
index e7e21f1ca3318ef840ef734e7992ea7445f03401..071e198493c8266d59fbeeb2c7941a908b73cdd9 100644 (file)
@@ -55,12 +55,16 @@ tools = [
     'BitKeeper',
     'c++',
     'cc',
+    'cvf',
     'CVS',
     'default',
     'dmd',
     'dvipdf',
     'dvips',
     'f77',
+    'f90',
+    'f95',
+    'fortran',
     'g++',
     'g77',
     'gas',
@@ -72,6 +76,7 @@ tools = [
     'hplink',
     'icc',
     'icl',
+    'ifort',
     'ifl',
     'ilink',
     'ilink32',