2012-12-28 54 views
2

我剛剛遇到了與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

回答

0

我提交了一份bug報告托馬斯·納吉,他發現這是由於最近的一個補丁。恢復這個補丁解決了這個問題。見這2個問題的更多詳細信息: