文件内容
#[ personalization start ]#####################################
TargetName :=
TargetType :=
IncPath :=
SrcPath :=
BuildFlag :=
SrcFile :=
FilterFile :=
LinkLibName :=
BuildTimeLibPath :=
RunTimeLibPath :=
SubitemDir :=
Platform :=
Cross :=
OutPath :=
#[ personalization end ]#####################################
SRCS += $(SrcFile)
SRCS += $(foreach dir,$(SrcPath),$(wildcard $(dir)/*.c))
SRCS := $(filter-out $(FilterFile),$(SRCS))
OBJS := $(patsubst %.c,%.o,$(SRCS))
CFLAGS += $(BuildFlag)
CFLAGS += $(addprefix -I,$(IncPath))
WLRATH := -Wl,-rpath=
LDFLAGS += $(addprefix $(WLRATH),$(RunTimeLibPath))
LDFLAGS += $(addprefix -L,$(BuildTimeLibPath))
LDFLAGS += $(addprefix -l,$(LinkLibName))
ifeq ($(Platform), arm)
CC := $(Cross)gcc
AR := $(Cross)ar
else ifeq ($(Platform), m32)
CFLAGS += -m32
else ifeq ($(Platform), m64)
CFLAGS += -m64
endif
ifeq ($(OutPath),)
ifeq ($(Platform), arm)
OutPath := ./build/$(firstword $(subst -, ,$(Cross)))
else
OutPath := ./build/$(shell uname -m)
endif
endif
ifeq ($(TargetType), a)
TARGET := build_a
targets := lib$(TargetName).a
else ifeq ($(TargetType), elf)
TARGET := build_elf
targets := $(TargetName).elf
else ifeq ($(TargetType), so)
TARGET := build_so
CFLAGS += -fPIC
LDFLAGS += -shared
targets := lib$(TargetName).so
endif
build:subitem $(TARGET) install clean
subitem:$(SubitemDir)
$(foreach dir,$(SubitemDir),$(MAKE) -C $(dir) || exit 1;)
$(OBJS):%.o:%.c
$(CC) -c $^ -o $@ $(CFLAGS)
build_a:$(OBJS)
$(AR) rcs $(targets) $^
build_elf:$(OBJS)
$(CC) $^ $(LDFLAGS) -o $(targets)
build_so:$(OBJS)
$(CC) $(LDFLAGS) $^ -o $(targets)
install:
install -d $(OutPath)
install -m 0755 $(targets) $(OutPath)
uninstall:
- $(RM) $(OutPath)/$(targets)
clean:
- $(RM) $(OBJS) .*.sw?
- $(RM) $(targets)
- $(foreach dir,$(SubitemDir),$(MAKE) -C $(dir) clean)
文件说明
文件需要修改的参数都在"#personalization "包括段中,参数如下说明
1.如果工程结构简单
参数 | 描述 | 例 |
---|---|---|
TargetName | 编译目标名称 | app |
TargetType | 目标类型 | a或so或elf |
IncPath | 头文件所在路径列表 | ./inc ./ |
SrcPath | 源文件所在路径列表 | ./src ./ |
BuildFlag | 编译标志列表 | -g -Wall -O0 |
2.如果需要额外增加或剔除文件
参数 | 描述 | 例 |
---|---|---|
SrcFile | 源文件列表 | ./main.c |
FilterFile | 剔除文件列表 | ./win_fun.c |
3.如果需要使用一些库
参数 | 描述 | 例 |
---|---|---|
LinkLibName | 动态库或静态库名称列表 (去掉前缀和后缀) | sum |
BuildTimeLibPath | 编译时库所在路径列表 | ./lib |
RunTimeLibPath | 运行时库所在路径列表(未添加到环境变量中的) | . |
4.如果需要子项
参数 | 描述 | 例 |
---|---|---|
SubitemDir | 子Makefile路径列表(在编译目标前被执行 ) | ./module |
5.如果关心运行平台
参数 | 描述 | 例 |
---|---|---|
Platform | 指定运行平台(未指定时默认当前台) | m32或m64或arm |
Cross | 交叉编译工具链前缀(当Platform=arm时有效) | arm-none-eabi- |
5.如果关心目标输出目录
参数 | 描述 | 例 |
---|---|---|
OutPath | 目标文件的安装位置(未指定时为 ./build/arch/) |