123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- #! /usr/bin/env python
- """
- This is a hack; In general two tasks should not provide
- the same output nodes (bad abstraction), and this cannot
- scale to more than one operation
- In this case, the strip task has the same inputs as outputs
- so the constraints added by Task.set_file_constraints
- to prevent race conditions:
- - By setting the input node to be the link task output node
- the strip tasks will run after their link tasks
- - By setting the output node to be the link task output node,
- any other task that also uses this output node will wait
- for the strip task to finish too
- - By overriding the runnable_status method, the strip task
- will avoid the deadlock and force itself to run only when
- the link task has run
- """
- def configure(conf):
- conf.find_program('strip')
- from waflib import Task, TaskGen
- class strip(Task.Task):
- run_str = '${STRIP} ${SRC}'
- color = 'BLUE'
- no_errcheck_out = True
- def keyword(self):
- return 'Stripping'
- def runnable_status(self):
- if self in self.run_after:
- self.run_after.remove(self)
- ret = super(strip, self).runnable_status()
- if ret == Task.ASK_LATER:
- return ret
- if self.generator.link_task.hasrun == Task.SUCCESS:
- # ensure that stripping always runs
- # when a binary is written
- return Task.RUN_ME
- return Task.SKIP_ME
- @TaskGen.feature('cshlib', 'cxxshlib', 'cprogram', 'cxxprogram', 'fcprogram', 'fcshlib')
- @TaskGen.after('apply_link')
- def add_strip_task(self):
- if getattr(self, 'link_task', None):
- exe_node = self.link_task.outputs[0]
- # special case: same inputs and outputs for a task
- self.create_task('strip', exe_node, exe_node)
|