1 | """ |
---|
2 | This module generates .ss file according to the local config of |
---|
3 | the current application. Please make sure a file named "local_config.py" |
---|
4 | exists in the current directory. Edit local_config.py according to your needs. |
---|
5 | """ |
---|
6 | import local_config |
---|
7 | import os |
---|
8 | import string |
---|
9 | |
---|
10 | REG_PROGRAM = """{app}\MYPROG.EXE"" ""%1""" |
---|
11 | APPLICATION = str(local_config.__appname__ )+ '.exe' |
---|
12 | AppName = str(local_config.__appname__ ) |
---|
13 | AppVerName = str(local_config.__appname__ )+'-'+ str(local_config.__version__) |
---|
14 | Dev = '' |
---|
15 | if AppVerName.lower().count('dev') > 0: |
---|
16 | Dev = '-Dev' |
---|
17 | AppPublisher = local_config._copyright |
---|
18 | AppPublisherURL = local_config._homepage |
---|
19 | AppSupportURL = local_config._homepage |
---|
20 | AppUpdatesURL = local_config._homepage |
---|
21 | ChangesEnvironment = 'true' |
---|
22 | DefaultDirName = os.path.join("{pf}" , AppName+Dev) |
---|
23 | DefaultGroupName = os.path.join(local_config.DefaultGroupName, AppVerName) |
---|
24 | |
---|
25 | OutputBaseFilename = local_config.OutputBaseFilename |
---|
26 | SetupIconFile = local_config.SetupIconFile_win |
---|
27 | LicenseFile = 'license.txt' |
---|
28 | DisableProgramGroupPage = 'yes' |
---|
29 | Compression = 'lzma' |
---|
30 | SolidCompression = 'yes' |
---|
31 | PrivilegesRequired = 'none' |
---|
32 | INSTALLER_FILE = 'installer_new' |
---|
33 | |
---|
34 | icon_path = local_config.icon_path |
---|
35 | media_path = local_config.media_path |
---|
36 | test_path = local_config.test_path |
---|
37 | |
---|
38 | def find_extension(): |
---|
39 | """ |
---|
40 | Describe the extensions that can be read by the current application |
---|
41 | """ |
---|
42 | list_data = [] |
---|
43 | list_app =[] |
---|
44 | try: |
---|
45 | |
---|
46 | #(ext, type, name, flags) |
---|
47 | from sans.dataloader.loader import Loader |
---|
48 | wild_cards = Loader().get_wildcards() |
---|
49 | for item in wild_cards: |
---|
50 | #['All (*.*)|*.*'] |
---|
51 | file_type, ext = string.split(item, "|*", 1) |
---|
52 | if ext.strip() not in ['.*', ''] and ext.strip() not in list_data: |
---|
53 | list_data.append((ext, 'string', file_type)) |
---|
54 | except: |
---|
55 | pass |
---|
56 | try: |
---|
57 | file_type, ext = string.split(local_config.APPLICATION_WLIST, "|*", 1) |
---|
58 | if ext.strip() not in ['.', ''] and ext.strip() not in list_app: |
---|
59 | list_app.append((ext, 'string', file_type)) |
---|
60 | except: |
---|
61 | pass |
---|
62 | try: |
---|
63 | for item in local_config.PLUGINS_WLIST: |
---|
64 | file_type, ext = string.split(item, "|*", 1) |
---|
65 | if ext.strip() not in ['.', ''] and ext.strip() not in list_app: |
---|
66 | list_app.append((ext, 'string', file_type)) |
---|
67 | except: |
---|
68 | pass |
---|
69 | return list_data, list_app |
---|
70 | DATA_EXTENSION, APP_EXTENSION = find_extension() |
---|
71 | |
---|
72 | def write_registry(data_extension=None, app_extension=None): |
---|
73 | """ |
---|
74 | create file association for windows. |
---|
75 | Allow open file on double click |
---|
76 | """ |
---|
77 | msg = "" |
---|
78 | if data_extension is not None and data_extension: |
---|
79 | openwithlist = "OpenWithList\%s" % str(APPLICATION) |
---|
80 | msg = "\n\n[Registry]\n" |
---|
81 | for (ext, type, _) in data_extension: |
---|
82 | list = os.path.join(ext, openwithlist) |
---|
83 | msg += """Root: HKCR;\tSubkey: "%s";\t""" % str(list) |
---|
84 | msg += """ Flags: %s""" % str('uninsdeletekey noerror') |
---|
85 | msg += "\n" |
---|
86 | #list the file on right-click |
---|
87 | msg += """Root: HKCR; Subkey: "applications\%s\shell\open\command";\t"""\ |
---|
88 | % str(APPLICATION) |
---|
89 | msg += """ValueType: %s; """ % str('string') |
---|
90 | msg += """ValueName: "%s";\t""" %str('') |
---|
91 | msg += """ValueData: \"""{app}\%s"" ""%s1\"""; \t"""% (str(APPLICATION), |
---|
92 | str('%')) |
---|
93 | msg += """ Flags: %s""" % str('uninsdeletevalue noerror') |
---|
94 | msg += "\n" |
---|
95 | user_list = "Software\Classes" |
---|
96 | for (ext, type, _) in data_extension: |
---|
97 | list = os.path.join(user_list, ext, openwithlist) |
---|
98 | msg += """Root: HKCU;\tSubkey: "%s";\t""" % str(list) |
---|
99 | msg += """ Flags: %s""" % str('uninsdeletekey noerror') |
---|
100 | msg += "\n" |
---|
101 | #list the file on right-click |
---|
102 | user_list = os.path.join("Software", "Classes", "applications") |
---|
103 | msg += """Root: HKCU; Subkey: "%s\%s\shell\open\command";\t"""\ |
---|
104 | % (str(user_list), str(APPLICATION)) |
---|
105 | msg += """ValueType: %s; """ % str('string') |
---|
106 | msg += """ValueName: "%s";\t""" %str('') |
---|
107 | msg += """ValueData: \"""{app}\%s"" ""%s1\"""; \t"""% (str(APPLICATION), |
---|
108 | str('%')) |
---|
109 | msg += """ Flags: %s""" % str('uninsdeletevalue noerror') |
---|
110 | msg += "\n" |
---|
111 | if app_extension is not None and app_extension: |
---|
112 | for (ext, type, _) in app_extension: |
---|
113 | msg += """Root: HKCR;\tSubkey: "%s";\t""" % str(ext) |
---|
114 | msg += """ValueType: %s;\t""" % str(type) |
---|
115 | #file type empty set the current application as the default |
---|
116 | #reader for this file. change the value of file_type to another |
---|
117 | #string modify the default reader |
---|
118 | file_type = '' |
---|
119 | msg += """ValueName: "%s";\t""" % str('') |
---|
120 | msg += """ValueData: "{app}\%s";\t""" % str(APPLICATION) |
---|
121 | msg += """ Flags: %s""" % str('uninsdeletevalue') |
---|
122 | msg += "\n" |
---|
123 | msg += """Root: HKCR; Subkey: "{app}\%s";\t""" % str(APPLICATION) |
---|
124 | msg += """ValueType: %s; """ % str('string') |
---|
125 | msg += """ValueName: "%s";\t""" % str('') |
---|
126 | msg += """ValueData: "{app}\%s";\t""" % str("SansView File") |
---|
127 | msg += """ Flags: %s \t""" % str("uninsdeletekey") |
---|
128 | msg += "\n" |
---|
129 | |
---|
130 | #execute the file on double-click |
---|
131 | msg += """Root: HKCR; Subkey: "{app}\%s\shell\open\command";\t""" % str(APPLICATION) |
---|
132 | msg += """ValueType: %s; """ % str('string') |
---|
133 | msg += """ValueName: "%s";\t""" %str('') |
---|
134 | msg += """ValueData: \"""{app}\%s"" ""%s1\""";\t"""% (str(APPLICATION), |
---|
135 | str('%')) |
---|
136 | msg += """ Flags: %s \t""" % str("uninsdeletevalue noerror") |
---|
137 | msg += "\n" |
---|
138 | #create default icon |
---|
139 | msg += """Root: HKCR; Subkey: "{app}\%s";\t""" % str(SetupIconFile) |
---|
140 | msg += """ValueType: %s; """ % str('string') |
---|
141 | msg += """ValueName: "%s";\t""" % str('') |
---|
142 | msg += """ValueData: "{app}\%s,0"\n""" % str(APPLICATION) |
---|
143 | |
---|
144 | |
---|
145 | #SANSVIEWPATH |
---|
146 | msg += """Root: HKLM; Subkey: "%s";\t""" % str('SYSTEM\CurrentControlSet\Control\Session Manager\Environment') |
---|
147 | msg += """ValueType: %s; """ % str('expandsz') |
---|
148 | msg += """ValueName: "%s";\t""" % str('SANSVIEWPATH') |
---|
149 | msg += """ValueData: "{app}";\t""" |
---|
150 | msg += """ Flags: %s""" % str('uninsdeletevalue') |
---|
151 | msg += "\n" |
---|
152 | |
---|
153 | #PATH |
---|
154 | msg += """; Write to PATH (below) is disabled; need more tests\n""" |
---|
155 | msg += """;Root: HKCU; Subkey: "%s";\t""" % str('Environment') |
---|
156 | msg += """ValueType: %s; """ % str('expandsz') |
---|
157 | msg += """ValueName: "%s";\t""" % str('PATH') |
---|
158 | msg += """ValueData: "%s;{olddata}";\t""" % str('%SANSVIEWPATH%') |
---|
159 | msg += """ Check: %s""" % str('NeedsAddPath()') |
---|
160 | msg += "\n" |
---|
161 | |
---|
162 | return msg |
---|
163 | |
---|
164 | def write_language(language=['english'], msfile="compiler:Default.isl"): |
---|
165 | """ |
---|
166 | define the language of the application |
---|
167 | """ |
---|
168 | msg = '' |
---|
169 | if language: |
---|
170 | msg = "\n\n[Languages]\n" |
---|
171 | for lang in language: |
---|
172 | msg += """Name: "%s";\tMessagesFile: "%s"\n""" % (str(lang), |
---|
173 | str(msfile)) |
---|
174 | return msg |
---|
175 | |
---|
176 | def write_tasks(): |
---|
177 | """ |
---|
178 | create desktop icon |
---|
179 | """ |
---|
180 | msg = """\n\n[Tasks]\n""" |
---|
181 | msg += """Name: "desktopicon";\tDescription: "{cm:CreateDesktopIcon}";\t""" |
---|
182 | msg += """GroupDescription: "{cm:AdditionalIcons}";\tFlags: unchecked\n""" |
---|
183 | return msg |
---|
184 | |
---|
185 | dist_path = "dist" |
---|
186 | def write_file(): |
---|
187 | """ |
---|
188 | copy some data files |
---|
189 | """ |
---|
190 | msg = "\n\n[Files]\n" |
---|
191 | msg += """Source: "%s\%s";\t""" % (dist_path, str(APPLICATION)) |
---|
192 | msg += """DestDir: "{app}";\tFlags: ignoreversion\n""" |
---|
193 | msg += """Source: "dist\*";\tDestDir: "{app}";\t""" |
---|
194 | msg += """Flags: ignoreversion recursesubdirs createallsubdirs\n""" |
---|
195 | msg += """Source: "%s\*";\tDestDir: "{app}\%s";\t""" % (str(icon_path), str("images")) |
---|
196 | msg += """Flags: ignoreversion recursesubdirs createallsubdirs\n""" |
---|
197 | msg += """Source: "%s\*";\tDestDir: "{app}\%s";\t""" % (str(test_path), str("test")) |
---|
198 | msg += """Flags: ignoreversion recursesubdirs createallsubdirs\n""" |
---|
199 | msg += """Source: "%s\*";\tDestDir: "{app}\%s";\t""" % (str(media_path), str("media")) |
---|
200 | msg += """Flags: ignoreversion recursesubdirs createallsubdirs\n""" |
---|
201 | msg += """;\tNOTE: Don't use "Flags: ignoreversion" on any shared system files""" |
---|
202 | return msg |
---|
203 | |
---|
204 | def write_icon(): |
---|
205 | """ |
---|
206 | Create application icon |
---|
207 | """ |
---|
208 | msg = """\n\n[Icons]\n""" |
---|
209 | msg += """Name: "{group}\%s";\t""" % str(AppName) |
---|
210 | msg += """Filename: "{app}\%s";\t""" % str(APPLICATION) |
---|
211 | msg += """WorkingDir: "{app}" \n""" |
---|
212 | msg += """Name: "{group}\{cm:UninstallProgram, %s}";\t""" % str(AppName) |
---|
213 | msg += """ Filename: "{uninstallexe}" \n""" |
---|
214 | msg += """Name: "{commondesktop}\%s";\t""" % str(AppVerName) |
---|
215 | msg += """Filename: "{app}\%s";\t""" % str(APPLICATION) |
---|
216 | msg += """Tasks: desktopicon; WorkingDir: "{app}" \n""" |
---|
217 | return msg |
---|
218 | |
---|
219 | def write_run(): |
---|
220 | """ |
---|
221 | execute some file |
---|
222 | """ |
---|
223 | msg = """\n\n[Run]\n""" |
---|
224 | msg += """Filename: "{app}\%s";\t""" % str(APPLICATION) |
---|
225 | msg += """Description: "{cm:LaunchProgram, %s}";\t""" %str(AppName) |
---|
226 | msg += """Flags: nowait postinstall skipifsilent\n""" |
---|
227 | return msg |
---|
228 | |
---|
229 | def write_code(): |
---|
230 | """ |
---|
231 | Code that checks the existing path and snaviewpath |
---|
232 | in the environmental viriables/PATH |
---|
233 | """ |
---|
234 | msg = """\n\n[Code]\n""" |
---|
235 | msg += """function NeedsAddPath(): boolean;\n""" |
---|
236 | msg += """var\n""" |
---|
237 | msg += """ oldpath: string;\n""" |
---|
238 | msg += """ newpath: string;\n""" |
---|
239 | msg += """ pathArr: TArrayOfString;\n""" |
---|
240 | msg += """ i: Integer;\n""" |
---|
241 | msg += """begin\n""" |
---|
242 | msg += """ RegQueryStringValue(HKEY_CURRENT_USER,'Environment',""" |
---|
243 | msg += """'PATH', oldpath)\n""" |
---|
244 | msg += """ oldpath := oldpath + ';';\n""" |
---|
245 | msg += """ newpath := '%SANSVIEWPATH%';\n""" |
---|
246 | msg += """ i := 0;\n""" |
---|
247 | msg += """ while (Pos(';', oldpath) > 0) do begin\n""" |
---|
248 | msg += """ SetArrayLength(pathArr, i+1);\n""" |
---|
249 | msg += """ pathArr[i] := Copy(oldpath, 0, Pos(';', oldpath)-1);\n""" |
---|
250 | msg += """ oldpath := Copy(oldpath, Pos(';', oldpath)+1,""" |
---|
251 | msg += """ Length(oldpath));\n""" |
---|
252 | msg += """ i := i + 1;\n""" |
---|
253 | msg += """ // Check if current directory matches app dir\n""" |
---|
254 | msg += """ if newpath = pathArr[i-1] \n""" |
---|
255 | msg += """ then begin\n""" |
---|
256 | msg += """ Result := False;\n""" |
---|
257 | msg += """ exit;\n""" |
---|
258 | msg += """ end;\n""" |
---|
259 | msg += """ end;\n""" |
---|
260 | msg += """ Result := True;\n""" |
---|
261 | msg += """end;\n""" |
---|
262 | msg += """\n""" |
---|
263 | |
---|
264 | |
---|
265 | |
---|
266 | |
---|
267 | return msg |
---|
268 | |
---|
269 | |
---|
270 | if __name__ == "__main__": |
---|
271 | TEMPLATE = "\n; Script generated by the Inno Setup Script Wizard\n" |
---|
272 | TEMPLATE += "\n; and local_config.py located in this directory.\n " |
---|
273 | TEMPLATE += "; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!" |
---|
274 | TEMPLATE += "\n[Setup]\n\n" |
---|
275 | TEMPLATE += "ChangesAssociations=%s\n" %str('yes') |
---|
276 | TEMPLATE += "AppName=%s\n" % str(AppName) |
---|
277 | TEMPLATE += "AppVerName=%s\n" % str(AppVerName) |
---|
278 | TEMPLATE += "AppPublisher=%s\n" % str(AppPublisher) |
---|
279 | TEMPLATE += "AppPublisherURL=%s\n" % str(AppPublisherURL) |
---|
280 | TEMPLATE += "AppSupportURL=%s\n" % str(AppSupportURL) |
---|
281 | TEMPLATE += "AppUpdatesURL=%s \n" % str(AppUpdatesURL) |
---|
282 | TEMPLATE += "ChangesEnvironment=%s \n" % str(ChangesEnvironment) |
---|
283 | TEMPLATE += "DefaultDirName=%s\n" % str(DefaultDirName) |
---|
284 | TEMPLATE += "DefaultGroupName=%s\n" % str(DefaultGroupName) |
---|
285 | TEMPLATE += "DisableProgramGroupPage=%s\n" % str(DisableProgramGroupPage) |
---|
286 | TEMPLATE += "LicenseFile=%s\n" % str(LicenseFile) |
---|
287 | TEMPLATE += "OutputBaseFilename=%s\n" % str(OutputBaseFilename) |
---|
288 | TEMPLATE += "SetupIconFile=%s\n" % str(SetupIconFile) |
---|
289 | TEMPLATE += "Compression=%s\n" % str(Compression) |
---|
290 | TEMPLATE += "SolidCompression=%s\n" % str(SolidCompression) |
---|
291 | TEMPLATE += "PrivilegesRequired=%s\n" % str(PrivilegesRequired) |
---|
292 | |
---|
293 | TEMPLATE += write_registry(data_extension=DATA_EXTENSION, |
---|
294 | app_extension=APP_EXTENSION) |
---|
295 | TEMPLATE += write_language() |
---|
296 | TEMPLATE += write_tasks() |
---|
297 | TEMPLATE += write_file() |
---|
298 | TEMPLATE += write_icon() |
---|
299 | TEMPLATE += write_run() |
---|
300 | TEMPLATE += write_code() |
---|
301 | path = '%s.iss' % str(INSTALLER_FILE) |
---|
302 | f = open(path,'w') |
---|
303 | f.write(TEMPLATE) |
---|
304 | f.close() |
---|
305 | print "Generate Inno setup installer script complete" |
---|
306 | print "A new file %s.iss should be created.Please refresh your directory" % str(INSTALLER_FILE) |
---|