开源项目学习(3)---- Makefile 基本语法

1.Makefile 基本格式

 目标列表:参数列表(依赖列表)

TAB 执行命令

执行条件:如果参数列表中有一个或者多个文件比目标列表中文件新的话,就会执行命令,

当目标列表中的目标不存在的时候,也会执行对应的命令

注意命令列表一定要以 tab 键进行开头,否则执行时会报错: 

*** missing separator. 没有以 TAB键开头

2. Makefile 基本语法/概念

使用 # 号作为注释的方法

Makefile 文件名:

大多是 Makefile 支持 makefile 和 Makefile 这两个文件名

引用其他 Makefile

引用其他 Makefile 的方法(形式如下):

include a.mk #引用单个 Makefile

include a.mk b.mk c.mk  #包含其他 Makefile

include *.mk #使用通配符包含其他Makefile 

include $(Bar) #使用变量包含其他Makefile

如果文件没有找到的话,make 会生成一条警告信息,但是不会产生致命的错误,它会继续载入其他文件,一旦完成 makefile 的读取,make 会重试这些没有找到,或者是不能读取的文件,如果还是不行,make 才会出现一条致命信息

如果要求 makefile 忽略文件无法找到的问题,可以使用下面的形式:

-include a.mk

伪目标

举例: .PHONY:ALL (注意 PHONY 后面要加上冒号)

表示的是不会生成 ALL 这个目标文件,但是要执行 ALL 下面的命令,Makefile 中的第一个目标会被设置为默认目标,也就是直接执行 make 命令不加参数执行生成的目标

注意在实际中也可以将伪目标定义为变量的形式:

.PHONY := $(PHONY)

$(PHONY) := ALL Romfs  modules

同样伪目标也可以成为依赖:

clean: cleanobj cleandiff
    -rm program

cleanobj:
    -rm -rf *.o

cleandiff:
    -rm -rf *.diff

多目标

一个makefile 单元可以产生多个目标,比如:

bigoutput littleouptut : text.g
generate  text.g  -$(subst  output,, $@) > $@

等同于下面的代码:

bigoutput: text.g
generate text.g -big > bigoutput

littleoutput:text.g
generate text.g -little > littleoutput

3. Makefile 中的变量

基本定义

变量名可以使用字母,数字或者下划线组成:

var := val1
var  =  val1
var ?=  val1

=    左侧的值是变量名,右侧的值是变量内容,右边的值不一定要是已经定义的值

: = 左侧的值是变量名,右侧的值是变量内容,右边的值不一定要是已经定义的值

?= 如果变量没有被定义,那么定义的值就是变量后面的值,如果变量已经被定义,那么现在的值将会什么都不做

变量还有一种形式是 += 操作,如果变量之前有被定义过,那么会自动继承前一次的变量 比如:

variable := value
variable += more 
等同于
variable := value
variable := value $(varibale)

变量的使用举例如下:

edit : file1.o file2.o file3.o file4.o
cc -o edit file1.o file2.o file3.o file4.o

需要在两个地方都写上  file1.o file2.0 file3.o file4.o 由此引出了使用变量的方法,变量名通常叫

objects,OBJECTS,objs,OBJS,obj 或者是 OBJ

object = file1.o file2.o file3.o file4.o

edit :$(object)

cc -o edit $(object)

变量可以组合使用:

# 变量可以组合起来使用
subdir = $(currentdir)/include
currentdir_t := $(currentdir)_t

变量的引用形式

$(var) 或者 ${var}  $$(表示真实的 \$\$ 字符)

变量的使用范围:可以在目标,依赖或者命令中

$(object) : def.h
cc -o $@ ......

target : $(object)
cc -o tareget 

环境变量

Makefile 中可以使用环境变量的值,但是如果 Makefile 中重新定义,那么会使用 Makefile 中定义的值,使用 make -e 选项,会默认使用环境变量中的值

规则变量

我们可以只针对某个规则设置一个变量,该变量只在某个规则中生效,比如:

eg:

prog: CFLAG = -g 不管全局的 CFLAG 是什么 在 prog 这个规则中 CFLAG都是 -g

prog : prog.o foo.o bar.o

$(CC) $(CFLAGS) prog.o foo.o bar.o

