[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: [PATCH] Add native ruby binding to Subversion distribution

From: Yoshiki Hayashi <yoshiki_at_xemacs.org>
Date: 2001-10-29 15:41:17 CET

Here's the new version of build system patch. The basic
idea is the same as my previous patch so the explanation is
included mostly as is. Please read bindings/ruby/native as
bindings/ruby.

I asked about LDFLAG kludge to Greg Stein on IRC but today
IRC server is flaky and couldn't ask the question I wanted
to ask. This patch adds -lpthread to LDFLAG if APR is
compiled with pthread. The problem is, if you load Svn.so
linked without -lpthread option, Ruby interpreter cannot
find libpthread and stop execution saying missing symbol or
something.

Greg said -lpthread should be picked up by APR and I thought
so but it is not. The problem is the way APR checks CFLAGS
to gcc and LDFLAGS. First, APR tries to add one of
following CFLAGS will be necessary to build pthread support.
-kthread -pthread -pthreads -mthreads -Kthread -threads -mt

Second, it tries to add -lpthread -lpthreads -lc_r to
LDFLAGS if first step failed.

Here's how it works on my system (Debian unstable):

1. APR picks up -pthread as CFLAGS. It allows you to
   compile and link pthread programs.

2. If I enable second check regardless of the result of
   first check, -lpthread will not be added to LDFLAGS
   because -pthread CFLAGS is all you need.

3. If I reverse the order of CFLAGS and LDFLAGS checking,
   APR correctly picks up -lpthread and Ruby binding are
   happy without LDFLAGS kludge.

It looks like I should post patch to dev@apr to do #3. I
don't know if it will bring any portability problem but APR
people can probably figure it out. Anyway, I must go now.
The time of the last train is approaching. ;-)

Yoshiki Hayashi <yoshiki@xemacs.org> writes:

> Here's a patch to build native Ruby binding inside
> Subversion distribution. All you have to do is:

> 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 Mon Oct 29 20:13:52 2001
+++ ./Makefile.in Mon Oct 29 21:08:56 2001
@@ -53,18 +53,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)
@@ -74,8 +79,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: ./gen-make.py
===================================================================
--- ./.svn/text-base/gen-make.py Mon Oct 8 17:55:01 2001
+++ ./gen-make.py Mon Oct 29 21:09:19 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 29 20:13:52 2001
+++ ./build.conf Mon Oct 29 21:10: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
+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 Mon Oct 29 20:14:01 2001
+++ ./configure.in Mon Oct 29 21:11:57 2001
@@ -31,6 +31,7 @@
 sinclude(ac-helpers/svn-macros.m4)
 sinclude(ac-helpers/neon.m4)
 sinclude(ac-helpers/apr.m4)
+sinclude(ac-helpers/svn-ruby.m4)
 
 dnl Grab the libtool macros
 sinclude(ac-helpers/libtool.m4)
@@ -95,6 +96,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
 
 NEON_WANTED=0.17.2
@@ -103,6 +105,12 @@
 dnl find Apache
 SVN_FIND_APACHE
 
+dnl find Ruby
+
+SVN_FIND_RUBY
+
+AC_SUBST(LDFLAGS)
+
 dnl Check for libraries --------------------
 
 dnl AC_CHECK_LIB() calls go here, if we ever need any
@@ -119,8 +127,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_ERROR(Unable to find ruby interpreter)
  fi
  if test "$enable_shared" = "no"; then
    AC_MSG_ERROR(Ruby binding requires shared library)
  fi
  AC_MSG_CHECKING(for Ruby header)
  ruby_header="`$RUBY ${abs_srcdir}/ac-helpers/rb-config.rb include`"
  if test "$ruby_header" = ""; then
    AC_MSG_ERROR([no - Unable to locate ruby.h])
  else
    AC_MSG_RESULT($ruby_header)
    RUBY_INCLUDES="-I$ruby_header"
    /* ### Kludge to avoid linking error with pthread. */
    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
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:46 2006

This is an archived mail posted to the Subversion Dev mailing list.