2009-03-06 50 views
6

安装PL /红宝石这是为了使Postgres的发展功能嵌入红宝石代码, 但我一直无法建立它。对PostgreSQL 8.3

诚如通过 http://www.robbyonrails.com/articles/2005/08/22/installing-untrusted-pl-ruby-for-postgresql

我试图建立从我整理出来的最新版本ftp://moulon.inra.fr/pub/ruby/

提供(plruby-0.5.3.tar.gz)所需的plruby.so在我的本地的Postgres设置的调整和调用到:

ruby extconf.rb --with-pgsql-include=/usr/postgresql-8.3.4/include/server --enable-shared --disable-conversion --with-pgsql-version=83 

我试着对变化的相当数量,但它似乎并没有能够成功地使 的'conftest.c' 文件

它这样说:

checking for catalog/pg_proc.h... yes 
*** extconf.rb failed *** 
Could not create Makefile due to some reason, probably lack of 
necessary libraries and/or headers. Check the mkmf.log file for more 
details. You may need configuration options. 

而且这里是我结束了我的mkmf.log

have_header: checking for catalog/pg_proc.h... -------------------- yes 
"gcc -E -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -I/usr/postgresql-8.3.4/include/server -g -O2 -fPIC conftest.c -o conftest.i" 
checked program was: 
/* begin */ 
1: #include <catalog/pg_proc.h> 
/* end */ 

当我手动运行一行gcc,它说没有'conftest.c'(并且没有,但是应该生成 )。

'uname -a' ... gives 
Linux vdev1 2.6.18.8-xen #2 SMP Thu May 8 11:52:29 PDT 2008 x86_64 x86_64 x86_64 GNU/Linux 
'ruby -v' ... gives 
ruby 1.8.6 (2008-08-11 patchlevel 287) [x86_64-linux] 

任何帮助和/或建议,将不胜感激。

迈克 - Berrow

回答

5

OK,我设法手通过google搜索的 日志文件创建成功,开始与海合会系列构建这(绕过脆弱 extconf.rb和Makefile)我看到那里,然后摆弄gcc编译 标志和路径,直到它工作。

在plruby.h改变SAFE_LEVEL至0 如下所示

#ifndef SAFE_LEVEL 
//#define SAFE_LEVEL 12 
#define SAFE_LEVEL 0 
#endif 

每个从壳然后链接

gcc -I. -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -DHAVE_CATALOG_PG_PROC_H -DHAVE_RB_HASH_DELETE -DHAVE_ST_H -DHAVE_UTILS_ARRAY_H -I/usr/postgresql-8.3.4/include/server -D_FILE_OFFSET_BITS=64 -fPIC -fno-strict-aliasing -g -g -O2 -fPIC -DHAVE_RB_HASH_DELETE -DHAVE_RB_INITIALIZE_COPY -DPG_UTILS_ARRAY -DPG_PL_TRYCATCH -DPG_PL_VERSION=83 -DPLRUBY_CALL_HANDLER=plruby_call_handler -DPLRUBY_VALIDATOR=plruby_validator -c plruby.c 
gcc -I. -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -DHAVE_CATALOG_PG_PROC_H -DHAVE_RB_HASH_DELETE -DHAVE_ST_H -DHAVE_UTILS_ARRAY_H -I/usr/postgresql-8.3.4/include/server -D_FILE_OFFSET_BITS=64 -fPIC -fno-strict-aliasing -g -g -O2 -fPIC -DHAVE_RB_HASH_DELETE -DHAVE_RB_INITIALIZE_COPY -DPG_UTILS_ARRAY -DPG_PL_TRYCATCH -DPG_PL_VERSION=83 -DPLRUBY_CALL_HANDLER=plruby_call_handler -DPLRUBY_VALIDATOR=plruby_validator -c plplan.c 
gcc -I. -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -DHAVE_CATALOG_PG_PROC_H -DHAVE_RB_HASH_DELETE -DHAVE_ST_H -DHAVE_UTILS_ARRAY_H -I/usr/postgresql-8.3.4/include/server -D_FILE_OFFSET_BITS=64 -fPIC -fno-strict-aliasing -g -g -O2 -fPIC -DHAVE_RB_HASH_DELETE -DHAVE_RB_INITIALIZE_COPY -DPG_UTILS_ARRAY -DPG_PL_TRYCATCH -DPG_PL_VERSION=83 -DPLRUBY_CALL_HANDLER=plruby_call_handler -DPLRUBY_VALIDATOR=plruby_validator -c plpl.c 
gcc -I. -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -DHAVE_CATALOG_PG_PROC_H -DHAVE_RB_HASH_DELETE -DHAVE_ST_H -DHAVE_UTILS_ARRAY_H -I/usr/postgresql-8.3.4/include/server -D_FILE_OFFSET_BITS=64 -fPIC -fno-strict-aliasing -g -g -O2 -fPIC -DHAVE_RB_HASH_DELETE -DHAVE_RB_INITIALIZE_COPY -DPG_UTILS_ARRAY -DPG_PL_TRYCATCH -DPG_PL_VERSION=83 -DPLRUBY_CALL_HANDLER=plruby_call_handler -DPLRUBY_VALIDATOR=plruby_validator -c pltrans.c 
gcc -shared -o plruby.so plruby.o plplan.o plpl.o pltrans.o -L. -L/usr/lib -L/usr/postgresql-8.3.4/lib -L. -Wl,-Bsymbolic -rdynamic -Wl,-export-dynamic -lruby -lpthread -ldl -lcrypt -lm -lc 

放置在上面的动态库构建的“所以”文件编译路径($ libdir) [使用pg_config --pkglibdir给出(在我的情况下)/usr/postgresql-8.3.4/lib]

其他这种方法很可能不得不自己调整。

添加这些功能...

CREATE OR REPLACE FUNCTION plruby_call_handler() 
    RETURNS language_handler AS 
'$libdir/plruby', 'plruby_call_handler' 
    LANGUAGE 'c' VOLATILE 
    COST 1; 
ALTER FUNCTION plruby_call_handler() OWNER TO postgres; 

CREATE OR REPLACE FUNCTION plruby_validator(oid) 
    RETURNS void AS 
'$libdir/plruby', 'plruby_validator' 
    LANGUAGE 'c' VOLATILE 
    COST 1; 
ALTER FUNCTION plruby_validator(oid) OWNER TO postgres; 

增加 'plruby' 作为程序语言

CREATE PROCEDURAL LANGUAGE 'plruby' HANDLER plruby_call_handler; 

测试:

CREATE FUNCTION ruby_max(int4, int4) RETURNS text AS ' 
    if args[0].to_i > args[1].to_i 
     return "The one on the left is bigger" 
    else 
     return "The one on the right is bigger" 
    end 
' LANGUAGE 'plruby'; 

select ruby_max(8, 9); 

这有其他的编译选项,使型 '转换'。 上面的构建是最简单的一个,实际上所有函数参数 都以字符串的形式进入ruby(尽管它们被声明为int4)。 因此需要'to_i'来电。