Условное включение / выполнение команд Makefile в переменной? - PullRequest
1 голос
/ 10 августа 2011

Я использую Makefile, который я откуда-то получил, и он довольно большой. Я также нашел некоторые вещи, которые я хотел бы иногда менять в make-файле - и самый простой способ сделать это для меня - определить (или нет) переменную (switch) (скажем, OVWRCHOICE) в начале Makefile; а затем в коде make-файла сделайте что-то вроде:

ifdef OVWRCHOICE
  MYOPT = override
  ....
endif

... что все прекрасно и хорошо.

Дело в том, что в конечном итоге мне также необходимо изменить части в части "переопределить", поэтому я хотел бы, чтобы она была в начале файла. Итак, поскольку эта часть «переопределения» содержит несколько команд make - я попытался использовать define, чтобы иметь переменную, которая будет содержать команды (которые будут выполняться в части ifdef OVWRCHOICE...).

Итак, я пришел к этому простому примеру:

# uncomment as needed;
OVWRCHOICE = YES

define SET_OVWRCHOICE
  MYOPT = override
endef
export SET_OVWRCHOICE

# ... many lines of code ...

MYOPT = default

# ... many lines of code...

# without indent:  Makefile:18: *** missing separator.  Stop.
# with tab indent: Makefile:18: *** commands commence before first target.  Stop.
ifdef OVWRCHOICE
    $(SET_OVWRCHOICE)
endif

all:
    @echo $(MYOPT)

... что не так с отмеченными ошибками. Конечно, если вместо этого я использую первый фрагмент в сообщении, все работает нормально, и make выводит ожидаемый результат: «переопределить».

Как бы я поступил в достижении чего-то подобного? Не уверен, что «включение» или «выполнение» «команд Makefile» являются даже правильными терминами в этом контексте; поэтому мне трудно найти отправную точку для поиска:)

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Понял - это описано в Eval Function - GNU `make ';правильная конструкция:

ifdef OVWRCHOICE
$(eval $(call SET_OVWRCHOICE))
endif

Надеюсь, это кому-нибудь поможет,
Приветствия!

1 голос
/ 25 октября 2011

Ну да, я не знал, где архивировать этот фрагмент, так что вернемся к моему старому вопросу :) это не по теме для OP; но здесь идет:

Чтобы проверить, как переменные окружения обрабатываются make-файлом, вот простой пример:

Foo=something
all :
ifdef DEBUG
    @echo "Debug defined"
else
    @echo "Debug NOT defined"
endif

... и вот тест для него:

$ make
Debug NOT defined
$ make DEBUG
make: *** No rule to make target `DEBUG'.  Stop.
$ DEBUG make
DEBUG: command not found
$ DEBUG= make
Debug NOT defined
$ DEBUG=1 make
Debug defined

... очевидно, что правильный синтаксис для установки этой переменной в make-файле из командной строки: "DEBUG=1 make"

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