1 | #! /usr/bin/env python
|
---|
2 |
|
---|
3 | # based on playground/evil in the waf svn tree
|
---|
4 |
|
---|
5 | import os, datetime
|
---|
6 | import Scripting, Utils, Options, Logs, Environment, fnmatch
|
---|
7 | from Constants import *
|
---|
8 | from samba_utils import *
|
---|
9 |
|
---|
10 | def run_task(t, k):
|
---|
11 | '''run a single build task'''
|
---|
12 | ret = t.run()
|
---|
13 | if ret:
|
---|
14 | raise Utils.WafError("Failed to build %s: %u" % (k, ret))
|
---|
15 |
|
---|
16 |
|
---|
17 | def run_named_build_task(cmd):
|
---|
18 | '''run a named build task, matching the cmd name using fnmatch
|
---|
19 | wildcards against inputs and outputs of all build tasks'''
|
---|
20 | bld = fake_build_environment()
|
---|
21 | found = False
|
---|
22 | cwd_node = bld.root.find_dir(os.getcwd())
|
---|
23 | top_node = bld.root.find_dir(bld.srcnode.abspath())
|
---|
24 |
|
---|
25 | cmd = os.path.normpath(cmd)
|
---|
26 |
|
---|
27 | # cope with builds of bin/*/*
|
---|
28 | if os.path.islink(cmd):
|
---|
29 | cmd = os_path_relpath(os.readlink(cmd), os.getcwd())
|
---|
30 |
|
---|
31 | if cmd[0:12] == "bin/default/":
|
---|
32 | cmd = cmd[12:]
|
---|
33 |
|
---|
34 | for g in bld.task_manager.groups:
|
---|
35 | for attr in ['outputs', 'inputs']:
|
---|
36 | for t in g.tasks:
|
---|
37 | s = getattr(t, attr, [])
|
---|
38 | for k in s:
|
---|
39 | relpath1 = k.relpath_gen(cwd_node)
|
---|
40 | relpath2 = k.relpath_gen(top_node)
|
---|
41 | if (fnmatch.fnmatch(relpath1, cmd) or
|
---|
42 | fnmatch.fnmatch(relpath2, cmd)):
|
---|
43 | t.position = [0,0]
|
---|
44 | print(t.display())
|
---|
45 | run_task(t, k)
|
---|
46 | found = True
|
---|
47 |
|
---|
48 |
|
---|
49 | if not found:
|
---|
50 | raise Utils.WafError("Unable to find build target matching %s" % cmd)
|
---|
51 |
|
---|
52 |
|
---|
53 |
|
---|
54 | def wildcard_main(missing_cmd_fn):
|
---|
55 | '''this replaces main from Scripting, allowing us to override the
|
---|
56 | behaviour for unknown commands
|
---|
57 |
|
---|
58 | If a unknown command is found, then missing_cmd_fn() is called with
|
---|
59 | the name of the requested command
|
---|
60 | '''
|
---|
61 | Scripting.commands = Options.arg_line[:]
|
---|
62 |
|
---|
63 | while Scripting.commands:
|
---|
64 | x = Scripting.commands.pop(0)
|
---|
65 |
|
---|
66 | ini = datetime.datetime.now()
|
---|
67 | if x == 'configure':
|
---|
68 | fun = Scripting.configure
|
---|
69 | elif x == 'build':
|
---|
70 | fun = Scripting.build
|
---|
71 | else:
|
---|
72 | fun = getattr(Utils.g_module, x, None)
|
---|
73 |
|
---|
74 | # this is the new addition on top of main from Scripting.py
|
---|
75 | if not fun:
|
---|
76 | missing_cmd_fn(x)
|
---|
77 | break
|
---|
78 |
|
---|
79 | ctx = getattr(Utils.g_module, x + '_context', Utils.Context)()
|
---|
80 |
|
---|
81 | if x in ['init', 'shutdown', 'dist', 'distclean', 'distcheck']:
|
---|
82 | try:
|
---|
83 | fun(ctx)
|
---|
84 | except TypeError:
|
---|
85 | fun()
|
---|
86 | else:
|
---|
87 | fun(ctx)
|
---|
88 |
|
---|
89 | ela = ''
|
---|
90 | if not Options.options.progress_bar:
|
---|
91 | ela = ' (%s)' % Utils.get_elapsed_time(ini)
|
---|
92 |
|
---|
93 | if x != 'init' and x != 'shutdown':
|
---|
94 | Logs.info('%r finished successfully%s' % (x, ela))
|
---|
95 |
|
---|
96 | if not Scripting.commands and x != 'shutdown':
|
---|
97 | Scripting.commands.append('shutdown')
|
---|
98 |
|
---|
99 |
|
---|
100 |
|
---|
101 |
|
---|
102 | def fake_build_environment():
|
---|
103 | """create all the tasks for the project, but do not run the build
|
---|
104 | return the build context in use"""
|
---|
105 | bld = getattr(Utils.g_module, 'build_context', Utils.Context)()
|
---|
106 | bld = Scripting.check_configured(bld)
|
---|
107 |
|
---|
108 | Options.commands['install'] = False
|
---|
109 | Options.commands['uninstall'] = False
|
---|
110 | Options.is_install = False
|
---|
111 |
|
---|
112 | bld.is_install = 0 # False
|
---|
113 |
|
---|
114 | try:
|
---|
115 | proj = Environment.Environment(Options.lockfile)
|
---|
116 | except IOError:
|
---|
117 | raise Utils.WafError("Project not configured (run 'waf configure' first)")
|
---|
118 |
|
---|
119 | bld.load_dirs(proj[SRCDIR], proj[BLDDIR])
|
---|
120 | bld.load_envs()
|
---|
121 |
|
---|
122 | Logs.info("Waf: Entering directory `%s'" % bld.bldnode.abspath())
|
---|
123 | bld.add_subdirs([os.path.split(Utils.g_module.root_path)[0]])
|
---|
124 |
|
---|
125 | bld.pre_build()
|
---|
126 | bld.flush()
|
---|
127 | return bld
|
---|
128 |
|
---|