我刚刚遇到了 WAF 的痛苦。我专门使用 MinGW-w64 来构建东西。但是,最近,我安装了 MSVC 2012,因为有时需要构建各种小型实用程序,这些实用程序在使用 MinGW 构建时会出现一些问题。
WAF 鼓励不要将编译器选择硬编码到wscript
. 中,而是从命令行中选择它,这听起来很合理,在这种情况下,我支持这种理念。所以wscript
应该看起来像这样(忘了boost
):
def options(ctx):
ctx.load(('compiler_cxx', 'boost'))
def configure(ctx):
ctx.load(('compiler_cxx', 'boost'))
ctx.check_boost()
然后只需在命令行中键入:
waf --boost-includes=D:/Applications/Boost/include --check-cxx-compiler=gxx configure build
强制 WAF首先--check-cxx-compiler=gxx
查找 MinGW,因为默认情况下,Windows WAF 首先首选 MSVC。
注意: MinGW-w64 在 中PATH
,MSVC 不在,但我猜由于注册表,WAF 仍然可以找到它。
所以,然后 WAF 在配置输出中给出这个(这意味着一切都很酷):
Checking for 'gxx' (c++ compiler) : D:\Applications\MinGW-w64\bin\g++.exe
然后它开始构建,我得到的是这个很长的垃圾邮件:
Build failed
Traceback (most recent call last):
File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\Task.py", line 123, in process
ret=self.run()
File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\Task.py", line 47, in run
return m1(self)
File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\Task.py", line 47, in run
return m1(self)
File "<string>", line 28, in f
File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\Tools\msvc.py", line 685, in exec_command_msvc
return self.exec_command_nomsvc(*k,**kw)
... (repeated thousands of times)
File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\Tools\msvc.py", line 685, in exec_command_msvc
return self.exec_command_nomsvc(*k,**kw)
File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\Tools\msvc.py", line 684, in exec_command_msvc
if self.env['CC_NAME']!='msvc':
File "D:\Applications\WAF\waf-1.7.8-77e2cdd38ea2930f982e3aabf335fdb7\waflib\ConfigSet.py", line 35, in __getitem__
self=self.parent
RuntimeError: maximum recursion depth exceeded
MSVC 应该如何参与这个构建过程?!- 我不知道。但无论如何,最有趣的部分来了。让我们打破建议和硬编码 GCC 成为我们在以下方面的选择wscript
:
def options(ctx):
ctx.load(('boost'))
def configure(ctx):
ctx.load(('gxx', 'boost'))
ctx.check_boost()
然后我们调用:
waf --boost-includes=D:/Applications/Boost/include configure build
并在配置输出中查看:
Checking for program g++,c++ : D:\Applications\MinGW-w64\bin\g++.exe
Checking for program ar : D:\Applications\MinGW-w64\bin\ar.exe
注意:注意到输出的变化了吗?这对我来说已经是一个谜,因为该cxx_compiler
工具(在前一个案例中使用)本身ctx.load('gxx')
在幕后调用。那么在这两种情况下,这两种输出有何不同呢?
然后 WAF 开始构建,然后就可以了:
'build' finished successfully (1.155s)
酷吧?:) 让我知道你们的想法,希望有人已经遇到过这个问题。
主演
WAF 1.7.8
MinGW-w64 (GCC 4.7.2)
MSVC 2012