Условное выражение в Makefile

Я знаю, что вы можете использовать операторы if в make-файлах:

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)  

И если нет, то какой самый идиоматичный способ добиться примера

Я добавил тег C++, потому что у вопроса было только 7 просмотров, и я подумал, что кто-то, кто использовал C++, может знать ответ, я знаю, что это не совсем вопрос C++ (хотя я планирую скомпилировать C++ с ним)

РЕДАКТИРОВАТЬ: похоже, если есть функция, использующая этот синтаксис
$(if condition,then-part[,else-part])
Я все еще немного смущен тем, как это работает, хотя

2 ответа

Решение

$(if ...) функция может служить троичным оператором, как вы обнаружили. На самом деле вопрос в том, как работают условные выражения (истина или ложь) в GNU? В GNU make в любом месте, где необходимо условие (логическое выражение), пустая строка считается ложной, а любое другое значение считается истинным.

Итак, чтобы проверить, $(CC) это строка gcc вам нужно будет использовать функцию, которая будет возвращать пустое значение, когда оно не, и непустое значение, когда оно есть.

Типично filter а также filter-out функции используются для этого. К сожалению, проще всего использовать их таким образом, чтобы получить "не равный" результат; другими словами, используя эти функции, намного проще точно генерировать непустую строку (true), если строка не gcc и пустая строка (false), если значение gcc, Например:

$(if $(filter-out gcc,$(CC)),$(info is not gcc),$(info is gcc))

Если единственный эффект, которого вы пытаетесь достичь, - это использовать тот или другой компилятор, я думаю, что лучший способ - это использовать переменную для этого специального шага компиляции и установить ее в зависимости от вашего состояния.

ifeq (condition)
    MYCC=$(CC2)
    LIBS=$(LIBS_FOR_CC2)
else
    MYCC=$(CC)
    LIBS=$(LIBS_FOR_CC)
endif

а затем позже в правиле для использования компиляции

$(MYCC) -o foo $(objects) $(LIBS)

По крайней мере, так я помню структурирование make-файлов в а) конфигурацию и б) наборы правил.

Извините, если это не отвечает на ваш вопрос, но мне не известен оператор ternay для GNU make (и я предполагаю, что вы имеете в виду GNU make?).

Другие вопросы по тегам