build-unit-test-docker: generate package directives

Generate the docker build directives for all packages by
performing a depth-first dependency search.

Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: Ia3b6778e0f15bd9d5c4cff5e5e7bf2a620c0e156
diff --git a/scripts/build-unit-test-docker b/scripts/build-unit-test-docker
index 8784d84..17e5aa9 100755
--- a/scripts/build-unit-test-docker
+++ b/scripts/build-unit-test-docker
@@ -372,6 +372,36 @@
     return result
 
 
+def pkg_generate(pkg):
+    if "__pkg_built" in packages[pkg]:
+        return None
+
+    result = ""
+
+    for deppkg in sorted(packages[pkg].get("depends", [])):
+        dep_build = pkg_generate(deppkg)
+        if not dep_build:
+            continue
+        result += dep_build + "\n"
+
+    result += f"FROM openbmc-base as {pkg_stagename(pkg)}\n"
+    result += pkg_copycmds(pkg)
+    result += pkg_build(pkg)
+
+    packages[pkg]["__pkg_built"] = True
+    return result
+
+
+def pkg_generate_packages():
+    result = ""
+    for pkg in sorted(packages.keys()):
+        build = pkg_generate(pkg)
+        if not build:
+            continue
+        result += build + "\n"
+    return result
+
+
 # Look up the HEAD for missing a static rev.
 pkg_lookups = {}
 for pkg in packages.keys():
@@ -553,105 +583,7 @@
 RUN pip3 install meson==0.54.3
 RUN pip3 install protobuf
 
-FROM openbmc-base as {pkg_stagename('linux-test-project/lcov')}
-{pkg_copycmds('linux-test-project/lcov')}
-{pkg_build('linux-test-project/lcov')}
-
-FROM openbmc-base as {pkg_stagename('Naios/function2')}
-{pkg_copycmds('Naios/function2')}
-{pkg_build('Naios/function2')}
-
-FROM openbmc-base as {pkg_stagename('google/googletest')}
-{pkg_copycmds('google/googletest')}
-{pkg_build('google/googletest')}
-
-FROM openbmc-base as {pkg_stagename('catchorg/Catch2')}
-{pkg_copycmds('catchorg/Catch2')}
-{pkg_build('catchorg/Catch2')}
-
-FROM openbmc-base as {pkg_stagename('USCiLab/cereal')}
-{pkg_copycmds('USCiLab/cereal')}
-{pkg_build('USCiLab/cereal')}
-
-FROM openbmc-base as {pkg_stagename('CLIUtils/CLI11')}
-{pkg_copycmds('CLIUtils/CLI11')}
-{pkg_build('CLIUtils/CLI11')}
-
-FROM openbmc-base as {pkg_stagename('fmtlib/fmt')}
-{pkg_copycmds('fmtlib/fmt')}
-{pkg_build('fmtlib/fmt')}
-
-FROM openbmc-base as {pkg_stagename('nlohmann/json')}
-{pkg_copycmds('nlohmann/json')}
-{pkg_build('nlohmann/json')}
-
-FROM openbmc-base as {pkg_stagename('nlohmann/fifo_map')}
-{pkg_copycmds('nlohmann/fifo_map')}
-{pkg_build('nlohmann/fifo_map')}
-
-FROM openbmc-base as {pkg_stagename('martinmoene/span-lite')}
-{pkg_copycmds('martinmoene/span-lite')}
-{pkg_build('martinmoene/span-lite')}
-
-FROM openbmc-base as {pkg_stagename('openbmc/linux')}
-{pkg_copycmds('openbmc/linux')}
-{pkg_build('openbmc/linux')}
-
-FROM openbmc-base as {pkg_stagename('boost')}
-{pkg_copycmds('boost')}
-{pkg_build('boost')}
-
-FROM openbmc-base as {pkg_stagename('leethomason/tinyxml2')}
-{pkg_copycmds('leethomason/tinyxml2')}
-{pkg_build('leethomason/tinyxml2')}
-
-FROM openbmc-base as {pkg_stagename('CPPAlliance/url')}
-{pkg_copycmds('CPPAlliance/url')}
-{pkg_build('CPPAlliance/url')}
-
-FROM openbmc-base as {pkg_stagename('tristanpenman/valijson')}
-{pkg_copycmds('tristanpenman/valijson')}
-{pkg_build('tristanpenman/valijson')}
-
-FROM openbmc-base as {pkg_stagename('LibVNC/libvncserver')}
-{pkg_copycmds('LibVNC/libvncserver')}
-{pkg_build('LibVNC/libvncserver')}
-
-FROM openbmc-base as {pkg_stagename('openbmc/stdplus')}
-{pkg_copycmds('openbmc/stdplus')}
-{pkg_build('openbmc/stdplus')}
-
-FROM openbmc-base as {pkg_stagename('openbmc/sdbusplus')}
-{pkg_copycmds('openbmc/sdbusplus')}
-{pkg_build('openbmc/sdbusplus')}
-
-FROM openbmc-base as {pkg_stagename('openbmc/sdeventplus')}
-{pkg_copycmds('openbmc/sdeventplus')}
-{pkg_build('openbmc/sdeventplus')}
-
-FROM openbmc-base as {pkg_stagename('openbmc/gpioplus')}
-{pkg_copycmds('openbmc/gpioplus')}
-{pkg_build('openbmc/gpioplus')}
-
-FROM openbmc-base as {pkg_stagename('openbmc/phosphor-dbus-interfaces')}
-{pkg_copycmds('openbmc/phosphor-dbus-interfaces')}
-{pkg_build('openbmc/phosphor-dbus-interfaces')}
-
-FROM openbmc-base as {pkg_stagename('openbmc/phosphor-logging')}
-{pkg_copycmds('openbmc/phosphor-logging')}
-{pkg_build('openbmc/phosphor-logging')}
-
-FROM openbmc-base as {pkg_stagename('openbmc/phosphor-objmgr')}
-{pkg_copycmds('openbmc/phosphor-objmgr')}
-{pkg_build('openbmc/phosphor-objmgr')}
-
-FROM openbmc-base as {pkg_stagename('open-power/pdbg')}
-{pkg_copycmds('open-power/pdbg')}
-{pkg_build('open-power/pdbg')}
-
-FROM openbmc-base as {pkg_stagename('openbmc/pldm')}
-{pkg_copycmds('openbmc/pldm')}
-{pkg_build('openbmc/pldm')}
+{pkg_generate_packages()}
 
 # Build the final output image
 FROM openbmc-base