Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Старое » Makefile для целей debug/release


Makefile для целей debug/release

Сообщений 1 страница 6 из 6

1

Накромсал тут Makefile, который автоматом make clean вызывает при смене цели.
Вот пример для ПК:

Код:
# run `make DEF=...` to add extra defines
PROGRAM := test
LDFLAGS := -fdata-sections -ffunction-sections -Wl,--gc-sections -Wl,--discard-all
SRCS := $(wildcard *.c)
DEFINES := $(DEF) -D_GNU_SOURCE -D_XOPEN_SOURCE=1111
OBJDIR := mk
CFLAGS += -O2 -Wall -Wextra -Wno-trampolines -std=gnu99
OBJS := $(addprefix $(OBJDIR)/, $(SRCS:%.c=%.o))
DEPS := $(OBJS:.o=.d)
CC = gcc
#CXX = g++
TARGET := RELEASE

all: $(OBJDIR)/RELEASE
all: $(PROGRAM)
release: all

debug: CFLAGS += -DEBUG -Werror
debug: TARGET := DEBUG
debug: $(OBJDIR)/DEBUG
debug: $(PROGRAM)

$(OBJDIR)/DEBUG:
        @make clean
$(OBJDIR)/RELEASE:
        @make clean

$(PROGRAM) : $(OBJDIR) $(OBJS)
        @echo -e "\t\tTARGET: $(TARGET)"
        @> $(OBJDIR)/$(TARGET)
        @echo -e "\t\tLD $(PROGRAM)"
        $(CC) $(LDFLAGS) $(OBJS) -o $(PROGRAM)

$(OBJDIR):
        @mkdir $(OBJDIR)

ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif

$(OBJDIR)/%.o: %.c
        @echo -e "\t\tCC $<"
        $(CC) -MD -c $(LDFLAGS) $(CFLAGS) $(DEFINES) -o $@ $<

clean:
        @echo -e "\t\tCLEAN"
        @rm -rf $(OBJDIR) 2>/dev/null || true

xclean: clean
        @rm -f $(PROGRAM)

.PHONY: clean xclean

2

А вот - пример для STM32F103:

Код:
# make debug adds -DEBUG -Werror
# make ADDEFS="additional defs"
BINARY    = chrono
BOOTPORT	?= /dev/ttyUSB0
BOOTSPEED	?= 115200
# MCU FAMILY
FAMILY    ?= F1
# MCU code
MCU    	?= F103x8
# density (stm32f10x.h, lines 70-84)
DENSITY 	?= MD
# change this linking script depending on particular MCU model,
LDSCRIPT	?= stm32F103xB.ld
DEFS    = ${ADDEFS} -DVERSION=\"0.1.0\"
TARGET := RELEASE
# proxy GPS output over USART1
#DEFS += -DUSART1PROXY

INDEPENDENT_HEADERS=

FP_FLAGS	?= -msoft-float -mfloat-abi=soft
ASM_FLAGS	?= -mthumb -mcpu=cortex-m3 -mfix-cortex-m3-ldrd
ARCH_FLAGS	= $(ASM_FLAGS) $(FP_FLAGS)

###############################################################################
# Executables
#PREFIX    ?= arm-none-eabi
# gcc from arm web site 
PREFIX    ?= /opt/bin/arm-none-eabi
TOOLCHLIB	?= /opt/arm-none-eabi/lib
RM    	:= rm -f
RMDIR    := rmdir
CC    	:= $(PREFIX)-gcc
# don't replace ld with gcc: the binary size would be much greater!!
LD    	:= $(PREFIX)-ld
AR    	:= $(PREFIX)-ar
AS    	:= $(PREFIX)-as
SIZE     := $(PREFIX)-size
OBJCOPY    := $(PREFIX)-objcopy
OBJDUMP    := $(PREFIX)-objdump
GDB    	:= $(PREFIX)-gdb
STFLASH    := $(shell which st-flash)
STBOOT    := $(shell which stm32flash)
DFUUTIL    := $(shell which dfu-util)

###############################################################################
# Source files
OBJDIR     = mk
SRC    	:= $(wildcard *.c)
OBJS    := $(addprefix $(OBJDIR)/, $(SRC:%.c=%.o))
STARTUP    = $(OBJDIR)/startup.o
OBJS     += $(STARTUP)
# dependencies: we need them to recompile files if their headers-dependencies changed
DEPS    := $(OBJS:.o=.d)

INC_DIR ?= ../inc

INCLUDE 	:= -I$(INC_DIR)/Fx -I$(INC_DIR)/cm
LIB_DIR    := $(INC_DIR)/ld

