Faster builds using compilation server
This commit is contained in:
parent
4df19ef970
commit
e8a1c94e8b
|
@ -50,7 +50,7 @@ class ArmoryAddonPreferences(AddonPreferences):
|
|||
self.ffmpeg_path = bpy.path.reduce_dirs([bpy.path.abspath(self.ffmpeg_path)])[0]
|
||||
|
||||
def renderdoc_path_update(self, context):
|
||||
if self.skip_update:
|
||||
if self.skip_update or self.renderdoc_path == '':
|
||||
return
|
||||
self.skip_update = True
|
||||
self.renderdoc_path = bpy.path.reduce_dirs([bpy.path.abspath(self.renderdoc_path)])[0]
|
||||
|
@ -77,6 +77,7 @@ class ArmoryAddonPreferences(AddonPreferences):
|
|||
name="Code Editor", default='kodestudio', description='Use this editor for editing scripts')
|
||||
ui_scale: FloatProperty(name='UI Scale', description='Adjust UI scale for Armory tools', default=1.0, min=1.0, max=4.0)
|
||||
khamake_threads: IntProperty(name='Khamake Threads', description='Allow Khamake to spawn multiple processes for faster builds', default=4, min=1)
|
||||
compilation_server: BoolProperty(name='Compilation Server', description='Allow Haxe to create a local compilation server for faster builds', default=False)
|
||||
renderdoc_path: StringProperty(name="RenderDoc Path", description="Binary path", subtype="FILE_PATH", update=renderdoc_path_update, default="")
|
||||
ffmpeg_path: StringProperty(name="FFMPEG Path", description="Binary path", subtype="FILE_PATH", update=ffmpeg_path_update, default="")
|
||||
save_on_build: BoolProperty(name="Save on Build", description="Save .blend", default=False)
|
||||
|
@ -118,6 +119,7 @@ class ArmoryAddonPreferences(AddonPreferences):
|
|||
box.prop(self, "viewport_controls")
|
||||
box.prop(self, "ui_scale")
|
||||
box.prop(self, "khamake_threads")
|
||||
box.prop(self, "compilation_server")
|
||||
box.prop(self, "save_on_build")
|
||||
box.prop(self, "legacy_shaders")
|
||||
box.prop(self, "relative_paths")
|
||||
|
|
|
@ -1,10 +1,25 @@
|
|||
import http.server
|
||||
import socketserver
|
||||
import subprocess
|
||||
import atexit
|
||||
|
||||
def run():
|
||||
haxe_server = None
|
||||
|
||||
def run_tcp():
|
||||
Handler = http.server.SimpleHTTPRequestHandler
|
||||
try:
|
||||
httpd = socketserver.TCPServer(("", 8040), Handler)
|
||||
httpd.serve_forever()
|
||||
except:
|
||||
print('Server already running')
|
||||
|
||||
def run_haxe(haxe_path, port=6000):
|
||||
global haxe_server
|
||||
if haxe_server == None:
|
||||
haxe_server = subprocess.Popen([haxe_path, '--wait', str(port)])
|
||||
atexit.register(kill_haxe)
|
||||
|
||||
def kill_haxe():
|
||||
global haxe_server
|
||||
if haxe_server != None:
|
||||
haxe_server.kill()
|
||||
|
|
|
@ -266,19 +266,25 @@ def compile(assets_only=False):
|
|||
cmd.append('--parallelAssetConversion')
|
||||
cmd.append(str(arm.utils.get_khamake_threads()))
|
||||
|
||||
compilation_server = False
|
||||
|
||||
cmd.append('--to')
|
||||
if (kha_target_name == 'krom' and not state.is_viewport and not state.is_publish) or (kha_target_name == 'html5' and not state.is_publish):
|
||||
cmd.append(arm.utils.build_dir() + '/debug')
|
||||
# Start compilation server
|
||||
if kha_target_name == 'krom' and arm.utils.get_compilation_server() and not assets_only:
|
||||
compilation_server = True
|
||||
arm.lib.server.run_haxe(arm.utils.get_haxe_path())
|
||||
else:
|
||||
cmd.append(arm.utils.build_dir())
|
||||
|
||||
if assets_only:
|
||||
if assets_only or compilation_server:
|
||||
cmd.append('--nohaxe')
|
||||
cmd.append('--noproject')
|
||||
|
||||
print("Running: ", cmd)
|
||||
print("Using project from " + arm.utils.get_fp())
|
||||
state.proc_build = run_proc(cmd, build_done)
|
||||
state.proc_build = run_proc(cmd, assets_done if compilation_server else build_done)
|
||||
|
||||
def build_viewport():
|
||||
if state.proc_build != None:
|
||||
|
@ -373,6 +379,25 @@ def play_done():
|
|||
state.redraw_ui = True
|
||||
log.clear()
|
||||
|
||||
def assets_done():
|
||||
if state.proc_build == None:
|
||||
return
|
||||
result = state.proc_build.poll()
|
||||
if result == 0:
|
||||
# Connect to the compilation server
|
||||
os.chdir(arm.utils.build_dir() + '/debug/')
|
||||
cmd = [arm.utils.get_haxe_path(), '--connect', '6000', 'project-krom.hxml']
|
||||
state.proc_build = run_proc(cmd, compilation_server_done)
|
||||
else:
|
||||
log.print_info('Build failed, check console')
|
||||
|
||||
def compilation_server_done():
|
||||
if os.path.exists('krom/krom.js'):
|
||||
os.chmod('krom/krom.js', stat.S_IWRITE)
|
||||
os.remove('krom/krom.js')
|
||||
os.rename('krom/krom.js.temp', 'krom/krom.js')
|
||||
build_done()
|
||||
|
||||
def build_done():
|
||||
print('Finished in ' + str(time.time() - profile_time))
|
||||
if state.proc_build == None:
|
||||
|
@ -451,7 +476,7 @@ def build_success():
|
|||
if wrd.arm_runtime == 'Browser':
|
||||
# Start server
|
||||
os.chdir(arm.utils.get_fp())
|
||||
t = threading.Thread(name='localserver', target=arm.lib.server.run)
|
||||
t = threading.Thread(name='localserver', target=arm.lib.server.run_tcp)
|
||||
t.daemon = True
|
||||
t.start()
|
||||
html5_app_path = 'http://localhost:8040/' + arm.utils.build_dir() + '/debug/html5'
|
||||
|
|
|
@ -161,10 +161,15 @@ def get_khamake_threads():
|
|||
addon_prefs = preferences.addons['armory'].preferences
|
||||
return 1 if not hasattr(addon_prefs, 'khamake_threads') else addon_prefs.khamake_threads
|
||||
|
||||
def get_compilation_server():
|
||||
preferences = bpy.context.preferences
|
||||
addon_prefs = preferences.addons['armory'].preferences
|
||||
return False if not hasattr(addon_prefs, 'compilation_server') else addon_prefs.compilation_server
|
||||
|
||||
def get_save_on_build():
|
||||
preferences = bpy.context.preferences
|
||||
addon_prefs = preferences.addons['armory'].preferences
|
||||
return True if not hasattr(addon_prefs, 'save_on_build') else addon_prefs.save_on_build
|
||||
return False if not hasattr(addon_prefs, 'save_on_build') else addon_prefs.save_on_build
|
||||
|
||||
def get_viewport_controls():
|
||||
preferences = bpy.context.preferences
|
||||
|
|
Loading…
Reference in a new issue