Условное выражение в 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?).