From: Jim R. <jm...@qu...> - 2005-12-02 22:31:39
|
Will Partain wrote: >Jim, I agree with your misgivings. After all, something must've >pushed me into this -R thing in the first place :-) > >I wonder if some sort of hybrid scheme would make sense? I observe >that not all .so files are created equal... > > In some cases it will make sense - yes. >* things like libgcc_s.so -- every program needs it; carefully managed > by the GCC lads... Why not just put this in your ld.config... > > /our/.-ark-deploy/gcc--4.0.2/lib > /our/.-ark-deploy/gcc--3.4.3/lib > /our/.-ark-deploy/gcc--2.95.3/lib > > ... and declare victory? If your program picks up the version from > a different version than what you might've expected, it will almost > certainly be OK. > > You're probably right about the resilience to version mismatches aspect. And in the context of within a managed "cluster", doing something like this isn't particularly hard or evil. Reasonable choice if it saves some headaches. >* things like libz.so -- very stable interfaces; likely only upgraded > for security reasons; ubiquitous use; versioning done responsibly. > Again, having these picked up from a well-controlled ld.config will > probably be OK. > >* things like the Berkeley DB libraries -- you do _not_, on pain of > death, want a program picking up a version other than the one you > explicitly intended! -- a horrible horrible death will certainly > follow. -R all the way. > > I think these three "classes" are probably reasonably representative of all the use cases, and it is clear that there is some variation in "how much it matters". >Of course, judgement calls are being made in all of that. So (if you >decided to try to distinguish between those cases), it would a >delicate bit of ARK scripting to keep it all together. > >Meanwhile, I wildly support that you should be able to do the kinds of >things you're trying to do ("you don't need anything but a raw box"). > > This one flies right in the face of the libgcc approach above. In order to get to this level of sophistication/portability, you have to solve whatever issues there are completely and "correctly", since you can't manipulate ld.config. Somewhat unfortunate, but a fact of life. The ways to solve it that I see are: 1.) -R at build time, specifying all of the libs, and paths to version-specific deploy dirs -- the way it is done now. 2.) A wrapper that sets LD_LIBRARY_PATH on a per-app basis, with the info that would have been in "-R" above. 3.) Install apps into some shared dir, abandoning the current version-specific deploy dirs as the $prefix. Implies giving up full control of the ability to robustly deploy multiple versions of an app or lib. If that "shared dir" isn't already on ld.config's path, still requires some amount of solution ala 1 or 2 above, but the level of effort will be seriously lowered -- since there's only one path to push. If that dir is /usr/local; it's likely already solved. >(Let me know if I've forgotten something, e.g. from earlier in the >thread.) > > I've been puzzling on this for some time, and I think that the current approach, while it's a pain in the !@#, is the best one. I've nailed down my current biggest headache; it's that my current version of libstdc++ that I have built doesn't have a -R path to libgcc built in. Now I just have to figure out how to fix it. Jim |