Donald Meyers / Mbed OS evan
Committer:
djmeyers
Date:
Sat Mar 18 22:37:16 2017 +0000
Revision:
0:06ee5f8a484a
Initial commit

Who changed what in which revision?

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