Пересборка ruby gem на примере hiredis в FreeBSD
Опубликовано 06.11.2011
Для тех админов, кому лень некогда копаться во внутренностях ruby и гуглить невнятные ошибки, но надо срочно поставить ruby gem, отсутствующий в портах. В моем случае — hiredis (ruby обвязка для одноименной библиотеки доступа к БД redis). Установка методом
gem install hiredis
не работает, т.к. где-то внутри жестко зашито название утилиты make, а FreeBSD-версия /usr/bin/make серьезно отличается по синтаксису от GNU Make, который все привыкли использовать, поэтому в STDERR сыпятся ошибки:
# gem install hiredis Fetching: hiredis-0.4.1.gem (100%) Building native extensions. This could take a while... ERROR: Error installing hiredis: ERROR: Failed to build gem native extension. /usr/local/bin/ruby18 extconf.rb "Makefile", line 11: Missing dependency operator "Makefile", line 21: Need an operator "Makefile", line 22: Missing dependency operator "Makefile", line 33: Need an operator "Makefile", line 43: Need an operator "Makefile", line 44: Need an operator "Makefile", line 82: Need an operator "Makefile", line 86: Need an operator "Makefile", line 88: warning: duplicate script for target "hiredis-example-ae" ignored "Makefile", line 89: Need an operator make: fatal errors encountered -- cannot continue creating Makefile make cc -I. -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I. -I/usr/include -fPIC -I/usr/include -O2 -pipe -fno-strict-aliasing -fPIC -I/usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis -c connection.c cc -I. -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I. -I/usr/include -fPIC -I/usr/include -O2 -pipe -fno-strict-aliasing -fPIC -I/usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis -c hiredis_ext.c cc -I. -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I. -I/usr/include -fPIC -I/usr/include -O2 -pipe -fno-strict-aliasing -fPIC -I/usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis -c reader.c cc -shared -o hiredis_ext.so connection.o hiredis_ext.o reader.o -L. -L/usr/local/lib -Wl,-R/usr/local/lib -L. -L/usr/lib -rpath=/usr/lib:/usr/local/lib -pthread -rdynamic /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis/libhiredis.a -Wl,-soname,hiredis_ext.so -Wl,-R -Wl,/usr/local/lib -L/usr/local/lib -lruby18 -lcrypt -lm -L/usr/lib -rpath=/usr/lib:/usr/local/lib -pthread cc: /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis/libhiredis.a: No such file or directory *** Error code 1 Stop in /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/ext/hiredis_ext. Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1 for inspection. Results logged to /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/ext/hiredis_ext/gem_make.out
GNU-версия make в freebsd называется gmake. Чтобы исправить вызов make в gem’е, пришлось его пересобрать. Вот полная версия установки пакета:
$ mkdir ~/hiredis && cd ~/hiredis $ gem fetch hiredis # в текущем каталоге появляется файл hiredis-0.4.1.gem Downloaded hiredis-0.4.1 $ gem unpack hiredis-0.4.1.gem Unpacked gem: '/home/bvk/hiredis/hiredis-0.4.1' $ gem spec hiredis-0.4.1.gem > hiredis.spec # извлекли спецификацию gem'а, по которой будем собирать пакет $ cd hiredis-0.4.1 # тут в ext/hiredis_ext/extconf.rb нужно поменять "make static" на "gmake static", # а в Rakefile "make clean" на "gmake clean" # собираем пакет $ gem build ../hiredis.spec WARNING: description and summary are identical Successfully built RubyGem Name: hiredis Version: 0.4.1 File: hiredis-0.4.1.gem # устанавливаем $ sudo gem install hiredis-0.4.1.gem Building native extensions. This could take a while... Successfully installed hiredis-0.4.1 1 gem installed Installing ri documentation for hiredis-0.4.1... Installing RDoc documentation for hiredis-0.4.1...
Теперь внимательно читаем porters handbook, делаем порт и далее действуем по правилам.