Here's a patch to build native Ruby binding inside
Subversion distribution. All you have to do is:
1. unpack svn-ruby-0.2.tar.gz from
http://www.sodan.org/~penny/tmp/svn-ruby-0.2.tar.gz to
subversion/bindings/ruby and rename svn-ruby-0.2 to
native.
2. Apply following patch.
3. Add attached rb-config.rb and svn-ruby.m4 files to
ac-helpers directory.
The default is not to build Ruby binding so you need to add
--enable-ruby-binding to configure. The reason is I'm not
sure it can be built on every system. I can only test it on
Debian unstable. However, it would be very nice if it can
be added to Subversion distribution and people can test it
so that I can shake out some bugs. I expect the default to
be --enable-ruby-binding in the future.
It installs Svn.la to
/usr/local/lib/site_ruby/1.6/i386-linux on my machine.
Probably Debian package or other package on FHS compliant
system doesn't like it but I decided to ignore it at this
point.
What this patch does is to add dso type to gen-make.py and
build.conf. The main purpose is to add new link rule and to
be able to add more targets which creates Svn.la. The name
of dso rule consists of language name and .la name
concatenated with underscore like Ruby_Svn. This allows you
to add Python_Svn to create another Svn.la at the later time.
There's one problem with this patch, though. It adds hack
in SVN_FIND_RUBY to add -lpthread to LDFLAGS if -pthread is
present in CFLAGS. You can link without -lpthread but if
you try to load the Svn.so from Ruby interpreter, it barfs
on error that it cannot find libpthread.so. If
ruby/native/Svn.so is linked with -lpthread, it will be
loaded successfully. I don't know the correct answer to
this problem. I thought APR should add -lpthread but the
magical undocumented -pthread flag of GCC allows you to
compile and link C programs without problem. The linking
problem only occurs when a library linked with thread
enabled APR is dlopened by the program not linked with
pthread. Any ideas?
I appreciate any feedback.
ChangeLog and patch are attached below.
Makefile.in
(RUBY_INCLUDES, ruby_moddir): New var.
(LDFLAGS): Now the value is determined by configure.
(COMPILE_RUBY_MOD, MODULE): New var.
(INSTAL_RUBY_MOD, RUBY): New var.
gen-make.py
* Use $(MODULE) to link when target type is dso.
* Add new 'ruby-mod' custom rule to compile Ruby module.
* Add new target type dso. It is similar to lib but has
different target name convention and link command.
build.conf
* New target Ruby_Svn.
configure.in
* Include new helper macro from svn-ruby.m4
* Call AC_LIBTOOL_DLOPEN to check whether the system
supports dlopen.
* Call SVN_FIND_RUBY to determine if it can/should build
Ruby binding.
* (BUILD_RULES, INSTALL_RULES): Add Ruby rule when
Berkeley DB is present. Fs binding depends on it.
svn-ruby.m4
New file.
(SVN_FIND_RUBY): New function. If --enable-ruby-binding is
given and correct inperter is found, add rules to build
and install Ruby binding.
rb-config.m4
New file.
Return the location of header file or install directory
depending on the command line argument.
Index: ./Makefile.in
===================================================================
--- ./.svn/text-base/Makefile.in Wed Oct 10 19:55:16 2001
+++ ./Makefile.in Fri Oct 19 09:55:58 2001
@@ -51,18 +51,23 @@
APACHE_INCLUDES = @APACHE_INCLUDES@
APACHE_TARGET = @APACHE_TARGET@
+RUBY_INCLUDES = @RUBY_INCLUDES@
+ruby_moddir = @ruby_moddir@
+
MKDIR = @MKDIR@
CFLAGS = @CFLAGS@
CPPFLAGS = @CPPFLAGS@
-LDFLAGS =
+LDFLAGS = @LDFLAGS@
COMPILE = $(CC) $(CPPFLAGS) $(CFLAGS) $(INCLUDES)
LT_COMPILE = $(LIBTOOL) $(LTFLAGS) --mode=compile $(COMPILE) -o $@ -c $<
COMPILE_APACHE_MOD = $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) $(CFLAGS) $(APACHE_INCLUDES) $(INCLUDES) -o $@ -c $<
+COMPILE_RUBY_MOD = $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) $(CFLAGS) $(RUBY_INCLUDES) $(INCLUDES) -o $@ -c $<
LINK = $(LIBTOOL) $(LTFLAGS) --mode=link $(LT_LDFLAGS) $(COMPILE) $(LDFLAGS) -rpath $(libdir)
+MODULE = $(LIBTOOL) $(LTFLAGS) $(LT_LDFLAGS) $(COMPILE) -module -avoid-version $(LDFLAGS) -rpath $(libdir)
INSTALL = @INSTALL@
INSTALL_LIB = $(LIBTOOL) --mode=install $(INSTALL)
@@ -72,8 +77,10 @@
INSTALL_INCLUDE = $(INSTALL) -m 644
INSTALL_MOD_SHARED = @APXS@ -i -a
INSTALL_MOD_STATIC = $(INSTALL) -m 644
+INSTALL_RUBY_MOD = $(INSTALL_LIB)
PYTHON = @PYTHON@
+RUBY = @RUBY@
all: external-all local-all
clean: external-clean local-clean
Index: ./ac-helpers/svn-ruby.m4
===================================================================
Index: ./ac-helpers/rb-config.rb
===================================================================
Index: ./gen-make.py
===================================================================
--- ./.svn/text-base/gen-make.py Mon Oct 8 17:55:01 2001
+++ ./gen-make.py Thu Oct 18 21:45:14 2001
@@ -115,6 +115,11 @@
# something we don't know, so just include it directly
libs.append(lib)
+ if parser.get(target, 'type') == 'dso':
+ link = '$(MODULE)'
+ else:
+ link = '$(LINK)'
+
targ_varname = string.replace(target, '-', '_')
ldflags = parser.get(target, 'link-flags')
add_deps = parser.get(target, 'add-deps')
@@ -122,11 +127,11 @@
ofile.write('%s_DEPS = %s %s\n'
'%s_OBJECTS = %s\n'
'%s: $(%s_DEPS)\n'
- '\tcd %s && $(LINK) -o %s %s $(%s_OBJECTS) %s $(LIBS)\n\n'
+ '\tcd %s && %s -o %s %s $(%s_OBJECTS) %s $(LIBS)\n\n'
% (targ_varname, string.join(objects + deps), add_deps,
targ_varname, objnames,
tpath, targ_varname,
- path, tfile, ldflags, targ_varname, string.join(libs)))
+ path, link, tfile, ldflags, targ_varname, string.join(libs)))
custom = parser.get(target, 'custom')
if custom == 'apache-mod':
@@ -137,6 +142,14 @@
ofile.write('%s%s: %s\n\t$(COMPILE_APACHE_MOD)\n'
% (src[:-2], objext, src))
ofile.write('\n')
+ elif custom == 'ruby-mod':
+ # special build, needing Ruby includes
+ ofile.write('# build these special -- use RUBY_INCLUDES\n')
+ for src in sources:
+ if src[-2:] == '.c':
+ ofile.write('%s%s: %s\n\t$(COMPILE_RUBY_MOD)\n'
+ % (src[:-2], objext, src))
+ ofile.write('\n')
for g_name, g_targets in install.items():
target_names = [ ]
@@ -303,6 +316,10 @@
install = 'lib'
elif type == 'doc':
pass
+ elif type == 'dso':
+ ignore, tname = string.split(name, '_')
+ tfile = tname + '.la'
+ self.objext = '.lo'
else:
raise GenMakeError('ERROR: unknown build type: ' + type)
@@ -325,6 +342,7 @@
_default_sources = {
'lib' : '*.c',
'exe' : '*.c',
+ 'dso' : '*.c',
'doc' : '*.texi',
}
Index: ./build.conf
===================================================================
--- ./.svn/text-base/build.conf Mon Oct 8 17:55:03 2001
+++ ./build.conf Thu Oct 18 21:45:56 2001
@@ -145,6 +145,14 @@
# there are some .c files included by others, so *.c isn't appropriate
sources = hashtable.c xmlparse.c xmlrole.c xmltok.c
+[Ruby_Svn]
+type = dso
+path = subversion/bindings/ruby/native
+libs = libsvn_client libsvn_wc libsvn_ra libsvn_repos libsvn_fs
+ libsvn_delta libsvn_subr $(SVN_APR_LIBS)
+custom = ruby-mod
+install = ruby-mod
+
# ----------------------------------------------------------------------------
#
# TESTING TARGETS
Index: ./configure.in
===================================================================
--- ./.svn/text-base/configure.in Fri Oct 12 14:45:57 2001
+++ ./configure.in Fri Oct 19 10:10:11 2001
@@ -25,6 +25,7 @@
sinclude(ac-helpers/berkeley-db.m4)
sinclude(ac-helpers/svn-apache.m4)
sinclude(ac-helpers/svn-macros.m4)
+sinclude(ac-helpers/svn-ruby.m4)
dnl Grab the libtool macros
sinclude(ac-helpers/libtool.m4)
@@ -109,6 +110,7 @@
dnl Check for libtool -- we'll definitely need it for all our shared libs!
echo "configuring libtool now"
+AC_LIBTOOL_DLOPEN
AC_PROG_LIBTOOL
dnl Configure neon --------------------------
@@ -143,6 +145,12 @@
dnl find Apache
SVN_FIND_APACHE
+dnl find Ruby
+
+SVN_FIND_RUBY
+
+AC_SUBST(LDFLAGS)
+
dnl ### should we ever bother with the system install?
dnl use abs_srcdir. sometimes during installation, libtool will relink the
dnl library. when it does this, it does a "cd", so a relative use of
@@ -169,8 +177,8 @@
INSTALL_RULES="install-lib install-bin install-include"
BUILD_RULES="lib bin test"
if test "$svn_lib_berkeley_db" = "yes"; then
- BUILD_RULES="lib fs-lib bin fs-bin $BUILD_APACHE_RULE test fs-test"
- INSTALL_RULES="install-lib install-fs-lib install-bin install-fs-bin $INSTALL_APACHE_RULE install-include"
+ BUILD_RULES="lib fs-lib bin fs-bin $BUILD_APACHE_RULE $BUILD_RUBY_RULE test fs-test"
+ INSTALL_RULES="install-lib install-fs-lib install-bin install-fs-bin $INSTALL_APACHE_RULE $INSTALL_RUBY_RULE install-include"
FS_TEST_DEPS="\$(FS_TEST_DEPS)"
FS_TEST_PROGRAMS="\$(FS_TEST_PROGRAMS)"
fi
AC_DEFUN(SVN_FIND_RUBY,[
AC_ARG_ENABLE(ruby-binding,
[ --enable-ruby-binding Turn on native Ruby binding support],
[
if test "$enableval" = "yes"; then
ruby_binding="yes"
fi
])
AC_PATH_PROG(RUBY, ruby)
if test "$ruby_binding" = "yes"; then
if test "$RUBY" = ""; then
AC_MSG_WARN(Ruby interpreter not found. Native Ruby binding will not be compiled)
else
AC_MSG_CHECKING(for Ruby header)
ruby_header="`ruby ${abs_srcdir}/ac-helpers/rb-config.rb include`"
if test "$ruby_header" = ""; then
AC_MSG_RESULT(no)
AC_MSG_WARN([ruby.h not found. Native Ruby binding will not be compiled])
else
AC_MSG_RESULT($ruby_header)
RUBY_INCLUDES="-I$ruby_header"
case "$EXTRA_CFLAGS" in
*-pthread*)
LDFLAGS="$LDFLAGS -lpthread"
;;
esac
BUILD_RUBY_RULE=ruby-mod
INSTALL_RUBY_RULE=install-ruby-mod
ruby_moddir="`ruby ${abs_srcdir}/ac-helpers/rb-config.rb site-install`"
fi
fi
fi
AC_SUBST(RUBY_INCLUDES)
AC_SUBST(BUILD_RUBY_RULE)
AC_SUBST(INSTALL_RUBY_RULE)
AC_SUBST(ruby_moddir)
])
begin
require 'rbconfig'
rescue LoadError
exit 1
end
command = ARGV.shift
if command == 'include' then
if File.exists?(File.join(Config::CONFIG['archdir'], 'ruby.h')) then
print Config::CONFIG['archdir']
end
elsif command == 'site-install' then
print Config::CONFIG['sitearchdir']
end
--
Yoshiki Hayashi
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sat Oct 21 14:36:45 2006