On Mar 12, 2013, at 4:56 PM, Hervé Pagès wrote:

> 
> 
> On 03/12/2013 12:53 PM, Simon Urbanek wrote:
>> 
>> On Mar 12, 2013, at 3:35 PM, Hervé Pagès wrote:
>> 
>>> 
>>> 
>>> On 03/12/2013 11:56 AM, Simon Urbanek wrote:
>>>> 
>>>> On Mar 12, 2013, at 2:48 PM, Hervé Pagès wrote:
>>>> 
>>>>> On 03/12/2013 11:09 AM, Simon Urbanek wrote:
>>>>>> 
>>>>>> On Mar 12, 2013, at 2:01 PM, Hervé Pagès wrote:
>>>>>> 
>>>>>>> Hi,
>>>>>>> 
>>>>>>> On 03/12/2013 09:55 AM, Simon Urbanek wrote:
>>>>>>>> 
>>>>>>>> On Mar 12, 2013, at 12:30 PM, Kevin Horan wrote:
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>    Thanks for your input. To clarify, I don't need to use any part of 
>>>>>>>>> GSL in my R code, nor do I wish to make any part of it accessible to 
>>>>>>>>> users of eiR. I need it to compile other C/C++ code (LSH KIT), which 
>>>>>>>>> I did not write, that will itself be used in eiR.
>>>>>>>>>    My goal is allow the user to install eiR without also having to 
>>>>>>>>> install GSL before hand.
>>>>>>>> 
>>>>>>>> If your package is on CRAN they won't need to as we are providing Mac 
>>>>>>>> and Windows binaries.
>>>>>>> 
>>>>>>> I think that at least on Windows, the user would still need to have the
>>>>>>> GSL installed on his/her machine.
>>>>>>> 
>>>>>> 
>>>>>> Why?
>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>>>> Linux can get the binaries form their distro, so the dependencies are 
>>>>>>>> installed automatically.
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> The target audience is people in bioinformatics who may not how to 
>>>>>>>>> install something like GSL. It seems like what I was suggesting is 
>>>>>>>>> not such a good idea, if it will be hard to reliably find the header 
>>>>>>>>> files from another R package. I could also push all of GSL into eiR, 
>>>>>>>>> but as GSL has over 5000 files, this makes the package very large ( 
>>>>>>>>> >22 MB) and  slow to compile. Both of which are a problem when 
>>>>>>>>> submitting a package to bioconductor. It may very well be that 
>>>>>>>>> leaving GSL as an external dependency to eiR is really the best and 
>>>>>>>>> easiest way, but I just wanted to see if there was any way to make it 
>>>>>>>>> easier for the user.
>>>>>>>> 
>>>>>>>> Can you clarify what you mean by "user"? The vast majority of R users 
>>>>>>>> use binaries, so all this is irrelevant to them as they don't need to 
>>>>>>>> install GSL at all.
>>>>>>> 
>>>>>>> FWIW we currently have 7 or 8 Bioconductor packages that require the
>>>>>>> GSL as an external system lib. That's because even if we provide Windows
>>>>>>> binaries for those packages, those binaries are dynamically linked.
>>>>>>> Is there a way to build those binaries that would avoid that dependency?
>>>>>>> 
>>>>>> 
>>>>>> Yes, use static libgsl.
>>>>> 
>>>>> Ah yes, of course. Thanks for the reminder. Just checked with Dan and
>>>>> turns out that we are using that libgsl.a too (made by Brian D. Ripley)
>>>>> on our build system. Some Bioconductor packages have README or INSTALL
>>>>> files that still mention that the Windows user needs to install the GSL
>>>>> but that doesn't seem to be the case so we'll make sure this information
>>>>> gets updated.
>>>>> 
>>>>> Also the SystemRequirements field in the DESCRIPTION file can be a
>>>>> little bit confusing as it suggests that everybody requires the stuff
>>>>> listed here when it actually depends whether the user is installing the
>>>>> binary or not and how the binary was made.
>>>>> 
>>>>>> 
>>>>>> 
>>>>>>> Anyway, to answer Kevin's original question:
>>>>>>> 
>>>>>>>  how do I know where the GSL library and header files, packaged
>>>>>>>  in GSLR, would live so I can point the compiler at them?
>>>>>>> 
>>>>>>> Use the LinkingTo field.
>>>>>>> 
>>>>>> 
>>>>>> No, you're not linking to another package, your'e linking to a 
>>>>>> *library*. LinkingTo uses R's own mechanism for symbol detection in 
>>>>>> another *package*. I know, the name is a bit misleading but those are 
>>>>>> two different things.
>>>>> 
>>>>> I understand that but that's what Kevin wants right, i.e. linking
>>>>> to another package.
>>>> 
>>>> No (you cannot link to another package - that's the misnomer), he wants to 
>>>> link to a library provided by another package (see his e-mail, he's asking 
>>>> about how to locate the GSL library supplied with RGSL, not to RGSL 
>>>> itself).
>>> 
>>> Maybe I misunderstand what the OP wants to do, and the only way to know
>>> would be for him to clarify, but IIUC the RGSL package would only
>>> contain the GSL library. At least that's how I understand it (and
>>> that's what makes sense to me). So the RGSL package would contain
>>> only 1 shared object (or 1 shared object per sub-arch): the GSLR.so
>>> file (extension may vary). So I'm not sure what's the difference between
>>> linking to the "GSL library supplied with RGSL" and linking to
>>> "RGSL itself"?
>>> 
>> 
>> GSL library inside RGSL is libgsl.* (where * is a, dylib, so, dll depending 
>> on the type and OS). This is *not* the same as RGSL.so/dll which would be 
>> the package shared object compiled by R for the package. There is a big 
>> difference: the shared objects that R creates for packages cannot be linked 
>> to, they are meant to be used with dlopen()/dlsym() - which is what R uses 
>> to load symbols entry points. That is also the reason why using LinkingTo: 
>> requires explicit exposure of symbols by the package providing the symbols 
>> as well as explicit loading of the symbols by the package that uses them. 
>> This is entirely different than linking to a library - in the latter case 
>> the linker (not R) establishes the connection between the symbols in the 
>> library and references - and in case of a static library they get copied 
>> into the binary that is being created (which is why you don't need it 
>> anymore after linking).
> 
> OK, thanks for the clarification. I agree with you that putting
> libgsl.* inside RGSL sounds like a complicated solution and that
> LinkingTo wouldn't work.
> 
> FWIW I was suggesting the use of LinkingTo with a setup where RGSL
> contains the GSL source code under src/ and the header files
> under inst/include/. Plus an extra file under src/ for registering
> the GSL API. As mentioned earlier, this is probably not the best
> way to go, but that *should* work.
> 

In theory, yes, but it's less efficient and requires you to get the 
declarations of the imported symbols right. I'd argue that it's really error 
prone unless you have some auto-generator for the necessary R API code. This is 
really intended for R package exposing a few calls, not for re-mapping calls of 
other libraries through a package.  It doesn't mean you can't do it, but I 
wouldn't want to maintain such a package :).


> The reason I'm interested in clarifying this is that we are facing
> a similar situation with other libraries (e.g. the BOOST library)
> used by some Bioconductor packages. Right now, each Bioconductor
> package includes its own version of the BOOST source code, which
> is of course less than optimal. Ideally we'd want to wrap the BOOST
> source (or a subset of it, it's huge!) in something like an rBOOST
> package and use a setup similar to what I describe above for RGSL
> (i.e. using LinkingTo). Are there better ways? Is there something
> like an RcppBOOST package? Sounds like, like for the GSL, it would
> be better to install the static BOOST libs on the build machine and
> have client packages link against that

That's what we do on CRAN (at least I do for Mac binaries - I didn't check 
Windows).

Note that the packages can still use internal version of BOOST regardless. 
Actually, with boost I'd argue that's not a bad idea, because that way the 
package knows that it's using a version that works (since there are version 
compatibility issues with Boost).


