Правила Makefile и если заявления - как? - PullRequest
5 голосов
/ 14 июня 2011

Я новичок в Makefiles, поэтому, пожалуйста, потерпите меня.

Мне нужно изменить Makefile, чтобы некоторые правила вызывали разные утилиты в зависимости от переменной.

Сейчас правило выглядит так:

ci:
    [shell syntax for tool (A)]

Но теперь мне нужно, чтобы ci имел другой синтаксис в зависимости от переменной. Поэтому я определяю глобальную переменную в верхней части файла:

TOOL = toolA

или

TOOL = toolB

В идеале я бы хотел что-то вроде этого, но очевидно, что это не работает :

ifeq ($TOOL, toolA)
    ci:
        [syntax for tool (A)]
else
    ci:
        [syntax for tool (B)
endif

Кто-нибудь знает лучший способ правильно реализовать что-то подобное?

Спасибо !!

EDIT : синтаксис инструмента сложнее, чем одна строка. Иногда это несколько строк, а не просто «Аргументы инструмента и т. Д.». Извините за путаницу!

Ответы [ 3 ]

4 голосов
/ 14 июня 2011

Вам просто не хватает скобок:

ifeq ($(TOOL), toolA)
...

P.S. Вы можете сделать условие немного более жестким (и убрать небольшую избыточность):

ci:
ifeq ($(TOOL), toolA)
    [syntax for tool (A)]
else
    [syntax for tool (B)
endif
2 голосов
/ 14 июня 2011

Обычно вы делаете это с помощью макроса:

  # put tool A or tool B command line here
  TOOL=...

  ci:
       $(TOOL) args

Это может быть расширено чем-то вроде TOOLARGS макроса, например что-то вроде

  ci:
       $(TOOL) $(TOOLARGS)

Затем вы можете изменитьmake-файл или поместите макросы в командную строку

  $ make TOOL=... TOOLARGS=...

Если вы хотите инкапсулировать его, вы можете использовать if для установки аргументов.

1 голос
/ 15 июня 2011

Попробуйте это:

TOOLARGS_toolA = -a1 -a2
TOOLARGS_toolB = -b1 -b2

ci:
        $(TOOL) $(TOOLARGS_$(TOOL))

Теперь, если TOOL равно toolA, он будет использовать аргументы -a1 -a2, а если TOOL равно toolB, то он будет использовать аргументы -b1 -b2.

...