prog.o : prog.c

$(CC) $(CFLAGS) prog.c

foo.o : foo.c

$(CC) $(CFLAGS) foo.c

bar.o : bar.c

$(CC) $(CFLAGS) bar.c

自动化变量

Makefile 中根据自动推导的规则自动推导出来的变量:

$< 依赖项目中第一个依赖项目的名称,注意是和 $^ 有区别,并且是一个个取出来的(往左第一个)

$@ 目标的集合,可以包含多行(@ 引申为 aim 表示目标)

$^ 所有依赖项目的集合,以空格作为分隔符 (帽子底下都是)

$+ 等同于 $^ 只是不去除重复的依赖目标

target: pre
CC -o  ......
$@ 等同于 target
$< 等同于 pre

命令行传入的变量

Makefile 支持从命令行中传入变量

多行变量

Makefile 中支持将多行变量链接在一起,类似于函数的功能:

define  MSTAR_LOGO
@echo "# __  __     _             ";
@echo "#|  \/  |___| |_ __ _ _ __ ";
@echo "#| |\/| / __| __/ _\` | '__|";
@echo "#| |  | \__ \ || (_| | |   ";
@echo "#|_|  |_|___/\__\__,_|_|   ";
@echo "                           ";
endef

.PHONY : clean
clean:
	@pwd
	@cd ~;pwd   #注意变量的生效域
	@pwd
	$(MSTAR_LOGO)  # we use multi line var here
	@echo "See the environment variable $(PATH)"
	@echo "We now in clean command"

4. Makefile 中的命令

显示命令

makefile 中的命令 @echo compile module now

如果前面不加上@ 执行时就会显示,显示了两遍

echo  compile module  now 
compile module  now 

命令前面加上 @ 就只会显示一遍 

命令执行

clean :
cd /home/tony.chen
pwd              // 上面一句话不会起到作用,任然会打印 makefile 的 目录

如果命令像这样分行,就不会产生任何作用,需要改成下面的形式:

clean: cd /home/tony.chen;pwd // 会打印 /home/tony.chen

命令出错码

每个命令执行完成之后,makefile 都会检测命令的返回值,如果返回值为成功,makefile 将会继续执行下一条指令,如果命令的返回状态码的值为非0,则会终止当前的规则,使用 $? 判断上一条命令的返回值

但是某些命令的错误行为应该是被忽略的,比如 mkdir 或者 rm -rf 这时可以使用命令:

