first commit
This commit is contained in:
201
Makefile
Normal file
201
Makefile
Normal file
@@ -0,0 +1,201 @@
|
||||
#
|
||||
# 'make' build executable file 'main'
|
||||
# 'make clean' removes all .o and executable files
|
||||
#
|
||||
.DEFAULT_GOAL := all
|
||||
|
||||
# CROSS_COMPILE ?= arm-linux-gnueabihf-
|
||||
CROSS_COMPILE ?=
|
||||
TARGET ?= main
|
||||
|
||||
# define the C compiler to use
|
||||
CC := $(CROSS_COMPILE)gcc
|
||||
LD := $(CROSS_COMPILE)ld
|
||||
OBJCOPY := $(CROSS_COMPILE)objcopy
|
||||
OBJDUMP := $(CROSS_COMPILE)objdump
|
||||
SIZE := $(CROSS_COMPILE)size
|
||||
|
||||
# define any compile-time flags
|
||||
CFLAGS ?=
|
||||
CFLAGS += -O0
|
||||
CFLAGS += -g
|
||||
|
||||
# warning param setting
|
||||
CFLAGS += -Wall
|
||||
# think use -Os.
|
||||
CFLAGS += -Wno-unused-function
|
||||
CFLAGS += -Wno-unused-variable
|
||||
|
||||
CFLAGS += -Wstrict-prototypes
|
||||
CFLAGS += -Wshadow
|
||||
# CFLAGS += -Werror
|
||||
|
||||
# spec c version
|
||||
CFLAGS += -std=c99
|
||||
# CFLAGS += -Wno-format
|
||||
|
||||
# for makefile depend tree create
|
||||
CFLAGS += -MMD -MP
|
||||
|
||||
# for weak.
|
||||
CFLAGS += -fno-common
|
||||
|
||||
## MAKEFILE COMPILE MESSAGE CONTROL ##
|
||||
ifeq ($(V),1)
|
||||
Q=
|
||||
else
|
||||
Q=@
|
||||
endif
|
||||
|
||||
# Put functions and data in their own binary sections so that ld can
|
||||
# garbage collect them
|
||||
ifeq ($(NOGC),1)
|
||||
GC_CFLAGS =
|
||||
GC_LDFLAGS =
|
||||
else
|
||||
GC_CFLAGS = -ffunction-sections -fdata-sections
|
||||
GC_LDFLAGS = -Wl,--gc-sections -Wl,--check-sections
|
||||
endif
|
||||
|
||||
|
||||
CFLAGS += $(GC_CFLAGS)
|
||||
|
||||
# define ld params
|
||||
LDFLAGS :=
|
||||
LDFLAGS += $(GC_LDFLAGS)
|
||||
|
||||
|
||||
# define library paths in addition to /usr/lib
|
||||
# if I wanted to include libraries not in /usr/lib I'd specify
|
||||
# their path using -Lpath, something like:
|
||||
LFLAGS :=
|
||||
|
||||
# define output directory
|
||||
OUTPUT_PATH := output
|
||||
|
||||
# define source directory
|
||||
SRC :=
|
||||
|
||||
# define include directory
|
||||
INCLUDE :=
|
||||
|
||||
# define lib directory
|
||||
LIB :=
|
||||
|
||||
|
||||
OUTPUT_TARGET := $(OUTPUT_PATH)/$(TARGET)
|
||||
|
||||
OBJDIR = $(OUTPUT_PATH)/obj
|
||||
|
||||
|
||||
# include user build.mk
|
||||
include build.mk
|
||||
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
ifdef ComSpec
|
||||
WINCMD:=$(ComSpec)
|
||||
endif
|
||||
ifdef COMSPEC
|
||||
WINCMD:=$(COMSPEC)
|
||||
endif
|
||||
|
||||
SHELL:=$(WINCMD)
|
||||
|
||||
MAIN := $(TARGET).exe
|
||||
ECHO=echo
|
||||
SOURCEDIRS := $(SRC)
|
||||
INCLUDEDIRS := $(INCLUDE)
|
||||
LIBDIRS := $(LIB)
|
||||
FIXPATH = $(subst /,\,$1)
|
||||
RM := del /q /s
|
||||
MD := mkdir
|
||||
else
|
||||
MAIN := $(TARGET)
|
||||
ECHO=echo
|
||||
SOURCEDIRS := $(shell find $(SRC) -type d)
|
||||
INCLUDEDIRS := $(shell find $(INCLUDE) -type d)
|
||||
LIBDIRS := $(shell find $(LIB) -type d)
|
||||
FIXPATH = $1
|
||||
RM = rm -rf
|
||||
MD := mkdir -p
|
||||
endif
|
||||
|
||||
# define any directories containing header files other than /usr/include
|
||||
INCLUDES := $(patsubst %,-I%, $(INCLUDEDIRS:%/=%))
|
||||
@echo INCLUDES: $(INCLUDES)
|
||||
|
||||
# define the C libs
|
||||
LIBS := $(patsubst %,-L%, $(LIBDIRS:%/=%))
|
||||
|
||||
# define the C source files
|
||||
SOURCES := $(wildcard $(patsubst %,%/*.c, $(SOURCEDIRS)))
|
||||
|
||||
# define the C object files
|
||||
OBJECTS := $(patsubst %, $(OBJDIR)/%, $(SOURCES:.c=.o))
|
||||
OBJ_MD := $(addprefix $(OBJDIR)/, $(SOURCEDIRS))
|
||||
|
||||
|
||||
|
||||
ALL_DEPS := $(OBJECTS:.o=.d)
|
||||
|
||||
# include dependency files of application
|
||||
ifneq ($(MAKECMDGOALS),clean)
|
||||
-include $(ALL_DEPS)
|
||||
endif
|
||||
|
||||
#
|
||||
# The following part of the makefile is generic; it can be used to
|
||||
# build any executable just by changing the definitions above and by
|
||||
# deleting dependencies appended to the file from 'make depend'
|
||||
#
|
||||
|
||||
OUTPUT_MAIN := $(OUTPUT_PATH)/$(MAIN)
|
||||
|
||||
# Fix path error.
|
||||
#OUTPUT_MAIN := $(call FIXPATH,$(OUTPUT_MAIN))
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: main
|
||||
@$(ECHO) Start Build Image.
|
||||
$(OBJCOPY) -v -O binary $(OUTPUT_MAIN) $(OUTPUT_TARGET).bin
|
||||
$(OBJDUMP) --source --all-headers --demangle --line-numbers --wide $(OUTPUT_MAIN) > $(OUTPUT_TARGET).lst
|
||||
@$(ECHO) Print Size
|
||||
$(Q)@$(SIZE) --format=berkeley $(OUTPUT_MAIN)
|
||||
# @$(ECHO) Executing 'all' complete!
|
||||
|
||||
# mk path for object.
|
||||
$(OBJ_MD):
|
||||
$(Q)if not exist "$@" $(Q)$(MD) $(call FIXPATH, $@)
|
||||
|
||||
# mk output path.
|
||||
$(OUTPUT_PATH):
|
||||
$(Q)if not exist "$@" $(Q)$(MD) $(call FIXPATH, $@)
|
||||
|
||||
$(OBJDIR):
|
||||
$(Q)if not exist "$@" $(Q)$(MD) $(call FIXPATH, $@)
|
||||
|
||||
$(OUTPUT_MAIN): $(OBJECTS)
|
||||
@$(ECHO) Linking : "$@"
|
||||
$(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(INCLUDES) -Wl,-Map,$(OUTPUT_TARGET).map -o $(OUTPUT_MAIN) $(OBJECTS) $(LFLAGS) $(LIBS) $(OUTPUT_BT_LIB)
|
||||
|
||||
main: | $(OUTPUT_PATH) $(OBJDIR) $(OBJ_MD) $(OUTPUT_MAIN)
|
||||
@$(ECHO) Building : "$(OUTPUT_MAIN)"
|
||||
|
||||
# Static Pattern Rules [targets ...: target-pattern: prereq-patterns ...]
|
||||
$(OBJECTS): $(OBJDIR)/%.o : %.c
|
||||
@$(ECHO) Compiling : "$<"
|
||||
$(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
|
||||
|
||||
|
||||
clean:
|
||||
# $(RM) $(OUTPUT_MAIN)
|
||||
# $(RM) $(OBJECTS)
|
||||
# $(RM) $(OBJDIR)
|
||||
$(Q)$(RM) $(call FIXPATH, $(OUTPUT_PATH))
|
||||
@$(ECHO) Cleanup complete!
|
||||
|
||||
run: all
|
||||
./$(OUTPUT_MAIN)
|
||||
@$(ECHO) Executing 'run: all' complete!
|
||||
Reference in New Issue
Block a user