2015-08-20 2 views
2

Учитывая Makefile с target-specific Defintion:Как переопределить целевую переменную из командной строки?

# A target-specific definition for both: 'all' and 'x'. 
all : foo += target 
x : foo += target 


all : x ; 

x :: 
    @echo '$(foo)' 


Бег, я получаю:

# override Makefile-level variables, with a command-line definition. 
$ make foo=cmd 
cmd 



Теперь же Makefile, как указано выше, но с pattern-specific Defintion:

# A pattern-specific definition that matches both targets: 'all' and 'x'. 
% : foo += target 


all : x ; 

x :: 
    @echo '$(foo)' 


Бег, я получаю:

# override Makefile-level variables, with a command-line definition. 
$ make foo=cmd 
cmd cmd cmd 

Теперь оба Makefiles почти идентичные, за исключением:

  • Для версии 1 Makefile:мишенью -специфического определением), мы имели:
    all : foo += target
    x : foo += target
  • Для версии 2 Makefileрисунка -специфическое определение), у нас было:
    % : foo += target

В обоих случаях, мы имели в основном конфигурацию же:

  1. Шаблон/целевое определение, которое присоединяет к предыдущему значению.
  2. Используется определение рисунка/цели как, так и all и x целей.
  3. У нас было определение командной строки, которое должно быть переопределить определение уровня файла makefile.

Теперь, интерпретации или реализации, что переопределение, Make использует совершенно иную методику, для версии (целевое определение), чем версия (определение модели).

Давайте посмотрим:

  • Для определения целевого, сделать полностью игнорирует любые значение, определенное в Makefile. Следовательно, окончательное значение: cmd.
  • Для определения шаблона, однако, сделать придумывает «примирительный» подход, пытаясь удовлетворить как, определение Makefile уровня и командной строки дефиниция, так что:
    1. признает, что окончательное значение cmd, в командной строке, которая переопределяет определение make-файла.
    2. Но, поскольку make-файл подразумевает, что «шаблоны» должны «добавлять» дополнительные значения - неважно, что те же самые значения были переопределены - Make будет по-прежнему «подчиняться» этим добавлениям, но это будет сделано с разными значения (т. е. значение командной строки «выигрыш»), тем самым достигая «компрометации», где и make-файл, или командная строка, имеют единственный контроль над конечным значением переменной.

Ну, эти различные подходы, которые делают необходимые для реализации командной строки переопределения, (за шаблон против целевого конкретных переменных), является еще более очевидным, когда мы ожидаем, что очень разные конечные результатов, которые мы получаем для них, соответственно:

  1. cmd (для конкретных целей).
  2. cmd cmd cmd (для образца).

Это оправдано? И как это?

ответ

2

Это, как представляется, минимальный полный пример:

%: foo += targ 

x: 
    @echo $(foo) 

Вызванный в make foo=cmd (с использованием GNUMake v3.81), это приводит к

cmd cmd 

Это выглядит как ошибка для меня. Согласно the manual:

Переменным в командной строке (и в окружающей среде, если «-e» вариант находится в силе), будет иметь приоритет над [целевым конкретным переменными].

Таким образом, инструкция + = не должна иметь никакого эффекта. Но очевидно, что если задание находится в правиле шаблона, значение командной строки перегружает значение , которое правило пытается добавить, но не действие , добавляющее его, так что Make добавляет $(foo) к себе.

Смежные вопросы