2012-10-24 6 views
5

Ola tutte le persone intelligenti. Sono di fronte a un problema che sto cercando di risolvere ma in mancanza. Sto cercando di installare pg gem sul server che ha l'installazione di Omnibus Chef su http://www.opscode.com/chef/install/pg gem non riesce ad installare su omnibus Installazione Chef

Fondamentalmente il problema è già stato segnalato (http://tickets.opscode.com/browse/COOK-1406) ma io ' Sto cercando una soluzione a questo se ce n'è una - la soluzione suggerita per installare pacchetti da Opscode Ubuntu repos - ma quelli sono dotati di Ruby 1.8 - Spero di non dover continuare ulteriormente perché mi sento riluttante a farlo :)

l'errore che sto ottenendo quando si installa la gemma pg è:

$ sudo /opt/chef/embedded/bin/gem install pg 
Building native extensions. This could take a while... 
ERROR: Error installing pg: 
    ERROR: Failed to build gem native extension. 

     /opt/chef/embedded/bin/ruby extconf.rb 
checking for pg_config... yes 
Using config values from /usr/bin/pg_config 
checking for libpq-fe.h... yes 
checking for libpq/libpq-fs.h... yes 
checking for pg_config_manual.h... yes 
checking for PQconnectdb() in -lpq... no 
checking for PQconnectdb() in -llibpq... no 
checking for PQconnectdb() in -lms/libpq... no 
Can't find the PostgreSQL client library (libpq) 
*** 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. 

Provided configuration options: 
    --with-opt-dir 
    --with-opt-include 
    --without-opt-include=${opt-dir}/include 
    --with-opt-lib 
    --without-opt-lib=${opt-dir}/lib 
    --with-make-prog 
    --without-make-prog 
    --srcdir=. 
    --curdir 
    --ruby=/opt/chef/embedded/bin/ruby 
    --with-pg 
    --without-pg 
    --with-pg-dir 
    --without-pg-dir 
    --with-pg-include 
    --without-pg-include=${pg-dir}/include 
    --with-pg-lib 
    --without-pg-lib=${pg-dir}/lib 
    --with-pg-config 
    --without-pg-config 
    --with-pg_config 
    --without-pg_config 
    --with-pqlib 
    --without-pqlib 
    --with-libpqlib 
    --without-libpqlib 
    --with-ms/libpqlib 
    --without-ms/libpqlib 


Gem files will remain installed in /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/pg-0.14.1 for inspection. 
Results logged to /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/pg-0.14.1/ext/gem_make.out 

Faulting bit nella mkmf.log è come fo llows:

have_library: checking for PQconnectdb() in -lpq... -------------------- no 

"gcc -o conftest -I/opt/chef/embedded/include/ruby-1.9.1/x86_64-linux -I/opt/chef/embedded/include/ruby-1.9.1/ruby/backward -I/opt/chef/embedded/include/ruby-1.9.1 -I. -I/opt/chef/embedded/include -I/usr/include/postgresql -I/opt/chef/embedded/include -fPIC conftest.c -L. -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L. -Wl,-rpath,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -rdynamic -Wl,-export-dynamic -L/usr/lib  -Wl,-R -Wl,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -lruby -lpq -lpthread -lrt -ldl -lcrypt -lm -lc" 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
collect2: ld returned 1 exit status 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <libpq-fe.h> 
4: 
5: /*top*/ 
6: int main() {return 0;} 
7: int t() { void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return 0; } 
/* end */ 

"gcc -o conftest -I/opt/chef/embedded/include/ruby-1.9.1/x86_64-linux -I/opt/chef/embedded/include/ruby-1.9.1/ruby/backward -I/opt/chef/embedded/include/ruby-1.9.1 -I. -I/opt/chef/embedded/include -I/usr/include/postgresql -I/opt/chef/embedded/include -fPIC conftest.c -L. -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L. -Wl,-rpath,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -rdynamic -Wl,-export-dynamic -L/usr/lib  -Wl,-R -Wl,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -lruby -lpq -lpthread -lrt -ldl -lcrypt -lm -lc" 
conftest.c: In function ‘t’: 
conftest.c:7:1: error: too few arguments to function ‘PQconnectdb’ 
/usr/include/postgresql/libpq-fe.h:243:16: note: declared here 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <libpq-fe.h> 
4: 
5: /*top*/ 
6: int main() {return 0;} 
7: int t() { PQconnectdb(); return 0; } 
/* end */ 

-------------------- 

have_library: checking for PQconnectdb() in -llibpq... -------------------- no 

"gcc -o conftest -I/opt/chef/embedded/include/ruby-1.9.1/x86_64-linux -I/opt/chef/embedded/include/ruby-1.9.1/ruby/backward -I/opt/chef/embedded/include/ruby-1.9.1 -I. -I/opt/chef/embedded/include -I/usr/include/postgresql -I/opt/chef/embedded/include -fPIC conftest.c -L. -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L. -Wl,-rpath,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -rdynamic -Wl,-export-dynamic -L/usr/lib  -Wl,-R -Wl,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -lruby -llibpq -lpthread -lrt -ldl -lcrypt -lm -lc" 
/usr/bin/ld: cannot find -llibpq 
collect2: ld returned 1 exit status 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <libpq-fe.h> 
4: 
5: /*top*/ 
6: int main() {return 0;} 
7: int t() { void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return 0; } 
/* end */ 

"gcc -o conftest -I/opt/chef/embedded/include/ruby-1.9.1/x86_64-linux -I/opt/chef/embedded/include/ruby-1.9.1/ruby/backward -I/opt/chef/embedded/include/ruby-1.9.1 -I. -I/opt/chef/embedded/include -I/usr/include/postgresql -I/opt/chef/embedded/include -fPIC conftest.c -L. -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L. -Wl,-rpath,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -rdynamic -Wl,-export-dynamic -L/usr/lib  -Wl,-R -Wl,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -lruby -llibpq -lpthread -lrt -ldl -lcrypt -lm -lc" 
conftest.c: In function ‘t’: 
conftest.c:7:1: error: too few arguments to function ‘PQconnectdb’ 
/usr/include/postgresql/libpq-fe.h:243:16: note: declared here 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <libpq-fe.h> 
4: 
5: /*top*/ 
6: int main() {return 0;} 
7: int t() { PQconnectdb(); return 0; } 
/* end */ 

-------------------- 

have_library: checking for PQconnectdb() in -lms/libpq... -------------------- no 

"gcc -o conftest -I/opt/chef/embedded/include/ruby-1.9.1/x86_64-linux -I/opt/chef/embedded/include/ruby-1.9.1/ruby/backward -I/opt/chef/embedded/include/ruby-1.9.1 -I. -I/opt/chef/embedded/include -I/usr/include/postgresql -I/opt/chef/embedded/include -fPIC conftest.c -L. -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L. -Wl,-rpath,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -rdynamic -Wl,-export-dynamic -L/usr/lib  -Wl,-R -Wl,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -lruby -lms/libpq -lpthread -lrt -ldl -lcrypt -lm -lc" 
/usr/bin/ld: cannot find -lms/libpq 
collect2: ld returned 1 exit status 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <libpq-fe.h> 
4: 
5: /*top*/ 
6: int main() {return 0;} 
7: int t() { void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return 0; } 
/* end */ 

"gcc -o conftest -I/opt/chef/embedded/include/ruby-1.9.1/x86_64-linux -I/opt/chef/embedded/include/ruby-1.9.1/ruby/backward -I/opt/chef/embedded/include/ruby-1.9.1 -I. -I/opt/chef/embedded/include -I/usr/include/postgresql -I/opt/chef/embedded/include -fPIC conftest.c -L. -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L. -Wl,-rpath,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -rdynamic -Wl,-export-dynamic -L/usr/lib  -Wl,-R -Wl,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -lruby -lms/libpq -lpthread -lrt -ldl -lcrypt -lm -lc" 
conftest.c: In function ‘t’: 
conftest.c:7:1: error: too few arguments to function ‘PQconnectdb’ 
/usr/include/postgresql/libpq-fe.h:243:16: note: declared here 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <libpq-fe.h> 
4: 
5: /*top*/ 
6: int main() {return 0;} 
7: int t() { PQconnectdb(); return 0; } 
/* end */ 

-------------------- 

Credo che il problema è che il pg gemma è legata contro un lib diverso da quello di PostgreSQL è stato costruito contro e la compilazione fallisce. Mi sto solo chiedendo se c'è qualcosa che potrei fare per aggirare questo problema? Qualche mente brillante e sorprendente? Cheers

risposta

3

Sono stato in grado di ottenere l'installazione di pg gem scaricando il sorgente postgresql e compilandolo costruendo le librerie in/opt/chef/embedded. Questo non è ottimale, ma dovrebbe funzionare (avvertimento: non l'ho provato in una ricetta o un programma di rubino):

