GNU make – как конкатенация переменной в зависимости от результата команды оболочки (версия GCC)

Я хочу добавить еще один параметр к переменной CFLAGS make, в зависимости от результата команды оболочки, которую я хочу выполнить за пределами рецепта в разделе «Конфигурация» файла makefile. Это то, что я придумал:

GCC_VERSION := $(shell gcc -dumpversion); \ if [[ ${GCC_VERSION} > 5.0 ]] ; then \ CFLAGS += -D _POSIX_C_SOURCE=199309L; \ fi 

Сначала я выполняю команду с помощью функции make shell, как вы видите выше. Если я выполняю вышеуказанное, он не добавляет этот флаг определения. Я намеренно делаю это на Linux с GCC версии 5.4.0. Я считаю, что это неправильно, потому что тогда мне нужно создать новую оболочку для выполнения условного оператора. В этой новой оболочке переменная GCC_VERSION не будет существовать. Я мог ошибаться.

Если мне это нравится, то (все в одной оболочке):

 $(shell GCC_VERSION=$(gcc -dumpversion); \ if [[ ${GCC_VERSION} > 5.0 ]] ; then \ CFLAGS += -D _POSIX_C_SOURCE=199309L; \ fi) 

я получаю ошибку:

 *** recipe commences before first target. Stop. 

Да, очень запутанно.

Если бы кто-то мог помочь, я был бы признателен. Благодарю.

  • Как создать имя файла для конвейера для удаления всех файлов?
  • chown все файлы на основе шаблона имени файла в текущем каталоге
  • переименовывать файлы с помощью команды rename
  • Что делает `set $ variable`?
  • Как избежать кавычек в оболочке как при использовании ssh, так и sudo?
  • Удаленный telnet для перезагрузки модема не работает
  • bash find: получить каталог найденного файла
  • Как передать команду программе в оболочку?
  • One Solution collect form web for “GNU make – как конкатенация переменной в зависимости от результата команды оболочки (версия GCC)”

    Существует много решений, включая этот. В вашем использовании Makefile

     VERSION5 := $(shell \ GCC_VERSION=$$(gcc -dumpversion); \ [[ $$GCC_VERSION > 5.0 ]]; \ echo $$? ) ifeq (${VERSION5}, 0) CFLAGS += -D _POSIX_C_SOURCE=199309L endif 

    Обратите внимание, в частности, что вам нужно использовать $$ для каждого $ в вашем сценарии оболочки. Этот shell echos 0, если сравнение строк с 5.0 является истинным, else 1, и это сохраняется в переменной make VERSION5 .

    Затем тест ifeq в Makefile сравнивает переменную с 0 и, если она соответствует, редактирует переменную CFLAGS .

    Linux и Unix - лучшая ОС в мире.