Сергей Борщ 143 22 декабря, 2007 Опубликовано 22 декабря, 2007 · Жалоба Пишу 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 0 23 декабря, 2007 Опубликовано 23 декабря, 2007 · Жалоба Дык ты пытаешся переопределить завизимости. Введи ещё 3 понятия, типа OBJ_ARM_C, OBJ_ARM_CPP, OBJ_ARM_ASM, а уже OBJ_ARM сделай зависимым от этих трёх. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spf 0 23 декабря, 2007 Опубликовано 23 декабря, 2007 · Жалоба Пишу makefile. Надо компилить два набора исходников (ARM и THUMB). 1. Make mak'y рознь. Можно конечно предположить что речь идет о наиболее распространенном -- GNU Make. Материалы по GNU Make на русском от Владимира Игнатова: Эффективное использование GNU Make. Перевод руководства к версии 3.79 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 $@ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться