diff --git a/build.zig b/build.zig index d53d823868..1ee8a21bda 100644 --- a/build.zig +++ b/build.zig @@ -19,7 +19,7 @@ pub fn build(b: *Builder) !void { const single_threaded = b.option(bool, "single-threaded", "Build artifacts that run in single threaded mode"); const use_zig_libcxx = b.option(bool, "use-zig-libcxx", "If libc++ is needed, use zig's bundled version, don't try to integrate with the system") orelse false; - var docgen_exe = b.addExecutable("docgen", "doc/docgen.zig"); + const docgen_exe = b.addExecutable("docgen", "doc/docgen.zig"); docgen_exe.single_threaded = single_threaded; const rel_zig_exe = try fs.path.relative(b.allocator, b.build_root, b.zig_exe); @@ -27,7 +27,7 @@ pub fn build(b: *Builder) !void { b.allocator, &[_][]const u8{ b.cache_root, "langref.html" }, ) catch unreachable; - var docgen_cmd = docgen_exe.run(); + const docgen_cmd = docgen_exe.run(); docgen_cmd.addArgs(&[_][]const u8{ rel_zig_exe, "doc" ++ fs.path.sep_str ++ "langref.html.in", @@ -60,6 +60,7 @@ pub fn build(b: *Builder) !void { const skip_install_lib_files = b.option(bool, "skip-install-lib-files", "Do not copy lib/ files to installation prefix") orelse false; const only_install_lib_files = b.option(bool, "lib-files-only", "Only install library files") orelse false; + const is_stage1 = b.option(bool, "stage1", "Build the stage1 compiler, put stage2 behind a feature flag") orelse false; const omit_stage2 = b.option(bool, "omit-stage2", "Do not include stage2 behind a feature flag inside stage1") orelse false; const static_llvm = b.option(bool, "static-llvm", "Disable integration with system-installed LLVM, Clang, LLD, and libc++") orelse false; @@ -135,9 +136,9 @@ pub fn build(b: *Builder) !void { break :blk 4; }; - const main_file = if (is_stage1) "src/stage1.zig" else "src/main.zig"; + const main_file: ?[]const u8 = if (is_stage1) null else "src/main.zig"; - var exe = b.addExecutable("zig", main_file); + const exe = b.addExecutable("zig", main_file); exe.strip = strip; exe.install(); exe.setBuildMode(mode); @@ -145,6 +146,7 @@ pub fn build(b: *Builder) !void { if (!skip_stage2_tests) { toolchain_step.dependOn(&exe.step); } + b.default_step.dependOn(&exe.step); exe.single_threaded = single_threaded; @@ -166,56 +168,6 @@ pub fn build(b: *Builder) !void { exe_options.addOption(bool, "llvm_has_arc", llvm_has_arc); exe_options.addOption(bool, "force_gpa", force_gpa); - if (enable_llvm) { - const cmake_cfg = if (static_llvm) null else findAndParseConfigH(b, config_h_path_option); - - if (is_stage1) { - exe.addIncludePath("src"); - exe.addIncludePath("deps/SoftFloat-3e/source/include"); - - test_stage2.addIncludePath("src"); - test_stage2.addIncludePath("deps/SoftFloat-3e/source/include"); - // This is intentionally a dummy path. stage1.zig tries to @import("compiler_rt") in case - // of being built by cmake. But when built by zig it's gonna get a compiler_rt so that - // is pointless. - exe.addPackagePath("compiler_rt", "src/empty.zig"); - exe.defineCMacro("ZIG_LINK_MODE", "Static"); - test_stage2.defineCMacro("ZIG_LINK_MODE", "Static"); - - const softfloat = b.addStaticLibrary("softfloat", null); - softfloat.setBuildMode(.ReleaseFast); - softfloat.setTarget(target); - softfloat.addIncludePath("deps/SoftFloat-3e-prebuilt"); - softfloat.addIncludePath("deps/SoftFloat-3e/source/8086"); - softfloat.addIncludePath("deps/SoftFloat-3e/source/include"); - softfloat.addCSourceFiles(&softfloat_sources, &[_][]const u8{ "-std=c99", "-O3" }); - softfloat.single_threaded = single_threaded; - - exe.linkLibrary(softfloat); - test_stage2.linkLibrary(softfloat); - - exe.addCSourceFiles(&stage1_sources, &exe_cflags); - exe.addCSourceFiles(&optimized_c_sources, &[_][]const u8{ "-std=c99", "-O3" }); - - test_stage2.addCSourceFiles(&stage1_sources, &exe_cflags); - test_stage2.addCSourceFiles(&optimized_c_sources, &[_][]const u8{ "-std=c99", "-O3" }); - } - if (cmake_cfg) |cfg| { - // Inside this code path, we have to coordinate with system packaged LLVM, Clang, and LLD. - // That means we also have to rely on stage1 compiled c++ files. We parse config.h to find - // the information passed on to us from cmake. - if (cfg.cmake_prefix_path.len > 0) { - b.addSearchPrefix(cfg.cmake_prefix_path); - } - - try addCmakeCfgOptionsToExe(b, cfg, exe, use_zig_libcxx); - try addCmakeCfgOptionsToExe(b, cfg, test_stage2, use_zig_libcxx); - } else { - // Here we are -Denable-llvm but no cmake integration. - try addStaticLlvmOptionsToExe(exe); - try addStaticLlvmOptionsToExe(test_stage2); - } - } if (link_libc) { exe.linkLibC(); test_stage2.linkLibC(); @@ -227,12 +179,12 @@ pub fn build(b: *Builder) !void { const opt_version_string = b.option([]const u8, "version-string", "Override Zig version string. Default is to find out with git."); const version = if (opt_version_string) |version| version else v: { - const version_string = b.fmt("{d}.{d}.{d}", .{ zig_version.major, zig_version.minor, zig_version.patch }); - if (!std.process.can_spawn) { std.debug.print("error: version info cannot be retrieved from git. Zig version must be provided using -Dversion-string\n", .{}); std.process.exit(1); } + const version_string = b.fmt("{d}.{d}.{d}", .{ zig_version.major, zig_version.minor, zig_version.patch }); + var code: u8 = undefined; const git_describe_untrimmed = b.execAllowFail(&[_][]const u8{ "git", "-C", b.build_root, "describe", "--match", "*.*.*", "--tags", @@ -280,6 +232,108 @@ pub fn build(b: *Builder) !void { }; exe_options.addOption([:0]const u8, "version", try b.allocator.dupeZ(u8, version)); + if (enable_llvm) { + const cmake_cfg = if (static_llvm) null else findAndParseConfigH(b, config_h_path_option); + + if (is_stage1) { + const softfloat = b.addStaticLibrary("softfloat", null); + softfloat.setBuildMode(.ReleaseFast); + softfloat.setTarget(target); + softfloat.addIncludePath("deps/SoftFloat-3e-prebuilt"); + softfloat.addIncludePath("deps/SoftFloat-3e/source/8086"); + softfloat.addIncludePath("deps/SoftFloat-3e/source/include"); + softfloat.addCSourceFiles(&softfloat_sources, &[_][]const u8{ "-std=c99", "-O3" }); + softfloat.single_threaded = single_threaded; + + const zig0 = b.addExecutable("zig0", null); + zig0.addCSourceFiles(&.{"src/stage1/zig0.cpp"}, &exe_cflags); + zig0.addIncludePath("zig-cache/tmp"); // for config.h + zig0.defineCMacro("ZIG_VERSION_MAJOR", b.fmt("{d}", .{zig_version.major})); + zig0.defineCMacro("ZIG_VERSION_MINOR", b.fmt("{d}", .{zig_version.minor})); + zig0.defineCMacro("ZIG_VERSION_PATCH", b.fmt("{d}", .{zig_version.patch})); + zig0.defineCMacro("ZIG_VERSION_STRING", b.fmt("\"{s}\"", .{version})); + + for ([_]*std.build.LibExeObjStep{ zig0, exe }) |artifact| { + artifact.addIncludePath("src"); + artifact.addIncludePath("deps/SoftFloat-3e/source/include"); + artifact.addIncludePath("deps/SoftFloat-3e-prebuilt"); + + artifact.defineCMacro("ZIG_LINK_MODE", "Static"); + + artifact.addCSourceFiles(&stage1_sources, &exe_cflags); + artifact.addCSourceFiles(&optimized_c_sources, &[_][]const u8{ "-std=c99", "-O3" }); + + artifact.linkLibrary(softfloat); + artifact.linkLibCpp(); + } + + try addStaticLlvmOptionsToExe(zig0); + + const zig1_obj_ext = target.getObjectFormat().fileExt(target.getCpuArch()); + const zig1_obj_path = b.pathJoin(&.{ "zig-cache", "tmp", b.fmt("zig1{s}", .{zig1_obj_ext}) }); + const zig1_compiler_rt_path = b.pathJoin(&.{ b.pathFromRoot("lib"), "std", "special", "compiler_rt.zig" }); + + const zig1_obj = zig0.run(); + zig1_obj.addArgs(&.{ + "src/stage1.zig", + "-target", + try target.zigTriple(b.allocator), + "-mcpu=baseline", + "--name", + "zig1", + "--zig-lib-dir", + b.pathFromRoot("lib"), + b.fmt("-femit-bin={s}", .{b.pathFromRoot(zig1_obj_path)}), + "-fcompiler-rt", + "-lc", + }); + { + zig1_obj.addArgs(&.{ "--pkg-begin", "build_options" }); + zig1_obj.addFileSourceArg(exe_options.getSource()); + zig1_obj.addArgs(&.{ "--pkg-end", "--pkg-begin", "compiler_rt", zig1_compiler_rt_path, "--pkg-end" }); + } + switch (mode) { + .Debug => {}, + .ReleaseFast => { + zig1_obj.addArg("-OReleaseFast"); + zig1_obj.addArg("--strip"); + }, + .ReleaseSafe => { + zig1_obj.addArg("-OReleaseSafe"); + zig1_obj.addArg("--strip"); + }, + .ReleaseSmall => { + zig1_obj.addArg("-OReleaseSmall"); + zig1_obj.addArg("--strip"); + }, + } + if (single_threaded orelse false) { + zig1_obj.addArg("-fsingle-threaded"); + } + + exe.step.dependOn(&zig1_obj.step); + exe.addObjectFile(zig1_obj_path); + + // This is intentionally a dummy path. stage1.zig tries to @import("compiler_rt") in case + // of being built by cmake. But when built by zig it's gonna get a compiler_rt so that + // is pointless. + exe.addPackagePath("compiler_rt", "src/empty.zig"); + } + if (cmake_cfg) |cfg| { + // Inside this code path, we have to coordinate with system packaged LLVM, Clang, and LLD. + // That means we also have to rely on stage1 compiled c++ files. We parse config.h to find + // the information passed on to us from cmake. + if (cfg.cmake_prefix_path.len > 0) { + b.addSearchPrefix(cfg.cmake_prefix_path); + } + + try addCmakeCfgOptionsToExe(b, cfg, exe, use_zig_libcxx); + } else { + // Here we are -Denable-llvm but no cmake integration. + try addStaticLlvmOptionsToExe(exe); + } + } + const semver = try std.SemanticVersion.parse(version); exe_options.addOption(std.SemanticVersion, "semver", semver); @@ -548,7 +602,6 @@ fn addCxxKnownPath( ) !void { if (!std.process.can_spawn) return error.RequiredLibraryNotFound; - const path_padded = try b.exec(&[_][]const u8{ ctx.cxx_compiler, b.fmt("-print-file-name={s}", .{objname}), @@ -695,15 +748,19 @@ fn toNativePathSep(b: *Builder, s: []const u8) []u8 { const softfloat_sources = [_][]const u8{ "deps/SoftFloat-3e/source/8086/f128M_isSignalingNaN.c", + "deps/SoftFloat-3e/source/8086/extF80M_isSignalingNaN.c", "deps/SoftFloat-3e/source/8086/s_commonNaNToF128M.c", + "deps/SoftFloat-3e/source/8086/s_commonNaNToExtF80M.c", "deps/SoftFloat-3e/source/8086/s_commonNaNToF16UI.c", "deps/SoftFloat-3e/source/8086/s_commonNaNToF32UI.c", "deps/SoftFloat-3e/source/8086/s_commonNaNToF64UI.c", "deps/SoftFloat-3e/source/8086/s_f128MToCommonNaN.c", + "deps/SoftFloat-3e/source/8086/s_extF80MToCommonNaN.c", "deps/SoftFloat-3e/source/8086/s_f16UIToCommonNaN.c", "deps/SoftFloat-3e/source/8086/s_f32UIToCommonNaN.c", "deps/SoftFloat-3e/source/8086/s_f64UIToCommonNaN.c", "deps/SoftFloat-3e/source/8086/s_propagateNaNF128M.c", + "deps/SoftFloat-3e/source/8086/s_propagateNaNExtF80M.c", "deps/SoftFloat-3e/source/8086/s_propagateNaNF16UI.c", "deps/SoftFloat-3e/source/8086/softfloat_raiseFlags.c", "deps/SoftFloat-3e/source/f128M_add.c", @@ -723,6 +780,7 @@ const softfloat_sources = [_][]const u8{ "deps/SoftFloat-3e/source/f128M_to_f16.c", "deps/SoftFloat-3e/source/f128M_to_f32.c", "deps/SoftFloat-3e/source/f128M_to_f64.c", + "deps/SoftFloat-3e/source/f128M_to_extF80M.c", "deps/SoftFloat-3e/source/f128M_to_i32.c", "deps/SoftFloat-3e/source/f128M_to_i32_r_minMag.c", "deps/SoftFloat-3e/source/f128M_to_i64.c", @@ -731,6 +789,20 @@ const softfloat_sources = [_][]const u8{ "deps/SoftFloat-3e/source/f128M_to_ui32_r_minMag.c", "deps/SoftFloat-3e/source/f128M_to_ui64.c", "deps/SoftFloat-3e/source/f128M_to_ui64_r_minMag.c", + "deps/SoftFloat-3e/source/extF80M_add.c", + "deps/SoftFloat-3e/source/extF80M_div.c", + "deps/SoftFloat-3e/source/extF80M_eq.c", + "deps/SoftFloat-3e/source/extF80M_le.c", + "deps/SoftFloat-3e/source/extF80M_lt.c", + "deps/SoftFloat-3e/source/extF80M_mul.c", + "deps/SoftFloat-3e/source/extF80M_rem.c", + "deps/SoftFloat-3e/source/extF80M_roundToInt.c", + "deps/SoftFloat-3e/source/extF80M_sqrt.c", + "deps/SoftFloat-3e/source/extF80M_sub.c", + "deps/SoftFloat-3e/source/extF80M_to_f16.c", + "deps/SoftFloat-3e/source/extF80M_to_f32.c", + "deps/SoftFloat-3e/source/extF80M_to_f64.c", + "deps/SoftFloat-3e/source/extF80M_to_f128M.c", "deps/SoftFloat-3e/source/f16_add.c", "deps/SoftFloat-3e/source/f16_div.c", "deps/SoftFloat-3e/source/f16_eq.c", @@ -742,9 +814,12 @@ const softfloat_sources = [_][]const u8{ "deps/SoftFloat-3e/source/f16_roundToInt.c", "deps/SoftFloat-3e/source/f16_sqrt.c", "deps/SoftFloat-3e/source/f16_sub.c", + "deps/SoftFloat-3e/source/f16_to_extF80M.c", "deps/SoftFloat-3e/source/f16_to_f128M.c", "deps/SoftFloat-3e/source/f16_to_f64.c", + "deps/SoftFloat-3e/source/f32_to_extF80M.c", "deps/SoftFloat-3e/source/f32_to_f128M.c", + "deps/SoftFloat-3e/source/f64_to_extF80M.c", "deps/SoftFloat-3e/source/f64_to_f128M.c", "deps/SoftFloat-3e/source/f64_to_f16.c", "deps/SoftFloat-3e/source/i32_to_f128M.c", @@ -752,6 +827,7 @@ const softfloat_sources = [_][]const u8{ "deps/SoftFloat-3e/source/s_addCarryM.c", "deps/SoftFloat-3e/source/s_addComplCarryM.c", "deps/SoftFloat-3e/source/s_addF128M.c", + "deps/SoftFloat-3e/source/s_addExtF80M.c", "deps/SoftFloat-3e/source/s_addM.c", "deps/SoftFloat-3e/source/s_addMagsF16.c", "deps/SoftFloat-3e/source/s_addMagsF32.c", @@ -762,12 +838,14 @@ const softfloat_sources = [_][]const u8{ "deps/SoftFloat-3e/source/s_approxRecip_1Ks.c", "deps/SoftFloat-3e/source/s_compare128M.c", "deps/SoftFloat-3e/source/s_compare96M.c", + "deps/SoftFloat-3e/source/s_compareNonnormExtF80M.c", "deps/SoftFloat-3e/source/s_countLeadingZeros16.c", "deps/SoftFloat-3e/source/s_countLeadingZeros32.c", "deps/SoftFloat-3e/source/s_countLeadingZeros64.c", "deps/SoftFloat-3e/source/s_countLeadingZeros8.c", "deps/SoftFloat-3e/source/s_eq128.c", "deps/SoftFloat-3e/source/s_invalidF128M.c", + "deps/SoftFloat-3e/source/s_invalidExtF80M.c", "deps/SoftFloat-3e/source/s_isNaNF128M.c", "deps/SoftFloat-3e/source/s_le128.c", "deps/SoftFloat-3e/source/s_lt128.c", @@ -778,7 +856,9 @@ const softfloat_sources = [_][]const u8{ "deps/SoftFloat-3e/source/s_mulAddF32.c", "deps/SoftFloat-3e/source/s_mulAddF64.c", "deps/SoftFloat-3e/source/s_negXM.c", + "deps/SoftFloat-3e/source/s_normExtF80SigM.c", "deps/SoftFloat-3e/source/s_normRoundPackMToF128M.c", + "deps/SoftFloat-3e/source/s_normRoundPackMToExtF80M.c", "deps/SoftFloat-3e/source/s_normRoundPackToF16.c", "deps/SoftFloat-3e/source/s_normRoundPackToF32.c", "deps/SoftFloat-3e/source/s_normRoundPackToF64.c", @@ -789,6 +869,7 @@ const softfloat_sources = [_][]const u8{ "deps/SoftFloat-3e/source/s_remStepMBy32.c", "deps/SoftFloat-3e/source/s_roundMToI64.c", "deps/SoftFloat-3e/source/s_roundMToUI64.c", + "deps/SoftFloat-3e/source/s_roundPackMToExtF80M.c", "deps/SoftFloat-3e/source/s_roundPackMToF128M.c", "deps/SoftFloat-3e/source/s_roundPackToF16.c", "deps/SoftFloat-3e/source/s_roundPackToF32.c", @@ -817,9 +898,12 @@ const softfloat_sources = [_][]const u8{ "deps/SoftFloat-3e/source/s_subMagsF32.c", "deps/SoftFloat-3e/source/s_subMagsF64.c", "deps/SoftFloat-3e/source/s_tryPropagateNaNF128M.c", + "deps/SoftFloat-3e/source/s_tryPropagateNaNExtF80M.c", "deps/SoftFloat-3e/source/softfloat_state.c", "deps/SoftFloat-3e/source/ui32_to_f128M.c", "deps/SoftFloat-3e/source/ui64_to_f128M.c", + "deps/SoftFloat-3e/source/ui32_to_extF80M.c", + "deps/SoftFloat-3e/source/ui64_to_extF80M.c", }; const stage1_sources = [_][]const u8{