从 Makefile 调用时,MSYS2 shell 上的 ar 会收到截断的路径?

Posted

技术标签:

【中文标题】从 Makefile 调用时,MSYS2 shell 上的 ar 会收到截断的路径?【英文标题】:ar on MSYS2 shell receives truncated paths when called from Makefile? 【发布时间】:2016-05-28 23:18:08 【问题描述】:

我正在使用来自 PortableGit 安装的 git-bash.exe,以及来自不同 MinGW 的环境变量。所以我有:

WORKGROUP+user@AD-X MINGW32 /z/user/Downloads
$ which ar
//WORKGROUP.EX.COM/Users/user/Downloads/mingw-w64/i686-4.9.3-posix-dwarf-rt_v4-rev1/mingw32/bin/ar

WORKGROUP+user@AD-X MINGW32 /z/user/Downloads
$ gcc --version | head -1
GNU ar (GNU Binutils) 2.25

现在我正在构建一个库,最后,链接步骤在调用 ar 命令时失败,如下所示:

ar -cr "Z:/user/Downloads/MyProjectNameABCDE/someLibraryABC/libs/someLibraryDEFGHI/lib/mingw/libsomeLibraryABCDebug.a" \
Z:/user/Downloads/MyProjectNameABCDE/someLibraryABC/libs/someLibraryDEFGHI/lib/mingw/obj/Debug/libs/someLibraryDEFGHI/test/someObject.o \
[...]

...其中列出了一堆对象 - 命令行长度为 10000 个字符,仍低于 PortableGit 的 MSYS2 shell (git-bash.exe) 中的 32000 个 getconf ARG_MAX。但是,我得到的失败是No such file or directory

\\WORKGROUP.EX.COM\Users\user\Downloads\mingw-w64\i686-4.9.3-posix-dwarf-rt_v4-rev1\mingw32\bin\ar.exe: Z:/user/Downloads/MyProjectNameABCDE/someLibraryABC/libs/someLibraryDEFGHI/lib/mingw/obj/Debug/libs/some: No such file or directory

... 给出的路径很明显是目标文件所在路径的截断版本。更奇怪的是,当我将make 进程打印的完整ar 命令行复制并粘贴回同一个终端时,它会正确完成吗?

有没有人知道为什么会发生这种情况,我可以做些什么来确保从 Makefile 调用 ar 时完成?

【问题讨论】:

【参考方案1】:

好的,首先我在运行 ar 命令的 Makefile 中找到了,我在其中添加了 -v 开关(所以,-crv)用于详细说明。

我可以发现大部分命令行都被读取,并添加了对象,直到它到达大约 8192 字节的命令行,之后它被截断,并且发生故障。这显然是一个已知问题:

How to avoid Max Command line size on Windows Solving the 8192 Character Command Line Limit on Windows | MCU on Eclipse

...虽然,我不太清楚为什么它应该出现在已经在git-bash.exe 中运行的make 进程中,即 MSYS2 shell 中?!

无论如何,我使用的解决方法/修复是使用file option of make,因为只需从 Makefile 执行“@echo $CMD > arscript.sh”将再次仅将 8kb 截断的命令行保存到文件中;所以代替原来的调用:

    @$(AR) $FLAGS_FOR_AR "$@" $(FILES_FOR_AR)

...我们将行保存到文件中,然后调用bash将其解释为脚本;那就是:

    $(file >arscript.sh,@$(AR) $FLAGS_FOR_AR "$@" $(FILES_FOR_AR))
    bash -x arscript.sh

...这终于对我有用了。

【讨论】:

以上是关于从 Makefile 调用时,MSYS2 shell 上的 ar 会收到截断的路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个 Makefile 调用 Makefile?

msys2+minGW方案编译ffmpeg的最佳实践

如何更改 MSYS2 上的 HOME 目录和启动目录?

如何卸载msys2?

如何在 msys python 中获取本机 Windows 路径?

MSYS2:如何禁用路径名到驱动器号的自动转换?