2017-06-02 141 views
2

我有一個使用GNU Autotools的項目QPhiX。有一個非常相關的項目叫做QPhiX-Codegen,它是前者需要的。整體構建過程如下所示:運行配置時運行腳本

  1. 在QPhiX-Codegen中運行make。這將編譯代碼生成器並運行它。運行時,它會創建平坦的C++代碼。
  2. 運行一個Python腳本,該腳本使用模板引擎將該平面C++代碼封裝到完整的頭文件和源代碼文件中。這也會創建一個CMakeLists.txt,這樣生成的代碼就可以被編譯。
  3. 運行cmakemakecmake生成的Makefile將生成的代碼編譯成靜態庫libqphix_codegen.a

這三樣東西都包裝在Bash腳本中,用./generate-and-compile $isa $cxx $cxxflags調用。 ISA可以是AVX2,C++編譯器可以我mpiicpc

然後一個切換目錄QPhiX並繼續構建過程:

  • 運行./configure ... --enable-arch=ISA --with-codegen=path/to/codegen/directory CXX=$CXX CXXFLAGS=$CXXFLAGS創建Makefile。在該Makefile中,它將具有所需的編譯器標誌以包含生成的頭文件並鏈接到libqphix_codegen.a
  • 運行make./configure生成的Makefile
  • 該過程向用戶公開了比真正需要更多的步驟。此外,用戶必須將相同的ISA標誌(CXXCXXFLAGS)傳遞給兩個不同的腳本。然後,他們還必須將代碼生成器的路徑放入./configure

    我認爲在QPhiX項目中讓代碼生成器成爲git子模塊是最方便的。然後,./configure可以運行codegen/generate-and-compile腳本並將選項傳遞給它。

    我的問題是:我將如何在./configure中運行腳本?我只是把我想要的片段放入configure.ac?該文件看起來像一個shell腳本與一些宏,但我不知道這是否是正確的地方把它放在

    +0

    另請參閱Automake手冊中的[27.8 Per-Object Flags Emulation](https://www.gnu.org/software/automake/manual/html_node/Per_002dObject-Flags.html)。 – jww

    回答

    1

    該過程向用戶公開了比真正需要更多的步驟。另外,用戶必須將相同的ISA標誌,相同的CXX和相同的 CXXFLAGS傳遞給兩個不同的腳本。然後他們還必須將 路徑中的代碼生成器放入./configure

    這些都是有效的批評。解決這些問題的最快最簡單的方法可能是編寫一個小包裝腳本。但你問,

    我該如何運行./configure腳本?我只是 把我想要的片段放入configure.ac?該文件看起來像像一個殼 腳本與一些宏,但我不知道這是否是 正確的地方把它。

    configure.ac是用於m4宏處理器輸入端,在特殊的配置,並通過自動工具和可能的其他來源提供宏的庫繪圖。 Autoconf使用m4處理它以生成configure shell腳本。如果你想讓configure運行一個外部命令(例如另一個腳本),你必須直接在configure.ac(你確實可以這樣做)寫這個命令,或者使用一個宏來使命令成爲發射到輸出腳本中。沒有內置的通用宏。你必須小心謹慎,以避免或逃避m4將嘗試解釋的語法,但它可以完成。實際上,宏庫包含幾個擴展爲外部命令的宏的例子,例如運行編譯器的命令。

    在另一方面,configure通過收集資料,寫作和發動另一腳本,config.status工作。您可以選擇使configure發出您想要運行的命令config.status;你可以通過AC_CONFIG_FILES的第二個和/或第三個參數來做到這一點。

    第三方面,更新主項目的配置腳本以通過其他項目自動合併代碼生成,將兩個項目合併在一起。如果我打算這樣做,那麼我傾向於進行比您似乎提出的更深入的合併。配置應該僅限於準備合適的Makefiles。所有的代碼生成和構建都可以通過一個(可能是遞歸的)make運行來更好地處理。我認爲沒有任何理由認爲你的情況無法實現,但設置它需要更多的工作。

    +0

    看起來我更喜歡'make'中的子項目腳本。我如何將一個目標添加到主'Makefile'中,使得其他所有內容都依賴於該目標? –