fix the build on windows

This commit is contained in:
Andrew Kelley 2019-07-15 01:41:06 -04:00
parent aa170a7eff
commit b23ace27db
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
5 changed files with 43 additions and 20 deletions

View File

@ -1229,6 +1229,9 @@ int main(int argc, char **argv) {
return term.code;
} else if (cmd == CmdBuild) {
if (g->enable_cache) {
#if defined(ZIG_OS_WINDOWS)
buf_replace(&g->output_file_path, '/', '\\');
#endif
if (printf("%s\n", buf_ptr(&g->output_file_path)) < 0)
return EXIT_FAILURE;
}

View File

@ -216,6 +216,17 @@ pub const Builder = struct {
return mem.dupe(self.allocator, u8, bytes) catch unreachable;
}
fn dupePath(self: *Builder, bytes: []const u8) []u8 {
const the_copy = self.dupe(bytes);
for (the_copy) |*byte| {
switch (byte.*) {
'/', '\\' => byte.* = fs.path.sep,
else => {},
}
}
return the_copy;
}
pub fn addWriteFile(self: *Builder, file_path: []const u8, data: []const u8) *WriteFileStep {
const write_file_step = self.allocator.create(WriteFileStep) catch unreachable;
write_file_step.* = WriteFileStep.init(self, file_path, data);
@ -1412,7 +1423,7 @@ pub const LibExeObjStep = struct {
}
pub fn setOutputDir(self: *LibExeObjStep, dir: []const u8) void {
self.output_dir = self.builder.dupe(dir);
self.output_dir = self.builder.dupePath(dir);
}
pub fn install(self: *LibExeObjStep) void {

View File

@ -110,7 +110,6 @@ pub fn updateFileMode(source_path: []const u8, dest_path: []const u8, mode: ?Fil
}
}
const actual_mode = mode orelse src_stat.mode;
const in_stream = &src_file.inStream().stream;
// TODO this logic could be made more efficient by calling makePath, once
// that API does not require an allocator
@ -137,6 +136,8 @@ pub fn updateFileMode(source_path: []const u8, dest_path: []const u8, mode: ?Fil
} else unreachable;
defer atomic_file.deinit();
const in_stream = &src_file.inStream().stream;
var buf: [mem.page_size * 6]u8 = undefined;
while (true) {
const amt = try in_stream.readFull(buf[0..]);

View File

@ -224,13 +224,13 @@ pub const File = struct {
mode: Mode,
/// access time in nanoseconds
atime: u64,
atime: i64,
/// last modification time in nanoseconds
mtime: u64,
mtime: i64,
/// creation time in nanoseconds
ctime: u64,
ctime: i64,
};
pub const StatError = os.FStatError;
@ -251,9 +251,9 @@ pub const File = struct {
return Stat{
.size = @bitCast(u64, st.size),
.mode = st.mode,
.atime = @bitCast(usize, st.atim.tv_sec) * std.time.ns_per_s + @bitCast(usize, st.atim.tv_nsec),
.mtime = @bitCast(usize, st.mtim.tv_sec) * std.time.ns_per_s + @bitCast(usize, st.mtim.tv_nsec),
.ctime = @bitCast(usize, st.ctim.tv_sec) * std.time.ns_per_s + @bitCast(usize, st.ctim.tv_nsec),
.atime = st.atim.tv_sec * std.time.ns_per_s + st.atim.tv_nsec,
.mtime = st.mtim.tv_sec * std.time.ns_per_s + st.mtim.tv_nsec,
.ctime = st.ctim.tv_sec * std.time.ns_per_s + st.ctim.tv_nsec,
};
}
@ -261,7 +261,7 @@ pub const File = struct {
/// `atime`: access timestamp in nanoseconds
/// `mtime`: last modification timestamp in nanoseconds
pub fn updateTimes(self: File, atime: u64, mtime: u64) UpdateTimesError!void {
pub fn updateTimes(self: File, atime: i64, mtime: i64) UpdateTimesError!void {
if (windows.is_the_target) {
const atime_ft = windows.nanoSecondsToFileTime(atime);
const mtime_ft = windows.nanoSecondsToFileTime(mtime);
@ -269,12 +269,12 @@ pub const File = struct {
}
const times = [2]os.timespec{
os.timespec{
.tv_sec = @bitCast(isize, atime / std.time.ns_per_s),
.tv_nsec = @bitCast(isize, atime % std.time.ns_per_s),
.tv_sec = atime / std.time.ns_per_s,
.tv_nsec = atime % std.time.ns_per_s,
},
os.timespec{
.tv_sec = @bitCast(isize, mtime / std.time.ns_per_s),
.tv_nsec = @bitCast(isize, mtime % std.time.ns_per_s),
.tv_sec = mtime / std.time.ns_per_s,
.tv_nsec = mtime % std.time.ns_per_s,
},
};
try os.futimens(self.handle, &times);

View File

@ -783,16 +783,24 @@ pub fn SetFileTime(
}
}
pub fn fileTimeToNanoSeconds(ft: FILETIME) u64 {
const sec = (u64(ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
return sec * std.time.ns_per_s;
/// A file time is a 64-bit value that represents the number of 100-nanosecond
/// intervals that have elapsed since 12:00 A.M. January 1, 1601 Coordinated
/// Universal Time (UTC).
/// This function returns the number of nanoseconds since the canonical epoch,
/// which is the POSIX one (Jan 01, 1970 AD).
pub fn fileTimeToNanoSeconds(ft: FILETIME) i64 {
const hns = @bitCast(i64, (u64(ft.dwHighDateTime) << 32) | ft.dwLowDateTime);
const adjusted_epoch = hns + std.time.epoch.windows * (std.time.ns_per_s / 100);
return adjusted_epoch * 100;
}
pub fn nanoSecondsToFileTime(ns: u64) FILETIME {
const sec = ns / std.time.ns_per_s;
/// Converts a number of nanoseconds since the POSIX epoch to a Windows FILETIME.
pub fn nanoSecondsToFileTime(ns: i64) FILETIME {
const hns = @divFloor(ns, 100);
const adjusted_epoch = hns - std.time.epoch.windows * (std.time.ns_per_s / 100);
return FILETIME{
.dwHighDateTime = @truncate(u32, sec >> 32),
.dwLowDateTime = @truncate(u32, sec),
.dwHighDateTime = @truncate(u32, @bitCast(u64, adjusted_epoch) >> 32),
.dwLowDateTime = @truncate(u32, @bitCast(u64, adjusted_epoch)),
};
}