使用 CMake 构建 LLVM
使用 CMake 構建 LLVM
- 1. 介紹
- 2. 快速開始
- 3. 基本的 CMake 用法
- 4. 選項和變量
- 4.1 經常使用的 CMake 變量
- 4.2 特定于LLVM的變量
- 5. CMake Caches
- 6. 執行測試
- 7. 交叉編譯
- 8. 在項目中嵌入 LLVM
- 8.1 從源代碼開發 LLVM passes
- 9. 特定于編譯器/平臺的話題
- 9.1 微軟Visual c++
本文為譯文,點擊 此處查看原文。
1. 介紹
CMake是一個跨平臺的構建生成器工具。CMake不構建項目,它生成用于構建 LLVM 的構建工具(GNU make、Visual Studio等)所需的文件。
如果您是一個新的貢獻者,請從開始使用LLVM系統頁面開始。這個頁面適合從遺留 configure/make 系統遷移過來的現有貢獻者。
如果您真的很想獲得一個功能性的LLVM構建,請轉到第2章 快速開始。如果您是 CMake 新手,可以從第3章 基本的 CMake 用法開始,然后在知道要做什么之后再回到第2章快速開始。第4章 選項和變量是自定義您的構建的參考。如果您已經有使用 CMake 的經驗,這是推薦的起點。
此頁面面向 LLVM CMake 構建的用戶。如果您正在尋找有關修改 LLVM CMake 構建系統的信息,您可能想要查看CMake 入門頁面。它對CMake語言有一個基本的概述。
2. 快速開始
我們在這里使用命令行,非交互式的CMake接口。
如果 CMake 無法檢測到您的工具集,或者它認為環境不夠健全,則此操作可能會失敗。在本例中,請確保您打算使用的工具集是唯一可以從 shell 訪問的工具集,并且 shell 本身是適合您的開發環境的工具集。例如,如果您有一個可以通過PATH環境變量訪問的 POSIX shell,CMake將拒絕構建 MinGW makefile。您可以強制 CMake 使用一個給定的構建工具;有關說明,請參見第3章 基本的 CMake 用法。
當然,底層構建工具可以直接調用,但是 --build 選項是可移植的。
可以通過調用生成在 build 目錄中的 cmake_install.cmake 腳本,以便在 install 時設置不同的 install 前綴:$ cmake -DCMAKE_INSTALL_PREFIX=/tmp/llvm -P cmake_install.cmake
3. 基本的 CMake 用法
本節解釋 CMake 的基本方面,您可能在日常使用中需要這些方面。
CMake 附帶了大量的文檔,以 html 文件的形式提供,并通過 cmake 可執行文件本身提供在線幫助。執行 cmake --help 以獲得更多的幫助選項。
CMake 允許您指定一個構建工具(例如,GNU make、Visual Studio 或 Xcode)。如果沒有在命令行中指定,CMake 將根據您的環境嘗試猜測要使用哪個構建工具。一旦確定了構建工具,CMake 就使用相應的 Generator 為構建工具創建文件(例如,Makefiles 或 Visual Studio 或 Xcode 項目文件)。您可以使用命令行選項 -G "Name of the generator" 顯式指定 generator。要查看系統上可用generators的列表,請執行:
$ cmake --help這將在幫助文本的末尾列出generators名稱。
Generators 的名稱區分大小寫,并且可能包含空格。出于這個原因,您應該按照 cmake --help 輸出中在引號中所列的,準確的輸入它們。例如,要為 Visual Studio 12 生成特定的項目文件,您可以執行:
$ cmake -G "Visual Studio 12" path/to/llvm/source/root對于給定的開發平臺,可能有多個足夠的生成器。如果您使用 Visual Studio,“NMake makefile”是一個您可以使用的生成器,它使用 NMake 進行構建。默認情況下,CMake 選擇您的開發環境支持的最特定的生成器。如果你想要一個替代的生成器,你必須使用 -G 選項告訴CMake。
4. 選項和變量
變量(Variable)可以自定義生成構建的方式。選項(Option)是布爾變量,可能的 value 是 ON/OFF。選項和變量在 CMake 命令行上定義如下:
$ cmake -DVARIABLE=value path/to/llvm/source您可以在初始 CMake 調用之后設置一個變量來更改它的值。你也可以取消定義一個變量:
$ cmake -UVARIABLE path/to/llvm/source變量存儲在 CMake 緩存中。這是一個名為 CMakeCache.txt 的文件,存儲在由cmake生成的build目錄的根目錄中。不建議您自己編輯它。
稍后在本文檔中列出 CMake 緩存中的變量,變量名和類型由冒號分隔。您還可以在 CMake 命令行上指定變量和類型:
$ cmake -DVARIABLE:TYPE=value path/to/llvm/source4.1 經常使用的 CMake 變量
下面是一些經常使用的 CMake 變量,以及簡單的解釋和特定于 LLVM 的注釋。要獲得完整的文檔,請參考 CMake 手冊,或者執行 cmake --help-variable VARIABLE_NAME。
- CMAKE_BUILD_TYPE:STRING
為基于 make 的生成器設置構建類型。可能的值是 Release、Debug、RelWithDebInfo 和 MinSizeRel。如果您正在使用諸如 Visual Studio 之類的 IDE,您應該使用 IDE setting 來設置構建類型。注意 Release 和 RelWithDebInfo 在大多數平臺上使用不同的優化級別。 - CMAKE_INSTALL_PREFIX:PATH
調用 “make install” 或構建 “install” 目標時,LLVM 將安裝到的路徑。 - LLVM_LIBDIR_SUFFIX:STRING
附加到要安裝庫的目錄的額外后綴。在64位體系結構上,可以使用 -DLLVM_LIBDIR_SUFFIX=64 將庫安裝到 /usr/lib64。 - CMAKE_C_FLAGS:STRING
當編譯 C 源文件時要使用的額外標志。 - CMAKE_CXX_FLAGS:STRING
當編譯 C++ 源文件時要使用的額外標志。
4.2 特定于LLVM的變量
- LLVM_TARGETS_TO_BUILD:STRING
以分號分隔的要構建的目標列表,或用于構建所有目標的all。大小寫敏感的。默認為全部。例如:-DLLVM_TARGETS_TO_BUILD = " X86; PowerPC”。 - LLVM_BUILD_TOOLS: BOOL
構建LLVM工具。默認為上。在任何情況下,都會生成構建每個工具的目標。您可以通過調用工具的目標來單獨構建工具。例如,您可以通過在構建目錄的根目錄下執行make llvm-as來使用基于makefile的系統構建llvm-as。 - LLVM_INCLUDE_TOOLS: BOOL
為LLVM工具生成生成目標。默認為上。您可以使用此選項來禁用為LLVM工具生成構建目標。 - LLVM_INSTALL_BINUTILS_SYMLINKS: BOOL
安裝從binutils工具名稱到相應LLVM工具的符號鏈接。例如,ar將符號鏈接到llvm-ar。 - LLVM_BUILD_EXAMPLES: BOOL
構建LLVM的例子。缺省值為OFF。在任何情況下都會生成構建每個示例的目標。有關更多細節,請參見上面的LLVM_BUILD_TOOLS文檔。 - LLVM_INCLUDE_EXAMPLES: BOOL
為LLVM示例生成構建目標。默認為上。您可以使用此選項來禁用生成LLVM示例的構建目標。 - LLVM_BUILD_TESTS: BOOL
構建LLVM單元測試。在任何情況下,都會生成構建每個單元測試的目標。您可以使用在單元測試下定義的目標來構建一個特定的單元測試,例如ADTTests、IRTests、SupportTests等等(在單元測試的子目錄中搜索add_llvm_unittest,以獲得完整的單元測試列表)。可以使用目標單元測試構建所有單元測試。 - LLVM_INCLUDE_TESTS: BOOL
為LLVM單元測試生成生成目標。默認為上。您可以使用此選項來禁用為LLVM單元測試生成構建目標。 - LLVM_BUILD_BENCHMARKS: BOOL
將基準添加到默認目標列表中。默認為關閉。 - LLVM_INCLUDE_BENCHMARKS: BOOL
為LLVM基準生成構建目標。默認為上。 - LLVM_APPEND_VC_REV: BOOL
嵌入版本控制修訂信息(svn修訂號或Git修訂id)。版本信息由llvm/include/llvm/Support/ vcsupdate .h中的LLVM_REVISION宏提供。不需要修訂信息的git開發人員可以禁用此選項,以避免在分支切換之后重新鏈接大多數二進制文件。默認為上。 - LLVM_ENABLE_THREADS: BOOL
如果可以的話,使用線程支持構建。默認為上。 - LLVM_ENABLE_UNWIND_TABLES: BOOL
啟用二進制文件中的展開表。禁用unwind表可以減小庫的大小。默認為上。 - LLVM_CXX_STD:字符串
使用指定的c++標準構建。默認為“c + + 11”。 - LLVM_ENABLE_ASSERTIONS: BOOL
使代碼的斷言。當且僅當CMAKE_BUILD_TYPE為Debug時,默認值為ON。 - LLVM_ENABLE_EH: BOOL
使用異常處理支持構建LLVM。如果希望鏈接到LLVM庫,并在自己的代碼中使用c++異常(需要通過LLVM代碼傳播),那么這是必要的。默認為關閉。 - LLVM_ENABLE_EXPENSIVE_CHECKS: BOOL
啟用額外的時間/內存昂貴的檢查。默認為關閉。 - LLVM_ENABLE_IDE: BOOL
告訴構建系統正在使用IDE。這反過來又禁止創建某些方便的構建系統目標,比如各種install-*和check-*目標,因為ide并不總是能很好地處理大量目標。這通常是自動檢測的,但是可以手動配置它來顯式地控制這些目標的生成。當使用Visual Studio 2017的CMake集成時,可能需要手動覆蓋,否則不會被檢測為IDE。 - LLVM_ENABLE_PIC: BOOL
如果編譯器支持此標志,則將-fPIC標志添加到編譯器命令行。有些系統,比如Windows,不需要這個標志。默認為上。 - LLVM_ENABLE_RTTI: BOOL
使用運行時類型信息構建LLVM。默認為關閉。 - LLVM_ENABLE_WARNINGS: BOOL
啟用所有編譯器警告。默認為上。 - LLVM_ENABLE_PEDANTIC: BOOL
啟用迂腐的模式。如果可能,這將禁用特定于編譯器的擴展。默認為上。 - LLVM_ENABLE_WERROR: BOOL
如果觸發編譯器警告,則停止并失敗構建。默認為關閉。 - LLVM_ABI_BREAKING_CHECKS:字符串
用于決定是否應該用ABI中斷檢查來構建LLVM。允許的值是with_assert(默認值)、FORCE_ON和FORCE_OFF。with_assert打開ABI,在啟用斷言的構建中中斷檢查。無論是否啟用了普通(基于ndebug)斷言,FORCE_ON (FORCE_OFF)都會打開(關閉)它們。使用ABI中斷檢查構建的LLVM版本與不使用ABI的版本不兼容。 - LLVM_BUILD_32_BITS: BOOL
在64位系統上構建32位可執行程序和庫。此選項僅在某些64位Unix系統上可用。默認為關閉。 - LLVM_TARGET_ARCH:字符串
用于本地代碼生成的LLVM目標。這是JIT生成所必需的。它默認為“host”,這意味著它將選擇正在構建LLVM的機器的架構。如果要交叉編譯,請將其設置為目標體系結構名稱。 - LLVM_TABLEGEN:字符串
本地TableGen可執行文件的完整路徑(通常稱為llvm-tblgen)。這是用于交叉編譯的:如果用戶設置了這個變量,則不會創建本機TableGen。 - LLVM_LIT_ARGS:字符串
參數給文學使檢查和使學生clang-test都受到影響。默認情況下,’-sv -no-progress-bar’在Visual c++和Xcode上,’-sv’在其他代碼上。 - LLVM_LIT_TOOLS_DIR:路徑
用于測試的GnuWin32工具的路徑。在Windows主機上有效。默認為空字符串,在這種情況下,lit將在%PATH%中查找測試所需的工具(例如grep、sort等)。如果GnuWin32不在您的%PATH%中,那么您可以將該變量設置為GnuWin32目錄,以便lit可以在該目錄中找到測試所需的工具。 - LLVM_ENABLE_FFI: BOOL
指示是否將LLVM解釋器鏈接到外部函數接口庫(libffi)以啟用調用外部函數。如果庫或庫頭安裝在自定義位置,還可以將變量FFI_INCLUDE_DIR和FFI_LIBRARY_DIR設置為ffi.h和libffi所在的目錄。所以可以分別找到。默認為關閉。 - LLVM_EXTERNAL_{CLANG,LLD,POLLY}_SOURCE_DIR:PATH
這些變量分別指定相對于頂級源目錄的外部LLVM項目Clang、lld和Polly的源目錄路徑。如果外部項目的in-tree子目錄存在(例如,llvm/tools/clang for clang),則不會使用相應的變量。如果外部項目的變量不指向有效路徑,則不會構建該項目。 - LLVM_ENABLE_PROJECTS:字符串
以分號分隔的要構建的項目列表,或用于構建所有(clang、libcxx、libcxxabi、lldb、compiler-rt、lld、polly)項目的all。這個標志假設項目是并排簽出的,而不是嵌套的,即clang需要與llvm并行,而不是嵌套在llvm/tools中。該特性允許僅為LLVM構建一個版本,并使用相同的源代碼檢出為clang+ LLVM構建另一個版本。 - LLVM_EXTERNAL_PROJECTS:字符串
要作為llvm的一部分構建的其他外部項目的分號分隔列表。對于每個項目LLVM_EXTERNAL_<name>_SOURCE_DIR必須用項目源代碼的路徑指定。>例如:-DLLVM_EXTERNAL_PROJECTS=“Foo;Bar” -DLLVM_EXTERNAL_FOO_SOURCE_DIR=/src/ Foo -DLLVM_EXTERNAL_BAR_SOURCE_DIR=/src/ Bar。 - LLVM_USE_OPROFILE: BOOL
啟用構建OProfile JIT支持。默認為關閉。 - LLVM_PROFDATA_FILE:路徑
要傳遞到clang的-fprofile-研習班-use標志的profdata文件的路徑。這只能在使用clang構建時指定。 - LLVM_USE_INTEL_JITEVENTS: BOOL
啟用對Intel JIT事件API的構建支持。默認為關閉。 - LLVM_ENABLE_LIBPFM: BOOL
啟用libpfm構建來支持LLVM工具中的硬件計數器測量。默認為上。
啟用對Perf (linux分析工具)JIT支持的構建支持。默認為關閉。
- LLVM_ENABLE_ZLIB: BOOL
啟用zlib構建以支持LLVM工具中的壓縮/解壓。默認為上。 - LLVM_ENABLE_DIA_SDK: BOOL
支持使用MSVC DIA SDK構建PDB調試支持。只能與MSVC。默認為上。 - LLVM_USE_SANITIZER:字符串
定義用于構建LLVM二進制文件和測試的殺毒軟件。可能的值是Address、Memory、memorywithorigin、Undefined、Thread和Address;Undefined。默認為空字符串。 - LLVM_ENABLE_LTO:字符串
在編譯和鏈接命令行中添加-flto或-flto=標志,啟用鏈接時間優化。可能的值是Off、On、Thin和Full。默認為關閉。 - LLVM_USE_LINKER:字符串
將-fuse-ld={name}添加到鏈接調用中。可能的值取決于編譯器,因為clang的值可以是自定義鏈接器的絕對路徑,否則clang將在名稱前面加上ld.并應用其通常的搜索。例如,要鏈接LLVM和Gold鏈接器,可以使用-DLLVM_USE_LINKER= Gold調用cmake。 - LLVM_ENABLE_LLD: BOOL
這個選項等價于-DLLVM_USE_LINKER=lld,除非在2階段構建期間,從第一階段添加依賴項到第二階段,以確保在第二階段開始之前構建lld。 - LLVM_PARALLEL_COMPILE_JOBS:字符串
定義并發編譯作業的最大數量。 - LLVM_PARALLEL_LINK_JOBS:字符串
定義并發鏈接作業的最大數量。 - LLVM_BUILD_DOCS: BOOL
將所有啟用的文檔目標(例如Doxgyen和Sphinx目標)添加為默認構建目標的依賴項。這導致所有(啟用的)文檔目標都是正常構建的一部分。如果運行了安裝目標,那么還可以安裝所有構建的文檔目標。要啟用特定的文檔目標,請參見LLVM_ENABLE_SPHINX和LLVM_ENABLE_DOXYGEN。 - LLVM_ENABLE_DOXYGEN: BOOL
支持使用doxygen生成可瀏覽的HTML文檔。默認為關閉。 - LLVM_ENABLE_DOXYGEN_QT_HELP: BOOL
支持生成Qt壓縮的幫助文件。默認為OFF。這將影響make目標doxygen-llvm。啟用后,除了doxygen生成的正常HTML輸出之外,還將生成一個名為org.llvm.qch的QCH文件。然后可以將該文件加載到Qt Creator中。此選項僅與-DLLVM_ENABLE_DOXYGEN=ON組合使用;否則就沒有效果。 - LLVM_DOXYGEN_QCH_FILENAME:字符串
給出-DLLVM_ENABLE_DOXYGEN=ON和-DLLVM_ENABLE_DOXYGEN_QT_HELP=ON時生成的Qt壓縮幫助文件的文件名。默認為org.llvm.qch。此選項僅與-DLLVM_ENABLE_DOXYGEN_QT_HELP=ON組合使用;否則就沒有效果。 - LLVM_DOXYGEN_QHP_NAMESPACE:字符串
中間Qt幫助項目文件所在的名稱空間。有關更多信息,請參見Qt幫助項目。默認為“org.llvm”。此選項僅與-DLLVM_ENABLE_DOXYGEN_QT_HELP=ON組合使用;否則就沒有效果。 - LLVM_DOXYGEN_QHP_CUST_FILTER_NAME:字符串
有關更多信息,請參見Qt幫助項目。默認為CMake變量${PACKAGE_STRING},它是包名稱和版本字符串的組合。然后,Qt Creator中可以使用這個過濾器,在瀏覽可能已加載的所有幫助文件時,只從LLVM中選擇文檔。此選項僅與-DLLVM_ENABLE_DOXYGEN_QT_HELP=ON組合使用;否則就沒有效果。 - LLVM_DOXYGEN_QHELPGENERATOR_PATH:字符串
qhelpgenerator可執行文件的路徑。默認為CMake的find_program()可以找到的任何內容。此選項僅與-DLLVM_ENABLE_DOXYGEN_QT_HELP=ON組合使用;否則就沒有效果。 - LLVM_DOXYGEN_SVG: BOOL
對Doxygen輸出中的圖形使用.svg文件而不是.png文件。默認為關閉。 - LLVM_INSTALL_DOXYGEN_HTML_DIR:字符串
安裝doxygen生成的HTML文檔的路徑。這個路徑可以是絕對的,也可以是相對于CMAKE_INSTALL_PREFIX的。默認為/ doc / llvm / doxygen-html分享。 - LLVM_ENABLE_SPHINX: BOOL
如果指定,CMake將搜索sphinx-build可執行文件,并使SPHINX_OUTPUT_HTML和SPHINX_OUTPUT_MAN CMake選項可用。默認為關閉。 - SPHINX_EXECUTABLE:字符串
CMake檢測到的sphinx-build可執行文件的路徑。有關安裝說明,請參見http://www.sphinx-doc.org/en/latest/install.html - SPHINX_OUTPUT_HTML: BOOL
如果啟用了(啟用了LLVM_ENABLE_SPHINX),則添加將文檔構建為html的目標(但默認情況下不會構建,除非啟用了LLVM_BUILD_DOCS)。源樹中每個使用sphinx的項目都有一個目標(例如,docs-llvm-html、docs-clang-html和docs-lld-html)。默認為上。 - SPHINX_OUTPUT_MAN: BOOL
如果啟用了(啟用了LLVM_ENABLE_SPHINX),則添加構建手冊頁的目標(但默認情況下不會構建,除非啟用了LLVM_BUILD_DOCS)。目前唯一添加的目標是doc -llvm-man。默認為上。 - SPHINX_WARNINGS_AS_ERRORS: BOOL
如果啟用,那么sphinx文檔警告將被視為錯誤。默認為上。 - LLVM_INSTALL_SPHINX_HTML_DIR:字符串
安裝sphinx生成的HTML文檔的路徑。這個路徑可以是絕對的,也可以是相對于CMAKE_INSTALL_PREFIX的。默認共享/ doc / llvm / html。 - LLVM_INSTALL_OCAMLDOC_HTML_DIR:字符串
安裝ocamldoc生成的HTML文檔到的路徑。這個路徑可以是絕對的,也可以是相對于CMAKE_INSTALL_PREFIX的。默認為/ doc / llvm / ocaml-html分享。 - LLVM_CREATE_XCODE_TOOLCHAIN: BOOL
macOS Only:如果啟用CMake,將生成一個名為“install-xcode-toolchain”的目標。這個目標將在$CMAKE_INSTALL_PREFIX/Toolchains上創建一個目錄,其中包含一個xctoolchain目錄,可用來覆蓋默認的系統工具。 - LLVM_BUILD_LLVM_DYLIB: BOOL
如果啟用,則添加構建libLLVM共享庫的目標。這個庫包含一個共享庫中的所有LLVM組件。默認值為OFF。這不能與BUILD_SHARED_LIBS一起使用。只有當LLVM_LINK_LLVM_DYLIB也打開時,工具才會鏈接到libLLVM共享庫。通過將LLVM_DYLIB_COMPONENTS設置為所需組件列表,可以定制庫中的組件。 - LLVM_LINK_LLVM_DYLIB: BOOL
如果啟用,工具將與libLLVM共享庫鏈接。將LLVM_LINK_LLVM_DYLIB設置為ON也將LLVM_BUILD_LLVM_DYLIB設置為ON。 - BUILD_SHARED_LIBS: BOOL
標志,指示是否將每個LLVM組件(例如Support)構建為共享庫(ON)或靜態庫(OFF)。它的默認值是關閉的。在Windows上,當使用MinGW(包括MinGW -w64)構建時可以使用共享庫,但當使用Microsoft工具鏈構建時則不能。
請注意
BUILD_SHARED_LIBS只建議LLVM開發人員使用。如果希望將LLVM構建為共享庫,應該使用LLVM_BUILD_LLVM_DYLIB選項。
- LLVM_OPTIMIZED_TABLEGEN: BOOL
如果啟用并構建調試或斷言構建,CMake構建系統將生成一個發布構建樹,以構建一個完全優化的tablegen,以便在構建期間使用。啟用此選項可以顯著加快構建時間,特別是在調試配置中構建LLVM時。 - LLVM_REVERSE_ITERATION: BOOL
如果啟用,所有受支持的無序llvm容器將按相反的順序迭代。這對于揭示無序容器迭代所導致的非決定論非常有用。 - LLVM_BUILD_INSTRUMENTED_COVERAGE: BOOL
如果啟用,則在構建llvm時啟用基于源代碼的代碼覆蓋插裝。 - LLVM_CCACHE_BUILD: BOOL
如果啟用了ccache程序,并且ccache程序可用,那么將使用ccache構建LLVM,以加速LLVM及其組件的重構。默認值為OFF。ccache維護的緩存的大小和位置可以通過分別傳遞給CCACHE_MAXSIZE和CCACHE_DIR環境變量的LLVM_CCACHE_MAXSIZE和LLVM_CCACHE_DIR選項進行調整。 - LLVM_FORCE_USE_OLD_TOOLCHAIN: BOOL
如果啟用,編譯器和標準庫版本將不會被選中。LLVM可能根本無法編譯,或者在運行時由于這些工具鏈中的已知錯誤而失敗。 - LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN: BOOL
如果啟用,編譯器版本檢查只會在使用要廢棄的工具鏈時發出警告,而不是發出錯誤。 - LLVM_USE_NEWPM: BOOL
如果啟用,請使用實驗性的new pass管理器。
5. CMake Caches
最近,LLVM 和 Clang 添加了一些更復雜的構建系統特性。利用這些新特性通常需要在命令行上傳遞一系列復雜的 CMake 變量。Clang 提供了一組 CMake cache 腳本,使這些特性更易于訪問。
使用 CMake 的 -C 標志來處理 CMake cache 文件:
CMake cache 腳本是在一個獨立的范圍內處理的,只有緩存的變量在主配置運行時保持設置。CMake緩存變量不會重置已設置的變量,除非指定了 FORCE 選項。
關于 CMake Caches 的幾點注意事項:
- 命令行參數的順序很重要
- -C 之前指定的 -D 參數將在處理緩存前設置,并可以在緩存文件中讀取
- -C 之后指定的 -D 參數將在處理緩存后設置,并在緩存文件中取消設置
- 所有的 -D 參數將覆蓋緩存文件設置
- CMAKE_TOOLCHAIN_FILE 在緩存文件和命令行參數之后計算
- 建議在 -C 之前指定所有 -D 選項
有關通過緩存文件支持的一些高級構建配置的更多信息,請參見高級構建配置。
6. 執行測試
在構建 check-all 目標時執行測試。例如,如果您正在使用 Makefiles,請在 build 目錄下執行以下命令:
$ make check-all在 Visual Studio 上,您可以通過構建項目 “check-all” 來運行測試。有關測試的更多信息,請參閱 LLVM 測試基礎設施指南。
7. 交叉編譯
有關如何使用 CMake 進行交叉編譯的通用說明,請參閱此 wiki 頁面。它進行了詳細的解釋,可能看起來令人生畏,但事實并非如此。在這個 wiki 頁面上有幾個例子,包括工具鏈文件。請直接到本節中獲取一個快速解決方案。
還請參閱第4.2節 特定于LLVM的變量,了解交叉編譯時使用的變量。
8. 在項目中嵌入 LLVM
從 LLVM 3.5 開始,CMake 和 autoconf/Makefile 構建系統都將 LLVM 庫導出為可導入的 CMake targets。這意味著 LLVM 的客戶端現在可以可靠地使用 CMake 針對已安裝的 LLVM 版本開發自己的基于 LLVM 的項目,而不管它是如何構建的。
下面是一個 CMakeLists.txt 文件的簡單示例,該文件導入 LLVM 庫并使用它們構建一個簡單的應用程序simple-tool。
cmake_minimum_required(VERSION 3.4.3) project(SimpleProject)find_package(LLVM REQUIRED CONFIG)message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")# Set your project compile flags. # E.g. if using the C++ header files # you will need to enable C++11 support for your compiler.include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS})# Now build our tools add_executable(simple-tool tool.cpp)# 找到與我們希望使用的LLVM組件相對應的庫 llvm_map_components_to_libnames(llvm_libs support core irreader)# Link against LLVM libraries target_link_libraries(simple-tool ${llvm_libs})當在 CONFIG模式下使用 find_package(…) 指令時(如上例所示),它將查找位于不同位置的 LLVMConfig.cmake 文件(詳細信息請參閱 cmake 手冊)。它創建一個 LLVM_DIR 緩存條目來保存 LLVMConfig.cmake 被找到的目錄或允許用戶指定目錄(例如,通過將 -DLLVM_DIR=/usr/lib/cmake/llvm 傳遞給 cmake 命令,或者直接在 ccmake 或 cmake-gui 中設置)。
該文件在兩個不同的位置可用。
- <INSTALL_PREFIX>/lib/cmake/llvm/LLVMConfig.cmake,其中<INSTALL_PREFIX>是 LLVM 已安裝版本的 install 前綴。在 Linux 上,通常是 /usr/lib/cmake/llvm/LLVMConfig.cmake。
- <LLVM_BUILD_ROOT>/lib/cmake/llvm/LLVMConfig.cmake,其中 <LLVM_BUILD_ROOT> 是 LLVM 構建樹的根。注意:這只在使用 CMake 構建 LLVM 時可用。
如果 LLVM 安裝在操作系統的正常安裝前綴中(例如,在 Linux 上通常是 /usr/), find_package(LLVM …) 將自動找到 LLVM(如果安裝正確)。如果沒有安裝 LLVM,或者希望直接針對 LLVM 構建樹構建,可以使用前面提到的 LLVM_DIR。
LLVMConfig.cmake 文件設置各種有用的變量。顯著的變量包括
- LLVM_CMAKE_DIR
到 LLVM CMake 目錄(即包含 LLVMConfig.cmake 的目錄)的路徑。 - LLVM_DEFINITIONS
在針對 LLVM 構建時應該使用的預處理器定義(preprocessor defines)列表。 - LLVM_ENABLE_ASSERTIONS
如果 LLVM 構建時使用了斷言,則將其設置為ON,否則設置為OFF。 - LLVM_ENABLE_EH
如果 LLVM 構建時啟用了異常處理(exception handling,EH),則設置為ON,否則設置為OFF。 - LLVM_ENABLE_RTTI
如果 LLVM 構建時使用了運行時類型信息(run time type information,RTTI),則設置為ON,否則設置為OFF。 - LLVM_INCLUDE_DIRS
包含指向包含 LLVM 頭文件的目錄的路徑列表。 - LLVM_PACKAGE_VERSION
LLVM 的版本。這個字符串可以與 CMake 條件一起使用,例如,if (${LLVM_PACKAGE_VERSION} VERSION_LESS "3.5")。 - LLVM_TOOLS_BINARY_DIR
指向包含 LLVM 工具(例如 llvm-as)的目錄的路徑。
注意,在上面的示例中,我們將 simple-tool 鏈接到幾個 LLVM 庫。庫的列表是通過使用 llvm_map_components_to_libnames() CMake 函數確定的。要查看可用組件列表,請查看運行 llvm-config --components 的輸出。
注意,對于 LLVM < 3.5,使用的是 llvm_map_components_to_libraries(),而不是 llvm_map_components_to_libnames()。現在不贊成這樣做,并將在 LLVM 的未來版本中刪除。
8.1 從源代碼開發 LLVM passes
可以從LLVM的源代碼樹(即針對已安裝或已構建的 LLVM)開發 LLVM passes。下面提供了一個項目布局的示例。
<project dir>/|CMakeLists.txt<pass name>/|CMakeLists.txtPass.cpp...<project dir>/CMakeLists.txt 的內容:
find_package(LLVM REQUIRED CONFIG)add_definitions(${LLVM_DEFINITIONS}) include_directories(${LLVM_INCLUDE_DIRS})add_subdirectory(<pass name>)<project dir>/<pass name>/CMakeLists.txt 的內容:
add_library(LLVMPassname MODULE Pass.cpp)注意,如果您打算在將來的某個時候將此 Pass 合并到 LLVM 源代碼樹中,那么使用 LLVM 的內部 add_llvm_library 函數并使用MODULE參數來代替…
將以下內容添加到 <project dir>/CMakeLists.txt(在find_package(LLVM ...)之后):
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") include(AddLLVM)然后將<project dir>/<pass name>/CMakeLists.txt修改為:
add_llvm_library(LLVMPassname MODULEPass.cpp)當您完成了對 Pass 的開發之后,您可能希望將它集成到 LLVM 源代碼樹中。你可以通過兩個簡單的步驟來實現:
9. 特定于編譯器/平臺的話題
特定編譯器和平臺的說明。
9.1 微軟Visual c++
- LLVM_COMPILER_JOBS:STRING
指定使用 msbuild 或 Visual Studio 構建每個項目時要使用的并行編譯器作業的最大數量。只支持 Visual Studio 2010 CMake 生成器。0表示使用所有處理器。默認值為0。
總結
以上是生活随笔為你收集整理的使用 CMake 构建 LLVM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SCI论文发表流程详解
- 下一篇: 基于STM32G031的失真度测试仪(C