authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-04 17:43:56-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-04 17:44:33-04:00
log72800f176e7065ea68a86a3aa0c3dfab33a24702
tree02662a1536479857110c139a9e274c52cb627863
parent47addd87ac5e97e30cc591f9d7ac7fe1ea6af573
signaturelock-open Commit is signed but in an unrecognized format.

zig build: search upwards for build.zig file

closes #2587

5 files changed, 40 insertions(+), 54 deletions(-)

README.md+3-3
...@@ -71,7 +71,7 @@ Dependencies are the same as Stage 1, except now you can use stage 1 to compile...@@ -71,7 +71,7 @@ Dependencies are the same as Stage 1, except now you can use stage 1 to compile
71Zig code.71Zig code.
7272
73```73```
74bin/zig build --build-file ../build.zig --prefix $(pwd)/stage2 install74bin/zig build --prefix $(pwd)/stage2
75```75```
7676
77This produces `./stage2/bin/zig` which can be used for testing and development.77This produces `./stage2/bin/zig` which can be used for testing and development.
...@@ -90,11 +90,11 @@ use stage 1....@@ -90,11 +90,11 @@ use stage 1.
90#### Debug / Development Build90#### Debug / Development Build
9191
92```92```
93./stage2/bin/zig build --build-file ../build.zig --prefix $(pwd)/stage3 install93./stage2/bin/zig build --prefix $(pwd)/stage3
94```94```
9595
96#### Release / Install Build96#### Release / Install Build
9797
98```98```
99./stage2/bin/zig build --build-file ../build.zig install -Drelease-fast99./stage2/bin/zig build install -Drelease
100```100```
build.zig+1
...@@ -11,6 +11,7 @@ const io = std.io;...@@ -11,6 +11,7 @@ const io = std.io;
11const fs = std.fs;11const fs = std.fs;
1212
13pub fn build(b: *Builder) !void {13pub fn build(b: *Builder) !void {
14 b.setPreferredReleaseMode(.ReleaseFast);
14 const mode = b.standardReleaseOptions();15 const mode = b.standardReleaseOptions();
1516
16 var docgen_exe = b.addExecutable("docgen", "doc/docgen.zig");17 var docgen_exe = b.addExecutable("docgen", "doc/docgen.zig");
src/main.cpp+35-49
...@@ -261,6 +261,15 @@ static bool get_cache_opt(CacheOpt opt, bool default_value) {...@@ -261,6 +261,15 @@ static bool get_cache_opt(CacheOpt opt, bool default_value) {
261 zig_unreachable();261 zig_unreachable();
262}262}
263263
264static int zig_error_no_build_file(void) {
265 fprintf(stderr,
266 "No 'build.zig' file found, in the current directory or any parent directories.\n"
267 "Initialize a 'build.zig' template file with `zig init-lib` or `zig init-exe`,\n"
268 "or see `zig --help` for more options.\n"
269 );
270 return EXIT_FAILURE;
271}
272
264extern "C" int ZigClang_main(int argc, char **argv);273extern "C" int ZigClang_main(int argc, char **argv);
265274
266int main(int argc, char **argv) {275int main(int argc, char **argv) {
...@@ -466,8 +475,7 @@ int main(int argc, char **argv) {...@@ -466,8 +475,7 @@ int main(int argc, char **argv) {
466 return EXIT_FAILURE;475 return EXIT_FAILURE;
467 }476 }
468 const char *zig_exe_path = buf_ptr(&zig_exe_path_buf);477 const char *zig_exe_path = buf_ptr(&zig_exe_path_buf);
469 const char *build_file = "build.zig";478 const char *build_file = nullptr;
470 bool asked_for_help = false;
471479
472 init_all_targets();480 init_all_targets();
473481
...@@ -478,7 +486,6 @@ int main(int argc, char **argv) {...@@ -478,7 +486,6 @@ int main(int argc, char **argv) {
478 args.append(NULL); // placeholder486 args.append(NULL); // placeholder
479 for (int i = 2; i < argc; i += 1) {487 for (int i = 2; i < argc; i += 1) {
480 if (strcmp(argv[i], "--help") == 0) {488 if (strcmp(argv[i], "--help") == 0) {
481 asked_for_help = true;
482 args.append(argv[i]);489 args.append(argv[i]);
483 } else if (i + 1 < argc && strcmp(argv[i], "--build-file") == 0) {490 } else if (i + 1 < argc && strcmp(argv[i], "--build-file") == 0) {
484 build_file = argv[i + 1];491 build_file = argv[i + 1];
...@@ -511,12 +518,36 @@ int main(int argc, char **argv) {...@@ -511,12 +518,36 @@ int main(int argc, char **argv) {
511 ZigTarget target;518 ZigTarget target;
512 get_native_target(&target);519 get_native_target(&target);
513520
514 Buf *build_file_buf = buf_create_from_str(build_file);521 Buf *build_file_buf = buf_create_from_str((build_file != nullptr) ? build_file : "build.zig");
515 Buf build_file_abs = os_path_resolve(&build_file_buf, 1);522 Buf build_file_abs = os_path_resolve(&build_file_buf, 1);
516 Buf build_file_basename = BUF_INIT;523 Buf build_file_basename = BUF_INIT;
517 Buf build_file_dirname = BUF_INIT;524 Buf build_file_dirname = BUF_INIT;
518 os_path_split(&build_file_abs, &build_file_dirname, &build_file_basename);525 os_path_split(&build_file_abs, &build_file_dirname, &build_file_basename);
519526
527 for (;;) {
528 bool build_file_exists;
529 if ((err = os_file_exists(&build_file_abs, &build_file_exists))) {
530 fprintf(stderr, "unable to check existence of '%s': %s\n", buf_ptr(&build_file_abs), err_str(err));
531 return 1;
532 }
533 if (build_file_exists)
534 break;
535
536 if (build_file != nullptr) {
537 // they asked for a specific build file path. only look for that one
538 return zig_error_no_build_file();
539 }
540
541 Buf *next_dir = buf_alloc();
542 os_path_dirname(&build_file_dirname, next_dir);
543 if (buf_eql_buf(&build_file_dirname, next_dir)) {
544 // no more parent directories to search, give up
545 return zig_error_no_build_file();
546 }
547 os_path_join(next_dir, &build_file_basename, &build_file_abs);
548 buf_init_from_buf(&build_file_dirname, next_dir);
549 }
550
520 Buf full_cache_dir = BUF_INIT;551 Buf full_cache_dir = BUF_INIT;
521 if (cache_dir == nullptr) {552 if (cache_dir == nullptr) {
522 os_path_join(&build_file_dirname, buf_create_from_str(default_zig_cache_name), &full_cache_dir);553 os_path_join(&build_file_dirname, buf_create_from_str(default_zig_cache_name), &full_cache_dir);
...@@ -534,51 +565,6 @@ int main(int argc, char **argv) {...@@ -534,51 +565,6 @@ int main(int argc, char **argv) {
534 args.items[2] = buf_ptr(&build_file_dirname);565 args.items[2] = buf_ptr(&build_file_dirname);
535 args.items[3] = buf_ptr(&full_cache_dir);566 args.items[3] = buf_ptr(&full_cache_dir);
536567
537 bool build_file_exists;
538 if ((err = os_file_exists(&build_file_abs, &build_file_exists))) {
539 fprintf(stderr, "unable to open '%s': %s\n", buf_ptr(&build_file_abs), err_str(err));
540 return 1;
541 }
542 if (!build_file_exists) {
543 if (asked_for_help) {
544 // This usage text has to be synchronized with std/special/build_runner.zig
545 fprintf(stdout,
546 "Usage: %s build [options]\n"
547 "\n"
548 "General Options:\n"
549 " --help Print this help and exit\n"
550 " --verbose Print commands before executing them\n"
551 " --prefix [path] Override default install prefix\n"
552 " --search-prefix [path] Add a path to look for binaries, libraries, headers\n"
553 "\n"
554 "Project-specific options become available when the build file is found.\n"
555 "\n"
556 "Advanced Options:\n"
557 " --build-file [file] Override path to build.zig\n"
558 " --cache-dir [path] Override path to cache directory\n"
559 " --override-std-dir [arg] Override path to Zig standard library\n"
560 " --override-lib-dir [arg] Override path to Zig lib library\n"
561 " --verbose-tokenize Enable compiler debug output for tokenization\n"
562 " --verbose-ast Enable compiler debug output for parsing into an AST\n"
563 " --verbose-link Enable compiler debug output for linking\n"
564 " --verbose-ir Enable compiler debug output for Zig IR\n"
565 " --verbose-llvm-ir Enable compiler debug output for LLVM IR\n"
566 " --verbose-cimport Enable compiler debug output for C imports\n"
567 " --verbose-cc Enable compiler debug output for C compilation\n"
568 "\n"
569 , zig_exe_path);
570 return EXIT_SUCCESS;
571 }
572
573 fprintf(stderr,
574 "No 'build.zig' file found.\n"
575 "Initialize a 'build.zig' template file with `zig init-lib` or `zig init-exe`,\n"
576 "or build an executable directly with `zig build-exe $FILENAME.zig`.\n"
577 "See: `zig build --help` or `zig --help` for more options.\n"
578 );
579 return EXIT_FAILURE;
580 }
581
582 ZigPackage *build_pkg = codegen_create_package(g, buf_ptr(&build_file_dirname),568 ZigPackage *build_pkg = codegen_create_package(g, buf_ptr(&build_file_dirname),
583 buf_ptr(&build_file_basename), "std.special");569 buf_ptr(&build_file_basename), "std.special");
584 g->root_package->package_table.put(buf_create_from_str("@build"), build_pkg);570 g->root_package->package_table.put(buf_create_from_str("@build"), build_pkg);
std/build.zig+1-1
...@@ -477,7 +477,7 @@ pub const Builder = struct {...@@ -477,7 +477,7 @@ pub const Builder = struct {
477 }477 }
478 const description = self.fmt("create a release build ({})", @tagName(mode));478 const description = self.fmt("create a release build ({})", @tagName(mode));
479 self.is_release = self.option(bool, "release", description) orelse false;479 self.is_release = self.option(bool, "release", description) orelse false;
480 self.release_mode = if (is_release) mode else builtin.Mode.Debug;480 self.release_mode = if (self.is_release) mode else builtin.Mode.Debug;
481 }481 }
482482
483 /// If you call this without first calling `setPreferredReleaseMode` then it gives the build user483 /// If you call this without first calling `setPreferredReleaseMode` then it gives the build user
std/special/build_runner.zig-1
...@@ -154,7 +154,6 @@ fn usage(builder: *Builder, already_ran_build: bool, out_stream: var) !void {...@@ -154,7 +154,6 @@ fn usage(builder: *Builder, already_ran_build: bool, out_stream: var) !void {
154 try runBuild(builder);154 try runBuild(builder);
155 }155 }
156156
157 // This usage text has to be synchronized with src/main.cpp
158 try out_stream.print(157 try out_stream.print(
159 \\Usage: {} build [steps] [options]158 \\Usage: {} build [steps] [options]
160 \\159 \\