=== TLDR ===
Conforme as instruções , construa o Ruby com o compilador clang mais recente, ou pelo menos a mesma versão que o Rubygems usará para compilar as extensões nativas do Nokogiri libxml e libxsl.
Se estiver usando o RVM, construir a partir da origem com a --with-ggc=clang
bandeira foi o que fez por mim:
rvm install 2.2 --with-gcc=clang
Substitua 2.2
pela versão que desejar. --with-gcc=clang
garante que o RVM seja compilado a partir da fonte e use clang para fazer isso; caso contrário, o RVM pode ser um Ruby binário pré-construído, que foi o que me levou à loucura.
Em seguida, instale o Nokogiri normalmente usando Bundler ou Rubygems.
=== EM PROFUNDIDADE ===
Eu lutei com isso por um tempo. gem install nokogiri
deu-me:
checking for xmlParseDoc() in libxml/parser.h... no
checking for xmlParseDoc() in -lxml2... no
checking for xmlParseDoc() in -llibxml2... no
Cavando mkmf.log
vi:
conftest.c:15:27: error: too few arguments to function call, single argument 'cur' was not specified
int t(void) { xmlParseDoc(); return 0; }
O Nokogiri fornece seu próprio libxml e libxsl (a partir de 1.6.4). A assinatura definida na cópia local de Nokogiri do parser.h (encontrada no diretório gem install) é:
xmlParseDoc (const xmlChar *cur);
Portanto, não sabia como a chamada do método no uso do arquivo conftest.c hermeticamente selado não poderia corresponder ao arquivo de cabeçalho para parser.h.
Quando percebi que provavelmente tinha instalado um Ruby binário, removi e reinstalei usando --with-gcc=clang
(para forçar a compilação e usar o clang) e o problema foi resolvido:
rvm uninstall 2.2
rvm install 2.2 --with-gcc=clang
gem install nokogiri
Não sei exatamente por que isso funciona, pois o cabeçalho libxml do sistema /usr/include/libxml2/libxml/parser.h
tem a mesma assinatura que a cópia local de Nokogiri.
É estranho, mas funcionou. Apenas certifique-se de compilar um Ruby com clang.