mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 12:59:04 +00:00
Merge pull request #13036 from BratishkaErik/fix-installing
This commit is contained in:
commit
8a344fab39
@ -1017,9 +1017,9 @@ if("${ZIG_EXECUTABLE}" STREQUAL "")
|
||||
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
||||
)
|
||||
if (WIN32)
|
||||
set(ZIG_EXECUTABLE "${zig2_BINARY_DIR}/zig2.exe")
|
||||
set(ZIG_EXECUTABLE "${CMAKE_BINARY_DIR}/zig2.exe")
|
||||
else()
|
||||
set(ZIG_EXECUTABLE "${zig2_BINARY_DIR}/zig2")
|
||||
set(ZIG_EXECUTABLE "${CMAKE_BINARY_DIR}/zig2")
|
||||
endif()
|
||||
else()
|
||||
add_custom_command(
|
||||
@ -1045,15 +1045,8 @@ elseif(MINGW)
|
||||
target_link_libraries(zig2 ntdll)
|
||||
endif()
|
||||
|
||||
# Dummy install command so that the "install" target is not missing.
|
||||
# This is redundant from the "stage3" custom target below.
|
||||
if(NOT ZIG_SKIP_INSTALL_LIB_FILES)
|
||||
install(FILES "lib/compiler_rt.zig" DESTINATION "lib/zig")
|
||||
endif()
|
||||
|
||||
set(ZIG_INSTALL_ARGS "build"
|
||||
set(ZIG_BUILD_ARGS
|
||||
--zig-lib-dir "${CMAKE_SOURCE_DIR}/lib"
|
||||
--prefix "${CMAKE_INSTALL_PREFIX}"
|
||||
"-Dconfig_h=${ZIG_CONFIG_H_OUT}"
|
||||
"-Denable-llvm"
|
||||
"-Denable-stage1"
|
||||
@ -1067,8 +1060,14 @@ set(ZIG_INSTALL_ARGS "build"
|
||||
)
|
||||
|
||||
add_custom_target(stage3 ALL
|
||||
COMMAND zig2 ${ZIG_INSTALL_ARGS}
|
||||
COMMAND zig2 build compile ${ZIG_BUILD_ARGS}
|
||||
DEPENDS zig2
|
||||
COMMENT STATUS "Building stage3"
|
||||
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
||||
)
|
||||
|
||||
install(CODE "set(ZIG_EXECUTABLE \"${ZIG_EXECUTABLE}\")")
|
||||
install(CODE "set(ZIG_BUILD_ARGS \"${ZIG_BUILD_ARGS}\")")
|
||||
install(CODE "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")")
|
||||
install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")
|
||||
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install.cmake")
|
||||
|
||||
@ -142,6 +142,10 @@ pub fn build(b: *Builder) !void {
|
||||
};
|
||||
|
||||
const exe = b.addExecutable("zig", main_file);
|
||||
|
||||
const compile_step = b.step("compile", "Build the self-hosted compiler");
|
||||
compile_step.dependOn(&exe.step);
|
||||
|
||||
exe.stack_size = stack_size;
|
||||
exe.strip = strip;
|
||||
exe.sanitize_thread = sanitize_thread;
|
||||
|
||||
27
cmake/install.cmake
Normal file
27
cmake/install.cmake
Normal file
@ -0,0 +1,27 @@
|
||||
set(ZIG_INSTALL_ARGS build ${ZIG_BUILD_ARGS} --prefix "${CMAKE_INSTALL_PREFIX}")
|
||||
execute_process(
|
||||
COMMAND "${ZIG_EXECUTABLE}" ${ZIG_INSTALL_ARGS}
|
||||
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
||||
RESULT_VARIABLE _result)
|
||||
|
||||
if(_result)
|
||||
message("::")
|
||||
message(":: ERROR: ${_result}")
|
||||
message(":: (execute_process)")
|
||||
|
||||
list(JOIN ZIG_INSTALL_ARGS " " s_INSTALL_LIBSTAGE2_ARGS)
|
||||
message("::")
|
||||
message(":: argv: ${ZIG_EXECUTABLE} ${s_INSTALL_LIBSTAGE2_ARGS}")
|
||||
|
||||
set(_args ${ZIG_EXECUTABLE} ${ZIG_INSTALL_ARGS})
|
||||
list(LENGTH _args _len)
|
||||
math(EXPR _len "${_len} - 1")
|
||||
message("::")
|
||||
foreach(_i RANGE 0 ${_len})
|
||||
list(GET _args ${_i} _arg)
|
||||
message(":: argv[${_i}]: ${_arg}")
|
||||
endforeach()
|
||||
|
||||
message("::")
|
||||
message(FATAL_ERROR)
|
||||
endif()
|
||||
@ -134,6 +134,7 @@ pub fn OpenFile(sub_path_w: []const u16, options: OpenFileOptions) OpenError!HAN
|
||||
.OBJECT_NAME_COLLISION => return error.PathAlreadyExists,
|
||||
.FILE_IS_A_DIRECTORY => return error.IsDir,
|
||||
.NOT_A_DIRECTORY => return error.NotDir,
|
||||
.INVALID_HANDLE => unreachable,
|
||||
else => return unexpectedStatus(rc),
|
||||
}
|
||||
}
|
||||
|
||||
@ -96,7 +96,7 @@ pub fn detect(allocator: Allocator, native_info: NativeTargetInfo) !NativePaths
|
||||
return self;
|
||||
}
|
||||
|
||||
if (comptime native_target.os.tag == .solaris) {
|
||||
if (builtin.os.tag == .solaris) {
|
||||
try self.addLibDir("/usr/lib/64");
|
||||
try self.addLibDir("/usr/local/lib/64");
|
||||
try self.addLibDir("/lib/64");
|
||||
@ -107,7 +107,7 @@ pub fn detect(allocator: Allocator, native_info: NativeTargetInfo) !NativePaths
|
||||
return self;
|
||||
}
|
||||
|
||||
if (native_target.os.tag != .windows) {
|
||||
if (builtin.os.tag != .windows) {
|
||||
const triple = try native_target.linuxTriple(allocator);
|
||||
defer allocator.free(triple);
|
||||
|
||||
@ -136,11 +136,10 @@ pub fn detect(allocator: Allocator, native_info: NativeTargetInfo) !NativePaths
|
||||
// libz.so.1 is in /lib/x86_64-linux-gnu (added here)
|
||||
try self.addLibDirFmt("/lib/{s}", .{triple});
|
||||
|
||||
// NOTE: distro like guix doesn't use FHS, so it relies on envorinment
|
||||
// variables (C_INCLUDE_PATH, CPLUS_INCLUDE_PATH and LIBRARY_PATH) to
|
||||
// search for headers and libraries
|
||||
// NOTE: we use os.getenv here since this part won't be executed on
|
||||
// windows, to get rid of unnecessary error handling
|
||||
// Distros like guix don't use FHS, so they rely on environment
|
||||
// variables to search for headers and libraries.
|
||||
// We use os.getenv here since this part won't be executed on
|
||||
// windows, to get rid of unnecessary error handling.
|
||||
if (std.os.getenv("C_INCLUDE_PATH")) |c_include_path| {
|
||||
var it = mem.tokenize(u8, c_include_path, ":");
|
||||
while (it.next()) |dir| {
|
||||
|
||||
@ -1109,11 +1109,6 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
|
||||
|
||||
const use_stage1 = options.use_stage1 orelse false;
|
||||
|
||||
const cache_mode = if (use_stage1 and !options.disable_lld_caching)
|
||||
CacheMode.whole
|
||||
else
|
||||
options.cache_mode;
|
||||
|
||||
// Make a decision on whether to use LLVM or our own backend.
|
||||
const use_llvm = build_options.have_llvm and blk: {
|
||||
if (options.use_llvm) |explicit|
|
||||
@ -1154,6 +1149,14 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: once we support incremental compilation for the LLVM backend via
|
||||
// saving the LLVM module into a bitcode file and restoring it, along with
|
||||
// compiler state, the second clause here can be removed so that incremental
|
||||
// cache mode is used for LLVM backend too. We need some fuzz testing before
|
||||
// that can be enabled.
|
||||
const cache_mode = if ((use_stage1 and !options.disable_lld_caching) or
|
||||
(use_llvm and !options.disable_lld_caching)) CacheMode.whole else options.cache_mode;
|
||||
|
||||
const tsan = options.want_tsan orelse false;
|
||||
// TSAN is implemented in C++ so it requires linking libc++.
|
||||
const link_libcpp = options.link_libcpp or tsan;
|
||||
@ -2387,9 +2390,21 @@ pub fn update(comp: *Compilation) !void {
|
||||
const o_sub_path = try std.fs.path.join(comp.gpa, &[_][]const u8{ "o", &digest });
|
||||
defer comp.gpa.free(o_sub_path);
|
||||
|
||||
// Work around windows `AccessDenied` if any files within this directory are open
|
||||
// by doing the makeExecutable/makeWritable dance.
|
||||
const need_writable_dance = builtin.os.tag == .windows and comp.bin_file.file != null;
|
||||
if (need_writable_dance) {
|
||||
try comp.bin_file.makeExecutable();
|
||||
}
|
||||
|
||||
try comp.bin_file.renameTmpIntoCache(comp.local_cache_directory, tmp_dir_sub_path, o_sub_path);
|
||||
comp.wholeCacheModeSetBinFilePath(&digest);
|
||||
|
||||
// Has to be after the `wholeCacheModeSetBinFilePath` above.
|
||||
if (need_writable_dance) {
|
||||
try comp.bin_file.makeWritable();
|
||||
}
|
||||
|
||||
// This is intentionally sandwiched between renameTmpIntoCache() and writeManifest().
|
||||
if (comp.bin_file.options.module) |module| {
|
||||
// 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 {
|
||||
// TODO Surface more error details.
|
||||
comp.lockAndSetMiscFailure(
|
||||
.mingw_crt_file,
|
||||
"unable to build mingw-w64 CRT file: {s}",
|
||||
.{@errorName(err)},
|
||||
"unable to build mingw-w64 CRT file {s}: {s}",
|
||||
.{ @tagName(crt_file), @errorName(err) },
|
||||
);
|
||||
};
|
||||
},
|
||||
|
||||
14
src/link.zig
14
src/link.zig
@ -403,10 +403,8 @@ pub const File = struct {
|
||||
try emit.directory.handle.copyFile(emit.sub_path, emit.directory.handle, emit.sub_path, .{});
|
||||
}
|
||||
}
|
||||
if (base.intermediary_basename == null) {
|
||||
f.close();
|
||||
base.file = null;
|
||||
}
|
||||
f.close();
|
||||
base.file = null;
|
||||
},
|
||||
.coff, .elf, .plan9, .wasm => if (base.file) |f| {
|
||||
if (base.intermediary_basename != null) {
|
||||
@ -777,7 +775,7 @@ pub const File = struct {
|
||||
_ = base;
|
||||
while (true) {
|
||||
if (builtin.os.tag == .windows) {
|
||||
// workaround windows `renameW` can't fail with `PathAlreadyExists`
|
||||
// Work around windows `renameW` can't fail with `PathAlreadyExists`
|
||||
// See https://github.com/ziglang/zig/issues/8362
|
||||
if (cache_directory.handle.access(o_sub_path, .{})) |_| {
|
||||
try cache_directory.handle.deleteTree(o_sub_path);
|
||||
@ -791,9 +789,9 @@ pub const File = struct {
|
||||
tmp_dir_sub_path,
|
||||
cache_directory.handle,
|
||||
o_sub_path,
|
||||
) catch |err| switch (err) {
|
||||
error.AccessDenied => unreachable, // We are most likely trying to move a dir with open handles to its resources
|
||||
else => |e| return e,
|
||||
) catch |err| {
|
||||
log.err("unable to rename cache dir {s} to {s}: {s}", .{ tmp_dir_sub_path, o_sub_path, @errorName(err) });
|
||||
return err;
|
||||
};
|
||||
break;
|
||||
} else {
|
||||
|
||||
@ -1282,7 +1282,7 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v
|
||||
// linked are in the hash that namespaces the directory we are outputting to. Therefore,
|
||||
// we must hash those now, and the resulting digest will form the "id" of the linking
|
||||
// job we are about to perform.
|
||||
// After a successful link, we store the id in the metadata of a symlink named "id.txt" in
|
||||
// After a successful link, we store the id in the metadata of a symlink named "lld.id" in
|
||||
// the artifact directory. So, now, we check if this symlink exists, and if it matches
|
||||
// our digest. If so, we can skip linking. Otherwise, we proceed with invoking LLD.
|
||||
const id_symlink_basename = "lld.id";
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user