diff options
author | William Deegan <bill@baddogconsulting.com> | 2018-07-07 00:05:45 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-07 00:05:45 (GMT) |
commit | 3959c91dd9000e6cdeecded4e1b5db27870a20d9 (patch) | |
tree | d27bf7fb6c235853adfd0dd705c4b6998b5eaea1 /test | |
parent | b86c6d4c6ba1ff86897cbbed37ec5c228dfec40e (diff) | |
parent | 992aeebe3d54dedc0123344e9ccdbe9b411ef78f (diff) | |
download | SCons-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.py | 76 | ||||
-rw-r--r-- | test/Fortran/gfortran.py | 107 |
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: |