Handle Visual Studio project and solution files in Unicode. (Chen Lee)
[scons.git] / src / engine / SCons / Tool / f95.py
1 """engine.SCons.Tool.f95
2
3 Tool-specific initialization for the generic Posix f95 Fortran compiler.
4
5 There normally shouldn't be any need to import this module directly.
6 It will usually be imported through the generic SCons.Tool.Tool()
7 selection method.
8
9 """
10
11 #
12 # __COPYRIGHT__
13 #
14 # Permission is hereby granted, free of charge, to any person obtaining
15 # a copy of this software and associated documentation files (the
16 # "Software"), to deal in the Software without restriction, including
17 # without limitation the rights to use, copy, modify, merge, publish,
18 # distribute, sublicense, and/or sell copies of the Software, and to
19 # permit persons to whom the Software is furnished to do so, subject to
20 # the following conditions:
21 #
22 # The above copyright notice and this permission notice shall be included
23 # in all copies or substantial portions of the Software.
24 #
25 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
26 # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
27 # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 #
33
34 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
35
36 import SCons.Defaults
37 import SCons.Tool
38 import SCons.Util
39 import fortran
40
41 compilers = ['f95']
42
43 #
44 F95Suffixes = ['.f95']
45 F95PPSuffixes = []
46 if SCons.Util.case_sensitive_suffixes('.f95', '.F95'):
47     F95PPSuffixes.append('.F95')
48 else:
49     F95Suffixes.append('.F95')
50
51 #
52 F95Scan = SCons.Scanner.Fortran.FortranScan("F95PATH")
53
54 for suffix in F95Suffixes + F95PPSuffixes:
55     SCons.Tool.SourceFileScanner.add_scanner(suffix, F95Scan)
56
57 #
58 fVLG = fortran.VariableListGenerator
59
60 F95Generator = fVLG('F95', 'FORTRAN', '_FORTRAND')
61 F95FlagsGenerator = fVLG('F95FLAGS', 'FORTRANFLAGS')
62 F95CommandGenerator = fVLG('F95COM', 'FORTRANCOM', '_F95COMD')
63 F95CommandStrGenerator = fVLG('F95COMSTR', 'FORTRANCOMSTR', '_F95COMSTRD')
64 F95PPCommandGenerator = fVLG('F95PPCOM', 'FORTRANPPCOM', '_F95PPCOMD')
65 F95PPCommandStrGenerator = fVLG('F95PPCOMSTR', 'FORTRANPPCOMSTR', '_F95PPCOMSTRD')
66 ShF95Generator = fVLG('SHF95', 'SHFORTRAN', 'F95', 'FORTRAN', '_FORTRAND')
67 ShF95FlagsGenerator = fVLG('SHF95FLAGS', 'SHFORTRANFLAGS')
68 ShF95CommandGenerator = fVLG('SHF95COM', 'SHFORTRANCOM', '_SHF95COMD')
69 ShF95CommandStrGenerator = fVLG('SHF95COMSTR', 'SHFORTRANCOMSTR', '_SHF95COMSTRD')
70 ShF95PPCommandGenerator = fVLG('SHF95PPCOM', 'SHFORTRANPPCOM', '_SHF95PPCOMD')
71 ShF95PPCommandStrGenerator = fVLG('SHF95PPCOMSTR', 'SHFORTRANPPCOMSTR', '_SHF95PPCOMSTRD')
72
73 del fVLG
74
75 #
76 F95Action = SCons.Action.Action('$_F95COMG ', '$_F95COMSTRG')
77 F95PPAction = SCons.Action.Action('$_F95PPCOMG ', '$_F95PPCOMSTRG')
78 ShF95Action = SCons.Action.Action('$_SHF95COMG ', '$_SHF95COMSTRG')
79 ShF95PPAction = SCons.Action.Action('$_SHF95PPCOMG ', '$_SHF95PPCOMSTRG')
80
81 def add_to_env(env):
82     """Add Builders and construction variables for f95 to an Environment."""
83     env.AppendUnique(FORTRANSUFFIXES = F95Suffixes + F95PPSuffixes)
84
85     static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
86
87     for suffix in F95Suffixes:
88         static_obj.add_action(suffix, F95Action)
89         shared_obj.add_action(suffix, ShF95Action)
90         static_obj.add_emitter(suffix, fortran.FortranEmitter)
91         shared_obj.add_emitter(suffix, fortran.ShFortranEmitter)
92
93     for suffix in F95PPSuffixes:
94         static_obj.add_action(suffix, F95PPAction)
95         shared_obj.add_action(suffix, ShF95PPAction)
96         static_obj.add_emitter(suffix, fortran.FortranEmitter)
97         shared_obj.add_emitter(suffix, fortran.ShFortranEmitter)
98
99     env['_F95G']           = F95Generator
100     env['_F95FLAGSG']      = F95FlagsGenerator
101     env['_F95COMG']        = F95CommandGenerator
102     env['_F95COMSTRG']     = F95CommandStrGenerator
103     env['_F95PPCOMG']      = F95PPCommandGenerator
104     env['_F95PPCOMSTRG']   = F95PPCommandStrGenerator
105
106     env['_SHF95G']         = ShF95Generator
107     env['_SHF95FLAGSG']    = ShF95FlagsGenerator
108     env['_SHF95COMG']      = ShF95CommandGenerator
109     env['_SHF95COMSTRG']   = ShF95CommandStrGenerator
110     env['_SHF95PPCOMG']    = ShF95PPCommandGenerator
111     env['_SHF95PPCOMSTRG'] = ShF95PPCommandStrGenerator
112
113     env['_F95INCFLAGS'] = '$( ${_concat(INCPREFIX, F95PATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
114
115     env['_F95COMD']     = '$_F95G -o $TARGET -c $_F95FLAGSG $_F95INCFLAGS $_FORTRANMODFLAG $SOURCES'
116     env['_F95PPCOMD']   = '$_F95G -o $TARGET -c $_F95FLAGSG $CPPFLAGS $_CPPDEFFLAGS $_F95INCFLAGS $_FORTRANMODFLAG $SOURCES'
117     env['_SHF95COMD']   = '$_SHF95G -o $TARGET -c $_SHF95FLAGSG $_F95INCFLAGS $_FORTRANMODFLAG $SOURCES'
118     env['_SHF95PPCOMD'] = '$_SHF95G -o $TARGET -c $_SHF95FLAGSG $CPPFLAGS $_CPPDEFFLAGS $_F95INCFLAGS $_FORTRANMODFLAG $SOURCES'
119
120 def generate(env):
121     fortran.add_to_env(env)
122     add_to_env(env)
123
124     env['_FORTRAND']        = env.Detect(compilers) or 'f95'
125
126 def exists(env):
127     return env.Detect(compilers)