diff --git a/kapitan/dependency_manager/base.py b/kapitan/dependency_manager/base.py index 7c2dd1f56..810385eae 100644 --- a/kapitan/dependency_manager/base.py +++ b/kapitan/dependency_manager/base.py @@ -237,10 +237,11 @@ def fetch_helm_chart(dep_mapping, save_dir): def initialise_helm_fetch_binding(): """returns the dl_opened library (.so file) if exists, otherwise None""" - if platform.system() not in ("Linux", "Darwin"): # TODO: later add binding for Mac + if platform.system() not in ("Linux", "Darwin"): return None - # binding_path is kapitan/dependency_manager/helm/helm_fetch.so - binding_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "helm/helm_fetch.so") + # binding_path is kapitan/inputs/helm/helm_fetch_.so + binding_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), + "helm/helm_fetch_{}.so".format(platform.system())) if not os.path.exists(binding_path): logger.debug("The helm_fetch binding does not exist at {}".format(binding_path)) return None diff --git a/kapitan/dependency_manager/helm/build.sh b/kapitan/dependency_manager/helm/build.sh index 6e8c0c039..ba61a38eb 100755 --- a/kapitan/dependency_manager/helm/build.sh +++ b/kapitan/dependency_manager/helm/build.sh @@ -5,13 +5,24 @@ set -euo pipefail cd $(dirname "$0") pwd -so_name="helm_fetch.so" +# append platform name to the .so file name, corresponding to python's platform.system() +if [[ "$OSTYPE" == "linux-gnu" ]]; then + os_suffix="Linux" +elif [[ "$OSTYPE" == "darwin"* ]]; then + os_suffix="Darwin" +fi + +so_name="helm_fetch_$os_suffix.so" # Compile the binding if a Go runtime exists if [[ -z $(which go) ]]; then echo "[WARN] go is not available on this system -- skipping Helm binding build!" else - go build -buildmode=c-shared -o $so_name helm_fetch.go + if [[ "$os_suffix" == "Linux" ]]; then + GOOS=linux GOARCH=amd64 go build -buildmode=c-shared -o $so_name helm_fetch.go + elif [[ "$os_suffix" == "Darwin" ]]; then + GOOS=darwin GOARCH=amd64 go build -buildmode=c-shared -o $so_name helm_fetch.go + fi fi # Validate that the compiled binding exists diff --git a/kapitan/inputs/helm/__init__.py b/kapitan/inputs/helm/__init__.py index a3f938443..cdd05cc80 100644 --- a/kapitan/inputs/helm/__init__.py +++ b/kapitan/inputs/helm/__init__.py @@ -24,10 +24,11 @@ def __init__(self, compile_path, search_paths, ref_controller): def initialise_binding(self): """returns the dl_opened library (.so file) if exists, otherwise None""" - if platform.system() not in ("Linux", "Darwin"): # TODO: later add binding for Mac + if platform.system() not in ("Linux", "Darwin"): return None - # binding_path is kapitan/inputs/helm/libtemplate.so - binding_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "libtemplate.so") + # binding_path is kapitan/inputs/helm/libtemplate_.so + binding_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), + "libtemplate_{}.so".format(platform.system())) if not os.path.exists(binding_path): logger.debug("The helm binding does not exist at {}".format(binding_path)) return None diff --git a/kapitan/inputs/helm/build.sh b/kapitan/inputs/helm/build.sh index e7afd9c47..723521533 100755 --- a/kapitan/inputs/helm/build.sh +++ b/kapitan/inputs/helm/build.sh @@ -3,13 +3,24 @@ cd $(dirname "$0") pwd -so_name="libtemplate.so" +# append platform name to the .so file name, corresponding to python's platform.system() +if [[ "$OSTYPE" == "linux-gnu" ]]; then + os_suffix="Linux" +elif [[ "$OSTYPE" == "darwin"* ]]; then + os_suffix="Darwin" +fi + +so_name="libtemplate_$os_suffix.so" # Compile the binding if a Go runtime exists if [[ -z $(which go) ]]; then echo "[WARN] go is not available on this system -- skipping Helm binding build!" else - go build -buildmode=c-shared -o $so_name template.go + if [[ "$os_suffix" == "Linux" ]]; then + GOOS=linux GOARCH=amd64 go build -buildmode=c-shared -o $so_name template.go + elif [[ "$os_suffix" == "Darwin" ]]; then + GOOS=darwin GOARCH=amd64 go build -buildmode=c-shared -o $so_name template.go + fi fi # Validate that the compiled binding exists diff --git a/kapitan/inputs/helm/helm_binding.py b/kapitan/inputs/helm/helm_binding.py index 57b5406e0..56f4ade54 100644 --- a/kapitan/inputs/helm/helm_binding.py +++ b/kapitan/inputs/helm/helm_binding.py @@ -3,6 +3,6 @@ ffi = _cffi_backend.FFI('helm_binding', _version = 0x2601, - _types = b'\x00\x00\x01\x0D\x00\x00\x0B\x03\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x00\x0F\x00\x00\x0C\x0D\x00\x00\x0C\x03\x00\x00\x00\x0F\x00\x00\x02\x01\x00\x00\x00\x01', - _globals = (b'\x00\x00\x08\x23free',0,b'\x00\x00\x00\x23renderChart',0), + _types = b'\x00\x00\x01\x0D\x00\x00\x0D\x03\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x01\x03\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x0E\x0D\x00\x00\x0E\x03\x00\x00\x00\x0F\x00\x00\x02\x01\x00\x00\x00\x01', + _globals = (b'\x00\x00\x0A\x23free',0,b'\x00\x00\x00\x23renderChart',0), ) diff --git a/scripts/build-mac-osx-binary.sh b/scripts/build-mac-osx-binary.sh new file mode 100644 index 000000000..e71e5e8f6 --- /dev/null +++ b/scripts/build-mac-osx-binary.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# install pip dependencies + +# pip3 install pyinstaller + +# bash scripts/pyinstaller.sh diff --git a/scripts/pyinstaller.sh b/scripts/pyinstaller.sh index c9040db24..8f4636040 100755 --- a/scripts/pyinstaller.sh +++ b/scripts/pyinstaller.sh @@ -5,14 +5,22 @@ set -e +if [[ "$OSTYPE" == "linux-gnu" ]]; then + os_suffix="Linux" +elif [[ "$OSTYPE" == "darwin"* ]]; then + os_suffix="Darwin" +fi + +lc_os=$(echo $os_suffix | sed 's/./\L&/g') + entry='__main__' -output_name='kapitan-linux-amd64' +output_name="kapitan-$lc_os-amd64" pyi-makespec kapitan/"$entry".py --onefile \ - --add-data kapitan/reclass/reclass:reclass \ - --add-data kapitan/lib:kapitan/lib \ - --add-data kapitan/inputs/templates:kapitan/inputs/templates \ - --add-data kapitan/inputs/helm/libtemplate.so:kapitan/inputs/helm \ - --add-data kapitan/dependency_manager/helm/helm_fetch.so:kapitan/dependency_manager/helm \ + --add-data "kapitan/reclass/reclass:reclass" \ + --add-data "kapitan/lib:kapitan/lib" \ + --add-data "kapitan/inputs/templates:kapitan/inputs/templates" \ + --add-data "kapitan/inputs/helm/libtemplate_$os_suffix.so:kapitan/inputs/helm" \ + --add-data "kapitan/dependency_manager/helm/helm_fetch_$os_suffix.so:kapitan/dependency_manager/helm" \ --hidden-import pyparsing --hidden-import jsonschema \ --exclude-module doctest --exclude-module pydoc pyinstaller "$entry".spec --clean