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?
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)
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With