Windows下VS进行llvm 17.0.0源码编译

Windows下编译LLVM 17.0.0

编译环境:

Python 3.9.13
Visual Stdio 17 2022
GnuWin32 【bison (GNU Bison) 2.4.1】
cmake 3.26.4

1. 下载LLVM源代码

https://github.com/llvm/llvm-project

2. 解压文件后,在文件目录下打开cmd,运行如下指令

注意Visual Stdio版本如果不是2022,直接使用Visual Studio,程序会打印出VS所有版本应该填写内容,改成对应内容运行

-DCMAKE_INSTALL_PREFIX指定install路径,按需求修改

Release

cmake -S llvm -B build ^
-G "Visual Studio 17 2022" ^
-DLLVM_ENABLE_PROJECTS="clang;lld" ^
-DCMAKE_BUILD_TYPE="Release" ^
-DCMAKE_INSTALL_PREFIX="D:\LLVM\Release" 

Debug

cmake -S llvm -B build ^
-G "Visual Studio 17 2022" ^
-DLLVM_ENABLE_PROJECTS="clang;lld" ^
-DCMAKE_BUILD_TYPE="Debug" ^
-DCMAKE_INSTALL_PREFIX="D:\LLVM\Debug" 

3. 执行完成后,用VS打开生成的build下的LLVM.sln

4. 选择Release或Debug

5. 解决方案->CMakePredefinedTargets->ALL_BUILD->右键【生成】

如果运行失败,问题关键在于C4819问题,因此将出现C4819的文件编码改成UTF-8 with BOM,(本人使用Notepad++修改的)

注意:不需要将所有文件都改,只需要改关键的几个文件。生成时间较长,约1-2小时

clang\lib\Lex\UnicodeCharSets.h
clang\include\clang\Tooling\Syntax\Nodes.h
等等,主要是报错多次的文件

6. 重新运行ALL_BUILD生成

7. 运行成功后,INTALL右键生成

会将结果生成到DCMAKE_INSTALL_PREFIX指定的目录

