[Bio] / ReleaseTools / makeScriptHeaders Repository:
ViewVC logotype

Annotation of /ReleaseTools/makeScriptHeaders

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.6 - (view) (download)

1 : efrank 1.1 #!/usr/bin/env python
2 :     #
3 :     # Uses configuration information to generate headers to be prepended onto
4 :     # scripts. For example, for Perl and Python scripts, we prepend the
5 :     # location of the interpetter via the #! line and set paths.
6 :     #
7 :     # The actions of this script are determined by information in external
8 :     # configuration files which are read and then used to emit the header.
9 :     # We look for these in
10 :     # 1. Base release $RTDIST/$RTCURRENT/ReleaseTools/
11 :     # 2. Site configuration directory $RTSITECONFIGDIR/
12 :     # 3. Present sandbox/workdir $PWD/ReleaseTools/
13 :     #
14 :     # Each level takes precedence over the preceding one, e.g., #2 trumps #1.
15 :     #
16 :     # In each of those directories, we look for a file called RTConfig in
17 :     # which one or more of the following lines may be present:
18 :     #
19 :     # (see also configParams array below)
20 :     #
21 :     # RTENV=path to env. If absent, /usr/bin/env is used
22 :     # RTPYTHON='path of python interpreter'
23 :     # RTPERL='path of perl interpreter'
24 :     #
25 :     # These are put between thisRel:baseRel and existing pythonpath:
26 :     #
27 :     # RTPYTHONPATH='colon separated python path'
28 :     # RTPERL5LIB='colon separated perl path'
29 :     #
30 :     # These are aditional imports or use statements
31 :     #
32 :     # RTPYTHONIMPORTS='colon separated list of python stuff to force import of'
33 :     # RTPERLIMPORTS='colon separated list of perl stuff to force import of'
34 :     #
35 :     ########################################################################
36 :     # BUGS:
37 :     # o
38 :     #
39 :     # History:
40 :     # 29 apr 05 efrank First version
41 :     #
42 :     ########################################################################
43 :    
44 :     import os
45 :     import sys
46 :    
47 :     # These are the only allowed keywords in the config file:
48 :    
49 :     configParms = ["RTENV", "RTPYTHON", "RTPERL", "RTPYTHONPATH", "RTPERL5LIB",
50 : olson 1.2 "RTPYTHONIMPORTS", "RTPERLIMPORTS", "RTSETENV" ]
51 :     configParmsMultipleValues = ["RTSETENV"]
52 : efrank 1.1
53 :     #------------------------------------------------------------
54 :     def warn(msg, die=0):
55 :     #------------------------------------------------------------
56 :     if die:
57 :     print "Fatal Error: %s" % msg
58 :     sys.exit(1)
59 :     else:
60 :     print "Warning: %s" % msg
61 :    
62 :     return
63 :    
64 :     #------------------------------------------------------------
65 :     def getInfo(path, fname):
66 :     #------------------------------------------------------------
67 :     """
68 :     @type path: string
69 :     @rtype: dictionary mapping var names to values
70 :     """
71 :    
72 :     global configParms
73 :    
74 :     d={}
75 :     if path==None: return d
76 :    
77 :     fullpath = os.path.join(path, fname)
78 :    
79 :     try:
80 :     f=file( fullpath, "r" )
81 :     except Exception, e:
82 :     warn("No config file %s" % fullpath )
83 :     return d
84 :    
85 :     line = f.readline()
86 :     while (line):
87 :     line = line[:-1].strip()
88 :     if (( not line=="") and (not line[0]=="#" )):
89 : olson 1.2 toks = line.split('=', 1)
90 : efrank 1.1 if (not len(toks) == 2):
91 :     warn("Format error in %s: %s" % (fullpath, line), die=1)
92 :     (name, val) = toks
93 :     if (not name in configParms):
94 :     warn("Unknown config param in %s: %s" % (fullpath, name))
95 : olson 1.2 elif name in configParmsMultipleValues:
96 :     if not d.has_key(name):
97 :     d[name] = []
98 :     d[name].append(val)
99 : efrank 1.1 else:
100 :     d[name] = val
101 :     #
102 :     line = f.readline()
103 :    
104 :     return d
105 :    
106 :     #------------------------------------------------------------
107 :     def supercede(baseInfo, siteInfo, thisRelInfo):
108 :     #------------------------------------------------------------
109 :     """
110 :     Apply precedence rules
111 :     """
112 :    
113 :     global configParms
114 :    
115 :     result={}
116 :    
117 :     # make sure there's something for each. simplifies code
118 :     # downstream.
119 :    
120 :     for k in configParms:
121 :     result[k] = ""
122 :    
123 :     #precendence order is current beats site beats base
124 :     for d in [baseInfo, siteInfo, thisRelInfo]:
125 :     for k in configParms:
126 :     if d.has_key(k): result[k] = d[k]
127 :    
128 :     return result
129 :    
130 :    
131 :     #------------------------------------------------------------
132 :     def audit( finalParms ):
133 :     #------------------------------------------------------------
134 :     """
135 :     @type finalParms: dict
136 :     @rtype: bool/int true for all ok
137 :     """
138 :    
139 :     result = 1
140 :    
141 :     if (finalParms["RTENV"] == ""):
142 :     finalParms["RTENV"] = "/usr/bin/env"
143 :    
144 :     if (finalParms["RTPYTHON"] == ""):
145 :     warn("RTPYTHON not set in config file")
146 :     result = 0
147 :    
148 :     if (finalParms["RTPERL"] == ""):
149 :     warn("RTPERL not set in config file")
150 :     result = 0
151 :    
152 :     return result
153 :    
154 :     #------------------------------------------------------------
155 :     def makePerl5LibPath(params):
156 :     #------------------------------------------------------------
157 :     """
158 :     Need perl5lib in a couple places, so encapsulate its definition.
159 :     """
160 :    
161 : olson 1.6 s = "%(THISRELLIB)s:%(THISRELLIB)s/FigKernelPackages:%(THISRELLIB)s/WebApplication:%(THISRELLIB)s/FortyEight:%(THISRELLIB)s/PPO:%(THISRELLIB)s/RAST:%(THISRELLIB)s/SeedViewer:%(BASERELLIB)s:%(BASERELLIB)s/FigKernelPackages:%(RTPERL5LIB)s" % params
162 : efrank 1.1
163 :     return s
164 :    
165 :     #------------------------------------------------------------
166 :     def emitPython( params, filename ):
167 :     #------------------------------------------------------------
168 :    
169 :     hdr = """#!%(RTENV)s %(RTPYTHON)s
170 :    
171 :     import sys, os
172 :    
173 :     #Precedence order for python: workdir beats baserel beats extra stuff"
174 :    
175 :     """ % params
176 :    
177 :     #take care: insert pushes to first on list, but colon separated
178 :     # list is in order of precedence...gets confusing but have to
179 :     # reverse the order, that's why not s += foo but s = foo + s belowb.
180 :    
181 :     s=""
182 :     for p in params["RTPYTHONPATH"].split(":"):
183 :     if p=="": continue
184 :     s = "sys.path.insert(0,'%s')\n" % p + s
185 :    
186 :     hdr += s
187 :    
188 :     hdr += """
189 :     sys.path.insert(0,"%(BASERELLIB)s")
190 :     sys.path.insert(0,"%(THISRELLIB)s" )
191 :     """ % params
192 :    
193 :    
194 :     hdr += """
195 :     if os.getenv("PERL5LIB", "") != "":
196 :     _delim = ":"
197 :     else:
198 :     _delim = ""
199 :    
200 :     os.environ["PERL5LIB"]="%s" + _delim + os.getenv("PERL5LIB", "")
201 :     """ % makePerl5LibPath( params)
202 :    
203 :     for x in params["RTPYTHONIMPORTS"].split(":"):
204 :     hdr += "import %s\n" % x
205 : olson 1.2
206 :     #
207 :     # Write additional environment variables.
208 :     #
209 :    
210 :     if params.has_key("RTSETENV"):
211 :     for env in params['RTSETENV']:
212 :     k, v = env.split("=", 1)
213 :     hdr += """os.environ["%s"] = "%s"\n""" % (k, v)
214 :    
215 : efrank 1.1
216 :     hdr += "# end of tool_hdr_py \n"
217 :     hdr += "#"*72
218 :     hdr += "\n"
219 :    
220 :     try:
221 :     f=file(filename, 'w')
222 :     f.write( hdr )
223 :     f.close()
224 :     except:
225 : olson 1.2 warn( "Could not write python tool header %s" % (filename), die=1)
226 : efrank 1.1
227 :     return
228 :    
229 :     #------------------------------------------------------------
230 :     def emitPerl( params, filename ):
231 :     #------------------------------------------------------------
232 :    
233 : olson 1.5 #
234 :     # If we are using run_perl as the perl interpreter, we prepand
235 :     # the perl path items instead of hard-setting hte path.
236 :    
237 :     myparams = params.copy()
238 :    
239 :     if params['RTPERL'].endswith('/run_perl'):
240 :     myparams['init'] = 'unshift @INC, qw('
241 :     else:
242 :     myparams['init'] = '@INC = qw('
243 :    
244 : efrank 1.1 hdr = """#!%(RTENV)s %(RTPERL)s
245 :    
246 :     BEGIN {
247 : olson 1.5 %(init)s
248 :     """ % myparams
249 : efrank 1.1
250 :    
251 :     for p in makePerl5LibPath( params).split(":"):
252 :     hdr += " %s\n" % p
253 :    
254 :    
255 :     hdr += """
256 :     );
257 :     }
258 :     use Data::Dumper;
259 :     use Carp;
260 :     """
261 :    
262 :     for x in params["RTPERLIMPORTS"].split(":"):
263 :     hdr += "use %s;\n" % x
264 :    
265 : olson 1.2 #
266 :     # Write additional environment variables.
267 :     #
268 :    
269 :     if params.has_key("RTSETENV"):
270 :     for env in params['RTSETENV']:
271 :     k, v = env.split("=", 1)
272 :     hdr += """$ENV{'%s'} = "%s";\n""" % (k, v)
273 :    
274 : efrank 1.1 hdr += "# end of tool_hdr\n"
275 :     hdr += "#"*72
276 :     hdr += "\n"
277 :    
278 :     try:
279 :     f=file(filename, 'w')
280 :     f.write( hdr )
281 :     f.close()
282 :     except:
283 :     warn( "Could not write perl tool header", die=1)
284 :    
285 :     return
286 :    
287 :     #------------------------------------------------------------
288 :     def main():
289 :     #------------------------------------------------------------
290 :     if (not len(sys.argv) == 2):
291 :     print "usage: makeScriptHeaders releaseDirPath"
292 :     sys.exit(1)
293 :    
294 :     thisrel = sys.argv[1]
295 :     rtdist = os.getenv("RTDIST")
296 :     rtarch = os.getenv("RTARCH")
297 :     rtcurrent = os.getenv("RTCURRENT")
298 :     rtsiteconfigdir = os.getenv("RTSITECONFIGDIR")
299 :    
300 :     if (None==rtdist): warn("RTDIST not set", die=1)
301 :     if (None==rtarch): warn("RTARC not set", die=1)
302 :     if (None==rtcurrent): warn("RTCURRENT not set", die=1)
303 :     #it is not an error for RtSiteconfigDir to be unset
304 :    
305 : olson 1.2 #
306 :     # However, during the transition from pre-RTConfig to post-RTConfig in the SEED,
307 :     # we check for the existence of an RTConfig in RTROOT/config. If it's there,
308 :     # RTROOT/config is set as the site config dir.
309 :     #
310 :    
311 :     if rtsiteconfigdir is None:
312 :     rtroot = os.getenv("RTROOT")
313 :     if rtroot is not None:
314 :     otherPath = os.path.join(rtroot, "config", "RTConfig")
315 :     if os.path.isfile(otherPath):
316 :     rtsiteconfigdir = os.path.join(rtroot, "config")
317 :    
318 : efrank 1.1 baserel = os.path.join(rtdist, rtcurrent)
319 :    
320 :     baseInfo = getInfo( os.path.join(rtdist, rtcurrent, "ReleaseTools"), "RTConfig")
321 :     siteInfo = getInfo( rtsiteconfigdir, "RTConfig")
322 :     thisRelInfo = getInfo( thisrel, "RTConfig" )
323 :    
324 :     #let different sources of info duke it out:
325 :     finalParms = supercede(baseInfo, siteInfo, thisRelInfo)
326 :    
327 : olson 1.3 perl_hdr = os.path.join(thisrel, rtarch, "tool_hdr")
328 :     python_hdr = os.path.join(thisrel, rtarch, "tool_hdr_py")
329 :    
330 : efrank 1.1 #make sure no goofiness
331 :     if not audit( finalParms ):
332 : olson 1.3 #
333 :     # If the header files we are generating are already there,
334 :     # warn and exit with exit status 0 so a make will continue.
335 :     #
336 :    
337 :     if os.path.isfile(perl_hdr) and os.path.isfile(python_hdr):
338 :     warn("Value errors in config data, but output files already exist. Not failing.", die=0)
339 :     sys.exit(0)
340 :     else:
341 :     warn("Value errors in config data", die=1)
342 : efrank 1.1
343 :     #slip in a few extras that make coding emitters easier
344 :     finalParms["BASERELLIB"] = "%s" % os.path.join(baserel, rtarch, "lib") #not really right !!!
345 :     finalParms["THISRELLIB"] = "%s" % os.path.join(thisrel, rtarch, "lib")
346 :    
347 : olson 1.3 emitPython(finalParms, python_hdr)
348 :     emitPerl(finalParms, perl_hdr)
349 : efrank 1.1
350 :     return
351 :    
352 :     if (__name__ == "__main__"):
353 : olson 1.2 main()

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3