2015-01-17 2 views
0

объяснений Это фрагмент примера Makefile кода статического правила:Makefile синтаксис статического правила

objects = foo.o bar.o 

all: $(objects) 

$(objects): %.o: %.c 
     $(CC) -c $(CFLAGS) $< -o [email protected] 

что делает это означает, как:

target : %.o : %.c 

ли это означает, что цель:% .o и% .o:% .c поясняют, что вся зависимость цели будет сгенерирована с помощью правила% .o, и рецепт применяется к этому, и все зависимости% .o будут сгенерированы по правилу% .c, а рецепт - применяется?

Пожалуйста, кто-то уточнить его:

1.Что является статическим правилом в Makefile объяснить синтаксис?

2. Рецепт применяется как к правилам% .o и% .c?

3.Is это конкатенация цели: $ (все) .o и $ (все) .o: $ (все) .c где все содержит все имена файлов без расширения?

ответ

1

Ваш фрагмент:

objects = foo.o bar.o 

all: $(objects) 

$(objects): %.o: %.c 
     $(CC) -c $(CFLAGS) $< -o [email protected] 

расширяется (после расширения переменных):

all: foo.o bar.o 

foo.o bar.o: %.o: %.c 
     $(CC) -c $(CFLAGS) $< -o [email protected] 

Это сокращенная для записи:

foo.o: foo.c 
     $(CC) -c $(CFLAGS) $< -o [email protected] 
bar.o: bar.c 
     $(CC) -c $(CFLAGS) $< -o [email protected] 

Так, короче говоря, для каждого target в целевом списке применяет шаблон и создает статическое правило для результата.

+0

Сэр !!!!!! Еще одно уточнение похоже на то, что я пишу: ** run: $ (objects):% .o:% .c **, тогда рецепт будет применяться и для ** run **. Как бы это сделало исполняемый файл ** **. –

+0

Вы не можете написать 'run: $ (objects):% .o:% .c'. Это слишком много двоеточий. Статическое правило шаблона состоит из трех частей, разделенных двоеточиями: список имен целей, первый шаблон, который должен соответствовать каждому из имен целей, и необязательный второй шаблон, который подразумевает предварительное условие. Я не совсем понимаю ваш вопрос. – MadScientist