如何在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
相关产品推荐
相关产品推荐

