summaryrefslogtreecommitdiffstats
path: root/Lib/distutils/command/bdist_wininst.py
blob: 5e94047c13fffab20d74e321a511ab565cf320bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
"""distutils.command.bdist_wininst

Implements the Distutils 'bdist_wininst' command: create a windows installer
exe-program."""

# created 2000/06/02, Thomas Heller

__revision__ = "$Id$"

import sys, os, string
from distutils.core import Command
from distutils.util import get_platform
from distutils.dir_util import create_tree, remove_tree
from distutils.errors import *

class bdist_wininst (Command):

    description = "create an executable installer for MS Windows"

    user_options = [('bdist-dir=', 'd',
                     "temporary directory for creating the distribution"),
                    ('keep-tree', 'k',
                     "keep the pseudo-installation tree around after " +
                     "creating the distribution archive"),
                    ('target-version=', 'v',
                     "require a specific python version" +
                     " on the target system"),
                    ('no-target-compile', 'c',
                     "do not compile .py to .pyc on the target system"),
                    ('no-target-optimize', 'o',
                     "do not compile .py to .pyo (optimized) on the target system"),
                    ('dist-dir=', 'd',
                     "directory to put final built distributions in"),
                   ]

    def initialize_options (self):
        self.bdist_dir = None
        self.keep_tree = 0
        self.no_target_compile = 0
        self.no_target_optimize = 0
        self.target_version = None
        self.dist_dir = None

    # initialize_options()


    def finalize_options (self):
        if self.bdist_dir is None:
            bdist_base = self.get_finalized_command('bdist').bdist_base
            self.bdist_dir = os.path.join(bdist_base, 'wininst')
        if not self.target_version:
            self.target_version = ""
        if self.distribution.has_ext_modules():
            short_version = sys.version[:3]
            if self.target_version and self.target_version != short_version:
                raise DistutilsOptionError ("target version can only be" +
                                            short_version)
            self.target_version = short_version

        self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'))

    # finalize_options()


    def run (self):
        if (sys.platform != "win32" and
            (self.distribution.has_ext_modules() or
             self.distribution.has_c_libraries())):
            raise DistutilsPlatformError \
                  ("distribution contains extensions and/or C libraries; "
                   "must be compiled on a Windows 32 platform")

        self.run_command ('build')

        install = self.reinitialize_command('install')
        install.root = self.bdist_dir

        install_lib = self.reinitialize_command('install_lib')
        # we do not want to include pyc or pyo files
        install_lib.compile = 0
        install_lib.optimize = 0

        install_lib.ensure_finalized()

        self.announce ("installing to %s" % self.bdist_dir)
        install.ensure_finalized()
        install.run()

        # And make an archive relative to the root of the
        # pseudo-installation tree.
        fullname = self.distribution.get_fullname()
        archive_basename = os.path.join(self.bdist_dir,
                                        "%s.win32" % fullname)

        # XXX hack! Our archive MUST be relative to sys.prefix
        # XXX What about .install_data, .install_scripts, ...?
        # [Perhaps require that all installation dirs be under sys.prefix
        # on Windows?  this will be acceptable until we start dealing
        # with Python applications, at which point we should zip up
        # the application directory -- and again everything can be
        # under one dir --GPW]
        root_dir = install.install_lib
        arcname = self.make_archive (archive_basename, "zip",
                                     root_dir=root_dir)
        self.create_exe (arcname, fullname)

        if not self.keep_tree:
            remove_tree (self.bdist_dir, self.verbose, self.dry_run)

    # run()

    def get_inidata (self):
        # Return data describing the installation.

        lines = []
        metadata = self.distribution.metadata

        # Write the [metadata] section.  Values are written with
        # repr()[1:-1], so they do not contain unprintable characters, and
        # are not surrounded by quote chars.
        lines.append ("[metadata]")

        # 'info' will be displayed in the installer's dialog box,
        # describing the items to be installed.
        info = (metadata.long_description or '') + '\n'

        for name in dir (metadata):
            if (name != 'long_description'):
                data = getattr (metadata, name)
                if data:
                   info = info + ("\n    %s: %s" % \
                                  (string.capitalize (name), data))
                   lines.append ("%s=%s" % (name, repr (data)[1:-1]))

        # The [setup] section contains entries controlling
        # the installer runtime.
        lines.append ("\n[Setup]")
        lines.append ("info=%s" % repr (info)[1:-1])
        lines.append ("pthname=%s.%s" % (metadata.name, metadata.version))
        lines.append ("target_compile=%d" % (not self.no_target_compile))
        lines.append ("target_optimize=%d" % (not self.no_target_optimize))
        if self.target_version:
            lines.append ("target_version=%s" % self.target_version)

        title = self.distribution.get_fullname()
        lines.append ("title=%s" % repr (title)[1:-1])
        return string.join (lines, "\n")

    # get_inidata()

    def create_exe (self, arcname, fullname):
        import struct

        self.mkpath(self.dist_dir)

        cfgdata = self.get_inidata()

        if self.target_version:
            # if we create an installer for a specific python version,
            # it's better to include this in the name
            installer_name = os.path.join(self.dist_dir,
                                          "%s.win32-py%s.exe" %
                                           (fullname, self.target_version))
        else:
            installer_name = os.path.join(self.dist_dir,
                                          "%s.win32.exe" % fullname)
        self.announce ("creating %s" % installer_name)

        file = open (installer_name, "wb")
        file.write (self.get_exe_bytes ())
        file.write (cfgdata)
        header = struct.pack ("<ii",
                              0x12345679,       # tag
                              len (cfgdata))    # length
        file.write (header)
        file.write (open (arcname, "rb").read())

    # create_exe()

    def get_exe_bytes (self):
        import base64
        return base64.decodestring (EXEDATA)

