Make-файл if-оператор не оценивает переменные экспорта? - PullRequest
0 голосов
/ 15 июня 2011

Это ответвление на мой другой вопрос .

Есть ли что-то особенное, что я должен сделать, чтобы заставить эту работу работать с переменными экспорта?

Так что я запускаю этот файл Makefile, который включает основной Makefile в другом месте.В этом локальном Makefile у меня есть:

include /path/to/master/Makefile/
export TOOL = A

Теперь в моем Master Makefile у меня есть:

ifeq ( $(TOOL), A )
    echo "Tool A will be run..."
    [syntax for toolA]
else
    echo "Tool B will be run..."
    [syntax for toolB]
endif

Но когда я запускаю gmake, toolB всегда запускается!Я проверил переменную $ (TOOL), и она показывает A. Что я делаю не так?

Спасибо !!

EDIT : Пример добавления Makefile.

Для моей проблемы, перемещение include на после экспорта исправило мою проблему.Но это уже существующий Makefile, и включение include в самом верху всегда работало!

Оператор include находится наверху локального, а весь экспорт - внизу.Только моя новая экспортная линия терпит неудачу.Кто-нибудь знает почему?

Локальный Makefile

export TOOL A
include /path/to/master/Makefile
export VERSION IMP-IR5

Мастер Makefile

export VERSION IAP-100

ci:
ifeq ( $(TOOL), A )
    echo "Tool A will be run..."
    [syntax for toolA]
    echo $(VERSION)
else
    echo "Tool B will be run..."
    [syntax for toolB]
    echo $(VERSION)
endif

Вывод

echo "Tool A will be run..."
Tool A will be run...
echo IMP-IR5
IMP-IR5

Но если я переключу верхнюю часть на строки в локальном Makefile (как это было изначально):

include /path/to/master/Makefile
export TOOL A
export VERSION IMP-IR5

Я получаю:

echo "Tool B will be run..."
Tool B will be run...
echo IMP-IR5
IMP-IR5

Почему IMP-IR5 проходит, но не инструмент A?Так растерялся ...

Ответы [ 2 ]

2 голосов
/ 15 июня 2011

Поместите определение переменной перед оператором include:

export TOOL = A
include /path/to/master/Makefile/

, иначе правило во включенном Makefile его не увидит.

Кроме того, будьте осторожны с пробелами в вашем условии:

ifeq ($(TOOL),A)

РЕДАКТИРОВАТЬ:

Легко!Вы используете две переменные по-разному.Make оценивает make-файл сверху вниз, решает, какие цели перестроить перед тем, как перестраивать любую из них, , а затем выполняет правила, используя любые значения, полученные переменными.Рассмотрим этот make-файл:

# I've added '@' to make it quieter.
ci:
ifeq ( $(TOOL), A )
    @echo "Tool A will be run..."
    @echo $(VERSION)
else
    @echo "Tool B will be run..."
    @echo $(VERSION)
endif

# (Never mind the "export". You aren't calling $(MAKE),
# you're just including a makefile.)
TOOL = A
VERSION = IMP-IR5

Make попадает в строку if, TOOL еще не определен, поэтому он ничего не оценивает, поэтому make-файл выглядит так:

ci:
    @echo "Tool B will be run..."
    @echo $(VERSION)

TOOL = A
VERSION = IMP-IR5

Mow Make определила, что выполнит правило ci, с TOOL = A (слишком поздно) и VERSION = IMP-IR5.Таким образом:

Tool B will be run...
IMP-IR5
2 голосов
/ 15 июня 2011

Попробуйте переместить строку export TOOL = A над оператором include в локальном файле Makefile.Также измените ifeq ( $(TOOL), A ) на ifeq ($(TOOL),A).

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