diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cccdf3d --- /dev/null +++ b/Makefile @@ -0,0 +1,65 @@ +# Variables to compile go client +GO_CLIENT=bitwrk-client +GO_RELEASE_DIST=./dist +CLIENT_LINUX=$(GO_RELEASE_DIST)/bitwrk_linux_amd64/$(GO_CLIENT) +CLIENT_DARWIN=$(GO_RELEASE_DIST)/bitwrk_darwin_amd64/$(GO_CLIENT) +CLIENT_WINDOWS=$(GO_RELEASE_DIST)/bitwrk_windows_amd64/$(GO_CLIENT).exe +ADDON_NAME_ROOT=render_bitwrk +VERSION=0.7.0 + +# Variables to zip addon and client daemon into one +TMPDIR=tmp +CLIENT_DIR=bitwrk_client +RESOURCE_DIR=resources +RENDER_DIR=bitwrk-blender +ADDON_DIR=render_bitwrk +SUFFIX_DARWIN=_osx.x64 +SUFFIX_LINUX=_linux.x64 +SUFFIX_WINDOWS=_windows.x64 + +all: build-go prep-addon package-darwin package-linux package-windows cleanup-addon + +build-go: + goreleaser --snapshot --skip-publish --rm-dist + +prep-addon: + echo "CLEAN UP PREVIOUS BUILD" + rm -rf $(TMPDIR) + echo "CREATE ADDON DIRECTORY STRUCTURE" + mkdir $(TMPDIR) && \ + cp -r $(RENDER_DIR)/$(ADDON_DIR) $(TMPDIR)/ && \ + mkdir $(TMPDIR)/$(ADDON_DIR)/$(CLIENT_DIR) && \ + cp -r $(RESOURCE_DIR) $(TMPDIR)/$(ADDON_DIR)/$(CLIENT_DIR)/ + +package-darwin: + echo "DARWIN: COPY CLIENT EXECUTABLE TO ADDON STRUCTURE" + cp $(CLIENT_DARWIN) $(TMPDIR)/$(ADDON_DIR)/$(CLIENT_DIR)/ && \ + echo "DARWIN: ZIP ADDON" && \ + cd $(TMPDIR) && \ + zip -r ../$(ADDON_NAME_ROOT)$(SUFFIX_DARWIN).zip * && \ + echo "DARWIN: REMOVE CLIENT EXECUTABLE" && \ + cd .. && \ + rm $(TMPDIR)/$(ADDON_DIR)/$(CLIENT_DIR)/$(GO_CLIENT) + +package-linux: + echo "LINUX: COPY CLIENT EXECUTABLE TO ADDON STRUCTURE" + cp $(CLIENT_LINUX) $(TMPDIR)/$(ADDON_DIR)/$(CLIENT_DIR)/ && \ + echo "LINUX: ZIP ADDON" && \ + cd $(TMPDIR) && \ + zip -r ../$(ADDON_NAME_ROOT)$(SUFFIX_LINUX).zip * && \ + echo "LINUX: REMOVE CLIENT EXECUTABLE" && \ + cd .. && \ + rm $(TMPDIR)/$(ADDON_DIR)/$(CLIENT_DIR)/$(GO_CLIENT) + +package-windows: + echo "WINDOWS: COPY CLIENT EXECUTABLE TO ADDON STRUCTURE" && \ + cp $(CLIENT_WINDOWS) $(TMPDIR)/$(ADDON_DIR)/$(CLIENT_DIR)/ && \ + echo "WINDOWS: ZIP ADDON" && \ + cd $(TMPDIR) && \ + zip -r ../$(ADDON_NAME_ROOT)$(SUFFIX_WINDOWS).zip * && \ + echo "WINDOWS: REMOVE CLIENT EXECUTABLE" && \ + cd .. && \ + rm $(TMPDIR)/$(ADDON_DIR)/$(CLIENT_DIR)/$(GO_CLIENT).exe + +cleanup-addon: + rm -rf $(TMPDIR) diff --git a/bitwrk-blender/render_bitwrk/bitwrkclient.py b/bitwrk-blender/render_bitwrk/bitwrkclient.py index 8ead6bd..32c0d99 100644 --- a/bitwrk-blender/render_bitwrk/bitwrkclient.py +++ b/bitwrk-blender/render_bitwrk/bitwrkclient.py @@ -18,7 +18,7 @@ # # ##### END GPL LICENSE BLOCK ##### -import atexit, bpy.path, time, http, re, os, subprocess, threading +import atexit, bpy.path, time, http, re, os, subprocess, threading, stat, platform # Functions for probing host:port settings for a running BitWrk client LAST_PROBE_LOCK = threading.RLock() @@ -26,6 +26,9 @@ LAST_PROBE_RESULT = False LAST_PROBE_SETTINGS = None LAST_PROBE_THREAD = None +EXECUTABLE_RELATIVE_PATH = 'bitwrk_client/bitwrk-client' +EXECUTABLE_EXTENSION_WINDOWS = '.exe' + def probe_bitwrk_client(settings): global LAST_PROBE_LOCK, LAST_PROBE_TIME, LAST_PROBE_RESULT, LAST_PROBE_SETTINGS, LAST_PROBE_THREAD with LAST_PROBE_LOCK: @@ -74,9 +77,23 @@ def do_probe_bitwrk_client_pure(settings): pass return False + def client_executable_path(settings): + """Return the full path to the client executable: + + 1. of the client embedded within the addon, OR + 2. (for older version compatibility and only when in expert mode) of the client path configured via the Bitwrk property panel""" + + if not settings.bitwrk_client_executable_path or not settings.expert_mode: + exec_dirname = os.path.dirname(os.path.abspath(__file__)) + executable_fullpath = os.path.join(exec_dirname, EXECUTABLE_RELATIVE_PATH) + if platform.system() == 'Windows': + executable_fullpath += EXECUTABLE_EXTENSION_WINDOWS + return executable_fullpath + return bpy.path.abspath(settings.bitwrk_client_executable_path) + CLIENT_PROC = None def _exithandler(): @@ -95,12 +112,22 @@ def bitwrk_client_alive(): return False return True + +def make_bitwrk_client_executable(clientpath): + """Set the client permissions to executable for both owner and group""" + statinfo = os.stat(clientpath) + os.chmod(clientpath, statinfo.st_mode | stat.S_IXUSR | stat.S_IXGRP) + + def can_start_bitwrk_client(settings): if bitwrk_client_alive(): return False if probe_bitwrk_client(settings): return False clientpath = client_executable_path(settings) + + make_bitwrk_client_executable(clientpath) + return os.path.isfile(clientpath) def start_bitwrk_client(settings): diff --git a/bitwrk-blender/render_bitwrk/settings_panel.py b/bitwrk-blender/render_bitwrk/settings_panel.py index e394075..8dbd9ab 100644 --- a/bitwrk-blender/render_bitwrk/settings_panel.py +++ b/bitwrk-blender/render_bitwrk/settings_panel.py @@ -131,6 +131,9 @@ def draw(self, context): layout = self.layout.column() layout.enabled = not is_render_active() and not worker.worker_alive() row = layout.split(factor=0.5) + row.label(text="BitWrk client executable file:") + row.prop(settings, "bitwrk_client_executable_path", text="") + row = layout.split(factor=0.5) row.label(text="BitWrk client host:") row.prop(settings, "bitwrk_client_host", text="") row = layout.split(factor=0.5) @@ -139,8 +142,6 @@ def draw(self, context): if not bitwrkclient.probe_bitwrk_client(settings): row = self.layout.split(factor=0.5) - row.label(text="BitWrk client executable file:") - row.prop(settings, "bitwrk_client_executable_path", text="") if settings.expert_mode: self.layout.label(text="BitWrk can dispatch jobs to local network computers:") row = self.layout.split(factor=0.02)