我对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
该–check-cxx-compiler=gxx部队WAF寻找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