|
|
| 442 |
def apply_ns3header(self): |
442 |
def apply_ns3header(self): |
| 443 |
if self.module is None: |
443 |
if self.module is None: |
| 444 |
raise WafError("'module' missing on ns3headers object %s" % self) |
444 |
raise WafError("'module' missing on ns3headers object %s" % self) |
| 445 |
ns3_dir_node = self.bld.path.find_dir("ns3") |
445 |
ns3_dir_node = self.bld.path.find_or_declare("ns3") |
| 446 |
for filename in set(self.to_list(self.source)): |
446 |
for filename in set(self.to_list(self.source)): |
| 447 |
src_node = self.path.find_resource(filename) |
447 |
src_node = self.path.find_resource(filename) |
| 448 |
if src_node is None: |
448 |
if src_node is None: |
|
|
| 530 |
return 0 |
530 |
return 0 |
| 531 |
|
531 |
|
| 532 |
|
532 |
|
|
|
533 |
@TaskGen.feature('ns3privateheader') |
| 534 |
@TaskGen.after_method('process_rule') |
| 535 |
def apply_ns3privateheader(self): |
| 536 |
if self.module is None: |
| 537 |
raise WafError("'module' missing on ns3headers object %s" % self) |
| 538 |
ns3_dir_node = self.bld.path.find_or_declare("ns3/private") |
| 539 |
for filename in set(self.to_list(self.source)): |
| 540 |
src_node = self.path.find_resource(filename) |
| 541 |
if src_node is None: |
| 542 |
raise WafError("source ns3 header file %s not found" % (filename,)) |
| 543 |
dst_node = ns3_dir_node.find_or_declare(src_node.name) |
| 544 |
assert dst_node is not None |
| 545 |
task = self.create_task('ns3privateheader') |
| 546 |
task.mode = getattr(self, 'mode', 'install') |
| 547 |
if task.mode == 'install': |
| 548 |
task.set_inputs([src_node]) |
| 549 |
task.set_outputs([dst_node]) |
| 550 |
else: |
| 551 |
task.header_to_remove = dst_node |
| 552 |
self.headers = set(self.to_list(self.source)) |
| 553 |
self.source = '' # tell WAF not to process these files further |
| 554 |
|
| 555 |
class ns3privateheader_task(Task.Task): |
| 556 |
before = 'cxx gen_ns3_module_header' |
| 557 |
after = 'ns3_header' |
| 558 |
color = 'BLUE' |
| 559 |
|
| 560 |
def __str__(self): |
| 561 |
"string to display to the user" |
| 562 |
env = self.env |
| 563 |
src_str = ' '.join([a.nice_path(env) for a in self.inputs]) |
| 564 |
tgt_str = ' '.join([a.nice_path(env) for a in self.outputs]) |
| 565 |
if self.outputs: sep = ' -> ' |
| 566 |
else: sep = '' |
| 567 |
if self.mode == 'remove': |
| 568 |
return 'rm-ns3-header %s\n' % (self.header_to_remove.abspath(),) |
| 569 |
return 'install-ns3-header: %s%s%s\n' % (src_str, sep, tgt_str) |
| 570 |
|
| 571 |
def __repr__(self): |
| 572 |
return str(self) |
| 573 |
|
| 574 |
def uid(self): |
| 575 |
try: |
| 576 |
return self.uid_ |
| 577 |
except AttributeError: |
| 578 |
m = Utils.md5() |
| 579 |
up = m.update |
| 580 |
up(self.__class__.__name__.encode()) |
| 581 |
for x in self.inputs + self.outputs: |
| 582 |
up(x.abspath().encode()) |
| 583 |
up(self.mode) |
| 584 |
if self.mode == 'remove': |
| 585 |
up(self.header_to_remove.abspath().encode()) |
| 586 |
self.uid_ = m.digest() |
| 587 |
return self.uid_ |
| 588 |
|
| 589 |
def runnable_status(self): |
| 590 |
if self.mode == 'remove': |
| 591 |
if os.path.exists(self.header_to_remove.abspath()): |
| 592 |
return Task.RUN_ME |
| 593 |
else: |
| 594 |
return Task.SKIP_ME |
| 595 |
else: |
| 596 |
return super(ns3privateheader_task, self).runnable_status() |
| 597 |
|
| 598 |
def run(self): |
| 599 |
if self.mode == 'install': |
| 600 |
assert len(self.inputs) == len(self.outputs) |
| 601 |
inputs = [node.abspath() for node in self.inputs] |
| 602 |
outputs = [node.abspath() for node in self.outputs] |
| 603 |
for src, dst in zip(inputs, outputs): |
| 604 |
try: |
| 605 |
os.chmod(dst, 0600) |
| 606 |
except OSError: |
| 607 |
pass |
| 608 |
shutil.copy2(src, dst) |
| 609 |
## make the headers in builddir read-only, to prevent |
| 610 |
## accidental modification |
| 611 |
os.chmod(dst, 0400) |
| 612 |
return 0 |
| 613 |
else: |
| 614 |
assert len(self.inputs) == 0 |
| 615 |
assert len(self.outputs) == 0 |
| 616 |
out_file_name = self.header_to_remove.abspath() |
| 617 |
try: |
| 618 |
os.unlink(out_file_name) |
| 619 |
except OSError, ex: |
| 620 |
if ex.errno != 2: |
| 621 |
raise |
| 622 |
return 0 |
| 623 |
|
| 624 |
|
| 533 |
class gen_ns3_module_header_task(Task.Task): |
625 |
class gen_ns3_module_header_task(Task.Task): |
| 534 |
before = 'cxx' |
626 |
before = 'cxx' |
| 535 |
after = 'ns3header' |
627 |
after = 'ns3header' |
|
|
| 616 |
@TaskGen.after_method('process_rule') |
708 |
@TaskGen.after_method('process_rule') |
| 617 |
def apply_ns3moduleheader(self): |
709 |
def apply_ns3moduleheader(self): |
| 618 |
## get all of the ns3 headers |
710 |
## get all of the ns3 headers |
| 619 |
ns3_dir_node = self.bld.path.find_dir("ns3") |
711 |
ns3_dir_node = self.bld.path.find_or_declare("ns3") |
| 620 |
all_headers_inputs = [] |
712 |
all_headers_inputs = [] |
| 621 |
found_the_module = False |
713 |
found_the_module = False |
| 622 |
for ns3headers in self.bld.all_task_gen: |
714 |
for ns3headers in self.bld.all_task_gen: |