реклама на сайте
подробности

 
 
> makefile, в чем ошибка?
Сергей Борщ
сообщение Dec 22 2007, 20:48
Сообщение #1


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Пишу 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) :


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
spf
сообщение Dec 23 2007, 12:25
Сообщение #2


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(Сергей Борщ @ 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 $@


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 06:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01365 секунд с 7
ELECTRONIX ©2004-2016