Jump to content

    

Recommended Posts

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

Share this post


Link to post
Share on other sites
Пишу 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 $@

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this