freebsd/poudriere

Subpackages use indeterminate queue

bdrewery opened this issue · 6 comments

270784e

@@ -6988,7 +7040,7 @@ gather_port_vars_process_depqueue() {
        [ $# -eq 1 ] || eargs gather_port_vars_process_depqueue originspec
        local originspec="$1"
        local origin pkgname deps dep_origin
-       local dep_originspec dep_flavor queue rdep
+       local dep_originspec dep_flavor dep_subpkg queue rdep
        local fd_devnull

        msg_debug "gather_port_vars_process_depqueue (${COLOR_PORT}${originspec}${COLOR_RESET})"
@@ -7006,13 +7058,13 @@ gather_port_vars_process_depqueue() {
                fd_devnull=5
        fi

-       originspec_decode "${originspec}" origin ''
        for dep_originspec in ${deps}; do
-               originspec_decode "${dep_originspec}" dep_origin dep_flavor
+               originspec_decode "${dep_originspec}" dep_origin dep_flavor dep_subpkg
                # First queue the default origin into the gatherqueue if
                # needed.  For the -a case we're guaranteed to already
                # have done this via the category Makefiles.
-               if [ ${ALL} -eq 0 ]; then
+               # if it's a subpackage process it later
+               if [ ${ALL} -eq 0 ] && [ -z "${dep_subpkg}" ]; then
                        if [ -n "${dep_flavor}" ]; then
                                queue=mqueue
                                rdep="metadata ${dep_flavor} ${originspec}"
@@ -7027,6 +7079,12 @@ gather_port_vars_process_depqueue() {
                            "${rdep}"
                fi

+               if [ -z "${dep_flavor}" ] && [ -n "${dep_subpkg}" ]; then
+                       msg_debug "Want to enqueue ${COLOR_PORT}${dep_originspec}${COLOR_RESET} rdep=${COLOR_PORT}${origin}${COLOR_RESET} into ${queue}"
+                       gather_port_vars_process_depqueue_enqueue \
+                           "${originspec}" "${dep_originspec}" "${queue}" \
+                           "${originspec}"
+               fi
                # Add FLAVOR dependencies into the flavorqueue.
                if [ -n "${dep_flavor}" ]; then
                        # For the -a case we can skip the flavorqueue since

$queue here is not set when there is a $dep_subpkg value.
The queues have very special different handling. It matters which queue an item ends up in.

I tried to understand poudriere internals. but I have to admit that I hit my limits.
The bug is the result of the copy&paste, but I guess it's gqueue.
But, the subpackage should not be built, only the origin should be built once.
I have a couple to test ports I've used to develope the feature you can re-use link

Sorry there's no design doc! The queue is definitely a weird mess that came out of FLAVORS support. Thanks for the overlay. I'll bring those in and add some tests for subpackages. Thanks for your work on this.

Let me know if you need other explanations on how I tried to add subpackage support to poudriere.
In general, the approach should be:

  • a build of a port creates multiple packages (main package + subpacakges), so only one build needs to be queued
  • if a package has a dependency on a subpackage, the whole port of the subpackages has to be built

I've found problematic to manage subpackage's information to manage functions like delete_old_pkg
Maybe subpackages can be added to the meta queue, as only metadata are needed for delete_old_pkg, but I'm not 100% sure on how the mqueue are held.
Adding a subpackage queue seems overkill to me, but maybe a cleaner approach.

I'm pretty sure this is dead code. I put an err 99 dead in there and nothing triggers it. There's no point in doing much here without a full test suite to cover the cases.

To support that it is dead code, this function handles queued items. Subpackages don't get queued. Only the main port does.