FindRuby.cmake

Michael Jansen kde at michael-jansen.biz
Mon Mar 7 23:42:50 CET 2011


Ruby has three different installation areas for libraries. Each installation 
area has two different subdirectories (sort of). One is for architecure 
independent files. One is for architecture dependent files.

1. Installation Area: Ruby Library Directory

        rubylibdir  /usr/lib64/ruby/1.8
           archdir  /usr/lib64/ruby/1.8/x86_64-linux

This area is reserved for the ruby standard library (http://www.ruby-
doc.org/stdlib/). No other software is supposed to be installed into this 
directory. It makes no sense for the cmake file to determine and provide the 
path and location of this area. You don't want to install stuff there and you 
don't need to get stuff from there. (The libruby.so is somewhere else)

2. Installation Area: Vendor

           vendordir  /usr/lib64/ruby/vendor_ruby
        vendorlibdir  /usr/lib64/ruby/vendor_ruby/1.8
       vendorarchdir  /usr/lib64/ruby/vendor_ruby/1.8/x86_64-linux

This area is intended to be used by distributions. They install the libraries 
provided by distribution packages into that area. You are supposed to install 
into that area if you build distro packages. It therefore makes sense to 
determine and provide this area from FindRuby.cmake

3. Installation Area: Site

This area is intended to be used for self compiled and installed ruby 
packages. This is the most likely installation area for a ruby extension.

4. Installation Area: Custom

In Addition to those 3 areas it is possible to install ruby extensions into 
custom directories and add their path to ruby $LOAD_PATH global array. Each 
directory has to be added explicitly. There is no automatic archdir handling. 

    a) $LOAD_PATH << "<custom_ruby_libdir>" << "<custom_ruby_archdir>"
    b) ruby -I<path1> -I<path2>
    c) Environment Variable RUBY_LIB and/or DLN_LIBRARY_PATH

The current FindRuby.cmake determines the location of the areas 1, 2 ( if it 
exists) and 3. It does not advise or support chosing any installation prefix 
to use. The ruby bindings use the simplest way and just install into the site 
area unless someone specifies a different path. Which is annoying if 
CMAKE_INSTALL_PREFIX is not the same as the ruby install prefix. But it is 
annoying too if you have to manually construct the correct path to one of the 
installation areas just to install your stuff into the ruby prefix. The ruby 
version and rubyarch are not obvious from the outside for both use cases.

The features i would like to implement are:

Provide two variables named
    RUBY_INSTALL_LIBDIR
    RUBY_INSTALL_ARCHDIR 

First rule wins:

1. If option RUBY_(USE_?)INSTALL_AREA is set to "site"
    RUBY_INSTALL_LIBDIR  = ${RUBY_SITELIB_DIR}
    RUBY_INSTALL_ARCHDIR = ${RUBY_SITEARCH_DIR}

2. If option RUBY_INSTALL_AREA is set to "vendor" and a vendor install area 
exists (if not error)
    RUBY_INSTALL_LIBDIR  = ${RUBY_VENDORLIB_DIR}
    RUBY_INSTALL_ARCHDIR = ${RUBY_VENDORARCH_DIR}

3. If option RUBY_INSTALL_AREA is set to something else
    error

4. if CMAKE_INSTALL_PREFIX is the same as the ruby install prefix
    RUBY_INSTALL_LIBDIR  = ${RUBY_SITELIB_DIR}
    RUBY_INSTALL_ARCHDIR = ${RUBY_SITEARCH_DIR}

5. If CMAKE_INSTALL_PREFIX is not the same as the ruby install prefix install 
set
    RUBY_INSTALL_LIBDIR  = 
${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/ruby/${RUBY_VERSION}
    RUBY_INSTALL_ARCHDIR = 
${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/ruby/${RUBY_VERSION}/${RUBY_ARCH}
    and print out a hint how to activate this area for ruby (see above)

This solution would make it possible to have all ruby extensions support this 
advanced functionality at once without each and everyone of them trying to 
support (or neglecting to) it by itself.

The question is if such a functionality is appropriate for a cmake file.

If we finish this i would like to add the same functionality for python 
(PYTHON_(USE_?)INSTALL_AREA).

Mike



More information about the Kde-buildsystem mailing list