waf/build_system_kit/makefile_dumper/wscript

80 lines
2.1 KiB
Python

#! /usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2010 (ita)
"""
Calling 'waf build' executes a normal build with Waf
Calling 'waf clean dump' will create a makefile corresponding to the build
The dependencies will be extracted too
"""
VERSION='0.0.1'
APPNAME='cc_test'
top = '.'
def options(opt):
opt.load('compiler_c')
def configure(conf):
conf.load('compiler_c')
def build(bld):
bld.program(source='main.c', target='app', use='mylib', cflags=['-O2'])
bld.stlib(source='a.c', target='mylib')
# ---------------------------------------------------------------------------
from waflib import Build, Logs
class Dumper(Build.BuildContext):
fun = 'dump'
cmd = 'dump'
def dump(bld):
# call the build function as if a real build were performed
build(bld)
from waflib import Task
bld.commands = []
bld.targets = []
# store the command executed
old_exec = Task.Task.exec_command
def exec_command(self, *k, **kw):
ret = old_exec(self, *k, **kw)
self.command_executed = k[0]
self.path = kw['cwd'] or self.generator.bld.cwd
return ret
Task.Task.exec_command = exec_command
# perform a fake build, and accumulate the makefile bits
old_process = Task.Task.process
def process(self):
old_process(self)
lst = []
for x in self.outputs:
lst.append(x.path_from(self.generator.bld.bldnode))
bld.targets.extend(lst)
lst.append(':')
for x in self.inputs + self.dep_nodes + self.generator.bld.node_deps.get(self.uid(), []):
lst.append(x.path_from(self.generator.bld.bldnode))
try:
if isinstance(self.command_executed, list):
self.command_executed = ' '.join(self.command_executed)
except Exception as e:
print(e)
else:
bld.commands.append(' '.join(lst))
bld.commands.append('\tcd %s && %s' % (self.path, self.command_executed))
Task.Task.process = process
# write the makefile after the build is complete
def output_makefile(self):
self.commands.insert(0, "all: %s" % " ".join(self.targets))
node = self.bldnode.make_node('Makefile')
node.write('\n'.join(self.commands))
Logs.warn('Wrote %r', node)
bld.add_post_fun(output_makefile)