PWD ?= $(shell pwd)

在 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)
  • 设置默认路径
    • 允许用户通过命令行覆盖默认值:
      make PWD=/custom/path
  • 跨 Makefile 共享路径
    • 在多个子 Makefile 中复用 PWD 变量。

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 系统)。

6. 总结

  • PWD ?= $(shell pwd) 的作用是:安全地定义 PWD 变量,优先使用用户提供的值,否则自动获取当前目录
  • 典型用于需要灵活配置路径的构建系统中(如多模块项目、跨平台编译)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值