# # Build script to autogenerate and compile a container image # # Copyright (C) 2009 B Labs # import os import sys import shutil from os.path import join Import('environment') env = environment.Clone() linux_kernel_path = join("/opt/codezero/build/conts/linux/arch/arm/boot/compressed/vmlinux") rootfs_path = join("rootfs/rootfs.elf") container_assembler_body = \ ''' .align 4 .section .img.%d .incbin "%s" ''' container_lds_start = \ '''/* * Autogenerated linker script that embeds each container image. * * Copyright (C) 2009 B Labs */ SECTIONS {''' container_lds_body = \ ''' .img.%d : { *(.img.%d) }''' container_lds_end = \ ''' } ''' # TODO: This might be done much more elegantly and flexibly. # # But it makes sense to put the image finding logic to a function # rather than hard-code it in an array at the beginning. def collect_images(target, source, env): cmd1 = "cp " + linux_kernel_path + " ./" cmd2 = "cp " + rootfs_path + " ./" os.system(cmd1) os.system(cmd2) os.system("echo " + cmd1) os.system("echo " + cmd2) images.append("vmlinux") images.append("rootfs.elf") for i in images: print i def generate_container_assembler(source, target, env): f = open("container.S", "w+") file_body = "" img_i = 0 for img in source: file_body += container_assembler_body % (img_i, img) img_i += 1 f.write(file_body) f.close() def generate_container_lds(source, target, env): f = open("container.lds", "w+") img_i = 0 file_body = container_lds_start for img in source: file_body += container_lds_body % (img_i, img_i) img_i += 1 file_body += container_lds_end f.write(file_body) f.close() linux_builddir="/opt/codezero/build/conts/linux/build" linux_srcdir = "/opt/codezero/conts/linux/linux-2.6.28.10" linux_image = join(linux_builddir, "arch/arm/compressed/vmlinux") def build_linux(source, target, env): cwd = os.getcwd() os.chdir(source[0].path) print target[1].path os.system("mkdir -p " + linux_builddir) os.system("make defconfig " + "ARCH=arm " + "O=" + linux_builddir) os.system("make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- O=" + linux_builddir) os.chdir(cwd) images = [] linux_kernel = env.Command([linux_image, linux_builddir], linux_srcdir, build_linux) #rootfs = env.Command(rootfs_path, "rootfs/rootfs.img", build_rootfs) #env.Command(["vmlinux", "rootfs.elf"], [linux_kernel_path, rootfs_path], collect_images) #container_S = env.Command("container.S", ["vmlinux", "rootfs.elf"], generate_container_assembler) #container_lds = env.Command("container.lds", ["vmlinux", "rootfs.elf"], generate_container_lds) #env.Replace(LINKFLAGS = ['-nostdlib', '-Tcontainer.lds']) #env.Replace(PROGSUFFIX = '.elf') #objs = env.Object('container.S') #container = env.Program('container.elf', objs) #env.Depends(container, [linux_kernel, rootfs, container_S, container_lds]) #image = [] #image.append(File("container.elf")) Return('linux_kernel')