Try to link system LLVM libraries

This commit is contained in:
David Gonzalez Martin 2024-03-12 12:23:21 -06:00
parent 48f9902f2b
commit 1954c643f0
3 changed files with 272 additions and 247 deletions

View File

@ -252,6 +252,14 @@ pub fn compileCSourceFile(context: *const Context, arguments: [][*:0]u8) !void {
var clang_args = UnpinnedArray([]const u8){}; var clang_args = UnpinnedArray([]const u8){};
try clang_args.append(context.my_allocator, context.executable_absolute_path); try clang_args.append(context.my_allocator, context.executable_absolute_path);
try clang_args.append(context.my_allocator, "clang"); try clang_args.append(context.my_allocator, "clang");
try clang_args.append(context.my_allocator, "-nostdinc");
try clang_args.append_slice(context.my_allocator, &.{"-isystem", "/home/david/dev/zig/lib/include", "-isystem", "/home/david/dev/zig/lib/libc/include/x86_64-linux-gnu", "-isystem", "/home/david/dev/zig/lib/libc/include/generic-glibc", "-isystem", "/home/david/dev/zig/lib/libc/include/x86-linux-any", "-isystem", "/home/david/dev/zig/lib/libc/include/any-linux-any"});
try clang_args.append(context.my_allocator, "-isystem");
try clang_args.append(context.my_allocator, "/usr/include");
try clang_args.append(context.my_allocator, "-isystem");
try clang_args.append(context.my_allocator, "/usr/include/linux");
for (arguments) |arg| { for (arguments) |arg| {
try clang_args.append(context.my_allocator, span(arg)); try clang_args.append(context.my_allocator, span(arg));
} }

509
build.zig
View File

@ -8,11 +8,12 @@ pub fn build(b: *std.Build) !void {
const print_stack_trace = b.option(bool, "print_stack_trace", "This option enables printing stack traces inside the compiler") orelse is_ci or @import("builtin").os.tag == .macos; const print_stack_trace = b.option(bool, "print_stack_trace", "This option enables printing stack traces inside the compiler") orelse is_ci or @import("builtin").os.tag == .macos;
const native_target = b.resolveTargetQuery(.{}); const native_target = b.resolveTargetQuery(.{});
const optimization = b.standardOptimizeOption(.{}); const optimization = b.standardOptimizeOption(.{});
var target_query = b.standardTargetOptionsQueryOnly(.{}); const target_query = b.standardTargetOptionsQueryOnly(.{});
const os = target_query.os_tag orelse @import("builtin").os.tag; const os = target_query.os_tag orelse @import("builtin").os.tag;
if (os == .linux) { _ = os; // autofix
target_query.abi = .musl; // if (os == .linux) {
} // target_query.abi = .musl;
// }
const target = b.resolveTargetQuery(target_query); const target = b.resolveTargetQuery(target_query);
const compiler_options = b.addOptions(); const compiler_options = b.addOptions();
compiler_options.addOption(bool, "print_stack_trace", print_stack_trace); compiler_options.addOption(bool, "print_stack_trace", print_stack_trace);
@ -31,7 +32,19 @@ pub fn build(b: *std.Build) !void {
compiler.want_lto = false; compiler.want_lto = false;
compiler.linkLibC(); compiler.linkLibC();
compiler.linkSystemLibrary("c++"); compiler.addObjectFile(.{ .cwd_relative = "/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../lib/libstdc++.so" });
compiler.addIncludePath(.{ .cwd_relative = "/usr/include"});
compiler.addIncludePath(.{ .cwd_relative = "/usr/include/c++/13.2.1"});
compiler.addIncludePath(.{ .cwd_relative = "/usr/include/c++/13.2.1/x86_64-pc-linux-gnu"});
compiler.addLibraryPath(.{ .cwd_relative = "/usr/lib"});
compiler.linkSystemLibrary("LLVM");
compiler.linkSystemLibrary("clang-cpp");
compiler.linkSystemLibrary("lldCommon");
compiler.linkSystemLibrary("lldCOFF");
compiler.linkSystemLibrary("lldELF");
compiler.linkSystemLibrary("lldMachO");
compiler.linkSystemLibrary("lldWasm");
compiler.linkSystemLibrary("unwind");
// TODO: // TODO:
// if (target.result.os.tag == .windows) { // if (target.result.os.tag == .windows) {
@ -92,8 +105,10 @@ pub fn build(b: *std.Build) !void {
}; };
const llvm_include_dir = try std.mem.concat(b.allocator, u8, &.{ llvm_path, "/include" }); const llvm_include_dir = try std.mem.concat(b.allocator, u8, &.{ llvm_path, "/include" });
_ = llvm_include_dir; // autofix
const llvm_lib_dir = try std.mem.concat(b.allocator, u8, &.{ llvm_path, "/lib" }); const llvm_lib_dir = try std.mem.concat(b.allocator, u8, &.{ llvm_path, "/lib" });
compiler.addIncludePath(std.Build.LazyPath.relative(llvm_include_dir)); _ = llvm_lib_dir; // autofix
// compiler.addIncludePath(std.Build.LazyPath.relative(llvm_include_dir));
const cpp_files = .{ const cpp_files = .{
"src/llvm/llvm.cpp", "src/llvm/llvm.cpp",
"src/llvm/lld.cpp", "src/llvm/lld.cpp",
@ -120,248 +135,248 @@ pub fn build(b: *std.Build) !void {
}, },
}); });
const zlib = if (target.result.os.tag == .windows) "zstd.lib" else "libzstd.a"; // const zlib = if (target.result.os.tag == .windows) "zstd.lib" else "libzstd.a";
const llvm_libraries = [_][]const u8{ // const llvm_libraries = [_][]const u8{
"libLLVMAArch64AsmParser.a", // "libLLVMAArch64AsmParser.a",
"libLLVMAArch64CodeGen.a", // "libLLVMAArch64CodeGen.a",
"libLLVMAArch64Desc.a", // "libLLVMAArch64Desc.a",
"libLLVMAArch64Disassembler.a", // "libLLVMAArch64Disassembler.a",
"libLLVMAArch64Info.a", // "libLLVMAArch64Info.a",
"libLLVMAArch64Utils.a", // "libLLVMAArch64Utils.a",
"libLLVMAggressiveInstCombine.a", // "libLLVMAggressiveInstCombine.a",
"libLLVMAMDGPUAsmParser.a", // "libLLVMAMDGPUAsmParser.a",
"libLLVMAMDGPUCodeGen.a", // "libLLVMAMDGPUCodeGen.a",
"libLLVMAMDGPUDesc.a", // "libLLVMAMDGPUDesc.a",
"libLLVMAMDGPUDisassembler.a", // "libLLVMAMDGPUDisassembler.a",
"libLLVMAMDGPUInfo.a", // "libLLVMAMDGPUInfo.a",
"libLLVMAMDGPUTargetMCA.a", // "libLLVMAMDGPUTargetMCA.a",
"libLLVMAMDGPUUtils.a", // "libLLVMAMDGPUUtils.a",
"libLLVMAnalysis.a", // "libLLVMAnalysis.a",
"libLLVMARMAsmParser.a", // "libLLVMARMAsmParser.a",
"libLLVMARMCodeGen.a", // "libLLVMARMCodeGen.a",
"libLLVMARMDesc.a", // "libLLVMARMDesc.a",
"libLLVMARMDisassembler.a", // "libLLVMARMDisassembler.a",
"libLLVMARMInfo.a", // "libLLVMARMInfo.a",
"libLLVMARMUtils.a", // "libLLVMARMUtils.a",
"libLLVMAsmParser.a", // "libLLVMAsmParser.a",
"libLLVMAsmPrinter.a", // "libLLVMAsmPrinter.a",
"libLLVMAVRAsmParser.a", // "libLLVMAVRAsmParser.a",
"libLLVMAVRCodeGen.a", // "libLLVMAVRCodeGen.a",
"libLLVMAVRDesc.a", // "libLLVMAVRDesc.a",
"libLLVMAVRDisassembler.a", // "libLLVMAVRDisassembler.a",
"libLLVMAVRInfo.a", // "libLLVMAVRInfo.a",
"libLLVMBinaryFormat.a", // "libLLVMBinaryFormat.a",
"libLLVMBitReader.a", // "libLLVMBitReader.a",
"libLLVMBitstreamReader.a", // "libLLVMBitstreamReader.a",
"libLLVMBitWriter.a", // "libLLVMBitWriter.a",
"libLLVMBPFAsmParser.a", // "libLLVMBPFAsmParser.a",
"libLLVMBPFCodeGen.a", // "libLLVMBPFCodeGen.a",
"libLLVMBPFDesc.a", // "libLLVMBPFDesc.a",
"libLLVMBPFDisassembler.a", // "libLLVMBPFDisassembler.a",
"libLLVMBPFInfo.a", // "libLLVMBPFInfo.a",
"libLLVMCFGuard.a", // "libLLVMCFGuard.a",
"libLLVMCFIVerify.a", // "libLLVMCFIVerify.a",
"libLLVMCodeGen.a", // "libLLVMCodeGen.a",
"libLLVMCodeGenTypes.a", // "libLLVMCodeGenTypes.a",
"libLLVMCore.a", // "libLLVMCore.a",
"libLLVMCoroutines.a", // "libLLVMCoroutines.a",
"libLLVMCoverage.a", // "libLLVMCoverage.a",
"libLLVMDebugInfoBTF.a", // "libLLVMDebugInfoBTF.a",
"libLLVMDebugInfoCodeView.a", // "libLLVMDebugInfoCodeView.a",
"libLLVMDebuginfod.a", // "libLLVMDebuginfod.a",
"libLLVMDebugInfoDWARF.a", // "libLLVMDebugInfoDWARF.a",
"libLLVMDebugInfoGSYM.a", // "libLLVMDebugInfoGSYM.a",
"libLLVMDebugInfoLogicalView.a", // "libLLVMDebugInfoLogicalView.a",
"libLLVMDebugInfoMSF.a", // "libLLVMDebugInfoMSF.a",
"libLLVMDebugInfoPDB.a", // "libLLVMDebugInfoPDB.a",
"libLLVMDemangle.a", // "libLLVMDemangle.a",
"libLLVMDiff.a", // "libLLVMDiff.a",
"libLLVMDlltoolDriver.a", // "libLLVMDlltoolDriver.a",
"libLLVMDWARFLinker.a", // "libLLVMDWARFLinker.a",
"libLLVMDWARFLinkerParallel.a", // "libLLVMDWARFLinkerParallel.a",
"libLLVMDWP.a", // "libLLVMDWP.a",
"libLLVMExecutionEngine.a", // "libLLVMExecutionEngine.a",
"libLLVMExtensions.a", // "libLLVMExtensions.a",
"libLLVMFileCheck.a", // "libLLVMFileCheck.a",
"libLLVMFrontendHLSL.a", // "libLLVMFrontendHLSL.a",
"libLLVMFrontendOpenACC.a", // "libLLVMFrontendOpenACC.a",
"libLLVMFrontendOpenMP.a", // "libLLVMFrontendOpenMP.a",
"libLLVMFuzzerCLI.a", // "libLLVMFuzzerCLI.a",
"libLLVMFuzzMutate.a", // "libLLVMFuzzMutate.a",
"libLLVMGlobalISel.a", // "libLLVMGlobalISel.a",
"libLLVMHexagonAsmParser.a", // "libLLVMHexagonAsmParser.a",
"libLLVMHexagonCodeGen.a", // "libLLVMHexagonCodeGen.a",
"libLLVMHexagonDesc.a", // "libLLVMHexagonDesc.a",
"libLLVMHexagonDisassembler.a", // "libLLVMHexagonDisassembler.a",
"libLLVMHexagonInfo.a", // "libLLVMHexagonInfo.a",
"libLLVMInstCombine.a", // "libLLVMInstCombine.a",
"libLLVMInstrumentation.a", // "libLLVMInstrumentation.a",
"libLLVMInterfaceStub.a", // "libLLVMInterfaceStub.a",
"libLLVMInterpreter.a", // "libLLVMInterpreter.a",
"libLLVMipo.a", // "libLLVMipo.a",
"libLLVMIRPrinter.a", // "libLLVMIRPrinter.a",
"libLLVMIRReader.a", // "libLLVMIRReader.a",
"libLLVMJITLink.a", // "libLLVMJITLink.a",
"libLLVMLanaiAsmParser.a", // "libLLVMLanaiAsmParser.a",
"libLLVMLanaiCodeGen.a", // "libLLVMLanaiCodeGen.a",
"libLLVMLanaiDesc.a", // "libLLVMLanaiDesc.a",
"libLLVMLanaiDisassembler.a", // "libLLVMLanaiDisassembler.a",
"libLLVMLanaiInfo.a", // "libLLVMLanaiInfo.a",
"libLLVMLibDriver.a", // "libLLVMLibDriver.a",
"libLLVMLineEditor.a", // "libLLVMLineEditor.a",
"libLLVMLinker.a", // "libLLVMLinker.a",
"libLLVMLoongArchAsmParser.a", // "libLLVMLoongArchAsmParser.a",
"libLLVMLoongArchCodeGen.a", // "libLLVMLoongArchCodeGen.a",
"libLLVMLoongArchDesc.a", // "libLLVMLoongArchDesc.a",
"libLLVMLoongArchDisassembler.a", // "libLLVMLoongArchDisassembler.a",
"libLLVMLoongArchInfo.a", // "libLLVMLoongArchInfo.a",
"libLLVMLTO.a", // "libLLVMLTO.a",
"libLLVMMC.a", // "libLLVMMC.a",
"libLLVMMCA.a", // "libLLVMMCA.a",
"libLLVMMCDisassembler.a", // "libLLVMMCDisassembler.a",
"libLLVMMCJIT.a", // "libLLVMMCJIT.a",
"libLLVMMCParser.a", // "libLLVMMCParser.a",
"libLLVMMipsAsmParser.a", // "libLLVMMipsAsmParser.a",
"libLLVMMipsCodeGen.a", // "libLLVMMipsCodeGen.a",
"libLLVMMipsDesc.a", // "libLLVMMipsDesc.a",
"libLLVMMipsDisassembler.a", // "libLLVMMipsDisassembler.a",
"libLLVMMipsInfo.a", // "libLLVMMipsInfo.a",
"libLLVMMIRParser.a", // "libLLVMMIRParser.a",
"libLLVMMSP430AsmParser.a", // "libLLVMMSP430AsmParser.a",
"libLLVMMSP430CodeGen.a", // "libLLVMMSP430CodeGen.a",
"libLLVMMSP430Desc.a", // "libLLVMMSP430Desc.a",
"libLLVMMSP430Disassembler.a", // "libLLVMMSP430Disassembler.a",
"libLLVMMSP430Info.a", // "libLLVMMSP430Info.a",
"libLLVMNVPTXCodeGen.a", // "libLLVMNVPTXCodeGen.a",
"libLLVMNVPTXDesc.a", // "libLLVMNVPTXDesc.a",
"libLLVMNVPTXInfo.a", // "libLLVMNVPTXInfo.a",
"libLLVMObjCARCOpts.a", // "libLLVMObjCARCOpts.a",
"libLLVMObjCopy.a", // "libLLVMObjCopy.a",
"libLLVMObject.a", // "libLLVMObject.a",
"libLLVMObjectYAML.a", // "libLLVMObjectYAML.a",
"libLLVMOption.a", // "libLLVMOption.a",
"libLLVMOrcJIT.a", // "libLLVMOrcJIT.a",
"libLLVMOrcShared.a", // "libLLVMOrcShared.a",
"libLLVMOrcTargetProcess.a", // "libLLVMOrcTargetProcess.a",
"libLLVMPasses.a", // "libLLVMPasses.a",
"libLLVMPowerPCAsmParser.a", // "libLLVMPowerPCAsmParser.a",
"libLLVMPowerPCCodeGen.a", // "libLLVMPowerPCCodeGen.a",
"libLLVMPowerPCDesc.a", // "libLLVMPowerPCDesc.a",
"libLLVMPowerPCDisassembler.a", // "libLLVMPowerPCDisassembler.a",
"libLLVMPowerPCInfo.a", // "libLLVMPowerPCInfo.a",
"libLLVMProfileData.a", // "libLLVMProfileData.a",
"libLLVMRemarks.a", // "libLLVMRemarks.a",
"libLLVMRISCVAsmParser.a", // "libLLVMRISCVAsmParser.a",
"libLLVMRISCVCodeGen.a", // "libLLVMRISCVCodeGen.a",
"libLLVMRISCVDesc.a", // "libLLVMRISCVDesc.a",
"libLLVMRISCVDisassembler.a", // "libLLVMRISCVDisassembler.a",
"libLLVMRISCVInfo.a", // "libLLVMRISCVInfo.a",
"libLLVMRISCVTargetMCA.a", // "libLLVMRISCVTargetMCA.a",
"libLLVMRuntimeDyld.a", // "libLLVMRuntimeDyld.a",
"libLLVMScalarOpts.a", // "libLLVMScalarOpts.a",
"libLLVMSelectionDAG.a", // "libLLVMSelectionDAG.a",
"libLLVMSparcAsmParser.a", // "libLLVMSparcAsmParser.a",
"libLLVMSparcCodeGen.a", // "libLLVMSparcCodeGen.a",
"libLLVMSparcDesc.a", // "libLLVMSparcDesc.a",
"libLLVMSparcDisassembler.a", // "libLLVMSparcDisassembler.a",
"libLLVMSparcInfo.a", // "libLLVMSparcInfo.a",
"libLLVMSupport.a", // "libLLVMSupport.a",
"libLLVMSymbolize.a", // "libLLVMSymbolize.a",
"libLLVMSystemZAsmParser.a", // "libLLVMSystemZAsmParser.a",
"libLLVMSystemZCodeGen.a", // "libLLVMSystemZCodeGen.a",
"libLLVMSystemZDesc.a", // "libLLVMSystemZDesc.a",
"libLLVMSystemZDisassembler.a", // "libLLVMSystemZDisassembler.a",
"libLLVMSystemZInfo.a", // "libLLVMSystemZInfo.a",
"libLLVMTableGen.a", // "libLLVMTableGen.a",
"libLLVMTableGenCommon.a", // "libLLVMTableGenCommon.a",
"libLLVMTableGenGlobalISel.a", // "libLLVMTableGenGlobalISel.a",
"libLLVMTarget.a", // "libLLVMTarget.a",
"libLLVMTargetParser.a", // "libLLVMTargetParser.a",
"libLLVMTextAPI.a", // "libLLVMTextAPI.a",
"libLLVMTransformUtils.a", // "libLLVMTransformUtils.a",
"libLLVMVEAsmParser.a", // "libLLVMVEAsmParser.a",
"libLLVMVECodeGen.a", // "libLLVMVECodeGen.a",
"libLLVMVectorize.a", // "libLLVMVectorize.a",
"libLLVMVEDesc.a", // "libLLVMVEDesc.a",
"libLLVMVEDisassembler.a", // "libLLVMVEDisassembler.a",
"libLLVMVEInfo.a", // "libLLVMVEInfo.a",
"libLLVMWebAssemblyAsmParser.a", // "libLLVMWebAssemblyAsmParser.a",
"libLLVMWebAssemblyCodeGen.a", // "libLLVMWebAssemblyCodeGen.a",
"libLLVMWebAssemblyDesc.a", // "libLLVMWebAssemblyDesc.a",
"libLLVMWebAssemblyDisassembler.a", // "libLLVMWebAssemblyDisassembler.a",
"libLLVMWebAssemblyInfo.a", // "libLLVMWebAssemblyInfo.a",
"libLLVMWebAssemblyUtils.a", // "libLLVMWebAssemblyUtils.a",
"libLLVMWindowsDriver.a", // "libLLVMWindowsDriver.a",
"libLLVMWindowsManifest.a", // "libLLVMWindowsManifest.a",
"libLLVMX86AsmParser.a", // "libLLVMX86AsmParser.a",
"libLLVMX86CodeGen.a", // "libLLVMX86CodeGen.a",
"libLLVMX86Desc.a", // "libLLVMX86Desc.a",
"libLLVMX86Disassembler.a", // "libLLVMX86Disassembler.a",
"libLLVMX86Info.a", // "libLLVMX86Info.a",
"libLLVMX86TargetMCA.a", // "libLLVMX86TargetMCA.a",
"libLLVMXCoreCodeGen.a", // "libLLVMXCoreCodeGen.a",
"libLLVMXCoreDesc.a", // "libLLVMXCoreDesc.a",
"libLLVMXCoreDisassembler.a", // "libLLVMXCoreDisassembler.a",
"libLLVMXCoreInfo.a", // "libLLVMXCoreInfo.a",
"libLLVMXRay.a", // "libLLVMXRay.a",
//LLD // //LLD
"liblldCOFF.a", // "liblldCOFF.a",
"liblldCommon.a", // "liblldCommon.a",
"liblldELF.a", // "liblldELF.a",
"liblldMachO.a", // "liblldMachO.a",
"liblldMinGW.a", // "liblldMinGW.a",
"liblldWasm.a", // "liblldWasm.a",
// Zlib // // Zlib
zlib, // zlib,
"libz.a", // "libz.a",
// Clang // // Clang
"libclangAnalysis.a", // "libclangAnalysis.a",
"libclangAnalysisFlowSensitive.a", // "libclangAnalysisFlowSensitive.a",
"libclangAnalysisFlowSensitiveModels.a", // "libclangAnalysisFlowSensitiveModels.a",
"libclangAPINotes.a", // "libclangAPINotes.a",
"libclangARCMigrate.a", // "libclangARCMigrate.a",
"libclangAST.a", // "libclangAST.a",
"libclangASTMatchers.a", // "libclangASTMatchers.a",
"libclangBasic.a", // "libclangBasic.a",
"libclangCodeGen.a", // "libclangCodeGen.a",
"libclangCrossTU.a", // "libclangCrossTU.a",
"libclangDependencyScanning.a", // "libclangDependencyScanning.a",
"libclangDirectoryWatcher.a", // "libclangDirectoryWatcher.a",
"libclangDriver.a", // "libclangDriver.a",
"libclangDynamicASTMatchers.a", // "libclangDynamicASTMatchers.a",
"libclangEdit.a", // "libclangEdit.a",
"libclangExtractAPI.a", // "libclangExtractAPI.a",
"libclangFormat.a", // "libclangFormat.a",
"libclangFrontend.a", // "libclangFrontend.a",
"libclangFrontendTool.a", // "libclangFrontendTool.a",
"libclangHandleCXX.a", // "libclangHandleCXX.a",
"libclangHandleLLVM.a", // "libclangHandleLLVM.a",
"libclangIndex.a", // "libclangIndex.a",
"libclangIndexSerialization.a", // "libclangIndexSerialization.a",
"libclangInterpreter.a", // "libclangInterpreter.a",
"libclangLex.a", // "libclangLex.a",
"libclangParse.a", // "libclangParse.a",
"libclangRewrite.a", // "libclangRewrite.a",
"libclangRewriteFrontend.a", // "libclangRewriteFrontend.a",
"libclangSema.a", // "libclangSema.a",
"libclangSerialization.a", // "libclangSerialization.a",
"libclangStaticAnalyzerCheckers.a", // "libclangStaticAnalyzerCheckers.a",
"libclangStaticAnalyzerCore.a", // "libclangStaticAnalyzerCore.a",
"libclangStaticAnalyzerFrontend.a", // "libclangStaticAnalyzerFrontend.a",
"libclangSupport.a", // "libclangSupport.a",
"libclangTooling.a", // "libclangTooling.a",
"libclangToolingASTDiff.a", // "libclangToolingASTDiff.a",
"libclangToolingCore.a", // "libclangToolingCore.a",
"libclangToolingInclusions.a", // "libclangToolingInclusions.a",
"libclangToolingInclusionsStdlib.a", // "libclangToolingInclusionsStdlib.a",
"libclangToolingRefactoring.a", // "libclangToolingRefactoring.a",
"libclangToolingSyntax.a", // "libclangToolingSyntax.a",
"libclangTransformer.a", // "libclangTransformer.a",
}; // };
for (llvm_libraries) |llvm_library| { // for (llvm_libraries) |llvm_library| {
compiler.addObjectFile(std.Build.LazyPath.relative(try std.mem.concat(b.allocator, u8, &.{ llvm_lib_dir, "/", llvm_library }))); // compiler.addObjectFile(std.Build.LazyPath.relative(try std.mem.concat(b.allocator, u8, &.{ llvm_lib_dir, "/", llvm_library })));
} // }
const install_exe = b.addInstallArtifact(compiler, .{}); const install_exe = b.addInstallArtifact(compiler, .{});
b.getInstallStep().dependOn(&install_exe.step); b.getInstallStep().dependOn(&install_exe.step);

View File

@ -1,4 +1,6 @@
#include <stdio.h>
int main() int main()
{ {
printf("Hello world\n");
return 0; return 0;
} }