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
We are developing a cross platform debug tool for embedded systems that uses Python as the central foundation. We distribute our product on both solaris and windows nt. Thus, distutils looked attractive for building our python extensions, which are
mostly C++. This last weekend, I was working on an extension, and ended up punting distutils for two reasons:
1) the documentation is not adequate for a moron like me. I needed to add a vendor supplied object file to the link command, and struck out on every attempt. The doc gave me some clues, but was not specific enough to really help. I realize that this is
version 0.1.
2) the main/compelling reason is that I have to debug the python extensions. The extension implementation is normally tested, and debugged prior to integration into Python. But the extension layer often needs some debugging as we are interfacing C++ with
STL containers to Python data types. I can debug just fine using distutils on Solaris/Linux, but cannot do the same on Windows. As far as I can tell, you _have_ to have a DevStudio project setup to debug anything under windows. Since our product will be
delivered as a standalone tool, including python, I do not need the distribution facilities of distutils, only the development. But, once I have developed a DevStudio project/workspace for an extension, there is little motivation to use distutils.
I am hopeful that distutils will evolve into a useful development and distribution tool for python. Though, I wonder how the "debugging extensions on Windows" problem will be approached.
Cheers,
-Ian Searle
Some things I came across while adding distutils support to some code:
* From a docstring in distutils/versions.py:
0.4 0.4.0 (these two are equivalent)
0.4.1
Does this mean that 0.4.1 is equivalent to 0.41 in the strict
versioning class? I'd suggest adding that, just to make it crystal
clear.
* The name option in setup.py: It's not clear if it can/should
contain spaces; given that you mention underscores, I assume they're
as space substitutes.
* Building a distribution: it creates hard links to files.
This means that if you delete a file and rebuild the dist without
erasing the hard-link-filled subdir, the deleted file is still present
in the distribution. It's probably easiest to blow away the whole
<product>-<version> directory, rather than attempting to scan its
contents and update it.
--
A.M. Kuchling http://starship.python.net/crew/amk/
"I don't think we should interfere."
"Interfere? Of course we should interfere! Always do what you're best at,
that's what I say."
-- Romana and the Doctor, in "Nightmare of Eden"
On Mon, 29 Nov 1999, T-Methy Moddletin wrote:
> Mon, 29 Nov 1999 08:57:02 -0500, Greg Ward <gward(a)cnri.reston.va.us> wrote:
> >Cool... BUT I worry that having multiple Python archives or
> >meta-archives might be as bad as having none at all.
>
> Ouch. (-: Ah well, since this is the state of things, at least we
> may as well have a way to more conveniently search for what's out
> there.
Don't let Greg dissuade you. In almost all cases, something is better than
nothing. The current state of a Python archive (or index) is pretty
abysmal.
Keep doing what you're doing! Don't stop! :-)
>...
> No, in my opinion (which may not be worth much) there is one thing at
> least worse than having a meta-archive... and that's having
> ftp.python.org/pub/python/contrib/ ! No offense ment to anyone! But
> that place has become a terrible mess. And i hate README files!
I'll second your opinion. It has been a LONG time since I bothered to look
in there. I go to the web now for Python code.
>...
> Of course if there was a central archive, that takes care of finding
> things as well (assuming everyone wants to bother with going to the
> trouble of getting archived there). Still I must dissent. In
> retrospect, I am not fond of CPAN. I do not miss it. I do not consider
> it a model for emulation. It had perhaps some useful attributes----but
> I am (and hopefully I don't just say this because it is the nature of
> my-project-which-i-must-protect) genuinely in favour of
> decentralised resources. I think it's more encouraging to people to
> directly and easily control and release their stuff (and for those
> who want to upload somewhere there is still ftp.python.org!) While
> there are certain weaknesses and logistic complications (and yeah,
> perhaps "mess" also!) it seems a much freer environment to me. Less
> stuffy, as it were. Less official! Perhaps my biases are showing a
> little too strongly. I find the rigidity of CPAN just a little too
> intimidating, in fact.
I argued the same topic (different approach, tho) on the trove-dev mailing
list (archives at www.python.org/pipermail/trove-dev). Basically, I
believe the current Internet user is looking for a Freshmeat-style index,
rather than a sunsite-style repository. Repositories are passe, indexes
are The Right And Just Way. :-)
Anybody can get a web page and some disk space. Therefore, anybody can
publish their code themselves -- there is no need for central repositories
except to help out lazy people that won't publish thru a web page.
(alright, maybe that's too strong, but I'm making a point here :-)
The problem, of course, is finding all this stuff.
IMO, you ought to look harder at the Freshmeat style of index. More of the
work is pushed onto the author, rather than the site maintainer. The
editors review each announcement or edit, but I don't think they
personally clean up the database. (yes, I realize some of your efforts are
due to "startup" rather than a plan to do ongoing maintenance)
>...
> Already i note these quibles in the last few messages about version
> number parsing. When creating the Vaults of Parnassus database I had
I posted a little version number parser about a year ago, I think. It
handles most forms of version numbers, returning a tuple that can be
properly ordered (among the software's other releases using that version
number pattern).
If you need to parse version numbers, that's the function to use.
Cheers,
-g
--
Greg Stein, http://www.lyra.org/
On 27 November 1999, T-Mithy Myddletin said:
> I don't know if this is motivation or not, but Vaults of Parnassus is
> ready (and even eagre) to attempt some sort of integration with
> Distutils distributions whenever Distutils is ready to be adopted.
Cool... BUT I worry that having multiple Python archives or
meta-archives might be as bad as having none at all. Oh well, that's
the mess the Perl world was in five years ago before Jarkko Hietaniemi
came along and cooked up CPAN.
> I have looked briefly at the distutils package. Pretty complicated
> stuff. I understand it is intended to be simplified some eventually,
> when the lower level stuff is sorted out.
I think this is probably a documentation problem. Yes, the code is
fairly complex, but that's because I wanted it to be fairly easy for
developers and distributors to use, utterly dead simple for installers
to use, and still be extensible. (Plus I have a dangerous tendency
towards complex designs... oh well.) Currently, the "documentation" --
that big ugly USAGE file -- is almost as complex as the code, because it
was a two-night braindump that I spewed before releasing Distutils 0.1.
> I hope so. All the
> complicated stuff is good, but you have to have a REALLY SIMPLE option
> for people like me with only simple needs to understand too. (-:
>
> Anyhow, keep plugging away!
Sounds like I should start plugging away on the nice documentation that
I've been meaning to write for a while. Ummm, bugs first though.
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
T-Mithy Myddletin writes:
>might be interested know that I have tonight added a bunch of new
>fields to the Vaults of Parnassus database...
One field that might be interesting is, for lack of a better name, a
'status' field that said whether a project is maintained or
unmaintained. (Maybe Maintained: yes|no ...) Sometimes it's useful
to find any code that's helpful, even if no one is keeping it
up-to-date; it's a starting point, anyway.
>I don't know if this is motivation or not, but Vaults of Parnassus is
>ready (and even eagre) to attempt some sort of integration with
>Distutils distributions whenever Distutils is ready to be adopted. In
>time we might even be able to work up a little client of some sort,
>like Perl has, for easy searching, downloading, and install.
I think that would be possible without too much difficulty; the major
issue, besides user interface, is where to find the latest tarball
containing the actual code; Parnassus points to human-readable Web
pages, not directly to the .tgz file, and it probably shouldn't have a
pointer to it. How does CPAN handle this? Does it list foo-*.tgz and
take the one where * is the highest version number?
--
A.M. Kuchling http://starship.python.net/crew/amk/
I confidently expect it to be a fairly resounding failure.
-- John Cleese, on the Monty Python reunion planned for 1999