ruby-pg icon indicating copy to clipboard operation
ruby-pg copied to clipboard

Big Sur Gem Install Issues

Open daBee opened this issue 3 years ago • 5 comments

I can't get pg installed using the preferred method using homebrew. I'm using the postgres.app which is the only way I found to get postgres installed on this brand new box. This app has its own encapsulation with regards to psql, pg_config and other apps, config files, etc.

Big Sur on Mac Mini M1.

Yes, I've read the other posts about Big Sur, but they are much earlier than this post, which is mid-March. Different feedback as well. I can get this to work using the since-deleted homebrew installation of pg_config, but that's cheating. Here is the gem installation that I've tried.

~ ❯ gem install pg -- --with-pg-config=/Applications/Postgres.app/Contents/Versions/12/bin/pg_config --with--with-libpq-dir=/opt/homebrew/opt/libpq

Building native extensions with: '--with-pg-config=/Applications/Postgres.app/Contents/Versions/12/bin/pg_config --with--with-libpq-dir=/opt/homebrew/opt/libpq'
This could take a while...
ERROR:  Error installing pg:
  ERROR: Failed to build gem native extension.

    current directory: /Users/rich/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/pg-1.2.3/ext
/Users/rich/.rbenv/versions/2.7.2/bin/ruby -I /Users/rich/.rbenv/versions/2.7.2/lib/ruby/2.7.0 -r ./siteconf20210317-69773-cz32yu.rb extconf.rb --with-pg-config\=/Applications/Postgres.app/Contents/Versions/12/bin/pg_config --with--with-libpq-dir\=/opt/homebrew/opt/libpq
Using config values from /Applications/Postgres.app/Contents/Versions/12/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
  --without-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/rich/.rbenv/versions/2.7.2/bin/$(RUBY_BASE_NAME)
  --with-pg
  --without-pg
  --enable-windows-cross
  --disable-windows-cross
  --with-pg-config
  --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-pq-dir
  --without-pq-dir
  --with-pq-include
  --without-pq-include=${pq-dir}/include
  --with-pq-lib
  --without-pq-lib=${pq-dir}/lib
  --with-pqlib
  --without-pqlib
  --with-libpq-dir
  --without-libpq-dir
  --with-libpq-include
  --without-libpq-include=${libpq-dir}/include
  --with-libpq-lib
  --without-libpq-lib=${libpq-dir}/lib
  --with-libpqlib
  --without-libpqlib
  --with-ms/libpq-dir
  --without-ms/libpq-dir
  --with-ms/libpq-include
  --without-ms/libpq-include=${ms/libpq-dir}/include
  --with-ms/libpq-lib
  --without-ms/libpq-lib=${ms/libpq-dir}/lib
  --with-ms/libpqlib
  --without-ms/libpqlib

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/rich/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/extensions/arm64-darwin-20/2.7.0/pg-1.2.3/mkmf.log

extconf failed, exit code 1

#############################################################
## mkmf.log:

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

"clang -o conftest -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0/arm64-darwin20 -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0/ruby/backward -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0 -I. -I/Applications/Postgres.app/Contents/Versions/12/include -I/Users/rich/.rbenv/versions/2.7.2/include  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/Users/rich/.rbenv/versions/2.7.2/lib -L/Applications/Postgres.app/Contents/Versions/12/lib -L. -L/Users/rich/.rbenv/versions/2.7.2/lib  -fstack-protector-strong -Wl,-rpath,/Applications/Postgres.app/Contents/Versions/12/lib     -lruby.2.7 -lpq   "
ld: warning: ignoring file /Applications/Postgres.app/Contents/Versions/12/lib/libpq.dylib, building for macOS-arm64 but attempting to link with file built for macOS-x86_64
Undefined symbols for architecture arm64:
  "_PQconnectdb", referenced from:
      _t in conftest-e19fd3.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: #include <libpq-fe.h>
 4: 
 5: /*top*/
 6: extern int t(void);
 7: int main(int argc, char **argv)
 8: {
 9:   if (argc > 1000000) {
10:     int (* volatile tp)(void)=(int (*)(void))&t;
11:     printf("%d", (*tp)());
12:   }
13: 
14:   return !!argv[argc];
15: }
16: int t(void) { void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return !p; }
/* end */

"clang -o conftest -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0/arm64-darwin20 -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0/ruby/backward -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0 -I. -I/Applications/Postgres.app/Contents/Versions/12/include -I/Users/rich/.rbenv/versions/2.7.2/include  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/Users/rich/.rbenv/versions/2.7.2/lib -L/Applications/Postgres.app/Contents/Versions/12/lib -L. -L/Users/rich/.rbenv/versions/2.7.2/lib  -fstack-protector-strong -Wl,-rpath,/Applications/Postgres.app/Contents/Versions/12/lib     -lruby.2.7 -lpq   "
conftest.c:16:13: error: conflicting types for 'PQconnectdb'
extern void PQconnectdb();
            ^
