2013-04-04 54 views
4

一種用於基於autotools的項目,我現在在我的Makefile.am以下行:如何有條件地定義AUTOMAKE_OPTIONS?

AUTOMAKE_OPTIONS = serial-tests 

我想使這個選項適用當且僅當我automake的版本是1.12或更高。原因是需要使用1.11和1.13 automake來支持串行測試線束。做這個的最好方式是什麼?


我已經嘗試過這樣的:

AM_VER = $(shell $(AUTOMAKE) --version | head -n1 | sed -e 's|[^0-9.]||g') 
AM_VER_MAJOR = $(shell echo $(AM_VER) | cut -d. -f1) 
AM_VER_MINOR = $(shell echo $(AM_VER) | cut -d. -f2) 
AM_VER_PATCH = $(shell echo $(AM_VER) | cut -d. -f3) 

$(info $(AM_VER_MAJOR) $(AM_VER_MINOR) $(AM_VER_PATCH)) 

supports_serial_tests_opt = $(shell if [ "$(AM_VER_MAJOR)" -gt 1 ] || { [ "$(AM_VER_MAJOR)" -eq 1 ] && [ "$(AM_VER_MINOR)" -ge 12 ]; }; then echo true; fi) 

$(info $(supports_serial_tests_opt)) 

$(if $(supports_serial_tests_opt), $(eval AUTOMAKE_OPTIONS=serial-opts)) 

$(info $(AUTOMAKE_OPTIONS)) 

,並沒有工作,因爲AUTOMAKE_OPTIONS需要在automake執行時間進行設置,功能條件語句在make時間執行。即使它有效,我也會發現它可笑地臃腫和臃腫;有沒有更好的辦法?我的直覺告訴我,我應該用我的configure.ac設置一個變量,那麼我就要乾脆讓擴大在Makefile.am,就像這樣:

AUTOMAKE_OPTIONS = $(SERIAL_TESTS) 

背後自動配置的理念是要檢查的功能 - 可我以某種方式跳過版本檢查,並檢查串行測試選項的可用性,並使用它,如果給出?

+4

這是沒有意義的做到這一點;只需要automake 1.13。唯一應該在你的項目中使用automake的人是維護者。 – 2013-04-04 20:22:36

+1

這是需要支持的(多個)維護者。 – Irfy 2013-04-04 20:25:06

+1

如果您的維護人員無法安裝並運行正確版本的automake,那麼您可能應該重新考慮該人員對該項目的立場! – 2013-04-04 20:27:55

回答

3

由於$(shell ...)僅由GNU Make解釋,Automake自己讀取Makefile.am並且對GNU Make的功能一無所知,因此您的嘗試不起作用。

而不是嘗試使用AUTOMAKE_OPTIONS變量,您應該嘗試使用AM_INIT_AUTOMAKE參數。因爲configure.ac總是使用M4讀取,所以可以在那裏使用shell擴展。此外,您在那裏設置的選項將適用於整個項目,不需要在每個Makefile.am中重複。

例如:

... 
AM_INIT_AUTOMAKE(m4_esyscmd([case `automake --version | head -n 1` in 
          *1.11*);; 
          *) echo serial-tests;; 
          esac])) 
... 

如果您需要調試腳本,使用autoconf -t AM_INIT_AUTOMAKE跟蹤正在傳遞到AM_INIT_AUTOMAKE的參數。

(這就是說,我有威廉的評論同意需要1.12似乎更好舉動給我。)

+0

我現在可以確認這不適用於1.12或1.13:無論測試設置如何(串行測試,並行測試之一),它們都執行默認的測試模式(分別爲串行測試和並行測試) )傳遞給'AM_INIT_AUTOMAKE'。但是,傳遞虛假字符串會導致automake錯誤。有任何想法嗎? – Irfy 2013-04-10 18:34:18

+0

你確定你沒有'Makefile'語句覆蓋'serial-tests'或'parallel-tests'設置嗎?automake測試套件包含確保'AM_INIT_AUTOMAKE([serial-tests])'工作的測試用例,所以如果您有反例,則應該提交一個錯誤。請參閱http://git.savannah.gnu.org/cgit/automake.git/tree/t/serial-tests.sh – adl 2013-04-11 15:14:03

+0

我在多個獨立項目的最頂級configure.ac中使用了上述代碼子項目,每個子項目都有自己的configure.ac。恐怕這不會傳播給他們。有沒有一種簡單的方法來解決這個問題,而不是把代碼放在每個configure.ac中? (或者編寫封裝shell代碼的m4腳本?) – Irfy 2013-04-11 23:15:06