一个通用的makefile(一)

最近在编写Android编译系统时,需要遍历每一个目录下每一个文件夹下的makefile,网上的方法有些繁琐 ;就直接贴上自己遍历子目录深度为1;(for  temporary)(之后会继续更新)

下面是我的一个简单实例工程:

文件夹目录层次:

1、根目录(相对于项目而言)的makefile

 1 #获取当前目录下的子目录名字
 2 subdir = $(shell ls -l | grep ^d | awk '{print $$9}')
 3 
 4 .PHONY : all clean ${subdir} NULL
 5 
 6 all: ${subdir}
 7 ${subdir} : NULL 
 8     make -C $@ clean
 9     make -C $@
10 
11 #make clean可以直接去掉各层目录下的*.o文件,而在Android编译系统中会直接删除out路径就可以了
12 clean: 
13     find ./ -name '*.o' | xargs -I{} rm -f {}
14 NULL:
15 #:为空语句
16     @: 

2、子目录下的makefile:

 1 #PWD = "shell pwd"
 2 CC := gcc        
 3 #shell pwd是比较好一点的
 4 INC_DIR := $(shell pwd)/inc/
 5 SRC_DIR := $(shell pwd)/src/
 6 OBJ_DIR := $(shell pwd)/obj/
 7 BIN_DIR := $(shell pwd)/bin/
 8 LIB_DIR := $(shell pwd)/lib/
 9 
10 #目标文件名
11 TARGET  := $(BIN_DIR)/main
12 
13 
14 CFLAGS := -g
15 CFLAGS += -Wall
16 CFLAGS += -D_FORTIFY_SOURCE=2
17 
18 
19 #patsubst 是替换通配符,会把第一个%.c替换成第二个参数的%.c,
20 #wildcard 是把指定目录 $(SRC_DIR)下面的.c文件全部展开
21 #notdir 是把展开的文件去掉路径信息
22 SOURCES := $(patsubst %.c,%.c,$(notdir $(wildcard $(SRC_DIR)/*.c))) \
23 
24 OBJECTS := $(addprefix $(OBJ_DIR)/, $(SOURCES:.c=.o))
25 
26 
27 .PHONY : clean all $(TARGET)  $(OBJECTS)
28 
29 INCPATHS := \
30     -I. \
31 
32 LIBDIRS :=  \
33     -L. \
34     
35 LIBS := \
36     -lpthread \
37 
38 $(TARGET) : $(OBJECTS)
39     @mkdir -p  $(LIB_DIR) $(BIN_DIR) 2> /dev/null
40     $(CC) $(CFLAGS)  -o $@ $(OBJECTS)
41 $(OBJECTS) : $(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
42     @mkdir -p $(OBJ_DIR) 2> /dev/null
43     $(CC) -c $(CFLAGS) $< -o $@
44 
45 all: $(OBJECTS) $(TARGET)
46 
47 clean:
48     find ./ -name '*.*.swp' | xargs -I{} rm -f {}
49     rm -f $(OBJECTS) $(TARGET) 

Reference:

 http://blog.csdn.net/xukai871105/article/details/36475319

http://blog.csdn.net/styyzxjq2009/article/details/26491331

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linux驱动

34.QT-制作串口助手(并动态检测在线串口,附带源码)

将qextserialport-1.2rc.zip解压,将解压后的src目录拷贝到项目里的子目录SerialSrc下,在项目pro文件中增加下面这行

1073
来自专栏乐沙弥的世界

基于RMAN的异机数据库克隆(rman duplicate)

      对于基于生产环境下的数据库的版本升级或者测试新的应用程序的性能及其影响,备份恢复等等,我们可以采取从生产环境以克隆的方式将其克隆到本地而不影响生产数...

952
来自专栏Java与Android技术栈

Android App安全防范措施的小结

关闭打印的日志,防止日志中的调试信息被看到。如果在网络框架中使用了日志,那就更加需要关闭了。

1032
来自专栏Java成神之路

分布式_事务_02_2PC框架raincat源码解析

上一节已经将raincat demo工程运行起来了,这一节来分析下raincat的源码

1731
来自专栏玄魂工作室

Msfvenom后门重新学习与分析-windows篇

Msfvenom 是msf框架配套的攻击载荷生成器。 什么是攻击荷载: Payload:目标系统上渗透成功后执行的代码 msfvenom命令行选项如下: ? ?...

4409
来自专栏GopherCoder

『No19: Gorm 上手指南』

如果你是做后端开发的,日常工作中,除了熟悉编程语言之外,数据库怕是最常用的技术了吧。

4781
来自专栏数据之美

修改 mysql/oracle/bash/vimrc/cmd 提示符格式与颜色

(1)修改mysql提示符: MySQL 客户端的默认提示符是 "mysql>",基本上没什么实际作用。其实可以修改这个提示符,让它显示一些有用的信息,例如当前...

23610
来自专栏逸鹏说道

我这么玩Web Api(一)

帮助页面或用户手册(Microsoft and Swashbuckle Help Page) 前言   你需要为客户编写Api调用手册?你需要测试你的Api接口...

3045
来自专栏玄魂工作室

Msfvenom后门重新学习与分析-windows篇

Msfvenom 是msf框架配套的攻击载荷生成器。 什么是攻击荷载: Payload:目标系统上渗透成功后执行的代码 msfvenom命令行选项如下: ? ?...

2998
来自专栏高性能服务器开发

关于windows完成端口(IOCP)的一些理解(二)

1 不知道你是否记得前面中说过每消耗一个预先准备客户端的socket,就要补上一个。这个代码现在看来就应该放在连接成功事件里面了: DWORD ThreadFu...

4099

扫码关注云+社区