1. 程式人生 > 實用技巧 >LLVM程式分析日記之生成Makefile

LLVM程式分析日記之生成Makefile

1. Challenges

我們在編寫自己的LLVM Pass或分析工具時,常常涉及多個Pass或多個Class。將它們寫在同一個檔案中顯然不是明智之舉。因此,就涉及到多個.cc .h原始碼檔案的編譯問題。本文中我們介紹如何使用automake為自己的專案生成Makefile

2. Makefile.am 編寫

直接編寫Makefile比較複雜,因此我們編寫相對簡單的Makefile.am,然後使用工具自動化生成Makefile檔案。

Makefile.am是可以看作一種比Makefile檔案抽象程式更高的編譯規則檔案[1]。我們只需要指定想生成什麼目錄,它用什麼原始碼生成,編譯的時候依賴哪些庫,要安裝到什麼目錄等等,接下來的工作全部交給automake

autoconf等工具來自動生成configure檔案和Makefile檔案。

我們簡單介紹一些必要的語法格式。

  1. 首先,通過AM_CXXFLAGS = `llvm-config --cxxflags` -Wall來設定llvm的cxxflags。

  2. 其次,需要在Makefile.am中指定目標程式的程式名, 例如:

    bin_PROGRAMS = HelloWorld
    
    型別 語法格式
    可執行檔案 bin_PROGRAMS
    靜態庫 lib_LIBRARIES

    如果僅想進行編譯而不進行安裝,則用noinst_PROGRAMS代替bin_PROGRAMSnoinst_LIBRARIES

    代替lib_LIBRARIES

  3. 然後,我們需要指定LLVM相關的LDFLAGS, 方法與cxxflags類似,也是通過llvm-config來獲取,例如:

    HelloWorld_LDFLAGS = `llvm-config --ldflags` -lLLVM-`llvm-config --version`
    
  4. 最後,我們需要指明我們需要的原始碼檔案:

    HelloWorld_SOURCES = HelloWorld.h HelloWorld.cpp
    

3. 自動化生成configure檔案

常用的從原始碼編譯開源專案的流程是./configure; make。本文介紹的方法正是按照這個流程。

  1. 我們首先使用autoscan命令來根據目錄下的原始碼生成一個configure.ac的模板檔案。注意該模板檔案的原始名字是configure.scan,我們需要將其重新命名為configure.ac

  2. 編輯configure.ac檔案,填入我們專案的資訊。例如:

    AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
    AC_CONFIG_SRCDIR([HelloWorld.cc])
    AM_INIT_AUTOMAKE
    # Checks for programs.
    AC_PROG_CXX
    AC_PROG_CC
    
    # Checks for libraries.
    
    # Checks for header files.
    
    # Checks for typedefs, structures, and compiler characteristics.
    AC_CHECK_HEADER_STDBOOL
    AC_C_INLINE
    
    # Checks for library functions.
    
    AC_CONFIG_FILES([Makefile])
    AC_OUTPUT
    
  3. 依次執行如下命令來生成configure檔案:

    aclocal
    autoconf
    
  4. 最後,使用automake --add-missing來生成重要的Makefile.in檔案,然後就可以通過./configure; make來編譯我們的專案了

References

[1] https://blog.csdn.net/vevenlcf/article/details/48134313
[2] https://www.cnblogs.com/lidabo/p/7269004.html