Bu bölüm, derleme sırasında oluşan hatalardan sık rastlananlarla ilgili sorular ve çözümlerden derlenmiştir.
Sisteminizde GNU autoconf paketi kuruluysa configure betiğini configure.in dosyasından üretebilirsiniz. Tek yapacağınız SVN sunucusundan aldığınız kaynak kök dizininde ./buildconf komutunu vermek olacak. (Ayrıca, configure betiğini --enable-maintainer-mode seçeneğiyle çalıştırmadıkça configure.in güncellendiğinde configure betiği yeniden oluşturulmaz, bu bakımdan configure.in değiştiğine dair uyarı alırsanız ne yapılacağı konusunda emin olmalısınız.) Bunun tek belirtisi configure veya config.status çalıştırıldıktan sonra Makefile dosyanızda @VARIABLE@ gibi şeyler bulunmasıdır.)
configure/setup betiğine Apache kaynak ağacınınızın en üst seviye dizininin yerini belirtmeniz lazım. Yani, seçenekte yolu --with-apache=/bir/yol/apache biçiminde belirteceksiniz, --with-apache=/bir/yol/apache/src biçiminde değil.
Kurulum talimatlarını dikkatle okuyun ve PHP'yi derlemeden önce kurulması gereken bison ve flex sürümlerine dikkat edin. Dağıtımınıza ve yapılandırmanıza bağlı olarak bison ve flex'i kaynak kodlarından kendiniz derleyebileceğiniz gibi RPM gibi bir paketten de kurabilirsiniz.
configure betiğine, standart yerlerinde bulunmayan başlık dosyalarının ve kütüphanelerin yerlerini ek seçeneklerle belirterek bunların C önişlemcisine ve ilintileyiciye aktarılmasını sağlamalısınız. Örnek:
CPPFLAGS=-I/bir/yol/include LDFLAGS=-L/bir/yol/lib ./configure
env CPPFLAGS=-I/bir/yol/include LDFLAGS=-L/bir/yol/lib ./configure
Bison sürümünüzü güncellemeniz gerekiyor. En son sürümü » http://www.gnu.org/software/bison/bison.html adresinde bulabilirsiniz.
Eski make sürümleri functions dizinindeki dosyaların derlenmiş sürümlerini aynı dizine koymuyor. cp *.o functions komutunu verdikten sonra tekrar make komutunu çalıştırıp bunun yararı olup olmadığına bakın. Eğer işe yarıyorsa GNU make'i en son sürümüne yükseltmeniz gerekiyor demektir.
İlintileme satırında ilgili kütüphanelerin hepsi var mı diye bir bakın. Örneğin, '-ldl' veya bulunmasını istediğiniz veritabanı desteği için gereken kütüphaneler satırda eksik olabilir.
Bazı kişiler Apache ile ilintileme sırasında '-ldl'nın hemen ardına libphp4.a eklemek zorunda kaldıklarını bildirdiler.
Bu aslında çok kolay. Aşağıdaki adımları sırayla yerine getirin:
Bilginize: İsterseniz, yeni Apache ./configure betiğini de kullanabilirsiniz. Apache kaynak paketiyle gelen README.configure dosyasındaki talimatları okuyunuz. Ayrıca PHP kaynak paketindeki INSTALL dosyasına da bakın.
PHP modülünün bir şekilde PHP dosyalarını yorumlamak üzere devreye girmediği anlaşılıyor. Öncelikle şu üç şeyi yerine getirin:
libphp4.a dosyasının mevcut olduğunun "varsayıldığına" dikkat etmemişsiniz. Apache ikinci kez derlenirken o dosyayı kendisi üretecek!
Bu Apache'nin sonraki sürümlerinde düzeltilen gözden kaçmış bir hatadır.
Burada bakacağınız üç şey var. Birincisi, bir sebeple Apache derlenirken apxs Perl betiği bazen hatalı derleyici ve ortam değişkenleri ile derleme yapmaya çalışabiliyor. apxs betiğini bulup (which apxs komutu yardımcı olabilir, genellikle yeri /usr/local/apache/bin/apxs veya /usr/sbin/apxs'tir) açın ve aşağıdaki satırların benzerleri var mı diye bir bakın:
my $CFG_CFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl my $CFG_LD_SHLIB = ' '; # substituted via Makefile.tmpl my $CFG_LDFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl
my $CFG_CFLAGS_SHLIB = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmpl my $CFG_LD_SHLIB = 'gcc'; # substituted via Makefile.tmpl my $CFG_LDFLAGS_SHLIB = q(-shared); # substituted via Makefile.tmpl
my $CFG_LIBEXECDIR = 'modules'; # substituted via APACI install
my $CFG_LIBEXECDIR = '/usr/lib/apache'; # substituted via APACI install
Kurulumun make kısmında sorun şuna benzer bir çıktıyla kendini gösteriyorsa:
microtime.c: In function `php_if_getrusage': microtime.c:94: storage size of `usg' isn't known microtime.c:97: `RUSAGE_SELF' undeclared (first use in this function) microtime.c:97: (Each undeclared identifier is reported only once microtime.c:97: for each function it appears in.) microtime.c:103: `RUSAGE_CHILDREN' undeclared (first use in this function) make[3]: *** [microtime.lo] Error 1 make[3]: Leaving directory `/home/master/php-4.0.1/ext/standard' make[2]: *** [all-recursive] Error 1 make[2]: Leaving directory `/home/master/php-4.0.1/ext/standard' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/home/master/php-4.0.1/ext' make: *** [all-recursive] Error 1
Sorun sisteminizde demektir. Kullandığınız glibc'nin glibc-devel paketini kurup /usr/include dosyalarınızı tamamlayın. Bunun PHP ile hiçbir alakası yoktur. Sorunu kendiniz çözmelisiniz. Basit bir deneme yapın:
$ cat >test.c <<X #include <sys/resource.h> X $ gcc -E test.c >/dev/null
Önce dikkat etmeniz gereken şey bunun ölümcül bir hata değil bir uyarı (Warning) olduğudur. Bu genellikle make işleminin son çıktısı olduğundan bir ölümcül hata gibi görünür ama değildir. Eğer derleyicinizi uyarıları vermeyecek şekilde ayarlarsanız bu iletiyi bir daha almazsınız. Ayrıca, PHP 4'te MySQL desteğinin öntanımlı olarak etkin olduğunu unutmayın.
Bilginize:
PHP 4.3.2 ve sonrasında, derleme (make) işleminin bitiminde şöyle bir çıktı göreceksiniz:
Türkçesi: Derleme tamamlandı. (tempnam ve tmpnam ile ilgili uyarıları rahatça gözardı edebilirsiniz).
Build complete.
(It is safe to ignore warnings about tempnam and tmpnam).
PHP'yi derlediğiniz kaynak dizininzdeki config.nice dosyasında bulabilirsiniz. Bu yoksa, aşağıdaki betiği çalıştırın:
<?php phpinfo(); ?>
GD kütüphanesinin PHP'nin bağımlı olduğu kütüphanelerle (libpng gibi) ilintilenerek derlenmiş olduğundan emin olun.
PHP'yi GNU araçları dışında araçlarla derlemek bazı sorunlara sebep olabilir. PHP'yi GNU araçlarıyla derlemeye çalışın. Örneğin, Solaris'te SunOS BSD uyumlu veya Solaris sürümü sed çalışmayacak fakat GNU veya Sun POSIX (xpg4) sürümleri çalışacaktır. Derleme için gerekli araçlar: » GNU sed, » GNU flex ve » GNU bison.