apt-get install -y build-essential 
apt-get build-dep -y postgresql 
wget http://ftp.postgresql.org/pub/source/v9.2.1/postgresql-9.2.1.tar.gz 
tar -zxvf postgresql-9.2.1.tar.gz 
cd postgresql-9.2.1 
export MAJOR_VER=9.2 
./configure \ 
    --prefix=/opt/chef/embedded \ 
    --mandir=/opt/chef/embedded/share/postgresql/${MAJOR_VER}/man \ 
    --docdir=/opt/chef/embedded/share/doc/postgresql-doc-${MAJOR_VER} \ 
    --sysconfdir=/etc/postgresql-common \ 
    --datarootdir=/opt/chef/embedded/share/ \ 
    --datadir=/opt/chef/embedded/share/postgresql/${MAJOR_VER} \ 
    --bindir=/opt/chef/embedded/lib/postgresql/${MAJOR_VER}/bin \ 
    --libdir=/opt/chef/embedded/lib/ \ 
    --libexecdir=/opt/chef/embedded/lib/postgresql/ \ 
    --includedir=/opt/chef/embedded/include/postgresql/ \ 
    --enable-nls \ 
    --enable-integer-datetimes \ 
    --enable-thread-safety \ 
    --enable-debug \ 
    --with-gnu-ld \ 
    --with-pgport=5432 \ 
    --with-openssl \ 
    --with-libedit-preferred \ 
    --with-includes=/opt/chef/embedded/include \ 
    --with-libs=/opt/chef/embedded/lib 
make 
sudo make install 
sudo /opt/chef/embedded/bin/gem install pg -- --with-pg-config=/opt/chef/embedded/lib/postgresql/9.2/bin/pg_config 

https://gist.github.com/3954641

+0

Questo è quello che abbiamo finito per fare. Ma non ci piace per 2 motivi: 1.) Ogni aggiornamento Postgres significa ricompilare 2.) ottenere questo lavoro nel cookbook postgres richiederebbe un sacco di cambiamenti e in genere mette a posto le cose. Tuttavia grazie per la tua risposta – gyre

+0

Sì, è totalmente sub-ottimale. È solo un problema se si desidera utilizzare la gemma pg in Chef, ad esempio nelle risorse del libro di ricette del database Opscode per il database postgresql e la gestione degli utenti. Se stai usando pg solo nella tua app, questo non è richiesto, basta installare la gemma sotto il Ruby che la tua app usa (non raccomandiamo Ruby nel pacchetto omnibus). – jtimberman

+0

Cioè, non consigliamo il rubino dello chef per la tua app, solo per lo Chef :-). – jtimberman

1

Prova ad aggiungere "-lssl -lcrypto" durante la compilazione. Ha funzionato per me durante la compilazione di applicazioni basate su openssl