makefile内のターゲットのリストをどのように取得しますか?



How Do You Get List Targets Makefile



解決:

Bashでは(少なくとも)、これはタブ補完で自動的に実行できます。

spacetabtabを作成します




これは、ブレントブラッドバーンの優れたアプローチを次のように改善する試みです。

  • より堅牢なコマンドを使用してターゲット名を抽出します。これにより、誤検知が防止されます(また、不要なものも排除されます)。sh-c)
  • 常にmakefileをターゲットにするわけではありません 現在 ディレクトリ;で明示的に指定されたmakefileを尊重します-NS
  • 非表示のターゲットを除外します-慣例により、これらは名前が文字でも数字でも始まらないターゲットです
  • でやります 独身 偽のターゲット
  • コマンドの前に@実行前にエコーされないようにする

不思議なことに、GNUmakeにはリストする機能がありません ただ makefileで定義されたターゲットの名前。ながら-pオプションは、すべてのターゲットを含む出力を生成し、他の多くの情報にそれらを埋め込み、デフォルトのターゲットも実行します(これは次の方法で抑制できます)。-f / dev / null)。



次のルールをGNUのmakefileに配置します名前の付いたターゲットを実装するようにしますすべてのターゲット名をアルファベット順に単純にリストするリスト-つまり、次のように呼び出しますリストを作る

.PHONY:リストリスト:@ $(MAKE)-pRrq -f $(lastword $(MAKEFILE_LIST)):2> / dev / null | awk -v RS = -F: '/ ^#File /、/ ^#Finished Make database / {if($$ 1!〜' ^ [#。] '){print $$ 1}}' |並べ替え| egrep -v -e '^ [^ [:alnum:]]' -e '^ [メール保護] $$'

重要 :これを貼り付けると、 最後の行がによってインデントされていることを確認してください 正確に1つの実際のタブ文字。 (スペースは いいえ 仕事)

ご了承ください 並べ替え 結果として得られるターゲットのリストが最良のオプションです。 いいえ ターゲットがmakefileに表示される順序が次のようになっているため、並べ替えでは有用な順序は生成されません。 いいえ 保存されます。
また、複数のターゲットで構成されるルールのサブターゲットは常に出力されます 別々に したがって、通常は並べ替えが原因で いいえ 隣り合って表示されます。例:で始まるルールa z:意志 いいえ ターゲットを持っているzリスト 隣同士 追加のターゲットがある場合は、出力に。



ルールの説明

  • PHONY:リスト

    • ターゲットリストを偽のターゲット、つまり1つと宣言します いいえ を参照して ファイル 、したがって、レシピを呼び出す必要があります 無条件に
  • $(MAKE)-pRrq -f $(lastword $(MAKEFILE_LIST)):2> / dev / null

    • 呼び出すmakefileから派生したデータベースを印刷および解析するために、もう一度makeを実行します。
      • -pはデータベースを出力します
      • -Rrは、組み込みのルールと変数の包含を抑制します
      • -qは、ターゲットの最新ステータスを(何も作り直さずに)テストするだけですが、それ自体ですべての場合にレシピコマンドの実行が妨げられるわけではありません。したがって:
      • -f $(lastword $(MAKEFILE_LIST))は、暗黙的または明示的にターゲットにされたかどうかに関係なく、元の呼び出しと同じmakefileがターゲットにされることを保証します。-NS ....
        警告 makefileに含まれている場合、これは壊れますディレクティブを含める。これに対処するには、変数を定義しますTHIS_FILE:= $(lastword $(MAKEFILE_LIST)) どれかディレクティブを含めて使用する-代わりに-f $(THIS_FILE)。
      • :は 意図的に無効なターゲット それは コマンドが実行されていないことを確認してください ;2> / dev / nullは、結果のエラーメッセージを抑制します。注:これは-pそれでもデータベースを印刷します。これは、GNU make3.82の場合です。悲しいことに、GNUmakeは直接のオプションを提供していません ただ データベースを印刷せずに また デフォルトの(または指定された)タスクの実行。特定のMakefileをターゲットにする必要がない場合は、で推奨されているように、-p -f / dev / nullを作成しますマニュアルページ。
  • -v RS =

    • これは、入力を連続した空でない行のブロックに分割するawkイディオムです。
  • / ^#ファイル/、/ ^#終了データベースの作成/

    • すべてのターゲットを含む出力の行の範囲に一致します(GNU make 3.82の時点でtrue)-解析をこの範囲に制限することにより、他の出力セクションからの誤検知を処理する必要がありません。
  • if($$ 1!〜 '^ [#。]')

    • ブロックを選択的に無視します。
      • #...ブロックがで始まる非ターゲットを無視します#ターゲットではありません:
      • 。 ...特別なターゲットを無視します
    • 他のすべてのブロックはそれぞれ、明示的に定義されたターゲットの名前のみを含む行で始まり、その後に続く必要があります
  • egrep -v -e '^ [^ [:alnum:]]' -e '^ [email protected] $$'は、出力から不要なターゲットを削除します。

    • '^ [^ [:alnum:]]' ...除外 隠れた ターゲット。これは、慣例により、文字でも数字でも始まらないターゲットです。
    • '^ [メール保護] $$' ...除外リストターゲット自体

ランニング次に、make listは、すべてのターゲットをそれぞれ独自の行に出力します。あなたはにパイプすることができます代わりにスペースで区切られたリストを作成するxargs。


これは明らかに多くの場合は機能しませんが、MakefileはCMakeによって作成されましたあなたが実行できるかもしれません助けてください。

$ make help以下は、このMakefileの有効なターゲットの一部です。...すべて(ターゲットが指定されていない場合のデフォルト)...クリーン...依存...インストールなど