微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用带有 NMake 风格 Makefile 的 clang-cl 无法回显

如何解决使用带有 NMake 风格 Makefile 的 clang-cl 无法回显

我有一个现有的 Makefile(适用于 NMake 而不是 GNU),它适用于认的 CL 编译器。我打算使用 clang-cl 兼容程序来试验 Clang。但是我似乎在 Makefile 中遇到了与编译器无关的错误。比如我在Makefile中有一段代码

MAKHDR=$(MAKDIR)header.$(MAKEXT)
!if ![(echo HDR=\>$(MAKHDR)) && for %i in ($(HDRDIR)*.$(HDREXT)) do @echo %i\>>$(MAKHDR)]
!include $(MAKHDR)
!else
!error Cannot locate header files
!endif

从命令行

set CXX=clang-cl
nmake

这段代码应该定位所有的头文件并将它们放在一个变量中(有点像 GNU Make 中的通配符宏)。但是在上面的错误触发之前我收到了“访问被拒绝”错误,之后磁盘上不存在命名的“头”文件。事实上,通过对代码的细微更改,我发现我也无法回显到标准输出。但是当我使用认 CL 时它可以工作。那么为什么编译器重写会改变回显的能力呢?

如果您有兴趣,可以在我的 GitHub 上找到完整的 Makefile,但请注意它是非常规的。

解决方法

问题在于 .make.cc 文件中的以下两行:

DIR=\ //
ENT=;

第二行看起来很奇怪,但它是正确的:它用于指定 Windows 列表分隔符 ; 而不是 Unix :。第一行的目标是将 $(DIR) 设置为单个反斜杠 \

cl 在创建 .make 时生成:

DIR=\ ^M$
ENT=;^M$

(为了清楚起见添加了 ^M$)而 clang-cl 去除了每行末尾的空白并生成:

DIR=\$
ENT=;$

因此对于 cl$(DIR) 根据需要扩展为单个反斜杠 \。但是在 clang-cl 中它扩展为 ENT=;,这导致文件名 $(MAKHDR) 变为 obj ENT=;header.mak 而不是 obj\header.mak

Alse $(HDRDIR) 变成 src ENT=;,破坏了 for %i in ($(HDRDIR)*...


一种解决方案是在 .make.cc 中替换:

DIR=\ //

DIR=\ #

(我也尝试过使用 ^\,但那是一场灾难。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。