写一个Makefile

文件内容

#[ 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/)

更多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值