在 Makefile 中,PWD ?= $(shell pwd)
是一个常见的变量定义语句,其作用如下:
1. 语法解析
PWD
:变量名(通常表示 "Present Working Directory",即当前工作目录)。?=
:条件赋值操作符(Conditional Assignment)。- 仅当变量
PWD
未被定义时,才执行右侧的赋值操作。 - 如果
PWD
已定义,则保留原有值。
- 仅当变量
$(shell pwd)
:执行 Shell 命令pwd
(打印当前工作目录),并将其输出作为值赋给PWD
。
2. 等价逻辑
ifndef PWD
PWD = $(shell pwd)
endif
- 如果
PWD
未定义,则通过pwd
命令获取当前目录路径。 - 如果
PWD
已定义(例如在命令行或上级 Makefile 中),则保留原有值。
3. 典型用途
- 获取 Makefile 所在目录:
- 在 Makefile 中,
$(shell pwd)
返回的是 执行make
命令时的当前工作目录(可能与 Makefile 文件所在目录不同)。 - 如果需要获取 Makefile 文件自身的路径,应使用
$(CURDIR)
(Makefile 内置变量):PWD ?= $(CURDIR)
- 在 Makefile 中,
- 设置默认路径:
- 允许用户通过命令行覆盖默认值:
make PWD=/custom/path
- 允许用户通过命令行覆盖默认值:
- 跨 Makefile 共享路径:
- 在多个子 Makefile 中复用
PWD
变量。
- 在多个子 Makefile 中复用
4. 示例场景
Makefile 内容:
PWD ?= $(shell pwd)
OUTPUT_DIR = $(PWD)/build
all:
@echo "Building in $(OUTPUT_DIR)"
mkdir -p $(OUTPUT_DIR)
# 编译操作...
- 直接运行
make
:PWD
设置为当前终端路径(如/home/user/project
)。- 输出目录为
/home/user/project/build
。
- 运行
make PWD=/tmp
:PWD
被覆盖为/tmp
。- 输出目录为
/tmp/build
。
5. 注意事项
$(shell pwd)
vs$(CURDIR)
:$(shell pwd)
:返回执行make
命令时的当前目录(可能受cd
命令影响)。$(CURDIR)
:Makefile 内置变量,始终表示 Makefile 文件所在目录。
- 路径分隔符:
- 在 Makefile 中建议使用
/
而非\
(即使是在 Windows 系统)。
- 在 Makefile 中建议使用
6. 总结
PWD ?= $(shell pwd)
的作用是:安全地定义PWD
变量,优先使用用户提供的值,否则自动获取当前目录。- 典型用于需要灵活配置路径的构建系统中(如多模块项目、跨平台编译)。