You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Windows的Makefile中获取当前Shell目录?

在Windows下用mingw32-make获取Shell初始目录的问题

问题背景

我原本以为自己清楚Makefile里$(CURDIR)这类变量的区别,但实际发现我需要的是Shell启动时的初始目录,而非Make的工作目录。在Linux环境下,即使Makefile放在/root/dir1/dir2/dir3/Makefile.linux,执行make --directory指定路径后,$(PWD)能正确返回Shell的启动目录;但在Windows下用ezwinport或WinLibs的mingw32-make时,不管用$(PWD)、$(shell cd)还是$(shell echo %CD%),只要加了--directory参数,返回的都是Make切换后的工作目录,只有不指定该参数时才正确。

原因分析

这确实是Windows CMD的特性限制:

  • Linux下,Shell的PWD是环境变量,执行make --directory时,父Shell的PWD会被传递给Make进程,所以Makefile里引用$(PWD)(环境变量)能拿到初始目录;而$(CURDIR)是Make自身的工作目录。
  • Windows CMD里的%CD%不是环境变量,是Shell动态维护的临时变量。当mingw32-make用--directory切换目录后,再启动CMD执行shell命令时,CMD的%CD%会自动变成当前(Make切换后的)工作目录,没有办法直接获取到Shell最初的启动目录。

解决办法

1. 手动传递初始目录为环境变量

执行mingw32-make前,先把当前目录存到自定义环境变量里:

set ORIGINAL_PWD=%CD%
mingw32-make --directory=你的目标目录 -f Makefile.win

然后在Makefile里直接引用这个变量:

ORIG_DIR := $(ORIGINAL_PWD)
all:
    @echo 初始Shell目录:$(ORIG_DIR)
    @echo Make工作目录:$(CURDIR)

2. 改用PowerShell执行

如果用PowerShell,同样可以传递初始目录:

$env:ORIGINAL_PWD = $PWD.Path
mingw32-make --directory=你的目标目录 -f Makefile.win

Makefile里的引用方式和上面一致。

3. 避免使用--directory参数

如果允许调整调用方式,可以先保存初始目录,再切换到Make工作目录执行,最后切回去:

set ORIGINAL_PWD=%CD%
cd /d 你的目标目录
mingw32-make -f Makefile.win
cd /d %ORIGINAL_PWD%

这种方式不需要修改Makefile,但操作步骤更多。

总结

通过手动传递初始目录为自定义环境变量,就能在Windows下实现和Linux类似的效果,绕过CMD的%CD%变量限制。

内容的提问来源于stack exchange,提问作者DaveC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:53:11