Hello Mario, All the best and a happy new year 2014, and thanks for your usefull answer, i added some answers, comments and questions below. On 12/31/2013 01:16 PM, Mario Juric wrote: > On 12/26/13 3:02 , Fabrice Jammes wrote: > Hi Fabrice, > Happy holidays to you too, and see for some answers below! > >> Nevertheless, i still need some help on some small details, in order to >> converge towards the right direction. >> >> *1. *At the moment, the build procedure relies on HSC build style (like >> it is what was recommended by Paul Price one month ago, cf. >> http://hsca.ipmu.jp:8080/question/128/more-information-about-eups-create-distrib/) >> It builds and installs nearly all Qserv source dependencies (but not >> scisql and Qserv itself) on both Ubuntu 13.04 and SL6.2. >> For information, i did not use nor lssteups or sconsutils (i only have >> the qserv package to build with scons, and Qserv only links with >> protobuf, xrootd and mysql). >> > That sounds great! Is there a git repo you can point me to to take a look? A draft is here : ssh:[log in to unmask] Nevertheless i add to modify a little bit eups source code in order it works, so could you please use it with this eups version : https://github.com/fjammes/eups I'll send a pull request to Robert in order he review my minor updates. > >> - Do you confirm i have to move all these build script to pkgbuild right >> now ? Is pkgbuild stable enough ? If yes, does >> https://github.com/RobertLuptonTheGood/eups.git master branch support >> pkgbuild, or shall i use >> an other branch ? > I just got EupsPkg (formerly known as pkgbuild) into a state where it's > ready for review. It's right now at 'eupspkg' branch of my EUPS fork in > github: > > https://github.com/mjuric/eups/tree/eupspkg > > I plan to make a pull request to Robert (and ask others for comments as > well) imminently, and barring huge architectural disagreements I think > it will get merged into EUPS proper soon (perhaps ~two weeks or so). > > Given that, I think it makes sense to start transitioning your build > scripts to eupspkg. It hope it won't be hard -- I've written > documentation in the docstring of eupspkg module: > > https://github.com/mjuric/eups/blob/eupspkg/python/eups/distrib/eupspkg.py > > , made examples for all LSST stack external dependencies: > > https://dev.lsstcorp.org/cgit/personal/mjuric/eupspkg/external/ > > , and for LSST code that relies on scons (via sconsUtils), eupspkg knows > what to do out of the box (i.e., there's no need to modify it at all or > supply a ./ups/eupspkg file). > > If you point me to your existing builder scripts, I can help with > transforming them to eupspkg variants. My guess, based on doing that for > the rest of DM stack dependencies, is that it shouldn't take more than > ~2-3 hours. Thanks for your help. I quickly read some of your eupspkg files and they look very simple, nevertheless i would be pleased if you could help me with transforming qserv build scripts to eupspkg variants. More comments below : > >> - Do you think Qserv build should relies on sconsutils ? > I'm not familiar with the details, so I'll let K-T et al answer. > >> - Do you thinks sconsutils may be compatible with rpm format ? > I think it should be possible to write a fully automated eupspkg-to-spec > converter. All information needed to obtain and build the source is in > the eupspkg scripts. > >> - Do you confirm Qserv build musn't rely on lssteups (I didn't notice >> the use of this tool while i investigated HSC build scripts.) ? >> > The plan is for lssteups to be superseded by eupspkg; therefore, it > shouldn't be used any more. > > More comments below: >> For the next three points, i answer you between the lines below : >> >> On 12/20/2013 07:55 PM, Kian-Tat Lim wrote: >>> Fabrice, >>> >>>> Maybe it would be better if eups always run with system python ? >>> In the not-too-distant future (maybe even in January or >>> February), I think we want to convert the LSST Stack to run with the >>> system Python in all cases, including eups. >>> >>>> Indeed for now it switch to eups-installed python once command >>>> "setup python" is performed. >>> "setup python" would go away. But I'm not sure what the problem >>> is with switching Pythons. >> *2. *The problem is met with next hypothesis : >> - eups is compatible with python version i, but not with python version >> j, and eups is used to install a software, named SOFT, which require >> python version j. (note that j can even be lower than i) >> During SOFT install, eups will install python version j, and in current >> eups version, it will itself switch to python version j, and then the >> whole install procedure may break. Indeed all call to eups may fails >> because of the use of python version j, >> so it may even be not possible to go back (unsetup command may fails). >> >> That's why i propose that, during eups installation, all call to eups >> executables are forced to be done with python version i. Note that all >> other calls to python done by the build scripts will use environment >> python, i.e. python version j. >> >> (For exemple, to use this solution, eups/bin/eups would be simply >> updated like during by eups install process : >> --- a/bin/eups >> +++ b/bin/eups >> @@ -3,4 +3,4 @@ >> # #!/usr/bin/env python options >> # >> unset PYTHONSTARTUP >> -*python* -S $EUPS_DIR/bin/eups_impl.py "$@" >> +*/usr/bin/python* -S $EUPS_DIR/bin/eups_impl.py "$@" >> ) >> >> This solution, trivial to implement, would make eups more stable and >> more generic, don't you think so ? >> (I expose briefly this issue to Christian Arnault, french manager for >> LSST computing activities and author of CMT, the atlas build system, and >> he agreed with me.) >> > It's a reasonable proposal (IMHO), except that one wouldn't want to > hardcode the python path as /usr/bin/python, but autodetect it during > the install of EUPS and use that. I completely agree with you and i've implemented this minor feature in : https://github.com/fjammes/eups (cf. https://github.com/fjammes/eups/commit/ceba62ff1b94acb8a006155dff4f4b1686bca625) (please note that one "-S" has been accidentally removed in bin/eups, but it's been corrected in a later commit) Would you agree with this proposal ? > > There may be systems that don't require /usr/bin/python to be installed > (e.g., various *BSDs), so hardcoding the path would prevent a > non-privileged user from installing EUPS with their own python. > > That said: > >> Note that i met this issue while switching from system python to >> virtualenv python during Qserv build process (cf. >> http://hsca.ipmu.jp:8080/question/167/installing-virtualenv-with-eups/). > I think we need to understand why EUPS needs to run python with -S; > that's what's causing the issue with virtualenv. > > Btw., are you sure it really does this? I just grepped through the > source and couldn't find any invocations with '-S'. Yes, "-S" is used both in bin/eups and in bin/eups_setup. I suppose '-S" option restricts possible imports to standard library modules only, and make python run faster. Furthermore, it prevents eups developers to use non-standard modules. > > Could it be that it's virtualenv has a bug somwehere? It's a really > bizarre error, since traceback is a simple pure Python module. I've checked quickly virtualenv source code and it seems it only import a restricted subset of python standard library. For 2.x python version, "traceback" module isn't in the subset. > > More below: More below ;-) >>>>> Regarding its use with virtualenv, EUPS has been designed with >>>>> virtual-env like functionality in mind -- specifically, it manages the >>>>> PYTHON_PATH for you. So using the two together is likely to generate >>>>> conflicts (though it may not be impossible). >>>> One of the main advantage of using virtualenv is that install of >>>> python libraries via eups is completely transparent : you don't have >>>> to manage a dedicated PYTHONPATH in eups build scripts of python >>>> libraries. >>>> It also isolate eups-installed python and then prevent conflicts >>>> between system python user libraries and eups-installed python user >>>> libraries. >>>> Of course, if you prefer, i can set up build script to install each >>>> Qserv python lib in a dedicated directory and then add it to >>>> PYTHONPATH. >>> We already have the PYTHONPATH manipulation in the rest of the >>> LSST Stack, so I think it's best for now to continue with that. In the >>> longer run, I would like to see all LSST Stack Python modules installed >>> into a single directory, almost certainly an LSST-specific one and not >>> the system site-packages -- but they would be swapped in and out on >>> setup of the individual packages through the use of symbolic links. >> *3. *This long-term solution looks fine. So i confirm i will implement >> PYTHONPATH manipulation in my next version of Qserv packaging tool. >>> One of the main reasons to use the system Python is to allow the >>> user to incorporate other packages into their usage of the LSST Stack. >>> virtualenv does not work well with this usage model. This may not be an >>> issue with qserv, however, which is server-side and can insist on a more >>> rigorously-controlled environment. >>> >> * >> 4. *Qserv now relies on virtualenv but it also may works with system-python. >> >> An interesting feature of virtualenv in a rigorously-controlled >> environment is that it may switch PYTHONPATH while its >> activated/deactivated. >> > But that is *exactly* the problem that EUPS tries to solve, not just for > Python modules but for other code as well, and with much more granularity. > > Think of EUPS as being an "uber-virtualenv", where you can choose to > activate or deactivate not just the entire environment at once, but each > *individual package*. The equivalent of 'activate' with EUPS is 'setup', > and 'deactivate' is 'unsetup'. > > For example, say I have a Python code foo v1.2.3 that depends on a > Python code bar v1.0.0, a shared library named baz v1.1.1 (i.e., > libbaz.so.1.1.1), and a command-line utility named qux 3.2.1: > > foo v1.2.3 > +-- bar v1.0.0 > +-- baz v1.1.1 > +-- qux v3.2.1 > > Say they're all installed in an EUPS stack. I can set them all up by > running: > > setup foo 1.2.3 > > This will bring foo and bar onto PYTHONPATH, baz onto LD_LIBRARY_PATH, > and qux onto PATH. Virtualenv's 'activate' would just do the first of > these (at least that was the case when I last used it). To do the > reverse, I'd run 'unsetup foo', and both PYTHONPATH and LD_LIBRARY_PATH > would both get properly cleaned up. That is what virtualenv's > 'deactivate' does, but, again, just for Python modules. > > Now, if I wanted to install a new version of foo (say v1.3.0), I can > easily do that with EUPS without overwriting the existing one. It won't > interfere with v1.2.3, and it will reuse the already installed bar and > baz (assuming it still depends on them). With virtualenv, I'd need to > build a whole new environment just to update this one package as v1.3.0 > will want to overwrite the version already in the virtualenv container. > This is an issue when there may be 50+ other packages in the stack (and > with LSST, there are). > > Similarly, if I next installed foo v1.4.0 that now requires bar v1.2.0, > I could do that easily with EUPS; neither will interfere with other > versions, and when I run: > > setup foo 1.4.0 > > EUPS will know it needs to also setup bar 1.2.0 (because it tracks > dependencies). Again, with virtualenv, I'd need to build a whole new > environment; it has no notion of internal product dependencies. > > Finally, EUPS lets you "mix and match" with ease. This is extremely > handy while developing code. Say you're not sure if foo 1.4.0 really > requires bar v1.2.0, or if it could work with an older version (or you > just want to try it out). Then, you run: > > setup bar 1.2.0 > setup -k foo 1.4.0 > > and on your PYTHONPATH you'll get foo v1.4.0 and bar v1.2.0. With > virtualenv you'd need to build yet another environment, again. > > > Basically, the issue I see with virtualenv is that it tries to solve a > problem (and do so just for Python) that EUPS has mostly solved years > ago (and for Python, PERL, binaries, shared libraries in general, etc.), > and at a much finer level of granularity. > > Virtualenv is a great idea and a very useful package for python users > who need to sandbox certain applications. Django folks just love it. > I've used it myself on other projects. I don't have anything against > virtualenv per se. But if one already has EUPS, I'm not sure it adds > much (if any) value to it. EUPS is *far* from perfect, but for this > purpose it's functionality appears to be a (strict) superset of virtualenv. > > Perhaps another way to approach this is to ask what is it that we need > virtualenv for, that we can't (easily) achieve with EUPS? What is the > problem it solves for us? It's quite possible I'm missing something. I completely agree with your explanations. Nevertheless, virtualenv garantee that Qserv will only use eups-installed python libraries : For example, it will prevents conflicts between libraries installed in /usr/lib64/python2.6/site-packages/ , and libraries installed by eups. Is it possible to do the same thing with eups only, without virtualenv? Indeed, I think it's an interesting feature for a service like Qserv, which needs stability and isolation. K.T. solution looks elegant and may allow to mix virtualenv and eups :/ / /"We already have the PYTHONPATH manipulation in the rest of the LSST Stack, so I think it's best for now to continue with that. In the longer run, I would like to see all LSST Stack Python modules installed into a single directory, almost certainly an LSST-specific one and not the system site-packages -- but they would be swapped in and out on setup of the individual packages through the use of symbolic links."/ Indeed, here setup bar 1.2.0 wouldn't update the PYTHONPATH, but would add/remove symlinks in virtualenv python site-package directory. These symlinks would points to bar python modules) I've seen that your example eupspkg build scripts support system python. So i agree to switch to system python if you think it's, for now, the good way to do. Nevertheless, I think it would be good that the Qserv team validate this choice (indeed they might be good reasons to use Qserv with virtualenv that i may ignore). > >> Please, note that in order to make eups fully complient with virtualenv, >> command >> "setup python" would require an extra feature : >> Indeed activating a virtualenv-installed python require >> /path_to_virtualenv_installed_python/bin/activate script to be sourced, >> and deactivating it require >> /path_to_virtualenv_installed_python/bin/deactivate script to be runnned. >> So i think that complete virtualenv support in eups would require and >> execute() function in table file. >> Do you think an alternate solution may be used ? >> > This would be a good feature to have, in general. > > For example, I'd use it to check that the system python (or other system > libraries) are the correct version whenever a "shadow" (say) > "python-depends" module is setup-ed. > > Hope this helps, Yes it's help a lot, thank ! ######################################################################## Use REPLY-ALL to reply to list To unsubscribe from the QSERV-L list, click the following link: https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=QSERV-L&A=1