123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- #? 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 <jbreland@legroom.net>
- // 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
|