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

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

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

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

Что делать?

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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).

Если появится лучший ответ, трубку получит он, а не этот.

peterh 25.04.2024 20:29

Другие вопросы по теме