#? stdtmpl | standard #proc generateInnoSetup(c: ConfigData): string = # result = "" ; Default Template for NimInst [Setup] AppName=$c.displayName AppVerName=$c.displayName $c.version DefaultDirName={code:GiveMeAPath|$c.displayName} DefaultGroupName=$c.displayName AllowNoIcons=yes LicenseFile=${expandFilename(c.license)} OutputBaseFilename=${c.name}_${c.version} Compression=lzma SolidCompression=yes PrivilegesRequired=none ChangesEnvironment=yes [Languages] Name: english; MessagesFile: compiler:Default.isl [Files] #for i in low(FileCategory)..fcWindows: # for f in items(c.cat[i]): Source: ${expandFilename(f).toWin}; DestDir: {app}\${splitFile(f).dir.toWin}; Flags: ignoreversion # end for #end for [Icons] #if c.app == appConsole: Name: {group}\Console for $c.displayName; Filename: {cmd} #else: Name: {group}\$c.displayName; Filename: {app}\${c.name}.exe #end if #for f in items(c.cat[fcDocStart]): Name: {group}\Documentation; Filename: {app}\${f.toWin} #end for Name: {group}\{cm:UninstallProgram,$c.displayName}; Filename: {uninstallexe} #if c.binPaths.len > 0: [Tasks] Name: modifypath; Description: &Add $c.displayName to your system path (if not in path already); #end if [Code] function GiveMeAPath(const DefaultPathName: string): string; begin if IsAdminLoggedOn then result := ExpandConstant('{pf}') else result := ExpandConstant('{userdocs}'); result := result + '\' + DefaultPathName; end; #if c.binPaths.len > 0: // ---------------------------------------------------------------------------- // // Inno Setup Ver: 5.2.1 // Script Version: 1.3.1 // Author: Jared Breland // Homepage: http://www.legroom.net/software // // Script Function: // Enable modification of system path directly from Inno Setup installers function ModPathDir(): TArrayOfString; begin setArrayLength(result, $c.binPaths.len); #var i = 0 #for b in items(c.binPaths): result[$i] := ExpandConstant('{app}') + '\${b.toWin}'; #inc(i) #end for end; procedure ModPath(); var oldpath, newpath, aExecFile: String; pathArr, aExecArr, pathdir: TArrayOfString; i, d: Integer; begin // Get array of new directories and act on each individually pathdir := ModPathDir(); for d := 0 to GetArrayLength(pathdir)-1 do begin // Modify WinNT path if UsingWinNT() then begin // Get current path, split into an array RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', oldpath); oldpath := oldpath + ';'; i := 0; while (Pos(';', oldpath) > 0) do begin SetArrayLength(pathArr, i+1); pathArr[i] := Copy(oldpath, 0, Pos(';', oldpath)-1); oldpath := Copy(oldpath, Pos(';', oldpath)+1, Length(oldpath)); i := i + 1; // Check if current directory matches app dir if pathdir[d] = pathArr[i-1] then begin // if uninstalling, remove dir from path if IsUninstaller() then continue // if installing, abort because dir was already in path else abort; end; // Add current directory to new path if i = 1 then newpath := pathArr[i-1] else newpath := newpath + ';' + pathArr[i-1]; end; // Append app dir to path if not already included if not IsUninstaller() then newpath := newpath + ';' + pathdir[d]; // Write new path RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', newpath); end else begin // Modify Win9x path // Convert to shortened dirname pathdir[d] := GetShortName(pathdir[d]); // If autoexec.bat exists, check if app dir already exists in path aExecFile := 'C:\AUTOEXEC.BAT'; if FileExists(aExecFile) then begin LoadStringsFromFile(aExecFile, aExecArr); for i := 0 to GetArrayLength(aExecArr)-1 do begin if not IsUninstaller() then begin // If app dir already exists while installing, abort add if (Pos(pathdir[d], aExecArr[i]) > 0) then abort; end else begin // If app dir exists and = what we originally set, // then delete at uninstall if aExecArr[i] = 'SET PATH=%PATH%;' + pathdir[d] then aExecArr[i] := ''; end; end; end; // If app dir not found, or autoexec.bat didn't exist, then // (create and) append to current path if not IsUninstaller() then begin SaveStringToFile(aExecFile, #13#10 + 'SET PATH=%PATH%;' + pathdir[d], True); end else begin // If uninstalling, write the full autoexec out SaveStringsToFile(aExecFile, aExecArr, False); end; end; // Write file to flag modifypath was selected // Workaround since IsTaskSelected() cannot be called at uninstall and // AppName and AppId cannot be "read" in Code section if not IsUninstaller() then SaveStringToFile(ExpandConstant('{app}') + '\uninsTasks.txt', WizardSelectedTasks(False), False); end; end; procedure CurStepChanged(CurStep: TSetupStep); begin if CurStep = ssPostInstall then begin if IsTaskSelected('modifypath') then ModPath(); end end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var appdir, selectedTasks: String; begin appdir := ExpandConstant('{app}'); if CurUninstallStep = usUninstall then begin if LoadStringFromFile(appdir + '\uninsTasks.txt', selectedTasks) then if Pos('modifypath', selectedTasks) > 0 then ModPath(); DeleteFile(appdir + '\uninsTasks.txt') end; end; function NeedRestart(): Boolean; begin result := IsTaskSelected('modifypath') and not UsingWinNT() end; #end if