2011-03-15 56 views
1

我有一個例子集合,我想確保它們編譯失敗。使用* GNU Makefile的最佳方法是什麼?Gnu Makefile,編譯應該失敗

test_nocompile: $(NOCOMPILE_CPP) 
    for cpp in $(NOCOMPILE_CPP) ; do \ 
     echo === $$cpp === ; \ 
     if $(CXX) $(CXXFLAGS) -c -o fail.o $$cpp ; then echo ok ; else exit 1; fi ; \ 
    done 

正如你所看到的,我有幾個困難,在這裏:

  • 訪問殼變量cpp$cpp\$cpp$$cpp都不起作用。
  • 即使使用我的if,在第一次g ++編譯失敗後make也會停止。但那正是我想要的。我不想g ++ - 編譯被認爲是正確的行爲。
  • Makefiles中的Shell for for循環不是最好的主意。有沒有更好的辦法?我想不出來,因爲我預計編譯失敗,我沒有一個正確的目標,對吧?

高級可選:

  • 如果我能管理有故障檢查以上的工作,我可以嘗試編譯第二遍,這一次額外的-DEXCLUDE_FAIL,其取出我的例子中的違規行,然後代碼應該編譯。任何想法?
  • 或者應該爲此寫一個Python腳本...? ;-)

編輯:

我想我的「高級可選」給了我一個非常好的主意,現在。我可以再次使用依賴檢查。這裏只是一個粗略的草圖:

NOCOMPILE_CPP := $(wildcard nocompile/ *.cpp) 
NOCOMPILE_XFAILS := $(addsuffix .xfail,$(basename $(NOCOMPILE_CPP))) 

%.xfail: %.cpp 
    if $(CXX) $(CXXFLAGS) -o [email protected] $< ; then exit 1 ; else echo OK ; fi 
    $(CXX) $(CXXFLAGS) -DEXCLUDE_FAILCODE -o [email protected] $< 

test_nocompile: $(NOCOMPILE_XFAILS) 

這是優雅嗎?那麼我只需要研究-DEXCLUDE_FAILCODE如何使失敗的測試工作....非平凡,但可行。我認爲這可以做到,對吧?

回答

1
  1. 適合我。你在echo中得到什麼?
  2. 然後您需要否定if中的條件。現在,當文件不能編譯時它會退出,而AFAIU則需要相反的結果。
  3. 爲什麼這不是一個好主意?但是你可以編寫一個腳本,調用$(CXX)並返回一個合適的錯誤代碼(如果它沒有編譯,則返回0)。然後你可以用這個腳本有正常的目標。我對GNU make的細節不太瞭解,可能是內建的東西。

高級&可選:
1.讓我們先來使事情工作:)
2.我個人不使用Python,因此不認爲有必要在這裏=:P

+0

唉唉!是的,我之前糾錯過。當然它的if。 Prrrrr ... *我認爲用「高級選項」我可以有再次工作的目標檢查* ...等等,我將編輯問題... – towi

+0

@towi:但至於'-DEXCLUDE_FAIL '這很容易在劇本中完成。首先檢查它是否不編譯,如果是的話退出。然後用define檢查編譯。腳本的返回碼應該是這個命令的返回碼,這就是你需要的。 – 2011-03-15 08:56:42

+1

@towi:爲什麼不是'$(NOCOMPILE_CPP:.cpp = .xfail)'?你也可以考慮'! $(CXX)',它將否定結果並在需要時自動退出→不需要if。 – 2011-03-15 09:07:00