3 # based on playground/evil in the waf svn tree
6 import Scripting
, Utils
, Options
, Logs
, Environment
, fnmatch
7 from Constants
import *
8 from samba_utils
import *
11 '''run a single build task'''
14 raise Utils
.WafError("Failed to build %s: %u" % (k
, ret
))
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(info
=False)
22 cwd_node
= bld
.root
.find_dir(os
.getcwd())
23 top_node
= bld
.root
.find_dir(bld
.srcnode
.abspath())
25 cmd
= os
.path
.normpath(cmd
)
27 # cope with builds of bin/*/*
28 if os
.path
.islink(cmd
):
29 cmd
= os_path_relpath(os
.readlink(cmd
), os
.getcwd())
31 if cmd
[0:12] == "bin/default/":
34 for g
in bld
.task_manager
.groups
:
35 for attr
in ['outputs', 'inputs']:
37 s
= getattr(t
, attr
, [])
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
)):
50 raise Utils
.WafError("Unable to find build target matching %s" % cmd
)
53 def rewrite_compile_targets():
54 '''cope with the bin/ form of compile target'''
55 if not Options
.options
.compile_targets
:
58 bld
= fake_build_environment(info
=False)
59 targets
= LOCAL_CACHE(bld
, 'TARGET_TYPE')
62 for t
in Options
.options
.compile_targets
.split(','):
63 if not os
.path
.islink(t
):
67 list = link
.split('/')
68 for name
in [list[-1], '/'.join(list[-2:])]:
72 Options
.options
.compile_targets
= ",".join(tlist
)
76 def wildcard_main(missing_cmd_fn
):
77 '''this replaces main from Scripting, allowing us to override the
78 behaviour for unknown commands
80 If a unknown command is found, then missing_cmd_fn() is called with
81 the name of the requested command
83 Scripting
.commands
= Options
.arg_line
[:]
85 # rewrite the compile targets to cope with the bin/xx form
86 rewrite_compile_targets()
88 while Scripting
.commands
:
89 x
= Scripting
.commands
.pop(0)
91 ini
= datetime
.datetime
.now()
93 fun
= Scripting
.configure
97 fun
= getattr(Utils
.g_module
, x
, None)
99 # this is the new addition on top of main from Scripting.py
104 ctx
= getattr(Utils
.g_module
, x
+ '_context', Utils
.Context
)()
106 if x
in ['init', 'shutdown', 'dist', 'distclean', 'distcheck']:
115 if not Options
.options
.progress_bar
:
116 ela
= ' (%s)' % Utils
.get_elapsed_time(ini
)
118 if x
!= 'init' and x
!= 'shutdown':
119 Logs
.info('%r finished successfully%s' % (x
, ela
))
121 if not Scripting
.commands
and x
!= 'shutdown':
122 Scripting
.commands
.append('shutdown')
127 def fake_build_environment(info
=True, flush
=False):
128 """create all the tasks for the project, but do not run the build
129 return the build context in use"""
130 bld
= getattr(Utils
.g_module
, 'build_context', Utils
.Context
)()
131 bld
= Scripting
.check_configured(bld
)
133 Options
.commands
['install'] = False
134 Options
.commands
['uninstall'] = False
135 Options
.is_install
= False
137 bld
.is_install
= 0 # False
140 proj
= Environment
.Environment(Options
.lockfile
)
142 raise Utils
.WafError("Project not configured (run 'waf configure' first)")
144 bld
.load_dirs(proj
[SRCDIR
], proj
[BLDDIR
])
148 Logs
.info("Waf: Entering directory `%s'" % bld
.bldnode
.abspath())
149 bld
.add_subdirs([os
.path
.split(Utils
.g_module
.root_path
)[0]])