Перейти к содержанию
    

makefile

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык ты пытаешся переопределить завизимости.

Введи ещё 3 понятия, типа OBJ_ARM_C, OBJ_ARM_CPP, OBJ_ARM_ASM, а уже OBJ_ARM сделай зависимым от этих трёх.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишу makefile. Надо компилить два набора исходников (ARM и THUMB).

 

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

 

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

 

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

При одном запуске получить два варианта результатов?

 

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

 

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

 

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

 

В 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 $@

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...