summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
authorBrad Luyster <BradLuyster@gmail.com>2012-09-07 22:00:02 -0400
committerBrad Luyster <BradLuyster@gmail.com>2012-09-07 22:00:02 -0400
commit6632399b898343df59eb707849b8f516ebdba378 (patch)
treefe0b51a10acff68f077f14be0fbc128b2ed49f1d /Makefile
Initial Commit
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile307
1 files changed, 307 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..2bc32f1
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,307 @@
+#=============================================================================#
+# ARM makefile
+#
+# author: Freddie Chopin, http://www.freddiechopin.info/
+# last change: 2012-01-08
+#
+# this makefile is based strongly on many examples found in the network
+#=============================================================================#
+
+#=============================================================================#
+# toolchain configuration
+#=============================================================================#
+
+TOOLCHAIN = arm-none-eabi-
+
+CXX = $(TOOLCHAIN)g++
+CC = $(TOOLCHAIN)gcc
+AS = $(TOOLCHAIN)gcc -x assembler-with-cpp
+OBJCOPY = $(TOOLCHAIN)objcopy
+OBJDUMP = $(TOOLCHAIN)objdump
+SIZE = $(TOOLCHAIN)size
+RM = cs-rm -f
+
+#=============================================================================#
+# project configuration
+#=============================================================================#
+
+# project name
+PROJECT = lpc1114_blink_led
+
+# core type
+CORE = cortex-m0
+
+# linker script
+LD_SCRIPT = LPC11x14_30x_rom.ld
+
+# output folder (absolute or relative path, leave empty for in-tree compilation)
+OUT_DIR = out
+
+# C++ definitions (e.g. "-Dsymbol_with_value=0xDEAD -Dsymbol_without_value")
+CXX_DEFS =
+
+# C definitions
+C_DEFS =
+
+# ASM definitions
+AS_DEFS =
+
+# include directories (absolute or relative paths to additional folders with
+# headers, current folder is always included)
+INC_DIRS =
+
+# library directories (absolute or relative paths to additional folders with
+# libraries)
+LIB_DIRS =
+
+# libraries (additional libraries for linking, e.g. "-lm -lsome_name" to link
+# math library libm.a and libsome_name.a)
+LIBS =
+
+# additional directories with source files (absolute or relative paths to
+# folders with source files, current folder is always included)
+SRCS_DIRS =
+
+# extension of C++ files
+CXX_EXT = cpp
+
+# wildcard for C++ source files (all files with CXX_EXT extension found in
+# current folder and SRCS_DIRS folders will be compiled and linked)
+CXX_SRCS = $(wildcard $(patsubst %, %/*.$(CXX_EXT), . $(SRCS_DIRS)))
+
+# extension of C files
+C_EXT = c
+
+# wildcard for C source files (all files with C_EXT extension found in current
+# folder and SRCS_DIRS folders will be compiled and linked)
+C_SRCS = $(wildcard $(patsubst %, %/*.$(C_EXT), . $(SRCS_DIRS)))
+
+# extension of ASM files
+AS_EXT = S
+
+# wildcard for ASM source files (all files with AS_EXT extension found in
+# current folder and SRCS_DIRS folders will be compiled and linked)
+AS_SRCS = $(wildcard $(patsubst %, %/*.$(AS_EXT), . $(SRCS_DIRS)))
+
+# optimization flags ("-O0" - no optimization, "-O1" - optimize, "-O2" -
+# optimize even more, "-Os" - optimize for size or "-O3" - optimize yet more)
+OPTIMIZATION = -O0
+
+# set to 1 to optimize size by removing unused code and data during link phase
+REMOVE_UNUSED = 1
+
+# set to 1 to compile and link additional code required for C++
+USES_CXX = 0
+
+# define warning options here
+CXX_WARNINGS = -Wall -Wextra
+C_WARNINGS = -Wall -Wstrict-prototypes -Wextra
+
+# C++ language standard ("c++98", "gnu++98" - default, "c++0x", "gnu++0x")
+CXX_STD = gnu++98
+
+# C language standard ("c89" / "iso9899:1990", "iso9899:199409",
+# "c99" / "iso9899:1999", "gnu89" - default, "gnu99")
+C_STD = gnu89
+
+#=============================================================================#
+# set the VPATH according to SRCS_DIRS
+#=============================================================================#
+
+VPATH = $(SRCS_DIRS)
+
+#=============================================================================#
+# when using output folder, append trailing slash to its name
+#=============================================================================#
+
+ifeq ($(strip $(OUT_DIR)), )
+ OUT_DIR_F =
+else
+ OUT_DIR_F = $(strip $(OUT_DIR))/
+endif
+
+#=============================================================================#
+# various compilation flags
+#=============================================================================#
+
+# core flags
+CORE_FLAGS = -mcpu=$(CORE) -mthumb
+
+# flags for C++ compiler
+CXX_FLAGS = -std=$(CXX_STD) -g -ggdb3 -fno-rtti -fno-exceptions -fverbose-asm -Wa,-ahlms=$(OUT_DIR_F)$(notdir $(<:.$(CXX_EXT)=.lst))
+
+# flags for C compiler
+C_FLAGS = -std=$(C_STD) -g -ggdb3 -fverbose-asm -Wa,-ahlms=$(OUT_DIR_F)$(notdir $(<:.$(C_EXT)=.lst))
+
+# flags for assembler
+AS_FLAGS = -g -ggdb3 -Wa,-amhls=$(OUT_DIR_F)$(notdir $(<:.$(AS_EXT)=.lst))
+
+# flags for linker
+LD_FLAGS = -T$(LD_SCRIPT) -g -Wl,-Map=$(OUT_DIR_F)$(PROJECT).map,--cref,--no-warn-mismatch
+
+# process option for removing unused code
+ifeq ($(REMOVE_UNUSED), 1)
+ LD_FLAGS += -Wl,--gc-sections
+ OPTIMIZATION += -ffunction-sections -fdata-sections
+endif
+
+# if __USES_CXX is defined for ASM then code for global/static constructors /
+# destructors is compiled; if -nostartfiles option for linker is added then C++
+# initialization / finalization code is not linked
+ifeq ($(USES_CXX), 1)
+ AS_DEFS += -D__USES_CXX
+else
+ LD_FLAGS += -nostartfiles
+endif
+
+#=============================================================================#
+# do some formatting
+#=============================================================================#
+
+CXX_OBJS = $(addprefix $(OUT_DIR_F), $(notdir $(CXX_SRCS:.$(CXX_EXT)=.o)))
+C_OBJS = $(addprefix $(OUT_DIR_F), $(notdir $(C_SRCS:.$(C_EXT)=.o)))
+AS_OBJS = $(addprefix $(OUT_DIR_F), $(notdir $(AS_SRCS:.$(AS_EXT)=.o)))
+OBJS = $(AS_OBJS) $(C_OBJS) $(CXX_OBJS) $(USER_OBJS)
+DEPS = $(OBJS:.o=.d)
+INC_DIRS_F = -I. $(patsubst %, -I%, $(INC_DIRS))
+LIB_DIRS_F = $(patsubst %, -L%, $(LIB_DIRS))
+
+ELF = $(OUT_DIR_F)$(PROJECT).elf
+HEX = $(OUT_DIR_F)$(PROJECT).hex
+BIN = $(OUT_DIR_F)$(PROJECT).bin
+LSS = $(OUT_DIR_F)$(PROJECT).lss
+DMP = $(OUT_DIR_F)$(PROJECT).dmp
+
+# format final flags for tools, request dependancies for C++, C and asm
+CXX_FLAGS_F = $(CORE_FLAGS) $(OPTIMIZATION) $(CXX_WARNINGS) $(CXX_FLAGS) $(CXX_DEFS) -MD -MP -MF $(OUT_DIR_F)$(@F:.o=.d) $(INC_DIRS_F)
+C_FLAGS_F = $(CORE_FLAGS) $(OPTIMIZATION) $(C_WARNINGS) $(C_FLAGS) $(C_DEFS) -MD -MP -MF $(OUT_DIR_F)$(@F:.o=.d) $(INC_DIRS_F)
+AS_FLAGS_F = $(CORE_FLAGS) $(AS_FLAGS) $(AS_DEFS) -MD -MP -MF $(OUT_DIR_F)$(@F:.o=.d) $(INC_DIRS_F)
+LD_FLAGS_F = $(CORE_FLAGS) $(LD_FLAGS) $(LIB_DIRS_F)
+
+#contents of output directory
+GENERATED = $(wildcard $(patsubst %, $(OUT_DIR_F)*.%, bin d dmp elf hex lss lst map o))
+
+#=============================================================================#
+# make all
+#=============================================================================#
+
+all : make_output_dir $(ELF) $(LSS) $(DMP) $(HEX) $(BIN) print_size
+
+# make object files dependent on Makefile
+$(OBJS) : Makefile
+# make .elf file dependent on linker script
+$(ELF) : $(LD_SCRIPT)
+
+#-----------------------------------------------------------------------------#
+# linking - objects -> elf
+#-----------------------------------------------------------------------------#
+
+$(ELF) : $(OBJS)
+ @echo 'Linking target: $(ELF)'
+ $(CXX) $(LD_FLAGS_F) $(OBJS) $(LIBS) -o $@
+ @echo ' '
+
+#-----------------------------------------------------------------------------#
+# compiling - C++ source -> objects
+#-----------------------------------------------------------------------------#
+
+$(OUT_DIR_F)%.o : %.$(CXX_EXT)
+ @echo 'Compiling file: $<'
+ $(CXX) -c $(CXX_FLAGS_F) $< -o $@
+ @echo ' '
+
+#-----------------------------------------------------------------------------#
+# compiling - C source -> objects
+#-----------------------------------------------------------------------------#
+
+$(OUT_DIR_F)%.o : %.$(C_EXT)
+ @echo 'Compiling file: $<'
+ $(CC) -c $(C_FLAGS_F) $< -o $@
+ @echo ' '
+
+#-----------------------------------------------------------------------------#
+# assembling - ASM source -> objects
+#-----------------------------------------------------------------------------#
+
+$(OUT_DIR_F)%.o : %.$(AS_EXT)
+ @echo 'Assembling file: $<'
+ $(AS) -c $(AS_FLAGS_F) $< -o $@
+ @echo ' '
+
+#-----------------------------------------------------------------------------#
+# memory images - elf -> hex, elf -> bin
+#-----------------------------------------------------------------------------#
+
+$(HEX) : $(ELF)
+ @echo 'Creating IHEX image: $(HEX)'
+ $(OBJCOPY) -O ihex $< $@
+ @echo ' '
+
+$(BIN) : $(ELF)
+ @echo 'Creating binary image: $(BIN)'
+ $(OBJCOPY) -O binary $< $@
+ @echo ' '
+
+#-----------------------------------------------------------------------------#
+# memory dump - elf -> dmp
+#-----------------------------------------------------------------------------#
+
+$(DMP) : $(ELF)
+ @echo 'Creating memory dump: $(DMP)'
+ $(OBJDUMP) -x --syms $< > $@
+ @echo ' '
+
+#-----------------------------------------------------------------------------#
+# extended listing - elf -> lss
+#-----------------------------------------------------------------------------#
+
+$(LSS) : $(ELF)
+ @echo 'Creating extended listing: $(LSS)'
+ $(OBJDUMP) -S $< > $@
+ @echo ' '
+
+#-----------------------------------------------------------------------------#
+# print the size of the objects and the .elf file
+#-----------------------------------------------------------------------------#
+
+print_size :
+ @echo 'Size of modules:'
+ $(SIZE) -B -t --common $(OBJS) $(USER_OBJS)
+ @echo ' '
+ @echo 'Size of target .elf file:'
+ $(SIZE) -B $(ELF)
+ @echo ' '
+
+#-----------------------------------------------------------------------------#
+# create the desired output directory
+#-----------------------------------------------------------------------------#
+
+make_output_dir :
+ $(shell mkdir $(OUT_DIR_F) 2>/dev/null)
+
+#=============================================================================#
+# make clean
+#=============================================================================#
+
+clean:
+ifeq ($(strip $(OUT_DIR_F)), )
+ @echo 'Removing all generated output files'
+else
+ @echo 'Removing all generated output files from output directory: $(OUT_DIR_F)'
+endif
+ifneq ($(strip $(GENERATED)), )
+ $(RM) $(GENERATED)
+else
+ @echo 'Nothing to remove...'
+endif
+
+#=============================================================================#
+# global exports
+#=============================================================================#
+
+.PHONY: all clean dependents
+
+.SECONDARY:
+
+# include dependancy files
+-include $(DEPS)