Faster builds using compilation server

This commit is contained in:
luboslenco 2019-01-31 12:14:52 +01:00
parent 4df19ef970
commit e8a1c94e8b
4 changed files with 53 additions and 6 deletions

View file

@ -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")

View file

@ -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()

View file

@ -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'

View file

@ -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