Rev 51582 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
#-*- perl -*-# Copyright (C) 2001-10 R Development Core Team## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2, or (at your option)# any later version.## This program is distributed in the hope that it will be useful, but# WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU# General Public License for more details.## A copy of the GNU General Public License is available at# http://www.r-project.org/Licenses/# Send any bug reports to r-bugs@r-project.orguse Cwd;use File::Find;my $fn, $component, $path;my $startdir=cwd();my $RVER, $RVER0, $SVN;my $RW=$ARGV[0];my $SRCDIR=$ARGV[1];my $MDISDI=$ARGV[2];my $HelpStyle=$ARGV[3];my $Internet=$ARGV[4];my $Producer = $ARGV[5];my $mode64bit = $ARGV[6];$SRCDIR =~ s+/+\\+g; # need DOS-style paths## add to the target command line in the CmdParms function belowopen ver, "< ../../../VERSION";$RVER = <ver>;close ver;$RVER =~ s/\n.*$//;$RVER =~ s/Under .*$/Pre-release/;$RVER0 = $RVER;$RVER0 =~ s/ .*$//;## now add SVN revisionopen ver, "< ../../../SVN-REVISION";$SVN = <ver>;close ver;$SVN =~s/Revision: //;$RVER0 .= "." . $SVN;if($mode64bit) {$suffix = "win64";$PF = "pf64"; # "pf" should do$QUAL = " x64"; # used for AppName$SUFF = "-x64"; # used for default install dir$RK = "R64"; # arch-specific key} else {$suffix = "win32";$PF = "pf32"; # "pf" should do$QUAL = "";$SUFF = "";$RK = "R32";}open insfile, "> R.iss" || die "Cannot open R.iss\n";print insfile <<END;[Setup]OutputBaseFilename=${RW}-${suffix}PrivilegesRequired=noneMinVersion=0,5.0ENDprint insfile "ArchitecturesInstallIn64BitMode=x64\nArchitecturesAllowed=x64\n" if $mode64bit;my $lines=<<END;AppName=R for Windows$QUAL $RVERAppVerName=R for Windows$QUAL $RVERAppPublisherURL=http://www.r-project.orgAppSupportURL=http://www.r-project.orgAppUpdatesURL=http://www.r-project.orgAppVersion=${RVER}VersionInfoVersion=$RVER0DefaultDirName={code:UserPF}\\R\\${RW}${SUFF}DefaultGroupName=RAllowNoIcons=yesInfoBeforeFile=${SRCDIR}\\COPYINGDisableReadyPage=yesDisableStartupPrompt=yesOutputDir=.WizardSmallImageFile=R.bmpUsePreviousAppDir=noChangesAssociations=yesCompression=lzma/ultraSolidCompression=yesENDmy $lines2=<<END;[Languages]Name: en; MessagesFile: "compiler:Default.isl"Name: br; MessagesFile: "compiler:Languages\\BrazilianPortuguese.isl"Name: ca; MessagesFile: "compiler:Languages\\Catalan.isl"Name: cz; MessagesFile: "compiler:Languages\\Czech.isl"Name: dk; MessagesFile: "compiler:Languages\\Danish.isl"Name: nl; MessagesFile: "compiler:Languages\\Dutch.isl"Name: fi; MessagesFile: "compiler:Languages\\Finnish.isl"Name: fr; MessagesFile: "compiler:Languages\\French.isl"Name: de; MessagesFile: "compiler:Languages\\German.isl"Name: he; MessagesFile: "compiler:Languages\\Hebrew.isl"Name: hu; MessagesFile: "compiler:Languages\\Hungarian.isl"Name: it; MessagesFile: "compiler:Languages\\Italian.isl"Name: ja; MessagesFile: "compiler:Languages\\Japanese.isl"Name: no; MessagesFile: "compiler:Languages\\Norwegian.isl"Name: po; MessagesFile: "compiler:Languages\\Polish.isl"Name: pt; MessagesFile: "compiler:Languages\\Portuguese.isl"Name: ru; MessagesFile: "compiler:Languages\\Russian.isl"Name: sk; MessagesFile: "compiler:Languages\\Slovak.isl"Name: sl; MessagesFile: "compiler:Languages\\Slovenian.isl"Name: es; MessagesFile: "compiler:Languages\\Spanish.isl"Name: chs; MessagesFile: "ChineseSimp.isl"Name: cht; MessagesFile: "ChineseTrad.isl"Name: ko; MessagesFile: "Korean.isl"#include "CustomMsg.txt"[Tasks]Name: "desktopicon"; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; MinVersion: 0,5.0Name: "quicklaunchicon"; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; MinVersion: 0,5.0; Flags: uncheckedName: "recordversion"; Description: {cm:recordversion}; GroupDescription: {cm:regentries}; MinVersion: 0,5.0Name: "associate"; Description: {cm:associate}; GroupDescription: {cm:regentries}; MinVersion: 0,5.0; Check: IsAdmin[Icons]Name: "{group}\\R$QUAL $RVER"; Filename: "{app}\\bin\\Rgui.exe"; WorkingDir: "{userdocs}"; Parameters: {code:CmdParms}Name: "{group}\\Uninstall R$QUAL $RVER"; Filename: "{uninstallexe}"Name: "{commondesktop}\\R$QUAL $RVER"; Filename: "{app}\\bin\\Rgui.exe"; MinVersion: 0,5.0; Tasks: desktopicon; WorkingDir: "{userdocs}"; Parameters: {code:CmdParms}Name: "{userappdata}\\Microsoft\\Internet Explorer\\Quick Launch\\R$QUAL $RVER"; Filename: "{app}\\bin\\Rgui.exe"; Tasks: quicklaunchicon; WorkingDir: "{userdocs}"; Parameters: {code:CmdParms}[Registry]Root: HKLM; Subkey: "Software\\$Producer"; Flags: uninsdeletekeyifempty; Tasks: recordversion; Check: IsAdminRoot: HKLM; Subkey: "Software\\$Producer\\R"; Flags: uninsdeletekeyifempty; Tasks: recordversion; Check: IsAdminRoot: HKLM; Subkey: "Software\\$Producer\\R"; Flags: uninsdeletevalue; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Tasks: recordversion; Check: IsAdminRoot: HKLM; Subkey: "Software\\$Producer\\R"; Flags: uninsdeletevalue; ValueType: string; ValueName: "Current Version"; ValueData: "${RVER}"; Tasks: recordversion; Check: IsAdminRoot: HKLM; Subkey: "Software\\$Producer\\R\\${RVER}"; Flags: uninsdeletekey; Tasks: recordversion; Check: IsAdminRoot: HKLM; Subkey: "Software\\$Producer\\R\\${RVER}"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Tasks: recordversion; Check: IsAdminRoot: HKLM; Subkey: "Software\\$Producer\\${RK}"; Flags: uninsdeletekeyifempty; Tasks: recordversion; Check: IsAdminRoot: HKLM; Subkey: "Software\\$Producer\\${RK}"; Flags: uninsdeletevalue; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Tasks: recordversion; Check: IsAdminRoot: HKLM; Subkey: "Software\\$Producer\\${RK}"; Flags: uninsdeletevalue; ValueType: string; ValueName: "Current Version"; ValueData: "${RVER}"; Tasks: recordversion; Check: IsAdminRoot: HKLM; Subkey: "Software\\$Producer\\${RK}\\${RVER}"; Flags: uninsdeletekey; Tasks: recordversion; Check: IsAdminRoot: HKLM; Subkey: "Software\\$Producer\\${RK}\\${RVER}"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Tasks: recordversion; Check: IsAdminRoot: HKCU; Subkey: "Software\\$Producer"; Flags: uninsdeletekeyifempty; Tasks: recordversion; Check: NonAdminRoot: HKCU; Subkey: "Software\\$Producer\\R"; Flags: uninsdeletekeyifempty; Tasks: recordversion; Check: NonAdminRoot: HKCU; Subkey: "Software\\$Producer\\R"; Flags: uninsdeletevalue; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Tasks: recordversion; Check: NonAdminRoot: HKCU; Subkey: "Software\\$Producer\\R"; Flags: uninsdeletevalue; ValueType: string; ValueName: "Current Version"; ValueData: "${RVER}"; Tasks: recordversion; Check: NonAdminRoot: HKCU; Subkey: "Software\\$Producer\\R\\${RVER}"; Flags: uninsdeletekey; Tasks: recordversion; Check: NonAdminRoot: HKCU; Subkey: "Software\\$Producer\\R\\${RVER}"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Tasks: recordversion; Check: NonAdminRoot: HKCU; Subkey: "Software\\$Producer\\${RK}"; Flags: uninsdeletekeyifempty; Tasks: recordversion; Check: NonAdminRoot: HKCU; Subkey: "Software\\$Producer\\${RK}"; Flags: uninsdeletevalue; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Tasks: recordversion; Check: NonAdminRoot: HKCU; Subkey: "Software\\$Producer\\${RK}"; Flags: uninsdeletevalue; ValueType: string; ValueName: "Current Version"; ValueData: "${RVER}"; Tasks: recordversion; Check: NonAdminRoot: HKCU; Subkey: "Software\\$Producer\\${RK}\\${RVER}"; Flags: uninsdeletekey; Tasks: recordversion; Check: NonAdminRoot: HKCU; Subkey: "Software\\$Producer\\${RK}\\${RVER}"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Tasks: recordversion; Check: NonAdminRoot: HKCR; Subkey: ".RData"; ValueType: string; ValueName: ""; ValueData: "RWorkspace"; Flags: uninsdeletevalue; Tasks: associate; Check: IsAdminRoot: HKCR; Subkey: "RWorkspace"; ValueType: string; ValueName: ""; ValueData: "R Workspace"; Flags: uninsdeletekey; Tasks: associate; Check: IsAdminRoot: HKCR; Subkey: "RWorkspace\\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\\bin\\RGui.exe,0"; Tasks: associate; Check: IsAdminRoot: HKCR; Subkey: "RWorkspace\\shell\\open\\command"; ValueType: string; ValueName: ""; ValueData: """{app}\\bin\\RGui.exe"" ""%1"""; Tasks: associate; Check: IsAdminEND## It is OK to use the same keys in HKLM for 32- and 64-bit versions as the## view of the Registry depends on the arch.## But not for HLCU (and file associations are necessarily for both).print insfile $lines;if($Producer eq "R-core") {print insfile "AppPublisher=R Development Core Team\n";} else {print insfile "AppPublisher=$Producer\n";}print insfile $lines2;print insfile <<END;[Icons]Name: "{group}\\R$QUAL $RVER Help"; Filename: "{app}\\doc\\html\\index.html"; Components: html[Types]Name: "user"; Description: {cm:user}Name: "compact"; Description: {cm:compact}Name: "full"; Description: {cm:full}Name: "custom"; Description: {cm:custom}; Flags: iscustom[Components]Name: "main"; Description: "Main Files"; Types: user compact full custom; Flags: fixedName: "html"; Description: "HTML Manuals"; Types: user full customName: "manuals"; Description: "On-line PDF Manuals"; Types: user full customName: "manuals/basic"; Description: "Basic Manuals"; Types: user full customName: "manuals/technical"; Description: "Technical Manuals"; Types: full customName: "manuals/refman"; Description: "PDF help pages (reference manual)"; Types: full customName: "manuals/libdocs"; Description: "Docs for Packages grid and Matrix"; Types: full customName: "tcl"; Description: "Support Files for Package tcltk"; Types: user full custom; Flags: checkablealoneName: "tcl/tzdata"; Description: "Timezone files for Tcl"; Types: full customName: "tcl/chm"; Description: "Tcl/Tk Help (Compiled HTML)"; Types: full customName: "trans"; Description: "Message Translations"; Types: user full customName: "tests"; Description: "Test files"; Types: full custom[Code]varNoAdminPage: TOutputMsgWizardPage;SelectOptionsPage: TInputOptionWizardPage;MDISDIPage: TInputOptionWizardPage;HelpStylePage: TInputOptionWizardPage;InternetPage: TInputOptionWizardPage;INIFilename: String;function IsAdmin: boolean;beginResult := IsAdminLoggedOn or IsPowerUserLoggedOn;end;function NonAdmin: boolean;beginResult := not IsAdmin;end;procedure InitializeWizard;varoption : String;index : Integer;beginNoAdminPage := CreateOutputMsgPage(wpWelcome, SetupMessage(msgInformationTitle),CustomMessage(\'adminprivilegesrequired\'), CustomMessage(\'adminexplanation\'));SelectOptionsPage := CreateInputOptionPage(wpSelectComponents,CustomMessage(\'startupt'\), CustomMessage(\'startupq\'),CustomMessage(\'startupi\'), True, False);SelectOptionsPage.Add(CustomMessage(\'startup0\'));SelectOptionsPage.Add(CustomMessage(\'startup1\'));SelectOptionsPage.SelectedValueIndex := 1;MDISDIPage := CreateInputOptionPage(SelectOptionsPage.ID,CustomMessage(\'MDIt'\), CustomMessage(\'MDIq\'),CustomMessage(\'MDIi\'), True, False);MDISDIPage.Add(CustomMessage(\'MDI0\'));MDISDIPage.Add(CustomMessage(\'MDI1\'));HelpStylePage := CreateInputOptionPage(MDISDIPage.ID,CustomMessage(\'HelpStylet'\), CustomMessage(\'HelpStyleq\'),CustomMessage(\'HelpStylei\'), True, False);HelpStylePage.Add(CustomMessage(\'HelpStyle0\'));HelpStylePage.Add(CustomMessage(\'HelpStyle1\'));InternetPage := CreateInputOptionPage(HelpStylePage.ID,CustomMessage(\'Internett'\), CustomMessage(\'Internetq\'),CustomMessage(\'Interneti\'), True, False);InternetPage.Add(CustomMessage(\'Internet0\'));InternetPage.Add(CustomMessage(\'Internet1\'));INIFilename := ExpandConstant(\'{param:LOADINF}\');if INIFilename <> \'\' then INIFilename := ExpandFilename(INIFilename);{ From highest to lowest, priority is:LOADINF valuePreviousData valueDefault from build }option := GetPreviousData(\'MDISDI\', \'\');if INIFilename <> '' thenoption := GetIniString(\'R\', \'MDISDI\', option, INIFilename);case option of\'MDI\': index := 0;\'SDI\': index := 1;elseindex := ${MDISDI};end;MDISDIPage.SelectedValueIndex := index;option := GetPreviousData(\'HelpStyle\', \'\');if INIFilename <> \'\' thenoption := GetIniString(\'R\', \'HelpStyle\', option, INIFilename);case option of\'plain\': index := 0;\'CHM\': index := 1;\'HTML\': index := 1;elseindex := ${HelpStyle};end;HelpStylePage.SelectedValueIndex := index;option := GetPreviousData(\'Internet\', \'\');if INIFilename <> \'\' thenoption := GetIniString(\'R\', \'Internet\', option, INIFilename);case option of\'Standard\': index := 0;\'Internet2\': index := 1;elseindex := ${Internet};end;InternetPage.SelectedValueIndex := index;{ Get the save name now, because the current dir might change }INIFilename := ExpandConstant(\'{param:SAVEINF}\');if INIFilename <> \'\' then INIFilename := ExpandFilename(INIFilename);end;procedure RegisterPreviousData(PreviousDataKey: Integer);varMDISDI: String;HelpStyle: String;Internet: String;begin{ Store the settings so we can restore them next time }case MDISDIPage.SelectedValueIndex of0: MDISDI := \'MDI\';1: MDISDI := \'SDI\';end;SetPreviousData(PreviousDataKey, \'MDISDI\', MDISDI);if INIFilename <> \'\' thenSetIniString(\'R\', \'MDISDI\', MDISDI, INIFilename);case HelpStylePage.SelectedValueIndex of0: HelpStyle := \'plain\';1: HelpStyle := \'HTML\';end;SetPreviousData(PreviousDataKey, \'HelpStyle\', HelpStyle);if INIFilename <> \'\' thenSetIniString(\'R\', \'HelpStyle\', HelpStyle, INIFilename);case InternetPage.SelectedValueIndex of0: Internet := \'Standard\';1: Internet := \'Internet2\';end;SetPreviousData(PreviousDataKey, \'Internet\', Internet);if INIFilename <> \'\' thenSetIniString(\'R\', \'Internet\', Internet, INIFilename);end;procedure SetCommentMarker(var lines: TArrayOfString; option: String; active: boolean);vari : integer;beginfor i := 0 to pred(GetArrayLength(lines)) doif pos(option, lines[i]) > 0 thenbeginif active thenlines[i][1] := \' \'elselines[i][1] := \'#\';exit;end;end;procedure EditOptions();varlines : TArrayOfString;filename : String;beginfilename := ExpandConstant(CurrentFilename);LoadStringsFromFile(filename, lines);SetCommentMarker(lines, \'MDI = yes\', MDISDIPage.SelectedValueIndex = 0);SetCommentMarker(lines, \'MDI = no\', MDISDIPage.SelectedValueIndex = 1);SetCommentMarker(lines, \'options(help_type="text"\', HelpStylePage.SelectedValueIndex = 0);SetCommentMarker(lines, \'options(help_type="html"\', HelpStylePage.SelectedValueIndex = 1);SaveStringsToFile(filename, lines, False);end;function CmdParms(Param:String): String;beginResult := \'\';if InternetPage.SelectedValueIndex = 1 thenResult := \'--internet2\';end;function ShouldSkipPage(PageID: Integer): boolean;beginif PageID = NoAdminPage.ID then Result := IsAdminelse if (PageID = MDISDIPage.ID) or (PageID = HelpStylePage.ID) or (PageID = InternetPage.ID) thenResult := SelectOptionsPage.SelectedValueIndex = 1else Result := false;end;function UserPF(Param:String): String;beginResult := ExpandConstant(\'{${PF}}\');if (not IsAdmin) thenbegintryResult := ExpandConstant('\{userdocs}\');except// Do nothing, user doesn't have a My Documents folderend;end;end;[Files]END$path="${SRCDIR}";chdir($path);find(\&listFiles, ".");close insfile;sub listFiles {$fn = $File::Find::name;$fn =~ s+^./++;if (!(-d $_)) {$fn =~ s+/+\\+g;$dir = $fn;$dir =~ s/[^\\]+$//;$dir = "\\".$dir;$dir =~ s/\\$//;$_ = $fn;## These manuals are on the Rgui menu, so should always be installedif ($_ eq "doc\\manual\\R-FAQ.html"|| $_ eq "doc\\html\\rw-FAQ.html"|| $_ eq "share\\texmf\\Sweave.sty") {$component = "main";} elsif (m/^doc\\html/|| m/^library\\[^\\]*\\html/|| $_ eq "library\\R.css") {$component = "main";} elsif (m/^doc\\manual\\[^\\]*\.html/ ) {$component = "html";} elsif ($_ eq "doc\\manual\\R-data.pdf"|| $_ eq "doc\\manual\\R-intro.pdf") {$component = "manuals/basic";} elsif ($_ eq "doc\\manual\\R-admin.pdf"|| $_ eq "doc\\manual\\R-exts.pdf"|| $_ eq "doc\\manual\\R-ints.pdf"|| $_ eq "doc\\manual\\R-lang.pdf") {$component = "manuals/technical";} elsif ($_ eq "doc\\manual\\refman.pdf") {$component = "manuals/refman";} elsif (m/^doc\\manual/ && $_ ne "doc\\manual\\R-FAQ.pdf") {$component = "manuals";} elsif (m/^library\\[^\\]*\\tests/) {$component = "tests";} elsif (m/^tests/) {$component = "tests";} elsif (m/^Tcl\\doc\\.*chm$/) {$component = "tcl/chm";} elsif (m/^Tcl\\lib\\tcl8.5\\tzdata/) {$component = "tcl/tzdata";} elsif (m/^Tcl/) {$component = "tcl";} elsif (m/^library\\grid\\doc/ || m/^library\\Matrix\\doc/) {$component = "manuals/libdocs";} elsif (m/^share\\locale/|| m/^library\\[^\\]*\\po/) {$component = "trans";} else {$component = "main";}$lines="Source: \"$path\\$fn\"; DestDir: \"{app}$dir\"; Flags: ignoreversion; Components: $component";$lines="$lines; AfterInstall: EditOptions()"if $_ eq "etc\\Rprofile.site" || $_ eq "etc\\Rconsole";$lines="$lines\n";print insfile $lines;}}