Supports static linking of extensions and encodings again.

Fixes --with-static-linked-ext.

Patch by Google Inc. [ruby-core:45073].

* Makefile.in (ENCOBJS, EXTOBJS): New variables to specify static
  linked libraries. Also reintroduces extinit.o, introduces encinit.o
  introduces encinit.o

* common.mk: Builds static libraries rather than shared objects if
  specified.

* configure.in (LD): new substitution. 
  Avoids PIE if s

* enc/depend: Supports static linked libraries
  (libencs, libenc, libtrans): New target.

* enc/encinit.c.erb: new template to generate the initialization of
  statically linked encodings.

* enc/make_encmake.rb (--module): new flag to specify whether static
  or dynamic.

* transcode_data.h (TRANS_INIT): New macro to get rid of the name
  collision of encoding initializers and transcoder initializers.

* ext/extmk.rb: Fixes the behavior on $extstatic is true.

* lib/mkmf.rb (clean-static): new target to clean up static linked
  libraries.

* ruby.c (process_options): New initializes statically linked
  encodings here.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35662 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
yugui 2012-05-16 05:39:06 +00:00
parent 0923ae5ed1
commit 3fa3f9abb9
31 changed files with 306 additions and 129 deletions

View File

@ -1,3 +1,39 @@
Wed May 16 14:19:51 2012 Yuki Yugui Sonoda <yugui@google.com>
Supports static linking of extensions and encodings again.
Fixes --with-static-linked-ext.
Patch by Google Inc. [ruby-core:45073].
* Makefile.in (ENCOBJS, EXTOBJS): New variables to specify static
linked libraries. Also reintroduces extinit.o, introduces encinit.o
introduces encinit.o
* common.mk: Builds static libraries rather than shared objects if
specified.
* configure.in (LD): new substitution.
* enc/depend: Supports static linked libraries
(libencs, libenc, libtrans): New target.
* enc/encinit.c.erb: new template to generate the initialization of
statically linked encodings.
* enc/make_encmake.rb (--module): new flag to specify whether static
or dynamic.
* transcode_data.h (TRANS_INIT): New macro to get rid of the name
collision of encoding initializers and transcoder initializers.
* ext/extmk.rb: Fixes the behavior on $extstatic is true.
* lib/mkmf.rb (clean-static): new target to clean up static linked
libraries.
* ruby.c (process_options): New initializes statically linked
encodings here.
Wed May 16 14:30:43 2012 NAKAMURA Usaku <usa@ruby-lang.org> Wed May 16 14:30:43 2012 NAKAMURA Usaku <usa@ruby-lang.org>
* io.c: fixed a merge mistake of r33878, reported by nobu via IRC. * io.c: fixed a merge mistake of r33878, reported by nobu via IRC.

View File

