将clang cl与NMake样式的Makefile一起使用无法回显

将clang cl与NMake样式的Makefile一起使用无法回显,makefile,clang,nmake,cl,Makefile,Clang,Nmake,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\>&

我有一个现有的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中的通配符宏)。但我得到了“访问被拒绝”的错误之前!上面的错误触发,命名的“头”文件在磁盘上不存在。事实上,随着代码的细微变化,我发现我也无法响应stdout。但是当我使用默认的CL时,它就可以工作了。那么为什么编译器重写会改变echo的功能呢


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

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

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

cl
在创建
中。make
生成:

DIR=\ ^M$
ENT=;^M$
DIR=\$
ENT=;$
(为了清晰起见,添加了
^M
$
)而
clang cl
去除每行末尾的空白并生成:

DIR=\ ^M$
ENT=;^M$
DIR=\$
ENT=;$
因此,使用
cl
$(DIR)
可以根据需要扩展为一个反斜杠
\
。但是在
clangcl
中,它扩展到
ENT=
,这会导致文件名
$(MAKHDR)
变为
obj ENT=;header.mak
而不是
obj\header.mak

Alse
$(HDRDIR)
变为
src ENT=,破坏了($(HDRDIR)*…
中%i的


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

DIR=\ //


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

回答得很好。谢谢。