makefileでターゲットのリストを取得するにはどうすればよいですか?


202

私は少しレーキ(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...
...

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

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

とにかく、メイクファイルからターゲットを抽出するための小さなハックを作成しました。メイクファイルに含めることができます。

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

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

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

2
私はすぐに興味深い回答を読みましたが、今のところ、私にとっては、エイリアス(.bashrc内)を使用して、わかりやすく、シンプルで、移植性を保つことを好みます。 alias makefile-targets='grep "^[^#[:space:]].*:" Makefile' ほとんどの場合、現在のメイクファイルを調べるだけで、bashの補完が展開されます。私のエイリアス。
RockyRoad 2018年


4
それはあまりにも簡単です:grep : Makefile
cibercitizen1

回答:


130

これは、@ nobarの優れたアプローチを次のように改善する試みです。

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

奇妙なことに、GNUにmakeはmakefileで定義されたターゲットの名前だけをリストする機能はありません。の-pオプションは、すべてのターゲットを含む出力を生成しますが、それらを他の多くの情報に埋め込みます。

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

.PHONY: list
list:
    @$(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つのタブ文字でインデントされていることを確認してください。(スペースは機能しません

ことを注意ソートので、ターゲットの結果リストは、最良の選択肢であるではないターゲットはメイクファイルに表示される順序がされていることに役立つ順序を生成しませんソートない保存。
また、複数のターゲットを含むルールのサブターゲットは常に別々に出力れるため、並べ替えが原因で、通常互いに隣り合って表示されません。例えば、始まるルールはa z:なりません目標を持っているaz記載されている隣同士に追加のターゲットが存在する場合、出力に。

ルールの説明

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

    • makemakefileから派生したデータベースを出力して解析するために、再度呼び出します。
      • -p データベースを印刷します
      • -Rr 組み込みのルールと変数の組み込みを抑制します
      • -q(何も再作成せずに)ターゲットの最新のステータスのみをテストしますが、それだけではすべてのケースでレシピコマンドの実行を妨げません。したがって:
      • -f $(lastword $(MAKEFILE_LIST))を使用して暗黙的または明示的にターゲット設定されたかどうかに関係なく、元の呼び出しと同じメイクファイルが確実にターゲット設定されます-f ...
        警告これは、makefileにincludeディレクティブが含まれている場合に機能しなくなります。これに対処するTHIS_FILE := $(lastword $(MAKEFILE_LIST)) にはincludeディレクティブの前に変数を定義し、-f $(THIS_FILE)代わりに使用します。
      • :ある意図的に無効なターゲットを意図している何のコマンドが実行されていないことを確認するには2>/dev/null結果のエラーメッセージを抑制します。注:これは、-pそれでもデータベースの印刷に依存しています。これは、GNU make 3.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代わりにパイプしてスペース区切りのリストを作成できます。


これは素晴らしい答えですが、各タスクの説明はどのように取得できますか?現在、タスク定義の上にコメントとして保存しています。それをリストと同じようにリストに含めることが可能かどうかわからないrake --tasksですか?
Piotr Kuczynski 2017年

1
@PiotrKuczynski:興味深い質問ですが、新しい質問として投稿することをお勧めします(参照用にこの質問を示します)。
mklement0 2017年

「残念ながら、GNU makeはデータベースを印刷するだけの直接的なオプションを提供していません。」-nオプションがあります。
Bulletmagnet

@Bulletmagnet:-nオプションの目的は、「実行されるコマンドを印刷する...」です。つまり、ドライラン機能です。また、あなたの引用は、単語の斜体が欠落しているではないということだけでmake -p自身がでないデータベースを印刷しますが、必ず、デフォルトのタスクを実行します。マニュアルはそれmake -p -f/dev/nullを避けるために不格好なことを推奨しています。
mklement0

1
.PHONYターゲットもリストされますので、ないことを確認してください.PHONY: *
tekumara

189

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

make spacetabtab


1
テスト済み:bash --version = 4.2.45(1)-release。make --version = 3.81。
nobar 2014年

53
+1。ただし、これはbash機能ではなく、プラットフォームによって異なります。プラットフォームは3つのカテゴリに分類されます。この補完機能がデフォルトでインストールされるプラットフォーム(Debian 7、Fedora 20など)、オプションでインストールできるプラットフォーム(たとえば、Ubuntu 14、. /etc/bash_completion)、およびそれをまったくサポートしないプラットフォームです。(例:OSX 10.9)
mklement0 2014年

8
OS X 10.10では動作します(bashではなくzshで)。
Florian Oswald

4
素晴らしいヒントですが、bash-completionパッケージも必要です。Fedora、RHEL、Gentooなどで見つかりました。
NoelProf 2016

4
これは、プログラムで作成されたmakeターゲットAFAICTでは機能しません。例$(RUN_TARGETS): run-%: ...
Matthias

32

これは明らかに多くの場合機能し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

それを取得するためにCMakeListでオンにするオプションはありますか?CMakeによって生成されたmakefileを取得しましたが、疑似ヘルプターゲットを使用できません
Xavier T.

いいえ。OSXで少なくとも最近のCMakeを使用している場合(私は実際にはナイトリーを使用していますが、これを書いたときには3.3を使用していたと思います)、実行するだけで動作touch CMakeLists.txt && cmake . && make helpするはずです。古代のcmakeを使用しているのか、Unix Makefilesジェネレーターを使用していないのでしょうか?
Timmmm 2017年

Windowsで、UNIXジェネレーターでCMake 3.6.2を使用しています。重宝しそうなので、説明を探してみます。
ザビエル

26

私はこれらの2つの答えを組み合わせました:https : //stackoverflow.com/a/9524878/86967https://stackoverflow.com/a/7390874/86967 といくつかのエスケープを行ったので、これはメイクファイル内から使用できます。

.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

10
また、(最近)Bashの下のタブ補完が利用可能なターゲットをリストすることを発見しました。
nobar 2014年

1
優れたアプローチのための+1ですが、いくつかの改善を加えることができます。(a)明示的に指定するsh -c "…"必要はありませんmake。(b)使用するコマンドが単純すぎるため、誤検知が発生します(注記)。(c)コマンドの前にを付けると@、実行前にstdoutにエコーされず-s、呼び出し時に使用する必要がなくなります。
mklement0 2014年

1
追加できるはるかに単純なmakeターゲットがあります:リスト:cat Makefile | grep "^ [Az]" | awk '{print $$ 1}' | sed "s /:// g | sort"
タムスター2014年

2
cat / sedアプローチはいくつかのレベルで失敗します。変数を展開せず、他のファイルをインクルードした結果であるターゲットをリストすることもできません。
Troy Daniels

1
@ mklement0:make -smakefileでコマンドの前にを付けるのではなく、(Bashエイリアス経由で)使用することを好みます@@特にechoコマンドのプレフィックス(コマンドの表示が冗長になる)として役立つ場合がありますが、一般的には使用したくありません。このようにして、(を使用しないことで-s)必要なときに「レシピ」を表示できますが、通常はそうではありません。これが関連するドキュメントです:GNU Make Manual、5.2 Recipe Echoing
nobar

14

makeインストール済みのbash補完がある場合、補完スクリプトは関数を定義します_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

3
参考になりますが、すべてのプラットフォームにスクリプト/etc/bash_completionや機能があるわけではないことに注意してください_make_target_extract_script。Ubuntu> 12を使用しているようです。/usr/share/bash-completion/completions/make代わりにターゲットを設定すると、Fedora 20などの追加のプラットフォームでアプローチが機能します。このファイルは機能ではありません(たとえば、Debian 7およびUbuntu 12)。OSXなどの他のプラットフォームには、タブ補完機能がまったく付属していませんmake。たぶん、実際の関数定義を投稿することが役立つでしょう。
mklement0 2014年

1
コメントありがとうございます。これは大歓迎です。はい、Ubuntu 14.04でこれをテストしました
hek2mgl 2014年

11

アウトmklement0ポイント、すべてのMakefileのターゲットを一覧表示する機能は、GNU-メイクから欠落している、と彼の答えと他の人がこれを行うための方法を提供しています。

ただし、元の投稿ではrakeについても触れています。そのタスクスイッチは、rakefileにすべてのタスクを一覧表示するだけではなく、少し異なる動作をします。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があり、それを掘り下げることなくターゲットをすばやくリストする方法が必要な場合、これは役に立ちません。

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


これは素晴らしいテクニックです-素晴らしくてシンプルですが、説明もあります!
ブライアンバーンズ

素晴らしいテクニック。これを少し変更しechoて、コマンドをコマンドの説明として使用しました(stackoverflow.com/a/52059487/814145)。
Penghe Geng

@PengheGeng投稿ありがとうございます。これ@echo "Target 1"が単なるプレースホルダーであり、「説明エコーコマンド」ではないことを明確にしたいと思います。生成されたヘルプテキストはからのものではありません@echo。実際のMakefileでは、これらechoはビルドコマンドなどに置き換えられます。これをより明確にするために、投稿を編集します。
jsp 2018

5

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

これは、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)


4

@nobarの回答は、タブ補完を使用してメイクファイルのターゲットを一覧表示する方法を示しています

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

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

    • . /etc/bash_completion いくつかのタブ補完機能をインストールします。 make
    • または、タブ補完のみをインストールする場合make
      • . /usr/share/bash-completion/completions/make
  • 以下のために、すべての時にこの機能を提供していないプラットフォームなど、OSX、次のことができ、次のコマンドをソース(からadapated ここでは)それを実装するには:
_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ディストリビューションに付属するタブ補完機能ほど洗練されていません。特に、コマンドラインがを使用して別のメイクファイルをターゲットにしている場合でも、常に現在のディレクトリのメイクファイルをターゲットにし-f <file>ます。

4

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

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


とても良い解決策です。私は今、数年のためにこれを使用している:awk -F ':|##' '/^[^\t].+:.*##/ { printf "\033[36mmake %-28s\033[0m -%s\n", $$1, $$NF }' $(MAKEFILE_LIST) | sort ##、ターゲットと同じ行にコメントする前に。しかし、私はあなたの解決策が可読性の前に可能になると思います。
thoroc

最初の2行で構成されるメイクファイルは、grep: parentheses not balanced私のOSX 10.15マシンについて報告します。
Malcolm Crum

@Crummy申し訳ありませんが、私の間違いです。指摘してくれてありがとう。修正しました。makeは、変数名の開始を想定していないドル記号をエスケープする必要があります。
リチャードキーファー

上記のコードセクションを表示すると、StackOverflowはタブをスペースに変換しますが、Makefileにはタブが必要です。投稿を編集してセクションをコピーすると、タブが保持されます。
リチャードキーファー

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

1

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

cat Makefile | egrep "^[[:alnum:][:punct:]]{0,}:[[:space:]]{0,}[[:alnum:][:punct:][:space:]]{0,}$"

1

これはきれいにはほど遠いですが、私にとっては仕事をしました。

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内部ルールである追加


1

これは、jspの非常に役立つ回答(https://stackoverflow.com/a/45843594/814145)に対する変更です。ターゲットのリストだけでなく、それらの説明も取得するのが好きです。jspのMakefileは説明をコメントとして記述します。これは、ターゲットの説明エコーコマンドで頻繁に繰り返されることがわかりました。代わりに、各ターゲットの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の答え、唯一の偽のターゲットは、リストされてもよいかもしれないまたはかもしれないあなたのケースのためのない仕事
  • さらに、レシピの最初のコマンドとしてechoor :コマンドを持つPHONYターゲットのみがリストされます。:「何もしない」を意味します。all上記のターゲットなど、エコーが不要なターゲットに使用します。
  • helpターゲットがmake help出力に「:」を追加するための追加のトリックがあります。

0

上記のさらに別の答え。

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

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

以下のようなmakeファイルが出力されます:

ターゲット1

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/に追加できるはずです。これは、「タブを作成」すると意味します。これにより、ワンライナースクリプトに基づくターゲット。


catではなくmake -qpを使用することもできます。そのため、make -qpになります。awk '/:/ &&!/:= / && / ^ [Az] / &&!/ PATH / &&!/ DISPLAY / &&!/ TERM_SESSION / &&!/ USER_TEXT_ENCODING / &&!/ Makefile / {print substr($ 0、1 、長さ($ 0)-1)| "sort -u"} '
ジミーMGリム

0

私は通常します:

grep install_targets Makefile

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

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

これが役に立てば幸い


0

Bashスクリプトの場合

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

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

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


-4

前の答えがなぜそれほど複雑であったのかわからない:

list:
    cat Makefile | grep "^[A-z]" | awk '{print $$1}' | sed "s/://g" 

8
前の回答は、それはあなたの答えはカバーしていないことを、すべてのシナリオカバーしているためので、複雑さ:経て定義されたターゲットの()を含める変数を(例えば、$(SHELLS): ...)、(b)の数字で始まるターゲット、(C)の含有非(d)明示的なmakefileパスで指定されている場合、適切なmakefileをターゲットとする変数定義の組み込みmake。(a)は重大な欠点です。正しいメイクファイルを確実にターゲットにしたとしても、変数の拡張がないため、一般的なケースではrawファイルの解析は機能しません。
mklement0 2014年

6
余談ですが、再度複雑にします。コマンドは次のように簡略化できますが、要点は、堅牢性が十分でないことですawk -F: '/^[A-z]/ {print $$1}' Makefile。最後に、主に学術的なポイントです。[A-z]ではなくを使用[:alpha:]すると、などの外国のキャラクターで始まるターゲットが見逃されることになりますá
mklement0 2014年

@ mklement0最初のawkコマンドはうまく機能し、これまでのところ最も単純ですが、[:alpha:]を使用すると、何らかの理由で問題が発生するようです。テストファイルの一部のターゲットが欠落しています。
Brian Burns

@ bburns.km:私の悪い:私が言っているはず[[:alpha:]]はなくは[:alpha:][:alpha:]文字のロケール対応のセットを表し(文字クラス[...])、のための効果的なので、必要ダブル [[ / ]]
mklement0

4
なぜこの答えはとても複雑なのですか?あなたはいくつかのこの短いスニペットで無用な罪のます。awk -F: '/^[A-Za-z]/ { print $$1 }' Makefile単一のプロセスとうまくいけばより正確な正規表現を使用します(もちろん、以前のコメントで述べたように、アンダースコア、数値などのターゲットを使用することもできます)。
Tripleee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.