268

rake(Ruby makeプログラム)を少し使用しましたが、使用可能なすべてのターゲットのリストを取得するオプションがあります。

> rake --tasks
rake db:charset      # retrieve the charset for your data...
rake db:collation    # retrieve the collation for your da...
rake db:create       # Creates the databases defined in y...
rake db:drop         # Drops the database for your curren...
...

しかし、GNUmakeでこれを行うオプションはないようです。

どうやら、2007年の時点で、コードはほぼそこにあります-http://www.mail-archive.com/help-make@gnu.org/msg06434.html

とにかく、makefileに含めることができるmakefileからターゲットを抽出するために少しハックしました。

list:
    @grep '^[^#[:space:]].*:' Makefile

定義されたターゲットのリストが表示されます。これはほんの始まりにすぎません。たとえば、依存関係を除外することはありません。

> make list
list:
copy:
run:
plot:
turnin:
4

22 に答える 22

246

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

make spacetabtab

于 2014-05-15T00:20:29.800 に答える
184

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

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

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

次のルールをGNUのmakefileに配置して、すべてのターゲット名をアルファベット順にリストするだけmakeの名前のターゲットを実装しlistmake listます。つまり、次のように呼び出します。

.PHONY: list
list:
    @LC_ALL=C $(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'

重要:これを貼り付けるときは、最後の行が正確に1つの実際のタブ文字でインデントされていることを確認してください。(スペースは機能しません

結果のターゲットのリストをソートするのが最良のオプションであることに注意してください。ソートしないと、ターゲットがmakefileに表示される順序が保持されないため、有用な順序が生成されないためです。
また、複数のターゲットで構成されるルールのサブターゲットは常に個別に出力されるため、並べ替えのため、通常は隣り合って表示されません。たとえば、追加のターゲットがある場合、で始まるルールにはターゲットa z:なく、出力に隣り合ってaリストzされます。

ルールの説明

  • PHONY: list

    • ターゲットリストを偽のターゲット、つまりファイルを参照していないターゲットとして宣言します。したがって、そのレシピは無条件に呼び出される必要があります。
  • LC_ALL=C出力の解析はそれに依存しているため、make'の出力が英語であることを確認してください。バスティアンビットトルフへの帽子の先端

  • $(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null

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

    • これは、入力を連続した空でない行のブロックに分割するawkイディオムです。
  • /^# File/,/^# Finished Make data base/

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

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

    • '^[^[:alnum:]]'...隠されたターゲットを除外します。これは、慣例により、文字でも数字でも始まらないターゲットです。
    • '^$@$$'list...ターゲット自体を除外します

次に、実行make listすると、すべてのターゲットがそれぞれ独自の行に出力されます。代わりに、にパイプしxargsてスペース区切りのリストを作成できます。

于 2014-10-13T12:22:41.907 に答える
48

これは明らかに多くの場合機能しませMakefileんが、CMakeによって作成された場合は、を実行できる可能性がありますmake help

$ make help
The following are some of the valid targets for this Makefile:
... all (the default if no target is provided)
... clean
... depend
... install
etc
于 2017-01-05T16:39:43.243 に答える
28

私はこれらの2つの答えを組み合わせました:https ://stackoverflow.com/a/9524878/86967とhttps://stackoverflow.com/a/7390874/86967 そしてこれがmakefile内から使用できるようにいくつかのエスケープを行いました。

.PHONY: no_targets__ list
no_targets__:
list:
    sh -c "$(MAKE) -p no_targets__ | awk -F':' '/^[a-zA-Z0-9][^\$$#\/\\t=]*:([^=]|$$)/ {split(\$$1,A,/ /);for(i in A)print A[i]}' | grep -v '__\$$' | sort"

$ make -s list
build
clean
default
distclean
doc
fresh
install
list
makefile ## this is kind of extraneous, but whatever...
run
于 2013-02-25T01:43:24.487 に答える
18

mklement0が指摘しているように、すべてのMakefileターゲットを一覧表示する機能がGNU-makeにありません。彼の回答などは、これを行う方法を提供します。

ただし、元の投稿ではrakeについても言及されており、そのタスクスイッチは、rakefile内のすべてのタスクを一覧表示するのとは少し異なる動作をします。Rakeは、説明が関連付けられているタスクのリストのみを提供します。説明のないタスクは一覧表示されません。これにより、作成者はカスタマイズされたヘルプの説明を提供することも、特定のターゲットのヘルプを省略することもできます。

各ターゲットの説明を提供するrakeの動作をエミュレートする場合は、これを行うための簡単な手法があります。リストする各ターゲットのコメントに説明を埋め込みます。

次のように、説明をターゲットの横に配置するか、私がよく行うように、ターゲットの上のPHONY仕様の横に配置することができます。

.PHONY: target1 # Target 1 help text
target1: deps
    [... target 1 build commands]

.PHONY: target2 # Target 2 help text
target2:
    [... target 2 build commands]

...                                                                                                         

.PHONY: help # Generate list of targets with descriptions                                                                
help:                                                                                                                    
    @grep '^.PHONY: .* #' Makefile | sed 's/\.PHONY: \(.*\) # \(.*\)/\1 \2/' | expand -t20

どちらが得られます

$ make help
target1             Target 1 help text
target2             Target 2 help text

...
help                Generate list of targets with descriptions

この要点ここにも短いコード例があります。

繰り返しますが、これはMakefile内のすべてのターゲットをリストする問題を解決しません。たとえば、生成された可能性のある、または他の誰かが作成した大きなMakefileがあり、それを掘り下げずにターゲットをすばやくリストする方法が必要な場合、これは役に立ちません。

ただし、Makefileを作成していて、一貫性のある自己文書化方法でヘルプテキストを生成する方法が必要な場合は、この手法が役立つ場合があります。

于 2017-08-23T15:16:44.137 に答える
15

インストールされているbash補完がある場合make、補完スクリプトは関数を定義します_make_target_extract_script。この関数はsed、ターゲットをリストとして取得するために使用できるスクリプトを作成することを目的としています。

次のように使用します。

# Make sure bash completion is enabled
source /etc/bash_completion 

# List targets from Makefile
sed -nrf <(_make_target_extract_script --) Makefile
于 2014-06-27T13:44:46.987 に答える
13

これに対する私のお気に入りの回答は、Unix&LinuxStackExchangeのChrisDownによって投稿されました。引用します。

これは、のbash完了モジュールmakeがリストを取得する方法です。

make -qp | awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ {split($1,A,/ /);for(i in A)print A[i]}'

ページングせずに、改行で区切られたターゲットのリストを出力します。

ユーザーBrainstonesort -uは、重複するエントリを削除するためのパイプを提案しています。

make -qp | awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ {split($1,A,/ /);for(i in A)print A[i]}' | sort -u

出典:makeのすべてのターゲットを一覧表示するにはどうすればよいですか?(Unix&Linux SE)

于 2019-10-10T06:10:53.503 に答える
8

makeターゲットを記述するための簡単な構文に焦点を当て、クリーンな出力を得るには、次のアプローチを選択しました。

help:
    @grep -B1 -E "^[a-zA-Z0-9_-]+\:([^\=]|$$)" Makefile \
     | grep -v -- -- \
     | sed 'N;s/\n/###/' \
     | sed -n 's/^#: \(.*\)###\(.*\):.*/\2###\1/p' \
     | column -t  -s '###'


#: Starts the container stack
up: a b
  command

#: Pulls in new container images
pull: c d 
    another command

make-target-not-shown:

# this does not count as a description, so leaving
# your implementation comments alone, e.g TODOs
also-not-shown:

したがって、上記をMakefileとして扱い、実行すると、次のようになります。

> make help
up          Starts the container stack
pull        Pulls in new container images

コマンドのチェーンの説明:

于 2019-11-28T11:10:41.460 に答える
4

@nobarの回答は、タブ補完を使用してmakefileのターゲットを一覧表示する方法を示しています。

  • これは、デフォルトでこの機能を提供するプラットフォーム(Debian、Fedoraなど)に最適です。

  • 他のプラットフォーム(Ubuntuなど)では、 @ hek2mglの回答が示すように、この機能を明示的にロードする必要があります。

    • . /etc/bash_completionのタブ補完機能を含む、いくつかのタブ補完機能をインストールしますmake
    • または、次のタブ補完のみをインストールするにはmake
      • . /usr/share/bash-completion/completions/make
  • OSXなど、この機能をまったく提供していないプラットフォームの場合は、次のコマンドここから適応)を入手して実装できます。
_complete_make() { COMPREPLY=($(compgen -W "$(make -pRrq : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($1 !~ "^[#.]") {print $1}}' | egrep -v '^[^[:alnum:]]' | sort | xargs)" -- "${COMP_WORDS[$COMP_CWORD]}")); }
complete -F _complete_make make
  • 注:これは、Linuxディストリビューションに付属するタブ補完機能ほど洗練されていません。特に、コマンドラインが。を使用して別のmakefileを対象としている場合でも、常に現在のディレクトリ-f <file>内のmakefileを対象としています。
于 2014-10-13T12:47:02.990 に答える
4

このhelpターゲットは、説明が後に続くターゲットのみを印刷し##ます。これにより、パブリックターゲットとプライベートターゲットの両方を文書化できます。を使用する.DEFAULT_GOALと、ヘルプが見つけやすくなります。

のみsedxargsおよびprintfかなり一般的な使用されます。

を使用すると、makefileをたとえば< $(MAKEFILE_LIST)以外の名前で呼び出すことができますMakefileMakefile.github

の好みに合わせて出力をカスタマイズできますprintfrakeこの例は、スタイル出力に対するOPの要求に一致するように設定されています

以下のmakeファイルをカットアンドペーストするときは、4つのスペースのインデントをタブに変更することを忘れないでください。

# vim:ft=make
# Makefile

.DEFAULT_GOAL := help
.PHONY: test help

help:  ## these help instructions
    @sed -rn 's/^([a-zA-Z_-]+):.*?## (.*)$$/"\1" "\2"/p' < $(MAKEFILE_LIST) | xargs printf "make %-20s# %s\n"

lint: ## style, bug and quality checker
    pylint src test

private: # for internal usage only
    @true

test: private ## run pytest with coverage
    pytest --cov test


上記の出力は次のMakefileとおりです。コメント用のprivateターゲットが1つしかないため、ターゲットは出力されないことに注意してください。#

$ make
make help                # these help instructions
make lint                # style, bug and quality checker
make test                # run pytest with coverage
于 2020-09-08T21:21:00.777 に答える
4

私は上記のいくつかの答えを取り、これをコンパイルしました。これは、各ターゲットの優れた説明を生成することもでき、変数を持つターゲットでも機能します。

Makefileの例:

APPS?=app1 app2

bin: $(APPS:%=%.bin)
    @# Help: A composite target that relies only on other targets

$(APPS:%=%.bin): %.bin:
    @# Help: A target with variable name, value = $*

test:
    @# Help: A normal target without variables

# A target without any help description
clean:

# A hidden target
.hidden:

help:
    @printf "%-20s %s\n" "Target" "Description"
    @printf "%-20s %s\n" "------" "-----------"
    @make -pqR : 2>/dev/null \
        | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' \
        | sort \
        | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' \
        | xargs -I _ sh -c 'printf "%-20s " _; make _ -nB | (grep -i "^# Help:" || echo "") | tail -1 | sed "s/^# Help: //g"'

出力例:

$ make help
Target               Description
------               -----------
app1.bin             A target with variable name, value = app1
app2.bin             A target with variable name, value = app2
bin                  A composite target that relies only on other targets
clean
test                 A normal target without variables

どのように機能しますか:

ターゲットの上部は、make helpここでmklement0によって投稿されたとおりに機能します-makefileでターゲットのリストを取得するにはどうすればよいですか?

ターゲットのリストを取得した後、各ターゲットのドライランとして実行され、ターゲットの説明でmake <target> -nB始まる最後の行を解析します。@# Help:そして、それまたは空の文字列が適切にフォーマットされたテーブルに出力されます。

ご覧のとおり、変数は説明内でも拡張されています。これは私の本の大きなボーナスです:)。

于 2020-12-10T22:37:39.363 に答える
3

これは決してきれいではありませんが、私にとっては仕事をしました。

make -p 2&>/dev/null | grep -A 100000 "# Files" | grep -v "^$" | grep -v "^\(\s\|#\|\.\)" | grep -v "Makefile:" | cut -d ":" -f 1

私はそれを使用make -pして内部データベースをダンプし、stderrを捨て、grep -A 100000出力の下部を維持するためにすばやくダーティを使用します。次に、いくつかのを使用して出力をクリーンアップし、grep -v最後cutに、コロンの前にあるもの、つまりターゲットを取得するために使用します。

これは、ほとんどのMakefileのヘルパースクリプトには十分です。

編集:grep -v Makefileそれは内部ルールであると追加されました

于 2017-09-19T15:10:42.930 に答える
3

このターゲットをMakefileに追加します。

help:
    @echo "\nTARGETS:\n"
    @make -qpRr | egrep -e '^[a-z].*:$$' | sed -e 's~:~~g' | sort
    @echo ""

  • make -qpRr=make --question --print-data-base --no-builtin-variables --no-builtin-rules
  • egrep -e '^[a-z].*:$$':小文字で始まり、「:」で終わる行を検索します
  • sed -e 's~:~~g':「:」を削除します

次に、実行します。

make help

これは私のために働く


PD:詳細は...

make --help
于 2021-04-29T17:05:58.953 に答える
2

ここには実行可能なソリューションがたくさんありますが、私が言うのが好きなように、「一度実行する価値がある場合は、もう一度実行する価値があります」。(tab)(tab)を使用するように提案しましたが、一部の人が指摘しているように、完了サポートがない場合や、インクルードファイルが多数ある場合は、ターゲットが定義されている場所をより簡単に知る方法が必要な場合があります。

私はサブメイクで以下をテストしていません...私はそれがうまくいかないと思います。ご存知のように、再帰的には有害と見なされます。

.PHONY: list ls
ls list :
    @# search all include files for targets.
    @# ... excluding special targets, and output dynamic rule definitions unresolved.
    @for inc in $(MAKEFILE_LIST); do \
    echo ' =' $$inc '= '; \
    grep -Eo '^[^\.#[:blank:]]+.*:.*' $$inc | grep -v ':=' | \
    cut -f 1 | sort | sed 's/.*/  &/' | sed -n 's/:.*$$//p' | \
    tr $$ \\\ | tr $(open_paren) % | tr $(close_paren) % \
; done

# to get around escaping limitations:
open_paren := \(
close_paren := \)

私が好きな理由:

  • インクルードファイルでターゲットを一覧表示します。
  • 生の動的ターゲット定義を出力します(可変区切り文字をモジュロに置き換えます)
  • 各ターゲットを新しい行に出力します
  • より明確に見える(主観的な意見)

説明:

  • MAKEFILE_LIST内のforeachファイル
  • ファイル名を出力
  • インデントされておらず、コメントではなく、ピリオドで始まらないコロンを含むgrep行
  • 即時代入式を除外する(:=)
  • ルールの依存関係の切り取り、並べ替え、インデント、および切り取り(コロンの後)
  • 拡張を防ぐために変数区切り文字を変更する

サンプル出力:

 = Makefile = 
  includes
  ls list
 = util/kiss/snapshots.mk = 
  rotate-db-snapshots
  rotate-file-snapshots
  snap-db
  snap-files
  snapshot
 = util/kiss/main.mk = 
  dirs
  install
   %MK_DIR_PREFIX%env-config.php
   %MK_DIR_PREFIX%../srdb
于 2018-04-19T14:25:50.283 に答える
2

これは、jspの非常に役立つ回答(https://stackoverflow.com/a/45843594/814145)の変更です。ターゲットのリストだけでなく、その説明も取得するというアイデアが好きです。jspのMakefileは、説明をコメントとして配置します。これは、ターゲットのdescriptionechoコマンドで繰り返されることがよくあります。その代わりに、各ターゲットのechoコマンドから説明を抽出します。

Makefileの例:

.PHONY: all
all: build
        : "same as 'make build'"

.PHONY: build
build:
        @echo "Build the project"

.PHONY: clean
clean:
        @echo "Clean the project"

.PHONY: help
help:
        @echo -n "Common make targets"
        @echo ":"
        @cat Makefile | sed -n '/^\.PHONY: / h; /\(^\t@*echo\|^\t:\)/ {H; x; /PHONY/ s/.PHONY: \(.*\)\n.*"\(.*\)"/    make \1\t\2/p; d; x}'| sort -k2,2 |expand -t 20

の出力make help

$ make help
Common make targets:
    make all        same as 'make build'
    make build      Build the project
    make clean      Clean the project
    make help       Common make targets

ノート:

  • jspの回答と同じように、PHONYターゲットのみがリストされる場合がありますが、これはあなたのケースでは機能する場合と機能しない場合があります
  • さらに、レシピの最初のコマンドとしてechoorコマンドを持つPHONYターゲットのみが一覧表示されます。「何もしない」という意味です。ここでは、上記のターゲットなど、エコーが不要なターゲットに使用します。::all
  • helpターゲットが出力に「:」を追加するための追加のトリックがありmake helpます。
于 2018-08-28T13:48:39.953 に答える
2

Bashスクリプトの場合

上記のbash@cibercitizen1のコメントに基づいて、これを行う非常に簡単な方法を次に示します。

grep : Makefile | awk -F: '/^[^.]/ {print $1;}'

@ Marc.2377によるより信頼できる回答も参照してください。これは、のBash完了モジュールがどのようにそれを行うかを示してmakeいます。

于 2020-05-21T21:52:42.110 に答える
2

@jspによって与えられた答えを拡張するために、関数を使用してヘルプテキストの変数を評価することもできます$(eval)

以下の提案されたバージョンには、これらの拡張されたプロパティがあります。

  • すべてのmakefileをスキャンします(含まれている場合でも)
  • ヘルプコメントで参照されているライブ変数を展開します
  • 実際のターゲットのドキュメントアンカーを追加します(接頭辞は# TARGETDOC:
  • 列ヘッダーを追加します

したがって、文書化するには、次のフォームを使用します。

RANDOM_VARIABLE := this will be expanded in help text

.PHONY: target1 # Target 1 help with $(RANDOM_VARIABLE)
target1: deps
    [... target 1 build commands]

# TARGETDOC: $(BUILDDIR)/real-file.txt # real-file.txt help text
$(BUILDDIR)/real-file.txt:
    [... $(BUILDDIR)/real-file.txt build commands]

次に、makefileのどこかに:

.PHONY: help # Generate list of targets with descriptions
help:
    @# find all help in targets and .PHONY and evaluate the embedded variables
    $(eval doc_expanded := $(shell grep -E -h '^(.PHONY:|# TARGETDOC:) .* #' $(MAKEFILE_LIST) | sed -E -n 's/(\.PHONY|# TARGETDOC): (.*) # (.*)/\2  \3\\n/'p | expand -t40))
    @echo
    @echo ' TARGET   HELP' | expand -t40
    @echo ' ------   ----' | expand -t40
    @echo -e ' $(doc_expanded)'
于 2020-07-20T18:37:35.507 に答える
1

これは、makeターゲットに必要なビルドターゲット(およびそれらの依存関係)を確認したかったので、役に立ちました。makeターゲットは「。」で始めることはできないことを私は知っています。キャラクター。どの言語がサポートされているかわからないので、egrepのブラケット式を使用しました。

cat Makefile | egrep "^[[:alnum:][:punct:]]{0,}:[[:space:]]{0,}[[:alnum:][:punct:][:space:]]{0,}$"
于 2017-09-08T05:20:52.773 に答える
1

上記に対するさらに別の追加の答え。

端末でcatとawkのみを使用してMacOSXでテスト済み

cat Makefile | awk '!/SHELL/ && /^[A-z]/ {print $1}' | awk '{print substr($0, 1, length($0)-1)}'

以下のようにmakeファイルを出力します。

target1

target2

target3

Makefileでは、同じステートメントである必要があります。$variableではなく$$variableを使用して変数をエスケープするようにしてください。

説明

-中身を吐き出す

| -パイプは出力を次のawkに解析します

awk-「shell」を除いて正規表現を実行し、「Az」行のみを受け入れると、$1の最初の列が出力されます

awk-最後の文字「:」をリストから削除します

これは大まかな出力であり、AWKだけでもっとファンキーなことを行うことができます。BSDの亜種では一貫性がないため、sedは避けてください。つまり、一部は* nixで機能しますが、MacOSXなどのBSDでは失敗します。

もっと

これを(変更を加えて) makeのファイル、デフォルトのbash-completionフォルダー/usr/local/etc/bash-completion.d/に追加できるはずです。つまり、「makeタブタブ」を実行すると、ワンライナースクリプトに基づくターゲット。

于 2019-04-14T17:24:54.533 に答える
0

私は通常します:

grep install_targets Makefile

それは次のようなもので戻ってきます:

install_targets = install-xxx1 install-xxx2 ... etc

これがお役に立てば幸いです

于 2019-10-03T09:29:16.830 に答える
0

AWKが嫌いな人にとって、そして簡単にするために、この矛盾は私にとってはうまくいきます。

help:
  make -qpRr $(lastword $(MAKEFILE_LIST)) | egrep -v '(^(\.|:|#|\s|$)|=)' | cut -d: -f1

(Makefileの外部で使用する場合は、削除する$(lastword ...)か、Makefileパスに置き換えてください)。

このソリューションは、「興味深い」ルール名がある場合は機能しませんが、ほとんどの単純なセットアップではうまく機能します。ベースソリューションの主な欠点はmake -qp、Makefileが関数を使用して変数値を定義する場合、それらはに関係なく実行され-q、使用する$(shell ...)場合はシェルコマンドが呼び出され、その副作用が発生することです。 。私のセットアップでは、シェル関数を実行することの副作用が標準エラーへの不要な出力であることが多いため2>/dev/null、makeコマンドの後に追加します。

于 2020-07-13T09:31:49.220 に答える
-5

前の答えがとても複雑だった理由がわかりません:

list:
    cat Makefile | grep "^[A-z]" | awk '{print $$1}' | sed "s/://g" 
于 2014-10-16T19:25:17.453 に答える