272 lines
10 KiB
Makefile
272 lines
10 KiB
Makefile
|
# ------------------------------------------------------------------------------
|
||
|
#
|
||
|
# Generic Makefile
|
||
|
#
|
||
|
# Copyright Marco Paland 2007 - 2017
|
||
|
# Distributed under the MIT License
|
||
|
#
|
||
|
# ------------------------------------------------------------------------------
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Paths
|
||
|
# ------------------------------------------------------------------------------
|
||
|
PATH_TOOLS_CC = /usr/bin/
|
||
|
PATH_TOOLS_CC_LIB = /usr/lib/
|
||
|
PATH_TOOLS_UTIL =
|
||
|
|
||
|
PATH_BIN = bin
|
||
|
PATH_TMP = tmp
|
||
|
PATH_NUL = /dev/null
|
||
|
PATH_OBJ = $(PATH_TMP)/obj
|
||
|
PATH_LST = $(PATH_TMP)/lst
|
||
|
PATH_ERR = $(PATH_TMP)/err
|
||
|
PATH_PRE = $(PATH_TMP)/pre
|
||
|
PATH_COV = $(PATH_TMP)/cov
|
||
|
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Application to build
|
||
|
# ------------------------------------------------------------------------------
|
||
|
|
||
|
APP = test_suite
|
||
|
|
||
|
|
||
|
# -----------------------------------------------------------------------------
|
||
|
# Project file list
|
||
|
# Format is:
|
||
|
# FILES_PRJ = file1 \
|
||
|
# foo/file2 \
|
||
|
# bar/file3
|
||
|
# -----------------------------------------------------------------------------
|
||
|
|
||
|
FILES_PRJ = test/test_suite
|
||
|
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Additional include files and compiler defines
|
||
|
# Format is:
|
||
|
# C_INCLUDES = -Iinclude_path1 \
|
||
|
# -Iinclude_path2 \
|
||
|
# -Iinclude_path3 \
|
||
|
# ------------------------------------------------------------------------------
|
||
|
|
||
|
C_INCLUDES =
|
||
|
|
||
|
C_DEFINES =
|
||
|
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# The target name and location
|
||
|
# ------------------------------------------------------------------------------
|
||
|
TRG = $(PATH_BIN)/$(APP)
|
||
|
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# object files
|
||
|
# ------------------------------------------------------------------------------
|
||
|
FILES_TMP = $(FILES_PRJ)
|
||
|
FILES_O = $(addsuffix .o, $(FILES_TMP))
|
||
|
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# VPATH definition
|
||
|
#
|
||
|
# VPATH is required for the maker to find the C-/ASM-Source files.
|
||
|
# Extract the directory/module names from the file list with the dir
|
||
|
# command and remove the duplicated directory names with the sort command.
|
||
|
# FILES_PRJ is listed first to make sure that the source files in the project
|
||
|
# directory are searched first.
|
||
|
# ------------------------------------------------------------------------------
|
||
|
VPATH := $(sort $(dir $(FILES_TMP)))
|
||
|
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Development tools
|
||
|
# ------------------------------------------------------------------------------
|
||
|
AR = $(PATH_TOOLS_CC)ar
|
||
|
AS = $(PATH_TOOLS_CC)g++
|
||
|
CC = $(PATH_TOOLS_CC)g++
|
||
|
CL = $(PATH_TOOLS_CC)g++
|
||
|
NM = $(PATH_TOOLS_CC)nm
|
||
|
GCOV = $(PATH_TOOLS_CC)gcov
|
||
|
OBJDUMP = $(PATH_TOOLS_CC)objdump
|
||
|
OBJCOPY = $(PATH_TOOLS_CC)objcopy
|
||
|
READELF = $(PATH_TOOLS_CC)readelf
|
||
|
SIZE = $(PATH_TOOLS_CC)size
|
||
|
|
||
|
ECHO = $(PATH_TOOLS_UTIL)echo
|
||
|
MAKE = $(PATH_TOOLS_UTIL)make
|
||
|
MKDIR = $(PATH_TOOLS_UTIL)mkdir
|
||
|
RM = $(PATH_TOOLS_UTIL)rm
|
||
|
SED = $(PATH_TOOLS_UTIL)sed
|
||
|
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Compiler flags for the target architecture
|
||
|
# ------------------------------------------------------------------------------
|
||
|
|
||
|
GCCFLAGS = $(C_INCLUDES) \
|
||
|
$(C_DEFINES) \
|
||
|
-std=c++11 \
|
||
|
-g \
|
||
|
-Wall \
|
||
|
-pedantic \
|
||
|
-Wmain \
|
||
|
-Wundef \
|
||
|
-Wsign-conversion \
|
||
|
-Wuninitialized \
|
||
|
-Wshadow \
|
||
|
-Wunreachable-code \
|
||
|
-Wswitch-default \
|
||
|
-Wswitch \
|
||
|
-Wcast-align \
|
||
|
-Wmissing-include-dirs \
|
||
|
-Winit-self \
|
||
|
-Wdouble-promotion \
|
||
|
-gdwarf-2 \
|
||
|
-fno-exceptions \
|
||
|
-O2 \
|
||
|
-ffunction-sections \
|
||
|
-ffat-lto-objects \
|
||
|
-fdata-sections \
|
||
|
-fverbose-asm \
|
||
|
-Wextra \
|
||
|
-Wunused-parameter \
|
||
|
-Wfloat-equal
|
||
|
|
||
|
CFLAGS = $(GCCFLAGS) \
|
||
|
-Wunsuffixed-float-constants \
|
||
|
-x c \
|
||
|
-std=c99
|
||
|
|
||
|
CPPFLAGS = $(GCCFLAGS) \
|
||
|
-x c++ \
|
||
|
-fno-rtti \
|
||
|
-fstrict-enums \
|
||
|
-fno-use-cxa-atexit \
|
||
|
-fno-use-cxa-get-exception-ptr \
|
||
|
-fno-nonansi-builtins \
|
||
|
-fno-threadsafe-statics \
|
||
|
-fno-enforce-eh-specs \
|
||
|
-ftemplate-depth-64 \
|
||
|
-fexceptions
|
||
|
|
||
|
AFLAGS = $(GCCFLAGS) \
|
||
|
-x assembler
|
||
|
|
||
|
LFLAGS = $(GCCFLAGS) \
|
||
|
-x none \
|
||
|
-Wl,--gc-sections
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Targets
|
||
|
# ------------------------------------------------------------------------------
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Main-Dependencies (app: all)
|
||
|
# ------------------------------------------------------------------------------
|
||
|
.PHONY: all
|
||
|
all: clean_prj $(TRG) $(TRG)_nm.txt
|
||
|
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Main-Dependencies (app: rebuild)
|
||
|
# ------------------------------------------------------------------------------
|
||
|
.PHONY: rebuild
|
||
|
rebuild: clean $(TRG) $(TRG)_nm.txt
|
||
|
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# clean project
|
||
|
# ------------------------------------------------------------------------------
|
||
|
.PHONY: clean_prj
|
||
|
clean_prj:
|
||
|
@-$(ECHO) +++ cleaning project
|
||
|
@-$(RM) -rf $(PATH_BIN) 2> $(PATH_NUL)
|
||
|
@-$(MKDIR) -p $(PATH_BIN)
|
||
|
@-$(MKDIR) -p $(PATH_OBJ)
|
||
|
@-$(MKDIR) -p $(PATH_ERR)
|
||
|
@-$(MKDIR) -p $(PATH_LST)
|
||
|
@-$(MKDIR) -p $(PATH_PRE)
|
||
|
@-$(MKDIR) -p $(PATH_COV)
|
||
|
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# clean all
|
||
|
# ------------------------------------------------------------------------------
|
||
|
.PHONY: clean
|
||
|
clean:
|
||
|
@-$(ECHO) +++ cleaning all
|
||
|
@-$(RM) -rf $(PATH_BIN) 2> $(PATH_NUL)
|
||
|
@-$(RM) -rf $(PATH_TMP) 2> $(PATH_NUL)
|
||
|
@-$(MKDIR) -p $(PATH_BIN)
|
||
|
@-$(MKDIR) -p $(PATH_OBJ)
|
||
|
@-$(MKDIR) -p $(PATH_ERR)
|
||
|
@-$(MKDIR) -p $(PATH_LST)
|
||
|
@-$(MKDIR) -p $(PATH_COV)
|
||
|
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# print the GNUmake version and the compiler version
|
||
|
# ------------------------------------------------------------------------------
|
||
|
.PHONY: version
|
||
|
version:
|
||
|
# Print the GNU make version and the compiler version
|
||
|
@$(ECHO) GNUmake version:
|
||
|
@$(MAKE) --version
|
||
|
@$(ECHO) GCC version:
|
||
|
@$(CL) -v
|
||
|
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Rules
|
||
|
# ------------------------------------------------------------------------------
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Link/locate application
|
||
|
# ------------------------------------------------------------------------------
|
||
|
$(TRG) : $(FILES_O)
|
||
|
@-$(ECHO) +++ linkink application to generate: $(TRG)
|
||
|
@-$(CL) $(LFLAGS) -L. -lc $(PATH_OBJ)/*.o -Wl,-Map,$(TRG).map -o $(TRG)
|
||
|
# profiling
|
||
|
@-$(CL) $(LFLAGS) -L. -lc $(PATH_COV)/*.o --coverage -o $(PATH_COV)/$(APP)
|
||
|
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# parse the object files to obtain symbol information, and create a size summary
|
||
|
# ------------------------------------------------------------------------------
|
||
|
$(TRG)_nm.txt : $(TRG)
|
||
|
@-$(ECHO) +++ parsing symbols with nm to generate: $(TRG)_nm.txt
|
||
|
@-$(NM) --numeric-sort --print-size $(TRG) > $(TRG)_nm.txt
|
||
|
@-$(ECHO) +++ demangling symbols with c++filt to generate: $(TRG)_cppfilt.txt
|
||
|
@-$(NM) --numeric-sort --print-size $(TRG) | $(CPPFILT) > $(TRG)_cppfilt.txt
|
||
|
@-$(ECHO) +++ creating size summary table with size to generate: $(TRG)_size.txt
|
||
|
@-$(SIZE) -A -t $(TRG) > $(TRG)_size.txt
|
||
|
|
||
|
|
||
|
%.o : %.cpp
|
||
|
@$(ECHO) +++ compile: $<
|
||
|
# Compile the source file
|
||
|
# ...and Reformat (using sed) any possible error/warning messages for the VisualStudio(R) output window
|
||
|
# ...and Create an assembly listing using objdump
|
||
|
# ...and Generate a dependency file (using the -MM flag)
|
||
|
@-$(CL) $(CPPFLAGS) $< -E -o $(PATH_PRE)/$(basename $(@F)).pre
|
||
|
@-$(CL) $(CPPFLAGS) $< -c -o $(PATH_OBJ)/$(basename $(@F)).o 2> $(PATH_ERR)/$(basename $(@F)).err
|
||
|
@-$(SED) -e 's|.h:\([0-9]*\),|.h(\1) :|' -e 's|:\([0-9]*\):|(\1) :|' $(PATH_ERR)/$(basename $(@F)).err
|
||
|
@-$(OBJDUMP) --disassemble --line-numbers -S $(PATH_OBJ)/$(basename $(@F)).o > $(PATH_LST)/$(basename $(@F)).lst
|
||
|
@-$(CL) $(CPPFLAGS) $< -MM > $(PATH_OBJ)/$(basename $(@F)).d
|
||
|
# profiling
|
||
|
@-$(CL) $(CPPFLAGS) -O0 --coverage $< -c -o $(PATH_COV)/$(basename $(@F)).o 2> $(PATH_NUL)
|
||
|
|
||
|
%.o : %.c
|
||
|
@$(ECHO) +++ compile: $<
|
||
|
# Compile the source file
|
||
|
# ...and Reformat (using sed) any possible error/warning messages for the VisualStudio(R) output window
|
||
|
# ...and Create an assembly listing using objdump
|
||
|
# ...and Generate a dependency file (using the -MM flag)
|
||
|
@-$(CL) $(CFLAGS) $< -E -o $(PATH_PRE)/$(basename $(@F)).pre
|
||
|
@-$(CC) $(CFLAGS) $< -c -o $(PATH_OBJ)/$(basename $(@F)).o 2> $(PATH_ERR)/$(basename $(@F)).err
|
||
|
@-$(SED) -e 's|.h:\([0-9]*\),|.h(\1) :|' -e 's|:\([0-9]*\):|(\1) :|' $(PATH_ERR)/$(basename $(@F)).err
|
||
|
@-$(OBJDUMP) -S $(PATH_OBJ)/$(basename $(@F)).o > $(PATH_LST)/$(basename $(@F)).lst
|
||
|
@-$(CC) $(CFLAGS) $< -MM > $(PATH_OBJ)/$(basename $(@F)).d
|