一个通用的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 条评论
登录 后参与评论

相关文章

来自专栏康怀帅的专栏

CoreOS 容器 Rkt 简单介绍

由于 Docker 已经成为事实上的容器老大,这里暂且将 rkt 内容放入 docker 文件夹。哈哈 官方网站:https://coreos.com/rkt/...

3797
来自专栏杨建荣的学习笔记

关于db link权限分配的苦旅(一) (r7笔记第42天)

昨天接到一个开发的需求,内容看起来非常简单。 申请数据库192.168.1.118:1522:TEST下用户APP_TE_FLOW_128赋予对表testore...

3246
来自专栏程序员的酒和故事

跟Google学写代码--Chromium/base--windows_version源码学习及应用

Chromium是一个伟大的、庞大的开源工程,很多值得我们学习的地方。 前面写道: 《跟Google学写代码–Chromium/base–stl_util源...

3357
来自专栏木头编程 - moTzxx

PHP 学习筆記[1] —— ThinkPHP 公共函数整理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

674
来自专栏Golang语言社区

【Go 语言社区】Go实现个留言本

一、分析 要实现这个下面是几个重要的东西。 1.数据库操作(go怎么操作数据库)、 2.输出js,css,图片等 3.html显示 ...

3429
来自专栏智能合约

以太坊智能合约开发第四篇:实现Hello World智能合约

2124
来自专栏Linux驱动

Makefile中export分析

在分析内核启动过程的./arch/arm/Makefile文件里碰到了这样字段 162 export TEXT_OFFSET GZFLAGS MMUEXT  ...

1896
来自专栏一个会写诗的程序员的博客

Spring Boot + JPA + Freemarker 实现后端分页 完整示例Spring Boot + JPA + Freemarker 实现后端分页 完整示例

https://github.com/EasyKotlin/chatper15_net_io_img_crawler

552
来自专栏SpringSpace.cn

RHEL 4.7 (64bit) 环境安装 GCC 4.6 测试记录 (更新至gcc-4.6.1)

Red Hat Enterprise Linux AS release 4 (Nahant Update 7)

952
来自专栏乐沙弥的世界

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

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

572

扫描关注云+社区