make使用

make 工具

make ( utility software) 一般读取叫做makefile的文件,自动化构建软件。

make及其描述文件makefile. Makefile文件Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。

在 UNIX 系统中,习惯使用 Makefile 作为 makfile 文件。
Makefile文件作为一种描述文档一般需要包含以下内容:◆ 宏定义◆ 源文件之间的相互依赖关系◆ 可执行的命令Makefile中允许使用简单的宏指代源文件及其相关编译信息,在Linux中也称宏为变量。在引用宏时只需在变量前加$符号,但值得注意的是,如果变量名的长度超过一个字符,在引用时就必须加圆括号()。

规则介绍

makefile的格式是:
# 用“#”号表明注释。
target(要生成的文件): dependencies(被依赖的文件)
# 命令前面用的是“tab”而非空格。误用空格是初学者容易犯的错误!
Tab ↹命令1
Tab ↹命令2
Tab ↹命令3
.
.
.
Tab ↹命令n
# 可以使用“\”表示续行。注意,“\”之后不能有空格!

  • target通常是生成的文件的名字。第一个target是默认的target。当make不带参数时,自动执行第一个target。不过,执行target后不一定得到和target同名的文件,此时也称为伪target(phony target),比如目标是一个操作的名字 clean,用来删除对象文件。
  • dependencies是要生成target所需要的文件名列表。依赖可以为空,比如clean这个target就没有依赖。如果依赖不是空的,就会检查依赖的规则,依赖规定了何时重新执行target下命令。如果u依赖比target更新,make则会重新执行target下的命令。
  • 命令是任何一个shell运行命令

“宏”指的是用一个字符串代替另一个字符串的功能。在makefile中可以使用“=”号来定义宏,使用“$(宏名)”来使用宏;还可以用“+=”追加宏的内容。习惯上,宏名使用大写。

OBJECTS = main.o text.o
INSTALL_PATH = /usr/local
editor: $(OBJECTS)
	gcc -o editor $(OBJECTS)
main.o: main.c
	gcc -c main.c
text.o: text.c
	gcc -c text.c
install:editor
	mv editor $(INSTALL_PATH)
Makefile 文件语法

正常情况下,make会打印每条命令,然后再执行,这种叫做回声(echoing)。在命令前面加上@符号,就可以关闭回声。由于在构建过程中,需要了解当前在执行哪条命令,所以通常只在注释和纯显示的echo命令前面加上@。

模式匹配

Make命令允许对文件名,进行类似正则运算的匹配,主要用到的匹配符是%。比如,假定当前目录下有 f1.c 和 f2.c 两个源码文件,需要将它们编译为对应的对象文件。使用%匹配符,可以将大量的同类型文件,用这一条规则构建完成

%.o: %.c

等同于:


f1.o: f1.c
f2.o: f2.c
变量和赋值符

Makefile一共提供了四个赋值运算符 (=、:=、?=、+=)

VARIABLE = value
# 在执行时扩展,允许递归扩展。

VARIABLE := value
# 在定义时扩展。

VARIABLE ?= value
# 只有在该变量为空时才设置值。

VARIABLE += value
# 将值追加到变量的尾端。
  • 自动变量
    Make命令还提供一些自动变量,它们的值与当前规则有关。主要有以下几个。$@ 指代当前目标,就是make命令当前构建的那个目标。
a.txt b.txt: 
    touch $@
# 等价于下面的命令
a.txt:
    touch a.txt
b.txt:
    touch b.txt

$< 指代第一个前置条件。比如,规则为 t: p1 p2,那么$< 就指代p1。

a.txt: b.txt c.txt
    cp $< $@ 
# 等价于下面的命令
a.txt: b.txt c.txt
    cp b.txt a.txt 

$? 指代比目标更新的所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,其中 p2 的时间戳比 t 新,$?就指代p2。
$^ 指代所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,那么 $^ 就指代 p1 p2 。
$* 指代匹配符 % 匹配的部分, 比如% 匹配 f1.txt 中的f1 ,$* 就表示 f1。
$(@D) 和 $(@F) 分别指向 $@ 的目录名和文件名。比如,$@是 src/input.c,那么$(@D) 的值为 src ,$(@F) 的值为 input.c。
(阮一峰老师讲的太好了,还有好多就不一一抄笔记了。移步Make命令教程
)
此外参考博客:makefile实例剖析

  • 内置变量
    实际上,要想进一步看懂Makefile还需要了解下面的内置变量。比如,$(CC) 指向当前使用的编译器,$(MAKE) 指向当前使用的Make工具。
    下面提供了详细的内置变量清单:
AR
Archive-maintaining program; default ‘ar’.

AS
Program for compiling assembly files; default ‘as’.

CC
Program for compiling C programs; default ‘cc’.

CXX
Program for compiling C++ programs; default ‘g++’.

CPP
Program for running the C preprocessor, with results to standard output; default ‘$(CC) -E’.

FC
Program for compiling or preprocessing Fortran and Ratfor programs; default ‘f77’.

M2C
Program to use to compile Modula-2 source code; default ‘m2c’.

PC
Program for compiling Pascal programs; default ‘pc’.

CO
Program for extracting a file from RCS; default ‘co’.

GET
Program for extracting a file from SCCS; default ‘get’.

LEX
Program to use to turn Lex grammars into source code; default ‘lex’.

YACC
Program to use to turn Yacc grammars into source code; default ‘yacc’.

LINT
Program to use to run lint on source code; default ‘lint’.

MAKEINFO
Program to convert a Texinfo source file into an Info file; default ‘makeinfo’.

TEX
Program to make TeX DVI files from TeX source; default ‘tex’.

TEXI2DVI
Program to make TeX DVI files from Texinfo source; default ‘texi2dvi’.

WEAVE
Program to translate Web into TeX; default ‘weave’.

CWEAVE
Program to translate C Web into TeX; default ‘cweave’.

TANGLE
Program to translate Web into Pascal; default ‘tangle’.

CTANGLE
Program to translate C Web into C; default ‘ctangle’.

RM
Command to remove a file; default ‘rm -f’.

Here is a table of variables whose values are additional arguments for the programs above. The default values for all of these is the empty string, unless otherwise noted.

ARFLAGS
Flags to give the archive-maintaining program; default ‘rv’.

ASFLAGS
Extra flags to give to the assembler (when explicitly invoked on a ‘.s’ or ‘.S’ file).

CFLAGS
Extra flags to give to the C compiler.

CXXFLAGS
Extra flags to give to the C++ compiler.

COFLAGS
Extra flags to give to the RCS co program.

CPPFLAGS
Extra flags to give to the C preprocessor and programs that use it (the C and Fortran compilers).

FFLAGS
Extra flags to give to the Fortran compiler.

GFLAGS
Extra flags to give to the SCCS get program.

LDFLAGS
Extra flags to give to compilers when they are supposed to invoke the linker, ‘ld’, such as -L. Libraries (-lfoo) should be added to the LDLIBS variable instead.

LDLIBS
Library flags or names given to compilers when they are supposed to invoke the linker, ‘ld’. LOADLIBES is a deprecated (but still supported) alternative to LDLIBS. Non-library linker flags, such as -L, should go in the LDFLAGS variable.

LFLAGS
Extra flags to give to Lex.

YFLAGS
Extra flags to give to Yacc.

PFLAGS
Extra flags to give to the Pascal compiler.

RFLAGS
Extra flags to give to the Fortran compiler for Ratfor programs.

LINTFLAGS
Extra flags to give to lint.

之后进一步学习参考GNU make手册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值