@ -16,6 +16,7 @@ PLATFORM_DIR = @PLATFORM_DIR@
CC = @CC@ CC = @CC@
CPP = @CPP@ CPP = @CPP@
LD = @LD@
YACC = bison YACC = bison
PURIFY = PURIFY =
AUTOCONF = autoconf AUTOCONF = autoconf
@ -70,6 +71,8 @@ DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(XLDFLAGS) $(ARCH_FLAG)
SOLIBS = @SOLIBS@ SOLIBS = @SOLIBS@
MAINLIBS = @MAINLIBS@ MAINLIBS = @MAINLIBS@
ARCHMINIOBJS = @MINIOBJS@ ARCHMINIOBJS = @MINIOBJS@
ENCOBJS = @ENCOBJS@
EXTOBJS = @EXTOBJS@
BUILTIN_ENCOBJS = @BUILTIN_ENCOBJS@ BUILTIN_ENCOBJS = @BUILTIN_ENCOBJS@
BUILTIN_TRANSSRCS = @BUILTIN_TRANSSRCS@ BUILTIN_TRANSSRCS = @BUILTIN_TRANSSRCS@
BUILTIN_TRANSOBJS = @BUILTIN_TRANSOBJS@ BUILTIN_TRANSOBJS = @BUILTIN_TRANSOBJS@
@ -175,7 +178,7 @@ miniruby$(EXEEXT):
$(PROGRAM): $(PROGRAM):
@$(RM) $@ @$(RM) $@
$(ECHO) linking $@ $(ECHO) linking $@
$(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINLIBS) $(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(LIBS) $(OUTFLAG)$@ $(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINLIBS) $(MAINOBJ) $(EXTOBJS) $(ENCOBJS) $(LIBRUBYARG) $(LIBS) $(EXTLIBS) $(OUTFLAG)$@
$(Q) $(POSTLINK) $(Q) $(POSTLINK)
# We must `rm' the library each time this rule is invoked because "updating" a # We must `rm' the library each time this rule is invoked because "updating" a
@ -186,8 +189,9 @@ $(LIBRUBY_A):
$(ECHO) linking static-library $@ $(ECHO) linking static-library $@
$(Q) $(AR) $(ARFLAGS) $@ $(OBJS) $(DMYEXT) $(Q) $(AR) $(ARFLAGS) $@ $(OBJS) $(DMYEXT)
@-$(RANLIB) $@ 2> /dev/null || true @-$(RANLIB) $@ 2> /dev/null || true
$(ECHO) verifying static-library $@
@$(PURIFY) $(CC) $(XLDFLAGS) $(MAINOBJ) $(LIBRUBY_A) $(MAINLIBS) $(EXTLIBS) $(LIBS) $(OUTFLAG)conftest$(EXEEXT) $(LDFLAGS) @$(PURIFY) $(CC) $(XLDFLAGS) $(MAINOBJ) $(LIBRUBY_A) $(MAINLIBS) $(EXTLIBS) $(LIBS) $(OUTFLAG)conftest$(EXEEXT) $(LDFLAGS)
@$(RM) conftest$(EXEEXT) @$(RM) conftset$(EXEEXT) conftest.c
$(LIBRUBY_SO): $(LIBRUBY_SO):
@-$(PRE_LIBRUBY_UPDATE) @-$(PRE_LIBRUBY_UPDATE)
@ -311,7 +315,8 @@ enc/unicode/name2ctype.h: enc/unicode/name2ctype.kwd
$(Q) $(CPP) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -E $< > $@ $(Q) $(CPP) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -E $< > $@
clean-local:: clean-local::
$(Q)$(RM) ext/extinit.c ext/extinit.$(OBJEXT) ext/ripper/y.output $(Q)$(RM) ext/extinit.c ext/extinit.$(OBJEXT) ext/ripper/y.output \
enc/encinit.c enc/encinit.$(OBJEXT)
-$(Q)$(RM) $(pkgconfig_DATA) -$(Q)$(RM) $(pkgconfig_DATA)
distclean-local:: distclean-local::
@ -335,8 +340,10 @@ clean-ext distclean-ext realclean-ext::
$(RMDIRS) "ext/$$dir" 2> /dev/null || true;; \ $(RMDIRS) "ext/$$dir" 2> /dev/null || true;; \
esac; \ esac; \
done done
-$(Q)$(RM) ext/extinit.$(OBJEXT)
distclean-ext realclean-ext:: distclean-ext realclean-ext::
-$(Q)$(RM) ext/extinit.c
-$(Q)$(RMDIR) ext 2> /dev/null || true -$(Q)$(RMDIR) ext 2> /dev/null || true
clean-extout: clean-extout:
@ -362,6 +369,8 @@ ext/extinit.$(OBJEXT): ext/extinit.c $(SETUP)
$(ECHO) compiling $@ $(ECHO) compiling $@
$(Q) $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -c ext/extinit.c $(Q) $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -c ext/extinit.c
enc/encinit.$(OBJEXT): enc/encinit.c $(SETUP)
up:: up::
@$(CHDIR) "$(srcdir)" && LC_TIME=C exec $(VCSUP) @$(CHDIR) "$(srcdir)" && LC_TIME=C exec $(VCSUP)

View File

@ -32,7 +32,6 @@ ID_H_TARGET = -id.h-
DMYEXT = dmyext.$(OBJEXT) DMYEXT = dmyext.$(OBJEXT)
NORMALMAINOBJ = main.$(OBJEXT) NORMALMAINOBJ = main.$(OBJEXT)
MAINOBJ = $(NORMALMAINOBJ) MAINOBJ = $(NORMALMAINOBJ)
EXTOBJS =
DLDOBJS = $(DMYEXT) DLDOBJS = $(DMYEXT)
MINIOBJS = $(ARCHMINIOBJS) dmyencoding.$(OBJEXT) dmyversion.$(OBJEXT) miniprelude.$(OBJEXT) MINIOBJS = $(ARCHMINIOBJS) dmyencoding.$(OBJEXT) dmyversion.$(OBJEXT) miniprelude.$(OBJEXT)
ENC_MK = enc.mk ENC_MK = enc.mk
@ -141,7 +140,7 @@ COMPILE_PRELUDE = $(MINIRUBY) -I$(srcdir) $(srcdir)/tool/compile_prelude.rb
all: showflags main docs all: showflags main docs
main: showflags encs exts main: showflags $(EXTSTATIC:static=lib)encs exts
@$(NULLCMD) @$(NULLCMD)
.PHONY: showflags .PHONY: showflags
@ -168,12 +167,13 @@ exts: build-ext
EXTS_MK = exts.mk EXTS_MK = exts.mk
$(EXTS_MK): $(MKFILES) incs $(PREP) $(RBCONFIG) $(LIBRUBY) $(EXTS_MK): $(MKFILES) incs $(PREP) $(RBCONFIG) $(LIBRUBY)
$(ECHO) generating makefile $@
$(Q)$(MINIRUBY) $(srcdir)/ext/extmk.rb --make="$(MAKE)" --command-output=$(EXTS_MK) $(EXTMK_ARGS) configure $(Q)$(MINIRUBY) $(srcdir)/ext/extmk.rb --make="$(MAKE)" --command-output=$(EXTS_MK) $(EXTMK_ARGS) configure
configure-ext: $(EXTS_MK) configure-ext: $(EXTS_MK)
build-ext: $(EXTS_MK) build-ext: $(EXTS_MK)
$(Q)$(MAKE) -f $(EXTS_MK) $(MFLAGS) $(Q)$(MAKE) -f $(EXTS_MK) $(MFLAGS) $(EXTSTATIC)
$(MKMAIN_CMD): $(MKFILES) incs $(PREP) $(RBCONFIG) $(LIBRUBY) $(MKMAIN_CMD): $(MKFILES) incs $(PREP) $(RBCONFIG) $(LIBRUBY)
$(Q)$(MINIRUBY) $(srcdir)/ext/extmk.rb --make="$(MAKE)" --command-output=$@ $(EXTMK_ARGS) $(Q)$(MINIRUBY) $(srcdir)/ext/extmk.rb --make="$(MAKE)" --command-output=$@ $(EXTMK_ARGS)
@ -206,7 +206,7 @@ Doxyfile: $(srcdir)/template/Doxyfile.tmpl $(PREP) $(srcdir)/tool/generic_erb.rb
program: showflags $(PROGRAM) program: showflags $(PROGRAM)
wprogram: showflags $(WPROGRAM) wprogram: showflags $(WPROGRAM)
$(PROGRAM): $(LIBRUBY) $(MAINOBJ) $(OBJS) $(EXTOBJS) $(SETUP) $(PREP) $(PROGRAM): $(LIBRUBY) $(MAINOBJ) $(OBJS) $(EXTOBJS) $(ENCOBJS) $(SETUP) $(PREP)
$(LIBRUBY_A): $(OBJS) $(MAINOBJ) $(DMYEXT) $(ARCHFILE) $(LIBRUBY_A): $(OBJS) $(MAINOBJ) $(DMYEXT) $(ARCHFILE)
@ -519,17 +519,21 @@ test-rubyspec: test-rubyspec-precheck
$(RUNRUBY) $(srcdir)/spec/mspec/bin/mspec run -B $(srcdir)/spec/default.mspec $(MSPECOPT) $(RUNRUBY) $(srcdir)/spec/mspec/bin/mspec run -B $(srcdir)/spec/default.mspec $(MSPECOPT)
encs: enc trans encs: enc trans
encs enc trans: showflags $(ENC_MK) $(LIBRUBY) $(PREP) libencs: libenc libtrans
encs enc trans libencs libenc libtrans: showflags $(ENC_MK) $(LIBRUBY) $(PREP)
$(ECHO) making $@ $(ECHO) making $@
$(Q) $(MAKE) -f $(ENC_MK) RUBY="$(MINIRUBY)" MINIRUBY="$(MINIRUBY)" $(MFLAGS) $@ $(Q) $(MAKE) -f $(ENC_MK) V="$(V)" \
RUBY="$(MINIRUBY)" MINIRUBY="$(MINIRUBY)" \
$(MFLAGS) $@
enc: {$(VPATH)}encdb.h
trans: {$(VPATH)}transdb.h libenc enc: {$(VPATH)}encdb.h
libtrans trans: {$(VPATH)}transdb.h
$(ENC_MK): $(srcdir)/enc/make_encmake.rb $(srcdir)/enc/Makefile.in $(srcdir)/enc/depend \ $(ENC_MK): $(srcdir)/enc/make_encmake.rb $(srcdir)/enc/Makefile.in $(srcdir)/enc/depend \
$(srcdir)/lib/mkmf.rb $(RBCONFIG) $(srcdir)/enc/encinit.c.erb $(srcdir)/lib/mkmf.rb $(RBCONFIG)
$(ECHO) generating $@ $(ECHO) generating $@
$(Q) $(MINIRUBY) $(srcdir)/enc/make_encmake.rb --builtin-encs="$(BUILTIN_ENCOBJS)" --builtin-transes="$(BUILTIN_TRANSOBJS)" $@ $(ENCS) $(Q) $(MINIRUBY) $(srcdir)/enc/make_encmake.rb --builtin-encs="$(BUILTIN_ENCOBJS)" --builtin-transes="$(BUILTIN_TRANSOBJS)" --module$(EXTSTATIC) $@ $(ENCS)
.PRECIOUS: $(MKFILES) .PRECIOUS: $(MKFILES)
@ -833,6 +837,8 @@ transdb.h: $(PREP) srcs-enc $(srcdir)/tool/generic_erb.rb $(srcdir)/template/tra
$(ECHO) generating $@ $(ECHO) generating $@
$(Q) $(MINIRUBY) $(srcdir)/tool/generic_erb.rb -c -o $@ $(srcdir)/template/transdb.h.tmpl $(srcdir)/enc/trans enc/trans $(Q) $(MINIRUBY) $(srcdir)/tool/generic_erb.rb -c -o $@ $(srcdir)/template/transdb.h.tmpl $(srcdir)/enc/trans enc/trans
enc/encinit.c: $(ENC_MK) $(srcdir)/enc/encinit.c.erb
known_errors.inc: $(srcdir)/template/known_errors.inc.tmpl $(srcdir)/defs/known_errors.def known_errors.inc: $(srcdir)/template/known_errors.inc.tmpl $(srcdir)/defs/known_errors.def
$(ECHO) generating $@ $(ECHO) generating $@
$(Q) $(BASERUBY) $(srcdir)/tool/generic_erb.rb -c -o $@ $(srcdir)/template/known_errors.inc.tmpl $(srcdir)/defs/known_errors.def $(Q) $(BASERUBY) $(srcdir)/tool/generic_erb.rb -c -o $@ $(srcdir)/template/known_errors.inc.tmpl $(srcdir)/defs/known_errors.def

View File

@ -291,6 +291,8 @@ AC_PROG_CC
AC_PROG_CXX AC_PROG_CXX
AC_PROG_GCC_TRADITIONAL AC_PROG_GCC_TRADITIONAL
AC_SUBST(GCC) AC_SUBST(GCC)
AC_CHECK_TOOL([LD], [ld], [ld])
AC_SUBST(LD)
if test "$GCC" = yes; then if test "$GCC" = yes; then
linker_flag=-Wl, linker_flag=-Wl,
: ${optflags=-O3} : ${optflags=-O3}
@ -2095,7 +2097,7 @@ if test "$with_dln_a_out" != yes; then
AS_CASE(["$target_os"], AS_CASE(["$target_os"],
[hpux*], [ DLDFLAGS="$DLDFLAGS -E" [hpux*], [ DLDFLAGS="$DLDFLAGS -E"
: ${LDSHARED='ld -b'} : ${LDSHARED="$(LD) -b"}
XLDFLAGS="$XLDFLAGS -Wl,-E" XLDFLAGS="$XLDFLAGS -Wl,-E"
: ${LIBPATHENV=SHLIB_PATH} : ${LIBPATHENV=SHLIB_PATH}
if test "$rb_cv_prog_gnu_ld" = no; then if test "$rb_cv_prog_gnu_ld" = no; then
@ -2114,17 +2116,17 @@ if test "$with_dln_a_out" != yes; then
: ${LIBPATHENV=LD_LIBRARY_PATH_64} : ${LIBPATHENV=LD_LIBRARY_PATH_64}
fi fi
rb_cv_dlopen=yes], rb_cv_dlopen=yes],
[sunos*], [ : ${LDSHARED='ld -assert nodefinitions'} [sunos*], [ : ${LDSHARED="$(LD) -assert nodefinitions"}
rb_cv_dlopen=yes], rb_cv_dlopen=yes],
[irix*], [ : ${LDSHARED='ld -shared'} [irix*], [ : ${LDSHARED="$(LD) -shared"}
rb_cv_dlopen=yes], rb_cv_dlopen=yes],
[sysv4*], [ : ${LDSHARED='ld -G'} [sysv4*], [ : ${LDSHARED="$(LD) -G"}
rb_cv_dlopen=yes], rb_cv_dlopen=yes],
[nto-qnx*], [ : ${LDSHARED='$(CC) -shared'} [nto-qnx*], [ : ${LDSHARED='$(CC) -shared'}
rb_cv_dlopen=yes], rb_cv_dlopen=yes],
[esix*|uxpds*], [ : ${LDSHARED="ld -G"} [esix*|uxpds*], [ : ${LDSHARED="$(LD) -G"}
rb_cv_dlopen=yes], rb_cv_dlopen=yes],
[osf*], [ : ${LDSHARED="ld -shared -expect_unresolved \"*\""} [osf*], [ : ${LDSHARED="$(LD) -shared -expect_unresolved \"*\""}
rb_cv_dlopen=yes], rb_cv_dlopen=yes],
[bsdi3*], [ AS_CASE(["$CC"], [bsdi3*], [ AS_CASE(["$CC"],
[*shlicc*], [ : ${LDSHARED='$(CC) -r'} [*shlicc*], [ : ${LDSHARED='$(CC) -r'}
@ -2145,7 +2147,7 @@ if test "$with_dln_a_out" != yes; then
LDFLAGS="$LDFLAGS -rdynamic" LDFLAGS="$LDFLAGS -rdynamic"
DLDFLAGS="$DLDFLAGS "'-Wl,-soname,$(.TARGET)' DLDFLAGS="$DLDFLAGS "'-Wl,-soname,$(.TARGET)'
else else
test "$GCC" = yes && test "$rb_cv_prog_gnu_ld" = yes || LDSHARED="ld -Bshareable" test "$GCC" = yes && test "$rb_cv_prog_gnu_ld" = yes || LDSHARED="$(LD) -Bshareable"
fi fi
rb_cv_dlopen=yes], rb_cv_dlopen=yes],
[openbsd*], [ : ${LDSHARED='$(CC) -shared ${CCDLFLAGS}'} [openbsd*], [ : ${LDSHARED='$(CC) -shared ${CCDLFLAGS}'}
@ -2179,12 +2181,12 @@ if test "$with_dln_a_out" != yes; then
rb_cv_dlopen=yes], rb_cv_dlopen=yes],
[beos*], [ AS_CASE(["$target_cpu"], [beos*], [ AS_CASE(["$target_cpu"],
[powerpc*], [ [powerpc*], [
: ${LDSHARED="ld -xms"} : ${LDSHARED="$(LD) -xms"}
DLDFLAGS="$DLDFLAGS "'-export Init_$(TARGET) -lbe -lroot glue-noinit.a init_term_dyn.o start_dyn.o' DLDFLAGS="$DLDFLAGS "'-export Init_$(TARGET) -lbe -lroot glue-noinit.a init_term_dyn.o start_dyn.o'
LDFLAGS="$LDFLAGS -L/boot/home/config/lib -lbe -lroot" LDFLAGS="$LDFLAGS -L/boot/home/config/lib -lbe -lroot"
], ],
[i586*], [ [i586*], [
: ${LDSHARED="ld -shared"} : ${LDSHARED="$(LD) -shared"}
DLDFLAGS="$DLDFLAGS -L/boot/develop/lib/x86 -L/boot/home/config/lib \$(topdir)/_APP_ -lbe -lroot" DLDFLAGS="$DLDFLAGS -L/boot/develop/lib/x86 -L/boot/home/config/lib \$(topdir)/_APP_ -lbe -lroot"
LDFLAGS="$LDFLAGS -L/boot/develop/lib/x86 -L/boot/home/config/lib -lbe -lroot" LDFLAGS="$LDFLAGS -L/boot/develop/lib/x86 -L/boot/home/config/lib -lbe -lroot"
]) ])
@ -2192,17 +2194,17 @@ if test "$with_dln_a_out" != yes; then
rb_cv_dlopen=yes], rb_cv_dlopen=yes],
[haiku*], [ AS_CASE(["$target_cpu"], [haiku*], [ AS_CASE(["$target_cpu"],
[powerpc*], [ [powerpc*], [
: ${LDSHARED="ld -xms"} : ${LDSHARED="$(LD) -xms"}
DLDFLAGS="$DLDFLAGS "'-export Init_$(TARGET) -lbe -lroot glue-noinit.a init_term_dyn.o start_dyn.o' DLDFLAGS="$DLDFLAGS "'-export Init_$(TARGET) -lbe -lroot glue-noinit.a init_term_dyn.o start_dyn.o'
], ],
[i586*], [ [i586*], [
: ${LDSHARED="ld -shared"} : ${LDSHARED="$(LD) -shared"}
DLDFLAGS="$DLDFLAGS -L/boot/develop/lib/x86 -lbe -lroot" DLDFLAGS="$DLDFLAGS -L/boot/develop/lib/x86 -lbe -lroot"
]) ])
: ${LIBPATHENV=LIBRARY_PATH} : ${LIBPATHENV=LIBRARY_PATH}
rb_cv_dlopen=yes ], rb_cv_dlopen=yes ],
[nto-qnx*], [ DLDFLAGS="$DLDFLAGS -L/lib -L/usr/lib -L/usr/local/lib" [nto-qnx*], [ DLDFLAGS="$DLDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
: ${LDSHARED='ld -Bshareable -x'} : ${LDSHARED="$(LD) -Bshareable -x"}
LDFLAGS="$LDFLAGS -L/lib -L/usr/lib -L/usr/local/lib" LDFLAGS="$LDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
rb_cv_dlopen=yes], rb_cv_dlopen=yes],
[cygwin*|mingw*], [ [cygwin*|mingw*], [
@ -2211,12 +2213,12 @@ if test "$with_dln_a_out" != yes; then
DLDFLAGS="${DLDFLAGS} -Wl,--enable-auto-image-base,--enable-auto-import" DLDFLAGS="${DLDFLAGS} -Wl,--enable-auto-image-base,--enable-auto-import"
: ${LIBPATHENV=""} : ${LIBPATHENV=""}
rb_cv_dlopen=yes], rb_cv_dlopen=yes],
[hiuxmpp], [ : ${LDSHARED='ld -r'}], [hiuxmpp], [ : ${LDSHARED="$(LD) -r"}],
[atheos*], [ : ${LDSHARED='$(CC) -shared'} [atheos*], [ : ${LDSHARED='$(CC) -shared'}
rb_cv_dlopen=yes], rb_cv_dlopen=yes],
[os2-emx*], [ LDFLAGS="$LDFLAGS -Zomf" [os2-emx*], [ LDFLAGS="$LDFLAGS -Zomf"
], ],
[ : ${LDSHARED='ld'}]) [ : ${LDSHARED="$(LD)"}])
AC_MSG_RESULT($rb_cv_dlopen) AC_MSG_RESULT($rb_cv_dlopen)
fi fi
if test "${LDSHAREDXX}" = ""; then if test "${LDSHAREDXX}" = ""; then
@ -2324,6 +2326,13 @@ AC_SUBST(EXTSTATIC)dnl
AC_ARG_WITH(static-linked-ext, AC_ARG_WITH(static-linked-ext,
AS_HELP_STRING([--with-static-linked-ext], [link external modules statically]), AS_HELP_STRING([--with-static-linked-ext], [link external modules statically]),
[AS_CASE([$withval],[yes],[STATIC=;EXTSTATIC=static])]) [AS_CASE([$withval],[yes],[STATIC=;EXTSTATIC=static])])
if test x"$EXTSTATIC" = xstatic; then
ENCOBJS='enc/encinit.$(OBJEXT) enc/libenc.a enc/libtrans.a'
EXTOBJS='ext/extinit.$(OBJEXT) ext/libext.a'
AC_DEFINE_UNQUOTED(EXTSTATIC, 1)
fi
AC_SUBST(ENCOBJS)
AC_SUBST(EXTOBJS)
AS_CASE(["$target_os"], AS_CASE(["$target_os"],
dnl OS/2 environment w/ Autoconf 2.1x for EMX dnl OS/2 environment w/ Autoconf 2.1x for EMX
@ -2507,7 +2516,7 @@ AS_CASE("$enable_shared", [yes], [
LIBRUBYARG_SHARED= LIBRUBYARG_SHARED=
# enable PIE if possible # enable PIE if possible
if test "$GCC" = yes; then if test "$GCC" = yes and -z "$EXTSTATIC"; then
RUBY_TRY_CFLAGS(-fPIE, [pie=yes], [pie=no]) RUBY_TRY_CFLAGS(-fPIE, [pie=yes], [pie=no])
if test "$pie" = yes; then if test "$pie" = yes; then
RUBY_APPEND_OPTION(XCFLAGS, -fPIE) RUBY_APPEND_OPTION(XCFLAGS, -fPIE)

View File

@ -2,3 +2,8 @@ void
Init_ext(void) Init_ext(void)
{ {
} }
void
Init_enc()
{
}

View File

@ -20,6 +20,7 @@ ENCSODIR = $(EXTOUT)/$(arch)/enc
TRANSSODIR = $(ENCSODIR)/trans TRANSSODIR = $(ENCSODIR)/trans
DLEXT = @DLEXT@ DLEXT = @DLEXT@
OBJEXT = @OBJEXT@ OBJEXT = @OBJEXT@
LIBEXT = @LIBEXT@
BUILTIN_ENCS = ascii.c us_ascii.c\ BUILTIN_ENCS = ascii.c us_ascii.c\
unicode.c utf_8.c unicode.c utf_8.c
@ -32,7 +33,9 @@ LIBRUBYARG_SHARED = @LIBRUBYARG_SHARED@
LIBRUBYARG_STATIC = $(LIBRUBYARG_SHARED) LIBRUBYARG_STATIC = $(LIBRUBYARG_SHARED)
empty = empty =
AR = @AR@
CC = @CC@ CC = @CC@
RANLIB = @RANLIB@
OUTFLAG = @OUTFLAG@$(empty) OUTFLAG = @OUTFLAG@$(empty)
COUTFLAG = @COUTFLAG@$(empty) COUTFLAG = @COUTFLAG@$(empty)
CFLAGS = $(CCDLFLAGS) @CFLAGS@ @ARCH_FLAG@ CFLAGS = $(CCDLFLAGS) @CFLAGS@ @ARCH_FLAG@

View File

@ -5,34 +5,7 @@
% dldflags = $2 % dldflags = $2
% enable_shared = CONFIG['ENABLE_SHARED'] == 'yes' % enable_shared = CONFIG['ENABLE_SHARED'] == 'yes'
% deffile = (true if /\$\(DEFFILE\)/ =~ CONFIG["LINK_SO"]) % deffile = (true if /\$\(DEFFILE\)/ =~ CONFIG["LINK_SO"])
% encs = Dir.open($srcdir) {|d| d.grep(/.+\.c\z/)} - BUILTIN_ENCS - ["mktable.c"] % dependencies = ENCS + TRANS
% encs.each {|e| e.chomp!(".c")}
% encs.reject! {|e| !ENC_PATTERNS.any? {|p| File.fnmatch?(p, e)}} if !ENC_PATTERNS.empty?
% encs.reject! {|e| NOENC_PATTERNS.any? {|p| File.fnmatch?(p, e)}}
% alphanumeric_order = proc {|e| e.scan(/(\d+)|(\D+)/).map {|n,a| a||[n.size,n.to_i]}.flatten}
% encs = encs.sort_by(&alphanumeric_order)
% encs.unshift(encs.delete("encdb"))
% atrans = []
% trans = Dir.open($srcdir+"/trans") {|d|
% d.select {|e|
% if e.chomp!('.trans')
% atrans << e
% true
% elsif e.chomp!('.c')
% true
% end
% }
% }
% trans -= BUILTIN_TRANSES
% atrans -= BUILTIN_TRANSES
% trans.uniq!
% atrans = atrans.sort_by(&alphanumeric_order)
% trans = trans.sort_by(&alphanumeric_order)
% trans.unshift(trans.delete("transdb"))
% trans.compact!
% trans |= atrans
% trans.map! {|e| "trans/#{e}"}
% dependencies = encs + trans
% cleanlibs = Shellwords.shellwords(CONFIG["cleanlibs"] || "") % cleanlibs = Shellwords.shellwords(CONFIG["cleanlibs"] || "")
% cleanobjs = Shellwords.shellwords(CONFIG["cleanobjs"] || "") % cleanobjs = Shellwords.shellwords(CONFIG["cleanobjs"] || "")
% cleanobjs << "$*.def" if deffile % cleanobjs << "$*.def" if deffile
@ -54,31 +27,51 @@ else
'' ''
end %> <%=CONFIG['LIBS']%> $(EXTLIBS) end %> <%=CONFIG['LIBS']%> $(EXTLIBS)
ENCOBJS = <%=encs.map {|e|"enc/#{e}.$(OBJEXT)"}.join(" \\\n\t ")%><%="\n" if encs.size>1%> ENCOBJS = <%=ENCS.map {|e|"enc/#{e}.$(OBJEXT)"}.join(" \\\n\t ")%><%="\n" if ENCS.size>1%>
ENCSOS = <%=encs.map {|e|"$(ENCSODIR)/#{e}.$(DLEXT)"}.join(" \\\n\t ")%><%="\n" if encs.size>1%> ENCSOS = <%=ENCS.map {|e|"$(ENCSODIR)/#{e}.$(DLEXT)"}.join(" \\\n\t ")%><%="\n" if ENCS.size>1%>
ENCCLEANLIBS = <%=cleanlibs.map {|clean| ENCCLEANLIBS = <%=cleanlibs.map {|clean|
clean.gsub(/\$\*(\.\w+)?/) {"$(ENCOBJS#{$1 ? ":.#{CONFIG["OBJEXT"]}=#{$1}" : ""})"} clean.gsub(/\$\*(\.\w+)?/) {"$(ENCOBJS#{$1 ? ":.#{CONFIG["OBJEXT"]}=#{$1}" : ""})"}
}.join(" ")%> }.join(" ")%>
ENCCLEANOBJS = <%=cleanobjs.map {|clean| ENCCLEANOBJS = <%=cleanobjs.map {|clean|
clean.gsub(/\$\*(\.\w+)?/) {"$(ENCOBJS#{$1 ? ":.#{CONFIG["OBJEXT"]}=#{$1}" : ""})"} clean.gsub(/\$\*(\.\w+)?/) {"$(ENCOBJS#{$1 ? ":.#{CONFIG["OBJEXT"]}=#{$1}" : ""})"}
}.join(" ")%> }.join(" ")%>
LIBENC=enc/libenc.$(LIBEXT)
TRANSVPATH = $(srcdir)/enc/trans TRANSVPATH = $(srcdir)/enc/trans
TRANSCSRCS = <%=atrans.map {|e| transvpath % "#{e}.c"}.join(" \\\n\t ")%><%="\n" if trans.size>1%> TRANSCSRCS = <%=ATRANS.map {|e| transvpath % "#{e}.c"}.join(" \\\n\t ")%><%="\n" if TRANS.size>1%>
TRANSOBJS = <%=trans.map {|e|"enc/#{e}.$(OBJEXT)"}.join(" \\\n\t ")%><%="\n" if trans.size>1%> TRANSOBJS = <%=TRANS.map {|e|"enc/#{e}.$(OBJEXT)"}.join(" \\\n\t ")%><%="\n" if TRANS.size>1%>
TRANSSOS = <%=trans.map {|e|"$(ENCSODIR)/#{e}.$(DLEXT)"}.join(" \\\n\t ")%><%="\n" if trans.size>1%> TRANSSOS = <%=TRANS.map {|e|"$(ENCSODIR)/#{e}.$(DLEXT)"}.join(" \\\n\t ")%><%="\n" if TRANS.size>1%>
TRANSCLEANLIBS = <%=cleanlibs.map {|clean| TRANSCLEANLIBS = <%=cleanlibs.map {|clean|
clean.gsub(/\$\*(\.\w+)?/) {"$(TRANSOBJS#{$1 ? ":.#{CONFIG["OBJEXT"]}=#{$1}" : ""})"} clean.gsub(/\$\*(\.\w+)?/) {"$(TRANSOBJS#{$1 ? ":.#{CONFIG["OBJEXT"]}=#{$1}" : ""})"}
}.join(" ")%> }.join(" ")%>
TRANSCLEANOBJS = <%=cleanobjs.map {|clean| TRANSCLEANOBJS = <%=cleanobjs.map {|clean|
clean.gsub(/\$\*(\.\w+)?/) {"$(TRANSOBJS#{$1 ? ":.#{CONFIG["OBJEXT"]}=#{$1}" : ""})"} clean.gsub(/\$\*(\.\w+)?/) {"$(TRANSOBJS#{$1 ? ":.#{CONFIG["OBJEXT"]}=#{$1}" : ""})"}
}.join(" ")%> }.join(" ")%>
LIBTRANS=enc/libtrans.$(LIBEXT)
encs: all encs: all
% if MODULE_TYPE == :static
all: libenc libtrans
% else
all: enc trans all: enc trans
%end
libencs: libenc libtrans
enc: $(ENCSOS) enc: $(ENCSOS)
libenc: $(LIBENC)
trans: $(TRANSSOS) trans: $(TRANSSOS)
libtrans: $(LIBTRANS)
$(LIBENC): $(ENCOBJS)
@$(RM) $@
$(ECHO) linking statically-linked encoding library $@
$(Q) $(AR) <%=CONFIG['ARFLAGS'] || 'rcu' %> $@ $(ENCOBJS)
@-$(RANLIB) $@ 2> /dev/null || true
$(LIBTRANS): $(TRANSOBJS)
@$(RM) $@
$(ECHO) linking statically-linked transcoder library $@
$(Q) $(AR) <%=CONFIG['ARFLAGS'] || 'rcu' %> $@ $(TRANSOBJS)
@-$(RANLIB) $@ 2> /dev/null || true
srcs: $(TRANSCSRCS) srcs: $(TRANSCSRCS)
@ -86,15 +79,15 @@ srcs: $(TRANSCSRCS)
$(ECHO) generating table from $@ $(ECHO) generating table from $@
$(Q)$(MINIRUBY) "$(srcdir)/tool/transcode-tblgen.rb" -vo "$@" "$<" $(Q)$(MINIRUBY) "$(srcdir)/tool/transcode-tblgen.rb" -vo "$@" "$<"
% unless encs.empty? or trans.empty? % unless ENCS.empty? or TRANS.empty?
% unless encs.empty? % unless ENCS.empty?
$(ENCOBJS): regenc.h oniguruma.h config.h defines.h $(ENCOBJS): regenc.h oniguruma.h config.h defines.h
% end % end
% unless trans.empty? % unless TRANS.empty?
$(TRANSOBJS): ruby.h intern.h config.h defines.h missing.h encoding.h oniguruma.h st.h transcode_data.h $(TRANSOBJS): ruby.h intern.h config.h defines.h missing.h encoding.h oniguruma.h st.h transcode_data.h
% end % end
% atrans.each do |e| % ATRANS.each do |e|
% src = "#{e}.trans" % src = "#{e}.trans"
<%=transvpath % "#{e}.c"%>: <%= transvpath % "#{e}.trans"%> <%=transvpath % "#{e}.c"%>: <%= transvpath % "#{e}.trans"%>
@ -142,7 +135,7 @@ enc/encdb.$(OBJEXT): encdb.h
enc/trans/transdb.$(OBJEXT): transdb.h enc/trans/transdb.$(OBJEXT): transdb.h
clean: clean:
% %w[$(ENCSOS) $(ENCOBJS) $(ENCCLEANOBJS) $(ENCCLEANLIBS) $(TRANSSOS) $(TRANSOBJS) $(TRANSCLEANOBJS) $(TRANSCLEANLIBS)].each do |clean| % %w[$(ENCSOS) $(LIBENC) $(ENCOBJS) $(ENCCLEANOBJS) $(ENCCLEANLIBS) $(TRANSSOS) $(LIBTRANS) $(TRANSOBJS) $(TRANSCLEANOBJS) $(TRANSCLEANLIBS)].each do |clean|
$(Q)$(RM) <%=pathrep[clean]%> $(Q)$(RM) <%=pathrep[clean]%>
% end % end
% @ignore_error = $nmake ? '' : ' 2> /dev/null || true' % @ignore_error = $nmake ? '' : ' 2> /dev/null || true'
@ -160,3 +153,5 @@ clean-srcs:
$(Q)$(RM) enc/unicode/name2ctype.h $(Q)$(RM) enc/unicode/name2ctype.h
-$(Q)$(RMDIR) <%=pathrep['enc/unicode']%><%=@ignore_error%> -$(Q)$(RMDIR) <%=pathrep['enc/unicode']%><%=@ignore_error%>
-$(Q)$(RMDIR) <%=pathrep['enc']%><%=@ignore_error%> -$(Q)$(RMDIR) <%=pathrep['enc']%><%=@ignore_error%>
<%# vim: set ft=eruby noexpandtab ts=8 sw=2 : -%>

26
enc/encinit.c.erb Normal file
View File

@ -0,0 +1,26 @@
<%# -*- encoding: UTF-8 -*-%>
/* Copyright 2012 Google Inc. Some Rights Reserved.
* Author: yugui@google.com (Yugui Sonoda)
*/
#include <stdio.h>
#define init(func, name) { \
extern void func(void); \
ruby_init_ext(name, func); \
}
void ruby_init_ext(const char *name, void (*init)(void));
void Init_enc()
{
<% ENCS.each do |enc| -%>
init(Init_<%= enc %>, "enc/<%= enc %>.so");
<% end -%>
init(Init_transdb, "enc/trans/transdb.so");
<% TRANS.each do |trans| -%>
<% next if trans == 'trans/transdb' -%>
init(Init_trans_<%= File.basename trans %>, "enc/<%= trans %>.so");
<% end -%>
}
<%# vim: set fenc=utf-8 ft=eruby sw=2 : -%>

View File

@ -15,6 +15,7 @@ BUILTIN_ENCS = []
BUILTIN_TRANSES = [] BUILTIN_TRANSES = []
ENC_PATTERNS = [] ENC_PATTERNS = []
NOENC_PATTERNS = [] NOENC_PATTERNS = []
module_type = :dynamic
until ARGV.empty? until ARGV.empty?
case ARGV[0] case ARGV[0]
@ -30,11 +31,57 @@ until ARGV.empty?
when /\A--no-encs=/ when /\A--no-encs=/
NOENC_PATTERNS.concat $'.split NOENC_PATTERNS.concat $'.split
ARGV.shift ARGV.shift
when /\A--module$/
ARGV.shift
when /\A--modulestatic$/
module_type = :static
ARGV.shift
else else
break break
end end
end end
ALPHANUMERIC_ORDER = proc {|e| e.scan(/(\d+)|(\D+)/).map {|n,a| a||[n.size,n.to_i]}.flatten}
def target_encodings
encs = Dir.open($srcdir) {|d| d.grep(/.+\.c\z/)} - BUILTIN_ENCS - ["mktable.c"]
encs.each {|e| e.chomp!(".c")}
encs.reject! {|e| !ENC_PATTERNS.any? {|p| File.fnmatch?(p, e)}} if !ENC_PATTERNS.empty?
encs.reject! {|e| NOENC_PATTERNS.any? {|p| File.fnmatch?(p, e)}}
encs = encs.sort_by(&ALPHANUMERIC_ORDER)
encs.unshift(encs.delete("encdb"))
return encs
end
def target_transcoders
atrans = []
trans = Dir.open($srcdir+"/trans") {|d|
d.select {|e|
if e.chomp!('.trans')
atrans << e
true
elsif e.chomp!('.c')
true
end
}
}
trans -= BUILTIN_TRANSES
atrans -= BUILTIN_TRANSES
trans.uniq!
atrans = atrans.sort_by(&ALPHANUMERIC_ORDER)
trans = trans.sort_by(&ALPHANUMERIC_ORDER)
trans.unshift(trans.delete("transdb"))
trans.compact!
trans |= atrans
trans.map! {|e| "trans/#{e}"}
return atrans, trans
end
# Constants that "depend" needs.
MODULE_TYPE = module_type
ENCS = target_encodings
ATRANS, TRANS = target_transcoders
if File.exist?(depend = File.join($srcdir, "depend")) if File.exist?(depend = File.join($srcdir, "depend"))
erb = ERB.new(File.read(depend), nil, '%') erb = ERB.new(File.read(depend), nil, '%')
erb.filename = depend erb.filename = depend
@ -48,3 +95,18 @@ mkin.gsub!(/@(#{CONFIG.keys.join('|')})@/) {CONFIG[$1]}
open(ARGV[0], 'wb') {|f| open(ARGV[0], 'wb') {|f|
f.puts mkin, dep f.puts mkin, dep
} }
if MODULE_TYPE == :static
erb = ERB.new(File.read(File.join($srcdir, "encinit.c.erb")), nil, '%-')
erb.filename = "enc/encinit.c.cerb"
tmp = erb.result(binding)
begin
Dir.mkdir 'enc'
rescue Errno::EEXIST
end
File.open("enc/encinit.c", "w") {|f|
f.puts "/* Automatically generated from enc/encinit.c.erb"
f.puts " * Do not edit."
f.puts " */"
f.puts tmp
}
end

View File

@ -26,8 +26,7 @@
<%= transcode_generated_code %> <%= transcode_generated_code %>
void TRANS_INIT(big5)
Init_big5(void)
{ {
<%= transcode_register_code %> <%= transcode_register_code %>
} }

View File

@ -25,8 +25,7 @@
<%= transcode_generated_code %> <%= transcode_generated_code %>
void TRANS_INIT(chinese)
Init_chinese(void)
{ {
<%= transcode_register_code %> <%= transcode_register_code %>
} }

View File

@ -30,8 +30,7 @@
<%= transcode_generated_code %> <%= transcode_generated_code %>
void TRANS_INIT(emoji)
Init_emoji(void)
{ {
<%= transcode_register_code %> <%= transcode_register_code %>
} }

View File

@ -208,8 +208,7 @@ rb_iso2022jp_kddi_encoder = {
iso2022jp_kddi_encoder_reset_sequence_size, finish_iso2022jp_kddi_encoder iso2022jp_kddi_encoder_reset_sequence_size, finish_iso2022jp_kddi_encoder
}; };
void TRANS_INIT(emoji_iso2022_kddi)
Init_emoji_iso2022_kddi(void)
{ {
rb_register_transcoder(&rb_iso2022jp_kddi_decoder); rb_register_transcoder(&rb_iso2022jp_kddi_decoder);
rb_register_transcoder(&rb_iso2022jp_kddi_encoder); rb_register_transcoder(&rb_iso2022jp_kddi_encoder);

View File

@ -26,8 +26,7 @@
<%= transcode_generated_code %> <%= transcode_generated_code %>
void TRANS_INIT(emoji_sjis_docomo)
Init_emoji_sjis_docomo(void)
{ {
<%= transcode_register_code %> <%= transcode_register_code %>
} }

View File

@ -27,8 +27,7 @@
<%= transcode_generated_code %> <%= transcode_generated_code %>
void TRANS_INIT(emoji_sjis_kddi)
Init_emoji_sjis_kddi(void)
{ {
<%= transcode_register_code %> <%= transcode_register_code %>
} }

View File

@ -26,8 +26,7 @@
<%= transcode_generated_code %> <%= transcode_generated_code %>
void TRANS_INIT(emoji_sjis_softbank)
Init_emoji_sjis_softbank(void)
{ {
<%= transcode_register_code %> <%= transcode_register_code %>
} }

View File

@ -85,8 +85,7 @@ rb_escape_xml_attr_quote = {
escape_xml_attr_quote_finish escape_xml_attr_quote_finish
}; };
void TRANS_INIT(escape)
Init_escape(void)
{ {
<%= transcode_register_code %> <%= transcode_register_code %>
rb_register_transcoder(&rb_escape_xml_attr_quote); rb_register_transcoder(&rb_escape_xml_attr_quote);

View File

@ -176,8 +176,7 @@ rb_to_GB18030 = {
}; };
void TRANS_INIT(gb18030)
Init_gb18030(void)
{ {
rb_register_transcoder(&rb_from_GB18030); rb_register_transcoder(&rb_from_GB18030);
rb_register_transcoder(&rb_to_GB18030); rb_register_transcoder(&rb_to_GB18030);

View File

@ -9,8 +9,7 @@
<%= transcode_generated_code %> <%= transcode_generated_code %>
void TRANS_INIT(gbk)
Init_gbk(void)
{ {
<%= transcode_register_code %> <%= transcode_register_code %>
} }

View File

@ -553,8 +553,7 @@ rb_cp50220_encoder = {
iso2022jp_encoder_reset_sequence_size, finish_cp50220_encoder iso2022jp_encoder_reset_sequence_size, finish_cp50220_encoder
}; };
void TRANS_INIT(iso2022)
Init_iso2022(void)
{ {
rb_register_transcoder(&rb_iso2022jp_decoder); rb_register_transcoder(&rb_iso2022jp_decoder);
rb_register_transcoder(&rb_iso2022jp_encoder); rb_register_transcoder(&rb_iso2022jp_encoder);

View File

@ -90,8 +90,7 @@ rb_sjis2eucjp = {
NULL, NULL, NULL, fun_so_sjis2eucjp NULL, NULL, NULL, fun_so_sjis2eucjp
}; };
void TRANS_INIT(japanese)
Init_japanese(void)
{ {
rb_register_transcoder(&rb_eucjp2sjis); rb_register_transcoder(&rb_eucjp2sjis);
rb_register_transcoder(&rb_sjis2eucjp); rb_register_transcoder(&rb_sjis2eucjp);

View File

@ -51,8 +51,7 @@
<%= transcode_generated_code %> <%= transcode_generated_code %>
void TRANS_INIT(japanese_euc)
Init_japanese_euc(void)
{ {
<%= transcode_register_code %> <%= transcode_register_code %>
} }

View File

@ -27,8 +27,7 @@
<%= transcode_generated_code %> <%= transcode_generated_code %>
void TRANS_INIT(japanese_sjis)
Init_japanese_sjis(void)
{ {
<%= transcode_register_code %> <%= transcode_register_code %>
} }

View File

@ -12,8 +12,7 @@
<%= transcode_generated_code %> <%= transcode_generated_code %>
void TRANS_INIT(korean)
Init_korean(void)
{ {
<%= transcode_register_code %> <%= transcode_register_code %>
} }

View File

@ -84,8 +84,7 @@
<%= transcode_generated_code %> <%= transcode_generated_code %>
void TRANS_INIT(single_byte)
Init_single_byte(void)
{ {
<%= transcode_register_code %> <%= transcode_register_code %>
} }

View File

@ -233,8 +233,7 @@ rb_from_UTF8_MAC = {
from_utf8_mac_finish from_utf8_mac_finish
}; };
void TRANS_INIT(utf8_mac)
Init_utf8_mac(void)
{ {
<%= transcode_register_code %> <%= transcode_register_code %>
rb_register_transcoder(&rb_from_UTF8_MAC); rb_register_transcoder(&rb_from_UTF8_MAC);

View File

@ -539,8 +539,7 @@ rb_to_UTF_32 = {
NULL, NULL, NULL, fun_so_to_utf_32 NULL, NULL, NULL, fun_so_to_utf_32
}; };
void TRANS_INIT(utf_16_32)
Init_utf_16_32(void)
{ {
rb_register_transcoder(&rb_from_UTF_16BE); rb_register_transcoder(&rb_from_UTF_16BE);
rb_register_transcoder(&rb_to_UTF_16BE); rb_register_transcoder(&rb_to_UTF_16BE);

View File

@ -10,7 +10,7 @@ $dryrun = false
$clean = nil $clean = nil
$nodynamic = nil $nodynamic = nil
$extinit = nil $extinit = nil
$extobjs = nil $extobjs = []
$extflags = "" $extflags = ""
$extlibs = nil $extlibs = nil
$extpath = nil $extpath = nil
@ -26,6 +26,8 @@ alias $0 $progname
$extlist = [] $extlist = []
$compiled = {} $compiled = {}
DUMMY_SIGNATURE = "***DUMMY MAKEFILE***"
srcdir = File.dirname(File.dirname(__FILE__)) srcdir = File.dirname(File.dirname(__FILE__))
unless defined?(CROSS_COMPILING) and CROSS_COMPILING unless defined?(CROSS_COMPILING) and CROSS_COMPILING
$:.replace([File.expand_path("lib", srcdir), Dir.pwd]) $:.replace([File.expand_path("lib", srcdir), Dir.pwd])
@ -46,7 +48,18 @@ def sysquote(x)
end end
def verbose? def verbose?
$mflags.defined?("Q") != "@" $mflags.defined?("V") == "1"
end
def system(*args)
if verbose?
if args.size == 1
puts args
else
puts args.map{|arg| Shellwords.escape(arg)}.join(' ')
end
end
super
end end
def extract_makefile(makefile, keep = true) def extract_makefile(makefile, keep = true)
@ -100,7 +113,7 @@ def extract_makefile(makefile, keep = true)
end end
def extmake(target) def extmake(target)
unless $configure_only unless $configure_only || verbose?
print "#{$message} #{target}\n" print "#{$message} #{target}\n"
$stdout.flush $stdout.flush
end end
@ -163,7 +176,11 @@ def extmake(target)
then then
ok = false ok = false
if $configure_only if $configure_only
print "#{$message} #{target}\n" if verbose?
print "#{conf}\n" if conf
else
print "#{$message} #{target}\n"
end
$stdout.flush $stdout.flush
end end
init_mkmf init_mkmf
@ -193,9 +210,11 @@ def extmake(target)
$0 = $PROGRAM_NAME $0 = $PROGRAM_NAME
end end
end end
ok &&= File.open(makefile){|f| !f.gets[DUMMY_SIGNATURE]}
ok = yield(ok) if block_given? ok = yield(ok) if block_given?
unless ok unless ok
open(makefile, "w") do |f| open(makefile, "w") do |f|
f.puts "# " + DUMMY_SIGNATURE
f.print(*dummy_makefile(CONFIG["srcdir"])) f.print(*dummy_makefile(CONFIG["srcdir"]))
end end
print "Failed to configure #{target}. It will not be installed.\n" print "Failed to configure #{target}. It will not be installed.\n"
@ -205,9 +224,9 @@ def extmake(target)
unless $destdir.to_s.empty? or $mflags.defined?("DESTDIR") unless $destdir.to_s.empty? or $mflags.defined?("DESTDIR")
args += [sysquote("DESTDIR=" + relative_from($destdir, "../"+prefix))] args += [sysquote("DESTDIR=" + relative_from($destdir, "../"+prefix))]
end end
if $static if $static and %r(\A-test-) !~ target and target != 'json' and ok
args += ["static"] unless $clean args += ["static"] unless $clean
$extlist.push [$static, $target, File.basename($target), $preload] $extlist.push [$static, target, $target, $preload]
end end
FileUtils.rm_f(old_cleanfiles - $distcleanfiles) FileUtils.rm_f(old_cleanfiles - $distcleanfiles)
FileUtils.rm_f(old_objs - $objs) FileUtils.rm_f(old_objs - $objs)
@ -466,7 +485,7 @@ Dir::chdir('ext')
hdrdir = $hdrdir hdrdir = $hdrdir
$hdrdir = ($top_srcdir = relative_from(srcdir, $topdir = "..")) + "/include" $hdrdir = ($top_srcdir = relative_from(srcdir, $topdir = "..")) + "/include"
exts.each do |d| exts.each do |d|
$static = $force_static ? $static_ext[target] : nil $static = $force_static ? true : $static_ext[target]
if $ignore or !$nodynamic or $static if $ignore or !$nodynamic or $static
extmake(d) or abort extmake(d) or abort
@ -502,7 +521,7 @@ if $ignore
end end
$extinit ||= "" $extinit ||= ""
$extobjs ||= "" $extobjs ||= []
$extpath ||= [] $extpath ||= []
$extflags ||= "" $extflags ||= ""
$extlibs ||= [] $extlibs ||= []
@ -519,31 +538,27 @@ unless $extlist.empty?
end end
next next
end end
f = format("%s/%s.%s", t, i, $LIBEXT) $extinit << " init(Init_#{File.basename i}, \"#{i}.so\");\n"
if File.exist?(f) $extobjs << format("ext/%s/%s.%s", t, File.basename(i), $LIBEXT)
$extinit << " init(Init_#{i}, \"#{t}.so\");\n" built << t
$extobjs << "ext/#{f} "
built << t
end
end end
src = %{\ src = %{\
#include "ruby.h" #include "ruby/ruby.h"
#define init(func, name) { \\ #define init(func, name) { \\
extern void func _((void)); \\ extern void func(void); \\
ruby_init_ext(name, func); \\ ruby_init_ext(name, func); \\
} }
void ruby_init_ext _((const char *name, void (*init)(void))); void ruby_init_ext(const char *name, void (*init)(void));
void Init_ext _((void))\n{\n#$extinit} void Init_ext(void)\n{\n#$extinit}
} }
if !modified?(extinit.c, MTIMES) || IO.read(extinit.c) != src if !modified?(extinit.c, MTIMES) || IO.read(extinit.c) != src
open(extinit.c, "w") {|fe| fe.print src} open(extinit.c, "w") {|fe| fe.print src}
end end
$extobjs = "ext/#{extinit.o} #{$extobjs}"
if RUBY_PLATFORM =~ /beos/ if RUBY_PLATFORM =~ /beos/
$extflags.delete("-L/usr/local/lib") $extflags.delete("-L/usr/local/lib")
end end
@ -552,7 +567,6 @@ void Init_ext _((void))\n{\n#$extinit}
conf = [ conf = [
['LIBRUBY_SO_UPDATE', '$(LIBRUBY_EXTS)'], ['LIBRUBY_SO_UPDATE', '$(LIBRUBY_EXTS)'],
['SETUP', $setup], ['SETUP', $setup],
[enable_config("shared", $enable_shared) ? 'DLDOBJS' : 'EXTOBJS', $extobjs],
['EXTLIBS', $extlibs.join(' ')], ['EXTLDFLAGS', $extflags] ['EXTLIBS', $extlibs.join(' ')], ['EXTLDFLAGS', $extflags]
].map {|n, v| ].map {|n, v|
"#{n}=#{v}" if v and !(v = v.strip).empty? "#{n}=#{v}" if v and !(v = v.strip).empty?
@ -615,21 +629,34 @@ if $configure_only and $command_output
w += d.size + 1 w += d.size + 1
end end
mf.puts mf.puts
if !$extlist.empty?
mf.puts "EXTOBJS = ext/extinit.#{$OBJEXT} #{$extobjs.join(' ')}"
mf.puts "EXTLIBS = #{$extlibs.join(' ')}"
else
mf.puts "EXTOBJS = "
mf.puts "EXTLIBS = "
end
mf.puts
targets = %w[all install static install-so install-rb clean distclean realclean] targets = %w[all install static install-so install-rb clean distclean realclean]
targets.each do |tgt| targets.each do |tgt|
mf.puts "#{tgt}: $(extensions:/.=/#{tgt})" mf.puts "#{tgt}: $(extensions:/.=/#{tgt})"
end end
mf.puts mf.puts
mf.puts "all: #{rubies.join(' ')}" mf.puts "all: #{rubies.join(' ')}"
mf.puts "#{rubies.join(' ')}: $(extensions:/.=/all)" mf.puts "static: ext/extinit.#{$OBJEXT} #{rubies.join(' ')}"
mf.puts "clean:\n\t-$(Q)$(RM) ext/extinit.#{$OBJEXT}"
mf.puts "distclean:\n\t-$(Q)$(RM) ext/extinit.c"
mf.puts
mf.puts "#{rubies.join(' ')}: $(extensions:/.=/#{$force_static ? 'static' : 'all'})"
rubies.each do |tgt| rubies.each do |tgt|
mf.puts "#{tgt}:\n\t$(Q)$(MAKE) $(MFLAGS) $@" mf.puts "#{tgt}:\n\t$(Q)$(MAKE) $(MFLAGS) EXTOBJS='$(EXTOBJS)' EXTLIBS='$(EXTLIBS)' $@"
end end
mf.puts "ext/extinit.#{$OBJEXT}:\n\t$(Q)$(MAKE) $(MFLAGS) V=$(V) $@"
mf.puts mf.puts
exec = config_string("exec") {|str| str + " "} exec = config_string("exec") {|str| str + " "}
targets.each do |tgt| targets.each do |tgt|
exts.each do |d| exts.each do |d|
mf.puts "#{d[0..-2]}#{tgt}:\n\t$(Q)cd $(@D) && #{exec}$(MAKE) $(MFLAGS) $(@F)" mf.puts "#{d[0..-2]}#{tgt}:\n\t$(Q)cd $(@D) && #{exec}$(MAKE) $(MFLAGS) V=$(V) $(@F)"
end end
end end
end end

View File

@ -1835,7 +1835,7 @@ DISTCLEANFILES = #{$distcleanfiles.join(' ')}
all install static install-so install-rb: Makefile all install static install-so install-rb: Makefile
.PHONY: all install static install-so install-rb .PHONY: all install static install-so install-rb
.PHONY: clean clean-so clean-rb .PHONY: clean clean-so clean-static clean-rb
RULES RULES
end end
@ -2064,7 +2064,7 @@ CLEANOBJS = *.#{$OBJEXT} #{config_string('cleanobjs') {|t| t.gsub(/\$\*/, "$
all: #{$extout ? "install" : target ? "$(DLLIB)" : "Makefile"} all: #{$extout ? "install" : target ? "$(DLLIB)" : "Makefile"}
static: $(STATIC_LIB)#{$extout ? " install-rb" : ""} static: $(STATIC_LIB)#{$extout ? " install-rb" : ""}
.PHONY: all install static install-so install-rb .PHONY: all install static install-so install-rb
.PHONY: clean clean-so clean-rb .PHONY: clean clean-so clean-static clean-rb
" "
mfile.print CLEANINGS mfile.print CLEANINGS
fsep = config_string('BUILD_FILE_SEPARATOR') {|s| s unless s == "/"} fsep = config_string('BUILD_FILE_SEPARATOR') {|s| s unless s == "/"}
@ -2100,6 +2100,8 @@ static: $(STATIC_LIB)#{$extout ? " install-rb" : ""}
mfile.print "\t@echo #{dir}/#{File.basename(f)}>>$(INSTALLED_LIST)\n" mfile.print "\t@echo #{dir}/#{File.basename(f)}>>$(INSTALLED_LIST)\n"
end end
end end
mfile.print "clean-static::\n"
mfile.print "\t-$(Q)$(RM) $(STATIC_LIB)\n"
else else
mfile.puts "Makefile" mfile.puts "Makefile"
end end
@ -2372,13 +2374,14 @@ MESSAGE
clean-rb-default:: clean-rb-default::
clean-rb:: clean-rb::
clean-so:: clean-so::
clean: clean-so clean-rb-default clean-rb clean: clean-so clean-static clean-rb-default clean-rb
\t\t-$(Q)$(RM) $(CLEANLIBS#{sep}) $(CLEANOBJS#{sep}) $(CLEANFILES#{sep}) \t\t-$(Q)$(RM) $(CLEANLIBS#{sep}) $(CLEANOBJS#{sep}) $(CLEANFILES#{sep})
distclean-rb-default:: distclean-rb-default::
distclean-rb:: distclean-rb::
distclean-so:: distclean-so::
distclean: clean distclean-so distclean-rb-default distclean-rb distclean-static::
distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb
\t\t-$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log \t\t-$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
\t\t-$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES#{sep}) \t\t-$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES#{sep})
\t\t-$(Q)$(RMDIRS) $(DISTCLEANDIRS#{sep})#{$ignore_error} \t\t-$(Q)$(RMDIRS) $(DISTCLEANDIRS#{sep})#{$ignore_error}

4
ruby.c
View File

@ -1225,6 +1225,9 @@ rb_f_chomp(argc, argv)
return str; return str;
} }
/* blank function in dmyencoding.c or generated by enc/make_encmake.rb */
extern void Init_enc(void);
static VALUE static VALUE
process_options(int argc, char **argv, struct cmdline_options *opt) process_options(int argc, char **argv, struct cmdline_options *opt)
{ {
@ -1311,6 +1314,7 @@ process_options(int argc, char **argv, struct cmdline_options *opt)
#endif #endif
ruby_init_loadpath_safe(opt->safe_level); ruby_init_loadpath_safe(opt->safe_level);
Init_enc();
rb_enc_find_index("encdb"); rb_enc_find_index("encdb");
lenc = rb_locale_encoding(); lenc = rb_locale_encoding();
rb_enc_associate(rb_progname, lenc); rb_enc_associate(rb_progname, lenc);

View File

@ -110,6 +110,16 @@ struct rb_transcoder {
void rb_declare_transcoder(const char *enc1, const char *enc2, const char *lib); void rb_declare_transcoder(const char *enc1, const char *enc2, const char *lib);
void rb_register_transcoder(const rb_transcoder *); void rb_register_transcoder(const rb_transcoder *);
/*
* To get rid of collision of initializer symbols in statically-linked encodings
* and transcoders
*/
#if defined(EXTSTATIC) && EXTSTATIC
# define TRANS_INIT(name) void Init_trans_ ## name(void)
#else
# define TRANS_INIT(name) void Init_ ## name(void)
#endif
#if defined __GNUC__ && __GNUC__ >= 4 #if defined __GNUC__ && __GNUC__ >= 4
#pragma GCC visibility pop #pragma GCC visibility pop
#endif #endif