Я знаю, что вы можете использовать операторы 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])
Я все еще немного смущен тем, как это работает, хотя
$(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?).