source: GTP/trunk/App/Demos/Geom/Shark3D/Shark3D_runtime/utility/buildres/inc_basic.s3d_scons @ 2236

Revision 2236, 7.3 KB checked in by gumbau, 17 years ago (diff)
Line 
1###############################################################################
2##
3##      ##  ######
4##       ######  ###
5##  ## ###############        Shark 3D Engine (www.shark3d.com)
6##   ########## # # #
7##    ########                Copyright (c) 1996-2006 Spinor GmbH.
8##   ######### # # #          All rights reserved.
9##  ##   ##########
10##      ##
11##
12###############################################################################
13
14##############################################################################
15# Basic functions:
16
17def sysmsg(txt):
18    print "shark3d:", txt
19
20def isdelim(c):
21    return c == '/' or c == '\\'
22   
23def getwithdelim(path):
24    if path != "" and not isdelim(path[-1]):
25        return path + "/"
26    else:
27        return path
28   
29def isequivchar(c1, c2):
30    if isdelim(c1) and isdelim(c2):   
31        return True
32    return c1 == c2
33       
34def isequivpath(p1, p2):
35    effp1 = os.path.abspath(p1)
36    effp2 = os.path.abspath(p2)
37    if len(effp1) != len(effp2):
38        return False
39    for i in range(len(effp1)):
40        if not isequivchar(effp1[i], effp2[i]):
41            return False
42    return True
43       
44def iswithin(fr, to):
45    efffr = os.path.abspath(getwithdelim(fr))
46    effto = os.path.abspath(to)
47    return isequivpath(efffr, effto[0:len(efffr)])
48
49def subpath(fr, to):
50    efffr = getwithdelim(os.path.abspath(fr))
51    effto = os.path.abspath(to)
52    if isequivpath(efffr, effto[0:len(efffr)]):
53        return effto[len(efffr):]
54    else:
55        err = "'%s' is not in '%s'." % (effto, efffr)
56        raise StandardError, err
57
58def mapfile(targetpath, targetbase, srcbase, srcsuffix):
59    targetpath = os.path.abspath(targetpath)
60    targetbase = os.path.abspath(targetbase)
61    srcbase = os.path.abspath(srcbase)
62    if targetbase != None:
63        targetresname = subpath(targetbase, targetpath)
64    else:
65        targetresname = targetpath
66    if srcsuffix != None:
67        srcresname = os.path.splitext(targetresname)[0] + srcsuffix
68    else:
69        srcresname = targetresname
70    if srcbase != None:
71        srcpath = os.path.join(srcbase, srcresname)
72    else:
73        srcpath = srcresname
74    return srcpath
75
76def boolparam(b):
77    if b:
78        return "1"
79    else:
80        return "0"
81   
82def execescape(arg):
83    # Unfortunately needed for Windows.
84    # See http://mail.python.org/pipermail/python-bugs-list/
85    #                           2001-December/008754.html
86    arg = re.sub("\\\\", "\\\\\\\\", arg)
87    arg = re.sub("\\\\\"", "\\\\\"", arg)
88    arg = "\"" + arg + "\""
89    return arg
90   
91def execcmd(prog, args, quiet = False):
92    normprog = os.path.normpath(prog)
93    effprog = normprog
94    escprog = execescape(normprog)
95    effargs = [escprog]
96    effcmd = escprog
97    for arg in args:
98        escarg = execescape(arg)
99        effargs = effargs + [escarg]
100        effcmd = effcmd + " " + escarg
101    if not quiet:       
102        sysmsg(effcmd)
103    result = 0
104    try:
105        result = os.spawnv(os.P_WAIT, effprog, effargs)
106    except:
107        result = 9999
108    if result != 0:
109        err = "Execution of '%s' failed with return value %i. " \
110                % (normprog, result)
111        sysmsg(err)
112        return 1
113    return 0
114       
115def getenv(key):
116    val = ""
117    try:
118        val = os.environ[key]
119    except KeyError:
120        val = ""
121    return val
122   
123def createdirrec(dir):
124    if not os.path.exists(dir):
125        os.makedirs(dir)
126   
127def createfilefirrec(path):
128    dir = os.path.dirname(path)
129    createdirrec(dir)
130       
131##############################################################################
132# Builder management:
133
134def is_target(path):
135    if iswithin(bin_dir, path):
136        return True
137    if iswithin(tmp_dir, path):
138        return True
139    return False
140
141def detect_builder(path):
142    if is_target(path):
143        for pat, bld in bldlst.iteritems():
144            if fnmatch.fnmatch(path, pat):
145                return (True, bld)
146        return (False, None)
147    else:
148        return (True, None)
149
150def define_builder(path):
151    (found, bld) = detect_builder(path)
152    if found:
153        if not bld is None:
154            bld(env, path, [])
155    else:
156        err = "No builder found for '%s'." % (path)
157        raise StandardError, err
158       
159##############################################################################
160# Snake utility functions:
161
162def snkcollect(path, field):
163
164    collecttxt = os.path.join(tmp_dir, "collect.txt")
165
166    execcmd(tool_snk, \
167        ["collect", path, collecttxt, field, "-quiet", "1"], \
168        True)
169   
170    txtfile = open(collecttxt, "r")
171    txtline = txtfile.readline()
172    list = []
173    while txtline:
174        entry = re.match('^(.*)$', txtline).group(1)
175        list.append(entry)
176        txtline = txtfile.readline()
177    txtfile.close()
178   
179    return list
180   
181def snkfetch(path, field):
182   
183    collecttxt = os.path.join(tmp_dir, "collect.txt")
184
185    execcmd(tool_snk, \
186        ["access", path, collecttxt, field, "-quiet", "1"], \
187        True)
188   
189    txtfile = open(collecttxt, "r")
190    txtline = txtfile.readline()
191    entry = re.match('^(.*)$', txtline).group(1)
192    txtfile.close()
193   
194    return entry
195   
196##############################################################################
197# Collect targets:
198
199def collect_targets(dir):
200    targetslst = os.path.join(tmp_dir, "res_targets.lst")
201
202    execcmd(tool_targets, \
203            ["res_targets.cfg", targetslst, dir, "-quiet", "1"], \
204            True)
205   
206    targets_list = snkcollect(targetslst, "targets")
207   
208    return targets_list
209       
210##############################################################################
211# Command line evaluation:
212
213def eval_targets():
214    createdirrec(tmp_dir)
215    createdirrec(bin_dir)
216    for param in COMMAND_LINE_TARGETS:
217        if os.path.isdir(param):
218            targetdir = getwithdelim(os.path.abspath(param))
219            if iswithin(bin_dir, targetdir):
220                targetdir = mapfile(targetdir, bin_dir, src_dir, None)
221            sysmsg("Scanning '%s'... " % (targetdir))
222            targetreslist = collect_targets(targetdir)
223            sysmsg("Found %i targets in '%s'. " \
224                    % (len(targetreslist), targetdir))
225            for targetres in targetreslist:
226                targetpath = os.path.join(bin_dir, targetres)
227                define_builder(targetpath)
228        else:
229            targetpath = os.path.abspath(param)
230            if iswithin(src_dir, targetpath):
231                targetpath = mapfile(targetpath, src_dir, bin_dir, None)
232            elif iswithin(bin_dir, targetpath):
233                targetpath = targetpath
234            else:
235                err = "'%s' is not in '%s' or '%s'." \
236                        % (targetpath, src_dir, bin_dir)
237                raise StandardError, err           
238            sysmsg("Using explicit target '%s'. " % (targetpath))
239            define_builder(targetpath)
240
241##############################################################################
242# Global variables and settings:
243
244env = Environment()
245
246bldlst = {}
247
248SourceSignatures('timestamp')
249
250Default(None)
251
252##############################################################################
253# End of file.
Note: See TracBrowser for help on using the repository browser.