
Estou tentando criar um script de shell que fará o provisionamento inicial de um vagrant vm (executando o Ubuntu 12.04). Tudo (instalar php, apache, oracle instantclient, etc) funciona bem, exceto a última etapa - instalar a extensão php oci8:
pecl install oci8
Quando executo este comando manualmente (com prefixo sudo), ele funciona bem. Mas quando o script executa este comando ele falha assim:
running: make
/bin/bash /tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/libtool --mode=compile cc -I. -I/tmp/pear/temp/oci8 -DPHP_ATOM_INC -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/include -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/main -I/tmp/pear/temp/oci8 -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_CONFIG_H -g -O2 -c /tmp/pear/temp/oci8/oci8.c -o oci8.lo
libtool: compile: cc -I. -I/tmp/pear/temp/oci8 -DPHP_ATOM_INC -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/include -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/main -I/tmp/pear/temp/oci8 -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_CONFIG_H -g -O2 -c /tmp/pear/temp/oci8/oci8.c -fPIC -DPIC -o .libs/oci8.o
In file included from /tmp/pear/temp/oci8/oci8.c:48:0:
/tmp/pear/temp/oci8/php_oci8_int.h:60:17: fatal error: oci.h: No such file or directory
compilation terminated.
make: *** [oci8.lo] Error 1
ERROR: `make' failed
O pecl
script pede um caminho no início da instalação, e é aqui que acho que está o problema:
Please provide the path to the ORACLE_HOME directory. Use 'instantclient,/path/to/instant/client/lib' if you're compiling with Oracle Instant Client [autodetect] :
Para que a instalação continue você precisa fornecer o diretório ORACLE_HOME ou pressionar Enter. Eu tentei o seguinte sugerido em outro lugar, mas não funciona - a quebra de linha está faltando na saída (em comparação com a execução pecl
manual do comando), portanto, não emula corretamente o Enterpressionamento de tecla:
printf "\n" | pecl install oci8
Alguma sugestão sobre como posso fazer isso funcionar corretamente?
Responder1
Minha solução foi executar o seguinte comando:
export C_INCLUDE_PATH=/usr/include/oracle/11.2/client
e reinicie:
pecl insatlla oci8
Responder2
Eu realmente não encontrei uma solução de uso geral para esse problema. O que acabou funcionando no meu cenário específico (provisionamento via Vagrant) foi usar um manifesto Puppet para esta etapa específica de provisionamento, o que foi fácil, pois você só precisa especificá-lo na configuração do Vagrant após o provisionador Shell:
"pecl-install-oci8":
command => "pecl install oci8",
user => root,
timeout => 0,
tries => 5,
unless => "/usr/bin/php -m | grep -c oci8";
Por alguma razão que ainda não descobri, o Puppet instala o oci8 sem problemas.
E quando fiz isso, portei todo o meu script para um manifesto do Puppet, mas isso está fora do assunto.
Responder3
Normalmente, para esse tipo de instalação, você pode repetir os parâmetros que deseja definir. Envolvi a instrução inteira para que ela possa ser executada com permissões sudo
sudo sh -c "echo 'instantclient,/opt/oracle/instantclient' | pecl install oci8"