###############################################################################
# C flags
CFLAGS    += -O2 -g -D__thumb2__=1 -MD
CFLAGS    += -Wall -Wextra -Wshadow 
CFLAGS    += -fno-common -ffunction-sections -fdata-sections -fno-stack-protector
CFLAGS    +=  $(ARCH_FLAGS)

###############################################################################
# Linker flags
LDFLAGS    += --static -nostartfiles -nostdlibs 
LDFLAGS    += -L$(LIB_DIR) -L$(TOOLCHLIB)
LDFLAGS    += -T$(LDSCRIPT)

###############################################################################
# Used libraries
LDLIBS    +=  -lc $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)

DEFS    += -DSTM32$(FAMILY) -DSTM32$(MCU) -DSTM32F10X_$(DENSITY)

ELF    := $(OBJDIR)/$(BINARY).elf
LIST	:= $(OBJDIR)/$(BINARY).list
BIN    := $(BINARY).bin
HEX    := $(BINARY).hex

all: $(OBJDIR)/RELEASE
all: bin list size
release: all

debug: CFLAGS += -DEBUG -Werror
debug: TARGET := DEBUG
debug: $(OBJDIR)/DEBUG
debug: bin list size

$(OBJDIR)/DEBUG: 
	make clean
$(OBJDIR)/RELEASE:
	make clean

elf: $(ELF)
bin: $(BIN)
hex: $(HEX)
list: $(LIST)

ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif

$(OBJDIR):
	mkdir $(OBJDIR)

$(STARTUP): $(INC_DIR)/startup/vector.c
	$(CC) $(CFLAGS) $(DEFS) $(INCLUDE) -o $@ -c $<

$(OBJDIR)/%.o: %.c
	@echo "  CC      $<"
	$(CC) $(CFLAGS) $(DEFS) $(INCLUDE) -o $@ -c $<

$(BIN): $(ELF)
	@echo "TARGET: $(TARGET)"
	@> $(OBJDIR)/$(TARGET)
	@echo "  OBJCOPY $(BIN)"
	$(OBJCOPY) -Obinary $(ELF) $(BIN)

$(HEX): $(ELF)
	@echo "  OBJCOPY $(HEX)"
	$(OBJCOPY) -Oihex $(ELF) $(HEX)

$(LIST): $(ELF)
	@echo "  OBJDUMP $(LIST)"
	$(OBJDUMP) -S $(ELF) > $(LIST)

$(ELF): $(OBJDIR) $(OBJS) $(LDSCRIPT)
	@echo "  LD      $(ELF)"
	$(LD) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $(ELF)

size: $(ELF)
	$(SIZE) $(ELF)    

clean:
	@echo "  CLEAN"
	@$(RM) $(HEX)
	@$(RM) -rf $(OBJDIR) 2>/dev/null || true


flash: $(BIN)
	@echo "  FLASH  $(BIN)"
	$(STFLASH) --reset write $(BIN) 0x8000000

boot: $(BIN)
	@echo "  LOAD $(BIN) through bootloader"
	$(STBOOT) -b$(BOOTSPEED) $(BOOTPORT) -w $(BIN)

dfuboot: $(BIN)
	@echo "  LOAD  $(BIN) THROUGH DFU"
	$(DFUUTIL) -a0 -D $(BIN) -s 0x08000000

.PHONY: clean flash boot

3

Честно говоря, терпеть не могу make [как лишнюю сущность )] и по возможности делаю просто и кроссплатформенно
gcc @options.txt @files.txt

Вообще, когда в 2020 язык программирования не может сам разруливать зависимости файлов по текстам программы и требует для этого каких-то внешних костылей - это очень очень печально )

4

Компилятор без понятия, в какой библиотеке находятся нужные тебе функции. И никогда такого не будет, иначе придется подключаться мозгом к компьютеру...

5

Eddy_Em написал(а):

Компилятор без понятия, в какой библиотеке находятся нужные тебе функции. И никогда такого не будет, иначе придется подключаться мозгом к компьютеру...

Modula-2, Ada, Turbo Pascal умеют это уже >30 лет, вообще наверно не осталось уже языков кроме C и C++ которые бы это не умели

6

Интересно, каким образом они "узнают", что, скажем, функция somefunct() лежит в библиотеке libshit, а не в библиотеке libass?
Ответ: никаким. Нет такого способа.
Все эти ограниченные язычонки живут лишь за счет того, что имеют крайне ограниченный набор библиотек. И никто к ним динамические библиотеки не присоединяет.


Вы здесь » Микроконтроллеры » Старое » Makefile для целей debug/release