summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorWilliam Deegan <bill@baddogconsulting.com>2018-07-07 00:05:45 (GMT)
committerGitHub <noreply@github.com>2018-07-07 00:05:45 (GMT)
commit3959c91dd9000e6cdeecded4e1b5db27870a20d9 (patch)
treed27bf7fb6c235853adfd0dd705c4b6998b5eaea1 /test
parentb86c6d4c6ba1ff86897cbbed37ec5c228dfec40e (diff)
parent992aeebe3d54dedc0123344e9ccdbe9b411ef78f (diff)
downloadSCons-3959c91dd9000e6cdeecded4e1b5db27870a20d9.zip
SCons-3959c91dd9000e6cdeecded4e1b5db27870a20d9.tar.gz
SCons-3959c91dd9000e6cdeecded4e1b5db27870a20d9.tar.bz2
Merge branch 'master' into appveyor_issues
Diffstat (limited to 'test')
-rw-r--r--test/Fortran/FORTRANMODDIR.py76
-rw-r--r--test/Fortran/gfortran.py107
2 files changed, 148 insertions, 35 deletions
diff --git a/test/Fortran/FORTRANMODDIR.py b/test/Fortran/FORTRANMODDIR.py
index 723efaf..61dcc45 100644
--- a/test/Fortran/FORTRANMODDIR.py
+++ b/test/Fortran/FORTRANMODDIR.py
@@ -24,6 +24,16 @@
__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+"""
+Verify the following things:
+* _FORTRANMODFLAG is correctly constructed from FORTRANMODDIRPREFIX and
+ FORTRANMODDIR.
+* The dependency scanner does not expect a module file to be created
+ from a "module procedure" statement.
+* The dependency scanner expects the module files to be created in the correct
+ module directory (this is verified by the test.up_to_date()).
+"""
+
import TestSCons
_python_ = TestSCons._python_
@@ -31,61 +41,59 @@ _exe = TestSCons._exe
test = TestSCons.TestSCons()
-
-
test.write('myfortran.py', r"""
import os.path
import re
import sys
+# case insensitive matching, because Fortran is case insensitive
mod_regex = "(?im)^\\s*MODULE\\s+(?!PROCEDURE)(\\w+)"
contents = open(sys.argv[2]).read()
modules = re.findall(mod_regex, contents)
-modules = [os.path.join(sys.argv[1], m.lower()+'.mod') for m in modules]
+(prefix, moddir) = sys.argv[1].split('=')
+if prefix != 'moduledir':
+ sys.exit(1)
+modules = [os.path.join(moddir, m.lower()+'.mod') for m in modules]
for t in sys.argv[3:] + modules:
open(t, 'wb').write(('myfortran.py wrote %s\n' % os.path.split(t)[1]).encode())
-sys.exit(0)
""")
test.write('SConstruct', """
-env = Environment(FORTRANCOM = r'%(_python_)s myfortran.py $FORTRANMODDIR $SOURCE $TARGET',
- FORTRANMODDIR = 'modules')
-env.Object(target = 'test1.obj', source = 'test1.f')
-env.Object(target = 'sub2/test2.obj', source = 'test1.f',
+env = Environment(F90COM = r'%(_python_)s myfortran.py $_FORTRANMODFLAG $SOURCE $TARGET',
+ FORTRANMODDIRPREFIX='moduledir=', FORTRANMODDIR='modules')
+env.Object(target = 'test1.obj', source = 'test1.f90')
+env.Object(target = 'sub2/test2.obj', source = 'test1.f90',
FORTRANMODDIR='${TARGET.dir}')
-env.Object(target = 'sub3/test3.obj', source = 'test1.f',
- FORTRANCOM = r'%(_python_)s myfortran.py $_FORTRANMODFLAG $SOURCE $TARGET',
+env.Object(target = 'sub3/test3.obj', source = 'test1.f90',
+ F90COM = r'%(_python_)s myfortran.py moduledir=$FORTRANMODDIR $SOURCE $TARGET',
FORTRANMODDIR='${TARGET.dir}')
""" % locals())
-test.write('test1.f', """\
- PROGRAM TEST
- USE MOD_FOO
- USE MOD_BAR
- PRINT *,'TEST.f'
- CALL P
- STOP
- END
- MODULE MOD_FOO
- IMPLICIT NONE
- CONTAINS
- SUBROUTINE P
- PRINT *,'mod_foo'
- END SUBROUTINE P
- END MODULE MOD_FOO
- MODULE PROCEDURE MOD_BAR
- IMPLICIT NONE
- CONTAINS
- SUBROUTINE P
- PRINT *,'mod_bar'
- END SUBROUTINE P
- END MODULE MOD_BAR
+test.write('test1.f90', """\
+module mod_foo
+ implicit none
+ interface q
+ module procedure p
+ end interface q
+ contains
+ subroutine p
+ implicit none
+ print *, 'mod_foo::p'
+ end subroutine p
+end module mod_foo
+program test
+ use mod_foo
+ implicit none
+ print *, 'test1.f90'
+ call p
+ call q
+end
""")
test.run(arguments = '.', stderr = None)
test.must_match('test1.obj', "myfortran.py wrote test1.obj\n")
test.must_match(['modules', 'mod_foo.mod'], "myfortran.py wrote mod_foo.mod\n")
-test.must_not_exist(['modules', 'mod_bar.mod'])
+test.must_not_exist(['modules', 'p.mod'])
test.must_match(['sub2', 'test2.obj'], "myfortran.py wrote test2.obj\n")
test.must_match(['sub2', 'mod_foo.mod'], "myfortran.py wrote mod_foo.mod\n")
@@ -95,8 +103,6 @@ test.must_match(['sub3', 'mod_foo.mod'], "myfortran.py wrote mod_foo.mod\n")
test.up_to_date(arguments = '.')
-
-
test.pass_test()
# Local Variables:
diff --git a/test/Fortran/gfortran.py b/test/Fortran/gfortran.py
new file mode 100644
index 0000000..c3dec97
--- /dev/null
+++ b/test/Fortran/gfortran.py
@@ -0,0 +1,107 @@
+#!/usr/bin/env python
+#
+# __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__"
+
+"""
+Verify that the gfortran tool compiles a .f90 file to an executable,
+one time with and one time without placing module files in a subdirectory
+specified by FORTRANMODDIR.
+"""
+
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+_exe = TestSCons._exe
+
+gfortran = test.detect_tool('gfortran')
+
+if not gfortran:
+ test.skip_test("Could not find gfortran tool, skipping test.\n")
+
+test.write('SConstruct', """
+env = Environment(tools=['gfortran','link'])
+env.Program('test1', 'test1.f90')
+""")
+
+test.write('test1.f90', """\
+module test1mod
+ implicit none
+ contains
+ subroutine hello
+ implicit none
+ print *, "hello"
+ end subroutine hello
+end module test1mod
+program main
+ use test1mod
+ implicit none
+ call hello()
+end program main
+""")
+
+test.run(arguments = '.')
+
+test.must_exist('test1' + _exe)
+test.must_exist('test1mod.mod')
+
+test.up_to_date(arguments = '.')
+
+
+test.write('SConstruct', """
+env = Environment(tools=['gfortran','link'], F90PATH='modules', FORTRANMODDIR='modules')
+env.Program('test2', 'test2.f90')
+""")
+
+test.write('test2.f90', """\
+module test2mod
+ implicit none
+ contains
+ subroutine hello
+ implicit none
+ print *, "hello"
+ end subroutine hello
+end module test2mod
+program main
+ use test2mod
+ implicit none
+ call hello()
+end program main
+""")
+
+test.run(arguments = '.')
+
+test.must_exist('test2' + _exe)
+test.must_exist(['modules', 'test2mod.mod'])
+
+test.up_to_date(arguments = '.')
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4: