Ruby проблема с установкой гемов в Ubuntu 16.04 - PullRequest
0 голосов
/ 08 февраля 2020

У меня проблема с установкой Rubygem pdfbeads на мою Ubuntu 16.04 и я думаю, что кто-нибудь может помочь.

Я никогда раньше не использовал или не запускал ruby, но мне понадобился этот драгоценный камень, так как он необходим в скрипте конвертера файлов DJVU в PDF djvu2pdf.sh Я хотел бы использовать (если интересно, см. Преобразование DJVU в PDF в Ask Ubuntu).

Установка pdfbeads текущей версии 1.1.1 оказалась далеко не тривиальной. Во-первых, потребовалась установка более новой версии ruby, чем версия 2.3 по умолчанию, доступная через apt в Ubuntu. Итак, для установки последней версии ruby 2.7 мне пришлось использовать snap. Затем гем зависимости rmagick отсутствовал и должен был быть установлен. Это не удалось, поскольку для этого требуется более новая C версия компилятора gcc-8, а не текущее значение по умолчанию Ubuntu gcc-5. Чтобы быть в безопасности, я установил несколько версий gcc-6, gcc-7, gcc-8 и gcc-9, что позволило мне выбрать версию системы по умолчанию, запустив sudo update-alternatives --config gcc. После всего этого, используя gcc-8 (v.8.3.0), я смог успешно установить гем, запустив gem instal pdfbeads. Наконец, я был готов запустить сценарий djvu2pdf.sh.

Однако при запуске сценария на последнем шаге возникает следующая ошибка:

Building the final pdf
Traceback (most recent call last):
    4: from ~/.gem/bin/pdfbeads:23:in '<main>'
    3: from ~/.gem/bin/pdfbeads:23:in 'load'
    2: from ~/.gem/gems/pdfbeads-1.1.1/bin/pdfbeads:35:in '<top (required)>'
    1: from /snap/ruby/172/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in 'require'
/snap/ruby/172/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in 'require': 
cannot load such file -- iconv (LoadError)

Строка 35 в pdfbeads требует iconv и ruby не могут его найти. Обычно ruby пытается загрузить его из существующего ruby LOAD_PATH, а в случае сбоя он ищет установленные драгоценные камни. Очевидно, iconv не был установлен ни на одном из предыдущих шагов. Gem iconv - это класс-оболочка для семейства функций UNIX 95 iconv(), который транслирует строки между различными системами кодирования. Однако обратите внимание, что iconv не указан как pdfbeads 1.1.1 зависимость на странице rubygem.org зависимости . Также обратите внимание, что распаковка драгоценного камня pdfbeads 1.1.1 показывает, что он не был создан с использованием ruby bundler, так как он не содержит Gemfile. Поэтому изменение сценария для запуска pdfbeads с помощью bundle-exec не поможет.

Здесь я сталкиваюсь с проблемой, которую не могу решить. Когда я пытаюсь установить отсутствующий iconv gem с gem install iconv, я получаю множество C сообщений об ошибках компилятора, слишком длинных для перечисления здесь. Я пытался запустить это с каждой другой версией gcc - 5, 6, 7, 8 и 9, и ни одна из них не удалась. С версией gcc 6.5.0 я получил только одно сообщение об ошибке - make терпит неудачу после этой ошибки:

$ cat mkmf.log 
"gcc -o conftest -I/snap/ruby/172/include/ruby-2.7.0/x86_64-linux -I/snap/ruby/172/include/ruby-2.7.0/ruby/backward 
-I/snap/ruby/172/include/ruby-2.7.0 -I. -O3 -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wduplicated-cond 
-Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings 
-Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long 
-Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality 
-Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format 
-Wsuggest-attribute=noreturn -Wunused-variable  -fPIC conftest.c  -L. -L/snap/ruby/172/lib -Wl,-rpath,/snap
/ruby/172/lib -L. -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,-rpath,/snap/ruby/172/lib 
-L/snap/ruby/172/lib -lruby  -lm   -lc"
gcc: error: unrecognized command line option ‘-Wimplicit-fallthrough=0’; did you mean ‘-Wno-fallthrough’?
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: int main(int argc, char **argv)
4: {
5:   return !!argv[argc];
6: }
/* end */

Нераспознанный параметр командной строки '-Wimplicit-fallthrough = 0' установлен в файле конфигурации /snap/ruby/169/lib/ruby/2.4.0/x86_64-linux/rbconfig.rb который находится на snap дисковом разделе, смонтированном только для чтения:

$ grep "[[:space:]]ro[[:space:],]" /proc/mounts | grep ruby
/dev/loop15 /snap/ruby/170 squashfs ro,nodev,relatime 0 0
/dev/loop33 /snap/ruby/169 squashfs ro,nodev,relatime 0 0

В версии gcc 8.3.0 этот первый вызов gcc не вызывает никаких ошибок, однако следующий вызов: :

"gcc -o conftest -I/snap/ruby/172/include/ruby-2.7.0/x86_64-linux -I/snap/ruby/172/include/ruby-2.7.0/ruby/backward 
-I/snap/ruby/172/include/ruby-2.7.0 -I.    -O3 -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wduplicated-cond 
-Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings 
-Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long 
-Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality 
-Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format 
-Wsuggest-attribute=noreturn -Wunused-variable -fPIC conftest.c -L. -L/snap/ruby/172/lib -Wl,-rpath,/snap/ruby/172/lib -L. 
-fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,-rpath,/snap/ruby/172/lib -L/snap/ruby/172/lib -lruby -lm -lc"
//snap/core18/current/lib/x86_64-linux-gnu/libcrypt.so.1: undefined reference to '__open_nocancel@GLIBC_PRIVATE'
/snap/ruby/172/lib/libruby.so: undefined reference to 'getrandom@GLIBC_2.25'
//snap/core18/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined reference to '_IO_enable_locks@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined reference to '__mmap@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined reference to '__munmap@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libdl.so.2: undefined reference to '_dl_catch_error@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined reference to '__mprotect@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libcrypt.so.1: undefined reference to '__snprintf@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined reference to '__tunable_get_val@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libcrypt.so.1: undefined reference to '__read_nocancel@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/librt.so.1: undefined reference to '__close_nocancel@GLIBC_PRIVATE'
/snap/ruby/172/lib/libruby.so: undefined reference to 'copy_file_range@GLIBC_2.27'
//snap/core18/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined reference to '__sigtimedwait@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libdl.so.2: undefined reference to '_dl_signal_error@GLIBC_PRIVATE'
/snap/ruby/172/lib/libruby.so: undefined reference to '__explicit_bzero_chk@GLIBC_2.25'
collect2: error: ld returned 1 exit status
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: #include <ruby/encoding.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 ((*)()))rb_enc_get; return !p; }
/* end */

, за которым следует целый ряд других ошибок, слишком длинных для перечисления.

Затем я попробовал более ранние версии ruby - 2.6, 2.5, 2.4 - и с gcc-8 (как требуется для компиляции пакета RMagick 4.0.0), последние 2 версии дают немного меньше ошибок. Однако при использовании gcc 6.5.0 я получаю точно такую ​​же ошибку с ruby 2.4 и с ruby 2.7.

У кого-нибудь есть какие-либо предложения, как решить эту проблему?

...