Get entire Orca build working on Windows

This commit is contained in:
Ben Visness 2023-07-19 18:35:07 -05:00 committed by Ben Visness
parent 25f660227f
commit 10351e45cd
3 changed files with 370 additions and 281 deletions

View File

@ -1,16 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import sys import sys
if len(sys.argv) < 2: def bindgen(apiName, cdir):
print("bindgen require an api name\n")
exit(-1);
apiName = sys.argv[1]
cdir = ''
if len(sys.argv) > 2:
cdir = sys.argv[2]
inPath = cdir + '/bindgen_' + apiName + '_api.txt' inPath = cdir + '/bindgen_' + apiName + '_api.txt'
outPath = cdir + '/bindgen_' + apiName + '_api.c' outPath = cdir + '/bindgen_' + apiName + '_api.c'
@ -129,3 +120,16 @@ outFile.write(linkProc)
inFile.close() inFile.close()
outFile.close() outFile.close()
if __name__ == "__main__":
if len(sys.argv) < 2:
print("bindgen require an api name\n")
exit(-1)
apiName = sys.argv[1]
cdir = ''
if len(sys.argv) > 2:
cdir = sys.argv[2]
bindgen(apiName, cdir)

View File

@ -3,31 +3,6 @@
from argparse import ArgumentParser from argparse import ArgumentParser
import json import json
parser = ArgumentParser(prog='bindgen.py')
parser.add_argument('api')
parser.add_argument('spec')
parser.add_argument('-g', '--guest-stubs')
parser.add_argument('--guest-include')
parser.add_argument('--wasm3-bindings')
args = parser.parse_args()
apiName = args.api
spec = args.spec
guest_stubs_path = args.guest_stubs
if guest_stubs_path == None:
guest_stubs_path = 'bindgen_' + apiName + '_guest_stubs.c'
wasm3_bindings_path = args.wasm3_bindings
if wasm3_bindings_path == None:
wasm3_bindings_path = 'bindgen_' + apiName + '_wasm3_bindings.c'
host_bindings = open(wasm3_bindings_path, 'w')
guest_bindings = None
specFile = open(spec, 'r')
data = json.load(specFile)
def needs_arg_ptr_stub(decl): def needs_arg_ptr_stub(decl):
res = (decl['ret']['tag'] == 'S') res = (decl['ret']['tag'] == 'S')
for arg in decl['args']: for arg in decl['args']:
@ -35,11 +10,22 @@ def needs_arg_ptr_stub(decl):
res = True res = True
return(res) return(res)
def bindgen2(apiName, spec, **kwargs):
guest_stubs_path = kwargs["guest_stubs"]
guest_include = kwargs.get("guest-include")
wasm3_bindings_path = kwargs["wasm3_bindings"]
host_bindings = open(wasm3_bindings_path, 'w')
guest_bindings = None
specFile = open(spec, 'r')
data = json.load(specFile)
for decl in data: for decl in data:
if needs_arg_ptr_stub(decl): if needs_arg_ptr_stub(decl):
guest_bindings = open(guest_stubs_path, 'w') guest_bindings = open(guest_stubs_path, 'w')
if args.guest_include != None: if guest_include != None:
s = '#include"' + args.guest_include + '"\n\n' s = '#include"' + guest_include + '"\n\n'
print(s, file=guest_bindings) print(s, file=guest_bindings)
break break
@ -199,3 +185,30 @@ for decl in data:
s += '\treturn(0);\n}\n' s += '\treturn(0);\n}\n'
print(s, file=host_bindings) print(s, file=host_bindings)
if __name__ == "__main__":
parser = ArgumentParser(prog='bindgen.py')
parser.add_argument('api')
parser.add_argument('spec')
parser.add_argument('-g', '--guest-stubs')
parser.add_argument('--guest-include')
parser.add_argument('--wasm3-bindings')
args = parser.parse_args()
apiName = args.api
spec = args.spec
guest_stubs_path = args.guest_stubs
if guest_stubs_path == None:
guest_stubs_path = 'bindgen_' + apiName + '_guest_stubs.c'
wasm3_bindings_path = args.wasm3_bindings
if wasm3_bindings_path == None:
wasm3_bindings_path = 'bindgen_' + apiName + '_wasm3_bindings.c'
bindgen2(apiName, spec,
guest_stubs_path=guest_stubs_path,
guest_include=args.guest_include,
wasm3_bindings_path=wasm3_bindings_path,
)

View File

@ -9,6 +9,8 @@ import subprocess
from zipfile import ZipFile from zipfile import ZipFile
import checksum import checksum
from bindgen import bindgen
from bindgen2 import bindgen2
from log import * from log import *
from utils import pushd, removeall from utils import pushd, removeall
@ -28,6 +30,7 @@ def build_runtime(args):
build_milepost("lib", args.release) build_milepost("lib", args.release)
build_wasm3(args.release) build_wasm3(args.release)
build_orca(args.release)
def build_milepost(target, release): def build_milepost(target, release):
@ -213,6 +216,75 @@ def build_wasm3_lib_win(release):
], check=True) ], check=True)
def build_orca(release):
print("Building Orca...")
os.makedirs("bin", exist_ok=True)
if platform.system() == "Windows":
build_orca_win(release)
elif platform.system() == "Darwin":
raise "can't yet build Orca on Mac"
else:
log_error(f"can't build Orca for unknown platform '{platform.system()}'")
exit(1)
def build_orca_win(release):
pthread_dir = "..\\vcpkg\\packages\\pthreads_x64-windows"
# copy libraries
shutil.copy("milepost\\bin\\milepost.dll", "bin")
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",
)
# compile orca
pthread_include = os.path.join(pthread_dir, "include")
includes = [
"/I", "src",
"/I", "sdk",
"/I", "ext\wasm3\source",
"/I", "milepost\src",
"/I", "milepost\ext",
"/I", pthread_include,
]
pthread_lib = os.path.join(pthread_dir, "lib")
libs = [
"/LIBPATH:bin",
f"/LIBPATH:{pthread_lib}",
"milepost.dll.lib",
"wasm3.lib",
"pthreadVC3.lib",
]
subprocess.run([
"cl",
"/Zi", "/Zc:preprocessor", "/std:c11",
*includes,
"src\\main.c",
"/link", *libs,
"/out:bin\\orca.exe",
], check=True)
def ensure_programs(): def ensure_programs():
if platform.system() == "Windows": if platform.system() == "Windows":
try: try: