テクノロジー · 実用ガイド
GNU make の jobserver unavailable—-j を足す前に再帰境界を証明する
子 make は調整チャネルを継承できず一つのジョブに退避しました。最初の親レシピかラッパーを追い、対応する境界だけを修復して共有上限を測ります。

GNU make の「jobserver unavailable: using -j1」は、子 make が親の jobserver 接続を十分に継承できず直列実行を続ける意味です。コンパイラ失敗や全階層に独自の -j が必要という証明ではありません。
調整が最初に失われた境界を探します。実際の再帰 make では $(MAKE)、認識に必要な場合だけ +、ラッパーはプロトコルを実装する場合だけ対応を宣言し、単一の最上位制限で検証します。
1. 最初に失われた境界を記録する
元の最上位コマンドで制御ビルドを一度行い、最初の警告、階層、親コマンド、版、ジェネレータ、プロセス木、MAKEFLAGS の形を保存します。後続の警告より最初の喪失点が所有境界です。
make を直接起動するレシピ、シェル、CMake カスタムコマンド、言語ラッパー、コンテナ入口を区別します。生の記述子を報告したり別コマンドにコピーしません。
2. 警告を調整失敗として読む
GNU make は MAKEFLAGS で接続情報を渡し、起動する各コマンドに一つの暗黙スロットを予約します。認識された再帰 make は最上位の上限を共有します。
親が別の make と判断できない場合、子の情報は不完全です。パイプ方式では記述子へアクセスできず、警告して -j1 の直列実行になります。
3. 直接の再帰 make を修復する
子が make なら文字列 make ではなくレシピに $(MAKE) を直接使います。親を起動した実行ファイルと GNU make の再帰意味も維持されます。
先頭の + は間接化された再帰呼び出しを示せますが、dry-run、touch、question の挙動も変えます。MAKE が直接現れない場合か対応ラッパーだけに使います。
4. ラッパーと CMake を明示的に扱う
ラッパーが子を起動する場合、MAKEFLAGS と生きたチャネルの両方を保つか確認します。--jobserver-auth を合成したり親外で記述子番号を再利用しません。
CMake は対応 Makefile ジェネレータで JOB_SERVER_AWARE を使えます。正しく参加できるコマンドだけに設定し、Ninja などは別の並列機構として扱います。
5. 独立した入れ子の -j を既定にしない
警告を消すため全子 make に -jN を付けません。強制した数値 -j は共有モードを無効にし、入れ子全体が CPU やメモリ上限を超え得ます。
可能なら並列度は最上位だけで決めます。外部ラッパーが独自制限を要するなら所有境界、ジェネレータ、版、資源上限を記録します。
6. 共有上限とビルドを検証する
固定した最上位 -j で同じクリーン対象を再実行します。最初の警告が消え、処理が重なり、ピーク数が上限内かを確認し、速度だけを正しさにしません。
通常テストと CI 相当または低メモリビルドを実行し、dry-run の期待も確認します。前後のコマンド、秘匿化した MAKEFLAGS 構造、ログを保存します。