我想要最后生成的结果:忽略掉bin等目录
LLVM
|-Release
|	|-include
|	`-lib
`-Debug
	|-include
	`-lib

VS项目配置LLVM的lib和include

使用项目手动设置 ,下次设置可以使用Python代码修改项目配置文件中的标签来快捷设置,使可以使用#include "llvm/ADT/APFloat.h"等库

手动设置

1.设置

  1. 将LLVM(只需要其下面的include和lib文件夹)复制到项目文件夹下(.sln文件所在目录,当然也可以不这么做
  2. 设置项目为ReleaseDebug
  3. 【项目->属性->C/C++->语言->C++语言标准】设置为C++17
  4. 【项目->属性->C/C++->常规->SDL检查】设置为

2.项目->属性->C/C++->常规->附加包含目录

$(SolutionDir)LLVM\Release or Debug\include

3.项目->属性->链接器->常规->附加库目录

$(SolutionDir)LLVM\Release or Debug\lib

4.项目->属性->链接器->输入->附加依赖项

这些lib

clangAnalysis.lib
clangAnalysisFlowSensitive.lib
clangAnalysisFlowSensitiveModels.lib
clangAPINotes.lib
clangARCMigrate.lib
clangAST.lib
clangASTMatchers.lib
clangBasic.lib
clangCodeGen.lib
clangCrossTU.lib
clangDependencyScanning.lib
clangDirectoryWatcher.lib
clangDriver.lib
clangDynamicASTMatchers.lib
clangEdit.lib
clangExtractAPI.lib
clangFormat.lib
clangFrontend.lib
clangFrontendTool.lib
clangHandleCXX.lib
clangHandleLLVM.lib
clangIndex.lib
clangIndexSerialization.lib
clangInterpreter.lib
clangLex.lib
clangParse.lib
clangRewrite.lib
clangRewriteFrontend.lib
clangSema.lib
clangSerialization.lib
clangStaticAnalyzerCheckers.lib
clangStaticAnalyzerCore.lib
clangStaticAnalyzerFrontend.lib
clangSupport.lib
clangTooling.lib
clangToolingASTDiff.lib
clangToolingCore.lib
clangToolingInclusions.lib
clangToolingInclusionsStdlib.lib
clangToolingRefactoring.lib
clangToolingSyntax.lib
clangTransformer.lib
libclang.lib
lldCOFF.lib
lldCommon.lib
lldELF.lib
lldMachO.lib
lldMinGW.lib
lldWasm.lib
LLVM-C.lib
LLVMAArch64AsmParser.lib
LLVMAArch64CodeGen.lib
LLVMAArch64Desc.lib
LLVMAArch64Disassembler.lib
LLVMAArch64Info.lib
LLVMAArch64Utils.lib
LLVMAggressiveInstCombine.lib
LLVMAMDGPUAsmParser.lib
LLVMAMDGPUCodeGen.lib
LLVMAMDGPUDesc.lib
LLVMAMDGPUDisassembler.lib
LLVMAMDGPUInfo.lib
LLVMAMDGPUTargetMCA.lib
LLVMAMDGPUUtils.lib
LLVMAnalysis.lib
LLVMARMAsmParser.lib
LLVMARMCodeGen.lib
LLVMARMDesc.lib
LLVMARMDisassembler.lib
LLVMARMInfo.lib
LLVMARMUtils.lib
LLVMAsmParser.lib
LLVMAsmPrinter.lib
LLVMAVRAsmParser.lib
LLVMAVRCodeGen.lib
LLVMAVRDesc.lib
LLVMAVRDisassembler.lib
LLVMAVRInfo.lib
LLVMBinaryFormat.lib
LLVMBitReader.lib
LLVMBitstreamReader.lib
LLVMBitWriter.lib
LLVMBPFAsmParser.lib
LLVMBPFCodeGen.lib
LLVMBPFDesc.lib
LLVMBPFDisassembler.lib
LLVMBPFInfo.lib
LLVMCFGuard.lib
LLVMCFIVerify.lib
LLVMCodeGen.lib
LLVMCodeGenTypes.lib
LLVMCore.lib
LLVMCoroutines.lib
LLVMCoverage.lib
LLVMDebugInfoCodeView.lib
LLVMDebuginfod.lib
LLVMDebugInfoDWARF.lib
LLVMDebugInfoGSYM.lib
LLVMDebugInfoLogicalView.lib
LLVMDebugInfoMSF.lib
LLVMDebugInfoPDB.lib
LLVMDemangle.lib
LLVMDiff.lib
LLVMDlltoolDriver.lib
LLVMDWARFLinker.lib
LLVMDWARFLinkerParallel.lib
LLVMDWP.lib
LLVMExecutionEngine.lib
LLVMExegesis.lib
LLVMExegesisAArch64.lib
LLVMExegesisMips.lib
LLVMExegesisPowerPC.lib
LLVMExegesisX86.lib
LLVMExtensions.lib
LLVMFileCheck.lib
LLVMFrontendHLSL.lib
LLVMFrontendOpenACC.lib
LLVMFrontendOpenMP.lib
LLVMFuzzerCLI.lib
LLVMFuzzMutate.lib
LLVMGlobalISel.lib
LLVMHexagonAsmParser.lib
LLVMHexagonCodeGen.lib
LLVMHexagonDesc.lib
LLVMHexagonDisassembler.lib
LLVMHexagonInfo.lib
LLVMInstCombine.lib
LLVMInstrumentation.lib
LLVMInterfaceStub.lib
LLVMInterpreter.lib
LLVMipo.lib
LLVMIRPrinter.lib
LLVMIRReader.lib
LLVMJITLink.lib
LLVMLanaiAsmParser.lib
LLVMLanaiCodeGen.lib
LLVMLanaiDesc.lib
LLVMLanaiDisassembler.lib
LLVMLanaiInfo.lib
LLVMLibDriver.lib
LLVMLineEditor.lib
LLVMLinker.lib
LLVMLoongArchAsmParser.lib
LLVMLoongArchCodeGen.lib
LLVMLoongArchDesc.lib
LLVMLoongArchDisassembler.lib
LLVMLoongArchInfo.lib
LLVMLTO.lib
LLVMMC.lib
LLVMMCA.lib
LLVMMCDisassembler.lib
LLVMMCJIT.lib
LLVMMCParser.lib
LLVMMipsAsmParser.lib
LLVMMipsCodeGen.lib
LLVMMipsDesc.lib
LLVMMipsDisassembler.lib
LLVMMipsInfo.lib
LLVMMIRParser.lib
LLVMMSP430AsmParser.lib
LLVMMSP430CodeGen.lib
LLVMMSP430Desc.lib
LLVMMSP430Disassembler.lib
LLVMMSP430Info.lib
LLVMNVPTXCodeGen.lib
LLVMNVPTXDesc.lib
LLVMNVPTXInfo.lib
LLVMObjCARCOpts.lib
LLVMObjCopy.lib
LLVMObject.lib
LLVMObjectYAML.lib
LLVMOption.lib
LLVMOrcJIT.lib
LLVMOrcShared.lib
LLVMOrcTargetProcess.lib
LLVMPasses.lib
LLVMPowerPCAsmParser.lib
LLVMPowerPCCodeGen.lib
LLVMPowerPCDesc.lib
LLVMPowerPCDisassembler.lib
LLVMPowerPCInfo.lib
LLVMProfileData.lib
LLVMRemarks.lib
LLVMRISCVAsmParser.lib
LLVMRISCVCodeGen.lib
LLVMRISCVDesc.lib
LLVMRISCVDisassembler.lib
LLVMRISCVInfo.lib
LLVMRISCVTargetMCA.lib
LLVMRuntimeDyld.lib
LLVMScalarOpts.lib
LLVMSelectionDAG.lib
LLVMSparcAsmParser.lib
LLVMSparcCodeGen.lib
LLVMSparcDesc.lib
LLVMSparcDisassembler.lib
LLVMSparcInfo.lib
LLVMSupport.lib
LLVMSymbolize.lib
LLVMSystemZAsmParser.lib
LLVMSystemZCodeGen.lib
LLVMSystemZDesc.lib
LLVMSystemZDisassembler.lib
LLVMSystemZInfo.lib
LLVMTableGen.lib
LLVMTableGenCommon.lib
LLVMTableGenGlobalISel.lib
LLVMTarget.lib
LLVMTargetParser.lib
LLVMTextAPI.lib
LLVMTransformUtils.lib
LLVMVEAsmParser.lib
LLVMVECodeGen.lib
LLVMVectorize.lib
LLVMVEDesc.lib
LLVMVEDisassembler.lib
LLVMVEInfo.lib
LLVMWebAssemblyAsmParser.lib
LLVMWebAssemblyCodeGen.lib
LLVMWebAssemblyDesc.lib
LLVMWebAssemblyDisassembler.lib
LLVMWebAssemblyInfo.lib
LLVMWebAssemblyUtils.lib
LLVMWindowsDriver.lib
LLVMWindowsManifest.lib
LLVMX86AsmParser.lib
LLVMX86CodeGen.lib
LLVMX86Desc.lib
LLVMX86Disassembler.lib
LLVMX86Info.lib
LLVMX86TargetMCA.lib
LLVMXCoreCodeGen.lib
LLVMXCoreDesc.lib
LLVMXCoreDisassembler.lib
LLVMXCoreInfo.lib
LLVMXRay.lib
LTO.lib
Remarks.lib

Python代码设置

注意,该代码运行会覆盖掉原先设置的include路径、lib路径、lib依赖, 如果原先未手动设置过,就没有对应标签,替换会失败

import re
import os
import ctypes
import sys

# 要打开的文件
file = "C:\\Users\\Code\\VS\\test\\test\\test.vcxproj"
# include路径
includePath = "C:\\LLVM\\Debug\\include"
# lib路径
libPath = "C:\\LLVM\\Debug\\lib"
# lib下的所有*.lib文件名
libNames = ";".join([s for s in os.listdir(libPath) if s[-4:] == ".lib"])
# 要更改的标签
changList = ["AdditionalIncludeDirectories", "AdditionalLibraryDirectories", "AdditionalDependencies"]


def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False


def elevate():
    if not is_admin():
        # 提升权限
        ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
        sys.exit()


def getChange(s, content, txt):
    newContent = ""
    begin = "<" + s + ">"
    end = "</" + s + ">"
    newContent = re.sub(begin + ".*" + end, begin + txt + ";%(" + s + ")" + end, content)
    return newContent
    

# 提升权限
elevate()
file_data = ""
with open(file, "r", encoding="utf-8") as f:
    content = f.read()
    content = getChange(changList[0], content, includePath.replace("\\", "/"))
    content = getChange(changList[1], content, libPath.replace("\\", "/"))
    content = getChange(changList[2], content, libNames)
    file_data = content

with open(file, "w", encoding="utf-8") as f:
    f.write(file_data)

参考链接

Python解决权限不足问题,权限提升_python打开文件权限不够_正向指数增长的博客-CSDN博客

win10+VS2022下安装LLVM+CLang - 哔哩哔哩 (bilibili.com)

等等

posted @ 2023-05-30 17:40  浅笑一场  阅读(1303)  评论(0编辑  收藏  举报