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