0

GNU makefile でファイルをコンパイルする前に、リストに対してファイルをチェックしようとしています。以下の条件付き ifneq は、ルールが呼び出されるたびに評価されますか、それとも一度だけ評価されますか? 条件は常に同じように評価されるようです。

そうでない場合、これを行う唯一の方法は、シェルコマンドに条件を入れることですか? ターゲットリストが「OKではない」というのは奇妙に思えるかもしれません... Makeシステムは確かにその奇妙さを排除するために修正できますが、痛みはより大きくなります.

助言がありますか?エリ

OKSRC := realfile1.cpp realfile2.cpp

%.o: %.cpp
ifneq ($(findstring $<,$(OKSRC),),)
        ... do the compile
else
        #skip the file
endif
4

2 に答える 2

1

Makeドキュメントからの引用:

条件付きディレクティブはすぐに解析されます。これは、たとえば、自動変数はそのルールのレシピが呼び出されるまで設定されないため、条件付きディレクティブでは使用できないことを意味します。条件ディレクティブで自動変数を使用する必要がある場合は、条件をレシピに移動し、代わりにシェル条件構文を使用する必要があります。

ifneqは条件付きディレクティブで$<、自動変数です。つまり、上記のコードは機能しないため、シェルベースの条件を使用する必要があります。

しかし、ハッキングしようとするのではなく、根本原因 (つまり、誤った依存関係の生成) を修正することを強くお勧めします。

于 2012-06-18T20:18:30.577 に答える
0

if関数を使用して、条件が評価されるまで自動変数の展開を延期できると思います。

OKSRC = realfile1.cpp realfile2.cpp

.cpp.o:
    $(if $(findstring $<,$(OKSRC)),$(CC) $(CFLAGS) -c $<,@echo skip $<)

結果は次のとおりです。

$ make realfile1.o realfile2.o realfile3.o
cc  -c realfile1.cpp
cc  -c realfile2.cpp
skip realfile3.cpp
于 2013-10-21T10:49:54.223 に答える