3

私はMakefileプロジェクトを持っています。それは有効であり、機能します。入力makeすると、現在のフォルダーにコンパイルされたバイナリが取得されます。makeプログラムで (スクリプトから) バイナリの名前を取得する方法、または複数のファイルを生成する場合は、これらのファイルの完全なリストを取得する方法を見つけたいと考えています。

これを行うには、次の 3 つの方法があると思います。

  1. または同様のものを実行しmake -d、その出力を分析してファイル名を取得します。それはどのくらい信頼できますか?すべてMakefileの で機能しますか、それとも最も標準的なものでのみ機能しますか?
  2. makeすべてのオブジェクトファイルをクリーンアップする特別なコマンドを呼び出すため、ビルドディレクトリに結果のバイナリのみが取得されます。そのようなコマンドはありますか?
  3. のコンテンツを解析Makefileし、外部ユーティリティを使用してすべての情報を取得します。繰り返しますが、それはどの程度信頼できますか?

ベースのプロジェクトの普遍的なソリューションを見つけたいのですがMakefile、CMake によって生成されたプロジェクトに特定のソリューションがあれば、場合によってはそれも役立ちます。

4

2 に答える 2

2

それは興味深い問題です。質問: バイナリとは何ですか?

次のような Makefile があるとします。

foo.pdf foo.aux: foo.tex
    pdflatex foo

foo.tex: foo.tex.in edits.sed
    sed -f edits.sed foo.tex.in >foo.tex

PRODUCTS: foo.pdf

(つまり、実行可能プログラムをビルドする単なる Makefile ではありません)。foo.pdfバイナリですか?はfoo.aux、どちらが二次製品ですか? はfoo.tex、どちらが中間的なもので、標準的な意味での「バイナリ」ではないのですか? はPRODUCTS、ダミー ターゲットですが、依然として依存関係ルールのターゲットであり、「バイナリ」でもありますか? これらの線に沿って考えると、あなたが探しているように見える意味での「バイナリ」とは何かについて、少しでも固定された、本当に有用な定義はないと思います。つまり、あなたが尋ねた質問は、見た目よりも漠然としているのではないかと思います。

したがって、レベルを上げて、バイナリのことは忘れて、Makefile の依存関係グラフを抽出する方法がないか尋ねたほうがよいかもしれません。それを取得したら、それを見て、探している意味で「バイナリ」であるものを特定できます。

その依存関係グラフをどのように取得しますか? GNU 'make' 情報ページでは、依存関係グラフについて言及していますが、それ以上の詳細はありません。特に、内部で生成されたグラフを出力する方法は提供されていません。

実際、Makefile を分析して自分でグラフを作成するのはかなり簡単かもしれません。'makefile parser' をグーグルで検索すると、いくつかのヒットが生成されます。Perl は、私が見る限りでは、おそらくそれで何かを行うことができます。

これは、私が気の利いたより速い方法を考えることができないと言っている長い道のりです(automakeにパッチを当てることは、そのルートでこれらのMakefileを生成していた場合、1つのルートになりますが、あなたの質問はそうではないと示唆しています)。

于 2012-10-11T09:05:38.783 に答える
-1

cleanMakefile で、次のような定義で名前が付けられたターゲットを見つけることは非常に一般的です。

clean:
    rm -rf *.o core *.stackdump

次に呼び出すmake cleanと、このターゲットが「構築」されます。つまり、指定された名前を持つ現在の作業ディレクトリ内のすべてのファイルが、極度の偏見を持って削除されます。

これは、おおよそ、オプション 2 が示唆するものです。おそらく、実行されるcleanたびに「ビルド」されるようなメイクファイルを作成できますmake。これは、Makefile の解析や の出力の分析よりも簡単だと思いますmake -d。おそらく、@ Norman Grayの回答で提起された問題を回避する簡単な方法でもあります.

于 2012-10-11T09:28:06.513 に答える