Re Solaris
I was able to compile PHP 5.0.4 under Solaris 2.6 but I had to use gcc to do it. The source is not compatible with the Solaris C preprocessor. I did not have to install any of the gnu utilities (like sed etc) to get it to compile. It clean compiled & linked immediately using gcc 3.3.2.
Derleme Sorunları
Bu bölüm, derleme sırasında oluşan hatalardan sık rastlananlarla ilgili sorular ve çözümlerden derlenmiştir.
- PHP'nin en son sürümünü anonim SVN'den aldım, fakat configure betiği yok!
- PHP'yi Apache ile çalışmak üzere yapılandırırken sorun çıktı. httpd.h dosyasını bulamadığını söylüyor, fakat burası bunu sorabileceğim doğru yer mi bilmiyorum!
- PHP'yi yapılandırırken (./configure), şöyle bir hata alıyorum: checking lex output file root... ./configure: lex: command not found configure: error: cannot find output from lex; giving up
- Apache'yi başlatmaya çalışırken şöyle bir hata alıyorum: fatal: relocation error: file /bir/yol/libphp4.so: symbol ap_block_alarms: referenced symbol not found
- configure betiğini çalıştırdığımda başlık dosyalarını veya GD, gdbm veya başka bir paketin kütüphanelerini bulamadığını söylüyor!
- language-parser.tab.c dosyasını derlerken yytname undeclared diye bir takım hatalar veriyor
- make komutunu verdiğim zaman başta herşey iyi gidiyor, fakat son ilintileme işlemlerini yaparken bazı dosyaları bulamıyor.
- PHP ilintilenirken bazı tanımsız gönderimler olduğundan şikayet ediyor.
- PHP'nin Apache 1.3 ile nasıl derleneceğini kavrayamadım.
- Unix üzerinde PHP'yi Apache modülü olarak derleme adımlarını izleyerek PHP'yi kurdum. Tarayıcımla PHP dosyalarını görmek istediğim zaman tarayıcım dosyayı kaydedeceği yeri soruyor.
- --activate-module=src/modules/php4/libphp4.a yapılandırmasını kullandığını söylüyor ama bu dosya yok. Yapılandırmayı --activate-module=src/modules/php4/libmodphp4.a olarak değiştirdiğimde ise çalışmıyor!? Ne yapmalıyım?
- Apache'yi PHP'yi bir duruk modül olarak kullanacak şekilde --activate-module=src/modules/php4/libphp4.a ile yapılandırırken derleyicimin ANSI uyumlu olmadığı hatasını alıyorum.
- PHP'yi --with-apxs yapılandırması ile derlerken tuhaf hata iletileri alıyorum.
- Microtime'da make sırasında RUSAGE_'li iletiler ve bazı hatalar alıyorum.
- PHP'yi MySQL destekli derlerken, make işlemi sırasında şuna benzer bir hata iletisi alıyorum: ext/mysql/libmysql/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysql/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp'. Neyi yanlış yapıyorum?
- PHP sürümümü yükseltmek istiyorum. Mevcut PHP kurulumumun için kullanılan ./configure satırını nerede bulabilirim?
- PHP'yi GD kütüphanesi ile derlerken ya tuhaf derleme hataları ya da çalışma sırasında parçalama arızası alıyorum.
- PHP'yi derlerken rasgele hatalar alıyorum ve derleme işlemi duruyor. Bu arada, Solaris kullandığımı belirtmeliyim.
- PHP'nin en son sürümünü anonim SVN'den aldım, fakat configure betiği yok!
-
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.)
- PHP'yi Apache ile çalışmak üzere yapılandırırken sorun çıktı. httpd.h dosyasını bulamadığını söylüyor, fakat burası bunu sorabileceğim doğru yer mi bilmiyorum!
-
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.
-
PHP'yi yapılandırırken (./configure), şöyle bir hata
alıyorum:
checking lex output file root... ./configure: lex: command not found
configure: error: cannot find output from lex; giving up
-
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ğini çalıştırdığımda başlık dosyalarını veya GD, gdbm veya başka bir paketin kütüphanelerini bulamadığını söylüyor!
-
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:
Oturum kabuğu olarak bir csh kabuğu kullanıyorsanız (nedense?), aynı şeyi şöyle yapabilirsiniz:CPPFLAGS=-I/bir/yol/include LDFLAGS=-L/bir/yol/lib ./configureenv CPPFLAGS=-I/bir/yol/include LDFLAGS=-L/bir/yol/lib ./configure
- language-parser.tab.c dosyasını derlerken yytname undeclared diye bir takım hatalar veriyor
-
Bison sürümünüzü güncellemeniz gerekiyor. En son sürümü » http://www.gnu.org/software/bison/bison.html adresinde bulabilirsiniz.
- make komutunu verdiğim zaman başta herşey iyi gidiyor, fakat son ilintileme işlemlerini yaparken bazı dosyaları bulamıyor.
-
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.
- PHP ilintilenirken bazı tanımsız gönderimler olduğundan şikayet ediyor.
-
İ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.
- PHP'nin Apache 1.3 ile nasıl derleneceğini kavrayamadım.
-
Bu aslında çok kolay. Aşağıdaki adımları sırayla yerine getirin:
- En son Apache 1.3 paketini » http://httpd.apache.org/download.cgi adresinden indirin.
- Arşiv paketinin içeriğini bir yere açın. Örnek dizin: /usr/local/src/apache-1.3
- PHP'yi ilk olarak ./configure --with-apache=/<dizin>/apache-1.3 komutuyla yapılandıralım (<dizin> yerine kendi apache-1.3 kaynak dizininizi yazın).
- PHP'yi derleyip gerekli dosyaları Apache kaynak ağacındaki yerlerine kopyalamak için make ve ardından make install komutunu verin.
- /<dizin>/apache-1.3/src dizinine geçin ve Configuration dosyasını açıp şunu ekleyin: AddModule modules/php4/libphp4.a.
- ./configure ve ardından make komutunu verin.
- Artık PHP'nin etkin olduğu bir httpd çalıştırılabiliriniz var. Bu dosyayı sisteminizdeki mevcut çalıştırılabilirin üzerine kopyalayın.
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.
- Unix üzerinde PHP'yi Apache modülü olarak derleme adımlarını izleyerek PHP'yi kurdum. Tarayıcımla PHP dosyalarını görmek istediğim zaman tarayıcım dosyayı kaydedeceği yeri soruyor.
-
PHP modülünün bir şekilde PHP dosyalarını yorumlamak üzere devreye girmediği anlaşılıyor. Öncelikle şu üç şeyi yerine getirin:
- httpd çalıştırılabilirinin sizin derlediğiniz çalıştırılabilir olduğundan emin olun. Bunun için /bir/yol/bin/httpd -l komutunu deneyin. Komutun çıktısında mod_php4.c yer almıyorsa doğru çalıştırılabiliri kullanmıyorsunuz demektir. Doğru çalıştırılabiliri bulup onu kurun.
- Apache .conf dosyalarınızdan ilgili olanına PHP için doğru MIME türünü eklediğinizden emin olun. Gerekli satır: AddType application/x-httpd-php .php Ayrıca, bu AddType satırının bir <Virtualhost> veya <Directory> bloğunun içinde kalıp, betiğinizin çalıştığı konumda etkisiz olmadığından da emin olmalısınız.
- Son olarak, Apache yapılandırma dosyalarının yerleri Apache 1.2 ve Apache 1.3 için farklıdır. Bu bakımdan AddType satırını doğru dosyaya yazdığınızdan da emin olmalısınız. httpd.conf dosyanızda, Apache başlatılırkan hata vermesine yol açacak bir söz dizimi hatası yapmanız doğru dosyayı tespit etmek için yeterli olacaktır.
- --activate-module=src/modules/php4/libphp4.a yapılandırmasını kullandığını söylüyor ama bu dosya yok. Yapılandırmayı --activate-module=src/modules/php4/libmodphp4.a olarak değiştirdiğimde ise çalışmıyor!? Ne yapmalıyım?
-
libphp4.a dosyasının mevcut olduğunun "varsayıldığına" dikkat etmemişsiniz. Apache ikinci kez derlenirken o dosyayı kendisi üretecek!
- Apache'yi PHP'yi bir duruk modül olarak kullanacak şekilde --activate-module=src/modules/php4/libphp4.a ile yapılandırırken derleyicimin ANSI uyumlu olmadığı hatasını alıyorum.
-
Bu Apache'nin sonraki sürümlerinde düzeltilen gözden kaçmış bir hatadır.
- PHP'yi --with-apxs yapılandırması ile derlerken tuhaf hata iletileri alıyorum.
-
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:
Gördüğünüz bunun gibiyse sorunu buldunuz demektir. Sadece boşluklar veya 'q()' gibi hatalı değerler içerebilirler. Bu satırları aşağıdaki gibi değiştirin:my $CFG_CFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl my $CFG_LD_SHLIB = ' '; # substituted via Makefile.tmpl my $CFG_LDFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl
İkinci olası sorun kaynağı Red Hat 6.1 veya 6.2 kullanıyor olmaktır. Red Hat'ın derlediği apxs betiği hatalıdır. Şu satırı bulun: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
Ve şu satırla değiştirin:my $CFG_LIBEXECDIR = 'modules'; # substituted via APACI install
Sonuncusu, eğer Apache'yi yeniden yapılandırıp kuruyorsanız ./configure betiğini çalıştırdıktan sonra make komutunu vermeden bir make clean yapmalısınız.my $CFG_LIBEXECDIR = '/usr/lib/apache'; # substituted via APACI install
- Microtime'da make sırasında RUSAGE_'li iletiler ve bazı hatalar alıyorum.
-
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:
Sonuçta hata alıyorsanız, glibc başlık dosyaları sisteminizde kurulu değil demektir.$ cat >test.c <<X #include <sys/resource.h> X $ gcc -E test.c >/dev/null
- PHP'yi MySQL destekli derlerken, make işlemi sırasında şuna benzer bir hata iletisi alıyorum: ext/mysql/libmysql/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysql/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp'. Neyi yanlış yapıyorum?
-
Ö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 sürümümü yükseltmek istiyorum. Mevcut PHP kurulumumun için kullanılan ./configure satırını nerede bulabilirim?
-
PHP'yi derlediğiniz kaynak dizininzdeki config.nice dosyasında bulabilirsiniz. Bu yoksa, aşağıdaki betiği çalıştırın:
Çıktının başlarında PHP kurulumu için kullanılan ./configure satırını göreceksiniz.<?php phpinfo(); ?>
- PHP'yi GD kütüphanesi ile derlerken ya tuhaf derleme hataları ya da çalışma sırasında parçalama arızası alıyorum.
-
GD kütüphanesinin PHP'nin bağımlı olduğu kütüphanelerle (libpng gibi) ilintilenerek derlenmiş olduğundan emin olun.
- PHP'yi derlerken rasgele hatalar alıyorum ve derleme işlemi duruyor. Bu arada, Solaris kullandığımı belirtmeliyim.
-
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.
My problem was actually with mod_dav (which referred me here). Since they took the time to point people here, I thought I'd go ahead and add my two cents worth and expand on the above since it obviously affects PHP as well. I am running Fedora Core 3, Apache 2.0.53, & PHP 5.03. Apache and PHP were built from source.
The first suggestion in section 13 above was close, but not exactly what I needed. jimsteele's suggestion would have worked, but you would have to do it every time you use APXS. What I did was copy these lines:
my $CFG_CFLAGS_SHLIB = '-fpic -DSHARED_MODULE';
my $CFG_LD_SHLIB = 'gcc';
my $CFG_LDFLAGS_SHLIB = q(-shared);
and pasted them in the configuration section of my apxs file. Worked like a champ.
The configure script of PHP 5.3.0 has some test lines that use expr with the option --, my expr (version 2.0) does not except --. This causes a run of error messages from the shell like:
./configure: line 2xxx: test: =: unary operator expected
expr: syntax error
I used buildconf --force to see if it would fix this.
While it resulted in a quit different file, it still had the lines of code with expr -- in it.
When building PHP 5.3.x for Apache 2.4.x you may get an error in the apxs query for the MPM_NAME.
This is because the apxs included in Apache 2.4.x doesn't recognize that query anymore.
To resolve this issue one should modify the PHP configure file to use the right MPM module used by Apache.
To know the used MPM you can execute this command: apachectl -t -D DUMP_MODULES | grep mpm
Then, edit the PHP configure file, search for the APXS_MPM variable and force its value to prefork, event or worker according to the value returned by the previous command.
Hope it helps.
-
Fabio
@ anca-phpdoc at anca dot tv:
You can use ./configure --with-libxml-dir=/path_to_xml2-config
For the configure newbies among us:
If you update or reinstall any of the libraries used to compile in a different directory than they started out, you will need to make sure that you update the config.cache file (or re-generate it) so that configure will not look in the wrong place for the information.
On Mac OS X, for example, I updated my libxml using Fink. Fink placed the files in the /sw directory. However, php was still looking for important libxml files (such as xml2-config) in the old directory (/usr/bin/xml2-config). After updating config.cache with the new value of the xml2-config path, I was able to compile correctly.
If the option --with-apsx2=/path/to/apxs seems to have absolutely no effect and if the configure script ignores the Apache 2.x support, try to shutdown your Apache server (/path/to/bin/apachectl stop) and retry.
It worked here.
I post here because I was unable to find the information on the web.
I hope it will help someone.
Let say you have 2 apache ruuning, on one you want to have disable_functions set and on the other one you don't.
In fact I have (one) solution compiling two differents php modules with differents path to php.ini
using :
--with-config-file-path=/etc/php5 (for the first one)
--with-config-file-path=/etc/php5.nonchroote (for the second one)
for the second one I do not use "make install" but just
"cp .libs/libphp5.so /usr/lib/apache/1.3/libphp5.nonchroote.so"
Then you have to change the
LoadModule php5_module /usr/lib/apache/1.3/libphp5.nonchroote.so in the second httpd.conf
If you have customized your Apache to lie about its version number, you may need to edit configure to skip the version number check. Just /APACHE_VERSION in configure to find the instance(s) where configure checks to make sure you have the right combination of --with-apxs or --with_apxs2 and Apache 1.3 or 2.0. Assuming you're smart enough to remember which version of Apache you have, you can just delete or comment out the version check and continue to march.
Note on PHP5 setup under RedHat 7
Sometimes php5 fails to build with the following message:
[root@www bin]# ./php5
./php5: error while loading shared libraries: unexpected reloc type 0x80
Below is the configure script used:
# PHP5 CLI build, CGI/SAPI disabled
# Created by configure
'./configure' \
'--enable-libxml' \
'--with-mysql=/path_to_mysql' \
'--with-libxml=/path_to_my_libxml' \
'--program-suffix=5' \
'--disable-cgi' \
"$@"
I used the following trick to get round this:
0. If it is not a clean installation, run 'make clean' to get rid of improperly compiled files
1. run ./configure with required options
2. edit makefile:
2.1 find any LDFLAGS or PROGRAM_LDFLAGS definition
2.2 append -lstdc++ to the end of it
3. Run 'make'
4. Run 'make install'
5. Enjoy!!!
Compiling mod_php4 port on a clean freeBSD 4.8 install for Apache2 needed FOR_APACHE2= yes manually inserted into Makefile prior to version check.
Defining the right environment variables for my Apache "make" invocation allowed the correct "apxs" file to be generated for me. Your mileage may vary.
cd ../apache_1.3.22
CFLAGS_SHLIB="-fpic -DSHARED_MODULE" \
LD_SHLIB=gcc \
LDFLAGS_MOD_SHLIB="-shared" \
make
When you have installed PHP5 as a package from your distribution source list, such as yast or apt and want to upgrade the probably out of date PHP5 version make sure:
1. Apache-develope tools are installed so that you have APXS(2)
2. make a clean install which means:
make distclean
./configure --with-apxs2=/usr/sbin/apxs2 and other options
make && make test && make clean install
This will take a while, the make test basically tests your php installation if it passes all the bug reports, as of now about 8600.
Those thre lines will take a while longer! So dont panic, but read the output!
This should ensure, that you have .so files again (because of the APXS and that you have established a relation between the apache and php. Obviously you needed to deinstall the mod_php5 first. I would highly recommend to train this and verify that you have all the required kernel source files and compiler stuff on a virtual machine before doing that on your productive server!
