diff --git a/scripts/build_runtime.py b/scripts/build_runtime.py index 7dc98b0..3826b25 100644 --- a/scripts/build_runtime.py +++ b/scripts/build_runtime.py @@ -217,13 +217,19 @@ def build_wasm3_lib_win(release): def build_wasm3_lib_mac(release): + includes = ["-I./ext/wasm3/source"] + debug_flags = ["-O2"] if release else ["-g"] + flags = [ + *debug_flags, + "-foptimize-sibling-calls", + "-Wno-extern-initializer", + "-Dd_m3VerboseErrorMessages", + ] + for f in glob.iglob("./ext/wasm3/source/*.c"): name = os.path.splitext(os.path.basename(f))[0] + ".o" subprocess.run([ - "clang", "-c", - "-g", *(["/O2"] if release else []), - "-foptimize-sibling-calls", "-Wno-extern-initializer", "-Dd_m3VerboseErrorMessages", - "-I./ext/wasm3/source", + "clang", "-c", *flags, *includes, "-o", f"./bin/obj/{name}", f, ], check=True) @@ -239,8 +245,7 @@ def build_orca(release): if platform.system() == "Windows": build_orca_win(release) elif platform.system() == "Darwin": - log_error("can't yet build Orca on Mac") - exit(1) + build_orca_mac(release) else: log_error(f"can't build Orca for unknown platform '{platform.system()}'") exit(1) @@ -254,23 +259,7 @@ def build_orca_win(release): shutil.copy("milepost\\bin\\milepost.dll.lib", "bin") shutil.copy(os.path.join(pthread_dir, "bin\\pthreadVC3.dll"), "bin") - # generate wasm3 api bindings - bindgen("core", "src") - bindgen("gles", "src") - bindgen2("canvas", "src\\canvas_api.json", - guest_stubs="sdk\\orca_surface.c", - guest_include="graphics.h", - wasm3_bindings="src\\canvas_api_bind_gen.c", - ) - bindgen2("clock", "src\\clock_api.json", - guest_stubs="sdk\\orca_clock.c", - guest_include="platform_clock.h", - wasm3_bindings="src\\clock_api_bind_gen.c", - ) - bindgen2("io", "src\\io_api.json", - guest_stubs="sdk\\io_stubs.c", - wasm3_bindings="src\\io_api_bind_gen.c", - ) + gen_all_bindings() # compile orca pthread_include = os.path.join(pthread_dir, "include") @@ -301,6 +290,70 @@ def build_orca_win(release): ], check=True) +def build_orca_mac(release): + # copy libraries + shutil.copy("milepost/bin/mtl_renderer.metallib", "bin/") + shutil.copy("milepost/bin/libmilepost.dylib", "bin/") + shutil.copy("milepost/bin/libGLESv2.dylib", "bin/") + shutil.copy("milepost/bin/libEGL.dylib", "bin/") + + includes = [ + "-Isrc", + "-Isdk", + "-Imilepost/src", + "-Imilepost/src/util", + "-Imilepost/src/platform", + "-Iext/wasm3/source", + "-Imilepost/ext/", + ] + libs = ["-Lbin", "-lmilepost", "-lwasm3"] + debug_flags = ["-O2"] if release else ["-g", "-DLOG_COMPILE_DEBUG"] + flags = [ + *debug_flags, + "-mmacos-version-min=10.15.4", + "-maes", + ] + + gen_all_bindings() + + # compile orca + subprocess.run([ + "clang", *flags, *includes, *libs, + "-o", "bin/orca", + "src/main.c", + ], check=True) + + # fix libs imports + subprocess.run([ + "install_name_tool", "-change", + "./bin/libmilepost.dylib", "@rpath/libmilepost.dylib", "bin/orca", + ], check=True) + subprocess.run([ + "install_name_tool", "-add_rpath", + "@executable_path/", "bin/orca", + ], check=True) + + +def gen_all_bindings(): + bindgen("core", "src") + bindgen("gles", "src") + + bindgen2("canvas", "src/canvas_api.json", + guest_stubs="sdk/orca_surface.c", + guest_include="graphics.h", + wasm3_bindings="src/canvas_api_bind_gen.c", + ) + bindgen2("clock", "src/clock_api.json", + guest_stubs="sdk/orca_clock.c", + guest_include="platform_clock.h", + wasm3_bindings="src/clock_api_bind_gen.c", + ) + bindgen2("io", "src/io_api.json", + guest_stubs="sdk/io_stubs.c", + wasm3_bindings="src/io_api_bind_gen.c", + ) + + def ensure_programs(): if platform.system() == "Windows": try: