Цитата(Сергей Борщ @ Dec 23 2007, 01:48)

Пишу 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 $@