From 0975e37b162478a0d35c1f4bab9a2d0fb51aa203 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 1 Oct 2017 15:51:55 -0400 Subject: [PATCH] fix implementation of --zig-std-dir see #463 --- src/codegen.cpp | 14 +++++--------- src/codegen.hpp | 4 ++-- src/link.cpp | 3 ++- src/main.cpp | 35 ++++++++++++++++++++++++----------- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/codegen.cpp b/src/codegen.cpp index 85509dcd2d70..e31b318dccfa 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -55,11 +55,14 @@ static PackageTableEntry *new_package(const char *root_src_dir, const char *root return entry; } -CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out_type, BuildMode build_mode) { +CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out_type, BuildMode build_mode, + Buf *zig_std_dir) +{ CodeGen *g = allocate(1); codegen_add_time_event(g, "Initialize"); + g->zig_std_dir = zig_std_dir; g->build_mode = build_mode; g->out_type = out_type; g->import_table.init(32); @@ -87,12 +90,11 @@ CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out os_path_split(root_src_path, src_dir, src_basename); g->root_package = new_package(buf_ptr(src_dir), buf_ptr(src_basename)); - g->std_package = new_package(ZIG_STD_DIR, "index.zig"); + g->std_package = new_package(buf_ptr(g->zig_std_dir), "index.zig"); g->root_package->package_table.put(buf_create_from_str("std"), g->std_package); } else { g->root_package = new_package(".", ""); } - g->zig_std_dir = buf_create_from_str(ZIG_STD_DIR); g->zig_std_special_dir = buf_alloc(); os_path_join(g->zig_std_dir, buf_sprintf("special"), g->zig_std_special_dir); @@ -215,12 +217,6 @@ void codegen_set_libc_include_dir(CodeGen *g, Buf *libc_include_dir) { g->libc_include_dir = libc_include_dir; } -void codegen_set_zig_std_dir(CodeGen *g, Buf *zig_std_dir) { - g->zig_std_dir = zig_std_dir; - - g->std_package->root_src_dir = *zig_std_dir; -} - void codegen_set_dynamic_linker(CodeGen *g, Buf *dynamic_linker) { g->dynamic_linker = dynamic_linker; } diff --git a/src/codegen.hpp b/src/codegen.hpp index 93975fd789ed..91418b1fc986 100644 --- a/src/codegen.hpp +++ b/src/codegen.hpp @@ -14,7 +14,8 @@ #include -CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out_type, BuildMode build_mode); +CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out_type, BuildMode build_mode, + Buf *zig_std_dir); void codegen_set_clang_argv(CodeGen *codegen, const char **args, size_t len); void codegen_set_llvm_argv(CodeGen *codegen, const char **args, size_t len); @@ -29,7 +30,6 @@ void codegen_set_out_name(CodeGen *codegen, Buf *out_name); void codegen_set_libc_lib_dir(CodeGen *codegen, Buf *libc_lib_dir); void codegen_set_libc_static_lib_dir(CodeGen *g, Buf *libc_static_lib_dir); void codegen_set_libc_include_dir(CodeGen *codegen, Buf *libc_include_dir); -void codegen_set_zig_std_dir(CodeGen *codegen, Buf *zig_std_dir); void codegen_set_dynamic_linker(CodeGen *g, Buf *dynamic_linker); void codegen_set_windows_subsystem(CodeGen *g, bool mwindows, bool mconsole); void codegen_set_windows_unicode(CodeGen *g, bool municode); diff --git a/src/link.cpp b/src/link.cpp index 359474204b18..90862bde8dc8 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -33,7 +33,8 @@ static const char *get_libc_static_file(CodeGen *g, const char *file) { static Buf *build_o_raw(CodeGen *parent_gen, const char *oname, Buf *full_path) { ZigTarget *child_target = parent_gen->is_native_target ? nullptr : &parent_gen->zig_target; - CodeGen *child_gen = codegen_create(full_path, child_target, OutTypeObj, parent_gen->build_mode); + CodeGen *child_gen = codegen_create(full_path, child_target, OutTypeObj, parent_gen->build_mode, + parent_gen->zig_std_dir); child_gen->want_h_file = false; child_gen->verbose_link = parent_gen->verbose_link; diff --git a/src/main.cpp b/src/main.cpp index 0c74b5bbb6d3..962a2e6b30eb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -232,13 +232,6 @@ int main(int argc, char **argv) { init_all_targets(); - Buf *zig_std_dir = buf_create_from_str(ZIG_STD_DIR); - Buf *special_dir = buf_alloc(); - os_path_join(zig_std_dir, buf_sprintf("special"), special_dir); - - Buf *build_runner_path = buf_alloc(); - os_path_join(special_dir, buf_create_from_str("build_runner.zig"), build_runner_path); - ZigList args = {0}; args.append(zig_exe_path); args.append(NULL); // placeholder @@ -255,12 +248,29 @@ int main(int argc, char **argv) { } else if (i + 1 < argc && strcmp(argv[i], "--cache-dir") == 0) { cache_dir = argv[i + 1]; i += 1; + } else if (i + 1 < argc && strcmp(argv[i], "--zig-std-dir") == 0) { + args.append(argv[i]); + i += 1; + zig_std_dir = argv[i]; + args.append(zig_std_dir); } else { args.append(argv[i]); } } - CodeGen *g = codegen_create(build_runner_path, nullptr, OutTypeExe, BuildModeDebug); + if (zig_std_dir == nullptr) { + zig_std_dir = ZIG_STD_DIR; + } + Buf *zig_std_dir_buf = buf_create_from_str(zig_std_dir); + + Buf *special_dir = buf_alloc(); + os_path_join(zig_std_dir_buf, buf_sprintf("special"), special_dir); + + Buf *build_runner_path = buf_alloc(); + os_path_join(special_dir, buf_create_from_str("build_runner.zig"), build_runner_path); + + + CodeGen *g = codegen_create(build_runner_path, nullptr, OutTypeExe, BuildModeDebug, zig_std_dir_buf); codegen_set_out_name(g, buf_create_from_str("build")); codegen_set_verbose(g, verbose); @@ -609,7 +619,12 @@ int main(int argc, char **argv) { buf_create_from_str((cache_dir == nullptr) ? default_zig_cache_name : cache_dir), full_cache_dir); - CodeGen *g = codegen_create(zig_root_source_file, target, out_type, build_mode); + if (zig_std_dir == nullptr) { + zig_std_dir = ZIG_STD_DIR; + } + + CodeGen *g = codegen_create(zig_root_source_file, target, out_type, build_mode, + buf_create_from_str(zig_std_dir)); codegen_set_out_name(g, buf_out_name); codegen_set_lib_version(g, ver_major, ver_minor, ver_patch); codegen_set_is_test(g, cmd == CmdTest); @@ -628,8 +643,6 @@ int main(int argc, char **argv) { codegen_set_libc_static_lib_dir(g, buf_create_from_str(libc_static_lib_dir)); if (libc_include_dir) codegen_set_libc_include_dir(g, buf_create_from_str(libc_include_dir)); - if (zig_std_dir) - codegen_set_zig_std_dir(g, buf_create_from_str(zig_std_dir)); if (dynamic_linker) codegen_set_dynamic_linker(g, buf_create_from_str(dynamic_linker)); codegen_set_verbose(g, verbose);