Camellia and Ruby on Mac OS X

Camellia is ‘an open source Image Processing & Computer Vision library’ that can do some interesting stuff directly from Ruby.

Unfortunately, the Ruby library for Camellia is only available as a RubyGem in two flavours, i386-mswin32 and i486-linux, neither of which is much use if you’re on Mac OS X.

Fortunately, with a bit of work, you can get it to compile. I’ll assume in these instructions that you’re using Ruby from MacPorts. I also can’t guarantee that this works on PowerPC Macs: I’ve only tried it on Intel.

The first prerequisite is the Camellia library itself; that’s a straightforward case of downloading the source (use the ‘Unix/Linux’ distribution), expanding the archive and doing the usual incantation:

./configure && make && sudo make install

For the gem itself, it’s a bit more complicated. There’s no source distribution as such, but it’s easy enough to pick apart the file once you’ve downloaded it (go for the i486-linux gem).

mkdir camellia-gem
cd camellia-gem
tar xvf ../camellia-2.5.10-i486-linux.gem
tar zxvf data.tar.gz
cd ext

The only thing that stops the gem compiling out of the box is a couple of linker settings; change the line in extconf.rb that reads

CONFIG['LDSHARED'] = "g++ -shared -lCamellia"

to

CONFIG['LDSHARED'] = 
"g++ -lCamellia -bundle -flat_namespace -undefined suppress"

You can now build the extension:

ruby extconf.rb && make

You should now have a camellia.bundle file; check whether it has built correctly:

ruby -d -w -e 'require "camellia"'

If you get no errors, everything worked. You can copy camellia.bundle into your site_ruby directory so that it’s available to all programs:

sudo cp camellia.bundle /opt/local/lib/ruby/site_ruby/1.8/

That’s it! Now try some of the demo code ....

Comments

