commit:     4d0b925842bb8e16e4c561b1ebe9d653da97e176
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Sat Feb 14 18:35:57 2015 +0000
Commit:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Sat Mar 28 03:04:39 2015 +0000
URL:        https://gitweb.gentoo.org/proj/catalyst.git/commit/?id=4d0b9258

modules/generic_stage_target.py: handle USE_EXPAND flags

Currently catalyst does not handle USE_EXPAND flags.  However, the
recent move of mmx, sse and friends from the global USE flags to the
new CPU_FLAGS_X86 USE_EXPAND flag requires this.

This commit adds code to handle a new syntax for self.setting[x] values
which can now contain dictionaries to objects.  We use these to build
environment variables for USE_EXPAND flags.  Eg. in arch/amd64.py
we set

 self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","sse","sse2"]}

which is later exported in the environtment as:

    clst_HOSTUSEEXPAND="CPU_FLAGS_X86"

and

    clst_CPU_FLAGS_X86="mmx sse sse2"

In general one could have:

  self.settings["A"]={"B":[1,2,3],"C":[4,5,6]}

which would export

 clst_A="B C"

and

 clst_B="1 2 3"
 clst_C="4 5 6"

Signed-off-by: Anthony G. Basile <blueness <AT> gentoo.org>

 catalyst/arch/amd64.py          | 14 +++++++-------
 catalyst/arch/x86.py            | 20 ++++++++++----------
 catalyst/base/stagebase.py      | 31 ++++++++++++++++++++++++++++++-
 targets/stage1/stage1-chroot.sh | 13 ++++++++++++-
 4 files changed, 59 insertions(+), 19 deletions(-)

diff --git a/catalyst/arch/amd64.py b/catalyst/arch/amd64.py
index 13e7563..dccfa46 100644
--- a/catalyst/arch/amd64.py
+++ b/catalyst/arch/amd64.py
@@ -13,7 +13,7 @@ class arch_amd64(generic_amd64):
                generic_amd64.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -pipe"
                self.settings["CHOST"]="x86_64-pc-linux-gnu"
-               self.settings["HOSTUSE"]=["mmx","sse","sse2"]
+               
self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","sse","sse2"]}
 
 class arch_nocona(generic_amd64):
        "improved version of Intel Pentium 4 CPU with 64-bit extensions, MMX, 
SSE, SSE2 and SSE3 support"
@@ -21,7 +21,7 @@ class arch_nocona(generic_amd64):
                generic_amd64.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=nocona -pipe"
                self.settings["CHOST"]="x86_64-pc-linux-gnu"
-               self.settings["HOSTUSE"]=["mmx","sse","sse2"]
+               
self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","sse","sse2"]}
 
 # Requires gcc 4.3 to use this class
 class arch_core2(generic_amd64):
@@ -30,7 +30,7 @@ class arch_core2(generic_amd64):
                generic_amd64.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=core2 -pipe"
                self.settings["CHOST"]="x86_64-pc-linux-gnu"
-               self.settings["HOSTUSE"]=["mmx","sse","sse2","ssse3"]
+               
self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","sse","sse2","ssse3"]}
 
 class arch_k8(generic_amd64):
        "generic k8, opteron and athlon64 support"
@@ -38,7 +38,7 @@ class arch_k8(generic_amd64):
                generic_amd64.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=k8 -pipe"
                self.settings["CHOST"]="x86_64-pc-linux-gnu"
-               self.settings["HOSTUSE"]=["mmx","sse","sse2","3dnow"]
+               
self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","sse","sse2","3dnow"]}
 
 class arch_k8_sse3(generic_amd64):
        "improved versions of k8, opteron and athlon64 with SSE3 support"
@@ -46,7 +46,7 @@ class arch_k8_sse3(generic_amd64):
                generic_amd64.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=k8-sse3 -pipe"
                self.settings["CHOST"]="x86_64-pc-linux-gnu"
-               self.settings["HOSTUSE"]=["mmx","sse","sse2","3dnow"]
+               
self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","sse","sse2","3dnow"]}
 
 class arch_amdfam10(generic_amd64):
        "AMD Family 10h core based CPUs with x86-64 instruction set support"
@@ -54,7 +54,7 @@ class arch_amdfam10(generic_amd64):
                generic_amd64.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=amdfam10 -pipe"
                self.settings["CHOST"]="x86_64-pc-linux-gnu"
-               self.settings["HOSTUSE"]=["mmx","sse","sse2","3dnow"]
+               
self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","sse","sse2","3dnow"]}
 
 class arch_x32(generic_amd64):
        "builder class for generic x32 (Intel and AMD)"
