18

makefile で次のような if ステートメントを使用できることはわかっています。

foo: $(objects)
ifeq ($(CC),gcc)
        $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif

おそらく三項型演算子のような条件付き置換を行う方法はありますか。

(condition?$(CC):$(CC2)) -o foo $(objects) $(libs_for_gcc)  

そして、例を達成するための最も慣用的な方法がない場合

質問には7つのビューしかなく、c++を使用した人は答えを知っている可能性が高いと考えたため、c++タグを追加しました。これは厳密にはc++の質問ではないことを知っています(ただし、c++をコンパイルする予定です)

編集:この構文を使用する if 関数があるよう
$(if condition,then-part[,else-part])
ですが、それがどのように機能するかについてはまだ少し混乱しています

4

2 に答える 2

22

あなたが発見したように、$(if ...)関数は三項演算子として機能できます。本当の問題は、条件 (true と false) が GNU make でどのように機能するかということです。GNU make anyplace では、条件 (ブール式) が必要な場合、空の文字列は false と見なされ、その他の値は true と見なされます。

$(CC)そのため、文字列であるかどうかをテストするには、そうgccでない場合は空の値を返し、そうである場合は空でない値を返す関数を使用する必要があります。

通常、これには関数filterfilter-out関数が使用されます。残念ながら、「等しくない」結果が得られるような方法でこれらを使用するのが最も簡単です。つまり、これらの関数を使用すると、文字列が でない gcc場合は空でない文字列 (true) を正確に生成し、値 gccの場合は空の文字列 (false) を正確に生成することがはるかに簡単になります。例えば:

$(if $(filter-out gcc,$(CC)),$(info is not gcc),$(info is gcc))
于 2013-07-31T22:33:48.800 に答える