Hi again --
[cc'd to Paul Dubois: you said you weren't following the distutils sig
anymore, but this directly concerns NumPy and I'd like to get your
input!]
here's that sample setup.py for NumPy. See below for discussion (and
questions!).
------------------------------------------------------------------------
#!/usr/bin/env python
# Setup script example for building the Numeric extension to Python.
# This does sucessfully compile all the .dlls. Nothing happens
# with the .py files currently.
# Move this file to the Numerical directory of the LLNL numpy
# distribution and run as:
# python numpysetup.py --verbose build_ext
#
# created 1999/08 Perry Stoll
__rcsid__ = "$Id: numpysetup.py,v 1.1 1999/09/12 20:42:48 gward Exp $"
from distutils.core import setup
setup (name = "numerical",
version = "0.01",
description = "Numerical Extension to Python",
url = "http://www.python.org/sigs/matrix-sig/",
ext_modules = [ ( '_numpy', { 'sources' : [ 'Src/_numpymodule.c',
'Src/arrayobject.c',
'Src/ufuncobject.c'
],
'include_dirs' : ['./Include'],
'def_file' : 'Src/numpy.def' }
),
( 'multiarray', { 'sources' : ['Src/multiarraymodule.c'],
'include_dirs' : ['./Include'],
'def_file': 'Src/multiarray.def'
}
),
( 'umath', { 'sources': ['Src/umathmodule.c'],
'include_dirs' : ['./Include'],
'def_file' : 'Src/umath.def' }
),
( 'fftpack', { 'sources': ['Src/fftpackmodule.c', 'Src/fftpack.c'],
'include_dirs' : ['./Include'],
'def_file' : 'Src/fftpack.def' }
),
( 'lapack_lite', { 'sources' : [ 'Src/lapack_litemodule.c',
'Src/dlapack_lite.c',
'Src/zlapack_lite.c',
'Src/blas_lite.c',
'Src/f2c_lite.c'
],
'include_dirs' : ['./Include'],
'def_file' : 'Src/lapack_lite.def' }
),
( 'ranlib', { 'sources': ['Src/ranlibmodule.c',
'Src/ranlib.c',
'Src/com.c',
'Src/linpack.c',
],
'include_dirs' : ['./Include'],
'def_file' : 'Src/ranlib.def' }
),
]
)
------------------------------------------------------------------------
First, what d'you think? Too clunky and verbose? Too much information
for each extension? I kind of think so, but I'm not sure how to reduce
it elegantly. Right now, the internal data structures needed to compile
a module are pretty obviously exposed: is this a good thing? Or should
there be some more compact form for setup.py that will be expanded later
into the full glory we see above?
I've already made one small step towards reducing the amount of cruft by
factoring 'include_dirs' out and supplying it directly as a parameter to
'setup()'. (But that needs code not in the CVS archive yet, so I've
left the sample setup.py the same for now.)
The next thing I'd like to do is get that damn "def_file" out of there.
To support it in MSVCCompiler, there's already an ugly hack that
unnecessarily affects both the UnixCCompiler and CCompiler classes, and
I want to get rid of that. (I refer to passing the 'build_info'
dictionary into the compiler classes, if you're familiar with the code
-- that dictionary is part of the Distutils extension-building system,
and should not propagate into the more general compiler classes.)
But I don't want to give these weird "def file" things standing on the
order of source files, object files, libraries, etc., because they seem
to me to be a bizarre artifact of one particular compiler, rather than
something present in a wide range of C/C++ compilers.
Based on the NumPy model, it seems like there's a not-too-kludgy way to
handle this problem. Namely:
if building extension "foo":
if file "foo.def" found in same directory as "foo.c"
add "/def:foo.def" to MSVC command line
this will of course require some platform-specific code in the build_ext
command class, but I figured that was coming eventually, so why put it
off? ;-)
To make this hack work with NumPy, one change would be necessary: rename
Src/numpy.def to Src/_numpy.def to match Src/_numpy.c, which implements
the _numpy module. Would this be too much to ask of NumPy? (Paul?)
What about other module distributions that support MSVC++ and thus ship
with "def" files? Could they be made to accomodate this scheme?
Thanks for your feedback --
Greg
--
Greg Ward - software developer gward(a)cnri.reston.va.us
Corporation for National Research Initiatives
1895 Preston White Drive voice: +1-703-620-8990
Reston, Virginia, USA 20191-5434 fax: +1-703-620-0913
Hi all --
at long last, I found the time to hack in the ability to compile
extension modules to the Distutils. Mainly, this meant adding a
'build_ext' command which uses a CCompiler instance for all its dirty
work. I also had to add a few methods to CCompiler (and, of course,
UnixCCompiler) to make this work.
And I added a new module, 'spawn', which takes care of running
sub-programs more efficiently and robustly (no shell involved) than
os.system. That's needed, obviously, so we can run the compiler!
If you're in the mood for grubbing over raw source code, then get the
latest from CVS or download a current snapshot. See
http://www.python.org/sigs/distutils-sig/implementation.html
for a link to the code snapshot.
I'm still waiting for more subclasses of CCompiler to appear. At the
very least, we're going to need MSVCCompiler to build extensions on
Windows. Any takers? Also, someone who knows the Mac, and how to run
compilers programmatically there, will have to figure out how to write a
Mac-specific concrete CCompiler subclass.
The spawn module also needs a bit of work to be portable. I suspect
that _win32_spawn() (the intended analog to my _posix_spawn()) will be
easy to implement, if it even needs to go in a separate function at all.
It looks from the Python Library documentation for 1.5.2 that the
os.spawnv() function is all we need, but it's a bit hard to figure out
just what's needed. Windows wizards, please take a look at the
'spawn()' function and see if you can make it work on Windows.
As for actually compiling extensions: well, if you can figure out the
build_ext command, go ahead and give it a whirl. It's a bit cryptic
right now, since there's no documentation and no example setup.py. (I
have a working example at home, but it's not available online.) If you
feel up to it, though, see if you can read the code and figure out
what's going on. I'm just hoping *I'll* be able to figure out what's
going on when I get back from the O'Reilly conference next week... ;-)
Enjoy --
Greg
--
Greg Ward - software developer gward(a)cnri.reston.va.us
Corporation for National Research Initiatives
1895 Preston White Drive voice: +1-703-620-8990
Reston, Virginia, USA 20191-5434 fax: +1-703-620-0913
Hi all --
at long last, I have fixed two problems that a couple people noticed a
while ago:
* I folded in Amos Latteier's NT patches almost verbatim -- just
changed an `os.path.sep == "/"' to `os.name == "posix"' and added
some comments bitching about the inadequacy of the current library
installation model (I think this is Python's fault, but for now
Distutils is slavishly aping the situation in Python 1.5.x)
* I fixed the problem whereby running "setup.py install" without
doing anything else caused a crash (because 'build' hadn't yet
been run). Now, the 'install' command automatically runs 'build'
before doing anything; to make this bearable, I added a 'have_run'
dictionary to the Distribution class to keep track of which commands
have been run. So now not only are command classes singletons,
but their 'run' method can only be invoked once -- both restrictions
enforced by Distribution.
The code is checked into CVS, or you can download a snapshot at
http://www.python.org/sigs/distutils-sig/distutils-19990607.tar.gz
Hope someone (Amos?) can try the new version under NT. Any takers for
Mac OS?
BTW, all parties involved in the Great "Where Do We Install Stuff?"
Debate should take a good, hard look at the 'set_final_options()' method
of the Install class in distutils/install.py; this is where all the
policy decisions about where to install files are made. Currently it
apes the Python 1.5 situation as closely as I could figure it out.
Obviously, this is subject to change -- I just don't know to *what* it
will change!
Greg
--
Greg Ward - software developer gward(a)cnri.reston.va.us
Corporation for National Research Initiatives
1895 Preston White Drive voice: +1-703-620-8990
Reston, Virginia, USA 20191-5434 fax: +1-703-620-0913
Hi all,
I've been aware that the distutils sig has been simmerring away, but
until recently it has not been directly relevant to what I do.
I like the look of the proposed api, but have one question. Will this
support an installed system that has multiple versions of the same
package installed simultaneously? If not, then this would seem to be a
significant limitation, especially when dependencies between packages
are considered.
Assuming it does, then how will this be achieved? I am presently
managing this with a messy arrangement of symlinks. A package is
installed with its version number in it's name, and a separate
directory is created for an application with links from the
unversioned package name to the versioned one. Then I just set the
pythonpath to this directory.
A sample of what the directory looks like is shown below.
I'm sure there is a better solution that this, and I'm not sure that
this would work under windows anyway (does windows have symlinks?).
So, has this SIG considered such versioning issues yet?
Cheers,
Tim
--------------------------------------------------------------
Tim Docker timd(a)macquarie.com.au
Quantative Applications Division
Macquarie Bank
--------------------------------------------------------------
qad16:qad $ ls -l lib/python/
total 110
drwxr-xr-x 2 mts mts 512 Nov 11 11:23 1.1
-r--r----- 1 root mts 45172 Sep 1 1998 cdrmodule_0_7_1.so
drwxr-xr-x 2 mts mts 512 Sep 1 1998 chart_1_1
drwxr-xr-x 3 mts mts 512 Sep 1 1998 Fnorb_0_7_1
dr-xr-x--- 3 mts mts 512 Nov 11 11:21 Fnorb_0_8
drwxr-xr-x 3 mts mts 1536 Mar 3 12:45 mts_1_1
dr-xr-x--- 7 mts mts 512 Nov 11 11:22 OpenGL_1_5_1
dr-xr-x--- 2 mts mts 1024 Nov 11 11:23 PIL_0_3
drwxr-xr-x 3 mts mts 512 Sep 1 1998 Pmw_0_7
dr-xr-x--- 2 mts mts 512 Nov 11 11:21 v3d_1_1
qad16:qad $ ls -l lib/python/1.1
total 30
lrwxrwxrwx 1 root other 29 Apr 10 10:43 _glumodule.so -> ../OpenGL_1_5_1/_glumodule.so
lrwxrwxrwx 1 root other 30 Apr 10 10:43 _glutmodule.so -> ../OpenGL_1_5_1/_glutmodule.so
lrwxrwxrwx 1 root other 22 Apr 10 10:43 _imaging.so -> ../PIL_0_3/_imaging.so
lrwxrwxrwx 1 root other 36 Apr 10 10:43 _opengl_nummodule.so -> ../OpenGL_1_5_1/_opengl_nummodule.so
lrwxrwxrwx 1 root other 27 Apr 10 10:43 _tkinter.so -> ../OpenGL_1_5_1/_tkinter.so
lrwxrwxrwx 1 mts mts 21 Apr 10 10:43 cdrmodule.so -> ../cdrmodule_0_7_1.so
lrwxrwxrwx 1 mts mts 12 Apr 10 10:43 chart -> ../chart_1_1
lrwxrwxrwx 1 root other 12 Apr 10 10:43 Fnorb -> ../Fnorb_0_8
lrwxrwxrwx 1 mts mts 12 Apr 10 10:43 mts -> ../mts_1_1
lrwxrwxrwx 1 root other 15 Apr 10 10:43 OpenGL -> ../OpenGL_1_5_1
lrwxrwxrwx 1 root other 33 Apr 10 10:43 opengltrmodule.so -> ../OpenGL_1_5_1/opengltrmodule.so
lrwxrwxrwx 1 root other 33 Apr 10 10:43 openglutil_num.so -> ../OpenGL_1_5_1/openglutil_num.so
lrwxrwxrwx 1 root other 10 Apr 10 10:43 PIL -> ../PIL_0_3
lrwxrwxrwx 1 mts mts 10 Apr 10 10:43 Pmw -> ../Pmw_0_7
lrwxrwxrwx 1 root other 10 Apr 10 10:43 v3d -> ../v3d_1_1
Greetings, disutils people!
I'd like to be able to use distutil's build process while I'm
developing and debugging code. This has proven difficult so far
because of the use of the build directory. I've ended up just using
Makefile-driven in-place builds during the development cycle. Does
anyone have any tips or tricks in this area?
I'm also curious how people like to run test scripts. One special
case is post-install hello-world-type example programs for the
installer to play with. To keep mine from being confused by the
package source directory, I end up adding the following to them:
# Ugh..make sure we look only in system directories for the package.
# This is only important when executing a script in the package
# distribution directory.
import sys
sys.path = sys.path[1:]
There's got to be a better way. In fact, I often end up commenting
out that assignment during development so I can test my in-place
Makefile-driven builds!
Anyhow, I feel like I must be doing things wrong and I'd appreciate
opinions on these topics. :)
Eric
Hi all --
well, you can pretty much ignore the fragment of "Installing Python
Modules" that I announced yesterday. I had a brief chat with Guido this
afternoon, and he pretty much torpedoed the lovely, baroque scheme that
Fred Drake and I cooked up and which became said document. Sigh.
Anyways, here's a rough outline of the New New Installation Scheme
(whatever you may say, you can't accuse me of inflexible thinking...):
* as before, a standard installation (to
$prefix/lib/python1.X/site-packages on Unix, or
C:\Program Files\Python on Windows) is painless(TM):
python setup.py install
* for a custom installation where you don't care about supporting
multiple platforms, install-lib is the option normally used:
python setup.py install --install-lib=/home/greg/lib/python
python setup.py install --install-lib=/tmp/pylib
python setup.py install --install-lib=d:\Temp\Python\Lib
In most circumstances, top-level modules are installed right in
the 'install-lib' directory.
* if you do care about a multi-platform installation, you should
supply both 'install-lib' and 'install-platlib': the former will
be used for pure Python module distributions, the latter for module
distributions containing extensions:
python setup.py install --install-lib=~/lib/python \
--install-platlib=~/lib/python.linux-x86
A subtle wrinkle: for any given module distribution, only one of
these is necessary. I don't think installers should have to be
aware of the implementation details of the software they're
installing, though, so the safe thing to do is supply both options
-- and the likely way to do this will be through a config file. Not
sure how the config file will look, though.
* the only reason to supply 'prefix' and 'exec-prefix' is to install a
module distribution to a different Python installation than the
one expected by the current interpreter. Say you have a Python
installation in /usr and another one in /usr/local:
/usr/bin/python setup.py --prefix=/usr/local
This will install modules to /usr/local/lib/python1.X/site-packages.
(This could be one solution to the "problem" of Linux distributions
shipping Python in /usr, but wanting to keep third-party modules
in /usr/local -- just create a dummy
/usr/local/lib/python1.X/site-packages and you're off to the races.)
* 'install-path' is still there, and its purpose is still to supply
an extra sub-path to append to 'install-lib', so that
non-package-ized module distributions will still get a directory of
their own. If 'install-path' used and 'install-lib' is not -- i.e.
we're installing to a site-packages directory under some prefix or
exec-prefix (or directly in prefix/exec-prefix on Windows) -- then
Distutils will also create a .pth file pointing to the
'install-path' directory.
There are a few tricky issues with 'install-path', though:
+ should installers be allowed to set it, or should it be
a developer-only option?
+ if the installer supplied 'install-lib' and/or
'install-platlib', do we still respect 'install-path', i.e. do
we still append 'install-path' to 'install-lib'? We certainly
don't create a .pth file in that case (Python will ignore it).
+ do we allow installers to supply *both* 'install-lib' and
'install-path'?
I vote YES on all three, but I'd like to hear who agrees with
me and who is a hopelessly misguided heretic. >grin<
* default values:
prefix: sys.prefix
exec-prefix:
if installer supplied prefix: prefix
else: sys.exec_prefix
install-lib: $prefix/lib/python1.X/site-packages
install-platlib:
if installer supplied install-lib: install-lib
else: $exec-prefix/lib/python1.X/site-packages
* installation rules if install-path not supplied:
modules from pure Python distribution go to install-lib
modules from distribution with extensions go to install-platlib
* installation rules if install-path supplied:
modules from pure Python distribution go to
install-lib + install-path
modules from distribution with extensions go to
install-platlib + install-path
Note that the "install-path not supplied" case is just a special case of
"install-path supplied", where install-path is an empty string. But
it's worth documenting it separately, because it's the usual case.
I think I like this scheme better than the other two I've tried. Please
let me know what you think: I'll rewrite the "Custom Installation"
section and then rewrite the code to match the docs Real Soon Now.
Greg
--
Greg Ward - Linux geek gward(a)python.net
http://starship.python.net/~gward/
When the ship lifts, all bills are paid. No regrets.
Hi there,
I'm a newcomer to distutils, so sorry in advance if this is a question
that is too obvious for everyone...
I was wondering what the convention is for including binary data files
with the installation of a module. Like say I had a table called
table.data, that I wanted to have be installed with everything else on
python setup.py install - should the data file be part of install_py, or
install_ext, or something else?
We'd like to use distutils to package up a current project, but weren't
sure about this point, and couldn't find it in the docs...
--Brian Hooper
Hi all --
well, I finally sat down and started spewing Distutils documentation.
My plan is to write two howto-style manuals (maybe a bit bigger than
"Documenting Python", but along those lines) to be included in the 1.6
manual set. (Clever of me to announce this intention in public before
mentioning it to Fred or Guido, just to make it harder for them to tell
me to get stuffed. ;-)
The two manuals are tentatively entitled:
Installing Python Modules
Distributing Python Modules
So far, I have written one section of the "Installing" manual, entitled
"Custom Installation (Unix)". This one is kind of important: it
explains how to use the Distutils to install modules to any non-standard
place, with lots of commentary on good practices and multi-platform
installations.
I want feedback on this on several axes:
* Distutils terminology: eg. does "install-lib" mean what you think
it should mean, or do you have a better idea?
* Distutils semantics: eg. is the behaviour of "install-lib" sensible?
* documentation organization
* documentation wording
* spelling, typos, typesetting, etc.
The docs are available at
http://www.python.org/sigs/distutils-sig/documentation.html
Currently only LaTeX source and PDF available -- HTML soon.
--
Greg Ward - programmer-at-large gward(a)python.net
http://starship.python.net/~gward/
If it can't be expressed in figures, it is not science--it is opinion.
Harri,
This is (in part) a distutils issue. The distutils package should
always create this directory if it doesn't exist. Raw Python
installations should not create it, since adding it to the search path
would slow down the module search.
Greg, I don't know if you're reading the XML-SIG list, so I'm adding
the distutils list to the list of recipients.
Harri Pasanen writes:
> I installed PyXML-0.5.3 on Solaris 2.7 following the README
> instructions.
>
>
> python setup.py install
>
> failed at first, because of missing
> /usr/local/lib/python1.5/site-packages/ directory.
> That directory does not appear the be created when Python 1.5.2 is
> installed from the tar-ball.
>
> After manually creating the directory, the install went through without
> complaints.
-Fred
--
Fred L. Drake, Jr. <fdrake at acm.org>
Corporation for National Research Initiatives