authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-10-19 09:34:35-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-10-19 09:34:35-04:00
log8a344fab3908e1b793fe8f9590696142aee2a1be
tree4c16400718fb200acd2e7766454520dfa90f6772
parent7d6596e979df799782b77ce3fed722b792509388
parentcb635e084b0c36e3c7a6bf63f49f7e7e9918532d
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #13036 from BratishkaErik/fix-installing


8 files changed, 77 insertions(+), 34 deletions(-)

CMakeLists.txt+10-11
...@@ -1017,9 +1017,9 @@ if("${ZIG_EXECUTABLE}" STREQUAL "")...@@ -1017,9 +1017,9 @@ if("${ZIG_EXECUTABLE}" STREQUAL "")
1017 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"1017 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
1018 )1018 )
1019 if (WIN32)1019 if (WIN32)
1020 set(ZIG_EXECUTABLE "${zig2_BINARY_DIR}/zig2.exe")1020 set(ZIG_EXECUTABLE "${CMAKE_BINARY_DIR}/zig2.exe")
1021 else()1021 else()
1022 set(ZIG_EXECUTABLE "${zig2_BINARY_DIR}/zig2")1022 set(ZIG_EXECUTABLE "${CMAKE_BINARY_DIR}/zig2")
1023 endif()1023 endif()
1024else()1024else()
1025 add_custom_command(1025 add_custom_command(
...@@ -1045,15 +1045,8 @@ elseif(MINGW)...@@ -1045,15 +1045,8 @@ elseif(MINGW)
1045 target_link_libraries(zig2 ntdll)1045 target_link_libraries(zig2 ntdll)
1046endif()1046endif()
10471047
1048# Dummy install command so that the "install" target is not missing.1048set(ZIG_BUILD_ARGS
1049# This is redundant from the "stage3" custom target below.
1050if(NOT ZIG_SKIP_INSTALL_LIB_FILES)
1051 install(FILES "lib/compiler_rt.zig" DESTINATION "lib/zig")
1052endif()
1053
1054set(ZIG_INSTALL_ARGS "build"
1055 --zig-lib-dir "${CMAKE_SOURCE_DIR}/lib"1049 --zig-lib-dir "${CMAKE_SOURCE_DIR}/lib"
1056 --prefix "${CMAKE_INSTALL_PREFIX}"
1057 "-Dconfig_h=${ZIG_CONFIG_H_OUT}"1050 "-Dconfig_h=${ZIG_CONFIG_H_OUT}"
1058 "-Denable-llvm"1051 "-Denable-llvm"
1059 "-Denable-stage1"1052 "-Denable-stage1"
...@@ -1067,8 +1060,14 @@ set(ZIG_INSTALL_ARGS "build"...@@ -1067,8 +1060,14 @@ set(ZIG_INSTALL_ARGS "build"
1067)1060)
10681061
1069add_custom_target(stage3 ALL1062add_custom_target(stage3 ALL
1070 COMMAND zig2 ${ZIG_INSTALL_ARGS}1063 COMMAND zig2 build compile ${ZIG_BUILD_ARGS}
1071 DEPENDS zig21064 DEPENDS zig2
1072 COMMENT STATUS "Building stage3"1065 COMMENT STATUS "Building stage3"
1073 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"1066 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
1074)1067)
1068
1069install(CODE "set(ZIG_EXECUTABLE \"${ZIG_EXECUTABLE}\")")
1070install(CODE "set(ZIG_BUILD_ARGS \"${ZIG_BUILD_ARGS}\")")
1071install(CODE "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")")
1072install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")
1073install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install.cmake")
build.zig+4
...@@ -142,6 +142,10 @@ pub fn build(b: *Builder) !void {...@@ -142,6 +142,10 @@ pub fn build(b: *Builder) !void {
142 };142 };
143143
144 const exe = b.addExecutable("zig", main_file);144 const exe = b.addExecutable("zig", main_file);
145
146 const compile_step = b.step("compile", "Build the self-hosted compiler");
147 compile_step.dependOn(&exe.step);
148
145 exe.stack_size = stack_size;149 exe.stack_size = stack_size;
146 exe.strip = strip;150 exe.strip = strip;
147 exe.sanitize_thread = sanitize_thread;151 exe.sanitize_thread = sanitize_thread;
cmake/install.cmake created+27
...@@ -0,0 +1,27 @@
1set(ZIG_INSTALL_ARGS build ${ZIG_BUILD_ARGS} --prefix "${CMAKE_INSTALL_PREFIX}")
2execute_process(
3 COMMAND "${ZIG_EXECUTABLE}" ${ZIG_INSTALL_ARGS}
4 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
5 RESULT_VARIABLE _result)
6
7if(_result)
8 message("::")
9 message(":: ERROR: ${_result}")
10 message(":: (execute_process)")
11
12 list(JOIN ZIG_INSTALL_ARGS " " s_INSTALL_LIBSTAGE2_ARGS)
13 message("::")
14 message(":: argv: ${ZIG_EXECUTABLE} ${s_INSTALL_LIBSTAGE2_ARGS}")
15
16 set(_args ${ZIG_EXECUTABLE} ${ZIG_INSTALL_ARGS})
17 list(LENGTH _args _len)
18 math(EXPR _len "${_len} - 1")
19 message("::")
20 foreach(_i RANGE 0 ${_len})
21 list(GET _args ${_i} _arg)
22 message(":: argv[${_i}]: ${_arg}")
23 endforeach()
24
25 message("::")
26 message(FATAL_ERROR)
27endif()
lib/std/os/windows.zig+1
...@@ -134,6 +134,7 @@ pub fn OpenFile(sub_path_w: []const u16, options: OpenFileOptions) OpenError!HAN...@@ -134,6 +134,7 @@ pub fn OpenFile(sub_path_w: []const u16, options: OpenFileOptions) OpenError!HAN
134 .OBJECT_NAME_COLLISION => return error.PathAlreadyExists,134 .OBJECT_NAME_COLLISION => return error.PathAlreadyExists,
135 .FILE_IS_A_DIRECTORY => return error.IsDir,135 .FILE_IS_A_DIRECTORY => return error.IsDir,
136 .NOT_A_DIRECTORY => return error.NotDir,136 .NOT_A_DIRECTORY => return error.NotDir,
137 .INVALID_HANDLE => unreachable,
137 else => return unexpectedStatus(rc),138 else => return unexpectedStatus(rc),
138 }139 }
139}140}
lib/std/zig/system/NativePaths.zig+6-7
...@@ -96,7 +96,7 @@ pub fn detect(allocator: Allocator, native_info: NativeTargetInfo) !NativePaths...@@ -96,7 +96,7 @@ pub fn detect(allocator: Allocator, native_info: NativeTargetInfo) !NativePaths
96 return self;96 return self;
97 }97 }
9898
99 if (comptime native_target.os.tag == .solaris) {99 if (builtin.os.tag == .solaris) {
100 try self.addLibDir("/usr/lib/64");100 try self.addLibDir("/usr/lib/64");
101 try self.addLibDir("/usr/local/lib/64");101 try self.addLibDir("/usr/local/lib/64");
102 try self.addLibDir("/lib/64");102 try self.addLibDir("/lib/64");
...@@ -107,7 +107,7 @@ pub fn detect(allocator: Allocator, native_info: NativeTargetInfo) !NativePaths...@@ -107,7 +107,7 @@ pub fn detect(allocator: Allocator, native_info: NativeTargetInfo) !NativePaths
107 return self;107 return self;
108 }108 }
109109
110 if (native_target.os.tag != .windows) {110 if (builtin.os.tag != .windows) {
111 const triple = try native_target.linuxTriple(allocator);111 const triple = try native_target.linuxTriple(allocator);
112 defer allocator.free(triple);112 defer allocator.free(triple);
113113
...@@ -136,11 +136,10 @@ pub fn detect(allocator: Allocator, native_info: NativeTargetInfo) !NativePaths...@@ -136,11 +136,10 @@ pub fn detect(allocator: Allocator, native_info: NativeTargetInfo) !NativePaths
136 // libz.so.1 is in /lib/x86_64-linux-gnu (added here)136 // libz.so.1 is in /lib/x86_64-linux-gnu (added here)
137 try self.addLibDirFmt("/lib/{s}", .{triple});137 try self.addLibDirFmt("/lib/{s}", .{triple});
138138
139 // NOTE: distro like guix doesn't use FHS, so it relies on envorinment139 // Distros like guix don't use FHS, so they rely on environment
140 // variables (C_INCLUDE_PATH, CPLUS_INCLUDE_PATH and LIBRARY_PATH) to140 // variables to search for headers and libraries.
141 // search for headers and libraries141 // We use os.getenv here since this part won't be executed on
142 // NOTE: we use os.getenv here since this part won't be executed on142 // windows, to get rid of unnecessary error handling.
143 // windows, to get rid of unnecessary error handling
144 if (std.os.getenv("C_INCLUDE_PATH")) |c_include_path| {143 if (std.os.getenv("C_INCLUDE_PATH")) |c_include_path| {
145 var it = mem.tokenize(u8, c_include_path, ":");144 var it = mem.tokenize(u8, c_include_path, ":");
146 while (it.next()) |dir| {145 while (it.next()) |dir| {
src/Compilation.zig+22-7
...@@ -1109,11 +1109,6 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {...@@ -1109,11 +1109,6 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
11091109
1110 const use_stage1 = options.use_stage1 orelse false;1110 const use_stage1 = options.use_stage1 orelse false;
11111111
1112 const cache_mode = if (use_stage1 and !options.disable_lld_caching)
1113 CacheMode.whole
1114 else
1115 options.cache_mode;
1116
1117 // Make a decision on whether to use LLVM or our own backend.1112 // Make a decision on whether to use LLVM or our own backend.
1118 const use_llvm = build_options.have_llvm and blk: {1113 const use_llvm = build_options.have_llvm and blk: {
1119 if (options.use_llvm) |explicit|1114 if (options.use_llvm) |explicit|
...@@ -1154,6 +1149,14 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {...@@ -1154,6 +1149,14 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
1154 }1149 }
1155 }1150 }
11561151
1152 // TODO: once we support incremental compilation for the LLVM backend via
1153 // saving the LLVM module into a bitcode file and restoring it, along with
1154 // compiler state, the second clause here can be removed so that incremental
1155 // cache mode is used for LLVM backend too. We need some fuzz testing before
1156 // that can be enabled.
1157 const cache_mode = if ((use_stage1 and !options.disable_lld_caching) or
1158 (use_llvm and !options.disable_lld_caching)) CacheMode.whole else options.cache_mode;
1159
1157 const tsan = options.want_tsan orelse false;1160 const tsan = options.want_tsan orelse false;
1158 // TSAN is implemented in C++ so it requires linking libc++.1161 // TSAN is implemented in C++ so it requires linking libc++.
1159 const link_libcpp = options.link_libcpp or tsan;1162 const link_libcpp = options.link_libcpp or tsan;
...@@ -2387,9 +2390,21 @@ pub fn update(comp: *Compilation) !void {...@@ -2387,9 +2390,21 @@ pub fn update(comp: *Compilation) !void {
2387 const o_sub_path = try std.fs.path.join(comp.gpa, &[_][]const u8{ "o", &digest });2390 const o_sub_path = try std.fs.path.join(comp.gpa, &[_][]const u8{ "o", &digest });
2388 defer comp.gpa.free(o_sub_path);2391 defer comp.gpa.free(o_sub_path);
23892392
2393 // Work around windows `AccessDenied` if any files within this directory are open
2394 // by doing the makeExecutable/makeWritable dance.
2395 const need_writable_dance = builtin.os.tag == .windows and comp.bin_file.file != null;
2396 if (need_writable_dance) {
2397 try comp.bin_file.makeExecutable();
2398 }
2399
2390 try comp.bin_file.renameTmpIntoCache(comp.local_cache_directory, tmp_dir_sub_path, o_sub_path);2400 try comp.bin_file.renameTmpIntoCache(comp.local_cache_directory, tmp_dir_sub_path, o_sub_path);
2391 comp.wholeCacheModeSetBinFilePath(&digest);2401 comp.wholeCacheModeSetBinFilePath(&digest);
23922402
2403 // Has to be after the `wholeCacheModeSetBinFilePath` above.
2404 if (need_writable_dance) {
2405 try comp.bin_file.makeWritable();
2406 }
2407
2393 // This is intentionally sandwiched between renameTmpIntoCache() and writeManifest().2408 // This is intentionally sandwiched between renameTmpIntoCache() and writeManifest().
2394 if (comp.bin_file.options.module) |module| {2409 if (comp.bin_file.options.module) |module| {
2395 // We need to set the zig_cache_artifact_directory for -femit-asm, -femit-llvm-ir,2410 // We need to set the zig_cache_artifact_directory for -femit-asm, -femit-llvm-ir,
...@@ -3204,8 +3219,8 @@ fn processOneJob(comp: *Compilation, job: Job) !void {...@@ -3204,8 +3219,8 @@ fn processOneJob(comp: *Compilation, job: Job) !void {
3204 // TODO Surface more error details.3219 // TODO Surface more error details.
3205 comp.lockAndSetMiscFailure(3220 comp.lockAndSetMiscFailure(
3206 .mingw_crt_file,3221 .mingw_crt_file,
3207 "unable to build mingw-w64 CRT file: {s}",3222 "unable to build mingw-w64 CRT file {s}: {s}",
3208 .{@errorName(err)},3223 .{ @tagName(crt_file), @errorName(err) },
3209 );3224 );
3210 };3225 };
3211 },3226 },
src/link.zig+6-8
...@@ -403,10 +403,8 @@ pub const File = struct {...@@ -403,10 +403,8 @@ pub const File = struct {
403 try emit.directory.handle.copyFile(emit.sub_path, emit.directory.handle, emit.sub_path, .{});403 try emit.directory.handle.copyFile(emit.sub_path, emit.directory.handle, emit.sub_path, .{});
404 }404 }
405 }405 }
406 if (base.intermediary_basename == null) {406 f.close();
407 f.close();407 base.file = null;
408 base.file = null;
409 }
410 },408 },
411 .coff, .elf, .plan9, .wasm => if (base.file) |f| {409 .coff, .elf, .plan9, .wasm => if (base.file) |f| {
412 if (base.intermediary_basename != null) {410 if (base.intermediary_basename != null) {
...@@ -777,7 +775,7 @@ pub const File = struct {...@@ -777,7 +775,7 @@ pub const File = struct {
777 _ = base;775 _ = base;
778 while (true) {776 while (true) {
779 if (builtin.os.tag == .windows) {777 if (builtin.os.tag == .windows) {
780 // workaround windows `renameW` can't fail with `PathAlreadyExists`778 // Work around windows `renameW` can't fail with `PathAlreadyExists`
781 // See https://github.com/ziglang/zig/issues/8362779 // See https://github.com/ziglang/zig/issues/8362
782 if (cache_directory.handle.access(o_sub_path, .{})) |_| {780 if (cache_directory.handle.access(o_sub_path, .{})) |_| {
783 try cache_directory.handle.deleteTree(o_sub_path);781 try cache_directory.handle.deleteTree(o_sub_path);
...@@ -791,9 +789,9 @@ pub const File = struct {...@@ -791,9 +789,9 @@ pub const File = struct {
791 tmp_dir_sub_path,789 tmp_dir_sub_path,
792 cache_directory.handle,790 cache_directory.handle,
793 o_sub_path,791 o_sub_path,
794 ) catch |err| switch (err) {792 ) catch |err| {
795 error.AccessDenied => unreachable, // We are most likely trying to move a dir with open handles to its resources793 log.err("unable to rename cache dir {s} to {s}: {s}", .{ tmp_dir_sub_path, o_sub_path, @errorName(err) });
796 else => |e| return e,794 return err;
797 };795 };
798 break;796 break;
799 } else {797 } else {
src/link/Elf.zig+1-1
...@@ -1282,7 +1282,7 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v...@@ -1282,7 +1282,7 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v
1282 // linked are in the hash that namespaces the directory we are outputting to. Therefore,1282 // linked are in the hash that namespaces the directory we are outputting to. Therefore,
1283 // we must hash those now, and the resulting digest will form the "id" of the linking1283 // we must hash those now, and the resulting digest will form the "id" of the linking
1284 // job we are about to perform.1284 // job we are about to perform.
1285 // After a successful link, we store the id in the metadata of a symlink named "id.txt" in1285 // After a successful link, we store the id in the metadata of a symlink named "lld.id" in
1286 // the artifact directory. So, now, we check if this symlink exists, and if it matches1286 // the artifact directory. So, now, we check if this symlink exists, and if it matches
1287 // our digest. If so, we can skip linking. Otherwise, we proceed with invoking LLD.1287 // our digest. If so, we can skip linking. Otherwise, we proceed with invoking LLD.
1288 const id_symlink_basename = "lld.id";1288 const id_symlink_basename = "lld.id";