> (but that also means more
> complexity in the client packages since they need a configure script).
> 

They don't necessarily - only if there are some special options they want to 
enable/disable depending on some run-time checks.

Cheers,
Simon



> Thanks,
> H.
> 
> 
>> 
>> Cheers,
>> Simon
>> 
>> 
>>> Very confusing to me. Thanks for your time and sorry if I'm missing 
>>> something obvious.
>>> 
>>> H.
>>> 
>>>> 
>>>> 
>>>>> Yes there is the extra difficulty to register all the C functions in the 
>>>>> GSL API (as pointed out by Dirk) but that's another story.
>>>>> 
>>>> 
>>>> That's not another story - that's very much part of the story why using 
>>>> LinkingTo is not a good idea.
>>>> 
>>>> Cheers,
>>>> Simon
>>>> 
>>>> 
>>>> 
>>>>> Thanks,
>>>>> H.
>>>>> 
>>>>>> 
>>>>>> Cheers,
>>>>>> Simon
>>>>>> 
>>>>>> 
>>>>>>> Cheers,
>>>>>>> H.
>>>>>>> 
>>>>>>>> 
>>>>>>>> Cheers,
>>>>>>>> Simon
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> So, any other suggestions about how this could be accomplished?  
>>>>>>>>> Thanks.
>>>>>>>>> 
>>>>>>>>> Kevin
>>>>>>>>> 
>>>>>>>>> On 03/12/2013 05:26 AM, Simon Urbanek wrote:
>>>>>>>>>> Kevin,
>>>>>>>>>> 
>>>>>>>>>> On Mar 11, 2013, at 5:20 PM, Kevin Horan wrote:
>>>>>>>>>> 
>>>>>>>>>>> I am developing an R package, eiR,  which depends on another C 
>>>>>>>>>>> library, GNU scientific library (GSL). In order to make life easier 
>>>>>>>>>>> for the user, it would be nice to not have this as an external 
>>>>>>>>>>> dependency, thus I would like to wrap this library in another R 
>>>>>>>>>>> package, say GSLR for example. Thus far I know how to do this. The 
>>>>>>>>>>> C code in eiR requires the .so library and the header files from 
>>>>>>>>>>> GSL in order to compile. So the idea is that eiR would depend on 
>>>>>>>>>>> GSLR, then GSLR gets compiled and installed first, then, while eiR 
>>>>>>>>>>> is installing, it should be able to make use of the GSL library and 
>>>>>>>>>>> header files while compiling. So my question is, how do I know 
>>>>>>>>>>> where the GSL library and header files, packaged in GSLR, would 
>>>>>>>>>>> live so I can point the compiler at them? I know how to find the 
>>>>>>>>>>> installed directory of an R package from within R, but is there way 
>>>>>>>>>>> to find that out using just Makevars or a Makefile? I'm open to 
>>>>>>>>>>> suggestions about a better way organize all of this as well. I li
> ke
>>> t
>>>>> he
>>>>>>> !
>>>>>>>>   idea of keeping the GSL code separate so that it can be 
>>>>>>>> updated/changed independently from eiR though.
>>>>>>>>>> Have a look at Rcpp.
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>>>    I'm also aware of the gsl R library on CRAN, however, this just 
>>>>>>>>>>> wraps GSL in R functions, but I need to use the GSL C functions in 
>>>>>>>>>>> other C code in eiR.
>>>>>>>>>>> 
>>>>>>>>>> Why is what you are proposing any better than simply using GSL in 
>>>>>>>>>> eiR? You will still need the GSL external dependency for GSLR and 
>>>>>>>>>> you are only adding a lot of complexity by linking into another 
>>>>>>>>>> package's external directory (you cannot use libs) which is in 
>>>>>>>>>> itself very tricky (you'll have to deal with both static and shared 
>>>>>>>>>> version, multi-arch setups, possible relocation etc.). It won't make 
>>>>>>>>>> it any easier on the user, rather to the contrary as there will be 
>>>>>>>>>> more things to break. The only reason Rcpp goes into such length to 
>>>>>>>>>> do this is because it has no choice (the Rcpp library has to use the 
>>>>>>>>>> same libR so cannot be used as external dependency) - I would 
>>>>>>>>>> certainly not recommend it for something as trivial as providing GSL.
>>>>>>>>>> 
>>>>>>>>>> Cheers,
>>>>>>>>>> Simon
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>>> Thanks.
>>>>>>>>>>> 
>>>>>>>>>>> Kevin
>>>>>>>>>>> 
>>>>>>>>>>> ______________________________________________
>>>>>>>>>>> R-devel@r-project.org mailing list
>>>>>>>>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>> 
>>>>>>>> ______________________________________________
>>>>>>>> R-devel@r-project.org mailing list
>>>>>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>>>>> 
>>>>>>> 
>>>>>>> --
>>>>>>> Hervé Pagès
>>>>>>> 
>>>>>>> Program in Computational Biology
>>>>>>> Division of Public Health Sciences
>>>>>>> Fred Hutchinson Cancer Research Center
>>>>>>> 1100 Fairview Ave. N, M1-B514
>>>>>>> P.O. Box 19024
>>>>>>> Seattle, WA 98109-1024
>>>>>>> 
>>>>>>> E-mail: hpa...@fhcrc.org
>>>>>>> Phone:  (206) 667-5791
>>>>>>> Fax:    (206) 667-1319
>>>>>>> 
>>>>>>> ______________________________________________
>>>>>>> R-devel@r-project.org mailing list
>>>>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>> 
>>>>> --
>>>>> Hervé Pagès
>>>>> 
>>>>> Program in Computational Biology
>>>>> Division of Public Health Sciences
>>>>> Fred Hutchinson Cancer Research Center
>>>>> 1100 Fairview Ave. N, M1-B514
>>>>> P.O. Box 19024
>>>>> Seattle, WA 98109-1024
>>>>> 
>>>>> E-mail: hpa...@fhcrc.org
>>>>> Phone:  (206) 667-5791
>>>>> Fax:    (206) 667-1319
>>>>> 
>>>>> 
>>>> 
>>> 
>>> --
>>> Hervé Pagès
>>> 
>>> Program in Computational Biology
>>> Division of Public Health Sciences
>>> Fred Hutchinson Cancer Research Center
>>> 1100 Fairview Ave. N, M1-B514
>>> P.O. Box 19024
>>> Seattle, WA 98109-1024
>>> 
>>> E-mail: hpa...@fhcrc.org
>>> Phone:  (206) 667-5791
>>> Fax:    (206) 667-1319
>>> 
>>> 
>> 
> 
> -- 
> Hervé Pagès
> 
> Program in Computational Biology
> Division of Public Health Sciences
> Fred Hutchinson Cancer Research Center
> 1100 Fairview Ave. N, M1-B514
> P.O. Box 19024
> Seattle, WA 98109-1024
> 
> E-mail: hpa...@fhcrc.org
> Phone:  (206) 667-5791
> Fax:    (206) 667-1319
> 
> 

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to