From 259150f06b46cd4704600c963599a2045eea8f7b Mon Sep 17 00:00:00 2001 From: tpeulen Date: Fri, 20 Sep 2024 20:38:29 +0200 Subject: [PATCH] Fix windows setup build --- build_tools/win/build-setup.bat | 41 ++++++++++++++++----- build_tools/win/make_inno_setup.py | 58 ++++++++++++++++-------------- build_tools/win/setup_template.iss | 24 ++++++------- chisurf/info.py | 8 ++++- conda-recipe/meta.yaml | 4 +-- setup.py | 34 +++++++++--------- 6 files changed, 102 insertions(+), 67 deletions(-) diff --git a/build_tools/win/build-setup.bat b/build_tools/win/build-setup.bat index 14d805ef..4e22bb91 100755 --- a/build_tools/win/build-setup.bat +++ b/build_tools/win/build-setup.bat @@ -1,24 +1,47 @@ +@echo off set "CONDA_ENVIRONMENT_YAML=..\..\environment.yml" set "DIST_PATH=..\..\dist" set "SCRIPT_PATH=%~dp0" set "APP_PATH=..\..\dist\win" -set "SOURCE_PATH=..\..\" +set "SOURCE_PATH=..\.." set "CONDA_RECIPE_FOLDER=..\..\conda-recipe" -rem Assume that conda-build jinja2 pysftp are already installed -rem call conda install -y conda-build jinja2 pysftp -rem call conda build %CONDA_RECIPE_FOLDER% +rem Default behavior: Do not build conda package +set "BUILD_CONDA_PACKAGE=0" +rem Check for command-line arguments +if /I "%1"=="/build" ( + set "BUILD_CONDA_PACKAGE=1" +) + +rem If /build flag is passed, build the Conda package +if %BUILD_CONDA_PACKAGE%==1 ( + echo Building Conda package... + call conda mambabuild %CONDA_RECIPE_FOLDER% +) else ( + echo Skipping Conda package build... +) + +rem Create necessary directories md %DIST_PATH% md %APP_PATH% + +rem Create the conda environment call mamba create -y --prefix %APP_PATH% chisurf -c local -c tpeulen --force -rem call conda activate %APP_PATH% -REM write setup.iss -rem call conda activate %APP_PATH% +rem Generate Inno Setup script python make_inno_setup.py + +rem Optionally deactivate conda environment rem call conda deactivate rem call conda activate base -REM Create an Installer with Inno Setup -"C:\Program Files (x86)\Inno Setup 5\Compil32.exe" /cc setup.iss +rem Create an installer with Inno Setup +"C:\Program Files (x86)\Inno Setup 6\Compil32.exe" /cc setup.iss + +rem Cleaning step: Purge the APP_PATH folder +echo Cleaning up APP_PATH: %APP_PATH%... +rmdir /s /q %APP_PATH% + +echo Script finished. + diff --git a/build_tools/win/make_inno_setup.py b/build_tools/win/make_inno_setup.py index 20dddc47..52683695 100755 --- a/build_tools/win/make_inno_setup.py +++ b/build_tools/win/make_inno_setup.py @@ -4,45 +4,50 @@ import jinja2 import pathlib +module_path = pathlib.Path("../../chisurf").absolute().resolve() +setup_path = pathlib.Path("../..").absolute().resolve() +sys.path.append(str(module_path.resolve())) +sys.path.append(str(setup_path.resolve())) +path = pathlib.Path(module_path) + +import info +from setup import gui_scripts # append the relative location you want to import from # import your module stored in '../common' -module_path = pathlib.Path("../../") -source_dir = pathlib.Path("../../dist/win/").absolute() -output_dir = pathlib.Path("../../dist/").absolute() -license_file = str((module_path / "LICENSE").absolute()) +source_dir = pathlib.Path("../../").resolve() +output_dir = pathlib.Path("../../dist/").resolve() +license_file = str((source_dir / "LICENSE").resolve()) +icon_file = str(path) + info.setup_icon + +print("module_path:", module_path.resolve()) +print("source_dir:", source_dir.resolve()) +print("output_dir:", output_dir.resolve()) +print("license_file:", license_file) +print("icon_file:", icon_file) + vc_runtime_path = "VC++ runtimes/" vc_runtimes = [os.path.basename(f) for f in glob.glob(vc_runtime_path+"/*.exe")] -sys.path.append(str(module_path.absolute())) -path = pathlib.Path(module_path) -print(sys.path) - -setup_file = module_path / "setup.py" -ns = dict() -with open(setup_file) as f: - lines = f.readlines() - # omit last line so that setup() is not called - s = "".join(lines[:-2]) - code = compile(s, '', 'exec') - exec(code) # the parameters come from the setup.py parameters = { - "AppId": __app_id__, - "AppName": __name__, - "AppVersion": __version__, - "AppPublisher": __author__, - "AppPublisherURL": __url__, - "AppSupportURL": __url__, - "AppUpdatesURL": __url__, - "DefaultGroupName": __name__, + "AppId": info.__app_id__, + "AppName": info.__name__, + "AppVersion": info.__version__, + "AppPublisher": info.__author__, + "AppURL": info.__url__, + "AppPublisherURL": info.__url__, + "AppSupportURL": info.__url__, + "AppUpdatesURL": info.__url__, + "DefaultGroupName": info.__name__, "SourceDir": source_dir, "Output_dir": output_dir, - "gui_entry_points": gui_scripts, "LicenseFile": license_file, "vc_runtime_path": vc_runtime_path, - "vc_runtimes": vc_runtimes + "vc_runtimes": vc_runtimes, + "SetupIconFile": icon_file, + "gui_entry_points": gui_scripts } @@ -51,6 +56,7 @@ inno_template += fp.read() t = jinja2.Template(inno_template) inno_script = t.render(**parameters) + print("------ BEGIN INNO SETUP FILE ------") print(inno_script) print("------ END INNO SETUP FILE ------") diff --git a/build_tools/win/setup_template.iss b/build_tools/win/setup_template.iss index 0e5ef7e2..0cb54abf 100755 --- a/build_tools/win/setup_template.iss +++ b/build_tools/win/setup_template.iss @@ -11,20 +11,23 @@ UsePreviousAppDir=no DefaultGroupName={{ AppName }} LicenseFile={{ LicenseFile }} OutputDir={{ Output_dir }} -OutputBaseFilename=setup_{{ AppVersion }} -SetupIconFile=icons\icon.ico +OutputBaseFilename=setup-{{ AppVersion }} +SetupIconFile={{ SetupIconFile }} Compression=lzma2/ultra64 ;Compression=lzma2/fast ;Compression=none SolidCompression=yes -CompressionThreads=4 +CompressionThreads=8 UninstallLogMode=overwrite DirExistsWarning=yes -UninstallDisplayIcon={app}\{{ AppName }} +UninstallDisplayIcon="{app}\{{ AppName }}" DisableProgramGroupPage=no +ArchitecturesAllowed=x64 and not arm64 + ;DiskSliceSize=1073741824 ;DiskSpanning=true + [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" @@ -34,26 +37,21 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{ [Files] ; Icon files must be explicitely included Source: ".\icons\*.ico"; DestDir: "{app}\icons" -Source: "chisurf.cmd"; DestDir: "{app}" -Source: "{{ SourceDir }}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs +;Source: "chisurf.exe"; DestDir: "{app}" +Source: "{{ SourceDir }}\dist\win\**"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs ;uncomment below to add VC Runtimes ;Source: "{{ vc_runtime_path }}\*"; DestDir: {tmp}; Flags: deleteafterinstall Source: "fix_shebangs.py"; DestDir: "{app}"; [Icons] -Name: "{group}\{cm:UninstallProgram,{{ AppName }}}"; Filename: "{uninstallexe}" -{% for entry_point in gui_entry_points %}Name: "{group}\{{ entry_point.lower() }}";Filename: "{app}\chisurf.cmd"; Parameters: {{ entry_point }}.exe;IconFilename: "{app}\icons\icon.ico"; +{% for entry_point in gui_entry_points %}Name: "{group}\{{ entry_point.lower() }}";Filename: {app}\Scripts\{{entry_point}}.exe; IconFilename: "{app}\icons\icon.ico"; {% endfor %} [UninstallDelete] -Type: files; Name: {app}\install.log +Type: files; Name: "{app}\install.log" [Run] ;uncomment below to add VC Runtimes ;{% for vc_runtime in vc_runtimes %}Filename: {tmp}\{{ vc_runtime }}; Parameters: /q ;{% endfor %} - -; We do not want the user to have the option of avoiding this script, so no 'postinstall; flag -{% for entry_point in gui_entry_points %} Filename:{app}\python.exe; WorkingDir:{app}; Parameters: "fix_shebangs.py {{ entry_point }}"; Flags: runascurrentuser runmaximized -{% endfor %} diff --git a/chisurf/info.py b/chisurf/info.py index 066b9968..99325f1e 100755 --- a/chisurf/info.py +++ b/chisurf/info.py @@ -1,6 +1,10 @@ +import pathlib from datetime import date today = date.today() + + + __name__ = "chisurf" __author__ = "Thomas-Otavio Peulen" __version__ = str(today.strftime("%y.%m.%d")) @@ -12,7 +16,9 @@ __license__ = 'GPL2.1' __status__ = "Dev" __description__ = """ChiSurf: an interactive global analysis platform for fluorescence data.""" -__app_id__ = "F25DCFFA-1234-4643-BC4F-2C3A20495937" +__app_id__ = "{{ F25DCFFA-1234-4643-BC4F-2C3A20495937 }}" LONG_DESCRIPTION = """ChiSurf: an interactive global analysis platform for fluorescence data.""" help_url = 'https://github.com/Fluorescence-Tools/chisurf/wiki' update_url = 'https://github.com/Fluorescence-Tools/chisurf/releases' +setup_icon = "/gui/resources/icons/cs_logo.ico" + diff --git a/conda-recipe/meta.yaml b/conda-recipe/meta.yaml index 067ad16e..7f967198 100755 --- a/conda-recipe/meta.yaml +++ b/conda-recipe/meta.yaml @@ -24,7 +24,7 @@ requirements: - python - setuptools - pyopencl - - pocl >=0.14 # [linux or osx] + - pocl >=0.14 # [linux or osx] - oclgrind # [win] - typing_extensions <=4.5 - cython @@ -38,7 +38,7 @@ requirements: - setuptools - cython - pyopencl - - pocl >=0.14 # [linux or osx] + - pocl >=0.14 # [linux or osx] - oclgrind # [win] - typing_extensions <=4.5 - pyyaml diff --git a/setup.py b/setup.py index 568758dd..1b3e160c 100755 --- a/setup.py +++ b/setup.py @@ -1,5 +1,6 @@ #!/usr/bin/python import platform +import pathlib from setuptools import setup, find_packages, Extension try: from Cython.Distutils import build_ext @@ -18,6 +19,19 @@ URL = info.__url__ EMAIL = info.__email__ +def dict_from_txt(fn): + d = {} + with open(fn) as f: + for line in f: + (key, val) = line.split() + d[str(key)] = val + return d + + +script_directory = pathlib.Path(__file__).parent.absolute() +gui_scripts = dict_from_txt(script_directory / "chisurf/entry_points/gui.txt") +console_scripts = dict_from_txt(script_directory / "chisurf/entry_points/cmd.txt") + def get_extensions(): @@ -72,19 +86,6 @@ def make_extension(ext): return list() -def dict_from_txt(fn): - d = {} - with open(fn) as f: - for line in f: - (key, val) = line.split() - d[str(key)] = val - return d - - -gui_scripts = dict_from_txt("./chisurf/entry_points/gui.txt") -console_scripts = dict_from_txt("./chisurf/entry_points/cmd.txt") - - metadata = dict( name=NAME, version=VERSION, @@ -143,12 +144,13 @@ def dict_from_txt(fn): }, entry_points={ "console_scripts": [ - "%s=%s" % (key, console_scripts[key]) for key in console_scripts + f"{key}={console_scripts[key]}" for key in console_scripts ], "gui_scripts": [ - "%s=%s" % (key, gui_scripts[key]) for key in gui_scripts + f"{key}={gui_scripts[key]}" for key in gui_scripts ] } ) -setup(**metadata) +if __name__ == "__main__": + setup(**metadata)