Problem installing a ruby gem on Ubuntu 16.04

Problem installing a ruby gem on Ubuntu 16.04

I have a problem installing a Rubygem pdfbeads on my Ubuntu 16.04 and wonder if anyone could help.

I never used or ran ruby before, but I needed this gem as it is required within a DJVU-to-PDF file converter script djvu2pdf.sh I'd like to use (if interested, see Converting DJVU to PDF on Ask Ubuntu).

Installing the pdfbeads current version 1.1.1 proved far from trivial. First, it required the installation of a newer version of ruby than the default version 2.3 available through apt on Ubuntu. So, to install the latest version ruby 2.7 I had to use snap instead. Next, the dependency gem rmagick was missing and had to be installed. That failed since it requires a newer C compiler version gcc-8 rather than the current Ubuntu default gcc-5. To be on the safe side, I installed multiple versions gcc-6, gcc-7, gcc-8 and gcc-9 allowing me to select the system default version by running sudo update-alternatives --config gcc. After all that, using the gcc-8 (v.8.3.0), I was able to successfully install the gem by running gem instal pdfbeads. Finally, I was ready to run the djvu2pdf.sh script.

However, running the script produces the following error in its last step:

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)

Line 35 in pdfbeads requires iconv and ruby can't find it. Normally ruby tries to load it from the existing ruby LOAD_PATH, and when it fails, it searches the installed gems. Apparently, iconv was not installed in any of the previous steps. Gem iconv is a wrapper class for the UNIX 95 iconv() function family, which translates string between various encoding systems. Note, however, that iconv is not listed as a pdfbeads 1.1.1 dependency on its rubygem.org dependencies page. Also note that unpacking the pdfbeads 1.1.1 gem reveals that it was not created using the ruby bundler as it contains no Gemfile. Therefore, modifying the script to run pdfbeads with bundle-exec is of no help.

Here's where I run into the problem I can't solve. When I try installing the missing iconv gem with gem install iconv I get numerous C compiler error messages too long to list here. I tried running this with each different version of gcc - 5, 6, 7, 8 and 9 and none of them succeeds. With version gcc 6.5.0 I got only one error message - make fails after this error:

$ 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 */

The unrecognized command line option ‘-Wimplicit-fallthrough=0’ is set within the configuration file /snap/ruby/169/lib/ruby/2.4.0/x86_64-linux/rbconfig.rb which lies on a snap disk partition which is mounted read-only:

$ 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

With version gcc 8.3.0, this first gcc invocation does not cause any error, however the next one does::

"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 */

followed by a whole bunch of other errors, too long to list.

Next, I tried earlier versions of ruby - 2.6, 2.5, 2.4 - and with gcc-8 (as required for RMagick 4.0.0 package compilation), last 2 versions produce slightly fewer errors. However, when using gcc 6.5.0 I get exactly the same error with ruby 2.4 and as with ruby 2.7.

Would anyone have any suggestion how to solve this problem?

相关内容