/Applications/Postgres.app/Contents/Versions/12/include/libpq-fe.h:263:16: note: previous declaration is here
extern PGconn *PQconnectdb(const char *conninfo);
               ^
conftest.c:17:27: error: too few arguments to function call, single argument 'conninfo' was not specified
int t(void) { PQconnectdb(); return 0; }
              ~~~~~~~~~~~ ^
/Applications/Postgres.app/Contents/Versions/12/include/libpq-fe.h:263:1: note: 'PQconnectdb' declared here
extern PGconn *PQconnectdb(const char *conninfo);
^
2 errors generated.
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: #include <libpq-fe.h>
 4: 
 5: /*top*/
 6: extern int t(void);
 7: int main(int argc, char **argv)
 8: {
 9:   if (argc > 1000000) {
10:     int (* volatile tp)(void)=(int (*)(void))&t;
11:     printf("%d", (*tp)());
12:   }
13: 
14:   return !!argv[argc];
15: }
16: extern void PQconnectdb();
17: int t(void) { PQconnectdb(); return 0; }
/* end */

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

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

"clang -o conftest -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0/arm64-darwin20 -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0/ruby/backward -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0 -I. -I/Applications/Postgres.app/Contents/Versions/12/include -I/Users/rich/.rbenv/versions/2.7.2/include  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/Users/rich/.rbenv/versions/2.7.2/lib -L/Applications/Postgres.app/Contents/Versions/12/lib -L. -L/Users/rich/.rbenv/versions/2.7.2/lib  -fstack-protector-strong -Wl,-rpath,/Applications/Postgres.app/Contents/Versions/12/lib     -lruby.2.7 -llibpq   "
ld: library not found for -llibpq
clang: error: linker command failed with exit code 1 (use -v to see invocation)
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: #include <libpq-fe.h>
 4: 
 5: /*top*/
 6: extern int t(void);
 7: int main(int argc, char **argv)
 8: {
 9:   if (argc > 1000000) {
10:     int (* volatile tp)(void)=(int (*)(void))&t;
11:     printf("%d", (*tp)());
12:   }
13: 
14:   return !!argv[argc];
15: }
16: int t(void) { void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return !p; }
/* end */

"clang -o conftest -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0/arm64-darwin20 -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0/ruby/backward -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0 -I. -I/Applications/Postgres.app/Contents/Versions/12/include -I/Users/rich/.rbenv/versions/2.7.2/include  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/Users/rich/.rbenv/versions/2.7.2/lib -L/Applications/Postgres.app/Contents/Versions/12/lib -L. -L/Users/rich/.rbenv/versions/2.7.2/lib  -fstack-protector-strong -Wl,-rpath,/Applications/Postgres.app/Contents/Versions/12/lib     -lruby.2.7 -llibpq   "
conftest.c:16:13: error: conflicting types for 'PQconnectdb'
extern void PQconnectdb();
            ^
/Applications/Postgres.app/Contents/Versions/12/include/libpq-fe.h:263:16: note: previous declaration is here
extern PGconn *PQconnectdb(const char *conninfo);
               ^
conftest.c:17:27: error: too few arguments to function call, single argument 'conninfo' was not specified
int t(void) { PQconnectdb(); return 0; }
              ~~~~~~~~~~~ ^
/Applications/Postgres.app/Contents/Versions/12/include/libpq-fe.h:263:1: note: 'PQconnectdb' declared here
extern PGconn *PQconnectdb(const char *conninfo);
^
2 errors generated.
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: #include <libpq-fe.h>
 4: 
 5: /*top*/
 6: extern int t(void);
 7: int main(int argc, char **argv)
 8: {
 9:   if (argc > 1000000) {
10:     int (* volatile tp)(void)=(int (*)(void))&t;
11:     printf("%d", (*tp)());
12:   }
13: 
14:   return !!argv[argc];
15: }
16: extern void PQconnectdb();
17: int t(void) { PQconnectdb(); return 0; }
/* end */

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

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

"clang -o conftest -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0/arm64-darwin20 -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0/ruby/backward -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0 -I. -I/Applications/Postgres.app/Contents/Versions/12/include -I/Users/rich/.rbenv/versions/2.7.2/include  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/Users/rich/.rbenv/versions/2.7.2/lib -L/Applications/Postgres.app/Contents/Versions/12/lib -L. -L/Users/rich/.rbenv/versions/2.7.2/lib  -fstack-protector-strong -Wl,-rpath,/Applications/Postgres.app/Contents/Versions/12/lib     -lruby.2.7 -lms/libpq   "
ld: library not found for -lms/libpq
clang: error: linker command failed with exit code 1 (use -v to see invocation)
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: #include <libpq-fe.h>
 4: 
 5: /*top*/
 6: extern int t(void);
 7: int main(int argc, char **argv)
 8: {
 9:   if (argc > 1000000) {
10:     int (* volatile tp)(void)=(int (*)(void))&t;
11:     printf("%d", (*tp)());
12:   }
13: 
14:   return !!argv[argc];
15: }
16: int t(void) { void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return !p; }
/* end */

