]> git.proxmox.com Git - grub2.git/blobdiff - gentpl.py
add changelog entry
[grub2.git] / gentpl.py
index f520ebf99511ed1f56947f642d08b9a01d7d9b05..a42a6066748b22c4dca2b3a6c81eb74299fd6400 100644 (file)
--- a/gentpl.py
+++ b/gentpl.py
@@ -10,46 +10,43 @@ GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot",
                    "powerpc_ieee1275" ]
 
 GROUPS = {}
+
+GROUPS["common"]   = GRUB_PLATFORMS[:]
+
+# Groups based on CPU
 GROUPS["i386"]     = [ "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot", "i386_multiboot", "i386_ieee1275" ]
 GROUPS["x86_64"]   = [ "x86_64_efi" ]
 GROUPS["x86"]      = GROUPS["i386"] + GROUPS["x86_64"]
-GROUPS["x86_efi"]  = [ "i386_efi", "x86_64_efi" ]
-
-GROUPS["nopc"] = GRUB_PLATFORMS[:]; GROUPS["nopc"].remove("i386_pc")
-GROUPS["x86_efi_pc"] = GROUPS["x86_efi"] + ["i386_pc"]
-
-GROUPS["x86_noefi"] = GROUPS["x86"][:]; GROUPS["x86_noefi"].remove("i386_efi"); GROUPS["x86_noefi"].remove("x86_64_efi")
-GROUPS["i386_noefi"] = GROUPS["i386"][:]; GROUPS["i386_noefi"].remove("i386_efi")
-
-GROUPS["x86_noieee1275"] = GROUPS["x86"][:]; GROUPS["x86_noieee1275"].remove("i386_ieee1275")
-GROUPS["i386_noieee1275"] = GROUPS["i386"][:]; GROUPS["i386_noieee1275"].remove("i386_ieee1275")
-
-GROUPS["i386_noefi_noieee1275"] = GROUPS["i386_noefi"][:]; GROUPS["i386_noefi_noieee1275"].remove("i386_ieee1275")
-
-GROUPS["i386_pc_qemu_coreboot"] = ["i386_pc", "i386_qemu", "i386_coreboot"]
-GROUPS["i386_coreboot_multiboot"] = ["i386_coreboot", "i386_multiboot"]
-GROUPS["i386_coreboot_multiboot_qemu"] = ["i386_coreboot", "i386_multiboot", "i386_qemu"]
-GROUPS["i386_pc_coreboot_multiboot_qemu"] = ["i386_pc", "i386_coreboot", "i386_multiboot", "i386_qemu"]
-
 GROUPS["mips"]     = [ "mips_yeeloong" ]
 GROUPS["sparc64"]  = [ "sparc64_ieee1275" ]
 GROUPS["powerpc"]  = [ "powerpc_ieee1275" ]
 
-GROUPS["nosparc64"] = GRUB_PLATFORMS[:]; GROUPS["nosparc64"].remove("sparc64_ieee1275")
-GROUPS["x86_noefi_mips"] = GROUPS["x86_noefi"] + GROUPS["mips"]
-
+# Groups based on firmware
+GROUPS["x86_efi"]  = [ "i386_efi", "x86_64_efi" ]
 GROUPS["ieee1275"]   = [ "i386_ieee1275", "sparc64_ieee1275", "powerpc_ieee1275" ]
-GROUPS["noieee1275"] = GRUB_PLATFORMS[:]
-for i in GROUPS["ieee1275"]: GROUPS["noieee1275"].remove(i)
-GROUPS["ieee1275_mips"] = GROUPS["ieee1275"] + GROUPS["mips"]
 
+# emu is a special case so many core functionality isn't needed on this platform
+GROUPS["noemu"]   = GRUB_PLATFORMS[:]; GROUPS["noemu"].remove("emu")
+
+# Groups based on hardware features
+GROUPS["cmos"] = GROUPS["x86"][:] + ["mips_yeeloong"]; GROUPS["cmos"].remove("i386_efi"); GROUPS["cmos"].remove("x86_64_efi")
 GROUPS["pci"]      = GROUPS["x86"] + GROUPS["mips"]
+GROUPS["usb"]      = GROUPS["pci"]
 
-GROUPS["noemu"]   = GRUB_PLATFORMS[:]; GROUPS["noemu"].remove("emu")
-GROUPS["noemu_noieee1275"] = GRUB_PLATFORMS[:]
-for i in ["emu"] + GROUPS["ieee1275"]: GROUPS["noemu_noieee1275"].remove(i)
+# If gfxterm is main output console integrate it into kernel
+GROUPS["videoinkernel"] = ["mips_yeeloong"]
+GROUPS["videomodules"]   = GRUB_PLATFORMS[:];
+for i in GROUPS["videoinkernel"]: GROUPS["videomodules"].remove(i)
 
