mingw32-make + mklink ...只是相处不来?
mingw32-make + mklink... just not getting along?
不确定是否有其他人已经使它工作,但即使在我的 Makefile 中使用以下简单的行,我也遇到了无穷无尽的麻烦 运行 mingw32-make
:
mklink Mk Makefile
下面创建了 link,但是 mingw32-make
吐了并且此后抛出错误 255:
$(shell cmd /c 'mklink Mk Makefile')
其他都没有问题,我的makefile比较复杂。只有 mklink
正在这样做。 (显然 msys 在 ln
方面有自己的问题,所以沿着这条路走下去似乎毫无意义。)
以下对我有用,(在 Win7 Home Premium 上,在 VirtualBox 中),
提供 我以 shell 运行 管理员权限调用它:
$ cat makefile.tst
all:
cmd /c "mklink mk makefile.tst"
@echo "Success!"
$ make -f makefile.tst
cmd /c "mklink mk makefile.tst"
symbolic link created for mk <<===>> makefile.tst
Success!
$ rm mk
$ mingw32-make -f makefile.tst
cmd /c "mklink mk makefile.tst"
symbolic link created for mk <<===>> makefile.tst
Success!
My shell,在本例中是 MSYS sh.exe
,通过 msys.bat
从 cmd.exe
调用,UAC 升级为管理员权限。这样我就可以证明 mklink
命令在 MSYS 自己的 make.exe
和 mingw32-make.exe
中都有效; (当然,mingw32-make.exe
示例也可以直接从提升的 cmd.exe
shell 本身运行。
我怀疑在没有 cmd /c
序言的情况下直接在 makefile 中尝试使用 mklink
可能行不通,因为 mklink
是一个 cmd.exe
内置的,哪个 GNU make 可能不知道 运行 这种方式...它报告 CreateProcess
失败,因为当我尝试时找不到指定的文件。
您对 make 的 $(shell ...)
构造的使用将不起作用,因为这会导致 make 在错误的操作阶段调用命令...在解析 makefile 本身并构建其依赖关系图时,而不是作为调用包含规则时 运行 的命令,它现在将尝试从 $(shell ...)
命令执行 output 作为其自身的命令;这显然不是您想要的!
只是为了澄清关于 MSYS 自己的 ln
命令的立场:它 确实 可以预期地工作,在版本的限制内Windows 它最初是在其上实现的。特别是:
$ ln fileA fileB
在支持此类 link 的 NTFS 等文件系统上创建文件到文件 hard link,然后回退到在 FAT 等文件系统上创建 copy,而 FAT 则不会。还有:
$ ln dirA dirB
失败了,这是应该的;硬 linked 目录是灾难的根源,是不允许的(就像它们在 unix 平台上被禁止一样)。然而:
$ ln -s fileA refB
将不会创建符号link,(因为在开发MSYS时没有Windows版本支持它们,而且没有人向前推进实施该功能,因为它们已经可用……尽管,无论如何,它们的实施在 Vista 和 Win7 上似乎仍然不稳定);相反,如果可能,此命令回退到创建 hard link,否则创建文件副本。同样:
$ ln -s dirA refB
将不会创建符号目录link,在这种情况下,没有回退;它只是无条件地失败了! (可能有人认为目录 的深拷贝可能 是一个合适的回退操作,但它并没有这样实现;相反,提供了 lndir
命令,以促进这一点)。
不确定是否有其他人已经使它工作,但即使在我的 Makefile 中使用以下简单的行,我也遇到了无穷无尽的麻烦 运行 mingw32-make
:
mklink Mk Makefile
下面创建了 link,但是 mingw32-make
吐了并且此后抛出错误 255:
$(shell cmd /c 'mklink Mk Makefile')
其他都没有问题,我的makefile比较复杂。只有 mklink
正在这样做。 (显然 msys 在 ln
方面有自己的问题,所以沿着这条路走下去似乎毫无意义。)
以下对我有用,(在 Win7 Home Premium 上,在 VirtualBox 中), 提供 我以 shell 运行 管理员权限调用它:
$ cat makefile.tst
all:
cmd /c "mklink mk makefile.tst"
@echo "Success!"
$ make -f makefile.tst
cmd /c "mklink mk makefile.tst"
symbolic link created for mk <<===>> makefile.tst
Success!
$ rm mk
$ mingw32-make -f makefile.tst
cmd /c "mklink mk makefile.tst"
symbolic link created for mk <<===>> makefile.tst
Success!
My shell,在本例中是 MSYS sh.exe
,通过 msys.bat
从 cmd.exe
调用,UAC 升级为管理员权限。这样我就可以证明 mklink
命令在 MSYS 自己的 make.exe
和 mingw32-make.exe
中都有效; (当然,mingw32-make.exe
示例也可以直接从提升的 cmd.exe
shell 本身运行。
我怀疑在没有 cmd /c
序言的情况下直接在 makefile 中尝试使用 mklink
可能行不通,因为 mklink
是一个 cmd.exe
内置的,哪个 GNU make 可能不知道 运行 这种方式...它报告 CreateProcess
失败,因为当我尝试时找不到指定的文件。
您对 make 的 $(shell ...)
构造的使用将不起作用,因为这会导致 make 在错误的操作阶段调用命令...在解析 makefile 本身并构建其依赖关系图时,而不是作为调用包含规则时 运行 的命令,它现在将尝试从 $(shell ...)
命令执行 output 作为其自身的命令;这显然不是您想要的!
只是为了澄清关于 MSYS 自己的 ln
命令的立场:它 确实 可以预期地工作,在版本的限制内Windows 它最初是在其上实现的。特别是:
$ ln fileA fileB
在支持此类 link 的 NTFS 等文件系统上创建文件到文件 hard link,然后回退到在 FAT 等文件系统上创建 copy,而 FAT 则不会。还有:
$ ln dirA dirB
失败了,这是应该的;硬 linked 目录是灾难的根源,是不允许的(就像它们在 unix 平台上被禁止一样)。然而:
$ ln -s fileA refB
将不会创建符号link,(因为在开发MSYS时没有Windows版本支持它们,而且没有人向前推进实施该功能,因为它们已经可用……尽管,无论如何,它们的实施在 Vista 和 Win7 上似乎仍然不稳定);相反,如果可能,此命令回退到创建 hard link,否则创建文件副本。同样:
$ ln -s dirA refB
将不会创建符号目录link,在这种情况下,没有回退;它只是无条件地失败了! (可能有人认为目录 的深拷贝可能 是一个合适的回退操作,但它并没有这样实现;相反,提供了 lndir
命令,以促进这一点)。