реклама на сайте
подробности

 
 
> Makefile мечты, распихивание результатов сборки по каталогам.
zemlemer
сообщение Jun 8 2015, 15:08
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 10-06-08
Пользователь №: 38 190



Добрый день.

Хочется странного. На данный момент есть вполне рабочий 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 "увидеть" цель для компиляции ассемблерных и сишных исходников?
Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zemlemer
сообщение Jun 9 2015, 16:08
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 10-06-08
Пользователь №: 38 190



Возможно, я не совсем корректно (или совсем некорректно) сформулировал вопрос. Есть следующая структура каталогов проекта.
Core/
STM32F10x_StdPeriph_Driver/
Project/
Makefile

Я написал для нее следующий makefile.

CODE
PROJECT=RadioModem

RM= rm -f
MKDIR = mkdir -p

OBJDIR = $(CURDIR)/obj

TOOLCHAIN = /opt/gcc-arm-none-eabi-4_9
TOOLCHAIN_BIN = $(TOOLCHAIN)/bin/
TOOLCHAIN_LIB = $(TOOLCHAIN)/arm-none-eabi/lib/
TOOLCHAIN_INC = $(TOOLCHAIN)/arm-none-eabi/include/

CXX = $(TOOLCHAIN_BIN)arm-none-eabi-g++
CC = $(TOOLCHAIN_BIN)arm-none-eabi-gcc
AS = $(TOOLCHAIN_BIN)arm-none-eabi-as
LD = $(TOOLCHAIN_BIN)arm-none-eabi-ld
CP = $(TOOLCHAIN_BIN)arm-none-eabi-objcopy
OD = $(TOOLCHAIN_BIN)arm-none-eabi-objdump
SZ = $(TOOLCHAIN_BIN)arm-none-eabi-size

# Interrupts vector table
VECTOR = $(CURDIR)/Core/src/startup_stm32f10x_hd.S
# Linker script
LDSCRIPT = $(CURDIR)/Core/stm32_flash.ld
LDFLAGS = -T$(LDSCRIPT) -L$(TOOLCHAIN_LIB) -nostartfiles -Xlinker --gc-sections -Wl,-Map,$(PROJECT).map -mcpu=cortex-m3 -mthumb

#assembler flags
ASFLAGS = -x assembler-with-cpp -Wall -c -fmessage-length=0 -mcpu=cortex-m3 -mthumb
# compiler flags
CFLAGS = -mthumb -mcpu=cortex-m3 -Os -fno-builtin -Wall -std=gnu99


INC := -I$(CURDIR)/STM32F10x_StdPeriph_Driver/inc/
INC += -I$(CURDIR)/Core/inc/
INC += -I$(CURDIR)/Project/inc/
INC += -I$(TOOLCHAIN_INC)

DEFINITIONS := -DSTM32F10X_HD
DEFINITIONS +=-DUSE_STDPERIPH_DRIVER
DEFINITIONS +=-DMAGOR_VER=0
DEFINITIONS +=-DMINOR_VER=1

CFLAGS+= $(DEFINITIONS)
CFLAGS+= $(INC)


# System sources
ASRC := $(VECTOR)
CSRC := $(wildcard $(CURDIR)/STM32F10x_StdPeriph_Driver/src/*.c)
CSRC += $(wildcard $(CURDIR)/Core/src/*.c)

# Project sources
CSRC += $(CURDIR)/Project/src/main.c
CSRC += $(CURDIR)/Project/src/stm32_it.c

COBJ := $(CSRC:.c=.o)
AOBJ := $(ASRC:.S=.o)

#COBJ := $(addprefix $(OBJDIR)/, $(notdir $(CSRC:.c=.o)))
#AOBJ := $(addprefix $(OBJDIR)/, $(notdir $(ASRC:.S=.o)))

all: $(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: $(OBJDIR) $(AOBJ) $(COBJ)
$(CC) $(LDFLAGS) $(AOBJ) $(COBJ) -o $@

$(OBJDIR):
$(MKDIR) $(OBJDIR)

%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@

%.o: %.S
$(CC) -c $(ASFLAGS) $< -o $@

clean:
rm -f $(PROJECT) $(COBJ) $(AOBJ)
rm $(PROJECT).elf $(PROJECT).lst $(PROJECT).map $(PROJECT).bin
rm -rf obj
.PHONY: clean



Данный makefile абсолютно рабочий. И он меня почти всем устраивает. Но, у меня возникло желание не загромождать каталоги Core, STM32F10x_StdPeriph_Driver и Project объектными файлами при компиляции.
Как только я заменяю кострукцию
COBJ := $(CSRC:.c=.o)
AOBJ := $(ASRC:.S=.o)
на
COBJ := $(addprefix $(OBJDIR)/, $(notdir $(CSRC:.c=.o)))
AOBJ := $(addprefix $(OBJDIR)/, $(notdir $(ASRC:.S=.o)))
сразу пропадают из видимости make-а правила построения объектников из исходников. Меня это немного смущает. Как можно написать кострукцию зависимости *с и *S файлов, разбросанным по разным каталогам, чтобы правило

%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@

%.o: %.S
$(CC) -c $(ASFLAGS) $< -o $@

работало корректно? Спасибо.



Прикрепленные файлы
Прикрепленный файл  Cpu_M.zip ( 302 килобайт ) Кол-во скачиваний: 8
 
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 01:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016