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. 

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

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

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 .

  • Запустить сценарий оболочки из crontab после остановки / запуска / перезапуска сервера
  • SSH: «Permission denied» после изменения оболочки пользователя
  • Использование getline с NR в awk
  • Касающая проблема: создание имени файла из 2 переменных
  • «Перезапустить» процесс в том же терминале?
  • Как отформатировать атрибуты xml, а не только элементы
  • Что такое Linux для OpenVMS DCL Ctrl / T?
  • «Слишком много аргументов в [(тестовом) заявлении»
  • У меня есть команда, которая выводит каталог, и я хочу записать cd в этот каталог
  • Создание переменных и назначение значений через loop (bash)
  • Как перечислить все существующие оптические драйверы?
  • Есть ли способ освободить память?
  • Interesting Posts

    Сравните 1-й столбец 1-го файла и 2-й столбец второго файла и получите результат следующим образом

    Как проверить скорость сети прямо сейчас?

    Как отключить кнопки «Вперед» / «Назад» на моей мыши

    Удалите принудительные разрывы строк из вывода удачи, сохраняя их для строки автора

    Каковы два файла head.S в источнике Linux?

    Поддержка SCTP для ядра Linux 3.3.4-5.fc17.x86_64

    Символы и разрешения в архивах резервных копий

    Есть ли инструмент для динамического перенаправления вывода на новый файл по запросу

    Можно ли заменить пустые пространства / фон в терминале случайным (но довольно) шаблоном символов ASCII?

    Аутентификация LDAP с обновлением до CentOS 6.4 (sssd)

    Что такое «сетевая» линия в / etc / network / interfaces?

    Почему мой сценарий оболочки дает ошибку: «объявить: не найден»?

    Как установить rpmfusion для установки видеоплеера в Fedora 12?

    Как сохранить «экран» с emacs? Если я убью буфер с emacs, я могу убить процесс?

    Linux Mint 18.1 нет звука

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