From 87e7c5f00a04a1f4c99b71e7a8817236d43721ef Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Wed, 9 May 2018 10:16:44 -0700 Subject: [PATCH] Updating wscripts to use custom tasks --- src/boot/wscript | 40 +++++++++++++++++++++++++++------------- src/kernel/wscript | 25 ++++++++++++++++++++----- wscript | 45 +++++++++++++++++++++++++++++++++------------ 3 files changed, 80 insertions(+), 30 deletions(-) diff --git a/src/boot/wscript b/src/boot/wscript index 8661198..5c54ecd 100644 --- a/src/boot/wscript +++ b/src/boot/wscript @@ -17,14 +17,6 @@ def configure(ctx): '-T', lds_path, ]) ctx.env.append_value('SECTIONS_EFI', [ - "-j .text", - "-j .sdata", - "-j .data", - "-j .dynamic", - "-j .dynsym", - "-j .rel", - "-j .rela", - "-j .reloc", ]) def build(bld): @@ -37,11 +29,33 @@ def build(bld): use = 'EFI', ) - bld( - rule = "${objcopy} ${SECTIONS_EFI} --target=efi-app-${POPCORN_ARCH} ${SRC} ${TGT}", - source = "boot.elf", - target = "boot.efi", - ) + from waflib.Task import Task + class make_efi(Task): + color = 'YELLOW' + def keyword(self): + return "Creating" + def __str__(self): + node = self.outputs[0] + return node.path_from(node.ctx.launch_node()) + def run(self): + from subprocess import check_call as call + + args = self.env.objcopy + sections = [".text", ".sdata", ".data", ".dynamic", + ".dynsym", ".rel", ".rela", ".reloc"] + for s in sections: args.extend(['-j', s]) + args.append('--target=efi-app-' + self.env.POPCORN_ARCH) + args.append(self.inputs[0].abspath()) + args.append(self.outputs[0].abspath()) + call(args) + + src = bld.path + out = bld.path.get_bld() + + efi = make_efi(env=bld.env) + efi.set_inputs([out.make_node("boot.elf")]) + efi.set_outputs([out.make_node("boot.efi")]) + bld.add_to_group(efi) # vim: ft=python et sw=4 diff --git a/src/kernel/wscript b/src/kernel/wscript index 3cc343e..15bd634 100644 --- a/src/kernel/wscript +++ b/src/kernel/wscript @@ -19,10 +19,25 @@ def build(bld): linkflags = "-T {}".format(lds), ) - bld( - source = bld.env.KERNEL_FILENAME, - target = "{}/kernel.dump".format(bld.out_dir), - rule = "objdump -D ${SRC} > ${TGT}", - ) + from waflib.Task import Task + class objdump(Task): + color = 'PINK' + def keyword(self): + return "Dumping" + def __str__(self): + node = self.outputs[0] + return node.path_from(node.ctx.launch_node()) + def run(self): + from subprocess import check_output + args = self.env.objdump + ["-D", self.inputs[0].abspath()] + with file(self.outputs[0].abspath(), 'w') as output: + output.write(check_output(args)) + + out = bld.path.get_bld() + + dump = objdump(env=bld.env) + dump.set_inputs([out.make_node(bld.env.KERNEL_FILENAME)]) + dump.set_outputs([out.make_node("kernel.dump")]) + bld.add_to_group(dump) # vim: ft=python et diff --git a/wscript b/wscript index 1dc5be8..8645afa 100644 --- a/wscript +++ b/wscript @@ -188,12 +188,15 @@ def build(bld): bld.recurse(join("src", "kernel")) src = bld.path - out = bld.root.make_node(bld.out_dir) + out = bld.path.get_bld() kernel_name = bld.env.KERNEL_FILENAME + image = out.make_node("popcorn.img") + font = out.make_node("screenfont.psf") + bld( source = src.make_node(join("assets", "floppy.img")), - target = out.make_node("popcorn.img"), + target = image, rule = "cp ${SRC} ${TGT}", ) @@ -204,18 +207,36 @@ def build(bld): ) bld( - source = [ - out.make_node(join("src", "boot", "boot.efi")), - out.make_node(join("src", "kernel", kernel_name)), - src.make_node(join("assets", "fonts", bld.env.FONT_NAME)), - ], - rule = "; ".join([ - "${mcopy} -i popcorn.img ${SRC[0]} ::/efi/boot/bootx64.efi", - "${mcopy} -i popcorn.img ${SRC[1]} ::/", - "${mcopy} -i popcorn.img ${SRC[2]} ::/screenfont.psf", - ]), + source = src.make_node(join("assets", "fonts", bld.env.FONT_NAME)), + target = font, + rule = "cp ${SRC} ${TGT}", ) + from waflib.Task import Task + class mcopy(Task): + color = 'YELLOW' + def keyword(self): + return "Updating" + def __str__(self): + node = self.inputs[0] + return node.path_from(node.ctx.launch_node()) + def run(self): + from subprocess import check_call as call + args = self.env.mcopy + ["-i", self.inputs[0].abspath(), "-D", "o"] + b_args = args + [self.inputs[1].abspath(), "::/efi/boot/bootx64.efi"] + call(b_args) + for inp in self.inputs[2:]: + call(args + [inp.abspath(), "::/"]) + + copy_img = mcopy(env = bld.env) + copy_img.set_inputs([ + image, + out.make_node(join("src", "boot", "boot.efi")), + out.make_node(join("src", "kernel", kernel_name)), + font, + ]) + bld.add_to_group(copy_img) + elif bld.variant == 'tests': for mod_path in bld.env.MODULES: bld.recurse(mod_path)