aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPerry Hung <iperry@alum.mit.edu>2010-06-24 11:16:26 -0400
committerPerry Hung <iperry@alum.mit.edu>2010-06-25 21:23:04 -0400
commit2c043efb66416f3d5cd85f0939054766082354de (patch)
treed5b79a987b9e6e029a0b3b0355bd925f98960940
parent70a18f96b6d55d23ce58ab40ffb61f172c8f6c73 (diff)
downloadlibrambutan-2c043efb66416f3d5cd85f0939054766082354de.tar.gz
librambutan-2c043efb66416f3d5cd85f0939054766082354de.zip
make: Modularize makefiles, add dependency tracking, build-type tracking
Major build system rewrite. New and exciting: 1. Proper dependency tracking. All source files including header files should be properly tracked and recompiled as necessary when they are changed. 2. Build-type tracking. If the target changes from 'ram' to 'flash,' for example, the build system will force a rebuild rather than incorrectly link modules to a different address. 3. New targets: The old 'ram,' 'flash,' and 'jtag' targets have been replaced with the environment variable MAPLE_TARGET, which controls the link address. Users can either export it to their environment, or pass MAPLE_TARGET on the command-line. Once this is set, sketches can be compiled with 'make sketch,' or simply 'make.' Note: the default is MAPLE_TARGET='flash.' The target 'install' now automagically uploads the sketch to the board using the appropriate method. The 'run' target has been renamed to 'debug.' It starts an openocd gdb server. 4. Odds and ends: -Verbose and 'quiet' modes. Set V=1 for verbose compilation, the default is quiet. -Object file sizes and disassembly information is generated and placed in build/$(BOARD).sizes and build/$(BOARD).disas, respectively. -Parallel make with -j should speed things up if you have multiple cores.
-rw-r--r--Makefile303
-rw-r--r--libmaple/rules.mk50
-rw-r--r--support/make/build-rules.mk40
-rw-r--r--support/make/build-targets.mk31
-rw-r--r--support/make/build-templates.mk5
-rw-r--r--support/openocd/flash.cfg4
-rw-r--r--wirish/rules.mk43
7 files changed, 266 insertions, 210 deletions
diff --git a/Makefile b/Makefile
index fae90df..37f617a 100644
--- a/Makefile
+++ b/Makefile
@@ -1,139 +1,105 @@
-# dumb dumb dumb makefile
-# Project name
-PROJECT=maple
-
-# ARM/GNU toolchain parameters
-CC := arm-none-eabi-gcc
-CPP := arm-none-eabi-g++
-LD := arm-none-eabi-ld -v
-AR := arm-none-eabi-ar
-AS := arm-none-eabi-as
-CP := arm-none-eabi-objcopy
-OD := arm-none-eabi-objdump
-
-# Platform detection
-ARCH = $(shell uname -m)
-OS = $(shell uname)
+.DEFAULT_GOAL := sketch
+
+BOARD ?= maple
+MAPLE_TARGET ?= flash
+
+# Useful paths
+SRCROOT := $(dir)
+BUILD_PATH = build
+LIBMAPLE_PATH := libmaple
+
+# Useful variables
+GLOBAL_CFLAGS = -Os -g -mcpu=cortex-m3 -mthumb -march=armv7-m -nostdlib \
+ -ffunction-sections -fdata-sections -Wl,--gc-sections
+
+GLOBAL_CXXFLAGS := -fno-rtti -fno-exceptions -Wall
+
+
+LDDIR := support/ld
+LDFLAGS = -T$(LDDIR)/$(LDSCRIPT) -L$(LDDIR) \
+ -mcpu=cortex-m3 -mthumb -Xlinker \
+ --gc-sections --print-gc-sections --march=armv7-m -Wall
+
+# Set up build rules and some useful templates
+include support/make/build-rules.mk
+include support/make/build-templates.mk
VENDOR_ID = 1EAF
PRODUCT_ID = 0003
-# Modify this if necessary
-DFU = dfu-util
+# Force a rebuild if the maple target changed
+PREV_BUILD_TYPE := $(shell cat $(BUILD_PATH)/build-type 2>/dev/null)
+ifneq ($(PREV_BUILD_TYPE), $(MAPLE_TARGET))
+ $(shell rm -rf $(BUILD_PATH))
+endif
+
+# Some target specific things
+ifeq ($(MAPLE_TARGET), ram)
+ VECT_BASE_ADDR := VECT_TAB_RAM
+ LDSCRIPT := ram.ld
+ UPLOAD := support/scripts/reset.py && \
+ sleep 1 && \
+ $(DFU) -a0 -d $(VENDOR_ID):$(PRODUCT_ID) -D $(BUILD_PATH)/$(BOARD).bin -R
+
+endif
+ifeq ($(MAPLE_TARGET), flash)
+ LDSCRIPT := flash.ld
+ VECT_BASE_ADDR := VECT_TAB_FLASH
+ UPLOAD := support/scripts/reset.py && \
+ sleep 1 && \
+ $(DFU) -a1 -d $(VENDOR_ID):$(PRODUCT_ID) -D $(BUILD_PATH)/$(BOARD).bin -R
+endif
+ifeq ($(MAPLE_TARGET), jtag)
+ LDSCRIPT := jtag.ld
+ VECT_BASE_ADDR := VECT_TAB_BASE
+ UPLOAD := \
+ openocd -f support/openocd/flash.cfg
+endif
+
+# Set all submodules here
+LIBMAPLE_MODULES := libmaple
+LIBMAPLE_MODULES += wirish
+
+# call each module rules.mk
+$(foreach m,$(LIBMAPLE_MODULES),$(eval $(call LIBMAPLE_MODULE_template,$(m))))
+
+# Main target
+include support/make/build-targets.mk
+
+# Fake targets
+POSSIBLE_TARGETS := install sketch clean help debug cscope tags ctags
+.PHONY: $(POSSIBLE_TARGETS)
+
+install: sketch
+ $(UPLOAD)
+
+sketch: MSG_INFO $(BUILD_PATH)/$(BOARD).bin
-BUILD_PATH = build
-LIB_PATH = libmaple
-
-OUTDIRS = $(BUILD_PATH)/$(LIB_PATH) \
- $(BUILD_PATH)/wirish \
- $(BUILD_PATH)/wirish/comm \
- $(BUILD_PATH)/$(LIB_PATH)/usb \
- $(BUILD_PATH)/$(LIB_PATH)/usb/usb_lib
-
-
-
-INCLUDES = -I$(LIB_PATH) \
- -I./ \
- -Iwirish \
- -Iwirish/comm \
- -I$(LIB_PATH)/usb \
- -I$(LIB_PATH)/usb/usb_lib
-
-CFLAGS = $(INCLUDES) -c \
- -Os \
- -g -mcpu=cortex-m3 -mthumb -march=armv7-m -nostdlib \
- -ffunction-sections -fdata-sections -Wl,--gc-sections \
- -D$(DEFFLAGS)
-
-CXXFLAGS = -fno-rtti -fno-exceptions -Wall
-
-LDDIR=support/ld
-LFLAGS = -T$(LDDIR)/$(LDSCRIPT) -L$(LDDIR) \
- -mcpu=cortex-m3 -mthumb -Xlinker \
- --gc-sections --print-gc-sections --march=armv7-m -Wall
-
-CPFLAGS = -v -Obinary
-ODFLAGS = -S
-
-CSRC = libmaple/systick.c \
- libmaple/timers.c \
- libmaple/adc.c \
- libmaple/syscalls.c \
- libmaple/exc.c \
- libmaple/exti.c \
- libmaple/gpio.c \
- libmaple/nvic.c \
- libmaple/usart.c \
- libmaple/util.c \
- libmaple/rcc.c \
- libmaple/flash.c \
- libmaple/spi.c \
- wirish/wirish.c \
- wirish/wirish_shift.c \
- wirish/wirish_analog.c \
- wirish/time.c \
- wirish/pwm.c \
- wirish/ext_interrupts.c \
- wirish/wirish_digital.c \
- libmaple/usb/usb.c \
- libmaple/usb/usb_callbacks.c \
- libmaple/usb/usb_hardware.c \
- libmaple/usb/descriptors.c \
- libmaple/usb/usb_lib/usb_core.c \
- libmaple/usb/usb_lib/usb_init.c \
- libmaple/usb/usb_lib/usb_int.c \
- libmaple/usb/usb_lib/usb_mem.c \
- libmaple/usb/usb_lib/usb_regs.c \
-
-CPPSRC = wirish/wirish_math.cpp \
- wirish/Print.cpp \
- wirish/comm/HardwareSerial.cpp \
- wirish/comm/HardwareSPI.cpp \
- wirish/usb_serial.cpp \
- wirish/cxxabi-compat.cpp \
- main.cpp
-
-# i really have no idea what i'm doing
-meep += $(CSRC)
-moop = $(patsubst %, %, $(meep))
-beep = $(CPPSRC)
-boop = $(patsubst %, %, $(beep))
-
-# English
-MSG_ERRORS_NONE = Errors: none
-MSG_BEGIN = -------- begin --------
-MSG_ETAGS = Created TAGS File
-MSG_END = -------- end --------
-MSG_SIZE = Program Image Size:
-MSG_LINKING = Linking:
-MSG_COMPILING = Compiling C:
-MSG_ASSEMBLING = Assembling:
-MSG_CLEANING = Cleaning project:
-MSG_FLASH = Creating load file for Flash:
-
-
-_COBJ = $(moop:.c=.o)
-_CPPOBJ = $(boop:.cpp=.o)
-COBJ = $(patsubst %, $(BUILD_PATH)/%,$(_COBJ))
-CPPOBJ = $(patsubst %, $(BUILD_PATH)/%,$(_CPPOBJ))
-
-.PHONY: run cscope clean info program_ram program_flash program_jtag
-
-info:
- @echo ""
- @echo "libmaple Makefile help"
- @echo "----------------------"
- @echo "Compile targets:"
- @echo " ram: Compile sketch code for RAM to be loaded over the bootloader"
- @echo " flash: Compile sketch code for flash to be loaded over the bootloader"
- @echo " jtag: Compile sketch code for flash to be loaded over JTAG"
+clean:
+ rm -rf build
+
+help:
@echo ""
- @echo "Programming targets:"
- @echo " program_ram: Upload code to RAM via bootloader"
- @echo " program_flash: Upload code to flash via bootloader"
- @echo " program_jtag: Upload code to flash via jtag"
+ @echo " libmaple Makefile help"
+ @echo " ----------------------"
+ @echo " Compile targets:"
+ @echo " sketch: Compile sketch code"
+ @echo " "
+ @echo " Programming targets:"
+ @echo " install: Upload code to target"
+ @echo " "
+ @echo " Other targets:"
+ @echo " debug: Start an openocd gdb server, port 3333"
+ @echo " clean: Remove all build and object files"
+ @echo " help: Show this message"
+ @echo " "
+
+debug:
+ $(OPENOCD) -f support/openocd/run.cfg
-all: info
+cscope:
+ rm -rf *.cscope
+ find . -name '*.[hcs]' -o -name '*.cpp' | xargs cscope -b
tags:
etags `find . -name "*.c" -o -name "*.cpp" -o -name "*.h"`
@@ -142,82 +108,3 @@ tags:
ctags:
ctags-exuberant -R .
@echo "Made tags file for VIM code browsing"
-
-$(BUILD_PATH):
- mkdir -p build
-
-$(OUTDIRS):
- @echo Making directory $@
- mkdir -p $@
- @echo
-
-# actual build rules
-$(COBJ) : $(BUILD_PATH)/%.o : %.c
- @echo $(MSG_COMPILING) $<
- $(CC) $(CFLAGS) -c $< -o $@
- @echo
-
-$(CPPOBJ) : $(BUILD_PATH)/%.o : %.cpp
- @echo $(MSG_COMPILING) $<
- $(CPP) $(CFLAGS) $(CXXFLAGS) -c $< -o $@
- @echo
-
-# targets
-$(BUILD_PATH)/$(PROJECT).out: $(OUTDIRS) $(COBJ) $(CPPOBJ)
- @echo Linking
- @echo CPP OBJ: $(CPPOBJ)
- @echo
- @echo C OBJ: $(COBJ)
- @echo
- $(CC) $(LFLAGS) -o $(BUILD_PATH)/$(PROJECT).out $(COBJ) $(CPPOBJ)
- @echo
-
-$(BUILD_PATH)/main.bin: $(BUILD_PATH)/$(PROJECT).out
- $(CP) $(CPFLAGS) $(BUILD_PATH)/$(PROJECT).out $(BUILD_PATH)/main.bin
- $(OD) $(ODFLAGS) $(BUILD_PATH)/$(PROJECT).out > $(BUILD_PATH)/$(PROJECT).d
- @echo
- find $(BUILD_PATH) -iname *.o | xargs arm-none-eabi-size -t
- @echo
- @echo "Final Size:"
- arm-none-eabi-size $<
-
-ram: DEFFLAGS := VECT_TAB_RAM
-ram: LDSCRIPT := ram.ld
-ram: $(BUILD_PATH)/main.bin
- @echo "RAM build"
-
-flash: DEFFLAGS := VECT_TAB_FLASH
-flash: LDSCRIPT := flash.ld
-flash: $(BUILD_PATH)/main.bin
- @echo "Flash build"
-
-jtag: DEFFLAGS := VECT_TAB_BASE
-jtag: LDSCRIPT := jtag.ld
-jtag: $(BUILD_PATH)/main.bin
- @echo "JTAG build"
-
-program_ram: ram
- support/scripts/reset.py
- sleep 1
- $(DFU) -a0 -d $(VENDOR_ID):$(PRODUCT_ID) -D build/main.bin -R
-
-program_flash: flash
- support/scripts/reset.py
- sleep 1
- $(DFU) -a1 -d $(VENDOR_ID):$(PRODUCT_ID) -D build/main.bin -R
-
-program_jtag: jtag
- openocd -f support/openocd/flash.cfg
-
-
-run: $(BUILD_PATH)/main.bin
- openocd -f support/openocd/run.cfg
-
-cscope:
- rm -rf *.cscope
- find . -name '*.[hcs]' -o -name '*.cpp' | xargs cscope -b
-
-clean:
- rm -f *.hex *.o
- rm -rf build
-
diff --git a/libmaple/rules.mk b/libmaple/rules.mk
new file mode 100644
index 0000000..60673fe
--- /dev/null
+++ b/libmaple/rules.mk
@@ -0,0 +1,50 @@
+# Standard things
+sp := $(sp).x
+dirstack_$(sp) := $(d)
+d := $(dir)
+BUILDDIRS += $(BUILD_PATH)/$(d)
+BUILDDIRS += $(BUILD_PATH)/$(d)/usb
+BUILDDIRS += $(BUILD_PATH)/$(d)/usb/usb_lib
+
+LIBMAPLE_INCLUDES := -I$(LIBMAPLE_PATH) -I$(LIBMAPLE_PATH)/usb -I$(LIBMAPLE_PATH)/usb/usb_lib
+
+# Local flags
+CFLAGS_$(d) = -I$(d) $(LIBMAPLE_INCLUDES) -D$(VECT_BASE_ADDR)
+
+# Local rules and targets
+cSRCS_$(d) := systick.c \
+ timers.c \
+ adc.c \
+ syscalls.c \
+ exc.c \
+ exti.c \
+ gpio.c \
+ nvic.c \
+ usart.c \
+ util.c \
+ rcc.c \
+ flash.c \
+ spi.c \
+ usb/usb.c \
+ usb/usb_callbacks.c \
+ usb/usb_hardware.c \
+ usb/descriptors.c \
+ usb/usb_lib/usb_core.c \
+ usb/usb_lib/usb_init.c \
+ usb/usb_lib/usb_int.c \
+ usb/usb_lib/usb_mem.c \
+ usb/usb_lib/usb_regs.c
+
+cFILES_$(d) := $(cSRCS_$(d):%=$(d)/%)
+
+OBJS_$(d) := $(cFILES_$(d):%.c=$(BUILD_PATH)/%.o)
+DEPS_$(d) := $(OBJS_$(d):%.o=%.d)
+
+$(OBJS_$(d)): TGT_CFLAGS := $(CFLAGS_$(d))
+
+TGT_BIN += $(OBJS_$(d))
+
+# Standard things
+-include $(DEPS_$(d))
+d := $(dirstack_$(sp))
+sp := $(basename $(sp))
diff --git a/support/make/build-rules.mk b/support/make/build-rules.mk
new file mode 100644
index 0000000..52ede32
--- /dev/null
+++ b/support/make/build-rules.mk
@@ -0,0 +1,40 @@
+# Useful tools
+CC := arm-none-eabi-gcc
+CXX := arm-none-eabi-g++
+LD := arm-none-eabi-ld -v
+AR := arm-none-eabi-ar
+AS := arm-none-eabi-as
+OBJCOPY := arm-none-eabi-objcopy
+DISAS := arm-none-eabi-objdump
+OBJDUMP := arm-none-eabi-objdump
+SIZE := arm-none-eabi-size
+DFU := dfu-util
+OPENOCD := openocd
+
+# Suppress annoying output unless V is set
+ifndef V
+ SILENT_CC = @echo ' [CC] ' $(@:$(BUILD_PATH)/%.o=%.c);
+ SILENT_CXX = @echo ' [CXX] ' $(@:$(BUILD_PATH)/%.o=%.cpp);
+ SILENT_LD = @echo ' [LD] ' $(@F);
+ SILENT_AR = @echo ' [AR] '
+ SILENT_AS = @echo ' [AS] '
+ SILENT_OBJCOPY = @echo ' [OBJCOPY] ' $(@F);
+ SILENT_DISAS = @echo ' [DISAS] ' $(@:$(BUILD_PATH)/%.bin=%).disas;
+ SILENT_OBJDUMP = @echo ' [OBJDUMP] ' $(OBJDUMP);
+ DFU := dfu-util
+ OPENOCD := openocd
+endif
+
+BUILDDIRS :=
+TGT_BIN :=
+
+CFLAGS = $(GLOBAL_CFLAGS) $(TGT_CFLAGS)
+CXXFLAGS = $(GLOBAL_CXXFLAGS) $(TGT_CXXFLAGS)
+
+# General directory independent build rules, generate dependency information
+$(BUILD_PATH)/%.o: %.c
+ $(SILENT_CC) $(CC) $(CFLAGS) -MMD -MP -MF $(@:%.o=%.d) -MT $@ -o $@ -c $<
+
+$(BUILD_PATH)/%.o: %.cpp
+ $(SILENT_CXX) $(CXX) $(CFLAGS) $(CXXFLAGS) -MMD -MP -MF $(@:%.o=%.d) -MT $@ -o $@ -c $<
+
diff --git a/support/make/build-targets.mk b/support/make/build-targets.mk
new file mode 100644
index 0000000..a7f2446
--- /dev/null
+++ b/support/make/build-targets.mk
@@ -0,0 +1,31 @@
+# main project target
+$(BUILD_PATH)/main.o: main.cpp
+ $(SILENT_CXX) $(CXX) $(CFLAGS) $(CXXFLAGS) $(LIBMAPLE_INCLUDES) $(WIRISH_INCLUDES) -o $@ -c $<
+
+$(BUILD_PATH)/$(BOARD).elf: $(BUILDDIRS) $(TGT_BIN) $(BUILD_PATH)/main.o
+ $(SILENT_LD) $(CXX) $(LDFLAGS) -o $@ $(TGT_BIN) $(BUILD_PATH)/main.o
+
+$(BUILD_PATH)/$(BOARD).bin: $(BUILD_PATH)/$(BOARD).elf
+ $(SILENT_OBJCOPY) $(OBJCOPY) -v -Obinary $(BUILD_PATH)/$(BOARD).elf $@ 1>/dev/null
+ $(SILENT_DISAS) $(DISAS) -d $(BUILD_PATH)/$(BOARD).elf > $(BUILD_PATH)/$(BOARD).disas
+ @echo
+ @find $(BUILD_PATH) -iname *.o | xargs $(SIZE) -t > $(BUILD_PATH)/$(BOARD).sizes
+ @echo "Final Size:"
+ $(SIZE) $<
+ @echo $(MAPLE_TARGET) > $(BUILD_PATH)/build-type
+
+$(BUILDDIRS):
+ @mkdir -p $@
+
+MSG_INFO:
+ @echo "================================================================================"
+ @echo ""
+ @echo " Build info:"
+ @echo " BOARD:" $(BOARD)
+ @echo " MAPLE_TARGET:" $(MAPLE_TARGET)
+ @echo ""
+ @echo " See 'make help' for all possible targets"
+ @echo ""
+ @echo "================================================================================"
+ @echo
+
diff --git a/support/make/build-templates.mk b/support/make/build-templates.mk
new file mode 100644
index 0000000..4371f13
--- /dev/null
+++ b/support/make/build-templates.mk
@@ -0,0 +1,5 @@
+define LIBMAPLE_MODULE_template
+dir := $(1)
+include $$(dir)/rules.mk
+endef
+
diff --git a/support/openocd/flash.cfg b/support/openocd/flash.cfg
index 6cffa80..eceac32 100644
--- a/support/openocd/flash.cfg
+++ b/support/openocd/flash.cfg
@@ -72,9 +72,9 @@ proc flash_chip {} {
echo "Erasing 128KB..."
flash erase_address 0x08000000 0x20000
echo "Flashing image..."
- flash write_bank 0 build/main.bin 0
+ flash write_bank 0 build/maple.bin 0
echo "Verifying image..."
- verify_image build/main.bin 0x08000000 bin
+ verify_image build/maple.bin 0x08000000 bin
echo "Checksum verified, resetting chip"
reset run
echo "Daemon shutdown"
diff --git a/wirish/rules.mk b/wirish/rules.mk
new file mode 100644
index 0000000..e74d15d
--- /dev/null
+++ b/wirish/rules.mk
@@ -0,0 +1,43 @@
+# Standard things
+sp := $(sp).x
+dirstack_$(sp) := $(d)
+d := $(dir)
+BUILDDIRS += $(BUILD_PATH)/$(d)
+BUILDDIRS += $(BUILD_PATH)/$(d)/comm
+
+WIRISH_INCLUDES := -I$(d) -I$(d)/comm
+
+# Local flags
+CFLAGS_$(d) := $(WIRISH_INCLUDES) $(LIBMAPLE_INCLUDES)
+
+# Local rules and targets
+cSRCS_$(d) := wirish.c \
+ wirish_shift.c \
+ wirish_analog.c \
+ time.c \
+ pwm.c \
+ ext_interrupts.c \
+ wirish_digital.c
+
+cppSRCS_$(d) := wirish_math.cpp \
+ Print.cpp \
+ comm/HardwareSerial.cpp \
+ comm/HardwareSPI.cpp \
+ usb_serial.cpp \
+ cxxabi-compat.cpp
+
+cFILES_$(d) := $(cSRCS_$(d):%=$(d)/%)
+cppFILES_$(d) := $(cppSRCS_$(d):%=$(d)/%)
+
+OBJS_$(d) := $(cFILES_$(d):%.c=$(BUILD_PATH)/%.o) \
+ $(cppFILES_$(d):%.cpp=$(BUILD_PATH)/%.o)
+DEPS_$(d) := $(OBJS_$(d):%.o=%.d)
+
+$(OBJS_$(d)): TGT_CFLAGS := $(CFLAGS_$(d))
+
+TGT_BIN += $(OBJS_$(d))
+
+# Standard things
+-include $(DEPS_$(d))
+d := $(dirstack_$(sp))
+sp := $(basename $(sp))