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
Ok, I'm working on docs for bdist_pkgtool and bdist_sdux, but I'm
completely TeX ignorant.
I took the dist.tex file, cut out the RPM section and edited it for
these packages. Now what? How do I test what the file actually
produces, and how it fits in with the rest of the distutils docs?
Next step, how do I submit the changes? (I assume as a patch to the doc file.)
Pointers the whatever FM I'm looking for would be helpful.
tia
--
Mark W. Alexander
slash(a)dotnetslash.net
From: Thomas Heller [mailto:thomas.heller@ion-tof.com]
> Bruce's preamble can be simplyfied to this one:
>
> @runpython c:\aaa\Python\%0.bat %1 %2 %3 %4 %5 %6 %7 %8 %9
> # start of python code
> print "Hello" # or whatever
> # EOF - you don't have to supply the 'endofpython' footer from above.
The simplest possible version I've found is
@python -x %~f0 %* & goto :eof
# start of python code
import sys
print "Hello", ', '.join(sys.argv[1:])
This works on Windows 2000 CMD.EXE. Probably also on NT and XP, but I don't
have these to test. It's not likely to work on Windows 9x/ME, as the %~f0
and %* constructs aren't supported there. %* can be replaced by %1 %2 %3 %4
%5 %6 %7 %8 %9 as usual, but %~f0 (the full pathname of the current batch
file) isn't in COMMAND.COM to my knowledge...
Annoyingly, JP Software's 4NT doesn't correctly support %~f0, failing to
include the .bat file extension unless it is typed in on the command line.
I've reported this as a bug to JP software.
The advantage of this version is that it *doesn't* need you to hard-code the
full pathname of the BAT file.
An alternative construct is %~dp0MYBATCHFILE.BAT. The %~dp0 construct gives
the name of the directory containing the batch file. Again, this isn't 9x/ME
compatible, to my knowledge. But it does work on all versions of NT/2000 and
also in 4NT, FWIW.
Hope this helps,
Paul.
I don't think this is supported, but I just want to make sure...
Is there any way, in the generated Win32 installer, to have it perform
some arbitrary post-installation editing?
To cover Win9x systems, I'd like to install a .bat file in C:\PythonXX\
using the Bruce Eckel preamble from the Python FAQ:
@echo off
rem = """
rem run python on this bat file. Needs the full path where
rem you keep your python files. The -x causes python to skip
rem the first line of the file:
python -x c:\aaa\Python\\"%0".bat %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofpython
rem """
# The python program goes here:
The problem is that the "%0" expansion needs the full path name to where
the .bat file is installed (C:\PythonXX\), and that's not known until
the installer runs and consults the registry to find out where Python is
located.
Is there anything I can have the installer do to accomodate this? A
quick glance at the code didn't turn up anything (but it *was* very
quick... :-).
--SK
When I create a package using MANIFEST.in, there is important
information in that file. When I build a sdist, MANIFEST.in is ommitted,
meaning that the package cannot reproduce itself.
I think that if MANIFEST.in exists, it should automatically be included
by sdist. If I add MANIFEST.in to itself, it gets included in all (even
built) distributions, which I do not want.
Am I missing something?
-- Terrel
Hello everybody,
I'm hoping for some guidance on the best way to extend
distutils and on whether it is suitable for problems
Reportlab currently face. It seems very good at
packing up bits of a python package hierarchy and recreating
the same hierarchy elsewhere, but I can't figure out
how to do some things. (Well, I can find ways, but figure I
might be subverting the design or missing obvious things).
The manual chapter on extending distutils is, ahem, short.
I'm hoping these will be easy for you all!
(1) Cross-wiring the output
---------------------------
I want to create a little distribution for a
corporate customer which direspects my package hierarchy.
Reportlab has a 'reportlab' package for open source code,
and an 'rlextra' package for other stuff. We also make a
CVS tree for each customer. My CVS tree for the customer
has this:
hugeco/littleapp/littleapp.py
hugeco/littleapp/setup.py <---presumably, see below
I want to make a single directory which includes a bunch of
files from elsewhere in our tree. I want to add in these
into what the customer gets:
rlextra/utils/rc4.py
rlextra/utils/gloop.py
rlextra/utils/cgisupport.py
We have often done yucky stuff like checking in a copy
of the rlextra files under the customer directory, and
are fed up doing it. We can write code so we only have one
version in the right place, but the customer inports
the local onem and avoid duplications in CVS.
Ideally, running sdist would assemble the 4 files above and
create a combined output distribution which just dumped all
4 modules. Thus they would get a tar.gz containing
littleapp-0.5/littleapp.py
littleapp-0.5/rc4.py
littleapp-0.5/gloop.py
littleapp-0.5/cgisupport.py
The manual descrivbes doing this for data files but
not for source. Can you pull source from arbitrary
directories?
I KNOW that ideally I'd give them the rlextra tree or its
subset packagized on their path, but we get situations
where a self-contained app is really more desrirable;
we can't inflict changes in the rlextra tree on other
apps at the same time.
How do I do this?
(2) Where to put setup scripts
-----------------------------
This is a minor "best practice" detail. The standard
document presumes your setup.py is above your source
tree. All my CVS projects live under C:\code.
If I want to have setup scripts for project1, project2,
project3, obviously I cannot have one setup.py above
all 3. Do people normally maintain the setup script
within the directory they want to pack up, and do
a translation on the directories? or
have multiple setup_project1.py, setup_project2.py
etc above?
(3) Shipping closed source software:
-----------------------------------
Sometimes we only want to ship .pyc files. We're also
looking at things like pyz archives, maybe with some
additions so they can only be opened with a license
key for paid-only software, but also just for the
convenience. Is there anyone who has thought about
extending distutils this way? how should I go about
it? writing a new command (zdist??)
(4) Verification on site
------------------------
With our own customer apps we include a 'signed source manifest'
with checksums of each file in the manifest, and a 'signed
target manifest' which does the same for pyc files and
other compiled/optimized objects. Then at run time
we can have verification functions. This helps because
sometimes the customer fails to accurately promote some
of a few hundred files onto a web cluster; we want to
get back something saying that either the distro is
perfect, or various files disagree with the manifest.
In fact, I envision a meta-api where you could ask
any app to verfy itself, run a test suite or so on.
setup.py is the obvious hook.
Is this a useful extension to distutils? Is there a
good place to put such ideas in? Or would it be
easier to roll our own?
(5) General pace of activity
----------------------------
I am new to this sig. Is much happening? Is distutils
basically seen as a solved problem or is a lot
underway?
Best Regards,
Andy Robinson
CEO/Chief Architect, Reportlab inc.