Contents

了解Makefile中的条件变量赋值

1. 概述

Make 是用于构建和运行软件项目的事实上的工具。在本文中,我们将通过一个简单的用例了解条件变量赋值运算符 ( ?= ) 。

2. 设置

让我们首先编写一个简单的Makefile并添加一个名为greet的目标:

greet:
	@echo "Hello! I'm make utility. I'll help you run this project."

现在,让我们使用make 命令来执行greet目标:

$ make greet
Hello! I'm make utility. I'll help you run this project.

我们应该注意,我们在目标定义之前使用了@前缀。这指示 Make 工具在显示输出并将输出限制为已执行命令的结果时抑制命令定义。

我们已经准备好基本设置。我们将在下一节中使用变量定义来扩展这个Makefile

3. Makefile中的变量

到目前为止,我们的Makefile向用户显示的问候语是静态文本,因此所有用户都会收到相同的问候语。为了使其动态化,让我们在消息中包含登录用户名,以便每个用户的问候语更加个性化。

让我们定义一个用户变量,并使用赋值 ( = ) 运算符使用whoami 命令的输出对其进行初始化:

user=$(shell whoami)

我们应该注意,我们遵循在变量名称中使用小写字母的标准命名约定,因为变量的范围仅限于Makefile

此外,现在让我们通过使用*$()运算符引用此变量,在greet*目标中使用此变量:

greet:
	@echo "Hello," $(user)"! I'm make utility. I'll help you run this project."

接下来,让我们通过再次执行greet目标来查看修改后的问候语:

$ make greet
Hello, tavasthi! I'm make utility. I'll help you run this project.

看来我们做对了!

4. 使用条件变量赋值运算符 ( ?= )

现在我们了解了在Makefile中使用变量的基础知识,我们将更容易理解*?=运算符,该运算符用于Makefile*中的条件变量赋值。

为此,让我们通过允许用户指定要在问候语中提及的用户名 而不是使用登录名来**扩展我们的Makefile 。**但是,我们希望保留此选项,因此如果用户未指定该值,我们仍会采用使用登录名的默认行为。

作为重构练习的一部分,我们需要使用*?=运算符代替=*运算符,这样如果变量已经包含一个值,我们就不会覆盖该值。其次,我们现在将在变量名中使用大写字母,因为我们通过让用户从外部定义它来扩展它的范围:

USER?=$(shell whoami)
greet:
	@echo "Hello," $(USER)"! I'm make utility. I'll help you run this project."

接下来,让我们看看这两种情况的实际应用:

$ make greet USER="Tapan Avasthi"
Hello, Tapan Avasthi! I'm make utility. I'll help you run this project.
$ make greet
Hello, tavasthi! I'm make utility. I'll help you run this project.

**在第一个场景中,我们必须注意我们将USER变量的值作为参数传递给make命令以获取自定义用户名。**另一方面,在第二种情况下,我们没有传递USER变量的值,所以我们得到了问候消息中的默认登录名。

相当简单,对吧?这就是我们使用条件运算符为我们的项目创建有效的Makefile所需要知道的全部内容。