2011-04-08 3 views
1

У меня есть проект baremetal, который включает файлы .s в файлы .c. Интересно, как я могу написать make-файл, где я sepparate компилировать файлы .s из файлов .c. Файлы находятся во вложенных папках (источник, включение, запуск) программы. Я собирался сделать что-то подобное. Это хорошо? Как я могу связать объекты с exe?makefile с .s файлами рядом с .c файлами

SHELL := /bin/bash 
ROOT := $(shell pwd) 
VPATH := $(ROOT)/source:/$(ROOT)/startup:$(ROOT)/include 
EXE := exe 
OBJECTS_GCC := $(patsubst %.c,%.o,$(wildcard *.c)) 
OBJECTS_AS := $(patsubst %.s,%.o,$(wildcard *.s)) 
AS := arm-none-eabi-as -mcpu=arm926ej-s -Wall 
GCC := arm-none-eabi-gcc -mcpu=arm926ej-s -Wall 
LD := arm-none-eabi-ld -T test.ld -o $(EXE) 

all: $(EXE) 
$(EXE): startups sources 

startups: $(OBJECTS_AS) 
    $(AS) $(OBJECTS_AS) 

sources: $(OBJECTS_GCC) 
    $(GCC) $(OBJECTS_GCC) 

У меня возникли трудности с поиском любого примера, включающего файлы .s вместе с .c файлами.

С уважением.


Вот последняя версия Makefile, где найдены header.h разве:

SHELL := /bin/bash 
ROOT := $(shell pwd) 
INC := $(ROOT)/inc 
SRC := $(ROOT)/src 
STR := $(ROOT)/str 
EXE := exe 
AS := arm-none-eabi-as -mcpu=arm926ej-s -c -Wall -I $(INC) -I$(SRC) -I $(STR) 
GCC := arm-none-eabi-gcc -mcpu=arm926ej-s -c -Wall -I $(INC) -I$(SRC) -I $(STR) 
LDSCRIPT := test.ld 
LD := arm-none-eabi-ld -T $(LDSCRIPT) 
HEADERS := $(notdir $(wildcard $(INC)/*.h)) 
SOURCES_GCC := $(notdir $(wildcard $(SRC)/*.c)) 
SOURCES_AS := $(notdir $(wildcard $(STR)/*.s)) 
OBJECTS_GCC := $(SOURCES_GCC:.c=.o) 
OBJECTS_AS := $(SOURCES_AS:.s=.o) 
VPATH := $(STR):$(SRC):$(INC) 

all : $(EXE) 
    @echo konec postopka: izvrsljiv program po imenu $(EXE) se nahaja v mapi $(ROOT) 

$(EXE) : $(OBJECTS_AS) $(OBJECTS_GCC) 
    @echo objekti so: $(OBJECTS_AS) $(OBJECTS_GCC) 
    @echo headerji so: $(HEADERS) 
    @echo linkanje objektov v izvrsljiv program... 
    $(LD) -o [email protected] $^ 

%.o : %.s %.h 
    @echo prevajanje ASSEMBLY izvornih datotek... 
    $(AS) -o [email protected] $< 

%.o : %.c %.h 
    @echo prevajanje C izvornih datotek... 
    $(GCC) -o [email protected] $< 

.PHONY : clean 
clean : 
    @echo brisanje objektov 
    rm *.o 
    @echo brisanje izvrsljivega programa 
    rm $(EXE) 
+0

В ответ на обновленный Makefile, я понятия не имею, почему header.h не найден, если он действительно существует в каталоге ИНК. Однако я отмечаю, что вы указали в одном из своих комментариев, что header.h - ваш единственный заголовок, но неявное правило, которое вы определили, ищет отдельный заголовок для каждого объектного файла. Если только один заголовочный файл, и каждый объектный файл зависит от него, вы должны явно указать его, а не использовать шаблон% .h. Измените правило шаблона на '% .o:% .s header.h' или удалите% .h из правила шаблона и поместите в следующую строку:' $ (OBJECTS_AS) $ (OBJECTS_GCC): header.h'. – eriktous

+0

Возможно, вам стоит начать новый вопрос для этой новой проблемы с отсутствующим заголовком. Включите ваш последний файл makefile и точное сообщение об ошибке, которое вы получите при запуске. – eriktous

+0

Я начал новую тему, и нам удалось решить некоторые проблемы. Теперь make-файл работает. Этот make-файл предназначен для другого проекта с той же древовидной структурой и большим количеством заголовков в папке inc, изменение soo% .h в header.h не является вариантом. Пожалуйста, загляните сюда: http: // stackoverflow.com/questions/5626606/make-uses-cc-вместо-arm-none-eabi-as – 71GA

ответ

4

Подумайте о том, какие команды будут выдавать без make. Какие шаги вы предпримете? Какие файлы вы создаете в первую очередь и как файлы зависят от существования других, прежде чем они могут быть сделаны?
Как только вы получите четкое представление об этом, напишите правила make, которые имитируют эти команды, но с включением переменных make.

Если у вас есть это, вы можете улучшить свой make-файл, используя такие вещи, как неявные правила, автоматические переменные и т. Д., Но сначала сохраните их, пока не получите представление о том, как работает make.

Пару моментов:

  • Я не думаю, что функция подстановочные подберут любые имена файлов таким образом. Он просматривается только в текущем каталоге и не использует VPATH для поиска в других.
  • Вы используете gcc с объектами в качестве входов. Таким образом, он (попытается) создать исполняемый файл.
  • У вас нет правил для создания объектных файлов. Это может быть хорошо, если вы полагаетесь на встроенные неявные или шаблонные правила make, но он не будет использовать версию gcc, которую вы хотите использовать, с ее связанными флагами. Вы должны настроить некоторые другие переменные для работы (например, CC, CFLAGS и т. Д.).
  • Вы определили LD, но никогда не используете его. Используйте его в рецепте для создания исполняемого файла.

Я думаю, вы должны иметь что-то больше, как это:

all: $(EXE) 

$(EXE): $(OBJECTS_AS) $(OBJECTS_GCC) 
    $(LD) $^ 

%.o: %.s 
    $(AS) $< 

%.o: %.c 
    $(GCC) -c $< 
+0

Выполняется ли эта часть цикла кода до тех пор, пока все файлы .s не будут прочитаны? % .o:% .s $ (AS) $ < – 71GA

+0

@ 71GA: Он предоставляет общий шаблон для создания файла * .o из соответствующего файла * .s. Строка '$ (EXE): $ (OBJECTS_AS) $ (OBJECTS_GCC)' сообщает, что все эти объектные файлы необходимы, прежде чем пытаться создать $ (EXE). Для каждого объектного файла отдельно 'make', тогда он ищет, может ли он найти правило для его создания. Если существует файл * .s, который имеет то же имя (без расширения) в качестве файла * .o, он выполняет команду, следующую за '% .o:% .s'. Если он не может найти такой файл * .s, он видит, может ли он найти файл * .c, который соответствует файлу * .o, а затем выполняет команду после '% .o:% .c'. – eriktous

+0

Еще одна вещь. Если я использую $ (OBJECTS_AS) $ (OBJECTS_GCC) в качестве предварительных условий для целевого $ (EXE), я получаю нерешенные ссылки, НО если я помещаю фактические имена моих файлов (которые являются startup.o & test.c) в качестве предварительных условий, мой файл make работает , Должна быть еще одна ошибка. – 71GA

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