Still using my own private rules, but now using the linker script generator so no need to keep expanding on including .ld files in core libopencm3
172 lines
5.3 KiB
Makefile
172 lines
5.3 KiB
Makefile
##
|
|
## This file is part of the libopencm3 project.
|
|
##
|
|
## This library is free software: you can redistribute it and/or modify
|
|
## it under the terms of the GNU Lesser General Public License as published by
|
|
## the Free Software Foundation, either version 3 of the License, or
|
|
## (at your option) any later version.
|
|
##
|
|
## This library is distributed in the hope that it will be useful,
|
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
## GNU Lesser General Public License for more details.
|
|
##
|
|
## You should have received a copy of the GNU Lesser General Public License
|
|
## along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
##
|
|
|
|
# This version of rules.mk expects the following to be defined before
|
|
# inclusion..
|
|
### REQUIRED ###
|
|
# DEVICE=xxxx - this tree uses the genlink-config.mk and genlink-rules.mk!
|
|
# OPENCM3_DIR - duh
|
|
# PROJECT - will be the basename of the output elf, eg usb-gadget0-stm32f4disco
|
|
# CFILES - basenames only, eg main.c blah.c
|
|
# The follow vars are assumed to have been created via genlink.mk
|
|
# xOPENCM3_LIB - the basename, eg: opencm3_stm32f4
|
|
# SOURCED VIA devices.data!
|
|
# xOPENCM3_DEFS - the target define eg: -DSTM32F4
|
|
# SOURCED VIA devices.data!
|
|
# xARCH_FLAGS - eg, -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16
|
|
# (ie, the full set of cpu arch flags, _none_ are defined in this file)
|
|
# SOURCED VIA devices.data!
|
|
# xLDSCRIPT - full path, eg ../../examples/stm32/f4/stm32f4-discovery/stm32f4-discovery.ld
|
|
# SOURCED VIA devices.data!
|
|
#
|
|
### OPTIONAL ###
|
|
# INCLUDES - fully formed -I paths, if you want extra, eg -I../shared
|
|
# BUILD_DIR - defaults to bin, should set this if you are building multiarch
|
|
# OPT - full -O flag, defaults to -Os
|
|
# CSTD - defaults -std=c99
|
|
# CXXSTD - no default.
|
|
# OOCD_INTERFACE - eg stlink-v2
|
|
# OOCD_TARGET - eg stm32f4x
|
|
# both only used if you use the "make flash" target.
|
|
# OOCD_FILE - eg my.openocd.cfg
|
|
# This overrides interface/target above, and is used as just -f FILE
|
|
### TODO/FIXME/notes ###
|
|
# No support for stylecheck.
|
|
# No support for BMP/texane/random flash methods, no plans either
|
|
# No support for magically finding the library.
|
|
# C++ hasn't been actually tested with this..... sorry bout that. ;)
|
|
# Second expansion/secondary not set, add this if you need them.
|
|
|
|
BUILD_DIR ?= bin
|
|
OPT ?= -Os
|
|
CSTD ?= -std=c99
|
|
|
|
# Be silent per default, but 'make V=1' will show all compiler calls.
|
|
# If you're insane, V=99 will print out all sorts of things.
|
|
V?=0
|
|
ifeq ($(V),0)
|
|
Q := @
|
|
NULL := 2>/dev/null
|
|
endif
|
|
|
|
# Tool paths.
|
|
PREFIX ?= arm-none-eabi-
|
|
CC = $(PREFIX)gcc
|
|
LD = $(PREFIX)gcc
|
|
OBJCOPY = $(PREFIX)objcopy
|
|
OBJDUMP = $(PREFIX)objdump
|
|
OOCD ?= openocd
|
|
|
|
# Inclusion of library header files
|
|
include $(OPENCM3_DIR)/mk/genlink-config.mk
|
|
|
|
OBJS = $(CFILES:%.c=$(BUILD_DIR)/%.o)
|
|
|
|
TGT_CPPFLAGS += -MD
|
|
TGT_CPPFLAGS += -Wall -Wundef
|
|
TGT_CPPFLAGS += $(INCLUDES)
|
|
|
|
TGT_CFLAGS += $(OPT) $(CSTD) -ggdb3
|
|
TGT_CFLAGS += $(ARCH_FLAGS)
|
|
TGT_CFLAGS += -fno-common
|
|
TGT_CFLAGS += -ffunction-sections -fdata-sections
|
|
TGT_CFLAGS += -Wextra -Wshadow -Wno-unused-variable -Wimplicit-function-declaration
|
|
TGT_CFLAGS += -Wredundant-decls -Wstrict-prototypes -Wmissing-prototypes
|
|
|
|
TGT_CXXFLAGS += $(OPT) $(CXXSTD) -ggdb3
|
|
TGT_CXXFLAGS += $(ARCH_FLAGS)
|
|
TGT_CXXFLAGS += -fno-common
|
|
TGT_CXXFLAGS += -ffunction-sections -fdata-sections
|
|
TGT_CXXFLAGS += -Wextra -Wshadow -Wredundant-decls -Weffc++
|
|
|
|
TGT_LDFLAGS += -T$(LDSCRIPT) -L$(OPENCM3_DIR)/lib -nostartfiles
|
|
TGT_LDFLAGS += $(ARCH_FLAGS)
|
|
TGT_LDFLAGS += -specs=nano.specs
|
|
TGT_LDFLAGS += -u _printf_float
|
|
TGT_LDFLAGS += -Wl,--gc-sections
|
|
# OPTIONAL
|
|
#TGT_LDFLAGS += -Wl,-Map=$(PROJECT).map
|
|
ifeq ($(V),99)
|
|
TGT_LDFLAGS += -Wl,--print-gc-sections
|
|
endif
|
|
|
|
# nosys is only in newer gcc-arm-embedded...
|
|
LDLIBS += -specs=nosys.specs
|
|
#LDLIBS += -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group
|
|
|
|
# Burn in legacy hell fortran modula pascal yacc idontevenwat
|
|
.SUFFIXES:
|
|
.SUFFIXES: .c .h .o .cxx .elf .bin .list .lss
|
|
|
|
# Bad make, never *ever* try to get a file out of source control by yourself.
|
|
%: %,v
|
|
%: RCS/%,v
|
|
%: RCS/%
|
|
%: s.%
|
|
%: SCCS/s.%
|
|
|
|
all: $(PROJECT).elf $(PROJECT).bin
|
|
flash: $(PROJECT).flash
|
|
|
|
# Need a special rule to have a bin dir
|
|
$(BUILD_DIR)/%.o: %.c
|
|
@printf " CC\t$<\n"
|
|
@mkdir -p $(dir $@)
|
|
$(Q)$(CC) $(TGT_CFLAGS) $(CFLAGS) $(TGT_CPPFLAGS) $(CPPFLAGS) -o $@ -c $<
|
|
|
|
$(BUILD_DIR)/%.o: %.cxx
|
|
@printf " CXX\t$<\n"
|
|
@mkdir -p $(dir $@)
|
|
$(Q)$(CC) $(TGT_CXXFLAGS) $(CXXFLAGS) $(TGT_CPPFLAGS) $(CPPFLAGS) -o $@ -c $<
|
|
|
|
$(PROJECT).elf: $(OBJS) $(LDSCRIPT)
|
|
@printf " LD\t$@\n"
|
|
$(Q)$(LD) $(TGT_LDFLAGS) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $@
|
|
|
|
%.bin: %.elf
|
|
@printf " OBJCOPY\t$@\n"
|
|
$(Q)$(OBJCOPY) -O binary $< $@
|
|
|
|
%.lss: %.elf
|
|
$(OBJDUMP) -h -S $< > $@
|
|
|
|
%.list: %.elf
|
|
$(OBJDUMP) -S $< > $@
|
|
|
|
%.flash: %.elf
|
|
@printf " FLASH\t$<\n"
|
|
ifeq (,$(OOCD_FILE))
|
|
$(Q)(echo "halt; program $(*).elf verify reset" | nc -4 localhost 4444 2>/dev/null) || \
|
|
$(OOCD) -f interface/$(OOCD_INTERFACE).cfg \
|
|
-f target/$(OOCD_TARGET).cfg \
|
|
-c "program $(*).elf verify reset exit" \
|
|
$(NULL)
|
|
else
|
|
$(Q)(echo "halt; program $(*).elf verify reset" | nc -4 localhost 4444 2>/dev/null) || \
|
|
$(OOCD) -f $(OOCD_FILE) \
|
|
-c "program $(*).elf verify reset exit" \
|
|
$(NULL)
|
|
endif
|
|
|
|
clean:
|
|
rm -rf $(BUILD_DIR) $(PROJECT).{elf,bin} $(PROJECT).{list,lss,map} $(LDSCRIPT)
|
|
|
|
include $(OPENCM3_DIR)/mk/genlink-rules.mk
|
|
|
|
.PHONY: all clean flash
|
|
-include $(OBJS:.o=.d)
|
|
|