installing to a non-standard directory

I'm trying to install to a non-standard directory. Something akin to "python setup.py install --prefix=`pwd`/junk" using gnu makefile standards semantics for --prefix but I can't seem to find the right arguments to install to make this happen. The closest I can seem to find is:
python setup.py install --prefix=`pwd`/junk --install-layout=unix
But that returns errors:
distutils.errors.DistutilsError: can't create or remove files in install directory
The following error occurred while trying to add or remove files in the installation directory:
[Errno 2] No such file or directory: '/home/rich/projects/rcmp/junk/lib/python2.6/site-packages/test-easy-install-12743.pth'
The installation directory you specified (via --install-dir, --prefix, or the distutils default setting) was:
/home/rich/projects/rcmp/junk/lib/python2.6/site-packages/
This directory does not currently exist. Please create it and try again, or choose a different installation directory (using the -d or --install-dir option).
Although there doesn't appear to be any --install-dir option.
Can anyone explain what any of the 13 options related to this are intended to do? Or better, can anyone tell me which one I want?
--rich

At 03:18 PM 11/19/2010 -0800, K. Richard Pixley wrote:
I'm trying to install to a non-standard directory.
Why? It makes a difference as to what the best way to do it is.
For example, if you're planning to install a Python application or create a restricted development environment, you might be better off using a virtualenv. Or, alternatively, you may want to configure your ~/.pydistutils.cfg to set the default installation paths rather than having to specify them on the command line for every package you install.
distutils.errors.DistutilsError: can't create or remove files in install directory
The following error occurred while trying to add or remove files in the installation directory:
[Errno 2] No such file or directory:
'/home/rich/projects/rcmp/junk/lib/python2.6/site-packages/test-easy-install-12743.pth'
The installation directory you specified (via --install-dir, --prefix, or the distutils default setting) was:
/home/rich/projects/rcmp/junk/lib/python2.6/site-packages/
This directory does not currently exist. Please create it and try again, or choose a different installation directory (using the -d or --install-dir option).
As the above says, the path you're trying to install to doesn't exist. (The next thing you'll find after you fix that, is that it isn't on your PYTHONPATH.)
What are you trying to install, and why do you want to install it in that specific directory?