Skip to the comment form

  1. Tieg

    Wrote at 2007-05-16 16:55 UTC using Firefox 2.0.0.3 on Mac OS X:

    Nice! Thanks for the pointer; I’ll try this later with /usr/local/lib ruby. Anything that has “camellia” in its name has to be good.
  2. Peter Cooper

    Wrote at 2007-05-17 16:44 UTC using Firefox 2.0.0.3 on Mac OS X:

    I’ve updated the Ruby Inside post with a link to this. Nice detective work :)
  3. Marc

    Wrote at 2008-06-09 07:48 UTC using Firefox 2.0.0.14) on Mac OS X:

    $ make
    make: *** No rule to make target `ruby.h’, needed by `camellia_ruby_wrap.o’. Stop.

    any idea?

    $ ruby -rrbconfig -e ‘puts ::Config::CONFIG[“includedir”]’
    /usr/local/include

    A ruby.h does exist in /usr/local/include
  4. Ezekiel

    Wrote at 2008-12-31 11:15 UTC using Firefox 3.0.5 on Mac OS X:

    I am having the same exact issue as Marc.
  5. Vishnu Gopal

    Wrote at 2009-05-23 23:05 UTC using Safari 528.17 on Mac OS X:

    For those facing problems, you have to tweak the Makefile in the ext directory as well. Change to:

    topdir = /opt/local/lib/ruby/1.8/i686-darwin9 (for leopard)

    Change all occurences of /usr/local to /opt/local if you are using Macports.

    You have to remove ”-Wl,-export-dynamic” from DLDFLAGS and ”-Wl,-R’$(libdir)’” from LIBPATH

    Also remove ”-lcrypt” from LIBS

    Then make, also cp camellia.so camellia.bundle for everything to work right!
  6. Anton Djurasaj

    Wrote at 2009-06-24 23:18 UTC using Firefox 3.5 on Windows NT:

    Does anybody know how to install camellia as a gem on Ubuntu 9.04 (64-bit). The one from the gem repo won’t install—it says it can’t find it—probably because it’s 32-bit. I tried Vishnu’s trick above and I do get the camellia.so file, but can’t get camellia.bundle to generate.

    I’d appreciate any help with this.
  7. Anton Djurasaj

    Wrote at 2009-06-24 23:53 UTC using Firefox 3.5 on Windows NT:

    I forgot to include my Makefile. Please note that “g++ -lCamellia -bundle -flat_namespace -undefined suppress” did not work as it complains about invalid switch ’-bundle’. Also, I have modified paths in accordance with my system (Ubuntu 9.04 64-bit).

    SHELL = /bin/sh

    #### Start of system configuration section. ####

    srcdir = .
    topdir = /usr/lib/ruby/1.8/x86_64-linux
    hdrdir = $(topdir)
    VPATH = $(srcdir):$(topdir):$(hdrdir)
    prefix = /usr
    exec_prefix = $(prefix)
    sitedir = $(prefix)/lib/site_ruby
    rubylibdir = $usr/lib/ruby/$(ruby_version)
    docdir = $(datarootdir)/doc/$(PACKAGE)
    dvidir = $(docdir)
    datarootdir = $(prefix)/share
    archdir = $(rubylibdir)/$(arch)
    sbindir = $(exec_prefix)/sbin
    psdir = $(docdir)
    localedir = $(datarootdir)/locale
    htmldir = $(docdir)
    datadir = $(datarootdir)
    includedir = $(prefix)/include
    infodir = $(datarootdir)/info
    sysconfdir = $(prefix)/etc
    mandir = $(datarootdir)/man
    libdir = $(exec_prefix)/lib
    sharedstatedir = $(prefix)/com
    oldincludedir = $(DESTDIR)/usr/include
    pdfdir = $(docdir)
    sitearchdir = $(sitelibdir)/$(sitearch)
    bindir = $(exec_prefix)/bin
    localstatedir = $(prefix)/var
    sitelibdir = $(sitedir)/$(ruby_version)
    libexecdir = $(exec_prefix)/libexec

    CC = gcc
    LIBRUBY = $(LIBRUBY_A)
    LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
    LIBRUBYARG_SHARED = -Wl,-R -Wl,$(libdir) -L$(libdir) -L.
    LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static

    RUBY_EXTCONF_H =
    CFLAGS = -fPIC -g -O2
    INCFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir)
    CPPFLAGS =
    CXXFLAGS = $(CFLAGS)
    DLDFLAGS = -rdynamic
    LDSHARED = g++ -shared -lCamellia
    AR = ar
    EXEEXT =

    RUBY_INSTALL_NAME = ruby
    RUBY_SO_NAME = ruby
    arch = x86_64-linux
    sitearch = x86_64-linux
    ruby_version = 1.8
    ruby = /usr/local/bin/ruby
    RUBY = $(ruby)
    RM = rm -f
    MAKEDIRS = mkdir -p
    INSTALL = /usr/bin/install -c
    INSTALL_PROG = $(INSTALL) -m 0755
    INSTALL_DATA = $(INSTALL) -m 644
    COPY = cp

    #### End of system configuration section. ####

    preload =

    libpath = $(libdir)
    LIBPATH = -L’$(libdir)’
    DEFFILE =

    CLEANFILES =
    DISTCLEANFILES =

    extout =
    extout_prefix =
    target_prefix =
    LOCAL_LIBS =
    LIBS = -ldl -lm -lc
    SRCS = camellia_ruby_wrap.cxx
    OBJS = camellia_ruby_wrap.o
    TARGET = camellia
    DLLIB = $(TARGET).so
    EXTSTATIC =
    STATIC_LIB =

    RUBYCOMMONDIR = $(sitedir)$(target_prefix)
    RUBYLIBDIR = $(sitelibdir)$(target_prefix)
    RUBYARCHDIR = $(sitearchdir)$(target_prefix)

    TARGET_SO = $(DLLIB)
    CLEANLIBS = $(TARGET).so $(TARGET).il? $(TARGET).tds $(TARGET).map
    CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak

    all:$(DLLIB)
    static:$(STATIC_LIB)

    clean:
    @-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)

    distclean:clean
    @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
    @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)

    realclean:distclean
    install: install-so install-rb

    install-so: $(RUBYARCHDIR)
    install-so: $(RUBYARCHDIR)/$(DLLIB)
    $(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
    $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
    install-rb: pre-install-rb install-rb-default
    install-rb-default: pre-install-rb-default
    pre-install-rb: Makefile
    pre-install-rb-default: Makefile
    $(RUBYARCHDIR):
    $(MAKEDIRS) $@

    site-install: site-install-so site-install-rb
    site-install-so: install-so
    site-install-rb: install-rb

    .SUFFIXES: .c .m .cc .cxx .cpp .C .o

    .cc.o:
    $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<

    .cxx.o:
    $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<

    .cpp.o:
    $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<

    .C.o:
    $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<

    .c.o:
    $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) -c $<

    $(DLLIB): $(OBJS)
    -$(RM) $
    $(LDSHARED) $(DLDFLAGS) $(LIBPATH) -o $@ $(OBJS) $(LOCAL_LIBS) $(LIBS)

    $(OBJS): ruby.h defines.h
  8. Liborio Cannici

    Wrote at 2009-10-07 08:39 UTC using Firefox 3.5.3 on Mac OS X:

    No luck on Snow Leopard!
    I have followed what Vishnu Gopal suggested on 23 May and I get lots of errors that ends with:

    ld: symbol(s) not found
    collect2: ld returned 1 exit status
    make: *** [camellia.so] Error 1

Leave a comment

Please read the comment guidelines before posting. Comments are Gravatar-enabled. Your email address will not be published.

To prove that you’re human, type human in the Bot check field.

Trying to post some program output or a long code sample? Please use a paste service and link to it instead.