Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gem install pg doesn't work on OSX Lion

There are variations of this question bouncing around SO, but none of them seem to have an answer that solves my problem.

I am running OSX Lion (10.7.3). The latest XCode is installed.

I've installed Postgres using the Postgres.app package from postgresapp.com.

But when I try to install the pg gem, I get a failure:

$ gem install pg -- --with-pg-config=/Applications/Postgres.app/Contents/MacOS/bin/pg_config Building native extensions.  This could take a while... ERROR:  Error installing pg:     ERROR: Failed to build gem native extension.          /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/bin/ruby extconf.rb --with-pg-config=/Applications/Postgres.app/Contents/MacOS/bin/pg_config Using config values from /Applications/Postgres.app/Contents/MacOS/bin/pg_config checking for libpq-fe.h... *** 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=/Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/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 /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:381:in `try_do': The compiler failed to generate an executable file. (RuntimeError) You have to install development tools first.     from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:506:in `try_cpp'     from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:970:in `block in find_header'     from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:790:in `block in checking_for'     from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:284:in `block (2 levels) in postpone'     from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:254:in `open'     from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:284:in `block in postpone'     from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:254:in `open'     from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:280:in `postpone'     from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:789:in `checking_for'     from /Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:969:in `find_header'     from extconf.rb:40:in `<main>'   Gem files will remain installed in /Users/disaacs/.rvm/gems/ruby-1.9.3-p125/gems/pg-0.13.2 for inspection. Results logged to /Users/disaacs/.rvm/gems/ruby-1.9.3-p125/gems/pg-0.13.2/ext/gem_make.out 

The output of the /Applications/Postgres.app/Contents/MacOS/bin/pg_config command is:

$ /Applications/Postgres.app/Contents/MacOS/bin/pg_config BINDIR = /Applications/Postgres.app/Contents/MacOS/bin DOCDIR = /Applications/Postgres.app/Contents/MacOS/share/doc HTMLDIR = /Applications/Postgres.app/Contents/MacOS/share/doc INCLUDEDIR = /Applications/Postgres.app/Contents/MacOS/include PKGINCLUDEDIR = /Applications/Postgres.app/Contents/MacOS/include INCLUDEDIR-SERVER = /Applications/Postgres.app/Contents/MacOS/include/server LIBDIR = /Applications/Postgres.app/Contents/MacOS/lib PKGLIBDIR = /Applications/Postgres.app/Contents/MacOS/lib LOCALEDIR = /Applications/Postgres.app/Contents/MacOS/share/locale MANDIR = /Applications/Postgres.app/Contents/MacOS/share/man SHAREDIR = /Applications/Postgres.app/Contents/MacOS/share SYSCONFDIR = /Applications/Postgres.app/Contents/MacOS/etc PGXS = /Applications/Postgres.app/Contents/MacOS/lib/pgxs/src/makefiles/pgxs.mk CONFIGURE = '--prefix=/Users/mattt/Code/heroku/Postgres/Postgres/Vendor/postgres' '--enable-thread-safety' '--with-openssl' '--with-gssapi' '--with-bonjour' '--with-krb5' '--with-libxml' '--with-libxslt' '--with-ossp-uuid' '--with-perl' '--with-python' CC = gcc CPPFLAGS = -I/usr/include/libxml2 CFLAGS = -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv CFLAGS_SL =  LDFLAGS = -Wl,-dead_strip_dylibs LDFLAGS_EX =  LDFLAGS_SL =  LIBS = -lpgport -lxslt -lxml2 -lssl -lcrypto -lgssapi_krb5 -lz -lreadline -lm  VERSION = PostgreSQL 9.1.3 

All those setting appear to be correct, except for the CONFIGURE variable (which seems to be referring to some other computer --I have no user named mattt).

The contents of the mkmf.log file are

"/usr/bin/gcc-4.2 -o conftest -I/Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/include/ruby-1.9.1/x86_64-darwin10.8.0 -I/Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/include/ruby-1.9.1/ruby/backward -I/Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/include/ruby-1.9.1 -I. -I/Users/disaacs/.rvm/usr/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE   -I/Applications/Postgres.app/Contents/MacOS/include  -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration  -fno-common -pipe conftest.c  -L. -L/Users/disaacs/.rvm/rubies/ruby-1.9.3-p125/lib -L/Users/disaacs/.rvm/usr/lib -L. -L/usr/local/lib -L/Applications/Postgres.app/Contents/MacOS/lib     -lruby.1.9.1  -lpthread -ldl -lobjc " checked program was: /* begin */ 1: #include "ruby.h" 2: 3: int main() {return 0;} /* end */ 

Any suggestions would be appreciated.

I've looked at the extconf.rb file, and after some debugging I've found that it is a call to

find_header ('libpq-fe.h') 

that is failing. Not because libpq-fe.h is not there, but because the find_header method itself is failing. I tried running find_header using irb, and got the same error:

$ irb 1.9.3-p125 :001 > require 'mkmf'  => true  1.9.3-p125 :002 > find_header 'libpq-fe.h' checking for libpq-fe.h... RuntimeError: The compiler failed to generate an executable file. You have to install development tools first. 

EDIT:

Found out my computer must be even more borked than I thought. I was doing bundle install for another project, and I got a very similar failure installing the sqlite3 gem.

checking for sqlite3.h... *** extconf.rb failed *** 

I've never had problems with the sqlite3 gem in the past.

like image 643
Dave Isaacs Avatar asked Apr 27 '12 04:04

Dave Isaacs


2 Answers

I finally found the cause of the problem! Though I am still uncertain how this problem came about.

Look at the contents of the mkmf.log file that is created when my install command fails (see my original post). It logs an attempt to run the following command

/usr/bin/gcc-4.2 ...and so on... 

There is no /usr/bin/gcc-4.2 on my system. There is a gcc, which is symbolically linked to llvm-gcc-4.2. My solution was to create another symbolic link

sudo ln -s llvm-gcc-4.2 gcc-4.2  

After making this link, my gem install pg command worked without any problems.

I found the solution to this problem on the Frozen Canuck blog in the post Error Installing Ruby Gem with C Extension. He speculates that the problem can be caused by conflicting versions of XCode. whatever the cause, my eternal thanks!

like image 164
Dave Isaacs Avatar answered Sep 21 '22 21:09

Dave Isaacs


On OS X Mavericks

sudo ln -s /usr/bin/llvm-gcc /usr/bin/gcc-4.2 

works.

like image 45
guapolo Avatar answered Sep 22 '22 21:09

guapolo