将clang cl与NMake样式的Makefile一起使用无法回显
我有一个现有的Makefile(用于NMake而不是GNU),它可以与默认的CL编译器配合使用。我打算用Clang cl兼容性程序来试验Clang。但是我似乎在Makefile中得到了与编译器无关的错误。例如,我在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\>&
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=\ //
与
(我也试过使用^\
,但那是一场灾难。)回答得很好。谢谢。