-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Initial scaffolding for a simple Objective-C Ruby Extension.
- Loading branch information
Showing
10 changed files
with
341 additions
and
0 deletions.
There are no files selected for viewing
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,190 @@ | ||
|
||
SHELL = /bin/sh | ||
|
||
#### Start of system configuration section. #### | ||
|
||
srcdir = . | ||
topdir = /Users/aitrus/.rvm/rubies/ruby-1.9.2-p0/include/ruby-1.9.1 | ||
hdrdir = /Users/aitrus/.rvm/rubies/ruby-1.9.2-p0/include/ruby-1.9.1 | ||
arch_hdrdir = /Users/aitrus/.rvm/rubies/ruby-1.9.2-p0/include/ruby-1.9.1/$(arch) | ||
VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby | ||
prefix = $(DESTDIR)/Users/aitrus/.rvm/rubies/ruby-1.9.2-p0 | ||
rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) | ||
exec_prefix = $(prefix) | ||
vendorhdrdir = $(rubyhdrdir)/vendor_ruby | ||
sitehdrdir = $(rubyhdrdir)/site_ruby | ||
rubyhdrdir = $(includedir)/$(RUBY_BASE_NAME)-$(ruby_version) | ||
vendordir = $(rubylibprefix)/vendor_ruby | ||
sitedir = $(rubylibprefix)/site_ruby | ||
ridir = $(datarootdir)/$(RI_BASE_NAME) | ||
mandir = $(datarootdir)/man | ||
localedir = $(datarootdir)/locale | ||
libdir = $(exec_prefix)/lib | ||
psdir = $(docdir) | ||
pdfdir = $(docdir) | ||
dvidir = $(docdir) | ||
htmldir = $(docdir) | ||
infodir = $(datarootdir)/info | ||
docdir = $(datarootdir)/doc/$(PACKAGE) | ||
oldincludedir = $(DESTDIR)/usr/include | ||
includedir = $(prefix)/include | ||
localstatedir = $(prefix)/var | ||
sharedstatedir = $(prefix)/com | ||
sysconfdir = $(prefix)/etc | ||
datadir = $(datarootdir) | ||
datarootdir = $(prefix)/share | ||
libexecdir = $(exec_prefix)/libexec | ||
sbindir = $(exec_prefix)/sbin | ||
bindir = $(exec_prefix)/bin | ||
rubylibdir = $(rubylibprefix)/$(ruby_version) | ||
archdir = $(rubylibdir)/$(arch) | ||
sitelibdir = $(sitedir)/$(ruby_version) | ||
sitearchdir = $(sitelibdir)/$(sitearch) | ||
vendorlibdir = $(vendordir)/$(ruby_version) | ||
vendorarchdir = $(vendorlibdir)/$(sitearch) | ||
|
||
CC = gcc | ||
CXX = g++ | ||
LIBRUBY = $(LIBRUBY_SO) | ||
LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a | ||
LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) | ||
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static | ||
OUTFLAG = -o | ||
COUTFLAG = -o | ||
|
||
RUBY_EXTCONF_H = | ||
cflags = $(optflags) $(debugflags) $(warnflags) | ||
optflags = -O3 | ||
debugflags = -ggdb | ||
warnflags = -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wshorten-64-to-32 -Wno-long-long | ||
CFLAGS = -fno-common $(cflags) -fno-common -pipe | ||
INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) | ||
DEFS = | ||
CPPFLAGS = -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE $(DEFS) $(cppflags) | ||
CXXFLAGS = $(CFLAGS) $(cxxflags) | ||
ldflags = -L. | ||
dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -Wl,-flat_namespace -framework Foundation | ||
ARCH_FLAG = | ||
DLDFLAGS = $(ldflags) $(dldflags) | ||
LDSHARED = $(CC) -dynamic -bundle | ||
LDSHAREDXX = $(CXX) -dynamic -bundle | ||
AR = ar | ||
EXEEXT = | ||
|
||
RUBY_BASE_NAME = ruby | ||
RUBY_INSTALL_NAME = ruby | ||
RUBY_SO_NAME = ruby.1.9.1 | ||
arch = x86_64-darwin10.4.0 | ||
sitearch = $(arch) | ||
ruby_version = 1.9.1 | ||
ruby = /Users/aitrus/.rvm/rubies/ruby-1.9.2-p0/bin/ruby | ||
RUBY = $(ruby) | ||
RM = rm -f | ||
RM_RF = $(RUBY) -run -e rm -- -rf | ||
RMDIRS = $(RUBY) -run -e rmdir -- -p | ||
MAKEDIRS = /usr/local/bin/gmkdir -p | ||
INSTALL = /usr/local/bin/ginstall -c | ||
INSTALL_PROG = $(INSTALL) -m 0755 | ||
INSTALL_DATA = $(INSTALL) -m 644 | ||
COPY = cp | ||
|
||
#### End of system configuration section. #### | ||
|
||
preload = | ||
|
||
libpath = . $(libdir) | ||
LIBPATH = -L. -L$(libdir) | ||
DEFFILE = | ||
|
||
CLEANFILES = mkmf.log | ||
DISTCLEANFILES = | ||
DISTCLEANDIRS = | ||
|
||
extout = | ||
extout_prefix = | ||
target_prefix = | ||
LOCAL_LIBS = | ||
LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lobjc | ||
SRCS = fraction.m rb_fraction.m | ||
OBJS = fraction.o rb_fraction.o | ||
TARGET = Fraction | ||
DLLIB = $(TARGET).bundle | ||
EXTSTATIC = | ||
STATIC_LIB = | ||
|
||
BINDIR = $(bindir) | ||
RUBYCOMMONDIR = $(sitedir)$(target_prefix) | ||
RUBYLIBDIR = $(sitelibdir)$(target_prefix) | ||
RUBYARCHDIR = $(sitearchdir)$(target_prefix) | ||
HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) | ||
ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) | ||
|
||
TARGET_SO = $(DLLIB) | ||
CLEANLIBS = $(TARGET).bundle | ||
CLEANOBJS = *.o *.bak | ||
|
||
all: $(DLLIB) | ||
static: $(STATIC_LIB) | ||
.PHONY: all install static install-so install-rb | ||
.PHONY: clean clean-so clean-rb | ||
|
||
clean-rb-default:: | ||
clean-rb:: | ||
clean-so:: | ||
clean: clean-so clean-rb-default clean-rb | ||
@-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) | ||
|
||
distclean-rb-default:: | ||
distclean-rb:: | ||
distclean-so:: | ||
distclean: clean distclean-so distclean-rb-default distclean-rb | ||
@-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log | ||
@-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) | ||
@-$(RMDIRS) $(DISTCLEANDIRS) | ||
|
||
realclean: distclean | ||
install: install-so install-rb | ||
|
||
install-so: $(RUBYARCHDIR) | ||
install-so: $(RUBYARCHDIR)/$(DLLIB) | ||
$(RUBYARCHDIR)/$(DLLIB): $(DLLIB) | ||
@-$(MAKEDIRS) $(@D) | ||
$(INSTALL_PROG) $(DLLIB) $(@D) | ||
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) $(COUTFLAG)$@ -c $< | ||
|
||
.cxx.o: | ||
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< | ||
|
||
.cpp.o: | ||
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< | ||
|
||
.C.o: | ||
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< | ||
|
||
.m.o: | ||
$(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< | ||
|
||
.m.o: | ||
$(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< | ||
|
||
$(DLLIB): $(OBJS) Makefile | ||
@-$(RM) $(@) | ||
$(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) | ||
|
||
|
||
|
||
$(OBJS): $(hdrdir)/ruby.h $(hdrdir)/ruby/defines.h $(arch_hdrdir)/ruby/config.h |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
# mkmf: http://ruby-doc.org/stdlib/libdoc/mkmf/rdoc/index.html | ||
require 'mkmf' | ||
|
||
# While looking at extconf.rb examples, I yoinked this... Forgetting who I snagged it from. | ||
def command(cmd) | ||
$stderr.puts "execute '#{cmd}' ..." | ||
raise(RuntimeError, cmd) unless system(cmd) | ||
$stderr.puts "execute '#{cmd}' done" | ||
end | ||
|
||
# Name your extension | ||
extension_name = 'Fraction' | ||
|
||
# Set your target name | ||
dir_config(extension_name) | ||
|
||
# Compilation Flags. Not absolutely necessary, but may save you a headache. | ||
$DLDFLAGS << " -framework Foundation" | ||
|
||
# Do the work | ||
create_makefile(extension_name) | ||
|
||
command "mv -f Makefile Makefile.bak" | ||
command "sed -e 's/^\.c\.o:$/\.m\.o:/' Makefile.bak > Makefile" | ||
command "rm Makefile.bak" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
#import <Foundation/NSObject.h> | ||
#import "ruby.h" | ||
|
||
@interface Fraction: NSObject { | ||
VALUE numerator; | ||
VALUE denominator; | ||
} | ||
|
||
-(void) setNumerator: (VALUE) _numerator; | ||
-(void) setDenominator: (VALUE) _denominator; | ||
-(VALUE) numerator; | ||
-(VALUE) denominator; | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
#import "Fraction.h" | ||
|
||
@implementation Fraction | ||
-(void) setNumerator: (VALUE) _numerator { | ||
numerator = _numerator; | ||
} | ||
|
||
-(void) setDenominator: (VALUE) _denominator { | ||
denominator = _denominator; | ||
} | ||
|
||
-(VALUE) denominator { | ||
return denominator; | ||
} | ||
|
||
-(VALUE) numerator { | ||
return numerator; | ||
} | ||
@end |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
#import <Foundation/Foundation.h> | ||
#import "fraction.h" | ||
#import "ruby.h" | ||
|
||
void Init_fraction(); | ||
VALUE rb_get_numerator(VALUE); | ||
VALUE rb_get_denominator(VALUE); | ||
VALUE rb_set_numerator(VALUE, VALUE); | ||
VALUE rb_set_denominator(VALUE, VALUE); | ||
void fraction_mark(Fraction*); | ||
void fraction_free(Fraction*); | ||
VALUE fraction_allocate(VALUE); | ||
VALUE fraction_initialize(VALUE); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
#import "rb_fraction.h" | ||
|
||
// Defining a space for information and references about the module to be stored internally | ||
VALUE rb_cFraction = Qnil; | ||
Fraction *frac; | ||
NSAutoreleasePool *pool; | ||
|
||
void Init_fraction() { | ||
frac = [[Fraction alloc] init]; | ||
rb_cFraction = rb_define_class("Fraction", rb_cObject); | ||
|
||
rb_define_method(rb_cFraction, "initialize", fraction_initialize, 0); | ||
rb_define_method(rb_cFraction, "numerator=", rb_set_numerator, 1); | ||
rb_define_method(rb_cFraction, "numerator", rb_get_numerator, 0); | ||
rb_define_method(rb_cFraction, "denominator", rb_get_denominator, 0); | ||
rb_define_method(rb_cFraction, "denominator=", rb_set_denominator, 1); | ||
} | ||
|
||
VALUE rb_get_numerator(VALUE self) { | ||
return [frac numerator]; | ||
} | ||
|
||
VALUE rb_get_denominator(VALUE self) { | ||
return [frac denominator]; | ||
} | ||
|
||
VALUE rb_set_numerator(VALUE self, VALUE numerator) { | ||
if(frac) { | ||
[frac setNumerator:numerator]; | ||
return [frac numerator]; | ||
} | ||
return Qnil; | ||
} | ||
|
||
VALUE rb_set_denominator(VALUE self, VALUE denominator) { | ||
if(frac) { | ||
[frac setDenominator:denominator]; | ||
return [frac denominator]; | ||
} | ||
return Qnil; | ||
} | ||
|
||
void fraction_mark(Fraction *fraction) { | ||
rb_gc_mark([fraction numerator]); | ||
rb_gc_mark([fraction denominator]); | ||
} | ||
|
||
void fraction_free(Fraction *fraction) { | ||
[fraction release]; | ||
} | ||
|
||
VALUE fraction_allocate(VALUE klass) { | ||
Fraction *fraction = [[Fraction alloc] init]; | ||
|
||
[fraction setDenominator:Qnil]; | ||
[fraction setNumerator:Qnil]; | ||
|
||
return Data_Wrap_Struct(klass, fraction_mark, fraction_free, fraction); | ||
} | ||
|
||
VALUE fraction_initialize(VALUE self) { | ||
Fraction *fraction; | ||
// Can't use Data_Get_Struct, but it's 'coo. | ||
// Data_Get_Struct(self, Fraction, fraction); | ||
fraction = (Fraction*)DATA_PTR(self); | ||
return self; | ||
} | ||
|
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
puts %Q{requiring... ./fraction} | ||
puts require './fraction' | ||
|
||
puts %Q{including... Fraction} | ||
puts a = Fraction.new | ||
|
||
puts "a.numerator = 23" | ||
puts "=> #{a.numerator = 23}" | ||
|
||
puts "a.denominator = 32" | ||
puts "=> #{a.denominator = 32}" | ||
|