This completes attaching stdout to all 5 embedded interpreters.
[...@fedora10 wdj]$ rpm --version
rpm (RPM) 5.2.DEVEL
[...@fedora10 wdj]$ cat tinterp
#!/usr/bin/rpm -E -
%{lua: print("lua:\tHello World!")}
%{perl: print "perl:\tHello World!\n"}
%{python:print "python:\tHello World!"}
%{ruby: puts "ruby:\tHello World!"}
%{tcl: puts "tcl:\tHello World!"}
[...@fedora10 wdj]$ vi tinterp
[...@fedora10 wdj]$ cat tinterp | rpm -E -
#!/usr/bin/rpm -E -
lua: Hello World!
perl: Hello World!
python: Hello World!
ruby: Hello World!
tcl: Hello World!
[...@fedora10 wdj]$
If someone who is more knowledgeable about perl
could take a look at completing the xs_init
wiring to the 2nd argument of perl_parse()
so that rpm-perl can be loaded by rpm itself,
I'd be grateful. Perl hurts my head ;-)
Enjoy!
73 de Jeff
On Apr 12, 2009, at 6:28 PM, Jeff Johnson wrote:
RPM Package Manager, CVS Repository
http://rpm5.org/cvs/
____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson
Root: /v/rpm/cvs Email: j...@rpm5.org
Module: rpm Date: 13-Apr-2009 00:28:49
Branch: HEAD Handle: 2009041222284801
Modified files:
rpm CHANGES
rpm/rpmio rpmperl.c rpmpython.c rpmruby.c
Log:
- perl: attach stdout to macro expansion buffer with IO::String.
Summary:
Revision Changes Path
1.2919 +1 -0 rpm/CHANGES
2.4 +45 -3 rpm/rpmio/rpmperl.c
2.5 +1 -0 rpm/rpmio/rpmpython.c
2.4 +1 -0 rpm/rpmio/rpmruby.c
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/CHANGES
=
=
=
=
=
=
======================================================================
$ cvs diff -u -r1.2918 -r1.2919 CHANGES
--- rpm/CHANGES 12 Apr 2009 19:42:56 -0000 1.2918
+++ rpm/CHANGES 12 Apr 2009 22:28:48 -0000 1.2919
@@ -1,5 +1,6 @@
5.2a3 -> 5.2a4:
+ - jbj: perl: attach stdout to macro expansion buffer with
IO::String.
- rse: use new POPT 1.15 from devtool environment
- jbj: tcl: attach rpmtclIO to macro expansion buffer with
Tcl_StackChannel.
- jbj: ruby: attach $stdout to macro expansion buffer using
StringIO.
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmio/rpmperl.c
=
=
=
=
=
=
======================================================================
$ cvs diff -u -r2.3 -r2.4 rpmperl.c
--- rpm/rpmio/rpmperl.c 11 Apr 2009 14:47:13 -0000 2.3
+++ rpm/rpmio/rpmperl.c 12 Apr 2009 22:28:49 -0000 2.4
@@ -46,6 +46,46 @@
return (rpmperl) rpmioGetPool(pool, sizeof(*perl));
}
+#if defined(NOTYET)
+EXTERN_C void xs_init (pTHX);
+
+EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
+
+EXTERN_C void
+xs_init(pTHX)
+{
+ char *file = __FILE__;
+ dXSUB_SYS;
+
+ /* DynaLoader is a special case */
+ newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
+}
+
+/*...@unchecked@*/
+static const char * rpmperlInitStringIO = "\
+use RPM::Constant;\n\
+use RPM::Header;\n\
+use RPM::Transaction;\n\
+use RPM::PackageIterator;\n\
+use RPM::Problems;\n\
+use RPM::Files;\n\
+use RPM::Dependencies;\n\
+use RPM::Spec;\n\
+use IO::String;\n\
+$io = IO::String->new;\n\
+select $io;\n\
+";
+#else
+#define xs_init NULL
+/*...@unchecked@*/
+static const char * rpmperlInitStringIO = "\
+use IO::String;\n\
+$io = IO::String->new;\n\
+select $io;\n\
+";
+
+#endif
+
rpmperl rpmperlNew(const char * fn, int flags)
{
static char *embedding[] = { "", "-e", "0" };
@@ -56,7 +96,6 @@
perl->fn = xstrdup(fn);
perl->flags = flags;
-
#if defined(WITH_PERLEMBED)
perl->I = perl_alloc();
PERL_SET_CONTEXT(my_perl);
@@ -64,9 +103,10 @@
perl_construct(my_perl);
PL_origalen = 1; /* don't let $0 assignment update proctitle/
embedding[0] */
- xx = perl_parse(my_perl, NULL, 3, embedding, NULL);
+ xx = perl_parse(my_perl, xs_init, 3, embedding, NULL);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
perl_run(my_perl);
+ (void) rpmperlRun(perl, rpmperlInitStringIO, NULL);
#endif
return rpmperlLink(perl);
@@ -85,8 +125,10 @@
SV * retSV;
PERL_SET_CONTEXT(my_perl);
retSV = Perl_eval_pv(my_perl, str, TRUE);
- if (resultp)
+ if (resultp) {
+ retSV = Perl_eval_pv(my_perl, "${$io->string_ref}", TRUE);
*resultp = SvPV(retSV, n_a);
+ }
#endif
rc = RPMRC_OK;
}
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmio/rpmpython.c
=
=
=
=
=
=
======================================================================
$ cvs diff -u -r2.4 -r2.5 rpmpython.c
--- rpm/rpmio/rpmpython.c 12 Apr 2009 17:26:33 -0000 2.4
+++ rpm/rpmio/rpmpython.c 12 Apr 2009 22:28:49 -0000 2.5
@@ -43,6 +43,7 @@
return (rpmpython) rpmioGetPool(pool, sizeof(*python));
}
+/*...@unchecked@*/
static const char * rpmpythonInitStringIO = "\
import rpm\n\
import sys\n\
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmio/rpmruby.c
=
=
=
=
=
=
======================================================================
$ cvs diff -u -r2.3 -r2.4 rpmruby.c
--- rpm/rpmio/rpmruby.c 12 Apr 2009 17:26:33 -0000 2.3
+++ rpm/rpmio/rpmruby.c 12 Apr 2009 22:28:49 -0000 2.4
@@ -54,6 +54,7 @@
return (rpmruby) rpmioGetPool(pool, sizeof(*ruby));
}
+/*...@unchecked@*/
static const char * rpmrubyInitStringIO = "\
require 'stringio'\n\
$stdout = StringIO.new($result, \"w+\")\n\
@@ .
______________________________________________________________________
RPM Package Manager http://rpm5.org
CVS Sources Repository rpm-...@rpm5.org
______________________________________________________________________
RPM Package Manager http://rpm5.org
Developer Communication List rpm-devel@rpm5.org