Условное выражение в 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])
Я все еще немного смущен тем, как это работает, хотя

7

Решение

$(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))
9

Другие решения

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

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?).

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector