Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: makefile
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Сергей Борщ
Пишу makefile. Надо компилить два набора исходников (ARM и THUMB). Уже выкинул все, сейчас файл выглядит так:
Код
TARGET = arm-elf-
CC   = $(TARGET)gcc
AS   = $(TARGET)gcc -x assembler-with-cpp

SRC_ARM = ./Src/crt.s

OBJ_ARM  = $(SRC_ARM:.s=.o)

# makefile rules

all: $(OBJ_ARM)

$(OBJ_ARM) : %.o : %.c
    $(CC) -c $< -o $@

$(OBJ_ARM) : %.o : %.cpp
    $(CC) -c $< -o $@

$(OBJ_ARM) : %.o : %.s
    $(AS) -c $< -o $@
При запуске make получаю кучу варнингов:
Цитата
makefile:17: warning: overriding commands for target `Src/crt.o'
makefile:14: warning: ignoring old commands for target `Src/crt.o'
makefile:20: warning: overriding commands for target `Src/crt.o'
makefile:17: warning: ignoring old commands for target `Src/crt.o'
make.exe: *** No rule to make target `Src/crt.c', needed by `Src/crt.o'. Stop.
Смотрю в качестве примера makefile от FreeRTOS, там все работает. Голову сломал - где у меня ошибка? Если убрать $(OBJ_ARM) :, то все работает, но мне надо именно с ней, ибо потом будут еще и $(OBJ_THUMB) :
Alex03
Дык ты пытаешся переопределить завизимости.
Введи ещё 3 понятия, типа OBJ_ARM_C, OBJ_ARM_CPP, OBJ_ARM_ASM, а уже OBJ_ARM сделай зависимым от этих трёх.
spf
Цитата(Сергей Борщ @ Dec 23 2007, 01:48) *
Пишу makefile. Надо компилить два набора исходников (ARM и THUMB).


1. Make mak'y рознь. Можно конечно предположить что речь идет о наиболее распространенном -- GNU Make.

Материалы по GNU Make на русском от Владимира Игнатова:

2. Цель непонятна. Что в конечном итоге надо получить при запуске make?
При одном запуске получить два варианта результатов?

-----------------

Посмотрел в пример ARM7_LPC2106_GCC от FreeRTOS (в недрах примеров навалом makefile, причем все сделаны левой ногой, по принципу работает и ладно smile.gif ) Стройного понимания принципов работы make из этих примеров не получить. Запуск make из батника это вообще не по-пацански wink.gif .

Видимо надо в однин результирующий файл собирать объектники, компилированные в разных режимах.

В makefile должны быть четко заданы цели, зависимости и правила для получения целей.

Расшифрую то, что у тебя в примере
Код
# Все файлы списка OBJ_ARM(во время работы будет принято ./Src/crt.o)
# получаются из одноименных файлов с расширением .c
#(во время работы будет принято ./Src/crt.c)
$(OBJ_ARM) : %.o : %.c
    $(CC) -c $< -o $@

# Все файлы списка OBJ_ARM(во время работы будет принято ./Src/crt.o)
# получаются из одноименных файлов с расширением .cpp
#(во время работы будет принято ./Src/crt.cpp)
$(OBJ_ARM) : %.o : %.cpp
    $(CC) -c $< -o $@

# Все файлы списка OBJ_ARM(во время работы будет принято ./Src/crt.o)
# получаются из одноименных файлов с расширением .s
#(во время работы будет принято ./Src/crt.s)
  $(OBJ_ARM) : %.o : %.s
    $(AS) -c $< -o $@

Так так происходит многократное переопределение правила для получения цели (Src/crt.o), остается правило где .o зависит от .c (порядок вытеснения надо уточнять), файла Src/crt.с нет и нет правила для его получения. Make не знает что ему делать, поэтому выпадает в осадок...

В примере ARM7_LPC2106_GCC
Код
# Цель rtosdemo.elf зависит от всех файлов из списков ARM_OBJ,
# THUMB_OBJ, CRT0 и Makefile
# Все файлы _OBJ в соответствии с записанными правилами зависят от одноименных
# исходных файлов.
rtosdemo.elf : $(ARM_OBJ) $(THUMB_OBJ) $(CRT0) Makefile
    $(CC) $(CFLAGS) $(ARM_OBJ) $(THUMB_OBJ) -nostartfiles $(CRT0) $(LINKER_FLAGS)

# Все файлы списка THUMB_OBJ зависят и
# получаются из одноименных файлов с расширением .c (THUMB_SRC)
$(THUMB_OBJ) : %.o : %.c $(LDSCRIPT) Makefile
    $(CC) -c $(THUMB_FLAGS) $(CFLAGS) $< -o $@

# Все файлы списка ARM_OBJ зависят и
# получаются из одноименных файлов с расширением .c (ARM_SRC)
$(ARM_OBJ) : %.o : %.c $(LDSCRIPT) Makefile
    $(CC) -c $(CFLAGS) $< -o $@


Списки THUMB_OBJ и ARM_OBJ НЕ пересекаются.


Можно сделать иначе, через целе-зависимые значения переменных.
Делается одно правило получения .o из .c, но для одного из списка указывается особенные переменные.
Вариант (не проверял данный файл, но в своих makefile'ах такая конструкция работает):
Код
ARM_OBJ = $(ARM_SRC:.c=.o)
THUMB_OBJ = $(THUMB_SRC:.c=.o)

$(THUMB_OBJ): THUMB_FLAGS = -mthumb

rtosdemo.hex : rtosdemo.elf
    $(OBJCOPY) rtosdemo.elf -O ihex rtosdemo.hex

rtosdemo.elf : $(ARM_OBJ) $(THUMB_OBJ) $(CRT0) Makefile
    $(CC) $(CFLAGS) $(ARM_OBJ) $(THUMB_OBJ) -nostartfiles $(CRT0) $(LINKER_FLAGS)

%.o : %.c $(LDSCRIPT) Makefile
    $(CC) -c $(THUMB_FLAGS) $(CFLAGS) $< -o $@
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.