сделать & gmake совместимым, если еще заявление - PullRequest
6 голосов
/ 01 февраля 2012

Существует ли какой-либо оператор if / else, совместимый с GNU make и Berkley make (freeBSD)?

GNU MAKE:

 ifeq ($(BUILD_TYPE), debug)

Беркли Марка:

.ifdef (BUILD_TYPE)

1 Ответ

6 голосов
/ 02 февраля 2012

Нет. Лучшее, что вы можете сделать, это использовать включаемые файлы с созданными именами, например:

include $(BUILD_TYPE).mk

где BUILD_TYPE будет "отладка" или что-то еще. Это, конечно, не так мощно, как если бы / иначе, но оно может хорошо выполнять ограниченный набор вещей, портативно.

В общем случае практически невозможно написать переносимый make-файл, в котором используется какая-либо более сложная функция, чем основы, предоставляемые POSIX. Синтаксис make-файла настолько свободен и имеет произвольную форму, но все же функции, предоставляемые традиционным make и стандартом POSIX, настолько анемичны, что большинство производителей make создали большое количество несовместимых расширений.

Как правило, когда люди задаются вопросом об этом, я рекомендую либо использовать automake, который берет на себя утомительную работу по написанию переносимых make-файлов для вас, либо они обязуются делать то или другое или просто требовать, чтобы люди собирали его, если они нет его GNU make, безусловно, будет работать на самых разных платформах ... даже на не POSIX-платформах.

...