Added patches from Eric Edgar <e_edgar@hotmail.com> from bug #70663 to separate out...
[catalyst.git] / modules / embedded_target.py
1 # Copyright 1999-2004 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /var/cvsroot/gentoo/src/catalyst/modules/embedded_target.py,v 1.7 2005/01/04 21:13:43 wolf31o2 Exp $
4
5 """
6 This class works like a 'stage3'.  A stage2 tarball is unpacked, but instead
7 of building a stage3, it emerges a 'system' into another directory
8 inside the 'stage2' system.  This way we do not have to emerge gcc/portage
9 into the staged system.
10
11 It sounds real complicated but basically it runs
12 ROOT=/tmp/submerge emerge --blahblah foo bar
13 """
14
15 import os,string,imp,types,shutil
16 from catalyst_support import *
17 from generic_stage_target import *
18 from stat import *
19
20 class embedded_target(generic_stage_target):
21
22     def __init__(self,spec,addlargs):
23         self.required_values=[]
24         self.valid_values=[]
25         self.valid_values.extend(["embedded/empty","embedded/rm","embedded/unmerge","embedded/runscript","embedded/mergeroot","embedded/packages","embedded/use","embedded/fs-type"])
26
27         if addlargs.has_key("embedded/fs-type"):
28             self.valid_values.append("embedded/fs-ops")
29
30         generic_stage_target.__init__(self,spec,addlargs)
31         self.settings["image_path"]=self.settings["storedir"]+"/builds/"+self.settings["target_subpath"]+"/image"       
32                
33     # taken from livecd-stage3 code
34     def unmerge(self):
35             print "Unmerging packages"
36             if self.settings.has_key("embedded/unmerge"):
37                     if type(self.settings["embedded/unmerge"])==types.StringType:
38                             self.settings["embedded/unmerge"]=[self.settings["embedded/unmerge"]]
39                     myunmerge=self.settings["embedded/unmerge"][:]
40                     
41                     for x in range(0,len(myunmerge)):
42                         myunmerge[x]="'"+myunmerge[x]+"'"
43                         myunmerge=string.join(myunmerge)
44                     # before cleaning unmerge stuff
45                     cmd("/bin/bash "+self.settings["sharedir"]+"/targets/"+self.settings["target"]+"/unmerge.sh "+myunmerge,"unmerge script failed.")
46                         
47     def clean(self):
48             if self.settings.has_key("embedded/rm"):
49                     if type(self.settings["embedded/rm"])==types.StringType:
50                             self.settings["embedded/rm"]=[self.settings["embedded/rm"]]
51                             print "Removing directories from image"
52                     for x in self.settings["embedded/rm"]:
53                             print "Removing "+x
54                             os.system("rm -rf "+self.settings["chroot_path"]+"/tmp/mergeroot"+x)
55
56     def build_fs(self):
57         try:
58             if self.settings.has_key("embedded/fs-type"):
59                 cmd("/bin/bash "+self.settings["sharedir"]+"/targets/embedded/embedded.sh package","filesystem packaging failed")
60         except CatalystError:
61                 self.unbind()
62                 raise CatalystError, "embedded filesystem created aborting due to error."
63
64
65     def run_local(self):
66             mypackages=list_bashify(self.settings["embedded/packages"])
67             print "Merging embedded image"
68             try:
69                     cmd("/bin/bash "+self.settings["sharedir"]+"/targets/embedded/embedded.sh run")
70             except CatalystError:
71                     self.unbind()
72                     raise CatalystError, "Embedded build aborted due to error."
73             self.unmerge()
74             self.clean()
75             self.build_fs()
76
77     def set_action_sequence(self):
78         self.settings["action_sequence"]=["dir_setup","unpack_and_bind","chroot_setup",\
79                                         "setup_environment","run_local","unbind","capture"]
80         
81     def set_use(self):
82         self.settings["use"]=self.settings["embedded/use"]
83     def set_stage_path(self):
84         self.settings["stage_path"]=self.settings["chroot_path"]+"/tmp/mergeroot"
85         print "embedded stage path is "+self.settings["stage_path"]
86 def register(foo):
87         foo.update({"embedded":embedded_target})
88         return foo