2016-11-17 5 views
2

Сейчас я изучаю, как использовать make-файлы, и у меня возникают проблемы с переменными внутри правил. Моя цель - проанализировать файл, содержащий имена других файлов, сохранить его в переменной и использовать переменную в качестве «целевого шаблона» для запуска правила для каждого файла. Вот простой пример моей проблемы (я пишу имена файлов для упрощения).Как использовать переменную makefile за пределами правила

Когда я запускаю это:

variable = file1.txt file2.txt file3.txt 

run : $(variable) 

$(variable): %.txt: 
    echo File is [email protected] 

Я получаю следующее, что и я хочу:

$ make run 
echo File is file1.txt 
File is file1.txt 
echo File is file2.txt 
File is file2.txt 
echo File is file3.txt 
File is file3.txt 

Проблема заключается в том, я хочу, чтобы определить variable путем анализа файла, и я хочу этот файл является зависимым, потому что, если он не существует, я сделаю его, используя другое правило в make-файле. Поэтому, когда я определяю переменную в правиле, как это (который я знаю, есть от моего эхо):

target1 : 
    $(eval variable = file1.txt file2.txt file3.txt) 
    echo $(variable) 

run : $(variable) 

$(variable): %.txt: 
    echo File is [email protected] 

я получаю следующее:

$ make target1 
echo file1.txt file2.txt file3.txt 
file1.txt file2.txt file3.txt 

И это:

$ make run 
make: Nothing to be done for `run'. 

Итак, мой вопрос заключается в том, как определить переменную в правиле и использовать ее в строке:

$(variable): %.txt: 
    echo File is [email protected] 

Я пробовал прочитать руководство и Google, но я просто не могу понять это. Я также думаю, что есть простой ответ, который я пропускаю. Большое спасибо за Вашу помощь! :)

+0

Это не работает из-за способа make works: FIRST make обрабатывает ENTIRE makefile, расширяя переменные и т. Д. По мере необходимости. THEN make начинает запускать рецепты для устаревших правил. Таким образом, к тому времени, когда make запускает рецепт для 'target1', который содержит' eval', остальная часть make-файла уже была проанализирована, а 'variable' уже была расширена (до пустой строки). – MadScientist

ответ

2

Если вы можете контролировать содержание созданного файла target1 это легко: просто сделать формат этого файла быть назначением переменного грима, а затем использовать команду include, как это:

run: 

include target1 

run: $(variable) 

$(variable): %.txt: 
     echo File is [email protected] 

target1: 
     echo 'variable = file1.txt file2.txt file3.txt' > [email protected] 

Через магию automatically generated makefiles make заново воссоздает этот целевой файл, а затем повторно запустит его автоматически.

+0

Это большое спасибо! Работает как шарм, и вы очень хорошо его объяснили! :) –

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