mirror of
https://github.com/pine64/bl_iot_sdk.git
synced 2024-09-04 05:59:19 +00:00
576 lines
19 KiB
Makefile
576 lines
19 KiB
Makefile
#---------
|
|
#
|
|
# MakefileWorker.mk
|
|
#
|
|
# Include this helper file in your makefile
|
|
# It makes
|
|
# A static library
|
|
# A test executable
|
|
#
|
|
# See this example for parameter settings
|
|
# examples/Makefile
|
|
#
|
|
#----------
|
|
# Inputs - these variables describe what to build
|
|
#
|
|
# INCLUDE_DIRS - Directories used to search for include files.
|
|
# This generates a -I for each directory
|
|
# SRC_DIRS - Directories containing source file to built into the library
|
|
# SRC_FILES - Specific source files to build into library. Helpful when not all code
|
|
# in a directory can be built for test (hopefully a temporary situation)
|
|
# TEST_SRC_DIRS - Directories containing unit test code build into the unit test runner
|
|
# These do not go in a library. They are explicitly included in the test runner
|
|
# TEST_SRC_FILES - Specific source files to build into the unit test runner
|
|
# These do not go in a library. They are explicitly included in the test runner
|
|
# MOCKS_SRC_DIRS - Directories containing mock source files to build into the test runner
|
|
# These do not go in a library. They are explicitly included in the test runner
|
|
#----------
|
|
# You can adjust these variables to influence how to build the test target
|
|
# and where to put and name outputs
|
|
# See below to determine defaults
|
|
# COMPONENT_NAME - the name of the thing being built
|
|
# TEST_TARGET - name the test executable. By default it is
|
|
# $(COMPONENT_NAME)_tests
|
|
# Helpful if you want 1 > make files in the same directory with different
|
|
# executables as output.
|
|
# CPPUTEST_HOME - where CppUTest home dir found
|
|
# TARGET_PLATFORM - Influences how the outputs are generated by modifying the
|
|
# CPPUTEST_OBJS_DIR and CPPUTEST_LIB_DIR to use a sub-directory under the
|
|
# normal objs and lib directories. Also modifies where to search for the
|
|
# CPPUTEST_LIB to link against.
|
|
# CPPUTEST_OBJS_DIR - a directory where o and d files go
|
|
# CPPUTEST_LIB_DIR - a directory where libs go
|
|
# CPPUTEST_ENABLE_DEBUG - build for debug
|
|
# CPPUTEST_USE_MEM_LEAK_DETECTION - Links with overridden new and delete
|
|
# CPPUTEST_USE_STD_CPP_LIB - Set to N to keep the standard C++ library out
|
|
# of the test harness
|
|
# CPPUTEST_USE_GCOV - Turn on coverage analysis
|
|
# Clean then build with this flag set to Y, then 'make gcov'
|
|
# CPPUTEST_MAPFILE - generate a map file
|
|
# CPPUTEST_WARNINGFLAGS - overly picky by default
|
|
# OTHER_MAKEFILE_TO_INCLUDE - a hook to use this makefile to make
|
|
# other targets. Like CSlim, which is part of fitnesse
|
|
# CPPUTEST_USE_VPATH - Use Make's VPATH functionality to support user
|
|
# specification of source files and directories that aren't below
|
|
# the user's Makefile in the directory tree, like:
|
|
# SRC_DIRS += ../../lib/foo
|
|
# It defaults to N, and shouldn't be necessary except in the above case.
|
|
#----------
|
|
#
|
|
# Other flags users can initialize to sneak in their settings
|
|
# CPPUTEST_CXXFLAGS - flags for the C++ compiler
|
|
# CPPUTEST_CPPFLAGS - flags for the C++ AND C preprocessor
|
|
# CPPUTEST_CFLAGS - flags for the C complier
|
|
# CPPUTEST_LDFLAGS - Linker flags
|
|
#----------
|
|
|
|
# Some behavior is weird on some platforms. Need to discover the platform.
|
|
|
|
# Platforms
|
|
UNAME_OUTPUT = "$(shell uname -a)"
|
|
MACOSX_STR = Darwin
|
|
MINGW_STR = MINGW
|
|
CYGWIN_STR = CYGWIN
|
|
LINUX_STR = Linux
|
|
SUNOS_STR = SunOS
|
|
UNKNWOWN_OS_STR = Unknown
|
|
|
|
# Compilers
|
|
CC_VERSION_OUTPUT ="$(shell $(CXX) -v 2>&1)"
|
|
CLANG_STR = clang
|
|
SUNSTUDIO_CXX_STR = SunStudio
|
|
|
|
UNAME_OS = $(UNKNWOWN_OS_STR)
|
|
|
|
ifeq ($(findstring $(MINGW_STR),$(UNAME_OUTPUT)),$(MINGW_STR))
|
|
UNAME_OS = $(MINGW_STR)
|
|
endif
|
|
|
|
ifeq ($(findstring $(CYGWIN_STR),$(UNAME_OUTPUT)),$(CYGWIN_STR))
|
|
UNAME_OS = $(CYGWIN_STR)
|
|
endif
|
|
|
|
ifeq ($(findstring $(LINUX_STR),$(UNAME_OUTPUT)),$(LINUX_STR))
|
|
UNAME_OS = $(LINUX_STR)
|
|
endif
|
|
|
|
ifeq ($(findstring $(MACOSX_STR),$(UNAME_OUTPUT)),$(MACOSX_STR))
|
|
UNAME_OS = $(MACOSX_STR)
|
|
#lion has a problem with the 'v' part of -a
|
|
UNAME_OUTPUT = "$(shell uname -pmnrs)"
|
|
endif
|
|
|
|
ifeq ($(findstring $(SUNOS_STR),$(UNAME_OUTPUT)),$(SUNOS_STR))
|
|
UNAME_OS = $(SUNOS_STR)
|
|
|
|
SUNSTUDIO_CXX_ERR_STR = CC -flags
|
|
ifeq ($(findstring $(SUNSTUDIO_CXX_ERR_STR),$(CC_VERSION_OUTPUT)),$(SUNSTUDIO_CXX_ERR_STR))
|
|
CC_VERSION_OUTPUT ="$(shell $(CXX) -V 2>&1)"
|
|
COMPILER_NAME = $(SUNSTUDIO_CXX_STR)
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(findstring $(CLANG_STR),$(CC_VERSION_OUTPUT)),$(CLANG_STR))
|
|
COMPILER_NAME = $(CLANG_STR)
|
|
endif
|
|
|
|
#Kludge for mingw, it does not have cc.exe, but gcc.exe will do
|
|
ifeq ($(UNAME_OS),$(MINGW_STR))
|
|
CC := gcc
|
|
endif
|
|
# RHEL5 is always going to use GCC, CC is going for the old verison
|
|
CC := gcc
|
|
#And another kludge. Exception handling in gcc 4.6.2 is broken when linking the
|
|
# Standard C++ library as a shared library. Unbelievable.
|
|
ifeq ($(UNAME_OS),$(MINGW_STR))
|
|
CPPUTEST_LDFLAGS += -static
|
|
endif
|
|
ifeq ($(UNAME_OS),$(CYGWIN_STR))
|
|
CPPUTEST_LDFLAGS += -static
|
|
endif
|
|
|
|
|
|
#Kludge for MacOsX gcc compiler on Darwin9 who can't handle pendantic
|
|
ifeq ($(UNAME_OS),$(MACOSX_STR))
|
|
ifeq ($(findstring Version 9,$(UNAME_OUTPUT)),Version 9)
|
|
CPPUTEST_PEDANTIC_ERRORS = N
|
|
endif
|
|
endif
|
|
|
|
ifndef COMPONENT_NAME
|
|
COMPONENT_NAME = name_this_in_the_makefile
|
|
endif
|
|
|
|
# Debug on by default
|
|
ifndef CPPUTEST_ENABLE_DEBUG
|
|
CPPUTEST_ENABLE_DEBUG = Y
|
|
endif
|
|
|
|
# new and delete for memory leak detection on by default
|
|
ifndef CPPUTEST_USE_MEM_LEAK_DETECTION
|
|
CPPUTEST_USE_MEM_LEAK_DETECTION = Y
|
|
endif
|
|
|
|
# Use the standard C library
|
|
ifndef CPPUTEST_USE_STD_C_LIB
|
|
CPPUTEST_USE_STD_C_LIB = Y
|
|
endif
|
|
|
|
# Use the standard C++ library
|
|
ifndef CPPUTEST_USE_STD_CPP_LIB
|
|
CPPUTEST_USE_STD_CPP_LIB = Y
|
|
endif
|
|
|
|
# Use gcov, off by default
|
|
ifndef CPPUTEST_USE_GCOV
|
|
CPPUTEST_USE_GCOV = N
|
|
endif
|
|
|
|
ifndef CPPUTEST_PEDANTIC_ERRORS
|
|
CPPUTEST_PEDANTIC_ERRORS = Y
|
|
endif
|
|
|
|
# Default warnings
|
|
ifndef CPPUTEST_WARNINGFLAGS
|
|
CPPUTEST_WARNINGFLAGS = -Wall -Wextra -Wswitch-default -Wswitch-enum -Wconversion
|
|
ifeq ($(CPPUTEST_PEDANTIC_ERRORS), Y)
|
|
CPPUTEST_WARNINGFLAGS += -pedantic-errors
|
|
endif
|
|
ifeq ($(UNAME_OS),$(LINUX_STR))
|
|
# CPPUTEST_WARNINGFLAGS += -Wsign-conversion
|
|
endif
|
|
CPPUTEST_CXX_WARNINGFLAGS = -Woverloaded-virtual
|
|
CPPUTEST_C_WARNINGFLAGS = -Wstrict-prototypes
|
|
endif
|
|
|
|
#Wonderful extra compiler warnings with clang
|
|
ifeq ($(COMPILER_NAME),$(CLANG_STR))
|
|
# -Wno-disabled-macro-expansion -> Have to disable the macro expansion warning as the operator new overload warns on that.
|
|
# -Wno-padded -> I sort-of like this warning but if there is a bool at the end of the class, it seems impossible to remove it! (except by making padding explicit)
|
|
# -Wno-global-constructors Wno-exit-time-destructors -> Great warnings, but in CppUTest it is impossible to avoid as the automatic test registration depends on the global ctor and dtor
|
|
# -Wno-weak-vtables -> The TEST_GROUP macro declares a class and will automatically inline its methods. Thats ok as they are only in one translation unit. Unfortunately, the warning can't detect that, so it must be disabled.
|
|
CPPUTEST_CXX_WARNINGFLAGS += -Weverything -Wno-disabled-macro-expansion -Wno-padded -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables
|
|
CPPUTEST_C_WARNINGFLAGS += -Weverything -Wno-padded
|
|
endif
|
|
|
|
# Uhm. Maybe put some warning flags for SunStudio here?
|
|
ifeq ($(COMPILER_NAME),$(SUNSTUDIO_CXX_STR))
|
|
CPPUTEST_CXX_WARNINGFLAGS =
|
|
CPPUTEST_C_WARNINGFLAGS =
|
|
endif
|
|
|
|
# Default dir for temporary files (d, o)
|
|
ifndef CPPUTEST_OBJS_DIR
|
|
ifndef TARGET_PLATFORM
|
|
CPPUTEST_OBJS_DIR = objs
|
|
else
|
|
CPPUTEST_OBJS_DIR = objs/$(TARGET_PLATFORM)
|
|
endif
|
|
endif
|
|
|
|
# Default dir for the output library
|
|
ifndef CPPUTEST_LIB_DIR
|
|
ifndef TARGET_PLATFORM
|
|
CPPUTEST_LIB_DIR = testLibs
|
|
else
|
|
CPPUTEST_LIB_DIR = testLibs/$(TARGET_PLATFORM)
|
|
endif
|
|
endif
|
|
|
|
# No map by default
|
|
ifndef CPPUTEST_MAP_FILE
|
|
CPPUTEST_MAP_FILE = N
|
|
endif
|
|
|
|
# No extentions is default
|
|
ifndef CPPUTEST_USE_EXTENSIONS
|
|
CPPUTEST_USE_EXTENSIONS = N
|
|
endif
|
|
|
|
# No VPATH is default
|
|
ifndef CPPUTEST_USE_VPATH
|
|
CPPUTEST_USE_VPATH := N
|
|
endif
|
|
# Make empty, instead of 'N', for usage in $(if ) conditionals
|
|
ifneq ($(CPPUTEST_USE_VPATH), Y)
|
|
CPPUTEST_USE_VPATH :=
|
|
endif
|
|
|
|
ifndef TARGET_PLATFORM
|
|
CPPUTEST_LIB_LINK_DIR = $(CPPUTEST_BUILD_LIB)
|
|
else
|
|
CPPUTEST_LIB_LINK_DIR = $(CPPUTEST_BUILD_LIB)/$(TARGET_PLATFORM)
|
|
endif
|
|
|
|
# --------------------------------------
|
|
# derived flags in the following area
|
|
# --------------------------------------
|
|
|
|
# Without the C library, we'll need to disable the C++ library and ...
|
|
ifeq ($(CPPUTEST_USE_STD_C_LIB), N)
|
|
CPPUTEST_USE_STD_CPP_LIB = N
|
|
CPPUTEST_USE_MEM_LEAK_DETECTION = N
|
|
CPPUTEST_CPPFLAGS += -DCPPUTEST_STD_C_LIB_DISABLED
|
|
CPPUTEST_CPPFLAGS += -nostdinc
|
|
endif
|
|
|
|
CPPUTEST_CPPFLAGS += -DCPPUTEST_COMPILATION
|
|
|
|
ifeq ($(CPPUTEST_USE_MEM_LEAK_DETECTION), N)
|
|
CPPUTEST_CPPFLAGS += -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED
|
|
else
|
|
ifndef CPPUTEST_MEMLEAK_DETECTOR_NEW_MACRO_FILE
|
|
CPPUTEST_MEMLEAK_DETECTOR_NEW_MACRO_FILE = -include $(CPPUTEST_INCLUDE)/CppUTest/MemoryLeakDetectorNewMacros.h
|
|
endif
|
|
ifndef CPPUTEST_MEMLEAK_DETECTOR_MALLOC_MACRO_FILE
|
|
CPPUTEST_MEMLEAK_DETECTOR_MALLOC_MACRO_FILE = -include $(CPPUTEST_INCLUDE)/CppUTest/MemoryLeakDetectorMallocMacros.h
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(CPPUTEST_ENABLE_DEBUG), Y)
|
|
CPPUTEST_CXXFLAGS += -g
|
|
CPPUTEST_CFLAGS += -g
|
|
CPPUTEST_LDFLAGS += -g
|
|
endif
|
|
|
|
ifeq ($(CPPUTEST_USE_STD_CPP_LIB), N)
|
|
CPPUTEST_CPPFLAGS += -DCPPUTEST_STD_CPP_LIB_DISABLED
|
|
ifeq ($(CPPUTEST_USE_STD_C_LIB), Y)
|
|
CPPUTEST_CXXFLAGS += -nostdinc++
|
|
endif
|
|
endif
|
|
|
|
ifdef $(GMOCK_HOME)
|
|
GTEST_HOME = $(GMOCK_HOME)/gtest
|
|
CPPUTEST_CPPFLAGS += -I$(GMOCK_HOME)/include
|
|
GMOCK_LIBRARY = $(GMOCK_HOME)/lib/.libs/libgmock.a
|
|
LD_LIBRARIES += $(GMOCK_LIBRARY)
|
|
CPPUTEST_CPPFLAGS += -DINCLUDE_GTEST_TESTS
|
|
CPPUTEST_WARNINGFLAGS =
|
|
CPPUTEST_CPPFLAGS += -I$(GTEST_HOME)/include -I$(GTEST_HOME)
|
|
GTEST_LIBRARY = $(GTEST_HOME)/lib/.libs/libgtest.a
|
|
LD_LIBRARIES += $(GTEST_LIBRARY)
|
|
endif
|
|
|
|
|
|
ifeq ($(CPPUTEST_USE_GCOV), Y)
|
|
CPPUTEST_CXXFLAGS += -fprofile-arcs -ftest-coverage
|
|
CPPUTEST_CFLAGS += -fprofile-arcs -ftest-coverage
|
|
endif
|
|
|
|
CPPUTEST_CXXFLAGS += $(CPPUTEST_WARNINGFLAGS) $(CPPUTEST_CXX_WARNINGFLAGS)
|
|
CPPUTEST_CPPFLAGS += $(CPPUTEST_WARNINGFLAGS)
|
|
CPPUTEST_CXXFLAGS += $(CPPUTEST_MEMLEAK_DETECTOR_NEW_MACRO_FILE)
|
|
CPPUTEST_CPPFLAGS += $(CPPUTEST_MEMLEAK_DETECTOR_MALLOC_MACRO_FILE)
|
|
CPPUTEST_CFLAGS += $(CPPUTEST_C_WARNINGFLAGS)
|
|
|
|
TARGET_MAP = $(COMPONENT_NAME).map.txt
|
|
ifeq ($(CPPUTEST_MAP_FILE), Y)
|
|
CPPUTEST_LDFLAGS += -Wl,-map,$(TARGET_MAP)
|
|
endif
|
|
|
|
# Link with CppUTest lib
|
|
CPPUTEST_LIB = $(CPPUTEST_LIB_LINK_DIR)/libCppUTest.a
|
|
|
|
ifeq ($(CPPUTEST_USE_EXTENSIONS), Y)
|
|
CPPUTEST_LIB += $(CPPUTEST_LIB_LINK_DIR)/libCppUTestExt.a
|
|
endif
|
|
|
|
ifdef CPPUTEST_STATIC_REALTIME
|
|
LD_LIBRARIES += -lrt
|
|
endif
|
|
|
|
TARGET_LIB = \
|
|
$(CPPUTEST_LIB_DIR)/lib$(COMPONENT_NAME).a
|
|
|
|
ifndef TEST_TARGET
|
|
ifndef TARGET_PLATFORM
|
|
TEST_TARGET = $(COMPONENT_NAME)_tests
|
|
else
|
|
TEST_TARGET = $(COMPONENT_NAME)_$(TARGET_PLATFORM)_tests
|
|
endif
|
|
endif
|
|
|
|
#Helper Functions
|
|
get_src_from_dir = $(wildcard $1/*.cpp) $(wildcard $1/*.cc) $(wildcard $1/*.c)
|
|
get_dirs_from_dirspec = $(wildcard $1)
|
|
get_src_from_dir_list = $(foreach dir, $1, $(call get_src_from_dir,$(dir)))
|
|
__src_to = $(subst .c,$1, $(subst .cc,$1, $(subst .cpp,$1,$(if $(CPPUTEST_USE_VPATH),$(notdir $2),$2))))
|
|
src_to = $(addprefix $(CPPUTEST_OBJS_DIR)/,$(call __src_to,$1,$2))
|
|
src_to_o = $(call src_to,.o,$1)
|
|
src_to_d = $(call src_to,.d,$1)
|
|
src_to_gcda = $(call src_to,.gcda,$1)
|
|
src_to_gcno = $(call src_to,.gcno,$1)
|
|
time = $(shell date +%s)
|
|
delta_t = $(eval minus, $1, $2)
|
|
debug_print_list = $(foreach word,$1,echo " $(word)";) echo;
|
|
|
|
#Derived
|
|
STUFF_TO_CLEAN += $(TEST_TARGET) $(TEST_TARGET).exe $(TARGET_LIB) $(TARGET_MAP)
|
|
|
|
SRC += $(call get_src_from_dir_list, $(SRC_DIRS)) $(SRC_FILES)
|
|
OBJ = $(call src_to_o,$(SRC))
|
|
|
|
STUFF_TO_CLEAN += $(OBJ)
|
|
|
|
TEST_SRC += $(call get_src_from_dir_list, $(TEST_SRC_DIRS)) $(TEST_SRC_FILES)
|
|
TEST_OBJS = $(call src_to_o,$(TEST_SRC))
|
|
STUFF_TO_CLEAN += $(TEST_OBJS)
|
|
|
|
|
|
MOCKS_SRC += $(call get_src_from_dir_list, $(MOCKS_SRC_DIRS))
|
|
MOCKS_OBJS = $(call src_to_o,$(MOCKS_SRC))
|
|
STUFF_TO_CLEAN += $(MOCKS_OBJS)
|
|
|
|
ALL_SRC = $(SRC) $(TEST_SRC) $(MOCKS_SRC)
|
|
|
|
# If we're using VPATH
|
|
ifeq ($(CPPUTEST_USE_VPATH), Y)
|
|
# gather all the source directories and add them
|
|
VPATH += $(sort $(dir $(ALL_SRC)))
|
|
# Add the component name to the objs dir path, to differentiate between same-name objects
|
|
CPPUTEST_OBJS_DIR := $(addsuffix /$(COMPONENT_NAME),$(CPPUTEST_OBJS_DIR))
|
|
endif
|
|
|
|
#LCOV html generation
|
|
BUILD_OUTPUT_DIR=build_output
|
|
COVERAGE_DIR=$(BUILD_OUTPUT_DIR)/generated-coverage
|
|
LCOV_INFO_FILE=$(TEST_TARGET).info
|
|
LCOV_SUMMARY_FILE=$(TEST_TARGET)_summary.info
|
|
|
|
#Test coverage with gcov
|
|
GCOV_OUTPUT = gcov_output.txt
|
|
GCOV_REPORT = gcov_report.txt
|
|
GCOV_ERROR = gcov_error.txt
|
|
GCOV_GCDA_FILES = $(call src_to_gcda, $(ALL_SRC))
|
|
GCOV_GCNO_FILES = $(call src_to_gcno, $(ALL_SRC))
|
|
TEST_OUTPUT = $(TEST_TARGET).txt
|
|
STUFF_TO_CLEAN += \
|
|
$(GCOV_OUTPUT)\
|
|
$(GCOV_REPORT)\
|
|
$(GCOV_REPORT).html\
|
|
$(GCOV_ERROR)\
|
|
$(GCOV_GCDA_FILES)\
|
|
$(GCOV_GCNO_FILES)\
|
|
$(TEST_OUTPUT)
|
|
|
|
#The gcda files for gcov need to be deleted before each run
|
|
#To avoid annoying messages.
|
|
GCOV_CLEAN = $(SILENCE)$(RM) -f $(GCOV_GCDA_FILES) $(GCOV_OUTPUT) $(GCOV_REPORT) $(GCOV_ERROR)
|
|
RUN_TEST_TARGET = $(SILENCE) $(GCOV_CLEAN) ; echo "Running $(TEST_TARGET)"; ./$(TEST_TARGET) $(CPPUTEST_EXE_FLAGS)
|
|
|
|
ifeq ($(CPPUTEST_USE_GCOV), Y)
|
|
|
|
ifeq ($(COMPILER_NAME),$(CLANG_STR))
|
|
LD_LIBRARIES += --coverage
|
|
else
|
|
LD_LIBRARIES += -lgcov
|
|
endif
|
|
endif
|
|
|
|
|
|
INCLUDES_DIRS_EXPANDED = $(call get_dirs_from_dirspec, $(INCLUDE_DIRS))
|
|
INCLUDES += $(foreach dir, $(INCLUDES_DIRS_EXPANDED), -I$(dir))
|
|
MOCK_DIRS_EXPANDED = $(call get_dirs_from_dirspec, $(MOCKS_SRC_DIRS))
|
|
INCLUDES += $(foreach dir, $(MOCK_DIRS_EXPANDED), -I$(dir))
|
|
|
|
CPPUTEST_CPPFLAGS += $(INCLUDES)
|
|
|
|
DEP_FILES = $(call src_to_d, $(ALL_SRC))
|
|
STUFF_TO_CLEAN += $(DEP_FILES) $(PRODUCTION_CODE_START) $(PRODUCTION_CODE_END)
|
|
STUFF_TO_CLEAN += $(STDLIB_CODE_START) $(MAP_FILE) cpputest_*.xml junit_run_output
|
|
|
|
# We'll use the CPPUTEST_CFLAGS etc so that you can override AND add to the CppUTest flags
|
|
CFLAGS = $(CPPUTEST_CFLAGS) $(CPPUTEST_ADDITIONAL_CFLAGS)
|
|
CPPFLAGS = $(CPPUTEST_CPPFLAGS) $(CPPUTEST_ADDITIONAL_CPPFLAGS)
|
|
CXXFLAGS = $(CPPUTEST_CXXFLAGS) $(CPPUTEST_ADDITIONAL_CXXFLAGS)
|
|
LDFLAGS = $(CPPUTEST_LDFLAGS) $(CPPUTEST_ADDITIONAL_LDFLAGS)
|
|
|
|
# Don't consider creating the archive a warning condition that does STDERR output
|
|
ARFLAGS := $(ARFLAGS)c
|
|
|
|
DEP_FLAGS=-MMD -MP
|
|
|
|
# Some macros for programs to be overridden. For some reason, these are not in Make defaults
|
|
RANLIB = ranlib
|
|
|
|
# Targets
|
|
|
|
ALL_TARGETS += cpputest_all
|
|
ALL_TARGETS_CLEAN += cpputest_clean
|
|
.PHONY: cpputest_all
|
|
cpputest_all: start $(TEST_TARGET) gcov
|
|
$(RUN_TEST_TARGET)
|
|
|
|
.PHONY: start
|
|
start: $(TEST_TARGET)
|
|
$(SILENCE)START_TIME=$(call time)
|
|
|
|
.PHONY: all_no_tests
|
|
all_no_tests: $(TEST_TARGET)
|
|
|
|
.PHONY: flags
|
|
flags:
|
|
@echo
|
|
@echo "OS ${UNAME_OS}"
|
|
@echo "Compile C and C++ source with CPPFLAGS:"
|
|
@$(call debug_print_list,$(CPPFLAGS))
|
|
@echo "Compile C++ source with CXXFLAGS:"
|
|
@$(call debug_print_list,$(CXXFLAGS))
|
|
@echo "Compile C source with CFLAGS:"
|
|
@$(call debug_print_list,$(CFLAGS))
|
|
@echo "Link with LDFLAGS:"
|
|
@$(call debug_print_list,$(LDFLAGS))
|
|
@echo "Link with LD_LIBRARIES:"
|
|
@$(call debug_print_list,$(LD_LIBRARIES))
|
|
@echo "Create libraries with ARFLAGS:"
|
|
@$(call debug_print_list,$(ARFLAGS))
|
|
|
|
TEST_DEPS = $(TEST_OBJS) $(MOCKS_OBJS) $(PRODUCTION_CODE_START) $(TARGET_LIB) $(USER_LIBS) $(PRODUCTION_CODE_END) $(CPPUTEST_LIB) $(STDLIB_CODE_START)
|
|
test-deps: $(TEST_DEPS)
|
|
|
|
$(TEST_TARGET): $(TEST_DEPS)
|
|
@echo Linking $@
|
|
$(SILENCE)$(CXX) -o $@ $^ $(LD_LIBRARIES) $(LDFLAGS)
|
|
|
|
$(TARGET_LIB): $(OBJ)
|
|
@echo Building archive $@
|
|
$(SILENCE)mkdir -p $(dir $@)
|
|
$(SILENCE)$(AR) $(ARFLAGS) $@ $^
|
|
$(SILENCE)$(RANLIB) $@
|
|
|
|
test: $(TEST_TARGET)
|
|
$(RUN_TEST_TARGET) $(COMMAND_LINE_ARGUMENTS) | tee $(TEST_OUTPUT)
|
|
vtest: $(TEST_TARGET)
|
|
$(RUN_TEST_TARGET) -v | tee $(TEST_OUTPUT)
|
|
|
|
$(CPPUTEST_OBJS_DIR)/%.o: %.cc
|
|
@echo compiling $(notdir $<)
|
|
$(SILENCE)mkdir -p $(dir $@)
|
|
$(SILENCE)$(COMPILE.cpp) $(DEP_FLAGS) $(OUTPUT_OPTION) $<
|
|
|
|
$(CPPUTEST_OBJS_DIR)/%.o: %.cpp
|
|
@echo compiling $(notdir $<)
|
|
$(SILENCE)mkdir -p $(dir $@)
|
|
$(SILENCE)$(COMPILE.cpp) $(DEP_FLAGS) $(OUTPUT_OPTION) $<
|
|
|
|
$(CPPUTEST_OBJS_DIR)/%.o: %.c
|
|
@echo compiling $(notdir $<)
|
|
$(SILENCE)mkdir -p $(dir $@)
|
|
$(SILENCE)$(COMPILE.c) $(DEP_FLAGS) $(OUTPUT_OPTION) $<
|
|
|
|
ifneq "$(MAKECMDGOALS)" "clean"
|
|
-include $(DEP_FILES)
|
|
endif
|
|
|
|
.PHONY: cpputest_clean
|
|
cpputest_clean:
|
|
@echo Making clean
|
|
$(SILENCE)$(RM) $(STUFF_TO_CLEAN)
|
|
$(SILENCE)$(RM) -rf gcov $(CPPUTEST_OBJS_DIR)
|
|
$(SILENCE)find . -name "*.gcno" | xargs $(RM) -f
|
|
$(SILENCE)find . -name "*.gcda" | xargs $(RM) -f
|
|
|
|
#realclean gets rid of all gcov, o and d files in the directory tree
|
|
#not just the ones made by this makefile
|
|
.PHONY: realclean
|
|
realclean: clean
|
|
$(SILENCE)$(RM) -rf gcov
|
|
$(SILENCE)$(RM) -rf $(BUILD_OUTPUT_DIR)
|
|
$(SILENCE)find . -name "*.gdcno" | xargs $(RM) -f
|
|
$(SILENCE)find . -name "*.[do]" | xargs $(RM) -f
|
|
|
|
gcov: test
|
|
$(SILENCE)mkdir -p $(BUILD_OUTPUT_DIR)
|
|
ifeq ($(CPPUTEST_USE_VPATH), Y)
|
|
$(SILENCE)gcov --object-directory $(CPPUTEST_OBJS_DIR) $(SRC) >> $(GCOV_OUTPUT) 2>> $(GCOV_ERROR)
|
|
else
|
|
$(SILENCE)for d in $(SRC_DIRS) ; do \
|
|
FILES=`ls $$d/*.c $$d/*.cc $$d/*.cpp 2> /dev/null` ; \
|
|
gcov --object-directory $(CPPUTEST_OBJS_DIR)/$$d $$FILES >> $(GCOV_OUTPUT) 2>>$(GCOV_ERROR) ; \
|
|
done
|
|
$(SILENCE)for f in $(SRC_FILES) ; do \
|
|
gcov --object-directory $(CPPUTEST_OBJS_DIR)/$$f $$f >> $(GCOV_OUTPUT) 2>>$(GCOV_ERROR) ; \
|
|
done
|
|
endif
|
|
$(SILENCE)./filterGcov.sh $(GCOV_OUTPUT) $(GCOV_ERROR) $(GCOV_REPORT) $(TEST_OUTPUT)
|
|
$(SILENCE)mkdir -p gcov
|
|
$(SILENCE)mv *.gcov gcov
|
|
$(SILENCE)mv gcov_* gcov
|
|
$(SILENCE)mkdir -p $(COVERAGE_DIR)
|
|
$(SILENCE)lcov -d $(CPPUTEST_OBJS_DIR) -c -o $(COVERAGE_DIR)/$(LCOV_INFO_FILE) -q --rc lcov_branch_coverage=1
|
|
$(SILENCE)lcov --remove $(COVERAGE_DIR)/$(LCOV_INFO_FILE) $(LCOV_EXCLUDE_PATTERN) -o $(COVERAGE_DIR)/$(LCOV_INFO_FILE)
|
|
$(SILENCE)lcov --remove $(COVERAGE_DIR)/$(LCOV_INFO_FILE) "*CppUTest*" -o $(COVERAGE_DIR)/$(LCOV_INFO_FILE)
|
|
$(SILENCE)lcov --summary ./$(COVERAGE_DIR)/$(LCOV_INFO_FILE) &> $(COVERAGE_DIR)/$(LCOV_SUMMARY_FILE)
|
|
$(SILENCE)echo ansic:line:`grep -E -o "([0-9]*\.[0-9]+|[0-9]+)" $(COVERAGE_DIR)/$(LCOV_SUMMARY_FILE) | head -1` >> $(COVERAGE_DIR)/coverage-data.txt
|
|
$(SILENCE)genhtml -o $(COVERAGE_DIR) $(COVERAGE_DIR)/$(LCOV_INFO_FILE) -q --rc lcov_branch_coverage=1
|
|
@echo "See gcov directory for details"
|
|
|
|
.PHONEY: format
|
|
format:
|
|
$(CPPUTEST_HOME)/scripts/reformat.sh $(PROJECT_HOME_DIR)
|
|
|
|
.PHONEY: debug
|
|
debug:
|
|
@echo
|
|
@echo "Target Source files:"
|
|
@$(call debug_print_list,$(SRC))
|
|
@echo "Target Object files:"
|
|
@$(call debug_print_list,$(OBJ))
|
|
@echo "Test Source files:"
|
|
@$(call debug_print_list,$(TEST_SRC))
|
|
@echo "Test Object files:"
|
|
@$(call debug_print_list,$(TEST_OBJS))
|
|
@echo "Mock Source files:"
|
|
@$(call debug_print_list,$(MOCKS_SRC))
|
|
@echo "Mock Object files:"
|
|
@$(call debug_print_list,$(MOCKS_OBJS))
|
|
@echo "All Input Dependency files:"
|
|
@$(call debug_print_list,$(DEP_FILES))
|
|
@echo Stuff to clean:
|
|
@$(call debug_print_list,$(STUFF_TO_CLEAN))
|
|
@echo Includes:
|
|
@$(call debug_print_list,$(INCLUDES))
|
|
|
|
-include $(OTHER_MAKEFILE_TO_INCLUDE)
|