2016-10-07 2 views
0

У меня есть makefile с этими правилами.Makefile Пропуск правила, хотя существует тип файла

all: $(TARGET) 
OBJECTS = file.o 
    %.o: %.c 
    $(COMPILER) -c $(FLAGS) &< -o C_$(basename [email protected]).o 
    %.o: %.s 
    $(COMPILER) -c $(FLAGS) &< -o S_$(basename [email protected]).o 
... The Linker is then called with *.o to link all the object files 

У меня одинаковое имя файла file.c и file.s в каталоге src. Но make только запускает первое правило для объектного файла. Почему он только компилируется один раз? И как я могу заставить make скомпилировать файлы file.c и file.s, если они существуют в моей папке src?

Я не хочу создавать другое имя файла объекта для другого расширения. Это было бы глупо.

Есть ли способ для меня скомпилировать имя файла с расширением .s и .c?

Я чувствую, что сделать может легко сделать это, и я чего-то не хватает.

Благодарим за помощь. Если я не понимаю, скажите мне, и я попытаюсь объяснить это более подробно.

ответ

0

Вы неправильно понимаете, как работает Make.

Может быть много способов построить цель; Марка будет использовать один из них, а не все. Во всяком случае, ваш Makefile нарушает один из Mad Scientist's rules, в том, что ваш шаблон правила не строят то, что они утверждают, что строить:

%.o: %.c 
    $(COMPILER) -c $(FLAGS) &< -o C_$(basename [email protected]).o 
%.o: %.s 
    $(COMPILER) -c $(FLAGS) &< -o S_$(basename [email protected]).o 

Первый не строит foo.o, он строит C_foo.o; второй не строит foo.o, он строит S_foo.o. Я не знаю, как работает ваше правило привязки, но если это зависит от foo.o, у вас проблемы.

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

C_%.o: %.c 
    $(COMPILER) -c $(FLAGS) &< -o [email protected] 
S_%.o: %.s 
    $(COMPILER) -c $(FLAGS) &< -o [email protected] 

Затем дать ваше правило связывающую любые предпосылки вы думаете, что должно быть. Если вы хотите, чтобы он использовал как C_foo.o, так и S_foo.o (что не похоже на хорошую идею), затем поместите оба из них в список необходимых компонентов.

+0

Это правило №4? Я думаю, у меня может быть отдельный файл filename.o для каждого файла. Это просто делает мой makefile невероятно большим и сложным для поддержания. Есть ли способ заставить makefile создать цель со всеми доступными правилами? –

+0

@Bradleybare: Я не знаю, что * «отдельное имя файла.o для каждого файла» * означает. О какой цели вы говорите? Зачем вам нужно, чтобы Make создавал 'foo.o' с одним правилом, а затем перезаписывал его другим? – Beta

+0

Не знаю. У меня просто есть файлы, называемые DMA2D.c и DMA2D.s, потому что я могу писать правила регистрации в asm, но материал более высокого уровня в c. Я хотел иметь возможность называть их обоих DMA2D, но с другим расширением. По отдельному имени файла. Я имею в виду DMA2D_S.o и DMA2D_C.o. –

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