authorgravatar for xavierb@gmail.comXavier Bouchoux <xavierb@gmail.com> 2023-10-16 22:49:27+02:00
committergravatar for xavierb@gmail.comXavier Bouchoux <xavierb@gmail.com> 2023-10-16 23:07:04+02:00
log69d6f2e1b821a5cc089534c59cb2e881c6d184b1
treea76289981d0225ccaef2333a3193cab13ea97822
parent0afead56516c13c007b99d4b252db064080e2679

build.zig: add support for using "zig c++" as the bootstrap c++ compiler

The build was previously failing with `error: unknown command: -print-file-name=libstdc++.a` because the command invocation was `zig -print-file-name=libstdc++.a` instead of `zig c++ -print-file-name=libstdc++.a` note: .cxx_compiler_arg1 = "" instead of undefined to avoid breaking existing setups without requiring to run cmake again.

2 files changed, 14 insertions(+), 2 deletions(-)

build.zig+13-2
...@@ -735,7 +735,11 @@ fn addCxxKnownPath(...@@ -735,7 +735,11 @@ fn addCxxKnownPath(
735) !void {735) !void {
736 if (!std.process.can_spawn)736 if (!std.process.can_spawn)
737 return error.RequiredLibraryNotFound;737 return error.RequiredLibraryNotFound;
738 const path_padded = b.exec(&.{ ctx.cxx_compiler, b.fmt("-print-file-name={s}", .{objname}) });738
739 const path_padded = if (ctx.cxx_compiler_arg1.len > 0)
740 b.exec(&.{ ctx.cxx_compiler, ctx.cxx_compiler_arg1, b.fmt("-print-file-name={s}", .{objname}) })
741 else
742 b.exec(&.{ ctx.cxx_compiler, b.fmt("-print-file-name={s}", .{objname}) });
739 var tokenizer = mem.tokenizeAny(u8, path_padded, "\r\n");743 var tokenizer = mem.tokenizeAny(u8, path_padded, "\r\n");
740 const path_unpadded = tokenizer.next().?;744 const path_unpadded = tokenizer.next().?;
741 if (mem.eql(u8, path_unpadded, objname)) {745 if (mem.eql(u8, path_unpadded, objname)) {
...@@ -778,6 +782,7 @@ const CMakeConfig = struct {...@@ -778,6 +782,7 @@ const CMakeConfig = struct {
778 cmake_static_library_prefix: []const u8,782 cmake_static_library_prefix: []const u8,
779 cmake_static_library_suffix: []const u8,783 cmake_static_library_suffix: []const u8,
780 cxx_compiler: []const u8,784 cxx_compiler: []const u8,
785 cxx_compiler_arg1: []const u8,
781 lld_include_dir: []const u8,786 lld_include_dir: []const u8,
782 lld_libraries: []const u8,787 lld_libraries: []const u8,
783 clang_libraries: []const u8,788 clang_libraries: []const u8,
...@@ -844,6 +849,7 @@ fn parseConfigH(b: *std.Build, config_h_text: []const u8) ?CMakeConfig {...@@ -844,6 +849,7 @@ fn parseConfigH(b: *std.Build, config_h_text: []const u8) ?CMakeConfig {
844 .cmake_static_library_prefix = undefined,849 .cmake_static_library_prefix = undefined,
845 .cmake_static_library_suffix = undefined,850 .cmake_static_library_suffix = undefined,
846 .cxx_compiler = undefined,851 .cxx_compiler = undefined,
852 .cxx_compiler_arg1 = "",
847 .lld_include_dir = undefined,853 .lld_include_dir = undefined,
848 .lld_libraries = undefined,854 .lld_libraries = undefined,
849 .clang_libraries = undefined,855 .clang_libraries = undefined,
...@@ -875,6 +881,10 @@ fn parseConfigH(b: *std.Build, config_h_text: []const u8) ?CMakeConfig {...@@ -875,6 +881,10 @@ fn parseConfigH(b: *std.Build, config_h_text: []const u8) ?CMakeConfig {
875 .prefix = "#define ZIG_CXX_COMPILER ",881 .prefix = "#define ZIG_CXX_COMPILER ",
876 .field = "cxx_compiler",882 .field = "cxx_compiler",
877 },883 },
884 .{
885 .prefix = "#define ZIG_CXX_COMPILER_ARG1 ",
886 .field = "cxx_compiler_arg1",
887 },
878 .{888 .{
879 .prefix = "#define ZIG_LLD_INCLUDE_PATH ",889 .prefix = "#define ZIG_LLD_INCLUDE_PATH ",
880 .field = "lld_include_dir",890 .field = "lld_include_dir",
...@@ -917,7 +927,8 @@ fn parseConfigH(b: *std.Build, config_h_text: []const u8) ?CMakeConfig {...@@ -917,7 +927,8 @@ fn parseConfigH(b: *std.Build, config_h_text: []const u8) ?CMakeConfig {
917 var it = mem.splitScalar(u8, line, '"');927 var it = mem.splitScalar(u8, line, '"');
918 _ = it.first(); // skip the stuff before the quote928 _ = it.first(); // skip the stuff before the quote
919 const quoted = it.next().?; // the stuff inside the quote929 const quoted = it.next().?; // the stuff inside the quote
920 @field(ctx, mapping.field) = toNativePathSep(b, quoted);930 const trimmed = mem.trim(u8, quoted, " ");
931 @field(ctx, mapping.field) = toNativePathSep(b, trimmed);
921 }932 }
922 }933 }
923 if (mem.startsWith(u8, line, "#define ZIG_LLVM_LINK_MODE ")) {934 if (mem.startsWith(u8, line, "#define ZIG_LLVM_LINK_MODE ")) {
stage1/config.h.in+1
...@@ -21,6 +21,7 @@...@@ -21,6 +21,7 @@
21#define ZIG_CMAKE_STATIC_LIBRARY_PREFIX "@CMAKE_STATIC_LIBRARY_PREFIX@"21#define ZIG_CMAKE_STATIC_LIBRARY_PREFIX "@CMAKE_STATIC_LIBRARY_PREFIX@"
22#define ZIG_CMAKE_STATIC_LIBRARY_SUFFIX "@CMAKE_STATIC_LIBRARY_SUFFIX@"22#define ZIG_CMAKE_STATIC_LIBRARY_SUFFIX "@CMAKE_STATIC_LIBRARY_SUFFIX@"
23#define ZIG_CXX_COMPILER "@CMAKE_CXX_COMPILER@"23#define ZIG_CXX_COMPILER "@CMAKE_CXX_COMPILER@"
24#define ZIG_CXX_COMPILER_ARG1 "@CMAKE_CXX_COMPILER_ARG1@"
24#define ZIG_DIA_GUIDS_LIB "@ZIG_DIA_GUIDS_LIB_ESCAPED@"25#define ZIG_DIA_GUIDS_LIB "@ZIG_DIA_GUIDS_LIB_ESCAPED@"
25#define ZIG_LLD_INCLUDE_PATH "@LLD_INCLUDE_DIRS@"26#define ZIG_LLD_INCLUDE_PATH "@LLD_INCLUDE_DIRS@"
26#define ZIG_LLD_LIBRARIES "@LLD_LIBRARIES@"27#define ZIG_LLD_LIBRARIES "@LLD_LIBRARIES@"