diff --git a/bootstrap/Compilation.zig b/bootstrap/Compilation.zig index b5e4e9c..a7ace66 100644 --- a/bootstrap/Compilation.zig +++ b/bootstrap/Compilation.zig @@ -41,6 +41,7 @@ const installation_dir_name = "installation"; const ArgumentParsingError = error{ main_package_path_not_specified, + main_source_file_not_found, }; fn reportUnterminatedArgumentError(string: []const u8) noreturn { @@ -57,6 +58,7 @@ fn parseArguments(compilation: *const Compilation) !Compilation.Module.Descripto var should_transpile_to_c: ?bool = null; var maybe_only_parse: ?bool = null; var link_libc = false; + var maybe_executable_name: ?[]const u8 = null; if (arguments.len == 0) { // foo @@ -165,8 +167,26 @@ fn parseArguments(compilation: *const Compilation) !Compilation.Module.Descripto } else { reportUnterminatedArgumentError(current_argument); } + } else if (equal(u8, current_argument, "-main_source_file")) { + if (i + 1 != arguments.len) { + i += 1; + + const arg = arguments[i]; + maybe_main_package_path = arg; + } else { + reportUnterminatedArgumentError(current_argument); + } + } else if (equal(u8, current_argument, "-name")) { + if (i + 1 != arguments.len) { + i += 1; + + const arg = arguments[i]; + maybe_executable_name = arg; + } else { + reportUnterminatedArgumentError(current_argument); + } } else { - maybe_main_package_path = current_argument; + std.debug.panic("Unrecognized argument: {s}", .{current_argument}); } } } @@ -177,7 +197,12 @@ fn parseArguments(compilation: *const Compilation) !Compilation.Module.Descripto const only_parse = maybe_only_parse orelse false; var is_build = false; - const main_package_path = if (maybe_main_package_path) |path| path else blk: { + const main_package_path = if (maybe_main_package_path) |path| blk: { + const file = std.fs.cwd().openFile(path, .{}) catch return error.main_source_file_not_found; + file.close(); + + break :blk path; + } else blk: { const build_file = "build.nat"; const file = std.fs.cwd().openFile(build_file, .{}) catch return error.main_package_path_not_specified; file.close(); @@ -187,7 +212,12 @@ fn parseArguments(compilation: *const Compilation) !Compilation.Module.Descripto }; const executable_path = maybe_executable_path orelse blk: { - const executable_name = if (is_build) "build" else std.fs.path.basename(main_package_path[0 .. main_package_path.len - "/main.nat".len]); + const executable_name = if (is_build) b: { + assert(maybe_executable_name == null); + break :b "build"; + } else b: { + break :b if (maybe_executable_name) |name| name else std.fs.path.basename(main_package_path[0 .. main_package_path.len - "/main.nat".len]); + }; assert(executable_name.len > 0); const result = try std.mem.concat(allocator, u8, &.{ "nat/", executable_name }); break :blk result; diff --git a/ci.sh b/ci.sh index e369771..b1c5c1a 100755 --- a/ci.sh +++ b/ci.sh @@ -26,7 +26,7 @@ nat_compiler=$my_current_directory/zig-out/bin/nat for standalone_test_case in $standalone_test_directory_files do STANDALONE_TEST_NAME=${standalone_test_case##*/} - $nat_compiler $standalone_test_case/main.nat + $nat_compiler -main_source_file $standalone_test_case/main.nat if [[ "$?" == "0" ]]; then passed_compilation_count=$(($passed_compilation_count + 1)) @@ -66,7 +66,7 @@ do if [[ "$?" == "0" ]]; then passed_compilation_count=$(($passed_compilation_count + 1)) if [[ "$OSTYPE" == "linux-gnu"* ]]; then - nat/src + nat/$MY_TESTNAME if [[ "$?" == "0" ]]; then passed_test_count=$(($passed_test_count + 1)) diff --git a/lib/init/build.nat b/lib/init/build.nat index 5096f83..5971651 100644 --- a/lib/init/build.nat +++ b/lib/init/build.nat @@ -10,6 +10,7 @@ const main = fn () s32 { .abi = .gnu, }, .main_source_path = "src/main.nat", + .name = "exe", }; if (executable.compile()) { diff --git a/lib/std/build.nat b/lib/std/build.nat index 2c3eaff..7f5d6d5 100644 --- a/lib/std/build.nat +++ b/lib/std/build.nat @@ -7,6 +7,7 @@ const Executable = struct{ target: Target, main_source_path: [:0]const u8, link_libc: bool = false, + name: []const u8, const compile = fn(executable: Executable) bool { const argument_count = std.start.argument_count; @@ -21,7 +22,7 @@ const Executable = struct{ const compile_with_compiler_path = fn(executable: Executable, compiler_path: [&:0]const u8) bool { if (std.os.duplicate_process()) |pid| { if (pid == 0) { - const argv = [_:null] ?[&:0]const u8{ compiler_path, #cast(executable.main_source_path.ptr), "-link_libc", if (executable.link_libc) "true" else "false"}; + const argv = [_:null] ?[&:0]const u8{ compiler_path, "-main_source_file", #cast(executable.main_source_path.ptr), "-link_libc", if (executable.link_libc) "true" else "false", "-name", #cast(executable.name.ptr) }; std.os.execute(path = compiler_path, argv = argv.&, env = std.start.environment_values); return true; } else { diff --git a/lib/std/os.nat b/lib/std/os.nat index eec940c..75c2416 100644 --- a/lib/std/os.nat +++ b/lib/std/os.nat @@ -352,6 +352,23 @@ const waitpid = fn(pid: Process.Id, flags: u32) ?u32 { } +const memfd_create = fn(name: [&:0]const u8, flags: u32) ?FileDescriptor{ + switch (current) { + .linux => { + if (linux.unwrapSyscall(syscall_result = linux.memfd_create(path, flags))) |raw_result| { + const file_descriptor = FileDescriptor{ + .handle = #cast(raw_result), + }; + + return file_descriptor; + } else { + return null; + } + }, + else => #error("OS not supported"), + } +} + const IoChannelBehavior = enum{ pipe, close, diff --git a/lib/std/os/linux.nat b/lib/std/os/linux.nat index 5e23615..f19c472 100644 --- a/lib/std/os/linux.nat +++ b/lib/std/os/linux.nat @@ -485,6 +485,11 @@ const poll = fn(file_descriptors: [&]PollFileDescriptor, file_descriptor_count: return result; } +const memfd_create = fn(name: [&:0]const u8, flags: u32) usize { + const result = #syscall(#cast(Syscall.memfd_create), flags); + return result; +} + const unwrapSyscall = fn(syscall_result: usize) ?usize { const signed_syscall_result: ssize = #cast(syscall_result); if (signed_syscall_result >= 0) { diff --git a/test/integral/first/build.nat b/test/integral/first/build.nat index 5096f83..74ae495 100644 --- a/test/integral/first/build.nat +++ b/test/integral/first/build.nat @@ -10,6 +10,7 @@ const main = fn () s32 { .abi = .gnu, }, .main_source_path = "src/main.nat", + .name = "first", }; if (executable.compile()) { diff --git a/test/integral/link_libc/build.nat b/test/integral/link_libc/build.nat index cfb4328..f2bd063 100644 --- a/test/integral/link_libc/build.nat +++ b/test/integral/link_libc/build.nat @@ -11,6 +11,7 @@ const main = fn () s32 { }, .main_source_path = "src/main.nat", .link_libc = true, + .name = "link_libc", }; if (executable.compile()) {