Архитектура ARM64 (чип M1): не удается установить pg gem (с использованием PostgresApp)

#ruby-on-rails #rubygems #pg #apple-silicon #postgresapp

#ruby-on-rails #rubygems #pg #apple-silicon #postgresapp

Вопрос:

Я пытался установить проект rails на свой компьютер (Macbook Pro 2020 с M1) под управлением Big Sur.

У меня установлено PostgresApp.

При запуске bundle install не удается создать pg gem, поэтому я попытался установить gem вручную (выполнив gem install pg — попробовал также с gem install pg -- --with-pg-config=/Applications/Postgres.app/Contents/Versions/10/bin/pg_config помощью ).

Я получаю сообщение об ошибке:

 ERROR:  Error installing pg:
ERROR: Failed to build gem native extension.

Can't find the PostgreSQL client library (libpq)
*** extconf.rb failed ***
 

При проверке журналов ошибок я вижу:

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

ld: warning: ignoring file /Applications/Postgres.app/Contents/Versions/13/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-db479f.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:     printf("%p", amp;t);
11:   }
12:
13:   return 0;
14: }
15: int t(void) { void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return !p; }
/* end */
 

Есть идеи, как это решить?

Комментарии:

1. Вам нужно использовать Postgres.app? Я столкнулся с той же проблемой. Я удалил его и использовал домашнюю версию postgres. Работает хорошо.

2. @IngmarasKeleras да, в родной версии есть некоторые проблемы с сопоставлением в macOS.

Ответ №1:

Для тех, кто просто пытается установить pg gem и не заботится о PostgresApp, ключом к исправлению pg на M1 является обеспечение существования libpq . Эти шаги позволили мне установить pg gem на мой mac M1, не прибегая к использованию флагов версии x86 или сборки:

 brew install libpq
export PATH="/opt/homebrew/opt/libpq/bin:$PATH"
gem install pg
 

Комментарии:

1. Это должно быть принятым ответом.

2. Это сработало для меня! Согласен, это должен быть принятый ответ.

3. Спасибо! Работает для меня на M1 pro

4. Это не оптимально, поскольку пропускает Postgres.app, но возврат к x86 homebrew кажется мне безумным. Я не вижу, чтобы я делал это, не сталкиваясь с другими многочисленными проблемами совместимости. Но я могу ошибаться. В любом случае это кажется экстремальным.

5. Долбаный гений.

Ответ №2:

Я столкнулся с той же проблемой с M1 ruby pg gem. Проблема заключалась в том, что в моей системе было сочетание двоичных файлов ARM x86, и pg , по-видимому, в настоящее время их можно скомпилировать только с x86. К вашему сведению, в репозитории github появились новые проблемы, так что, надеюсь, они скоро будут решены здесь

Моя работа вокруг:

  1. удалите homebrew rbenv на основе ARM и удалите ваши .gem .rbenv каталоги из вашего домашнего каталога (инструкции по удалению homebrew)
  2. переустановите homebrew как x86 на базе Intel
 $ arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
 
  1. установите rbenv как x86 (или любой другой предпочитаемый вами менеджер версий ruby).
 $ arch -x86_64 brew install rbenv
$ arch -x86_64 rbenv install 2.7.2
 
  1. (необязательно) для postgres.app вы можете предварительно настроить, где находится pg-config, чтобы вам не приходилось запускать ручную установку gem, когда она захлебывается. например
 $ bundle config build.pg- --with-pg-config=/Applications/Postgres.app/Contents/Versions/latest/bin/pg_config
 
  1. обновите свой проект и наслаждайтесь ruby на rosetta 2 (пока)
 $ bundle install
$ rails s
 

Комментарии:

1. В итоге я установил собственный postgres (не хотел, чтобы ruby запускался «эмулируемым» из-за проблем с производительностью). Я подожду, пока postgres.app не выпустит версию ARM64 🙂

2. @Tiago Я задал вопрос об этом, надеясь, что мне не придется прибегать к установке postgres с использованием homebrew. Думаю, я сделаю то же самое. Мой текущий экземпляр находится на компьютере High Sierra 10-летней давности, поэтому я хочу перейти на него на свой компьютер M1.

3. Postgres.app теперь выпустила бета-версию arm, доступную здесь: github.com/PostgresApp/PostgresApp/releases/tag/v2.5beta1 , драгоценный камень pg теперь устанавливается вместе с ним!

Ответ №3:

Столкнулся с той же проблемой с brew PostgreSQL, но я успешно установил pg gem с Ruby 2.7 на macOS M1 (12 Monterey), у меня установлены как x86, так и arm64 brew. Поскольку pg должен быть скомпилирован с помощью x86 libpq, я установил libpq с помощью x86 brew

which brow
brow: aliased to arch --x86_64 /usr/local/Homebrew/bin/brew

❯ brow install libpq

❯ brew install PostgreSQL # Install arm64 PostgreSQL 
❯ brew services start postgresql
❯ ps -ef | grep postgresql
  501 23655     1   0  2:29PM ??         0:00.10 /opt/homebrew/opt/postgresql/bin/postgres -D /opt/homebrew/var/postgres

❯ which brew
/opt/homebrew/bin/brew
❯ brew -v
Homebrew 3.3.2-50-geca16a2
Homebrew/homebrew-core (git revision ec99d74792c; last commit 2021-11-05)
Homebrew/homebrew-cask (git revision 2ab51af9c3; last commit 2021-11-05)

 

Тогда я смогу установить драгоценный камень pg

 ❯ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19]

❯ gem install pg -v 1.2.3 -- --with-pq-dir=/usr/local/Cellar/libpq/13.3
Building native extensions with: '--with-pq-dir=/usr/local/Cellar/libpq/13.3'
This could take a while...
Successfully installed pg-1.2.3
Parsing documentation for pg-1.2.3
Done installing documentation for pg after 0 seconds
 

Но не удалось с Ruby 2.6, я не знаю, почему

 gem install pg -v 1.2.3 -- --with-pq-dir=/usr/local/Cellar/libpq/13.3
Building native extensions with: '--with-pq-dir=/usr/local/Cellar/libpq/13.3'
This could take a while...
ERROR:  Error installing pg:
    ERROR: Failed to build gem native extension.

    current directory: /Users/felix/.rvm/gems/ruby-2.6.6/gems/pg-1.2.3/ext
/Users/felix/.rvm/rubies/ruby-2.6.6/bin/ruby -I /Users/felix/.rvm/rubies/ruby-2.6.6/lib/ruby/site_ruby/2.6.0 -r ./siteconf20211105-41969-1oxcuyy.rb extconf.rb --with-pq-dir=/usr/local/Cellar/libpq/13.3
checking for pg_config... yes
Using config values from /opt/homebrew/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)
 

Обновление 2021-11-06

Успешно установлен pg и с Ruby 2.6.

  1. Сначала установите x86 postgresql
 # build Postgresql from source, as 
# Error: postgresql: no bottle available! 
# You can try to install from source with:  
# brew install --build-from-source postgresql


brow install --build-from-source postgresql

 
  1. Установите pg gem с префиксом
 gem install pg -v 1.2.3 -- --with-pg_config=/usr/local/Cellar/postgresql/13.3/bin/pg_config --with-pq-dir=/usr/local/Cellar/libpq/13.3 
 

Комментарии:

1. Спасибо вам за это, я искал решение этой brew install PostgreSQL проблемы, и это позволило мне работать gem install pg без ошибок.