1
0
Fork 0
mirror of https://github.com/deepfakes/faceswap synced 2025-06-07 10:43:27 -04:00
faceswap/.install/windows/install.nsi
torzdf 6a3b674bef
Rebase code (#1326)
* Remove tensorflow_probability requirement

* setup.py - fix progress bars

* requirements.txt: Remove pre python 3.9 packages

* update apple requirements.txt

* update INSTALL.md

* Remove python<3.9 code

* setup.py - fix Windows Installer

* typing: python3.9 compliant

* Update pytest and readthedocs python versions

* typing fixes

* Python Version updates
  - Reduce max version to 3.10
  - Default to 3.10 in installers
  - Remove incompatible 3.11 tests

* Update dependencies

* Downgrade imageio dep for Windows

* typing: merge optional unions and fixes

* Updates
  - min python version 3.10
  - typing to python 3.10 spec
  - remove pre-tf2.10 code
  - Add conda tests

* train: re-enable optimizer saving

* Update dockerfiles

* Update setup.py
  - Apple Conda deps to setup.py
  - Better Cuda + dependency handling

* bugfix: Patch logging to prevent Autograph errors

* Update dockerfiles

* Setup.py - Setup.py - stdout to utf-8

* Add more OSes to github Actions

* suppress mac-os end to end test
2023-06-27 11:27:47 +01:00

468 lines
No EOL
14 KiB
NSIS

!include MUI2.nsh
!include nsDialogs.nsh
!include winmessages.nsh
!include LogicLib.nsh
!include CPUFeatures.nsh
!include MultiDetailPrint.nsi
# Installer names and locations
OutFile "faceswap_setup_x64.exe"
Name "Faceswap"
InstallDir $PROFILE\faceswap
# Sometimes miniconda breaks. Uncomment/comment the following 2 lines to pin
!define wwwConda "https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe"
#!define wwwConda "https://repo.anaconda.com/miniconda/Miniconda3-4.5.12-Windows-x86_64.exe"
!define wwwRepo "https://github.com/deepfakes/faceswap.git"
!define wwwFaceswap "https://www.faceswap.dev"
# Faceswap Specific
!define flagsSetup "--installer"
# Install cli flags
!define flagsConda "/S /RegisterPython=0 /AddToPath=0 /D=$PROFILE\MiniConda3"
!define flagsRepo "--depth 1 --no-single-branch ${wwwRepo}"
!define flagsEnv "-y python=3.10"
# Folders
Var ProgramData
Var dirTemp
Var dirMiniconda
Var dirMinicondaAll
Var dirAnaconda
Var dirAnacondaAll
Var dirConda
# Items to Install
Var InstallConda
# Misc
Var InstallFailed
Var lblPos
Var hasAVX
Var hasSSE4
Var setupType
Var ctlRadio
Var ctlCondaText
Var ctlCondaButton
Var Log
Var envName
# Modern UI2
!define MUI_COMPONENTSPAGE_NODESC
!define MUI_ABORTWARNING
# Install Location Page
!define MUI_ICON "fs_logo.ico"
!define MUI_PAGE_HEADER_TEXT "Faceswap.py Installer"
!define MUI_PAGE_HEADER_SUBTEXT "Install Location"
!define MUI_DIRECTORYPAGE_TEXT_DESTINATION "Select Destination Folder:"
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE VerifyInstallDir
!insertmacro MUI_PAGE_DIRECTORY
# Install Prerequisites Page
Page custom pgPrereqCreate pgPrereqLeave
# Install Faceswap Page
!define MUI_PAGE_CUSTOMFUNCTION_SHOW InstFilesShow
!define MUI_PAGE_HEADER_SUBTEXT "Installing Faceswap..."
!insertmacro MUI_PAGE_INSTFILES
# Set language (or Modern UI doesn't work)
!insertmacro MUI_LANGUAGE "English"
# Init
Function .onInit
SetShellVarContext all
StrCpy $ProgramData $APPDATA
SetShellVarContext current
# It's better to put stuff in $pluginsdir, $temp is shared
InitPluginsDir
StrCpy $dirTemp "$pluginsdir\faceswap\temp"
StrCpy $dirMiniconda "$PROFILE\Miniconda3"
StrCpy $dirAnaconda "$PROFILE\Anaconda3"
StrCpy $dirMinicondaAll "$ProgramData\Miniconda3"
StrCpy $dirAnacondaAll "$ProgramData\Anaconda3"
StrCpy $envName "faceswap"
SetOutPath "$dirTemp"
Call CheckPrerequisites
FunctionEnd
# Enable the cancel button during installation
Function InstFilesShow
GetDlgItem $0 $HWNDPARENT 2
EnableWindow $0 1
FunctionEnd
Function VerifyInstallDir
# Check install folder does not already exist
IfFileExists $INSTDIR 0 +3
MessageBox MB_OK "Destination directory exists. Please select an alternative location"
Abort
FunctionEnd
Function Abort
MessageBox MB_OK "Some applications failed to install. Process Aborted. Check Details."
Abort "Install Aborted"
FunctionEnd
Function pgPrereqCreate
!insertmacro MUI_HEADER_TEXT "Faceswap.py Installer" "Customize Install"
nsDialogs::Create 1018
Pop $0
${If} $0 == error
Abort
${EndIf}
StrCpy $lblPos 14
# Info Installing applications
${NSD_CreateGroupBox} 5% 5% 90% 35% "The following applications will be installed"
Pop $0
${If} $InstallConda == 1
${NSD_CreateLabel} 10% $lblPos% 80% 14u "MiniConda 3"
Pop $0
intOp $lblPos $lblPos + 7
${EndIf}
${NSD_CreateLabel} 10% $lblPos% 80% 14u "Faceswap"
Pop $0
StrCpy $lblPos 46
# Info Custom Options
${NSD_CreateGroupBox} 5% 40% 90% 60% "Custom Items"
Pop $0
${NSD_CreateRadioButton} 10% $lblPos% 27% 11u "Setup for NVIDIA GPU"
Pop $ctlRadio
${NSD_AddStyle} $ctlRadio ${WS_GROUP}
nsDialogs::SetUserData $ctlRadio "nvidia"
${NSD_OnClick} $ctlRadio RadioClick
${NSD_CreateRadioButton} 40% $lblPos% 25% 11u "Setup for DirectML"
Pop $ctlRadio
nsDialogs::SetUserData $ctlRadio "directml"
${NSD_OnClick} $ctlRadio RadioClick
${NSD_CreateRadioButton} 70% $lblPos% 20% 11u "Setup for CPU"
Pop $ctlRadio
nsDialogs::SetUserData $ctlRadio "cpu"
${NSD_OnClick} $ctlRadio RadioClick
intOp $lblPos $lblPos + 10
${NSD_CreateLabel} 10% $lblPos% 80% 10u "Environment Name (NB: Existing envs with this name will be deleted):"
pop $0
intOp $lblPos $lblPos + 7
${NSD_CreateText} 10% $lblPos% 80% 11u "$envName"
Pop $envName
intOp $lblPos $lblPos + 11
${If} $InstallConda == 1
${NSD_CreateLabel} 10% $lblPos% 80% 18u "Conda is required but could not be detected. If you have Conda already installed specify the location below, otherwise leave blank:"
Pop $0
intOp $lblPos $lblPos + 13
${NSD_CreateText} 10% $lblPos% 73% 12u ""
Pop $ctlCondaText
${NSD_CreateButton} 83% $lblPos% 7% 12u "..."
Pop $ctlCondaButton
${NSD_OnClick} $ctlCondaButton fnc_hCtl_test_DirRequest1_Click
${EndIf}
nsDialogs::Show
FunctionEnd
Function RadioClick
Pop $R0
nsDialogs::GetUserData $R0
Pop $setupType
FunctionEnd
Function fnc_hCtl_test_DirRequest1_Click
Pop $R0
${If} $R0 == $ctlCondaButton
${NSD_GetText} $ctlCondaText $R0
nsDialogs::SelectFolderDialog /NOUNLOAD "" "$R0"
Pop $R0
${If} "$R0" != "error"
${NSD_SetText} $ctlCondaText "$R0"
${EndIf}
${EndIf}
FunctionEnd
Function pgPrereqLeave
call CheckSetupType
Call CheckCustomCondaPath
${NSD_GetText} $envName $envName
FunctionEnd
Function CheckSetupType
${If} $setupType == ""
MessageBox MB_OK "Please specify whether to setup for Nvidia, DirectML or CPU."
Abort
${EndIf}
StrCpy $Log "$log(check) Setting up for: $setupType$\n"
FunctionEnd
Function CheckCustomCondaPath
${NSD_GetText} $ctlCondaText $2
${If} $2 != ""
nsExec::ExecToStack "$\"$2\Scripts\conda.exe$\" -V"
pop $0
pop $1
${If} $0 == 0
StrCpy $InstallConda 0
StrCpy $dirConda "$2"
StrCpy $Log "$log(check) Custom Conda found: $1$\n"
${Else}
StrCpy $Log "$log(error) Custom Conda not found at: $2. Installing MiniConda$\n"
${EndIf}
${EndIf}
FunctionEnd
Function CheckConda
# miniconda
nsExec::ExecToStack "$\"$dirMiniconda\Scripts\conda.exe$\" -V"
pop $0
pop $1
nsExec::ExecToStack "$\"$dirMinicondaAll\Scripts\conda.exe$\" -V"
pop $2
pop $3
# anaconda
nsExec::ExecToStack "$\"$dirAnaconda\Scripts\conda.exe$\" -V"
pop $4
pop $5
nsExec::ExecToStack "$\"$dirAnacondaAll\Scripts\conda.exe$\" -V"
pop $6
pop $7
${If} $0 == 0
StrCpy $dirConda "$dirMiniconda"
StrCpy $Log "$log(check) MiniConda installed: $1"
${ElseIf} $2 == 0
StrCpy $dirConda "$dirMinicondaAll"
StrCpy $Log "$log(check) MiniConda installed: $3"
${ElseIf} $4 == 0
StrCpy $dirConda "$dirAnaconda"
StrCpy $Log "$log(check) AnaConda installed: $5"
${ElseIf} $6 == 0
StrCpy $dirConda "$dirAnacondaAll"
StrCpy $Log "$log(check) AnaConda installed: $7"
${EndIf}
FunctionEnd
Function CheckPrerequisites
# Conda
Call CheckConda
Push $PROFILE
Call CheckForSpaces
Pop $R0
# If spaces in user profile look for and install Conda in C:
${If} $dirConda == ""
${AndIf} $R0 != 0
StrCpy $dirMiniconda "C:\Miniconda3"
StrCpy $dirAnaconda "C:\Anaconda3"
Call CheckConda
${EndIf}
${If} $dirConda == ""
StrCpy $InstallConda 1
${EndIf}
# CPU Capabilities
${If} ${CPUSupports} "AVX2"
${OrIf} ${CPUSupports} "AVX1"
StrCpy $Log "$log(check) CPU Supports AVX Instructions$\n"
StrCpy $hasAVX 1
${EndIf}
${If} ${CPUSupports} "SSE4.2"
${OrIf} ${CPUSupports} "SSE4"
StrCpy $Log "$log(check) CPU Supports SSE4 Instructions$\n"
StrCpy $hasSSE4 1
${EndIf}
StrCpy $Log "$Log(check) Completed check for installed applications$\n"
FunctionEnd
Function CheckForSpaces
# Check a string for space (Used for defining MiniConda install Location)
Exch $R0
Push $R1
Push $R2
Push $R3
StrCpy $R1 -1
StrCpy $R3 $R0
StrCpy $R0 0
loop:
StrCpy $R2 $R3 1 $R1
IntOp $R1 $R1 - 1
StrCmp $R2 "" done
StrCmp $R2 " " 0 loop
IntOp $R0 $R0 + 1
Goto loop
done:
Pop $R3
Pop $R2
Pop $R1
Exch $R0
FunctionEnd
Section Install
Push $Log
Call MultiDetailPrint
Call InstallConda
Call SetEnvironment
Call InstallGit
Call CloneRepo
Call SetupFaceSwap
Call AddGuiLauncher
Call DesktopShortcut
ExecShell "open" "${wwwFaceswap}"
DetailPrint "Visit ${wwwFaceswap} for help and support."
SectionEnd
Function InstallConda
${If} $InstallConda == 1
DetailPrint "Downloading Miniconda3..."
inetc::get /caption "Downloading Miniconda3." /canceltext "Cancel" ${wwwConda} "Miniconda3.exe" /end
Pop $0
${If} $0 == "OK"
DetailPrint "Installing Miniconda3. This will take a few minutes..."
SetDetailsPrint listonly
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED "$\"$dirTemp\Miniconda3.exe$\" ${flagsConda}"
pop $0
ExecDos::wait $0
pop $0
StrCpy $dirConda "$dirMiniconda"
SetDetailsPrint both
${If} $0 != 0
DetailPrint "Error Installing Miniconda3"
StrCpy $InstallFailed 1
${EndIf}
${Else}
DetailPrint "Error Downloading Miniconda3"
StrCpy $InstallFailed 1
${EndIf}
${EndIf}
${If} $InstallFailed == 1
Call Abort
${Else}
DetailPrint "Miniconda3 installed."
${EndIf}
FunctionEnd
Function SetEnvironment
DetailPrint "Initializing Conda..."
SetDetailsPrint listonly
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED "$\"$dirConda\scripts\activate.bat$\" && conda update -y -n base -c defaults conda && conda deactivate"
pop $0
ExecDos::wait $0
pop $0
SetDetailsPrint both
DetailPrint "Creating Conda Virtual Environment..."
IfFileExists "$dirConda\envs\$envName" DeleteEnv CreateEnv
DeleteEnv:
DetailPrint "Removing existing Conda Virtual Environment..."
SetDetailsPrint listonly
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED "$\"$dirConda\scripts\activate.bat$\" && conda env remove -y -n $\"$envName$\" && conda deactivate"
pop $0
ExecDos::wait $0
pop $0
SetDetailsPrint both
${If} $0 != 0
DetailPrint "Error deleting Conda Virtual Environment"
Call Abort
${EndIf}
# Often Conda won't actually remove the folder and some of it's contents which leads to permission problems later
IfFileExists "$dirConda\envs\$envName" DeleteFolder CreateEnv
DeleteFolder:
DetailPrint "Deleting stale Conda Virtual Environment files..."
SetDetailsPrint listonly
RMDir /r "$dirConda\envs\$envName"
pop $0
SetDetailsPrint both
${If} $0 != 0
DetailPrint "Error deleting Conda Virtual Environment Folder"
Call Abort
${EndIf}
CreateEnv:
SetDetailsPrint listonly
StrCpy $0 "${flagsEnv}"
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED "$\"$dirConda\scripts\activate.bat$\" && conda create $0 -n $\"$envName$\" && conda deactivate"
pop $0
ExecDos::wait $0
pop $0
SetDetailsPrint both
${If} $0 != 0
DetailPrint "Error Creating Conda Virtual Environment"
Call Abort
${EndIf}
FunctionEnd
Function InstallGit
DetailPrint "Installing Git..."
SetDetailsPrint listonly
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED "$\"$dirConda\scripts\activate.bat$\" && conda activate $\"$envName$\" && conda install git -y -q && conda deactivate"
pop $0
ExecDos::wait $0
pop $0
SetDetailsPrint both
${If} $0 != 0
DetailPrint "Error Installing Git"
StrCpy $InstallFailed 1
${EndIf}
FunctionEnd
Function CloneRepo
DetailPrint "Downloading Faceswap..."
SetDetailsPrint listonly
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED "$\"$dirConda\scripts\activate.bat$\" && conda activate $\"$envName$\" && git clone ${flagsRepo} $\"$INSTDIR$\" && conda deactivate"
pop $0
ExecDos::wait $0
pop $0
SetDetailsPrint both
${If} $0 != 0
DetailPrint "Error Downloading Faceswap"
Call Abort
${EndIf}
FunctionEnd
Function SetupFaceSwap
DetailPrint "Setting up FaceSwap Environment... This may take a while"
StrCpy $0 "${flagsSetup}"
StrCpy $0 "$0 --$setupType"
SetDetailsPrint listonly
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED "$\"$dirConda\scripts\activate.bat$\" && conda activate $\"$envName$\" && python -u $\"$INSTDIR\setup.py$\" $0 && conda deactivate"
pop $0
ExecDos::wait $0
pop $0
SetDetailsPrint both
${If} $0 != 0
DetailPrint "Error Setting up Faceswap"
Call Abort
${EndIf}
FunctionEnd
Function AddGuiLauncher
DetailPrint "Creating GUI Launcher"
SetOutPath "$INSTDIR"
StrCpy $0 "faceswap_win_launcher.bat"
FileOpen $9 "$INSTDIR\$0" w
FileWrite $9 "$\"$dirConda\scripts\activate.bat$\" && conda activate $\"$envName$\" && python $\"$INSTDIR/faceswap.py$\" gui$\r$\n"
FileClose $9
FunctionEnd
Function DesktopShortcut
DetailPrint "Creating Desktop Shortcut"
CreateShortCut "$DESKTOP\FaceSwap.lnk" "$\"$INSTDIR\$0$\"" "" "$INSTDIR\.install\windows\fs_logo.ico"
FunctionEnd