Makefile笔记一【基础篇】

可以用autoconf和automake自动生成工程所需要的makefile。


makefile的工作方式:

Makefile 中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的

1、读入所有的 Makefile。
2、读入被 include 的其它 Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。


每条命令的开头必须是[Tab]键开头。


makefile的关键字:vpath,包含大量的源文件的目录


伪目标:

.PHONY : clean

clean:
rm *.o temp


自动化变量:$@ 所有目标的集合,$<所有的依赖目标集


显示命令@,调试makefile很有帮助

我们用这个功能来像屏幕显示一些信息。如:@echo 正在编译 XXX 模块......,当 make 执行时,会输出“正在编译 XXX 模块......”字串,但不会输出命令,如果没有“@”,那么,make 将输出:echo 正在编译 XXX 模块......

如果 make 执行时,带入 make 参数“-n”或“--just-print”,那么其只是显示命令

而 make 参数“-s”或“--slient”则是全面禁止命令的显示。


命令执行:

Makefile默认ed环境路径就是makefile文件当前的路径。cd /home/hchen; pwd 这样才会打印出/home/hchen, 换行就不会了


多文件路径makefile

build:
cd subdir && $(MAKE)

$(MAKE)宏变量的意思是,也许我们的 make 需要一些参数,所以定义成一个变量比较利于维护。这个例子的意思都是先进入“subdir”目录,然后执行 make 命令

如果你要传递变量到下级 Makefile 中,那么你可以使用这样的声明:export <variable ...>

如果你不想让某些变量传递到下级 Makefile 中,那么你可以这样声明:unexport <variable ...>

需要注意的是,有两个变量,一个是 SHELL,一个是 MAKEFLAGS,这两个变量不管你是否 export,其总是要传递到下层 Makefile 中

多个文件共同的CFLAGS这个变量,相当于全局变量


定义命令包:

类似C语言的宏,这样$(run-yacc) 就相当于 define和endef之间的命令

define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef


makefile的变量是大小敏感的

=   直接赋值和宏一样,可以使用后面的变量,最终的结果

:= 前面的变量不能使用后面的变量,只能使用前面已定义好了的变

+=追加变量

?=如果没定义过,就赋值

可以嵌套变量a := $($(x))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Makefile是一种用于自动化构建程序的工具,它通过定义文件间的依赖关系和构建规则来实现自动化构建。下面是Makefile新手需要掌握的基础知识: 1. Makefile的基本语法 Makefile由一系列规则组成,每个规则包含一个目标(target)和一个或多个依赖(prerequisites),以及一个或多个命令(recipe)。目标是需要构建的文件或命令,依赖是构建目标所需要的文件或命令,命令是构建目标的具体操作。 示例: ``` target: prerequisites command1 command2 ``` 2. Makefile的变量 Makefile支持变量的定义和使用,变量可以用于存储一些常量或配置信息,方便在多个规则中重复使用。变量的定义格式为“变量名=变量值”。 示例: ``` CC=gcc CFLAGS=-Wall -g ``` 3. Makefile的模式规则 Makefile支持模式规则,可以通过通配符来匹配多个文件或目录,方便实现批量构建。通配符有“%”和“$”,“%”表示任意长度的字符串,“$”表示匹配单个字符。 示例: ``` %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ ``` 4. Makefile的自动变量 Makefile支持一些自动变量,可以方便地在命令中使用一些常用信息,如目标、依赖、命令行参数等。 示例: ``` target: $(obj) $(CC) $(CFLAGS) $^ -o $@ ``` 其中,“$^”表示所有依赖文件,“$@”表示目标文件。 5. Makefile的函数 Makefile支持一些函数,可以方便地对变量进行操作,如字符串处理、文件名处理等。 示例: ``` SRC=$(wildcard *.c) OBJ=$(patsubst %.c, %.o, $(SRC)) ``` 其中,“$(wildcard *.c)”函数可以获取当前目录下所有以“.c”结尾的文件,“$(patsubst %.c, %.o, $(SRC))”函数可以将“SRC”中的“.c”文件替换为“.o”文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值