3

以下は、私が抱えている問題の簡略化されたメイクファイルです。

all: /tmp/makey/../filey
    @echo All done
/tmp/filey:
    @echo Filey

make を実行すると、次のように表示されます。

make-3.79.1-p7: *対象をすべてにするルールはありません/tmp/makey/../filey', needed by。止まる。

明らかに、/tmp/makey/../filey が /tmp/filey と同じであることを認識していません。これを機能させる方法はありますか?

ありがとう

チャオ -- ムラリ

4

1 に答える 1

6

新しいバージョンの GNU make には、パスを同じ文字列に解決するために前提条件とターゲットに適用できる機能が$(abspath ...)あります。$(realpath ...)これらの名前を自分で作成した場合 (たとえば、$(PREFIX)/../filey)、代わりに使用できます$(dir $(PREFIX))filey

それ以外に、この問題を解決する方法はありません。Makeはターゲットで文字列マッチングを使用し、文字列が同一でない場合、それらは一致しません(単純なプレフィックスを無視する特別なケースがあります./)makeがこの区別を理解したとしても(おそらく各ターゲット名に abspath 自体を適用することによって)たとえば、シンボリックリンクに直面してもまだ役に立ちません。

唯一の「本当の」答えは、パス名を参照せずにファイルについて話すことができるように、基礎となるファイルシステム (デバイス ID や inode など) について何かを make が理解することです。ただし、make のような移植可能なプログラムでは、これを行うのは問題があります。

于 2013-03-29T12:58:00.390 に答える