Как условно присвоить значение переменной в Makefile (BSD + GNU)? - PullRequest
0 голосов
/ 21 октября 2018

У меня (с моей точки зрения) довольно сложный Makefile.

Это в основном потому, что я хотел получить цвета и другие ненужные вещи.

В любом случае, могу ли я прыгнуть прямо в свойвопрос:

Помимо Linux я недавно поддерживаю * BSD, поэтому мне нужно проверить используемую платформу в нескольких местах.Возможно ли назначение условных переменных в Makefile?Что-то вроде:


platform := [ $$(uname) = Linux ] && echo Linux || echo BSD or other

Конечно, это не работает, но, надеюсь, вы поймете мою точку зрения.


Мне нужно решение, которое работает какс BSD make и GNU make.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Осторожно перед использованием этого решения

Комплимент Renaud Pacalet : то, что вы назначаете своим переменным make, это команды оболочки, а не результат их выполнения оболочкой.Это серьезно ограничит их использование (в основном, для рецептов).Вы не сможете использовать их как цели, предварительные условия, определения других переменных, условия условных обозначений make.

Расширение комментария MadScientist

Я цитирую:

Примечание != был добавлен в GNU make в версии 4.0.Это не будет работать в более старых версиях.

А также упрощая кучу ненужных if с, мы могли бы получить рабочую версию на , возможно, на всех версиях как GNU, так иBSD make как в подходе ниже.

Альтернативный подход через оболочку

platform_id = $$( uname -s )

platform = $$( \
    case $(platform_id) in \
        ( Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \
        ( * ) echo Unrecognized ;; \
    esac )

Важные примечания:

  • Вам нужно использовать стандартные = ленивые задания здесь.С оператором непосредственного присваивания := он не работает в make BSD.

  • Вам необходимо использовать ( ... ) в операторе case.В противном случае он не будет работать на OpenBSD


Успешно протестировано на:

Я все еще работаю над тем, чтобы NetBSD 8.0 работал в VirtualBox, поэтому пока не могу подтвердить это.


Дальнейшее тестированиена старых версиях этих систем необходимо, поэтому, если у вас одна из них значительно старше, пожалуйста, проверьте ее, спасибо.

0 голосов
/ 21 октября 2018

Изменить для новой версии вопроса (" работает как с make BSD, так и с GNU make "):

Оператор назначения оболочки !=, очевидно, поддерживается наBSD и GNU make:

platform_id != uname -s

platform != if [ $(platform_id) = Linux ] || \
    [ $(platform_id) = FreeBSD ] || \
    [ $(platform_id) = OpenBSD ] || \
    [ $(platform_id) = NetBSD ]; then \
        echo $(platform_id); \
    else \
        echo Unrecognized; \
    fi

Обратите внимание, что назначения действительно оцениваются оболочкой: именно результат этой оценки присваивается переменным make, а не командам оболочки.

Вот решение, которое требует GNU make.Он работает с GNU make на BSD, но не с BSD make.

Одна возможность - использовать if GNU make функцию :

platform := $(if $(patsubst Linux,,$(shell uname -s)),BSD or other,Linux)

Еще однаполагаться только на условные выражения оболочки:

platform := $(shell [ $$(uname) = Linux ] && echo Linux || echo BSD or other)

Можно также использовать условные выражения GNU :

ifeq ($(shell uname -s),Linux)
platform := Linux
else
platform := BSD or other
endif
...