[Distutils] More (Windows) comments on distutils-0.1.2

Robin Becker robin@jessikat.demon.co.uk
Tue, 18 Jan 2000 00:08:37 +0000

In article <20000117153950.C9793@cnri.reston.va.us>, Greg Ward
<gward@cnri.reston.va.us> writes
>On 13 January 2000, Thomas Heller said:
>> 1. Python extensions for Windows MUST be linked with
>> the /MD switch to use the multithreaded runtime
>> library. Optimizations are also enabled by the following
>> line:
>> > class MSVCCompiler (CCompiler) :
>> >     def __init__ (self,
>> >         [...]
>> >         self.compile_options = [ '/nologo', '/Ox', '/MD', '/GD' ]
>I haven't seen any disagreement with this, so I'll take your word for
>it.  I'd feel more comfortable if another Python/Windows extension
>developer would speak up and say, "Yep, that's the Right Thing to do".
>(Mark?  Guido?)

/GD is for a DLL specific optimisation 

>So what are the flags here?  I assume /Ox is for optimization; you said
>/MD selects the multithreaded RT library.  What is /GD for?
>> 2. In build_ext.py I find the following code:
>[...code to deal with .def files elided...]
>> Doesn't this belong into msvccompiler.py?
>If anywhere at all.  I really, really dislike this whole .def file
>thing, and I don't like them cluttering up the build options dictionary
>or the build_ext command class.  But I don't know how else to do it,
>because I know about as much about Python on Windows as I do about
>skateboarding on Pluto.
>> We do not need any stinkin' DEF-files, if we use the link options
>> /EXPORT and /BASE. The following code builds the required arguments:
>Hallelujah!  I've been waiting for someone to say this.  Ever since I
>found out what .def files are, I've been wondering why the heck they are

.def files are for exporting things which aren't declared exported in
the code. They're not needed if you use the MSVC specific declarators.

>> >        if def_file is not None:
>> >            extra_args.append ('/DEF:' + def_file)
>> >        else:
>> >            # if no def file is found, export the init<name> function
>> >            # and calculate a random base address
>> >            extra_args.append ('/EXPORT:init' + extension_name)
>> >            import whrandom
>> >            base = whrandom.randint (0x1000, 0x8000) * 0x10000
>> >            extra_args.append ('/BASE:0x%x' % base)
>But this looks weird: a random base address?  What the heck is going on
>here?  Again, could another Python-on-Windows expert speak up?  Nothing
>personal, Thomas, but I don't want to take the word of just one person
>on this code, and I'd like to know what the heck the random base address
>is all about.

Please don't bother to use random addresses. If you're lucky your build
may make a very small difference. Ideally under windows all the dlls
needed for a given application should have non intersecting default
address ranges. See the file PC/dll_base.txt in the source distribution.
However, this is only a minor optimisation and it seems that Guido has
abandoned it in favour of simplicity. In a distribution where all the
dlls are fixed it might be worth rebasing all of the dlls. The random
hack may work, but is not guaranteed to avoid base clashes.

>Thanks for the code -- now let's hear from some other voices as to
>whether this is the Right Thing to add to Distutils to compile
>extensions with MSVC.  Anyone?
>        Greg

Robin Becker