我剛剛遇到了與WAF的苦難。我只使用MinGW-w64構建東西。但是,最近,我安裝了MSVC 2012,因爲有時需要構建各種小工具,這些工具在使用MinGW進行構建時會遇到一些問題。WAF:MinGW(GCC)和MSVC 2012之間的衝突
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。
NOTE: 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