一个通用的makefile(一)
时间:2022-05-03
本文章向大家介绍一个通用的makefile(一),主要内容包括1、根目录(相对于项目而言)的makefile、2、子目录下的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
- Android注解学习(1)
- [WCF权限控制]ASP.NET Roles授权[上篇]
- [WCF权限控制]ASP.NET Roles授权[下篇]
- 如何解决分布式系统中的跨时区问题[实例篇]
- Visual Studio对程序集签名时一个很不好用的地方
- 一个关于解决序列化问题的编程技巧
- [WCF权限控制]从两个重要的概念谈起:Identity与Principal[上篇]
- 从数据到代码——通过代码生成机制实现强类型编程[下篇]
- 谈谈你最熟悉的System.DateTime[下篇]
- 如何解决EnterLib异常处理框架最大的局限——基于异常"类型"的异常处理策略
- [WCF权限控制]从两个重要的概念谈起:Identity与Principal[下篇]
- 收藏!6道常见hadoop面试题及答案解析
- 这是EnterLib PIAB的BUG吗?
- [WCF权限控制]基于Windows用户组的授权方式[上篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 企图变秃变强的第一天
- 企图变秃变强的第二天
- Lambda表达式和FastDfs文件上传
- Postman带token测试接口、找不到生产者、无法连接MySQL、禅道部署
- MyBatis-Plus调试配置,IllegaStateException,StringUtils补充
- NullException、Token的作用、Mapstruct用法
- 1.String类型字符串拼接2.IDEA清除缓存、热部署3.File的用法 4.Dubbo查询服务状态
- 1.Dubbo 常见错误及解决方法
- SpringBoot学习一:创建工程、pom文件
- SpringBoot学习二:基础配置
- Spring Boot 学习三:静态资源、整合 Thymeleaf 页面模板、@RestControllerAdvice
- SpringBoot学习四:日志框架、SpringBoot自动化配置
- SpringBoot学习五:错误处理、跨域支持
- Spring Security安全
- SpringBoot定时任务