如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
- LLVM系列(2)- LLVM的源码编译
- 前言
- 1. 前置准备
- 1.1 硬件
- 1.2 软件
- 2. 下载源码
- 3. 编译
- 3. 结果
环境:
系统: windows 10 64位 编译器:Visual Studio 2022 cmake【必须】: 3.22.5 (2022-06-02) python【必须】: 3.6.8
系统: Ubuntu 20.04 编译器:gcc/g++ 9.3.0 cmake【必须】: 3.16.4 python【必须】: 3.8.5 ninja: 1.10.2
创建时间:2022-06-19
更新时间:2022-06-22
LLVM 项目是模块化和可重用的编译器和工具链技术的集合。
LLVM 最初是伊利诺伊大学的一个研究项目,目标是提供一种现代的、基于 SSA 的编译策略,能够支持任意编程语言的静态和动态编译。
1. 前置准备 1.1 硬件硬盘:建议使用SSD硬盘。仅编译LLVM需要1-3GB; LLVM和Clang完全编译需要15-20GB。 内存:建议16GB以上1.2 软件
编译器:windows(vs2017及以上) linux(gcc 7.1.0及以上) cmake: 3.13.4及以上(vs2022需要3.21及以上) python: 3.6及以上2. 下载源码
wget https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-12.0.1.tar.gz3. 编译
- windows
build_vs2022.bat
mkdir bin_vs2022 cd bin_vs2022 cmake ../llvm -G "Visual Studio 17 2022" -Thost=x64 ^ -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=install ^ -DLLVM_ENABLE_LLD=ON -DLLVM_TARGETS_TO_BUILD=host -DBUILD_SHARED_LIBS=OFF ^ -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_EH=ON ^ -DLLVM_ENABLE_DUMP=ON -DLLVM_ENABLE_CRASH_DUMPS=ON -DLLVM_ENABLE_PDB=ON ^ -DLLVM_BUILD_TOOLS=OFF -DLLVM_BUILD_UTILS=OFF ^ -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_DOCS=OFF echo cmake --build . --target INSTALL -j --config Debug pause
- linux
build_gcc.sh
mkdir bin_linux cd bin_linux cmake -B ~/build ../llvm -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=install -DLLVM_ENABLE_LLD=OFF -DLLVM_TARGETS_TO_BUILD=host -DBUILD_SHARED_LIBS=ON -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_EH=ON -DLLVM_ENABLE_DUMP=ON -DLLVM_ENABLE_CRASH_DUMPS=ON -DLLVM_ENABLE_PDB=ON -DLLVM_BUILD_TOOLS=OFF -DLLVM_BUILD_UTILS=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_DOCS=OFF echo cmake --build . -j --config Debug echo ninja
- 命令说明
-DCMAKE_BUILD_TYPE=Debug # 构建模式 -DCMAKE_INSTALL_PREFIX=install # 安装目录 -DLLVM_ENABLE_LLD=ON # 启动LLVM的链接器LLD,替代系统链接器,运行速度更快 -DLLVM_TARGETS_TO_BUILD=host # host表示当前处理器架构。all表示构建所有目标 -DBUILD_SHARED_LIBS=OFF # 生成动态库还是静态库。windows msvc无效 -DLLVM_ENABLE_ASSERTIONS=ON # 启用断言检查,Debug模式默认开启 -DLLVM_ENABLE_RTTI=ON # 启用运行时类型信息,可能与其他库有不兼容问题 -DLLVM_ENABLE_EH=ON # 启用C++异常处理,可能与其他库有不兼容问题 -DLLVM_ENABLE_DUMP=ON # Enable dump functions even when assertions are disabled -DLLVM_ENABLE_CRASH_DUMPS=ON # Trun on memory dumps on crashes. Currently only implemented on Windows -DLLVM_ENABLE_PDB=ON # release模式也生成pdb -DLLVM_BUILD_TOOLS=OFF # 禁止构建LLVM工具(如llvm-as) -DLLVM_BUILD_UTILS=OFF # 禁止构建llvm utils(如FileCheck) -DLLVM_INCLUDE_BENCHMARKS=OFF # 禁止构建LLVM基准测试 -DLLVM_INCLUDE_TESTS=OFF # 禁止LLVM单元测试添加到构建列表,此选项会连带禁用clang、lldb等单元测试 -DLLVM_INCLUDE_DOCS=OFF # 禁止LLVM文档添加到构建列表,此选项会连带禁用clang等文档
LLVM CMake选项的完整列表:
https://releases.llvm.org/12.0.1/docs/CMake.html#llvm-specific-variables
- windows
install $ tree . +--- bin | +--- LLVM-C.dll | +--- LTO.dll | +--- Remarks.dll +--- include | +--- llvm | +--- llvm-c +--- lib | +--- cmake | | +--- llvm | +--- LLVM-C.lib | +--- LLVMAggressiveInstCombine.lib | +--- LLVMAnalysis.lib | +--- LLVMAsmParser.lib | +--- LLVMAsmPrinter.lib | +--- LLVMBinaryFormat.lib | +--- LLVMBitReader.lib | +--- LLVMBitstreamReader.lib | +--- LLVMBitWriter.lib | +--- LLVMCFGuard.lib | +--- LLVMCodeGen.lib | +--- LLVMCore.lib | +--- LLVMCoroutines.lib | +--- LLVMCoverage.lib | +--- LLVMDebugInfoCodeView.lib | +--- LLVMDebugInfoDWARF.lib | +--- LLVMDebugInfoGSYM.lib | +--- LLVMDebugInfoMSF.lib | +--- LLVMDebugInfoPDB.lib | +--- LLVMDemangle.lib | +--- LLVMDlltoolDriver.lib | +--- LLVMDWARFLinker.lib | +--- LLVMExecutionEngine.lib | +--- LLVMExtensions.lib | +--- LLVMFileCheck.lib | +--- LLVMFrontendOpenACC.lib | +--- LLVMFrontendOpenMP.lib | +--- LLVMFuzzMutate.lib | +--- LLVMGlobalISel.lib | +--- LLVMHelloNew.lib | +--- LLVMInstCombine.lib | +--- LLVMInstrumentation.lib | +--- LLVMInterfaceStub.lib | +--- LLVMInterpreter.lib | +--- LLVMipo.lib | +--- LLVMIRReader.lib | +--- LLVMJITLink.lib | +--- LLVMLibDriver.lib | +--- LLVMLineEditor.lib | +--- LLVMLinker.lib | +--- LLVMLTO.lib | +--- LLVMMC.lib | +--- LLVMMCA.lib | +--- LLVMMCDisassembler.lib | +--- LLVMMCJIT.lib | +--- LLVMMCParser.lib | +--- LLVMMIRParser.lib | +--- LLVMObjCARCOpts.lib | +--- LLVMObject.lib | +--- LLVMObjectYAML.lib | +--- LLVMOption.lib | +--- LLVMOrcJIT.lib | +--- LLVMOrcShared.lib | +--- LLVMOrcTargetProcess.lib | +--- LLVMPasses.lib | +--- LLVMProfileData.lib | +--- LLVMRemarks.lib | +--- LLVMRuntimeDyld.lib | +--- LLVMScalarOpts.lib | +--- LLVMSelectionDAG.lib | +--- LLVMSupport.lib | +--- LLVMSymbolize.lib | +--- LLVMTableGen.lib | +--- LLVMTarget.lib | +--- LLVMTextAPI.lib | +--- LLVMTransformUtils.lib | +--- LLVMVectorize.lib | +--- LLVMWindowsManifest.lib | +--- LLVMX86AsmParser.lib | +--- LLVMX86CodeGen.lib | +--- LLVMX86Desc.lib | +--- LLVMX86Disassembler.lib | +--- LLVMX86Info.lib | +--- LLVMXRay.lib | +--- LTO.lib | +--- Remarks.lib +--- share | +--- opt-viewer | | +--- opt-diff.py | | +--- opt-stats.py | | +--- opt-viewer.py | | +--- optpmap.py | | +--- optrecord.py | | +--- style.css
- linux
install $ tree . ├── include │ ├── llvm │ └── llvm-c ├── lib │ ├── cmake │ │ └── llvm │ ├── libLLVMAggressiveInstCombine.so -> libLLVMAggressiveInstCombine.so.12 │ ├── libLLVMAggressiveInstCombine.so.12 │ ├── libLLVMAnalysis.so -> libLLVMAnalysis.so.12 │ ├── libLLVMAnalysis.so.12 │ ├── libLLVMAsmParser.so -> libLLVMAsmParser.so.12 │ ├── libLLVMAsmParser.so.12 │ ├── libLLVMAsmPrinter.so -> libLLVMAsmPrinter.so.12 │ ├── libLLVMAsmPrinter.so.12 │ ├── libLLVMBinaryFormat.so -> libLLVMBinaryFormat.so.12 │ ├── libLLVMBinaryFormat.so.12 │ ├── libLLVMBitReader.so -> libLLVMBitReader.so.12 │ ├── libLLVMBitReader.so.12 │ ├── libLLVMBitstreamReader.so -> libLLVMBitstreamReader.so.12 │ ├── libLLVMBitstreamReader.so.12 │ ├── libLLVMBitWriter.so -> libLLVMBitWriter.so.12 │ ├── libLLVMBitWriter.so.12 │ ├── libLLVMCFGuard.so -> libLLVMCFGuard.so.12 │ ├── libLLVMCFGuard.so.12 │ ├── libLLVMCodeGen.so -> libLLVMCodeGen.so.12 │ ├── libLLVMCodeGen.so.12 │ ├── libLLVMCore.so -> libLLVMCore.so.12 │ ├── libLLVMCore.so.12 │ ├── libLLVMCoroutines.so -> libLLVMCoroutines.so.12 │ ├── libLLVMCoroutines.so.12 │ ├── libLLVMCoverage.so -> libLLVMCoverage.so.12 │ ├── libLLVMCoverage.so.12 │ ├── libLLVMDebugInfoCodeView.so -> libLLVMDebugInfoCodeView.so.12 │ ├── libLLVMDebugInfoCodeView.so.12 │ ├── libLLVMDebugInfoDWARF.so -> libLLVMDebugInfoDWARF.so.12 │ ├── libLLVMDebugInfoDWARF.so.12 │ ├── libLLVMDebugInfoGSYM.so -> libLLVMDebugInfoGSYM.so.12 │ ├── libLLVMDebugInfoGSYM.so.12 │ ├── libLLVMDebugInfoMSF.so -> libLLVMDebugInfoMSF.so.12 │ ├── libLLVMDebugInfoMSF.so.12 │ ├── libLLVMDebugInfoPDB.so -> libLLVMDebugInfoPDB.so.12 │ ├── libLLVMDebugInfoPDB.so.12 │ ├── libLLVMDemangle.so -> libLLVMDemangle.so.12 │ ├── libLLVMDemangle.so.12 │ ├── libLLVMDlltoolDriver.so -> libLLVMDlltoolDriver.so.12 │ ├── libLLVMDlltoolDriver.so.12 │ ├── libLLVMDWARFLinker.so -> libLLVMDWARFLinker.so.12 │ ├── libLLVMDWARFLinker.so.12 │ ├── libLLVMExecutionEngine.so -> libLLVMExecutionEngine.so.12 │ ├── libLLVMExecutionEngine.so.12 │ ├── libLLVMExtensions.so -> libLLVMExtensions.so.12 │ ├── libLLVMExtensions.so.12 │ ├── libLLVMFileCheck.so -> libLLVMFileCheck.so.12 │ ├── libLLVMFileCheck.so.12 │ ├── libLLVMFrontendOpenACC.so -> libLLVMFrontendOpenACC.so.12 │ ├── libLLVMFrontendOpenACC.so.12 │ ├── libLLVMFrontendOpenMP.so -> libLLVMFrontendOpenMP.so.12 │ ├── libLLVMFrontendOpenMP.so.12 │ ├── libLLVMFuzzMutate.so -> libLLVMFuzzMutate.so.12 │ ├── libLLVMFuzzMutate.so.12 │ ├── libLLVMGlobalISel.so -> libLLVMGlobalISel.so.12 │ ├── libLLVMGlobalISel.so.12 │ ├── libLLVMHelloNew.so -> libLLVMHelloNew.so.12 │ ├── libLLVMHelloNew.so.12 │ ├── libLLVMInstCombine.so -> libLLVMInstCombine.so.12 │ ├── libLLVMInstCombine.so.12 │ ├── libLLVMInstrumentation.so -> libLLVMInstrumentation.so.12 │ ├── libLLVMInstrumentation.so.12 │ ├── libLLVMInterfaceStub.so -> libLLVMInterfaceStub.so.12 │ ├── libLLVMInterfaceStub.so.12 │ ├── libLLVMInterpreter.so -> libLLVMInterpreter.so.12 │ ├── libLLVMInterpreter.so.12 │ ├── libLLVMipo.so -> libLLVMipo.so.12 │ ├── libLLVMipo.so.12 │ ├── libLLVMIRReader.so -> libLLVMIRReader.so.12 │ ├── libLLVMIRReader.so.12 │ ├── libLLVMJITLink.so -> libLLVMJITLink.so.12 │ ├── libLLVMJITLink.so.12 │ ├── libLLVMLibDriver.so -> libLLVMLibDriver.so.12 │ ├── libLLVMLibDriver.so.12 │ ├── libLLVMLineEditor.so -> libLLVMLineEditor.so.12 │ ├── libLLVMLineEditor.so.12 │ ├── libLLVMLinker.so -> libLLVMLinker.so.12 │ ├── libLLVMLinker.so.12 │ ├── libLLVMLTO.so -> libLLVMLTO.so.12 │ ├── libLLVMLTO.so.12 │ ├── libLLVMMCA.so -> libLLVMMCA.so.12 │ ├── libLLVMMCA.so.12 │ ├── libLLVMMCDisassembler.so -> libLLVMMCDisassembler.so.12 │ ├── libLLVMMCDisassembler.so.12 │ ├── libLLVMMCJIT.so -> libLLVMMCJIT.so.12 │ ├── libLLVMMCJIT.so.12 │ ├── libLLVMMCParser.so -> libLLVMMCParser.so.12 │ ├── libLLVMMCParser.so.12 │ ├── libLLVMMC.so -> libLLVMMC.so.12 │ ├── libLLVMMC.so.12 │ ├── libLLVMMIRParser.so -> libLLVMMIRParser.so.12 │ ├── libLLVMMIRParser.so.12 │ ├── libLLVMObjCARCOpts.so -> libLLVMObjCARCOpts.so.12 │ ├── libLLVMObjCARCOpts.so.12 │ ├── libLLVMObject.so -> libLLVMObject.so.12 │ ├── libLLVMObject.so.12 │ ├── libLLVMObjectYAML.so -> libLLVMObjectYAML.so.12 │ ├── libLLVMObjectYAML.so.12 │ ├── libLLVMOption.so -> libLLVMOption.so.12 │ ├── libLLVMOption.so.12 │ ├── libLLVMOrcJIT.so -> libLLVMOrcJIT.so.12 │ ├── libLLVMOrcJIT.so.12 │ ├── libLLVMOrcShared.so -> libLLVMOrcShared.so.12 │ ├── libLLVMOrcShared.so.12 │ ├── libLLVMOrcTargetProcess.so -> libLLVMOrcTargetProcess.so.12 │ ├── libLLVMOrcTargetProcess.so.12 │ ├── libLLVMPasses.so -> libLLVMPasses.so.12 │ ├── libLLVMPasses.so.12 │ ├── libLLVMProfileData.so -> libLLVMProfileData.so.12 │ ├── libLLVMProfileData.so.12 │ ├── libLLVMRemarks.so -> libLLVMRemarks.so.12 │ ├── libLLVMRemarks.so.12 │ ├── libLLVMRuntimeDyld.so -> libLLVMRuntimeDyld.so.12 │ ├── libLLVMRuntimeDyld.so.12 │ ├── libLLVMScalarOpts.so -> libLLVMScalarOpts.so.12 │ ├── libLLVMScalarOpts.so.12 │ ├── libLLVMSelectionDAG.so -> libLLVMSelectionDAG.so.12 │ ├── libLLVMSelectionDAG.so.12 │ ├── libLLVMSupport.so -> libLLVMSupport.so.12 │ ├── libLLVMSupport.so.12 │ ├── libLLVMSymbolize.so -> libLLVMSymbolize.so.12 │ ├── libLLVMSymbolize.so.12 │ ├── libLLVMTableGen.so -> libLLVMTableGen.so.12 │ ├── libLLVMTableGen.so.12 │ ├── libLLVMTarget.so -> libLLVMTarget.so.12 │ ├── libLLVMTarget.so.12 │ ├── libLLVMTextAPI.so -> libLLVMTextAPI.so.12 │ ├── libLLVMTextAPI.so.12 │ ├── libLLVMTransformUtils.so -> libLLVMTransformUtils.so.12 │ ├── libLLVMTransformUtils.so.12 │ ├── libLLVMVectorize.so -> libLLVMVectorize.so.12 │ ├── libLLVMVectorize.so.12 │ ├── libLLVMWindowsManifest.so -> libLLVMWindowsManifest.so.12 │ ├── libLLVMWindowsManifest.so.12 │ ├── libLLVMX86AsmParser.so -> libLLVMX86AsmParser.so.12 │ ├── libLLVMX86AsmParser.so.12 │ ├── libLLVMX86CodeGen.so -> libLLVMX86CodeGen.so.12 │ ├── libLLVMX86CodeGen.so.12 │ ├── libLLVMX86Desc.so -> libLLVMX86Desc.so.12 │ ├── libLLVMX86Desc.so.12 │ ├── libLLVMX86Disassembler.so -> libLLVMX86Disassembler.so.12 │ ├── libLLVMX86Disassembler.so.12 │ ├── libLLVMX86Info.so -> libLLVMX86Info.so.12 │ ├── libLLVMX86Info.so.12 │ ├── libLLVMXRay.so -> libLLVMXRay.so.12 │ ├── libLLVMXRay.so.12 │ ├── libLTO.so -> libLTO.so.12 │ ├── libLTO.so.12 │ ├── libRemarks.so -> libRemarks.so.12 │ └── libRemarks.so.12 └── share └── opt-viewer ├── opt-diff.py ├── optpmap.py ├── optrecord.py ├── opt-stats.py ├── opt-viewer.py └── style.css
License
License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
Reference:
- https://llvm.org/docs/GettingStarted.html
- http://www.aosabook.org/en/llvm.html