Building extensions into static libraries

A

Alex Young

I am delving into the wonder that is mkmf.rb. I'm trying to tell
extconf.rb that I want to build an extension into a static library, but
I can't see how to tell it to generate the static target in the
Makefile. Has anyone else tried this?
 
L

Luis Lavena

I am delving into the wonder that is mkmf.rb.  I'm trying to tell
extconf.rb that I want to build an extension into a static library, but
I can't see how to tell it to generate the static target in the
Makefile. Has anyone else tried this?

So you want to statically link against the Ruby library?

In that way it will not depend on the libruby shared library?

If that is the case, then --enable-static option that you can supply
your extconf.rb will already do that for you.

mkmf will handle that automatically for you.

HTH,
 
A

Alex Young

Luis Lavena wrote in post #992376:
So you want to statically link against the Ruby library?

In that way it will not depend on the libruby shared library?

If that is the case, then --enable-static option that you can supply
your extconf.rb will already do that for you.

mkmf will handle that automatically for you.

That doesn't seem to be doing what I'm after:

$ gem unpack mongrel
Unpacked gem: '/home/zander/projects/scratch/mongrel/mongrel-1.1.5'

$ cd mongrel-1.1.5
$ ruby ext/http11/extconf.rb --enable-static
checking for main() in -lc... yes
creating Makefile

$ grep -i static Makefile
LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
EXTSTATIC =
STATIC_LIB =
static: $(STATIC_LIB)

I'm expecting there to be *something* present for STATIC_LIB, which I
want to give me a .a rather than a .so. To be perfectly clear, I simply
don't know if what I'm trying to do here is actually possible, but
neither do I know where else to look.
 
L

Luis Lavena

That doesn't seem to be doing what I'm after:

  $ gem unpack mongrel
  Unpacked gem: '/home/zander/projects/scratch/mongrel/mongrel-1.1.5'

  $ cd mongrel-1.1.5
  $ ruby ext/http11/extconf.rb --enable-static
  checking for main() in -lc... yes
  creating Makefile

  $ grep -i static Makefile
  LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
  LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
  EXTSTATIC =
  STATIC_LIB =
  static:    $(STATIC_LIB)

I'm expecting there to be *something* present for STATIC_LIB, which I
want to give me a .a rather than a .so.  To be perfectly clear, I simply
don't know if what I'm trying to do here is actually possible, but
neither do I know where else to look.

That that is why I asked what you're targeting/aiming at.

If you want to generate an static library of your extension, then you
can't rely on mkmf.

mkmf is aimed to generated shared libraries to be loaded by Ruby.

For that to work you will need to create a Makefile (or adapt the one
generated by mkmf) to generate a static library.

As long one of the symbols is exported, you can generate a static
library, take this example:

/* mylib.c */
#include <stdio.h>

extern void foo();

void foo()
{
printf("foo, exported\n");
}


In the command line:

$ gcc -c mylib.c -o mylib.o

$ ar rcs libmylib.a mylib.o

Above generates me a static library of mylib, you can check with nm
the symbols contained in there

$ gcc -shared mylib.o -o mylib.dll

That will generate a dynamic library using the compiled symbols.

Does that help?
 
A

Alex Young

Luis Lavena wrote in post #992613:
That that is why I asked what you're targeting/aiming at.

If you want to generate an static library of your extension, then you
can't rely on mkmf.

mkmf is aimed to generated shared libraries to be loaded by Ruby.

Ok, some more details: I'm trying to embed a ruby interpreter into a
static-linked binary, along with some additional binary extensions from
rubygems. This works for the extensions in stdlib, whose Makefiles get
a STATIC_LIB entry of $(TARGET).a thanks to mkmf.rb. I don't see how,
though. The top-level Makefile following a ./configure in the ruby
source tree contains this:

EXTCONF = extconf.rb
...
extconf:
$(MINIRUBY) -run -e mkdir -- -p "$(EXTCONFDIR)"
$(RUNRUBY) -C "$(EXTCONFDIR)" $(EXTCONF) $(EXTCONFARGS)



I can't see where EXTCONFARGS is set, or I'd just copy that. I don't
see any obvious settings in the existing extconf.rb files either.
For that to work you will need to create a Makefile (or adapt the one
generated by mkmf) to generate a static library.

Going by the stdlib extensions, I don't think that's the case, but you'd
know better than me.

$ gcc -c mylib.c -o mylib.o

$ ar rcs libmylib.a mylib.o

I might be able to get away with sidestepping the extensions' Makefiles
and
just do a

$ find ext/ -name "*.o" | xargs ar rcs libwhatsit.a

but I imagine that would break horribly for reasons I haven't thought
of.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top