"clang -o conftest -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0/arm64-darwin20 -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0/ruby/backward -I/Users/rich/.rbenv/versions/2.7.2/include/ruby-2.7.0 -I. -I/Applications/Postgres.app/Contents/Versions/12/include -I/Users/rich/.rbenv/versions/2.7.2/include  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/Users/rich/.rbenv/versions/2.7.2/lib -L/Applications/Postgres.app/Contents/Versions/12/lib -L. -L/Users/rich/.rbenv/versions/2.7.2/lib  -fstack-protector-strong -Wl,-rpath,/Applications/Postgres.app/Contents/Versions/12/lib     -lruby.2.7 -lms/libpq   "
conftest.c:16:13: error: conflicting types for 'PQconnectdb'
extern void PQconnectdb();
            ^
/Applications/Postgres.app/Contents/Versions/12/include/libpq-fe.h:263:16: note: previous declaration is here
extern PGconn *PQconnectdb(const char *conninfo);
               ^
conftest.c:17:27: error: too few arguments to function call, single argument 'conninfo' was not specified
int t(void) { PQconnectdb(); return 0; }
              ~~~~~~~~~~~ ^
/Applications/Postgres.app/Contents/Versions/12/include/libpq-fe.h:263:1: note: 'PQconnectdb' declared here
extern PGconn *PQconnectdb(const char *conninfo);
^
2 errors generated.
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: #include <libpq-fe.h>
 4: 
 5: /*top*/
 6: extern int t(void);
 7: int main(int argc, char **argv)
 8: {
 9:   if (argc > 1000000) {
10:     int (* volatile tp)(void)=(int (*)(void))&t;
11:     printf("%d", (*tp)());
12:   }
13: 
14:   return !!argv[argc];
15: }
16: extern void PQconnectdb();
17: int t(void) { PQconnectdb(); return 0; }
/* end */

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

daBee avatar Mar 17 '21 13:03 daBee

I am having a similar problem after trying the following commands for Rails 5.0.7.2 running the latest version of postgres 13.

I'm using version '0.21.0' on my 10-year-old High Sierra computer running postgres 9.6.

sudo ARCHFLAGS="-arch x86_64" gem install pg -v '0.21.0'

sudo ARCHFLAGS="-arch x86_64" gem install pg -v '0.21.0' -- --with-pg-config=/Applications/Postgres.app/Contents/Versions/latest/bin/pg_config

sudo ARCHFLAGS="-arch x86_64" gem install pg -v '0.21.0' -- --with-libpq-lib

I can't find any documentation about these options.

With all the posts I've seen on Stack Overflow I wonder if the problem is with Big Sur. I've lost count of the number of older posts with similar errors.

NOTE: The last gem release (1.2.3) was on March 18, 2020. I hope that all contributors are okay since the COVID-19 pandemic started to hit around the world about that time.

lightbe avatar May 21 '21 20:05 lightbe

Seeing the same problem here on an M1 MacBook Pro. The commonest solution I have seen online is to use libpq for the config sudo gem install pg -- --with-pg-config='/usr/local/opt/libpq/bin/pg_config' but that brings back the classic 'libpq-fe.h' file not found error, which also seems to be something people encountered frequently back in the day but rarely now.

glenatron avatar Jun 24 '21 09:06 glenatron

Ah, I needed to find the libpq pg_confic, the /usr/local/opt path was wrong. Once I ran it with the exact /opt/homebrew/Cellar/libpq/13.3/bin/pg_config path, it came through for me.

glenatron avatar Jun 24 '21 09:06 glenatron

installing pg with the following command worked for me: arch -arm64 gem install pg Generally those gems that are building with native extension and showing error can be resolved by using the prefix: arch -arm64 Note: this is for M1 macs

lit-poks avatar Jul 13 '21 07:07 lit-poks

If you are getting the following issue in Mac M1 pro, Silicon chip

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)

Solution:

Install libpq via homebrew and add it to the PATH

brew install libpq
echo 'export PATH="/opt/homebrew/opt/libpq/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
OR ~/bash_profile instead of ~/.zshrc if you use that.

Now try

bundle install # OR
gem install pg

This works for me.

abhilashak avatar May 10 '22 07:05 abhilashak

That was not the specific trace I was seeing, but @abhilashak's answer worked for me on an M1 Mac running Ventura

philliplongman avatar Jan 16 '23 22:01 philliplongman