-GROUPS["common"]   = GRUB_PLATFORMS[:]
+# Similar for terminfo
+GROUPS["terminfoinkernel"] = ["mips_yeeloong"] + GROUPS["ieee1275"];
+GROUPS["terminfomodule"]   = GRUB_PLATFORMS[:];
+for i in GROUPS["terminfoinkernel"]: GROUPS["terminfomodule"].remove(i)
+
+# Miscelaneous groups schedulded to disappear in future
+GROUPS["nosparc64"] = GRUB_PLATFORMS[:]; GROUPS["nosparc64"].remove("sparc64_ieee1275")
+GROUPS["i386_coreboot_multiboot_qemu"] = ["i386_coreboot", "i386_multiboot", "i386_qemu"]
+GROUPS["nopc"] = GRUB_PLATFORMS[:]; GROUPS["nopc"].remove("i386_pc")
 
 #
 # Create platform => groups reverse map, where groups covering that
@@ -78,16 +75,15 @@ for platform in GRUB_PLATFORMS:
 #
 # Global variables
 #
-GVARS = []
+GVARS = set()
 
 def gvar_add(var, value):
-    if var not in GVARS:
-        GVARS.append(var)
+    GVARS.add(var)
     return var + " += " + value + "\n"
 
 def global_variable_initializers():
     r = ""
-    for var in GVARS:
+    for var in sorted(GVARS):
         r += var + " ?= \n"
     return r
 
@@ -95,6 +91,16 @@ def global_variable_initializers():
 # Per PROGRAM/SCRIPT variables 
 #
 
+def vars_init(*var_list):
+    r = "[+ IF (if (not (assoc-ref seen-vars (get \".name\"))) \"seen\") +]"
+    r += "[+ (out-suspend \"v\") +]"
+    for var in var_list:
+        r += var + "  = \n"
+    r += "[+ (out-resume \"v\") +]"
+    r += "[+ (set! seen-vars (assoc-set! seen-vars (get \".name\") 0)) +]"
+    r += "[+ ENDIF +]"
+    return first_time(r)
+
 def var_set(var, value):
     return var + "  = " + value + "\n"
 
