/[MITgcm]/MITgcm_contrib/PRM/build_scripts/mod_tool/mod_tool_funcs.sh
ViewVC logotype

Contents of /MITgcm_contrib/PRM/build_scripts/mod_tool/mod_tool_funcs.sh

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1.1.1 - (show annotations) (download) (as text) (vendor branch)
Tue Apr 5 13:18:55 2005 UTC (20 years, 3 months ago) by cnh
Branch: MAIN, baseline
CVS Tags: checkpoint63m, checkpoint63n, initial, HEAD
Changes since 1.1: +0 -0 lines
File MIME type: application/x-sh
Checking in initial PRM setup

1 #!/bin/sh -f
2 #
3 # Functions used by the mod_tool shell script.
4 #
5 #
6 check_action() {
7 theaction=$1
8 therc=1
9 if [ "x$theaction" == "xbuild" ]; then
10 therc=0
11 fi
12 if [ "x$theaction" == "xclean" ]; then
13 therc=0
14 fi
15 if [ "x$therc" == "x1" ]; then
16 write_usage
17 exit $therc
18 fi
19 }
20
21 check_rc_exit() {
22 therc=$1
23 thecommand=$2
24 themessage=$3
25 if [ "x$therc" != "x0" ]; then
26 echo "$themessage"
27 echo " Command:"
28 echo " >>" "$thecommand"
29 echo " Error:"
30 cat ${ERROUT} | awk '{print " >> ",$0}'
31 echo "\"$0\" exiting with return code $rc"
32 exit $rc
33 fi
34 }
35
36 is_comment_line() {
37 line=$1
38 if [ "x${line:0:1}" != "x#" ] && [ "x${line:0:1}" != "x" ]; then
39 return 0
40 else
41 return 1
42 fi
43 }
44
45 mod_tool_build() {
46 # Do commands for when called with action=build.
47
48 # Write module header
49 write_module_header
50 if [ -r ${USE_FILE_LIST} ]; then
51 write_use_blocks
52 fi
53 write_implicit_none
54
55 # Write explicit interface blocks
56 if [ -r ${IF_FILE_LIST} ]; then
57 write_explicit_interface_blocks
58 fi
59
60 # Process templated procedure interfaces
61 if [ -r ${PROCTEMPLATE_FILE_LIST} ]; then
62 write_templated_interface_blocks
63 fi
64
65 # Process templated procedures
66 if [ -r ${PROCTEMPLATE_FILE_LIST} ]; then
67 write_templated_procedures
68 fi
69
70 # Process non-templated procedures
71 if [ -r ${PROC_FILE_LIST} ]; then
72 write_nontemplated_procedures
73 fi
74
75 # Write module close
76 write_module_close
77
78 mkdir -p ${F90_OUT_DIR}
79 mv ${F90_OUT_FILE} ${F90_OUT_DIR}/${MODULE_NAME}.F90
80
81 }
82
83 mod_tool_clean() {
84 if [ -d ${F90_OUT_DIR} ]; then
85 \rm -fr ${F90_OUT_DIR}/${MODULE_NAME}.F90
86 fi
87 }
88
89 start_module_procedures() {
90 if [ "x${CONTAINS_IS_WRITTEN}" == "x0" ]; then
91 export CONTAINS_IS_WRITTEN=1
92 cat >> ${F90_OUT_FILE} <<EOFA
93 CONTAINS
94 EOFA
95 fi
96 }
97
98 write_explicit_interface_blocks() {
99 while read line ; do
100 is_comment_line $line; rc=$?
101 if [ "x$rc" == "x0" ]; then
102 fname=$line
103 cat $fname >> ${F90_OUT_FILE}
104 fi
105 done
106 } < ${IF_FILE_LIST}
107
108 write_implicit_none() {
109 cat >> ${F90_OUT_FILE} <<EOFA
110 IMPLICIT NONE
111 EOFA
112 }
113
114 write_module_header() {
115 # Write module header
116 cat > ${F90_OUT_FILE} <<'EOFA'
117 ! $Header: $
118 ! $Id: $
119
120 EOFA
121
122 cat >> ${F90_OUT_FILE} <<EOFA
123 MODULE ${MODULE_NAME}
124 USE ESMF_Mod
125 EOFA
126 }
127
128 write_nontemplated_procedures(){
129 # Write out the procedures that are copied verbatim
130 if [ -r ${PROC_FILE_LIST} ]; then
131 {
132 while read line ; do
133 is_comment_line "${line}"; rc=$?
134 if [ x"$rc" == "x0" ]; then
135 start_module_procedures
136 fname=$line
137 cat $fname >> ${F90_OUT_FILE}
138 fi
139 done
140 } < ${PROC_FILE_LIST}
141 fi
142 }
143
144 write_templated_interface_blocks(){
145 # Process templated procedure interfaces
146 # Each templated procedure requires two files named:
147 # o XXXXX.proctemplate.F90
148 # o XXXXX.ifacetemplate.F90
149 # and one or more files named
150 # o XXXXX.proctemplate.tNNN
151 # (where NNN is a number in the sequence 001,002,003 etc...)
152 # the "proctemplate" file contains the templated procedure
153 # code.
154 # the "ifacetemplate" file contains the templated entry for
155 # the generic interface blocks.
156 # the "proctemplate.tNNN" files contain definitions of the
157 # the macros that will be used to generate actual source
158 # from the template sources. Each "proctemplate.tNNN" contains
159 # the macros needed for a single template type.
160 #
161 # These two parts go in separate areas of the generated module
162 # file. The "ifacetemplate" file will generate code for a
163 # INTERFACE
164 # END INTERFACE
165 # Fortran 90 section.
166 # The "proctemplate" file contains code for an actual procedure
167 # definition.
168 if [ -r ${PROCTEMPLATE_FILE_LIST} ]; then
169 {
170 while read line ; do
171 is_comment_line "${line}"; rc=$?
172 if [ x"$rc" == "x0" ]; then
173 # Found a file name. Now generate the output.
174 fname=$line
175 tpref=${line%.F90}
176 templates=${tpref}.t*
177 iftemplatefile=${tpref%.proctemplate}.ifacetemplate.F90
178 ifnamefile=${tpref%.proctemplate}.ifacename.F90
179 cat $ifnamefile > foo2.F90
180 for t in $templates; do
181 #
182 # Interface block
183 #
184 echo " "
185 echo "#"
186 echo "# Applying template $t"
187 echo "# to $iftemplatefile"
188 echo "#"
189 echo " "
190 cp $iftemplatefile tempIN.F90
191 {
192 while read line ; do
193 is_comment_line "${line}"; rc=$?
194 if [ x"$rc" == "x0" ]; then
195 key=`echo "${line[0]}" | awk '{print $1}'`
196 keyval=`echo "${line[0]}" | sed s/'[^\"]*\"\(.*\)\" *$/\1/'`
197 # echo Changing occurences of \""${key}"\" to \""${keyval}"\".
198 cat tempIN.F90 | sed s/"${key}"/"${keyval}"/g > tempOUT.F90
199 cp tempOUT.F90 tempIN.F90
200 fi
201 done
202 cat tempIN.F90 >> foo2.F90
203 } <$t
204 done
205 cat << 'EOFA' >> foo2.F90
206 END INTERFACE
207 EOFA
208 fi
209 done
210 } < ${PROCTEMPLATE_FILE_LIST}
211 fi
212 cat << EOFA >> $F90_OUT_FILE
213 !
214 ! Begin interfaces generated from templates
215 EOFA
216 cat foo2.F90 >> $F90_OUT_FILE
217 cat << 'EOFA' >> foo2.F90
218 EOFA
219 cat << EOFA >> $F90_OUT_FILE
220 ! End interfaces generated from templates
221 !
222 EOFA
223 }
224
225 write_templated_procedures(){
226 # Process templated procedures
227 # Each templated procedure requires two files named:
228 # o XXXXX.proctemplate.F90
229 # o XXXXX.ifacetemplate.F90
230 # and one or more files named
231 # o XXXXX.proctemplate.tNNN
232 # (where NNN is a number in the sequence 001,002,003 etc...)
233 # the "proctemplate" file contains the templated procedure
234 # code.
235 # the "ifacetemplate" file contains the templated entry for
236 # the generic interface blocks.
237 # the "proctemplate.tNNN" files contain definitions of the
238 # the macros that will be used to generate actual source
239 # from the template sources. Each "proctemplate.tNNN" contains
240 # the macros needed for a single template type.
241 #
242 # These two parts go in separate areas of the generated module
243 # file. The "ifacetemplate" file will generate code for a
244 # INTERFACE
245 # END INTERFACE
246 # Fortran 90 section.
247 # The "proctemplate" file contains code for an actual procedure
248 # definition.
249 if [ -r ${PROCTEMPLATE_FILE_LIST} ]; then
250 {
251 while read line ; do
252 is_comment_line "${line}"; rc=$?
253 if [ x"$rc" == "x0" ]; then
254 # Found a file name. Now generate the output.
255 start_module_procedures
256 fname=$line
257 tpref=${line%.F90}
258 templates=${tpref}.t*
259 echo > foo1.F90
260 for t in $templates; do
261 echo "#"
262 echo "# Applying template $t"
263 echo "# to $fname"
264 echo "#"
265 cp $fname tempIN.F90
266 {
267 while read line ; do
268 is_comment_line "${line}"; rc=$?
269 if [ x"$rc" == "x0" ]; then
270 key=`echo "${line[0]}" | awk '{print $1}'`
271 keyval=`echo "${line[0]}" | sed s/'[^\"]*\"\(.*\)\" *$/\1/'`
272 # echo Changing occurences of \""${key}"\" to \""${keyval}"\".
273 cat tempIN.F90 | sed s/"${key}"/"${keyval}"/g > tempOUT.F90
274 cp tempOUT.F90 tempIN.F90
275 fi
276 done
277 cat tempIN.F90 >> foo1.F90
278 } <$t
279 done
280 fi
281 done
282 } < ${PROCTEMPLATE_FILE_LIST}
283 fi
284 cat << EOFA >> $F90_OUT_FILE
285 !
286 ! Begin procedures generated from templates
287 EOFA
288 cat foo1.F90 >> $F90_OUT_FILE
289 cat << 'EOFA' >> foo1.F90
290 EOFA
291 cat << EOFA >> $F90_OUT_FILE
292 ! End procedures generated from templates
293 !
294 EOFA
295
296 }
297
298 write_usage() {
299 echo "Usage: $PROG_NAME [build|clean]"
300 }
301
302 write_use_blocks() {
303 while read line ; do
304 is_comment_line $line; rc=$?
305 if [ "x$rc" == "x0" ]; then
306 fname=$line
307 cat $fname >> ${F90_OUT_FILE}
308 fi
309 done
310 } < ${USE_FILE_LIST}
311
312 write_module_close() {
313 cat >> ${F90_OUT_FILE} <<EOFA
314 END MODULE
315 EOFA
316 }
317

  ViewVC Help
Powered by ViewVC 1.1.22