Хочется странного. На данный момент есть вполне рабочий makefile со следующим кодом.
CODE
# C source files
CFILES = $(filter %.c, $(SRC))
# Assembly source files
ASMFILES = $(filter %.S, $(SRC))
# Object files
COBJ = $(CFILES:.c=.o)
SOBJ = $(ASMFILES:.S=.o)
OBJ = $(SOBJ) $(COBJ)
##### OBJ = $(patsubst src/%.cpp, obj/%.o, $(SRC))
#all: $(SRC) $(PROJECT).elf $(PROJECT).bin $(PROJECT).lst
$(PROJECT).lst: $(PROJECT).elf
$(OD) -h -S $(PROJECT).elf > $(PROJECT).lst
$(SZ) --format=berkeley $(PROJECT).elf
$(PROJECT).bin: $(PROJECT).elf
$(CP) -O binary $(PROJECT).elf $@
$(PROJECT).elf: $(OBJ)
$(CC) $(LDFLAGS) $(OBJ) -o $@
$(COBJ): %.o: %.c
$(CC) -c $(FEATURES) $(INC) $(CFLAGS) $< -o $@
$(SOBJ): %.o: %.S
$(CC) -c $(ASFLAGS) $< -o $@
$(SRC) - полное имя файла, включая путь. Данная конструкция нормально собирает проект.
Хочется, чтобы объектные файлы лежали в отдельном каталоге: например /obj/.
Написал следующую конструкцию:
CODE
# Object files
COBJ := $(addprefix $(OBJDIR)/,$(notdir $(CSRC:.c=.o)))
AOBJ := $(addprefix $(OBJDIR)/,$(notdir $(ASRC:.S=.o)))
$(PROJECT).lst: $(PROJECT).elf
$(OD) -h -S $(PROJECT).elf > $(PROJECT).lst
$(SZ) --format=berkeley $(PROJECT).elf
$(PROJECT).bin: $(PROJECT).elf
$(CP) -O binary $(PROJECT).elf $@
$(PROJECT).elf: OBJDIR $(AOBJ) $(COBJ)
$(CC) $(LDFLAGS) $(AOBJ) $(COBJ) -o $@
OBJDIR:
$(MKDIR) $(OBJDIR)
$(AOBJ): $(OBJDIR)/%.o : %.S
$(CC) -c $(ASFLAGS) $< -o $@
$(COBJ): $(OBJDIR)/%.o : %.c
$(CC) -c $(FEATURES) $(INC) $(CFLAGS) $< -o $@
При этом получаю ругань на то, что отсутствует цель для ассемблерного файла (.S). Для "сишных", как я понимаю, тоже нет цели. Как мне уговорить make "увидеть" цель для компиляции ассемблерных и сишных исходников?
Спасибо.