-rm -rf ./*.o 来使用,Makefile 会默认忽略这个规则的错误

Makefile 的出错码 $? :

0: 表示执行成功

1:运行过程中出现任何错误都返回1

2:不太常用

嵌套执行

subsystem:
    cd subdir&&$(MAKE)

subsystem:
    $(MAKE) -c subdir

定义 MAKE 变量的含义是,也许我们的 make 需要一些参数,所以定义成一个变量比较容易维护,这两个例子都是进入 subdir,然后执行 make 命令 

变量的传递

上面这种多个 Makefile 嵌套的写法我们称为总控 Makefile,它可以将变量传递到下层的 makefile 中,传递变量到下层 Makefile 中的方法如下:

export var
unexport var


eg:
export var = value1
export var := value1
export var += value1

 如果要传递所有的变量,只需要一个 export 就可以了,表示传递所有的变量。

需要注意的是,有 shell 和 MAKEFLAGS 这两个变量总是会向下传递,如果不想传递该参数,可以使用下面的形式:

subsystem:
    cd subdir && $(MAKE) MAKEFLAGS=

补充一个有用的参数 -w ,使用 make -w 执行,可以看到命令进入该目录到离开该目录的过程,如果使用 -C 命令则默认会打开该选项。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: cmake-3.24.3.tar.gz 是一个软件包的压缩文件,里面包含了 CMake 3.24.3 的源代码和相关文件。 CMake 是一个开源的跨平台构建工具,用于管理软件项目的编译过程。它采用了一种独立于编译器的方式来描述项目的构建过程,可以生成各种平台和编译器所需的构建脚本。CMake 的主要特点是简化了项目的管理和构建过程,使得项目能够在不同的操作系统和编译环境中进行构建。 CMake 3.24.3 是 CMake 的一个特定版本,这个版本可能包含了 bug 修复、功能增强或性能优化等改进。用户可以根据自己的需要选择不同的版本进行使用。CMake 3.24.3.tar.gz 是将 CMake 3.24.3 版本的源代码打包压缩而成的文件。 要使用这个软件包,需要先将压缩文件解压缩。可以使用压缩工具(如 WinRAR、7-Zip 等)来解压缩。解压缩后,你将得到一个包含 CMake 3.24.3 源代码和相关文件的文件夹。 在解压缩后的文件夹中,你可以找到 CMake 的配置文件(CMakeLists.txt)和其他源代码文件。通过编辑配置文件,在其中指定你的项目的构建规则和依赖关系。 完成配置后,在终端或命令提示符中进入解压缩后的文件夹,并运行相应的命令来构建你的项目。具体的构建命令可以在项目的文档或配置文件中找到。 通过使用 CMake,你可以更加方便地管理和构建你的项目,提高开发效率。希望这些信息能帮助到你对 cmake-3.24.3.tar.gz 的理解。 ### 回答2: cmake-3.24.3.tar.gz是一个软件包文件,其中包含了CMake版本3.24.3的源代码。CMake是一个跨平台的开源构建工具,它能够自动生成用于各种不同编译环境的构建脚本。 这个软件包文件首先是一个tar压缩文件,它对多个文件进行了归档和打包。.tar是类似于zip的归档文件格式,它将一个或多个文件和目录打包到一个文件中,以便方便地传输或存储。.gz是一个gzip压缩格式,用于对.tar文件进行压缩。 要使用这个软件包,首先需要将其解压缩。可以使用以下命令在命令行中解压: tar -zxvf cmake-3.24.3.tar.gz 这个命令会解压缩文件并将其还原为原始的.tar文件。然后,可以进一步使用tar命令或其它解压缩工具解压缩.tar文件,以获取其中的源代码文件。 对于CMake的源代码,可以进一步编译和安装,以生成可执行文件,并将其添加到系统的可执行文件路径中。具体的编译和安装步骤可以在软件包中的README或官方文档中找到。 CMake的主要功能是简化跨平台软件项目的构建过程。它使用一种名为CMakeLists.txt的描述文件来定义项目的编译规则和依赖关系。通过编写这样的描述文件,可以做到在不同的操作系统和编译器上构建项目时具备一致的行为。 总之,cmake-3.24.3.tar.gz是一个包含CMake版本3.24.3源代码的软件包文件,通过解压缩和编译安装可以使用CMake工具来进行跨平台的软件项目构建。 ### 回答3: cmake-3.24.3.tar.gz 是一个软件包的压缩文件,其中的 ".tar.gz" 表示文件采用 tar 和 gzip 压缩技术进行打包。该文件名中的 "cmake-3.24.3" 是软件的名称和版本号。 CMake 是一个跨平台的开源构建工具,用于自动化管理项目的软件构建过程。它通过简单的配置文件来描述软件项目的构建过程,并生成适用于不同平台和编译器的构建脚本。CMake 支持 Windows、Linux、macOS 等多个操作系统,并可以配合各种主流编译器使用。 cmake-3.24.3.tar.gz 文件是 CMake 软件的压缩包,它包含了 CMake 3.24.3 版本的源代码和相关文件。用户可以通过解压缩该文件,获取 CMake 3.24.3 版本的源代码,然后根据需要进行编译和安装。 编译 CMake 的源代码需要一定的软件开发环境和编译器。具体的编译步骤可以在 CMake 官方网站(https://cmake.org)上找到。在编译完成后,可以将生成的可执行文件添加到系统的 PATH 环境变量中,从而可以在命令行或脚本中直接使用 "cmake" 命令。 使用 CMake 可以简化软件项目的构建过程,包括生成 Makefile、编译源代码、链接库文件等。通过配置 CMakeLists.txt 文件,可以指定编译选项、依赖库路径、输出目录等各种构建相关的参数。CMakeLists.txt 文件作为 CMake 的配置文件,在项目根目录下创建,并按照其语法规则编写。 总结来说,cmake-3.24.3.tar.gz 是 CMake 软件的源代码压缩包。通过使用 CMake,开发者可以更方便地管理和构建自己的软件项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值