Convert build scripts to Python #31
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue