Skip to content

the family root's Makefile: under make -jN, every member's make warns jobserver unavailable: using -j1 and runs one job at a time #888

Closed

Description

@brettheap

Goal: a person who types make -j4 bootstrap (or validate, siblings, park, resume) at a family root either gets the jobs they asked for in each member, or no warning that blames a rule they never wrote.

Filed by lane openRepoShape-5, from rv884's checklist candidate C1 in its review of #886 (#884), #886 issuecomment-6248806027. It is older than #884: rv884 measured it on 281df263 and on #886's head 82a84f88, under GNU Make 4.3.

Line

  • Under the holder's make -j2 bootstrap, every member's make prints make[1]: warning: jobserver unavailable: using -j1. Add '+' to parent make rule. and runs serially.
    • The holder's bootstrap: rule (templates/family-root/Makefile) runs $(PYTHON) scripts/bootstrap.py, with no + and no $(MAKE), so make does not pass the jobserver to it. run_make's Popen (templates/family-root/scripts/bootstrap.py) also closes every file descriptor past stderr by default.
    • The member's make still finds -j and --jobserver-auth in the MAKEFLAGS it inherits, cannot open the jobserver, and warns.
    • The warning tells the person to edit "the parent make rule". That rule is the holder's pinned Makefile, which the person does not own.
    • The same holds for validate (bootstrap.py --members-make validate) and for siblings.py's member makes (siblings, park, resume). That is read from the Makefile, not run.
    • Direction, one of:
      • mark the holder's member-running rules with + and pass the jobserver's descriptors through (pass_fds), so each member's make gets jobs;
      • or take -j and the jobserver out of the MAKEFLAGS a member's make inherits, so it runs serially with no warning;
      • or document that members run one job at a time.

Verify:

  • Under make -j2 bootstrap at a holder with a member whose bootstrap target has two independent prerequisites, no jobserver unavailable line is printed. Its two jobs either run together or are documented as serial.
  • tests/test_family_holder_bootstrap_texts.py, tests/test_family_bootstrap_gate_order.py and the trio pass.
  • If the Makefile or bootstrap.py changes, each holder takes one upstream-changed row per pinned file (FAMILY_COPIED_VERBATIM).

Milestone: none set; lane 3's call. A warning and serial member runs under -j only. It is not a regression, and no verdict changes.

🤖 Generated with Claude Code

Activity

  1. brettheap commented on Oct 18, 2026

    @brettheap
    ContributorAuthor

    CLAIMED — lane openRepoShape-4, session 11c6c0ef-495a-4a05-94cf-811b7b0a1012@Eagle, 2026-10-18T14:13:36Z, for #888

    Logged in lanes/log/openRepoShape-4.md at e14d599b50c4e9f90941eb87b4a617d96a368230.

    The three reads (lane-collision-protocol Rule 1):

    1. existing `CLAIMED —` comments on opensoft/openRepoShape#888:
       none
    2. `gh pr list --repo opensoft/openRepoShape --state all --search "#888"`, kept where the row or its body names `#888`:
       none
    3. `git ls-remote --heads git@github.com:opensoft/openRepoShape` branches naming `888` as a whole token:
       none
    
  2. added this to the v1.2.0 milestone on Oct 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions