Makefile 原文

include ../Makefile.param
#ifeq ($(SAMPLE_PARAM_FILE), )
# SAMPLE_PARAM_FILE:=../Makefile.param
# include $(SAMPLE_PARAM_FILE)
#endif # target source
SRC := $(wildcard *.c)
OBJ := $(SRC:%.c=%.o)
MPI_LIBS := $(REL_LIB)/libmpi.a
MPI_LIBS += $(REL_LIB)/libhdmi.a
TARGET := $(OBJ:%.o=%)
.PHONY : clean all all: $(TARGET) $(TARGET):%:%.o $(COMM_OBJ)
$(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(JPEGD_LIBA) clean:
@rm -f $(TARGET)
@rm -f $(OBJ)
@rm -f $(COMM_OBJ) cleanstream:
@rm -f *.h264
@rm -f *.jpg
@rm -f *.mjp
@rm -f *.mp4

解析

include

include ../Makefile.param

在Makefile也和C语言一样有include的用法,include后面跟一个Makefile文件名,其功能和C语言中的include类似,就是把被包含的Makefile文件的内容全部原本的复制到包含文件中来。

这个用法多用于在一个项目中有多个Makefile,分别在不同的目录下,这样我 们可以写一个公共Makefile,这个Makefile中包含一些公共变量的定义,其他目录下的Makefile可以把这个公共Makefile文件包含进去。

SRC := $(wildcard *.c)

SRC := $(wildcard *.c)

变量的定义

#方式一:定义多行变量
define variable
value
value
endef #方式二:
variable = value #方式三:
variable := value #方式四:
variable += value #方式五:
variable ?= value

这些定义方式中,按照展开方式不同分为:

  • 方式一、方式二、方式五,都是使用时展开,就是无论前面如何定义,变量真正的含义都是到使用的时候才展开,这样定义的变量可以递归引用当前还未定义的变量;
  • 方式三是直接展开,就是变量定义的时候就展开为真正的值,这样定义的变量不可以递归引用当前还未定义的变量;
  • 方式四是追加变量,他的展开方式要看原有的变量是如何定义的。

变量的引用

变量的引用可以采用两种方式:

$(variable)

${variable}

wildcard

一般我们可以使用下面这一句来获取工作目录下的所有的.c文件列表:

$(wildcard *.c)

在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数wildcard,它的用法是:

$(wildcard PATTERN...)

在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。

OBJ := $(SRC:%.c=%.o)

OBJ := $(SRC:%.c=%.o)

这里用到makefile里的替换引用规则,即用您指定的变量替换另一个变量。它的标准格式是:

$(var:a=b) 或 ${var:a=b}

它的含义是把变量var中的每一个值结尾用b替换掉a。

%

%”的意思是匹配零或若干字符,例如:

%.h

表示所有以“.h”结尾的文件,它是在GUNmake的语法层次上的,例如

vpath %.h ../headers

该语句表示,要求make在“../headers”目录下搜索所有以“.h”结尾的文件.

*是Shell所支持的通配符,是在shell的语法层次上,*.c,一般用在shell命令里面,如:

clean:
rm -f *.o

.PHONY : clean all

.PHONY : clean all

关键字.PHONY告诉make该目标是“假的”(磁盘上其实没有clean),这时make为生成这个目标就会将其规则执行一次。.PHONY修饰的目标就是只有规则没有依赖。

all: $(TARGET)

表示所有的目标(一个或者多个目标)

$@ $^

  • $@--目标文件
  • $^--所有的依赖文件
  • $<--第一个依赖文件

@rm -f $(TARGET)

@rm -f $(TARGET)

其中 @ 表示:如果 makefile 文件中执行的命令前面加了@字符,则不显示命令本身而只显示它的结果。

最新文章

  1. eclipse 快捷键大全
  2. 一次kibana服务失败的排查过程
  3. JS中的call()和apply()方法
  4. ThinkPHP中field 方法与getField 方法的区别。
  5. 使用DD_belatedPNG让IE6支持PNG透明图片
  6. MPI编程的常用接口速查
  7. PHP自定义日期英文格式 Feb 11,2015
  8. ***总结:在linux下连接redis并进行命令行操作(设置redis密码)
  9. VS2012的SVN插件VISUALSVN
  10. 在linux下如何编译C++程序
  11. hdu1695(莫比乌斯反演)
  12. angularJS看MVVM
  13. ecshop开发帮助
  14. 跨域请求CORS
  15. mysql安装过程
  16. Spring Security入门(3-3)Spring Security 手工配置并注入 authenticationProvider 和 异常信息传递
  17. 微软官方的.net命令行参数库
  18. python的队列和栈
  19. 在项目中使用react
  20. poj-3666 【对dp子状态无后效性的理解】

热门文章

  1. CloudStack Ctrix官网版本
  2. code1744 方格染色
  3. bash 环境配置及脚本
  4. SQL序列键
  5. [GO]文件的读写
  6. Android开发之Tween(补间动画)
  7. Leaflet入门:添加点线面并导入GeoJSON数据|Tutorial of Leaflet: Adding Points, Lines, Polygons and Import GeoJSON File
  8. Java 代理模式(一) 静态代理
  9. JVM 方法调用之静态分派
  10. JSP Servlet中Request与Response所有成员方法的研究