Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mkmf ignores files in sub-folders when it compiles the C extension

I'd like to organize the C source code like this:

+ /
|
|___ + ext
|    |
|    |___ + native_extension
|         |
|         |___ + lib
|         |    |
|         |    |___ (Source files are kept in here - may contain sub-folders)
|         |
|         |___ native_extension.c
|         |___ native_extension.h
|         |___ extconf.rb
|
|___ + lib
|    |
|    |___ (Ruby source code)
|
|___ Rakefile

I'm having trouble getting this setup to work correctly with mkmf. The files in native_extension/lib, which are included by native_extension.c, are being completely ignored.

When I build the extension, only native_extension.{h,c} are compiled, and I get an incomplete native_extension.{so,dll} that gives me symbol lookup errors when I try to run it.

Any way to make this work?

like image 935
Matheus Moreira Avatar asked Oct 08 '11 16:10

Matheus Moreira


2 Answers

You can use source files from another folders with "extconf.rb" like this:

require 'mkmf'

extension_name = 'native_extension'
dir_config(extension_name)

# enum all source files
$srcs = ["native_extension.c", "lib/file.c"]

# add include path to the internal folder
# $(srcdir) is a root folder, where "extconf.rb" is stored
$INCFLAGS << " -I$(srcdir)/lib"

# add folder, where compiler can search source files
$VPATH << "$(srcdir)/lib"

create_makefile(extension_name)
like image 169
0xdeadc0de Avatar answered Nov 17 '22 20:11

0xdeadc0de


While you can pass a second argument to make_makefile to specify a different source directory (e.g., make_makfile('native_extension', 'lib')), that would cause it not to include your native_extension.c file. Looking at the source for mkmf.rb, it doesn't appear there's any way to make it look in both places short of rewriting the generated Makefile yourself.

like image 35
Michael Granger Avatar answered Nov 17 '22 19:11

Michael Granger