Index: embedded_target.py =================================================================== RCS file: /var/cvsroot/gentoo/src/catalyst/modules/embedded_target.py,v retrieving revision 1.6 diff -u -B -r1.6 embedded_target.py --- embedded_target.py 17 Dec 2004 21:18:06 -0000 1.6 +++ embedded_target.py 4 Jan 2005 00:34:07 -0000 @@ -1,6 +1,6 @@ -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/modules/embedded_target.py,v 1.6 2004/12/17 21:18:06 wolf31o2 Exp $ +# Distributed under the GNU General Public License version 2 +# Copyright 2003-2004 Gentoo Technologies, Inc. +# $Header: /home/cvsroot/gentoo/src/catalyst/modules/embedded_target.py,v 1.1 2004/05/17 01:21:17 zhen Exp $ """ This class works like a 'stage3'. A stage2 tarball is unpacked, but instead @@ -22,11 +21,28 @@ def __init__(self,spec,addlargs): self.required_values=[] self.valid_values=[] - self.valid_values.extend(["embedded/empty","embedded/rm","embedded/unmerge","embedded/runscript","embedded/mergeroot","embedded/packages","embedded/use","embedded/fs-type"]) + self.valid_values.extend(["embedded/empty","embedded/rm","embedded/unmerge","embedded/fs-prepare","embedded/fs-finish","embedded/mergeroot","embedded/packages","embedded/use","embedded/fs-type","boot/kernel"]) if addlargs.has_key("embedded/fs-type"): self.valid_values.append("embedded/fs-ops") + # this kernel code is also from livecd stage2 + + if addlargs.has_key("boot/kernel"): + if type(addlargs["boot/kernel"]) == types.StringType: + loopy=[addlargs["boot/kernel"]] + else: + loopy=addlargs["boot/kernel"] + + for x in loopy: + self.required_values.append("boot/kernel/"+x+"/sources") + self.required_values.append("boot/kernel/"+x+"/config") + self.valid_values.append("boot/kernel/"+x+"/extraversion") + self.valid_values.append("boot/kernel/"+x+"/packages") + self.valid_values.append("boot/kernel/"+x+"/use") + self.valid_values.append("boot/kernel/"+x+"/gk_kernargs") + self.valid_values.append("boot/kernel/"+x+"/gk_action") + generic_stage_target.__init__(self,spec,addlargs) self.settings["image_path"]=self.settings["storedir"]+"/builds/"+self.settings["target_subpath"]+"/image" @@ -59,8 +75,91 @@ cmd("/bin/bash "+self.settings["sharedir"]+"/targets/embedded/embedded.sh package","filesystem packaging failed") except CatalystError: self.unbind() - raise CatalystError, "embedded filesystem created aborting due to error." + raise CatalystError, "embedded filesystem creation aborting due to error." + # this code is mostly duplication from the livecd stage2 module + def pre_build_fs(self): + try: + if self.settings.has_key("embedded/fs-prepare"): + cmd("/bin/bash "+self.settings["embedded/fs-prepare"], "pre filesystem packaging cause an error in execution") + except CatalystError: + self.unbind() + raise CatalystError, "embedded pre filesystem creation script aborting due to error" + + def post_build_fs(self): + try: + if self.settings.has_key("embedded/fs-finish"): + cmd("/bin/bash "+self.settings["embedded/fs-finish"], "pre filesystem packaging cause an error in execution") + except CatalystError: + self.unbind() + raise CatalystError, "embedded post filesystem creation script aborting due to error" + + def build_kernel(self): + mynames=self.settings["boot/kernel"] + if type(mynames)==types.StringType: + mynames=[mynames] + args=[] + args.append(`len(mynames)`) + + for kname in mynames: + args.append(kname) + args.append(self.settings["boot/kernel/"+kname+"/sources"]) + try: + if not os.path.exists(self.settings["boot/kernel/"+kname+"/config"]): + self.unbind() + raise CatalystError, "Can't find kernel config: " \ + +self.settings["boot/kernel/"+kname+"/config"] + + except TypeError: + raise CatalystError, "Required value boot/kernel/config not specified" + + if self.settings.has_key("boot/kernel/"+kname+"/extraversion"): + args.append(self.settings["boot/kernel/"+kname+"/extraversion"]) + else: + args.append("NULL_VALUE") + if self.settings.has_key("boot/kernel/"+kname+"/gk_action"): + args.append(self.settings["boot/kernel/"+kname+"/gk_action"]) + + for extra in ["use","packages","gk_kernargs"]: + if self.settings.has_key("boot/kernel/"+kname+"/"+extra): + myex=self.settings["boot/kernel/"+kname+"/"+extra] + if type(myex)==types.ListType: + myex=string.join(myex) + try: + myf=open(self.settings["chroot_path"]+"/var/tmp/"+kname+"."+extra,"w") + except: + self.unbind() + raise CatalystError,"Couldn't create file /var/tmp/"+kname+"."+extra+" in chroot." + if extra=="use": + myf.write("export USE=\""+myex+"\"\n") + if extra=="gk_kernargs": + myf.write("export clst_embedded_gk_kernargs=\""+myex+"\"\n") + else: + myf.write(myex+"\n") + myf.close() + try: + cmd("cp "+self.settings["boot/kernel/"+kname+"/config"]+" "+ \ + self.settings["chroot_path"]+"/var/tmp/"+kname+".config", \ + "Couldn't copy kernel config: "+self.settings["boot/kernel/"+kname+"/config"]) + + except CatalystError: + self.unbind() + + # If we need to pass special options to the bootloader + # for this kernel put them into the environment. + if self.settings.has_key("boot/kernel/"+kname+"/kernelopts"): + myopts=self.settings["boot/kernel/"+kname+"/kernelopts"] + + if type(myopts) != types.StringType: + myopts = string.join(myopts) + os.putenv(kname+"_kernelopts", myopts) + + else: + os.putenv(kname+"_kernelopts", "") + + # execute the script that builds the kernel + cmd("/bin/bash "+self.settings["sharedir"]+"/targets/embedded/embedded.sh kernel "+list_bashify(args), + "Runscript kernel build failed") def run_local(self): mypackages=list_bashify(self.settings["embedded/packages"]) @@ -70,9 +169,16 @@ except CatalystError: self.unbind() raise CatalystError, "Embedded build aborted due to error." + + if self.settings.has_key("boot/kernel"): + self.build_kernel() + self.unmerge() self.clean() + + self.pre_build_fs() self.build_fs() + self.post_build_fs() def register(foo): foo.update({"embedded":embedded_target})