# class bdist_wininst

if __name__ == '__main__':
    # recreate EXEDATA from wininst.exe by rewriting this file
    import re, base64
    moddata = open ("bdist_wininst.py", "r").read()
    exedata = open ("../../misc/wininst.exe", "rb").read()
    print "wininst.exe length is %d bytes" % len (exedata)
    print "wininst.exe encoded length is %d bytes" % len (base64.encodestring (exedata))
    exp = re.compile ('EXE'+'DATA = """\\\\(\n.*)*\n"""', re.M)
    data = exp.sub ('EXE' + 'DATA = """\\\\\n%s"""' %
                    base64.encodestring (exedata), moddata)
    open ("bdist_wininst.py", "w").write (data)
    print "bdist_wininst.py recreated"

EXEDATA = """\
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
ABIAAP8AAAAAAAAAAAAAAGC+AKBAAI2+AHD//1eDzf/rEJCQkJCQkIoGRogHRwHbdQeLHoPu/BHb
cu24AQAAAAHbdQeLHoPu/BHbEcAB23PvdQmLHoPu/BHbc+QxyYPoA3INweAIigZGg/D/dHSJxQHb
dQeLHoPu/BHbEckB23UHix6D7vwR2xHJdSBBAdt1B4seg+78EdsRyQHbc+91CYseg+78Edtz5IPB
AoH9APP//4PRAY0UL4P9/HYPigJCiAdHSXX36WP///+QiwKDwgSJB4PHBIPpBHfxAc/pTP///16J
97mSAAAAigdHLOg8AXf3gD8BdfKLB4pfBGbB6AjBwBCGxCn4gOvoAfCJB4PHBYnY4tmNvgCwAACL
BwnAdDyLXwSNhDAw0QAAAfNQg8cI/5a80QAAlYoHRwjAdNyJ+VdI8q5V/5bA0QAACcB0B4kDg8ME
6+H/lsTRAABh6ah4//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAAAgAACABQAAAGAA
AIAAAAAAAAAAAAAAAAAAAAEAbgAAADgAAIAAAAAAAAAAAAAAAAAAAAEAAAAAAFAAAAAwoQAACAoA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAGsAAACQAACAbAAAALgAAIBtAAAA4AAAgG4AAAAIAQCA
AAAAAAAAAAAAAAAAAAABAAkEAACoAAAAOKsAAH4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAJ
BAAA0AAAALisAABuAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEACQQAAPgAAAAorgAAWgIAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAABAAkEAAAgAQAAiLAAAFwBAAAAAAAAAAAAAAAAAAAAAAAAAAAA
APThAAC84QAAAAAAAAAAAAAAAAAAAeIAAMzhAAAAAAAAAAAAAAAAAAAO4gAA1OEAAAAAAAAAAAAA
AAAAABviAADc4QAAAAAAAAAAAAAAAAAAJeIAAOThAAAAAAAAAAAAAAAAAAAw4gAA7OEAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAOuIAAEjiAABY4gAAAAAAAGbiAAAAAAAAdOIAAAAAAACE4gAAAAAAAI7i
AAAAAAAAlOIAAAAAAABLRVJORUwzMi5ETEwAQURWQVBJMzIuZGxsAENPTUNUTDMyLmRsbABHREkz
Mi5kbGwATVNWQ1JULmRsbABVU0VSMzIuZGxsAABMb2FkTGlicmFyeUEAAEdldFByb2NBZGRyZXNz
AABFeGl0UHJvY2VzcwAAAFJlZ0Nsb3NlS2V5AAAAUHJvcGVydHlTaGVldEEAAFRleHRPdXRBAABl
eGl0AABFbmRQYWludAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
"""

# --- EOF ---