make-файл с файлами .s рядом с файлами .c - PullRequest
1 голос
/ 08 апреля 2011

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

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.

С уважением.


Вот последняя версия make-файла, где не найден 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 $@ $^

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

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

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

1 Ответ

4 голосов
/ 08 апреля 2011

Подумайте, какие команды вы бы использовали без 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 $<
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...