@@ -62,7 +62,7 @@ class arch_x32(generic_amd64):
                generic_amd64.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -pipe"
                self.settings["CHOST"]="x86_64-pc-linux-gnux32"
-               self.settings["HOSTUSE"]=["mmx","sse","sse2"]
+               
self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","sse","sse2"]}
 
 def register():
        "inform main catalyst program of the contents of this plugin"

diff --git a/catalyst/arch/x86.py b/catalyst/arch/x86.py
index 9f1bba2..08ba6d4 100644
--- a/catalyst/arch/x86.py
+++ b/catalyst/arch/x86.py
@@ -57,42 +57,42 @@ class arch_pentium_mmx(generic_x86):
        def __init__(self,myspec):
                generic_x86.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=pentium-mmx -pipe"
-               self.settings["HOSTUSE"]=["mmx"]
+               self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx"]}
 
 class arch_pentium2(generic_x86):
        "Intel Pentium 2 CPU with MMX support"
        def __init__(self,myspec):
                generic_x86.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=pentium2 -pipe"
-               self.settings["HOSTUSE"]=["mmx"]
+               self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx"]}
 
 class arch_pentium3(generic_x86):
        "Intel Pentium 3 CPU with MMX and SSE support"
        def __init__(self,myspec):
                generic_x86.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=pentium3 -pipe"
-               self.settings["HOSTUSE"]=["mmx","sse"]
+               self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","sse"]}
 
 class arch_pentium4(generic_x86):
        "Intel Pentium 4 CPU with MMX, SSE and SSE2 support"
        def __init__(self,myspec):
                generic_x86.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=pentium4 -pipe"
-               self.settings["HOSTUSE"]=["mmx","sse","sse2"]
+               
self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","sse","sse2"]}
 
 class arch_pentium_m(generic_x86):
        "Intel Pentium M CPU with MMX, SSE and SSE2 support"
        def __init__(self,myspec):
                generic_x86.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=pentium-m -pipe"
-               self.settings["HOSTUSE"]=["mmx","sse","sse2"]
+               
self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","sse","sse2"]}
 
 class arch_prescott(generic_x86):
        "improved version of Intel Pentium 4 CPU with MMX, SSE, SSE2 and SSE3 
support"
        def __init__(self,myspec):
                generic_x86.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=prescott -pipe"
-               self.settings["HOSTUSE"]=["mmx","sse","sse2"]
+               
self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","sse","sse2"]}
                self.settings["CHOST"]="i686-pc-linux-gnu"
 
 class arch_k6(generic_x86):
@@ -101,7 +101,7 @@ class arch_k6(generic_x86):
                generic_x86.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=k6 -pipe"
                self.settings["CHOST"]="i686-pc-linux-gnu"
-               self.settings["HOSTUSE"]=["mmx"]
+               self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx"]}
 
 class arch_k6_2(generic_x86):
        "AMD K6-2 CPU with MMX and 3dNOW! support"
@@ -109,7 +109,7 @@ class arch_k6_2(generic_x86):
                generic_x86.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=k6-2 -pipe"
                self.settings["CHOST"]="i686-pc-linux-gnu"
-               self.settings["HOSTUSE"]=["mmx","3dnow"]
+               self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","3dnow"]}
 
 class arch_athlon(generic_x86):
        "AMD Athlon CPU with MMX, 3dNOW!, enhanced 3dNOW! and SSE prefetch 
support"
@@ -117,7 +117,7 @@ class arch_athlon(generic_x86):
                generic_x86.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=athlon -pipe"
                self.settings["CHOST"]="i686-pc-linux-gnu"
-               self.settings["HOSTUSE"]=["mmx","3dnow"]
+               self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","3dnow"]}
 
 class arch_athlon_xp(generic_x86):
        "improved AMD Athlon CPU with MMX, 3dNOW!, enhanced 3dNOW! and full SSE 
support"
@@ -125,7 +125,7 @@ class arch_athlon_xp(generic_x86):
                generic_x86.__init__(self,myspec)
                self.settings["CFLAGS"]="-O2 -march=athlon-xp -pipe"
                self.settings["CHOST"]="i686-pc-linux-gnu"
-               self.settings["HOSTUSE"]=["mmx","3dnow","sse"]
+               
self.settings["HOSTUSEEXPAND"]={"CPU_FLAGS_X86":["mmx","3dnow","sse"]}
 
 def register():
        "Inform main catalyst program of the contents of this plugin."

