Как драгоценный камень решает, какой драгоценный камень для конкретной арки установить?

Например; если я хочу установить любой драгоценный камень, зависящий от архитектуры, например nokogiri (библиотека xml для Ruby), но для любого драгоценного камня, зависящего от архитектуры, ситуация такая же.

Я использую дистрибутив x86, но на ядре x86_64. Мой Ruby 32-битный, но gem install nokogiri устанавливает 64-битную версию (что приведет к ошибке, поскольку его общая библиотека не может ссылаться на 32-битный Ruby).

Как это решается? Мой рубин 32-битный, мне нужен 32-битный драгоценный камень. Проблема очень похожа в созвездии Armhf/arm64 или если я пытаюсь использовать любой другой уровень эмуляции (например, qemu-user, cygwin или Wine). В общем, я хочу установить драгоценный камень, который соответствует моему интерпретатору Ruby, а не тот, который чем-то определяется автоматически.

Что делать?

🤔 А знаете ли вы, что...
Синтаксис Ruby известен своей простотой и выразительностью.


1
68
1

Ответ:

Решено

Немного проследив за внутренностями Ruby, я нашел следующее:

  • Текущая используемая архитектура взята из внутреннего файла rbconfig.rb локального Ruby. В моей системе это /usr/lib/i386-linux-gnu/ruby/3.1.0/rbconfig.rb. Проверьте наличие RBCONFIG["arch"] в этом файле. Это обычный триплет архитектуры в стиле GNU.
  • Этот триплет определяется во время компиляции этого экземпляра Ruby, и не существует общего способа его изменить. Вы можете отредактировать этот файл, если хотите, но результатом, скорее всего, будет непригодный для использования интерпретатор Ruby.
  • Во время компиляции этот триплет возникает из команды arch, которая представляет собой тривиальный инструмент с тем же результатом, что и uname -m. Эта команда проверяет фактическую используемую архитектуру ядра, а не ту, для которой вы компилируете!

Так, например, в 32-битной системе на 64-битном ядре arch и uname -m сообщают x86-64, а не i386 (или x32).

Однако вы можете легко изменить это, установив флаг --target в скрипте компиляции. В конкретном случае, если вы хотите скомпилировать 32-битный Ruby в 64-битной системе, используйте configure --target=i386-linux-gnu, даже если это не кажется необходимым (поскольку вы используете 32-битный gcc).