[Bio] / ReleaseTools / makeScriptHeaders Repository:
ViewVC logotype

Annotation of /ReleaseTools/makeScriptHeaders

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (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 :     s = "%(THISRELLIB)s:%(THISRELLIB)s/FigKernelPackages:%(BASERELLIB)s:%(BASERELLIB)s/FigKernelPackages:%(RTPERL5LIB)s" % params
162 :    
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 :     hdr = """#!%(RTENV)s %(RTPERL)s
234 :    
235 :     BEGIN {
236 :     @INC = qw(
237 :     """ % params
238 :    
239 :    
240 :     for p in makePerl5LibPath( params).split(":"):
241 :     hdr += " %s\n" % p
242 :    
243 :    
244 :     hdr += """
245 :     );
246 :     }
247 :     use Data::Dumper;
248 :     use Carp;
249 :     """
250 :    
251 :     for x in params["RTPERLIMPORTS"].split(":"):
252 :     hdr += "use %s;\n" % x
253 :    
254 : olson 1.2 #
255 :     # Write additional environment variables.
256 :     #
257 :    
258 :     if params.has_key("RTSETENV"):
259 :     for env in params['RTSETENV']:
260 :     k, v = env.split("=", 1)
261 :     hdr += """$ENV{'%s'} = "%s";\n""" % (k, v)
262 :    
263 : efrank 1.1 hdr += "# end of tool_hdr\n"
264 :     hdr += "#"*72
265 :     hdr += "\n"
266 :    
267 :     try:
268 :     f=file(filename, 'w')
269 :     f.write( hdr )
270 :     f.close()
271 :     except:
272 :     warn( "Could not write perl tool header", die=1)
273 :    
274 :     return
275 :    
276 :     #------------------------------------------------------------
277 :     def main():
278 :     #------------------------------------------------------------
279 :     if (not len(sys.argv) == 2):
280 :     print "usage: makeScriptHeaders releaseDirPath"
281 :     sys.exit(1)
282 :    
283 :     thisrel = sys.argv[1]
284 :     rtdist = os.getenv("RTDIST")
285 :     rtarch = os.getenv("RTARCH")
286 :     rtcurrent = os.getenv("RTCURRENT")
287 :     rtsiteconfigdir = os.getenv("RTSITECONFIGDIR")
288 :    
289 :     if (None==rtdist): warn("RTDIST not set", die=1)
290 :     if (None==rtarch): warn("RTARC not set", die=1)
291 :     if (None==rtcurrent): warn("RTCURRENT not set", die=1)
292 :     #it is not an error for RtSiteconfigDir to be unset
293 :    
294 : olson 1.2 #
295 :     # However, during the transition from pre-RTConfig to post-RTConfig in the SEED,
296 :     # we check for the existence of an RTConfig in RTROOT/config. If it's there,
297 :     # RTROOT/config is set as the site config dir.
298 :     #
299 :    
300 :     if rtsiteconfigdir is None:
301 :     rtroot = os.getenv("RTROOT")
302 :     if rtroot is not None:
303 :     otherPath = os.path.join(rtroot, "config", "RTConfig")
304 :     if os.path.isfile(otherPath):
305 :     rtsiteconfigdir = os.path.join(rtroot, "config")
306 :    
307 : efrank 1.1 baserel = os.path.join(rtdist, rtcurrent)
308 :    
309 :     baseInfo = getInfo( os.path.join(rtdist, rtcurrent, "ReleaseTools"), "RTConfig")
310 :     siteInfo = getInfo( rtsiteconfigdir, "RTConfig")
311 :     thisRelInfo = getInfo( thisrel, "RTConfig" )
312 :    
313 :     #let different sources of info duke it out:
314 :     finalParms = supercede(baseInfo, siteInfo, thisRelInfo)
315 :    
316 :     #make sure no goofiness
317 :     if not audit( finalParms ):
318 :     warn("Value errors in config data", die=1)
319 :    
320 :     #slip in a few extras that make coding emitters easier
321 :     finalParms["BASERELLIB"] = "%s" % os.path.join(baserel, rtarch, "lib") #not really right !!!
322 :     finalParms["THISRELLIB"] = "%s" % os.path.join(thisrel, rtarch, "lib")
323 :    
324 :     emitPython(finalParms, os.path.join(thisrel, rtarch, "tool_hdr_py"))
325 :     emitPerl(finalParms, os.path.join(thisrel, rtarch, "tool_hdr"))
326 :    
327 :     return
328 :    
329 :     if (__name__ == "__main__"):
330 : olson 1.2 main()

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3