2013-10-08 128 views
1

是否可以在makefile中檢查是否正在使用gmake而不是BSD make?測試gmake正在評估makefile

或者我堅持使用GNUmakefile的大錘方法,這看起來有點不雅,絕對不是用戶友好的?

@Amiramix在他對這個SO answer對同一問題的評論中簡潔地表達了我的保留意見。

編輯:如果使用BSD make來評估Makefile,那麼我希望它保釋和貶損,應該運行gmake來評估Makefile。

編輯2:我已經採取了從@devnull現在黯然刪除答案,併發揮它一點得到它:

MAKEVERSION=Not_GNU 

checkVariant: 
     @MAKEVERSION=`${MAKE} --version 2>/dev/null | head -1 | sed -e 's/^\(GNU\).*$/\1/'`; \ 
     if [ "${MAKEVERSION}" != "GNU" ]; then \ 
      echo "Not using gmake"; \ 
      exit 1; \ 
     fi 

但sed的抱怨,命令,工作正常在命令行中,出現亂碼。

當我有機會進一步發揮時,我會回來。

+0

你想讓BSD Make做什麼,如果它運行的是生成文件? – Beta

+0

乾杯@Beta我添加了一個編輯來解釋。 –

+0

@devnull你可以請你恢復你的答案,因爲我認爲我有一個編輯它,讓我更加接近 –

回答

1

您所遇到的問題是便攜式使結構非常貧血。你可以測試很多變量來看看你是否使用GNU make,但是像這樣的任何測試都必須使用shell來完成,這意味着在一個配方內部是可移植的。這意味着makefile中的所有目標都必須列出「測試GNU make」目標作爲先決條件,以確保首先完成測試。

更有問題的是,它意味着你不能使用各種各樣的GNU make構造,因爲它們在其他版本的make中會出現語法錯誤,早在make開始運行測試GNU make-ness的規則之前。

GNUmakefile技巧可以工作,但這並不令人愉快,我同意。另一個選擇是讓你的Makefile除了一個.DEFAULT目標,然後測試然後調用$(MAKE) -f realMakefile [email protected],並讓你的所有內容在realMakefile.DEFAULT由POSIX標準定義,但我不知道有多少其他make實際提供它。它仍然有點不愉快,因爲如果你運行make foo bar baz那麼遞歸make被調用3次。

或者,您可以在自述文件中記錄先決條件,並希望人們在它們的make的實現吐出語法錯誤時閱讀它。

+0

謝謝。我同意我們基本上仍然試圖用1970年代創建的一套基本構造來構建規則(當然有_some_擴展)。 –