@@ -265,6 +271,15 @@ def platform_ccasflags(p): return platform_specific_values(p, "_ccasflags", "cca
 def platform_stripflags(p): return platform_specific_values(p, "_stripflags", "stripflags")
 def platform_objcopyflags(p): return platform_specific_values(p, "_objcopyflags", "objcopyflags")
 
+#
+# Emit snippet only the first time through for the current name.
+#
+def first_time(snippet):
+    r = "[+ IF (if (not (assoc-ref seen-target (get \".name\"))) \"seen\") +]"
+    r += snippet
+    r += "[+ ENDIF +]"
+    return r
+
 def module(platform):
     r = set_canonical_name_suffix(".module")
 
@@ -349,18 +364,25 @@ fi
 
 def library(platform):
     r = set_canonical_name_suffix("")
-    r += gvar_add("noinst_LIBRARIES", "[+ name +]")
-    r += var_set(cname() + "_SOURCES", platform_sources(platform))
-    r += var_set("nodist_" + cname() + "_SOURCES", platform_nodist_sources(platform))
-    r += var_set(cname() + "_CFLAGS", "$(AM_CFLAGS) $(CFLAGS_LIBRARY) " + platform_cflags(platform))
-    r += var_set(cname() + "_CPPFLAGS", "$(AM_CPPFLAGS) $(CPPFLAGS_LIBRARY) " + platform_cppflags(platform))
-    r += var_set(cname() + "_CCASFLAGS", "$(AM_CCASFLAGS) $(CCASFLAGS_LIBRARY) " + platform_ccasflags(platform))
-    # r += var_set(cname() + "_DEPENDENCIES", platform_dependencies(platform) + " " + platform_ldadd(platform))
 
-    r += gvar_add("EXTRA_DIST", extra_dist())
-    r += gvar_add("BUILT_SOURCES", "$(nodist_" + cname() + "_SOURCES)")
-    r += gvar_add("CLEANFILES", "$(nodist_" + cname() + "_SOURCES)")
+    r += vars_init(cname() + "_SOURCES",
+                   "nodist_" + cname() + "_SOURCES",
+                   cname() + "_CFLAGS",
+                   cname() + "_CPPFLAGS",
+                   cname() + "_CCASFLAGS")
+    #              cname() + "_DEPENDENCIES")
 
+    r += first_time(gvar_add("noinst_LIBRARIES", "[+ name +]"))
+    r += var_add(cname() + "_SOURCES", platform_sources(platform))
+    r += var_add("nodist_" + cname() + "_SOURCES", platform_nodist_sources(platform))
+    r += var_add(cname() + "_CFLAGS", first_time("$(AM_CFLAGS) $(CFLAGS_LIBRARY) ") + platform_cflags(platform))
+    r += var_add(cname() + "_CPPFLAGS", first_time("$(AM_CPPFLAGS) $(CPPFLAGS_LIBRARY) ") + platform_cppflags(platform))
+    r += var_add(cname() + "_CCASFLAGS", first_time("$(AM_CCASFLAGS) $(CCASFLAGS_LIBRARY) ") + platform_ccasflags(platform))
+    # r += var_add(cname() + "_DEPENDENCIES", platform_dependencies(platform) + " " + platform_ldadd(platform))
+
+    r += gvar_add("EXTRA_DIST", extra_dist())
+    r += first_time(gvar_add("BUILT_SOURCES", "$(nodist_" + cname() + "_SOURCES)"))
+    r += first_time(gvar_add("CLEANFILES", "$(nodist_" + cname() + "_SOURCES)"))
     return r
 
 def installdir(default="bin"):
@@ -384,7 +406,7 @@ def program(platform, test=False):
     r += gvar_add("check_PROGRAMS", "[+ name +]")
     r += gvar_add("TESTS", "[+ name +]")
     r += "[+ ELSE +]"
-    r += gvar_add(installdir() + "_PROGRAMS", "[+ name +]")
+    r += var_add(installdir() + "_PROGRAMS", "[+ name +]")
     r += "[+ IF mansection +]" + manpage() + "[+ ENDIF +]"
     r += "[+ ENDIF +]"
 
@@ -405,7 +427,7 @@ def program(platform, test=False):
 def data(platform):
     r  = gvar_add("EXTRA_DIST", platform_sources(platform))
     r += gvar_add("EXTRA_DIST", extra_dist())
-    r += gvar_add(installdir() + "_DATA", platform_sources(platform))
+    r += var_add(installdir() + "_DATA", platform_sources(platform))
     return r
 
 def script(platform):
@@ -413,7 +435,7 @@ def script(platform):
     r += gvar_add("check_SCRIPTS", "[+ name +]")
     r += gvar_add ("TESTS", "[+ name +]")
     r += "[+ ELSE +]"
-    r += gvar_add(installdir() + "_SCRIPTS", "[+ name +]")
+    r += var_add(installdir() + "_SCRIPTS", "[+ name +]")
     r += "[+ IF mansection +]" + manpage() + "[+ ENDIF +]"
     r += "[+ ENDIF +]"
 
@@ -423,36 +445,46 @@ chmod a+x [+ name +]
 """)
 
     r += gvar_add("CLEANFILES", "[+ name +]")
-    r += gvar_add("EXTRA_DIST", platform_sources(platform))
+    r += gvar_add("dist_noinst_DATA", platform_sources(platform))
+    return r
+
+def rules(target, closure):
+    # Create association lists for the benefit of first_time and vars_init.
+    r = "[+ (define seen-target '()) +]"
+    r += "[+ (define seen-vars '()) +]"
+    # Most output goes to a diversion.  This allows us to emit variable
+    # initializations before everything else.
+    r += "[+ (out-push-new) +]"
+
+    r += "[+ FOR " + target + " +]"
+    r += foreach_enabled_platform(
+        lambda p: under_platform_specific_conditionals(p, closure(p)))
+    # Remember that we've seen this target.
+    r += "[+ (set! seen-target (assoc-set! seen-target (get \".name\") 0)) +]"
+    r += "[+ ENDFOR +]"
+    r += "[+ (out-pop #t) +]"
     return r
 
 def module_rules():
-    return "[+ FOR module +]" + foreach_enabled_platform(
-        lambda p: under_platform_specific_conditionals(p, module(p))) + "[+ ENDFOR +]"
+    return rules("module", module)
 
 def kernel_rules():
-    return "[+ FOR kernel +]" + foreach_enabled_platform(
-        lambda p: under_platform_specific_conditionals(p, kernel(p))) + "[+ ENDFOR +]"
+    return rules("kernel", kernel)
 
 def image_rules():
-    return "[+ FOR image +]" + foreach_enabled_platform(
-        lambda p: under_platform_specific_conditionals(p, image(p))) + "[+ ENDFOR +]"
+    return rules("image", image)
 
 def library_rules():
-    return "[+ FOR library +]" + foreach_enabled_platform(
-        lambda p: under_platform_specific_conditionals(p, library(p))) + "[+ ENDFOR +]"
+    return rules("library", library)
 
 def program_rules():
-    return "[+ FOR program +]" + foreach_enabled_platform(
-        lambda p: under_platform_specific_conditionals(p, program(p))) + "[+ ENDFOR +]"
+    return rules("program", program)
 
 def script_rules():
-    return "[+ FOR script +]" + foreach_enabled_platform(
-        lambda p: under_platform_specific_conditionals(p, script(p))) + "[+ ENDFOR +]"
+    return rules("script", script)
 
 def data_rules():
-    return "[+ FOR data +]" + foreach_enabled_platform(
-        lambda p: under_platform_specific_conditionals(p, data(p))) + "[+ ENDFOR +]"
+    return rules("data", data)
 
 print "[+ AutoGen5 template +]\n"
 a = module_rules()