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
檔案。
我們簡單介紹一些必要的語法格式。
-
首先,通過
AM_CXXFLAGS = `llvm-config --cxxflags` -Wall
來設定llvm的cxxflags。 -
其次,需要在Makefile.am中指定目標程式的程式名, 例如:
bin_PROGRAMS = HelloWorld
型別 語法格式 可執行檔案 bin_PROGRAMS 靜態庫 lib_LIBRARIES 如果僅想進行編譯而不進行安裝,則用
noinst_PROGRAMS
代替bin_PROGRAMS
,noinst_LIBRARIES
lib_LIBRARIES
。 -
然後,我們需要指定LLVM相關的
LDFLAGS
, 方法與cxxflags
類似,也是通過llvm-config
來獲取,例如:HelloWorld_LDFLAGS = `llvm-config --ldflags` -lLLVM-`llvm-config --version`
-
最後,我們需要指明我們需要的原始碼檔案:
HelloWorld_SOURCES = HelloWorld.h HelloWorld.cpp
3. 自動化生成configure檔案
常用的從原始碼編譯開源專案的流程是./configure; make
。本文介紹的方法正是按照這個流程。
-
我們首先使用
autoscan
命令來根據目錄下的原始碼生成一個configure.ac
的模板檔案。注意該模板檔案的原始名字是configure.scan
,我們需要將其重新命名為configure.ac
。 -
編輯
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
-
依次執行如下命令來生成
configure
檔案:aclocal autoconf
-
最後,使用
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