diff --git a/scripts/common.sh b/scripts/common.sh index 14402138..831fee1b 100644 --- a/scripts/common.sh +++ b/scripts/common.sh @@ -77,11 +77,17 @@ get_platform_arch() { platform=$(get_platform_name) arch=${CROSS_ARCH:-$(uname -m)} if [[ $MSYSTEM != "" ]]; then - if [[ $MSYSTEM == "MINGW64" ]]; then + case "$MSYSTEM" in + MINGW64|UCRT64|CLANG64) arch=x86_64 - else + ;; + MINGW32|CLANG32) arch=i686 - fi + ;; + CLANGARM64) + arch=aarch64 + ;; + esac fi echo "$arch" } diff --git a/scripts/innosetup/innosetup.iss.in b/scripts/innosetup/innosetup.iss.in index 566abe5d..3747d5d4 100644 --- a/scripts/innosetup/innosetup.iss.in +++ b/scripts/innosetup/innosetup.iss.in @@ -26,12 +26,16 @@ AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} -#if Arch=="x64" - ArchitecturesAllowed=x64 - ArchitecturesInstallIn64BitMode=x64 - #define ArchInternal "x86_64" -#else +#if Arch=="x86" #define ArchInternal "i686" +#else + ArchitecturesAllowed={#Arch} + ArchitecturesInstallIn64BitMode={#Arch} + #if Arch=="x64" + #define ArchInternal "x86_64" + #elif Arch=="arm64" + #define ArchInternal "aarch64" + #endif #endif AllowNoIcons=yes @@ -57,9 +61,13 @@ OutputBaseFilename=LiteXL-{#MyAppVersion}-{#ArchInternal}-setup LicenseFile={#SourceDir}/LICENSE SetupIconFile={#SourceDir}/resources/icons/icon.ico +UninstallDisplayIcon={app}\{#MyAppExeName}, 0 WizardImageFile="{#SourceDir}/scripts/innosetup/wizard-modern-image.bmp" WizardSmallImageFile="{#SourceDir}/scripts/innosetup/litexl-55px.bmp" +; Required for the add to path option to refresh environment +ChangesEnvironment=yes + [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" @@ -67,6 +75,7 @@ Name: "english"; MessagesFile: "compiler:Default.isl" Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 6.1; Check: not IsAdminInstallMode Name: "portablemode"; Description: "Portable Mode"; Flags: unchecked +Name: "envPath"; Description: "Add lite-xl to the PATH variable, allowing it to be run from a command line." [Files] Source: "{#SourceDir}/lite-xl/*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs @@ -95,3 +104,62 @@ Filename: "{app}/{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChang [Setup] Uninstallable=not WizardIsTaskSelected('portablemode') + +; Code to add installation path to environment taken from: +; https://stackoverflow.com/a/46609047 +[Code] +const EnvironmentKey = 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'; + +procedure EnvAddPath(Path: string); +var + Paths: string; +begin + { Retrieve current path (use empty string if entry not exists) } + if not RegQueryStringValue(HKEY_LOCAL_MACHINE, EnvironmentKey, 'Path', Paths) + then Paths := ''; + + { Skip if string already found in path } + if Pos(';' + Uppercase(Path) + ';', ';' + Uppercase(Paths) + ';') > 0 then exit; + + { App string to the end of the path variable } + Paths := Paths + ';'+ Path +';' + + { Overwrite (or create if missing) path environment variable } + if RegWriteStringValue(HKEY_LOCAL_MACHINE, EnvironmentKey, 'Path', Paths) + then Log(Format('The [%s] added to PATH: [%s]', [Path, Paths])) + else Log(Format('Error while adding the [%s] to PATH: [%s]', [Path, Paths])); +end; + +procedure EnvRemovePath(Path: string); +var + Paths: string; + P: Integer; +begin + { Skip if registry entry not exists } + if not RegQueryStringValue(HKEY_LOCAL_MACHINE, EnvironmentKey, 'Path', Paths) then + exit; + + { Skip if string not found in path } + P := Pos(';' + Uppercase(Path) + ';', ';' + Uppercase(Paths) + ';'); + if P = 0 then exit; + + { Update path variable } + Delete(Paths, P - 1, Length(Path) + 1); + + { Overwrite path environment variable } + if RegWriteStringValue(HKEY_LOCAL_MACHINE, EnvironmentKey, 'Path', Paths) + then Log(Format('The [%s] removed from PATH: [%s]', [Path, Paths])) + else Log(Format('Error while removing the [%s] from PATH: [%s]', [Path, Paths])); +end; + +procedure CurStepChanged(CurStep: TSetupStep); +begin + if (CurStep = ssPostInstall) and WizardIsTaskSelected('envPath') + then EnvAddPath(ExpandConstant('{app}')); +end; + +procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); +begin + if CurUninstallStep = usPostUninstall + then EnvRemovePath(ExpandConstant('{app}')); +end; diff --git a/scripts/innosetup/innosetup.sh b/scripts/innosetup/innosetup.sh index a37a2836..86ab89d1 100644 --- a/scripts/innosetup/innosetup.sh +++ b/scripts/innosetup/innosetup.sh @@ -29,13 +29,24 @@ main() { local version local output - if [[ $MSYSTEM == "MINGW64" ]]; then + case "$MSYSTEM" in + MINGW64|UCRT64|CLANG64) arch=x64 arch_file=x86_64 - else - arch=i686; + ;; + MINGW32|CLANG32) + arch=x86 arch_file=i686 - fi + ;; + CLANGARM64) + arch=arm64 + arch_file=aarch64 + ;; + *) + echo "error: unsupported MSYSTEM type: $MSYSTEM" + exit 1 + ;; + esac initial_arg_count=$# diff --git a/scripts/package.sh b/scripts/package.sh index d9a9c14c..46d6c231 100644 --- a/scripts/package.sh +++ b/scripts/package.sh @@ -213,14 +213,18 @@ main() { if [[ $platform == "windows" ]]; then exe_file="${exe_file}.exe" stripcmd="strip --strip-all" - # Copy MinGW libraries dependencies. - # MSYS2 ldd command seems to be only 64bit, so use ntldd - # see https://github.com/msys2/MINGW-packages/issues/4164 - ntldd -R "${exe_file}" \ - | grep mingw \ - | awk '{print $3}' \ - | sed 's#\\#/#g' \ - | xargs -I '{}' cp -v '{}' "$(pwd)/${dest_dir}/" + if command -v ntldd >/dev/null 2>&1; then + # Copy MinGW libraries dependencies. + # MSYS2 ldd command seems to be only 64bit, so use ntldd + # see https://github.com/msys2/MINGW-packages/issues/4164 + ntldd -R "${exe_file}" \ + | grep mingw \ + | awk '{print $3}' \ + | sed 's#\\#/#g' \ + | xargs -I '{}' cp -v '{}' "$(pwd)/${dest_dir}/" + else + echo "WARNING: ntldd not found; assuming program is static" + fi else # Windows archive is always portable package_name+="-portable"