1. Linux驱动开发之开篇--Makefile
2014-07-06 13:43
211 查看
基本Makefile
假设现在有3个文件,file2.h是函数声明,file2.c是函数定义,文件file1.c调用file2.c中的函数。则Makefile文件的编写如下:
2 自动推导
3 变量使用
4 特殊符号使用
这里$^因为会包含依赖的文件名,如果包含的该文件存在,那么将返回其含路径的文件名
所以$(wildcard $^)就是用来过滤$^包含的所有文件并且该文件确实在本地存在.
自动化变量$?代表依赖文件列表中被改变过的所有文件。
自动化变量$^代表所有通过目录搜索得到的依赖文件的完整路径名(目录 + 一般文件名)列表。
自动化变量$@代表规则的目标。
自动化变量$<代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件。
自动化变量$(@D)
5 关键词使用
wildcard
subst
用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO
TARGETS = 111.cpp 222.cpp 333.cpp
OTARGETS= $(subst cpp,o,$(TARGETS))
LTARGETS= $(subst cpp,lo,$(TARGETS))
patsubst <pattern>,<replacement>,<text> )
(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”
$(wildcard PATTERN...) 。在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。
一般我们可以使用“$(wildcard *.c)”来获取工作目录下的所有的.c文件列表。
可以使用“$(patsubst %.c,%.o,$(wildcard *.c))”,首先使用“wildcard”函数获取工作目录下的.c文件列表;之后将列表中所有文件名的后缀.c替换为.o。
filter
6 选项使用
7 进入子目录
在学习Makefile过程中,一般是Makefile文件和源码、头文件存放在同一个目录中,但对于我们实际的工作过程中,通常是分开的。分开主要有两种方式,一种是根据模块,一种是根据文件的不同。如下面两图:
View Code
完整的测试代码
假设现在有3个文件,file2.h是函数声明,file2.c是函数定义,文件file1.c调用file2.c中的函数。则Makefile文件的编写如下:
helloworld:file1.o file2.o gcc file1.o file2.o -o helloworld file1.o:file1.c file2.h gcc -c file1.c -o file1.o file2.o:file2.c file2.h gcc -c file2.c -o file2.o clean: rm -rf *.o helloworld
2 自动推导
helloworld:file1.o file2.o gcc file1.o file2.o -o helloworld %.o:%.c gcc -c $< -o $@ clean: rm -rf *.o helloworld
3 变量使用
CC= gcc CFLAGS= -I/home/mymakefile/include LDFLAGS= -L/home/mymakefile/lib LIBS = -lsocket -lmath CFLAGS= -g -Wall -O2 #PATH = /path/to/bin SRCS=file1.c file2.c OBJS=file1.o file2.o TARGET=helloworld $(TARGET):$(OBJS) $(CC) $(CFLAGS) $(OBJS) -o $(TARGET) %.o:%.c $(CC) -c $< -o $@ clean: rm -rf $(OBJS) $(TARGET)
4 特殊符号使用
这里$^因为会包含依赖的文件名,如果包含的该文件存在,那么将返回其含路径的文件名
所以$(wildcard $^)就是用来过滤$^包含的所有文件并且该文件确实在本地存在.
自动化变量$?代表依赖文件列表中被改变过的所有文件。
自动化变量$^代表所有通过目录搜索得到的依赖文件的完整路径名(目录 + 一般文件名)列表。
自动化变量$@代表规则的目标。
自动化变量$<代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件。
自动化变量$(@D)
5 关键词使用
wildcard
subst
用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO
TARGETS = 111.cpp 222.cpp 333.cpp
OTARGETS= $(subst cpp,o,$(TARGETS))
LTARGETS= $(subst cpp,lo,$(TARGETS))
patsubst <pattern>,<replacement>,<text> )
(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”
$(wildcard PATTERN...) 。在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。
一般我们可以使用“$(wildcard *.c)”来获取工作目录下的所有的.c文件列表。
可以使用“$(patsubst %.c,%.o,$(wildcard *.c))”,首先使用“wildcard”函数获取工作目录下的.c文件列表;之后将列表中所有文件名的后缀.c替换为.o。
filter
6 选项使用
7 进入子目录
在学习Makefile过程中,一般是Makefile文件和源码、头文件存放在同一个目录中,但对于我们实际的工作过程中,通常是分开的。分开主要有两种方式,一种是根据模块,一种是根据文件的不同。如下面两图:
#Makefile ########################################### # Makefile # By Guo Jianwei # 2014-8-26 # EMAIL: gjianw217@163.com ########################################### OBJ=fun1/fun1.o\ fun2/fun2.o\ main.o DEL=fun1/fun1.h\ fun2/fun2.h SRC=$(patsubst %.o,%.cpp,$(OBJ)) TARGET=app .PHONY:all fun1 fun2 app all:fun1 fun2 app fun1: $(MAKE) -C fun1 fun2: $(MAKE) -C fun2 $(TARGET):$(OBJ) g++ -o $(TARGET) $(OBJ) $(DEL) %.o:%.cpp g++ -c $< $(DEL) clean: rm $(OBJ) $(TARGET) ########################################### #Makefile fun1 # By Guo Jianwei # 2014-8-26 # EMAIL: gjianw217@163.com ########################################### OBJ=\ fun1.o DEP=\ fun1.h SRC=\ fun1.cpp $(OBJ):$(SRC) @echo "fun1 fun1" g++ -c $< $(DEP) ########################################### #Makefile fun2 # By Guo Jianwei # 2014-8-26 # EMAIL: gjianw217@163.com ########################################### OBJ=fun2.o DEP=$(patsubst %.o,%.h,$(OBJ)) SRC=$(patsubst %.o,%.cpp,$(OBJ)) CXX=g++ CFLAGS= -O2 -c -Wall -g #$(OBJ):$(SRC) # $(CXX) $(CFLAGS) $< $(OBJ):%.o:%.cpp $(CXX) $(CFLAGS) $< $(DEP)
View Code
完整的测试代码
相关文章推荐
- linux字符设备驱动开发模板及Makefile
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- linux驱动开发模块中Makefile的理解
- Linux驱动基础开发 Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- linux驱动开发内核模块编译——Makefile入门
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- Linux驱动开发之开篇--HelloWorld
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- linux字符设备驱动开发模板及Makefile
- Linux 驱动开发之内核模块开发 (二)—— 内核模块编译 Makefile 入门
- Linux 驱动开发之内核模块开发 (二)—— 内核模块编译 Makefile 入门
- [ARM-LInux开发]linux设备驱动makefile入门解析
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解-转
- Linux设备驱动开发-Makefile与Kconfig举例
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- linux驱动开发之开篇
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- linux驱动开发-Hello World篇