| # --------------------------------------- | |
| # Common make definition for all examples | |
| # --------------------------------------- | |
| #-------------- TOP and EXAMPLE_PATH ------------ | |
| # Set TOP to be the path to get from the current directory (where make was | |
| # invoked) to the top of the tree. $(lastword $(MAKEFILE_LIST)) returns | |
| # the name of this makefile relative to where make was invoked. | |
| THIS_MAKEFILE := $(lastword $(MAKEFILE_LIST)) | |
| # strip off /tools/top.mk to get for example ../../.. | |
| # and Set TOP to an absolute path | |
| TOP = $(abspath $(subst make.mk,../..,$(THIS_MAKEFILE))) | |
| # Set EXAMPLE_PATH to the relative path from TOP to the current directory, ie examples/device/cdc_msc_freertos | |
| EXAMPLE_PATH = $(subst $(TOP)/,,$(abspath .)) | |
| # Detect whether shell style is windows or not | |
| # https://stackoverflow.com/questions/714100/os-detecting-makefile/52062069#52062069 | |
| ifeq '$(findstring ;,$(PATH))' ';' | |
| # PATH contains semicolon - so we're definitely on Windows. | |
| CMDEXE := 1 | |
| # makefile shell commands should use syntax for DOS CMD, not unix sh | |
| # Unfortunately, SHELL may point to sh or bash, which can't accept DOS syntax. | |
| # We can't just use sh, because while sh and/or bash shell may be available, | |
| # many Windows environments won't have utilities like realpath used below, so... | |
| # Force DOS command shell on Windows. | |
| SHELL := cmd.exe | |
| endif | |
| # Build directory | |
| BUILD := _build | |
| PROJECT := $(notdir $(CURDIR)) | |
| # Handy check parameter function | |
| check_defined = \ | |
| $(strip $(foreach 1,$1, \ | |
| $(call __check_defined,$1,$(strip $(value 2))))) | |
| __check_defined = \ | |
| $(if $(value $1),, \ | |
| $(error Undefined make flag: $1$(if $2, ($2)))) | |
| #-------------- Fuzz harness compiler ------------ | |
| CC ?= clang | |
| CXX ?= clang++ | |
| GDB ?= gdb | |
| OBJCOPY = objcopy | |
| SIZE = size | |
| MKDIR = mkdir | |
| ifeq ($(CMDEXE),1) | |
| CP = copy | |
| RM = del | |
| PYTHON = python | |
| else | |
| SED = sed | |
| CP = cp | |
| RM = rm | |
| PYTHON = python3 | |
| endif | |
| #-------------- Fuzz harness flags ------------ | |
| COVERAGE_FLAGS ?= -fsanitize-coverage=trace-pc-guard | |
| SANITIZER_FLAGS ?= -fsanitize=fuzzer \ | |
| -fsanitize=address | |
| CFLAGS += $(COVERAGE_FLAGS) $(SANITIZER_FLAGS) | |
| #-------------- Source files and compiler flags -------------- | |
| INC += $(TOP)/test | |
| # Compiler Flags | |
| CFLAGS += \ | |
| -ggdb \ | |
| -fdata-sections \ | |
| -ffunction-sections \ | |
| -fno-strict-aliasing \ | |
| -Wall \ | |
| -Wextra \ | |
| -Werror \ | |
| -Wfatal-errors \ | |
| -Wdouble-promotion \ | |
| -Wstrict-prototypes \ | |
| -Wstrict-overflow \ | |
| -Werror-implicit-function-declaration \ | |
| -Wfloat-equal \ | |
| -Wundef \ | |
| -Wshadow \ | |
| -Wwrite-strings \ | |
| -Wsign-compare \ | |
| -Wmissing-format-attribute \ | |
| -Wunreachable-code \ | |
| -Wcast-align \ | |
| -Wcast-qual \ | |
| -Wnull-dereference \ | |
| -Wuninitialized \ | |
| -Wunused \ | |
| -Wredundant-decls \ | |
| -O1 | |
| CFLAGS += \ | |
| -Wno-error=unreachable-code \ | |
| -DOPT_MCU_FUZZ=1 \ | |
| -DCFG_TUSB_MCU=OPT_MCU_FUZZ \ | |
| -D_FUZZ | |
| CXXFLAGS += \ | |
| -xc++ \ | |
| -Wno-c++11-narrowing \ | |
| -fno-implicit-templates | |
| # conversion is too strict for most mcu driver, may be disable sign/int/arith-conversion | |
| # -Wconversion | |
| # Debugging/Optimization | |
| ifeq ($(DEBUG), 1) | |
| CFLAGS += -Og | |
| else | |
| CFLAGS += $(CFLAGS_OPTIMIZED) | |
| endif | |
| # Log level is mapped to TUSB DEBUG option | |
| ifneq ($(LOG),) | |
| CFLAGS += -DCFG_TUSB_DEBUG=$(LOG) | |
| endif |