diff --git a/catalyst/base/stagebase.py b/catalyst/base/stagebase.py
index 5200182..644bd7c 100644
--- a/catalyst/base/stagebase.py
+++ b/catalyst/base/stagebase.py
@@ -1089,7 +1089,7 @@ class StageBase(TargetBase, ClearBase, GenBase):
                                myusevars.extend(self.settings["use"])
 
                        if myusevars:
-                               myf.write("# These are the USE flags that were 
used in addition to what is provided by the\n# profile used for building.\n")
+                               myf.write("# These are the USE and USE_EXPAND 
flags that were used for\n# buidling in addition to what is provided by the 
profile.\n")
                                myusevars = sorted(set(myusevars))
                                myf.write('USE="'+string.join(myusevars)+'"\n')
                                if '-*' in myusevars:
@@ -1098,6 +1098,15 @@ class StageBase(TargetBase, ClearBase, GenBase):
                                                "/use will cause portage to 
ignore"
                                        print "\tpackage.use in the profile and 
portage_confdir. You've been warned!"
 
+                       myuseexpandvars={}
+                       if "HOSTUSEEXPAND" in self.settings:
+                               for hostuseexpand in 
self.settings["HOSTUSEEXPAND"]:
+                                       
myuseexpandvars.update({hostuseexpand:self.settings["HOSTUSEEXPAND"][hostuseexpand]})
+
+                       if myuseexpandvars:
+                               for hostuseexpand in myuseexpandvars:
+                                       
myf.write(hostuseexpand+'="'+string.join(myuseexpandvars[hostuseexpand])+'"\n')
+
                        myf.write('PORTDIR="%s"\n' % self.settings['portdir'])
                        myf.write('DISTDIR="%s"\n' % self.settings['distdir'])
                        myf.write('PKGDIR="%s"\n' % self.settings['packagedir'])
@@ -1306,6 +1315,26 @@ class StageBase(TargetBase, ClearBase, GenBase):
                                        self.env[varname] = "true"
                                else:
                                        self.env[varname] = "false"
+                       # This handles a dictionary of objects just one level 
deep and no deeper!
+                       # Its currently used only for USE_EXPAND flags which 
are dictionaries of
+                       # lists in arch/amd64.py and friends.  If we wanted 
self.settigs[var]
+                       # of any depth, we should make this function recursive.
+                       elif type(self.settings[x]) == types.DictType:
+                               self.env[varname] = 
string.join(self.settings[x].keys())
+                               for y in self.settings[x].keys():
+                                       varname2 = 
"clst_"+string.replace(y,"/","_")
+                                       varname2 = 
string.replace(varname2,"-","_")
+                                       varname2 = 
string.replace(varname2,".","_")
+                                       if type(self.settings[x][y]) == 
types.StringType:
+                                               self.env[varname2] = 
self.settings[x][y]
+                                       elif type(self.settings[x][y]) == 
types.ListType:
+                                               self.env[varname2] = 
string.join(self.settings[x][y])
+                                       elif type(self.settings[x][y]) == 
types.BooleanType:
+                                               if self.settings[x][y]:
+                                                       self.env[varname] = 
"true"
+                                               else:
+                                                       self.env[varname] = 
"false"
+
                if "makeopts" in self.settings:
                        self.env["MAKEOPTS"]=self.settings["makeopts"]
                #print "setup_environment(); env =", self.env

diff --git a/targets/stage1/stage1-chroot.sh b/targets/stage1/stage1-chroot.sh
index eccbd3f..f79f360 100755
--- a/targets/stage1/stage1-chroot.sh
+++ b/targets/stage1/stage1-chroot.sh
@@ -54,9 +54,20 @@ run_merge "--oneshot --nodeps sys-apps/baselayout"
 sed -i '/USE="${USE} -build"/d' /etc/portage/make.conf
 
 # Now, we install our packages
-[ -e /etc/portage/make.conf ] && \
+if [ -e /etc/portage/make.conf ]; then
        echo "USE=\"-* build ${BOOTSTRAP_USE} ${clst_HOSTUSE}\"" \
        >> /etc/portage/make.conf
+       for useexpand in "${clst_HOSTUSEEXPAND}"; do
+               x="clst_${useexpand}"
+               echo "${useexpand}=\"${!x}\"" \
+               >> /etc/portage/make.conf
+       done
+fi
 run_merge "--oneshot ${clst_buildpkgs}"
 sed -i "/USE=\"-* build ${BOOTSTRAP_USE} ${clst_HOSTUSE}\"/d" \
        /etc/portage/make.conf
+for useexpand in "${clst_HOSTUSEEXPAND}"; do
+       x="clst_${useexpand}"
+       sed -i "${useexpand}=\"${!x}\"" \
+       /etc/portage/make.conf
+done

Reply via email to