On 20101119 17:51, P.J. Eby wrote:
At 03:18 PM 11/19/2010 -0800, K. Richard Pixley wrote:
I'm trying to install to a non-standard directory.
Why? It makes a difference as to what the best way to do it is.
For example, if you're planning to install a Python application or create a restricted development environment, you might be better off using a virtualenv. Or, alternatively, you may want to configure your ~/.pydistutils.cfg to set the default installation paths rather than having to specify them on the command line for every package you install.
I'm aware of those and they are not relevant in this context.
distutils.errors.DistutilsError: can't create or remove files in install directory
The following error occurred while trying to add or remove files in the installation directory:
[Errno 2] No such file or directory:
'/home/rich/projects/rcmp/junk/lib/python2.6/site-packages/test-easy-install-12743.pth'
The installation directory you specified (via --install-dir, --prefix, or the distutils default setting) was:
/home/rich/projects/rcmp/junk/lib/python2.6/site-packages/
This directory does not currently exist. Please create it and try again, or choose a different installation directory (using the -d or --install-dir option).
As the above says, the path you're trying to install to doesn't exist.
Yes. Although using --root= doesn't result in this problem. So some portion of the install process knows how to create the appropriate directory tree and yet that is explicitly being skipped in this context for some mysterious reason.
(The next thing you'll find after you fix that, is that it isn't on your PYTHONPATH.)
No, that won't be a problem in this context.
What are you trying to install, and why do you want to install it in that specific directory?
I really don't think it matters, but if you insist, there are several contexts I'm looking at.
Context #1: an alternate packaging mechanism. I want to use that packaging mechanism because it's the most appropriate way to package and distribute my module for this application. The packaging mechanism involves calling "install", (typically "make install prefix=/tmp/jail", but there's no reason it couldn't be "python setup.py install"), in a sort of jail. Anything installed during that encapsulation is recorded and those pieces are the ones which are picked up and packaged by the automatic packaging system.
Context #2: cross development. I'm running /on/ one system producing a root file system which will be used later to boot a new system. This is another application of "make install PREFIX=/tmp/newroot"
Context #3: this one is complicated, but since you think it's relevant...
Bitbake is a tool written in python for managing Openembedded, (http://openembedded.org). In rough terms you can think of bitbake as a sort of make replacement which builds a collection of components into binary packages and then installs those packages into a captive root file system. The usual use of this system is cross development where the target system is woefully underpowered, (Eg, a 600Mhz arm system with a few Megabytes of memory), so we'd prefer to use our battery of x86 servers, (~64 servers, each of which are ~24 cores, 24G memory, 4 - 8 way striped disks, etc). The difference in build time here is literally the difference between about 20 minutes, (on the server farm), vs several months on a single, native arm based system.
Bitbake runs as a python application using the host's python interpreter. But for code management reasons, bitbake itself and all of the bitbake input for building the system are stored as source. This allows bitbake to follow the code as code is branched and the like and allows for multiple build directories on the same server without needing to use a virtual machine, (which has a huge performance overhead vs raw metal), or needing to reload the server, (which would also make the system unwieldy).
In this particular application, I want to write the application in python so that I can manage nose based tests outside of bitbake and so that I can produce a shell level cover into my tool. However, the primary use of the tool will be from within bitbake. The code of my tool will need to follow the source code of the system, not bitbake, so putting the tool into bitbake directly isn't appropriate nor is it appropriate to install the tool globally on the build machine(s). Similarly, a python virtual environment isn't relevant or appropriate here either as the top level control of the system is already bitbake so our interpreter is running before we have a chance to virtualize it. And there's no good reason to change that architecture.
What I want to do is to manage and build my tool in python, including nose tests outside of bitbake, as a component within openembedded. This means that bitbake will build the component and install the component into a staging area which is unique to this particular build directory. It can then import the tool from the local staging area and use it.
What I want to do is the moral equivalent of "make install prefix=foo" or "make install DESTDIR=foo". It's a common task with numerous applications. This shouldn't be difficult and I really can't believe that I'm the first person using python to want to do this. It's a 10 character command line option. There should be something comparably simple in distutils/setuptools/whatever, no?
--rich

At 03:39 PM 11/20/2010 -0800, K. Richard Pixley wrote:
Context #1: an alternate packaging mechanism. I want to use that packaging mechanism because it's the most appropriate way to package and distribute my module for this application. The packaging mechanism involves calling "install", (typically "make install prefix=/tmp/jail", but there's no reason it couldn't be "python setup.py install"), in a sort of jail. Anything installed during that encapsulation is recorded and those pieces are the ones which are picked up and packaged by the automatic packaging system.
Use --root, then. That's what it's for.
Context #2: cross development. I'm running on one system producing a root file system which will be used later to boot a new system. This is another application of "make install PREFIX=/tmp/newroot"
Likewise, this is what --root is for.
In both of the above cases, you want the prefix of anything you build to be set up for the prefix where it's really going to *end up* installed, not to the temporary directory where you're mock-installing it to. That's why all distutils' internal commands use --root when they call an install operation for packaging.
What I want to do is to manage and build my tool in python, including nose tests outside of bitbake, as a component within openembedded. This means that bitbake will build the component and install the component into a staging area which is unique to this particular build directory. It can then import the tool from the local staging area and use it.
What I want to do is the moral equivalent of "make install prefix=foo" or "make install DESTDIR=foo". It's a common task with numerous applications. This shouldn't be difficult and I really can't believe that I'm the first person using python to want to do this. It's a 10 character command line option. There should be something comparably simple in distutils/setuptools/whatever, no?
Yes. It's --root. ;-)
participants (2)
-
K. Richard Pixley
-
P.J. Eby