1 # based on playground/evil in the waf svn tree
3 import os
, datetime
, fnmatch
4 from waflib
import Scripting
, Utils
, Options
, Logs
, Errors
5 from waflib
import ConfigSet
, Context
6 from samba_utils
import LOCAL_CACHE
, os_path_relpath
9 '''run a single build task'''
12 raise Errors
.WafError("Failed to build %s: %u" % (k
, ret
))
15 def run_named_build_task(cmd
):
16 '''run a named build task, matching the cmd name using fnmatch
17 wildcards against inputs and outputs of all build tasks'''
18 bld
= fake_build_environment(info
=False)
20 cwd_node
= bld
.root
.find_dir(os
.getcwd())
21 top_node
= bld
.root
.find_dir(bld
.srcnode
.abspath())
23 cmd
= os
.path
.normpath(cmd
)
25 # cope with builds of bin/*/*
26 if os
.path
.islink(cmd
):
27 cmd
= os_path_relpath(os
.readlink(cmd
), os
.getcwd())
29 if cmd
[0:12] == "bin/default/":
32 for g
in bld
.task_manager
.groups
:
33 for attr
in ['outputs', 'inputs']:
35 s
= getattr(t
, attr
, [])
37 relpath1
= k
.relpath_gen(cwd_node
)
38 relpath2
= k
.relpath_gen(top_node
)
39 if (fnmatch
.fnmatch(relpath1
, cmd
) or
40 fnmatch
.fnmatch(relpath2
, cmd
)):
48 raise Errors
.WafError("Unable to find build target matching %s" % cmd
)
51 def rewrite_compile_targets():
52 '''cope with the bin/ form of compile target'''
53 if not Options
.options
.compile_targets
:
56 bld
= fake_build_environment(info
=False)
57 targets
= LOCAL_CACHE(bld
, 'TARGET_TYPE')
60 for t
in Options
.options
.compile_targets
.split(','):
61 if not os
.path
.islink(t
):
65 list = link
.split('/')
66 for name
in [list[-1], '/'.join(list[-2:])]:
70 Options
.options
.compile_targets
= ",".join(tlist
)
74 def wildcard_main(missing_cmd_fn
):
75 '''this replaces main from Scripting, allowing us to override the
76 behaviour for unknown commands
78 If a unknown command is found, then missing_cmd_fn() is called with
79 the name of the requested command
81 Scripting
.commands
= Options
.arg_line
[:]
83 # rewrite the compile targets to cope with the bin/xx form
84 rewrite_compile_targets()
86 while Scripting
.commands
:
87 x
= Scripting
.commands
.pop(0)
89 ini
= datetime
.datetime
.now()
91 fun
= Scripting
.configure
95 fun
= getattr(Utils
.g_module
, x
, None)
97 # this is the new addition on top of main from Scripting.py
102 ctx
= getattr(Utils
.g_module
, x
+ '_context', Utils
.Context
)()
104 if x
in ['init', 'shutdown', 'dist', 'distclean', 'distcheck']:
113 if not Options
.options
.progress_bar
:
114 ela
= ' (%s)' % Utils
.get_elapsed_time(ini
)
116 if x
!= 'init' and x
!= 'shutdown':
117 Logs
.info('%r finished successfully%s' % (x
, ela
))
119 if not Scripting
.commands
and x
!= 'shutdown':
120 Scripting
.commands
.append('shutdown')
125 def fake_build_environment(info
=True, flush
=False):
126 """create all the tasks for the project, but do not run the build
127 return the build context in use"""
128 bld
= getattr(Context
.g_module
, 'build_context', Utils
.Context
)()
129 bld
= Scripting
.check_configured(bld
)
131 Options
.commands
['install'] = False
132 Options
.commands
['uninstall'] = False
134 bld
.is_install
= 0 # False
137 proj
= ConfigSet
.ConfigSet(Options
.lockfile
)
139 raise Errors
.WafError("Project not configured (run 'waf configure' first)")
144 Logs
.info("Waf: Entering directory `%s'" % bld
.bldnode
.abspath())
145 bld
.add_subdirs([os
.path
.split(Context
.g_module
.root_path
)[0]])