FRDM K64F Metronome

Committer:
ram54288
Date:
Sun May 14 18:35:07 2017 +0000
Revision:
0:a2cb7295a1f7
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ram54288 0:a2cb7295a1f7 1 #
ram54288 0:a2cb7295a1f7 2 # Toolchain rules for building libraries
ram54288 0:a2cb7295a1f7 3 #
ram54288 0:a2cb7295a1f7 4 # Support multi-platform builds
ram54288 0:a2cb7295a1f7 5 # You may define PLATFORM=.. prefix for compiler
ram54288 0:a2cb7295a1f7 6 # if PLATFORM is defined it will owerride CC and AR
ram54288 0:a2cb7295a1f7 7 # You may also specify CC and AR separately.
ram54288 0:a2cb7295a1f7 8 # example: Compile with KEIL
ram54288 0:a2cb7295a1f7 9 # make CC=ArmCC AR=ArmAR
ram54288 0:a2cb7295a1f7 10 #
ram54288 0:a2cb7295a1f7 11 # example: Cross Compile with Gnu toolchain, for embedded Linux
ram54288 0:a2cb7295a1f7 12 # make PLATFORM=arm-linux-gnueabi-
ram54288 0:a2cb7295a1f7 13 #
ram54288 0:a2cb7295a1f7 14 # Special rules for IAR-ARM toolchains added, AR tool on that does not follow common arquements.
ram54288 0:a2cb7295a1f7 15 # make CC=iccarm uses iarchive.exe for creating a archive.
ram54288 0:a2cb7295a1f7 16 #
ram54288 0:a2cb7295a1f7 17 # Special rules for IAR-RL78 toolchain added, uses own AR and compiler requires specific flags
ram54288 0:a2cb7295a1f7 18 # make CC=iccrl78
ram54288 0:a2cb7295a1f7 19 #
ram54288 0:a2cb7295a1f7 20 # When using ArmCC, Select CPU by defining one of following supported values
ram54288 0:a2cb7295a1f7 21 # CPU=Cortex-M0
ram54288 0:a2cb7295a1f7 22 # CPU=Cortex-M3
ram54288 0:a2cb7295a1f7 23 # CPU=Cortex-M4
ram54288 0:a2cb7295a1f7 24 #
ram54288 0:a2cb7295a1f7 25 # example:
ram54288 0:a2cb7295a1f7 26 # make CC=armcc CPU=Cortex-M4
ram54288 0:a2cb7295a1f7 27
ram54288 0:a2cb7295a1f7 28 #
ram54288 0:a2cb7295a1f7 29 # If PLATFORM prefix is defined,
ram54288 0:a2cb7295a1f7 30 # generate CC and AR accordingly
ram54288 0:a2cb7295a1f7 31 #
ram54288 0:a2cb7295a1f7 32 ifneq ($(strip $(PLATFORM)),)
ram54288 0:a2cb7295a1f7 33 CC:=$(PLATFORM)gcc
ram54288 0:a2cb7295a1f7 34 AR:=$(PLATFORM)ar
ram54288 0:a2cb7295a1f7 35 endif
ram54288 0:a2cb7295a1f7 36
ram54288 0:a2cb7295a1f7 37 #
ram54288 0:a2cb7295a1f7 38 # Windows specific tweaks for echo and mkdir to work
ram54288 0:a2cb7295a1f7 39 #
ram54288 0:a2cb7295a1f7 40 ifeq ($(OS),Windows_NT)
ram54288 0:a2cb7295a1f7 41 SHELL := cmd.exe
ram54288 0:a2cb7295a1f7 42 mkdir = if not exist $(1) md $(subst /,\,$(1))
ram54288 0:a2cb7295a1f7 43 else
ram54288 0:a2cb7295a1f7 44 mkdir = mkdir -p $(1)
ram54288 0:a2cb7295a1f7 45 endif
ram54288 0:a2cb7295a1f7 46
ram54288 0:a2cb7295a1f7 47 #
ram54288 0:a2cb7295a1f7 48 # Append CC and CPU to library names
ram54288 0:a2cb7295a1f7 49 #
ram54288 0:a2cb7295a1f7 50 LIB:=$(LIB:%.a=%_$(CC).a)
ram54288 0:a2cb7295a1f7 51 ifneq (,$(CPU))
ram54288 0:a2cb7295a1f7 52 LIB:=$(LIB:%.a=%_$(CPU).a)
ram54288 0:a2cb7295a1f7 53 endif
ram54288 0:a2cb7295a1f7 54
ram54288 0:a2cb7295a1f7 55 ##########################################################
ram54288 0:a2cb7295a1f7 56 # TOOLCHAIN SPECIFIC RULES AND FLAGS #
ram54288 0:a2cb7295a1f7 57 ##########################################################
ram54288 0:a2cb7295a1f7 58
ram54288 0:a2cb7295a1f7 59 #
ram54288 0:a2cb7295a1f7 60 # GCC toolchains
ram54288 0:a2cb7295a1f7 61 #
ram54288 0:a2cb7295a1f7 62 ifneq (,$(findstring gcc,$(CC)))
ram54288 0:a2cb7295a1f7 63 # Flags for common toolchain, usually GCC or CC
ram54288 0:a2cb7295a1f7 64 AROPTS=-rsc $@ $^
ram54288 0:a2cb7295a1f7 65 override CFLAGS += -Wall -pedantic-errors
ram54288 0:a2cb7295a1f7 66 # Dependency generation
ram54288 0:a2cb7295a1f7 67 override CFLAGS += -MMD -MP
ram54288 0:a2cb7295a1f7 68 ifneq (,$(CPU))
ram54288 0:a2cb7295a1f7 69 # CPU must be lowercase on GCC
ram54288 0:a2cb7295a1f7 70 CPU_L:=$(shell echo $(CPU) | tr A-Z a-z)
ram54288 0:a2cb7295a1f7 71 override CFLAGS += -mcpu=$(CPU_L)
ram54288 0:a2cb7295a1f7 72 # Use THUMB instructions of Cortex-M cores
ram54288 0:a2cb7295a1f7 73 ifeq (cortex-m,$(findstring cortex-m,$(CPU_L)))
ram54288 0:a2cb7295a1f7 74 override CFLAGS += -mthumb
ram54288 0:a2cb7295a1f7 75 endif
ram54288 0:a2cb7295a1f7 76 endif
ram54288 0:a2cb7295a1f7 77 # Debug
ram54288 0:a2cb7295a1f7 78 ifeq ($(DEBUG),1)
ram54288 0:a2cb7295a1f7 79 override CFLAGS += -g -O0
ram54288 0:a2cb7295a1f7 80 else
ram54288 0:a2cb7295a1f7 81 override CFLAGS += -O2
ram54288 0:a2cb7295a1f7 82 endif
ram54288 0:a2cb7295a1f7 83 # Enable Coverage generation
ram54288 0:a2cb7295a1f7 84 ifeq ($(COVERAGE),1)
ram54288 0:a2cb7295a1f7 85 override CFLAGS += -ftest-coverage -fprofile-arcs
ram54288 0:a2cb7295a1f7 86 override LDFLAGS += -ftest-coverage -fprofile-arcs
ram54288 0:a2cb7295a1f7 87 endif
ram54288 0:a2cb7295a1f7 88 COMPILE = $(CC) -std=gnu99 -c -o $@
ram54288 0:a2cb7295a1f7 89 CXXCOMPILE = $(CC) -std=c++11 -c -o $@
ram54288 0:a2cb7295a1f7 90
ram54288 0:a2cb7295a1f7 91 #
ram54288 0:a2cb7295a1f7 92 # IAR-ARM toolchain
ram54288 0:a2cb7295a1f7 93 #
ram54288 0:a2cb7295a1f7 94 else ifneq (,$(findstring iccarm,$(CC)))
ram54288 0:a2cb7295a1f7 95 AR:=iarchive
ram54288 0:a2cb7295a1f7 96 AROPTS=$^ --create -o $@
ram54288 0:a2cb7295a1f7 97 DLIB_FILE=$(subst bin\iccarm.exe,inc\c\DLib_Config_Full.h,$(shell where iccarm))
ram54288 0:a2cb7295a1f7 98 override CFLAGS += --dlib_config '$(DLIB_FILE)' --cpu Cortex-M4 --vla --diag_suppress Pa50
ram54288 0:a2cb7295a1f7 99 # Dependency generation
ram54288 0:a2cb7295a1f7 100 override CFLAGS += --dependencies=m $(basename $@).d
ram54288 0:a2cb7295a1f7 101 # Debug
ram54288 0:a2cb7295a1f7 102 ifeq ($(DEBUG),1)
ram54288 0:a2cb7295a1f7 103 override CFLAGS += --debug -On
ram54288 0:a2cb7295a1f7 104 else
ram54288 0:a2cb7295a1f7 105 override CFLAGS += -Om
ram54288 0:a2cb7295a1f7 106 endif
ram54288 0:a2cb7295a1f7 107 COMPILE = $(CC) -c -o $@
ram54288 0:a2cb7295a1f7 108
ram54288 0:a2cb7295a1f7 109 #
ram54288 0:a2cb7295a1f7 110 # ArmCC toolchain (Used by Keil)
ram54288 0:a2cb7295a1f7 111 #
ram54288 0:a2cb7295a1f7 112 else ifneq (,$(findstring armcc,$(CC)))
ram54288 0:a2cb7295a1f7 113 AR:=armar
ram54288 0:a2cb7295a1f7 114 AROPTS=-rsc $@ $^
ram54288 0:a2cb7295a1f7 115 override CFLAGS += --c99 --no_wrap_diagnostics
ram54288 0:a2cb7295a1f7 116 # Dependency generation
ram54288 0:a2cb7295a1f7 117 override CFLAGS += --depend $(basename $@).d --phony_targets
ram54288 0:a2cb7295a1f7 118 LIB:=$(LIB:%.a=%.lib)
ram54288 0:a2cb7295a1f7 119 ifneq (,$(CPU))
ram54288 0:a2cb7295a1f7 120 override CFLAGS += --cpu=$(CPU)
ram54288 0:a2cb7295a1f7 121 endif
ram54288 0:a2cb7295a1f7 122 # Debug
ram54288 0:a2cb7295a1f7 123 ifeq ($(DEBUG),1)
ram54288 0:a2cb7295a1f7 124 override CFLAGS += -g -O0
ram54288 0:a2cb7295a1f7 125 else
ram54288 0:a2cb7295a1f7 126 override CFLAGS += -O2
ram54288 0:a2cb7295a1f7 127 endif
ram54288 0:a2cb7295a1f7 128 COMPILE = $(CC) -c -o $@
ram54288 0:a2cb7295a1f7 129
ram54288 0:a2cb7295a1f7 130 #
ram54288 0:a2cb7295a1f7 131 # IAR Renesas78 toolchain
ram54288 0:a2cb7295a1f7 132 #
ram54288 0:a2cb7295a1f7 133 else ifneq (,$(findstring iccrl78,$(CC)))
ram54288 0:a2cb7295a1f7 134 AR:=xar
ram54288 0:a2cb7295a1f7 135 AROPTS=$@ $^
ram54288 0:a2cb7295a1f7 136 # Hack to get \lib include path which contains dlib config headers for compiler
ram54288 0:a2cb7295a1f7 137 DIR=$(subst iccrl78.exe,..\lib\,$(shell where iccrl78))
ram54288 0:a2cb7295a1f7 138 override CFLAGS += --core rl78_1 --code_model far --data_model far --dlib_config full --vla --no_wrap_diagnostics -I'$(DIR)'
ram54288 0:a2cb7295a1f7 139 # Dependency generation
ram54288 0:a2cb7295a1f7 140 LIB:=$(LIB:%.a=%.lib)
ram54288 0:a2cb7295a1f7 141 override CFLAGS += --dependencies=m $(basename $@).d
ram54288 0:a2cb7295a1f7 142 # Debug
ram54288 0:a2cb7295a1f7 143 ifeq ($(DEBUG),1)
ram54288 0:a2cb7295a1f7 144 override CFLAGS += --debug -Oh
ram54288 0:a2cb7295a1f7 145 else
ram54288 0:a2cb7295a1f7 146 override CFLAGS += -Ohz
ram54288 0:a2cb7295a1f7 147 endif
ram54288 0:a2cb7295a1f7 148 COMPILE = $(CC) -o $@
ram54288 0:a2cb7295a1f7 149
ram54288 0:a2cb7295a1f7 150 #
ram54288 0:a2cb7295a1f7 151 # IAR MSP430 toolchain
ram54288 0:a2cb7295a1f7 152 #
ram54288 0:a2cb7295a1f7 153 else ifneq (,$(findstring icc430,$(CC)))
ram54288 0:a2cb7295a1f7 154 AR:=xar
ram54288 0:a2cb7295a1f7 155 AROPTS=$@ $^
ram54288 0:a2cb7295a1f7 156 # Hack to get \lib include path which contains dlib config headers for compiler
ram54288 0:a2cb7295a1f7 157 DIR=$(subst bin\icc430.exe,lib,$(shell where icc430))
ram54288 0:a2cb7295a1f7 158 DLIB_FILE=$(subst bin\icc430.exe,lib\dlib\dl430xllff.h,$(shell where icc430))
ram54288 0:a2cb7295a1f7 159 override CFLAGS += --dlib_config '$(DLIB_FILE)' --vla --core 430X --data_model large --no_wrap_diagnostics -I'$(DIR)'
ram54288 0:a2cb7295a1f7 160 # Dependency generation
ram54288 0:a2cb7295a1f7 161 LIB:=$(LIB:%.a=%.lib)
ram54288 0:a2cb7295a1f7 162 override CFLAGS += --dependencies=m $(basename $@).d
ram54288 0:a2cb7295a1f7 163 # Debug
ram54288 0:a2cb7295a1f7 164 ifeq ($(DEBUG),1)
ram54288 0:a2cb7295a1f7 165 override CFLAGS += --debug -On
ram54288 0:a2cb7295a1f7 166 else
ram54288 0:a2cb7295a1f7 167 override CFLAGS += -Ohz
ram54288 0:a2cb7295a1f7 168 endif
ram54288 0:a2cb7295a1f7 169 COMPILE = $(CC) -o $@
ram54288 0:a2cb7295a1f7 170
ram54288 0:a2cb7295a1f7 171 #
ram54288 0:a2cb7295a1f7 172 # CppCheck toolchain
ram54288 0:a2cb7295a1f7 173 # This is used only for static testing the code.
ram54288 0:a2cb7295a1f7 174 # cppcheck is used in place of compiler and linker phase is ignored
ram54288 0:a2cb7295a1f7 175 else ifneq (,$(findstring cppcheck,$(CC)))
ram54288 0:a2cb7295a1f7 176 AR = cppcheck -q --enable=warning --enable=style --std=c99 --inline-suppr -DCPPCHECK $(CPPCHECK_OPTS) $(CFLAGS) $(SRCS)
ram54288 0:a2cb7295a1f7 177 COMPILE = true
ram54288 0:a2cb7295a1f7 178 CPPCHECK = 1
ram54288 0:a2cb7295a1f7 179 LIB:= "ignored_with_cppcheck"
ram54288 0:a2cb7295a1f7 180
ram54288 0:a2cb7295a1f7 181
ram54288 0:a2cb7295a1f7 182 ###################################
ram54288 0:a2cb7295a1f7 183 # End of toolchain specific rules #
ram54288 0:a2cb7295a1f7 184 ###################################
ram54288 0:a2cb7295a1f7 185 endif
ram54288 0:a2cb7295a1f7 186
ram54288 0:a2cb7295a1f7 187 #
ram54288 0:a2cb7295a1f7 188 # Generate VERSION tag
ram54288 0:a2cb7295a1f7 189 #
ram54288 0:a2cb7295a1f7 190 ifeq (,$(CPPCHECK))
ram54288 0:a2cb7295a1f7 191 VERSION := $(shell git describe --tags --long --dirty --always)
ram54288 0:a2cb7295a1f7 192 CFLAGS += -DVERSION='"$(VERSION)"'
ram54288 0:a2cb7295a1f7 193 endif
ram54288 0:a2cb7295a1f7 194
ram54288 0:a2cb7295a1f7 195 ############################################################
ram54288 0:a2cb7295a1f7 196 # AUTOMATICALLY GENERATE LIBRARY COMPILATION RULES #
ram54288 0:a2cb7295a1f7 197 # #
ram54288 0:a2cb7295a1f7 198 # Use: #
ram54288 0:a2cb7295a1f7 199 # $(eval $(call generate_rules,$(OUTPUT_LIB),$(SRCS))) #
ram54288 0:a2cb7295a1f7 200 # at the end of your Makefile #
ram54288 0:a2cb7295a1f7 201 # #
ram54288 0:a2cb7295a1f7 202 ############################################################
ram54288 0:a2cb7295a1f7 203
ram54288 0:a2cb7295a1f7 204 define generate_rules
ram54288 0:a2cb7295a1f7 205
ram54288 0:a2cb7295a1f7 206 DEST_LIB := $(1)
ram54288 0:a2cb7295a1f7 207 LIB_SRCS := $(2)
ram54288 0:a2cb7295a1f7 208 C_SRCS := $$(filter %.c,$$(LIB_SRCS))
ram54288 0:a2cb7295a1f7 209 CXX_SRCS := $$(filter %.cpp,$$(LIB_SRCS))
ram54288 0:a2cb7295a1f7 210 all: $$(DEST_LIB)
ram54288 0:a2cb7295a1f7 211
ram54288 0:a2cb7295a1f7 212 #
ram54288 0:a2cb7295a1f7 213 # Define build dir outside from src folders
ram54288 0:a2cb7295a1f7 214 #
ram54288 0:a2cb7295a1f7 215 BUILD_DIR := output/$$(CC)
ram54288 0:a2cb7295a1f7 216 ifneq (,$$(CPU))
ram54288 0:a2cb7295a1f7 217 BUILD_DIR := $$(BUILD_DIR)_$$(CPU)
ram54288 0:a2cb7295a1f7 218 endif
ram54288 0:a2cb7295a1f7 219 ifneq (generic,$$(CONFIG))
ram54288 0:a2cb7295a1f7 220 BUILD_DIR := $$(BUILD_DIR)_$$(CONFIG)
ram54288 0:a2cb7295a1f7 221 endif
ram54288 0:a2cb7295a1f7 222 OBJS := $$(C_SRCS:%.c=$$(BUILD_DIR)/%.o) $$(CXX_SRCS:%.cpp=$$(BUILD_DIR)/%.o)
ram54288 0:a2cb7295a1f7 223
ram54288 0:a2cb7295a1f7 224 # Include auto-dependencies
ram54288 0:a2cb7295a1f7 225 -include $$(OBJS:.o=.d)
ram54288 0:a2cb7295a1f7 226
ram54288 0:a2cb7295a1f7 227 # Create list of output directories.
ram54288 0:a2cb7295a1f7 228 OBJ_DIRS := $$(sort $$(dir $$(OBJS)))
ram54288 0:a2cb7295a1f7 229
ram54288 0:a2cb7295a1f7 230 # requires directories to be created before build.
ram54288 0:a2cb7295a1f7 231 # '|' means do not care about timestamps of requisities
ram54288 0:a2cb7295a1f7 232 $$(OBJS): | $$(OBJ_DIRS)
ram54288 0:a2cb7295a1f7 233
ram54288 0:a2cb7295a1f7 234 # Need to redefine build rule to find the sources
ram54288 0:a2cb7295a1f7 235 # from correct folder.
ram54288 0:a2cb7295a1f7 236 $$(BUILD_DIR)/%.o: %.c
ram54288 0:a2cb7295a1f7 237 ifeq ($(V),1)
ram54288 0:a2cb7295a1f7 238 $$(COMPILE) $$(CFLAGS) $$<
ram54288 0:a2cb7295a1f7 239 else ifeq (1,$(CPPCHECK))
ram54288 0:a2cb7295a1f7 240 @$$(COMPILE) $$(CFLAGS) $$<
ram54288 0:a2cb7295a1f7 241 else ifeq (1,$(UNITTEST))
ram54288 0:a2cb7295a1f7 242 @echo Building unittest $$<
ram54288 0:a2cb7295a1f7 243 ifneq ($(OS),Windows_NT)
ram54288 0:a2cb7295a1f7 244 ruby $(UNIT_TEST_BASE)/../auto/generate_test_runner.rb Test.c Test_Runner.c
ram54288 0:a2cb7295a1f7 245 endif
ram54288 0:a2cb7295a1f7 246 @gcc $$(CFLAGS) $$(SRCS) -o $$(OUTPUT_LIB)
ram54288 0:a2cb7295a1f7 247 else
ram54288 0:a2cb7295a1f7 248 @echo Building $$<
ram54288 0:a2cb7295a1f7 249 @$$(COMPILE) $$(CFLAGS) $$<
ram54288 0:a2cb7295a1f7 250 endif
ram54288 0:a2cb7295a1f7 251
ram54288 0:a2cb7295a1f7 252 # Same again for C++
ram54288 0:a2cb7295a1f7 253 $$(BUILD_DIR)/%.o: %.cpp
ram54288 0:a2cb7295a1f7 254 ifeq ($(V),1)
ram54288 0:a2cb7295a1f7 255 $$(CXXCOMPILE) $$(CFLAGS) $$<
ram54288 0:a2cb7295a1f7 256 else ifeq (1,$(CPPCHECK))
ram54288 0:a2cb7295a1f7 257 @$$(CXXCOMPILE) $$(CFLAGS) $$<
ram54288 0:a2cb7295a1f7 258 else
ram54288 0:a2cb7295a1f7 259 @echo Building $$<
ram54288 0:a2cb7295a1f7 260 @$$(CXXCOMPILE) $$(CFLAGS) $$<
ram54288 0:a2cb7295a1f7 261 endif
ram54288 0:a2cb7295a1f7 262
ram54288 0:a2cb7295a1f7 263 # Rule to create a object directory
ram54288 0:a2cb7295a1f7 264 $$(OBJ_DIRS):
ram54288 0:a2cb7295a1f7 265 @-$$(call mkdir,$$@)
ram54288 0:a2cb7295a1f7 266
ram54288 0:a2cb7295a1f7 267 $$(DEST_LIB): $$(OBJS)
ram54288 0:a2cb7295a1f7 268 ifeq ($(V),1)
ram54288 0:a2cb7295a1f7 269 -$$(addprefix $$(RM) ,$$(wildcard $$@))
ram54288 0:a2cb7295a1f7 270 $$(AR) $$(AROPTS)
ram54288 0:a2cb7295a1f7 271 else ifeq (1,$(CPPCHECK))
ram54288 0:a2cb7295a1f7 272 @$$(AR) $$(AROPTS)
ram54288 0:a2cb7295a1f7 273 else ifeq (1,$(UNITTEST))
ram54288 0:a2cb7295a1f7 274 #ifneq ($(OS),Windows_NT)
ram54288 0:a2cb7295a1f7 275 # lcov -q --capture -i --directory $(CURDIR) --output-file lib_base.info
ram54288 0:a2cb7295a1f7 276 # ./$$@
ram54288 0:a2cb7295a1f7 277 # lcov -q --capture --directory $(CURDIR) --output-file lib_test.info
ram54288 0:a2cb7295a1f7 278 # lcov -a lib_base.info -a lib_test.info -o coverage.info
ram54288 0:a2cb7295a1f7 279 #endif
ram54288 0:a2cb7295a1f7 280 else
ram54288 0:a2cb7295a1f7 281 @echo Linking $$(notdir $$@)
ram54288 0:a2cb7295a1f7 282 @-$$(addprefix $$(RM) ,$$(wildcard $$@))
ram54288 0:a2cb7295a1f7 283 @$$(AR) $$(AROPTS)
ram54288 0:a2cb7295a1f7 284 endif
ram54288 0:a2cb7295a1f7 285
ram54288 0:a2cb7295a1f7 286 clean:
ram54288 0:a2cb7295a1f7 287 @$(RM) -r $$(BUILD_DIR)
ram54288 0:a2cb7295a1f7 288 @$(RM) $$(DEST_LIB)
ram54288 0:a2cb7295a1f7 289
ram54288 0:a2cb7295a1f7 290 clean-all:
ram54288 0:a2cb7295a1f7 291 @$(RM) -r output *.a
ram54288 0:a2cb7295a1f7 292
ram54288 0:a2cb7295a1f7 293 endef