master
  1#include <stdio.h>
  2#include <string.h>
  3#include <stdlib.h>
  4#include <stdbool.h>
  5
  6static const char *get_c_compiler(void) {
  7    const char *cc = getenv("CC");
  8    return (cc == NULL) ? "cc" : cc;
  9}
 10
 11static void panic(const char *reason) {
 12    fprintf(stderr, "%s\n", reason);
 13    abort();
 14}
 15
 16#if defined(__WIN32__)
 17#error TODO write the functionality for executing child process into this build script
 18#else
 19
 20#include <unistd.h>
 21#include <errno.h>
 22#include <sys/wait.h>
 23
 24static void run(char **argv) {
 25    pid_t pid = fork();
 26    if (pid == -1)
 27        panic("fork failed");
 28    if (pid == 0) {
 29        // child
 30        execvp(argv[0], argv);
 31        exit(1);
 32    }
 33
 34    // parent
 35
 36    int status;
 37    waitpid(pid, &status, 0);
 38
 39    if (!WIFEXITED(status))
 40        panic("child process crashed");
 41
 42    if (WEXITSTATUS(status) != 0)
 43        panic("child process failed");
 44}
 45#endif
 46
 47static void print_and_run(const char **argv) {
 48    fprintf(stderr, "%s", argv[0]);
 49    for (const char **arg = argv + 1; *arg; arg += 1) {
 50        fprintf(stderr, " %s", *arg);
 51    }
 52    fprintf(stderr, "\n");
 53    run((char **)argv);
 54}
 55
 56static const char *get_host_os(void) {
 57    const char *host_os = getenv("ZIG_HOST_TARGET_OS");
 58    if (host_os != NULL) return host_os;
 59#if defined(__WIN32__)
 60    return "windows";
 61#elif defined(__APPLE__)
 62    return "macos";
 63#elif defined(__linux__)
 64    return "linux";
 65#elif defined(__FreeBSD__)
 66    return "freebsd";
 67#elif defined(__DragonFly__)
 68    return "dragonfly";
 69#elif defined(__HAIKU__)
 70    return "haiku";
 71#else
 72    panic("unknown host os, specify with ZIG_HOST_TARGET_OS");
 73#endif
 74}
 75
 76static const char *get_host_arch(void) {
 77    const char *host_arch = getenv("ZIG_HOST_TARGET_ARCH");
 78    if (host_arch != NULL) return host_arch;
 79#if defined(__x86_64__ )
 80    return "x86_64";
 81#elif defined(__aarch64__)
 82    return "aarch64";
 83#else
 84    panic("unknown host arch, specify with ZIG_HOST_TARGET_ARCH");
 85#endif
 86}
 87
 88static const char *get_host_abi(void) {
 89    const char *host_abi = getenv("ZIG_HOST_TARGET_ABI");
 90    return (host_abi == NULL) ? "" : host_abi;
 91}
 92
 93static const char *get_host_triple(void) {
 94    const char *host_triple = getenv("ZIG_HOST_TARGET_TRIPLE");
 95    if (host_triple != NULL) return host_triple;
 96    static char global_buffer[100];
 97    sprintf(global_buffer, "%s-%s%s", get_host_arch(), get_host_os(), get_host_abi());
 98    return global_buffer;
 99}
100
101int main(int argc, char **argv) {
102    const char *cc = get_c_compiler();
103    const char *host_triple = get_host_triple();
104
105    {
106        const char *child_argv[] = {
107            cc, "-o", "zig-wasm2c", "stage1/wasm2c.c", "-O2", "-std=c99", NULL,
108        };
109        print_and_run(child_argv);
110    }
111    {
112        const char *child_argv[] = {
113            "./zig-wasm2c", "stage1/zig1.wasm", "zig1.c", NULL,
114        };
115        print_and_run(child_argv);
116    }
117    {
118        const char *child_argv[] = {
119            cc, "-o", "zig1", "zig1.c", "stage1/wasi.c", "-std=c99", "-Os", "-lm", NULL,
120        };
121        print_and_run(child_argv);
122    }
123    {
124        FILE *f = fopen("config.zig", "wb");
125        if (f == NULL)
126            panic("unable to open config.zig for writing");
127
128        const char *zig_version = "0.14.0-dev.bootstrap";
129
130        int written = fprintf(f,
131            "pub const have_llvm = false;\n"
132            "pub const llvm_has_m68k = false;\n"
133            "pub const llvm_has_csky = false;\n"
134            "pub const llvm_has_arc = false;\n"
135            "pub const llvm_has_xtensa = false;\n"
136            "pub const version: [:0]const u8 = \"%s\";\n"
137            "pub const semver = @import(\"std\").SemanticVersion.parse(version) catch unreachable;\n"
138            "pub const enable_debug_extensions = false;\n"
139            "pub const enable_logging = false;\n"
140            "pub const enable_link_snapshots = false;\n"
141            "pub const enable_tracy = false;\n"
142            "pub const value_tracing = false;\n"
143            "pub const skip_non_native = false;\n"
144            "pub const debug_gpa = false;\n"
145            "pub const dev = .core;\n"
146            "pub const value_interpret_mode = .direct;\n"
147        , zig_version);
148        if (written < 100)
149            panic("unable to write to config.zig file");
150        if (fclose(f) != 0)
151            panic("unable to finish writing to config.zig file");
152    }
153
154    {
155        const char *child_argv[] = {
156            "./zig1", "lib", "build-exe",
157            "-ofmt=c", "-lc", "-OReleaseSmall",
158            "--name", "zig2", "-femit-bin=zig2.c",
159            "-target", host_triple,
160            "--dep", "build_options",
161            "--dep", "aro",
162            "-Mroot=src/main.zig",
163            "-Mbuild_options=config.zig",
164            "-Maro=lib/compiler/aro/aro.zig",
165            NULL,
166        };
167        print_and_run(child_argv);
168    }
169
170    {
171        const char *child_argv[] = {
172            "./zig1", "lib", "build-obj",
173            "-ofmt=c", "-OReleaseSmall",
174            "--name", "compiler_rt", "-femit-bin=compiler_rt.c",
175            "-target", host_triple,
176            "-Mroot=lib/compiler_rt.zig",
177            NULL,
178        };
179        print_and_run(child_argv);
180    }
181
182    {
183        const char *child_argv[] = {
184            cc, "-o", "zig2", "zig2.c", "compiler_rt.c",
185            "-std=c99", "-O2", "-fno-stack-protector",
186            "-Istage1",
187#if defined(__APPLE__)
188            "-Wl,-stack_size,0x10000000",
189#else
190            "-Wl,-z,stack-size=0x10000000",
191#endif
192#if defined(__GNUC__)
193            "-pthread",
194#endif
195            NULL,
196        };
197        print_and_run(child_argv);
198    }
199}