Kapitola 48. Sestavovacφ (kompilaΦnφ) problΘmy

Tato sekce shrnuje nejΦast∞j╣φ chyby, kterΘ se vyskytujφ p°i sestavovßnφ PHP.

1. Pomocφ anonymnφho p°φstupu do CVS jsem zφskal poslednφ verzi PHP, ale chybφ v nφ skript "configure"!
2. Mßm problΘm nakonfigurovat PHP tak, aby fungovalo se serverem Apache. Hlßsφ, ╛e nem∙╛e najφt httpd.h, ale ten je p°esn∞ tam, kde jsem uvedl, ╛e je!
3. Kdy╛ spustφm "configure", hlßsφ to, ╛e nem∙╛e najφt "include" soubory nebo knihovny pro GD, gdbm a n∞jakΘ dal╣φ balφky!
4. Kdy╛ se kompiluje soubor language-parser.tab.c, hlßsφ to chyby, kterΘ °φkajφ 'yytname undeclared'.
5. Kdy╛ spustφm "make", zdß se, ╛e b∞╛φ dob°e, ale havaruje, kdy╛ se pokou╣φ sestavit koneΦnou aplikaci s hlß╣enφm, ╛e nem∙╛e najφt n∞jakΘ soubory.
6. P°i sestavovßnφ PHP to hlßsφ mnoho nedefinovan²ch referencφ.
7. Nep°i╣el jsem na to, jak sestavit PHP pro Apache 1.3.
8. Postupoval jsem p°esn∞ podle instrukcφ k instalaci PHP ve verzi jako modul pro Apache na UNIXu, a moje PHP skripty se zobrazujφ v prohlφ╛eΦi nebo se je prohlφ╛eΦ sna╛φ ulo╛it jako soubory.
9. Hlßsφ to pou╛itφ --activate-module=src/modules/php4/libphp4.a, ale tento soubor neexistuje; proto jsem to zm∞nil na --activate-module=src/modules/php4/libmodphp4.a a ono to nefunguje? O co jde?
10. Kdy╛ zkusφm sestavit Apache s PHP jako╛to statick²m modulem pomocφ --activate-module=src/modules/php4/libphp4.a, hlßsφ to, ╛e m∙j kompilßtor nevyhovuje ANSI.
11. Kdy╛ zkusφm sestavit PHP s parametrem --with-apxs, dostanu zßhadnΘ chybovΘ zprßvy.
12. During 'make', I get errors in microtime, and a lot of 'RUSAGE_' stuff.
13. Chci upgradovat svΘ PHP. Kde najdu tvar °ßdku ./configure, kter² byl pou╛it pro sestavenφ stßvajφcφ instalace PHP?

1. Pomocφ anonymnφho p°φstupu do CVS jsem zφskal poslednφ verzi PHP, ale chybφ v nφ skript "configure"!

Musφte mφt nainstalovan² balφk "GNU autoconf", tak╛e m∙╛ete vygenerovat skript "configure" z "configure.in". Po sta╛enφ zdrojov²ch soubor∙ z CVS serveru spus╗te ./buildconf z nejvy╣╣φ adresß°ovΘ ·rovn∞ (pokud nespustφte "configure" s parametrem --enable-maintainer-mode, skript "configure" nebude automaticky aktualizovßn p°i zm∞n∞ souboru "configure.in", tak╛e se musφte ujistit, zda jste to ud∞lali ruΦn∞ potΘ, co byl "configure.in" zm∞n∞n. Jednφm z p°φznak∙ tohoto je nalezenφ element∙ jako @VARIABLE@ v souboru "Makefile" potom, co byl spu╣t∞n "configure" nebo "config.status").

2. Mßm problΘm nakonfigurovat PHP tak, aby fungovalo se serverem Apache. Hlßsφ, ╛e nem∙╛e najφt httpd.h, ale ten je p°esn∞ tam, kde jsem uvedl, ╛e je!

Pot°ebujete sd∞lit konfiguraΦnφmu/instalaΦnφmu skriptu umφst∞nφ nejvy╣╣φ ·rovn∞ zdrojov²ch soubor∙ Apache. To znamenß, ╛e specifikujete '--with-apache=/path/to/apache' a ne '--with-apache=/path/to/apache/src'.

3. Kdy╛ spustφm "configure", hlßsφ to, ╛e nem∙╛e najφt "include" soubory nebo knihovny pro GD, gdbm a n∞jakΘ dal╣φ balφky!

M∙╛ete urΦit, aby skript "configure" hledal hlaviΦkovΘ soubory a knihovny na nestandardnφch mφstech specifikacφ pomocn²ch p°φznak∙ pro C preprocesor a linker, nap°φklad:
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
Pokud pou╛φvßte csh (C-shell) jako vß╣ login shell (proΦ?), bylo by to:
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure

4. Kdy╛ se kompiluje soubor language-parser.tab.c, hlßsφ to chyby, kterΘ °φkajφ 'yytname undeclared'.

Musφte updatovat va╣i verzi programu Bison. Nejnov∞j╣φ verzi najdete na ftp://ftp.gnu.org/pub/gnu/bison/.

5. Kdy╛ spustφm "make", zdß se, ╛e b∞╛φ dob°e, ale havaruje, kdy╛ se pokou╣φ sestavit koneΦnou aplikaci s hlß╣enφm, ╛e nem∙╛e najφt n∞jakΘ soubory.

N∞kterΘ star╣φ verze programu "make" neuklßdajφ korektn∞ zkompilovanΘ verze soubor∙ umφst∞n²ch v adresß°i funkcφ do tΘho╛ adresß°e. Zkuste spustit "cp *.o functions" a potom znovu 'make', abyste vid∞li, zda to pomohlo. Pokud ano, m∞li byste opravdu nainstalovat nejnov∞j╣φ verzi "GNU make".

6. P°i sestavovßnφ PHP to hlßsφ mnoho nedefinovan²ch referencφ.

Podφvejte se do °ßdku, kde je popsßno sestavovßnφ a ujist∞te se, ╛e byly p°idßny na konec v╣echny pot°ebnΘ knihovny. ╚asto se stßvß, ╛e chybφ '-ldl' a n∞kterΘ knihovny pot°ebnΘ pro podporu databßze, kterou jste urΦili.

Pokud sestavujete pro Apache 1.2.x, nezapomn∞li jste p°idat odpovφdajφcφ informace na °ßdek EXTRA_LIBS v souboru "configure" a spustit skript pro konfiguraci Apache? Pro vφce informacφ se podφvejte do souboru INSTALL, kter² zφskßte s distribuΦnφm balφkem.

N∞kte°φ lidΘ takΘ hlßsili, ╛e pokud sestavovali pro Apache, museli p°idat '-ldl' t∞sn∞ za 'libphp4.a'.

7. Nep°i╣el jsem na to, jak sestavit PHP pro Apache 1.3.

Toto je nynφ velmi snadnΘ. Nßsledujte peΦliv∞ tyto kroky:

  • Stßhn∞te nejnov∞j╣φ distribuci Apache 1.3 z http://www.apache.org/dist/.

  • Rozbalte ji n∞kam, nap°φklad do /usr/local/src/apache-1.3.

  • Zkompilujte PHP nejd°φve spu╣t∞nφm ./configure --with-apache=/<path>/apache-1.3 (nahra∩te <path> aktußlnφ cestou k adresß°i apache-1.3).

  • Napi╣te 'make' a potom 'make install' k sestavenφ PHP a zkopφrovßnφ pot°ebn²ch soubor∙ do distribuΦnφho stromu Apache.

  • Zm∞≥te adresß° na /<path>/apache-1.3/src a upravte soubor Configuration. Do souboru p°idejte: AddModule modules/php4/libphp4.a.

  • Spus╗te './Configure' a potom 'make'.

  • Nynφ byste m∞li mφst hotovΘ soubory httpd pro prßci s PHP.

Poznßmka: : M∙╛ete pou╛φt takΘ nov² skript ./configure pro Apache. P°eΦt∞te si instrukce v README.configure, kter² je v distribuci Apache. NahlΘdn∞te takΘ do souboru INSTALL z distribuce PHP.

8. Postupoval jsem p°esn∞ podle instrukcφ k instalaci PHP ve verzi jako modul pro Apache na UNIXu, a moje PHP skripty se zobrazujφ v prohlφ╛eΦi nebo se je prohlφ╛eΦ sna╛φ ulo╛it jako soubory.

To znamenß, ╛e PHP modul nenφ z n∞jak²ch d∙vod∙ vyvolßvßn. D°φve, ne╛ budete shßn∞t dal╣φ pomoc, zkontrolujte t°i v∞ci:

  • Ujist∞te se, ╛e se spou╣tφ prßv∞ ten httpd, kter² jste zkompilovali. Zkuste spustit /path/to/binary/httpd -l

    Pokud v seznamu neuvidφte mod_php4.c, potom nespou╣tφte sprßvnou verzi httpd. Najd∞te s instalujte sprßvnou verzi.

  • Ujist∞te se, ╛e jste p°idali sprßvnou specifikaci Mime Type do soubor∙ .confpro Apache. M∞lo by tam b²t: AddType application/x-httpd-php3 .php3 (pro PHP 3)

    nebo AddType application/x-httpd-php .php (pro PHP 4)

    TakΘ se ujist∞te, ╛e tento °ßdek AddType nenφ ukryt uvnit° bloku <Virtualhost> nebo <Directory>, co╛ m∙╛e zabrßnit aplikaci pravidla na oblast, kde je umφst∞n testovacφ skript.

  • KoneΦn∞, implicitnφ umφst∞nφ konfiguraΦnφch soubor∙ Apache se mezi verzemi Apache 1.2 a 1.3 zm∞nilo. M∞li byste ov∞°it, ╛e soubor, do kterΘho jste p°idali °ßdek AddType je ten, kter² je skuteΦn∞ naΦφtßn. M∙╛ete zkusit vlo╛it n∞jakou p°φ╣ernou syntaktickou chybu do souboru httpd.conf nebo ud∞lat n∞jakou jinou zm∞nu tohoto rßzu - uvidφte, zda je soubor sprßvn∞ naΦφtßn.

9. Hlßsφ to pou╛itφ --activate-module=src/modules/php4/libphp4.a, ale tento soubor neexistuje; proto jsem to zm∞nil na --activate-module=src/modules/php4/libmodphp4.a a ono to nefunguje? O co jde?

Uv∞domte si, ╛e soubor libphp4.a nemß existovat. Vytvß°φ ho proces serveru Apache!

10. Kdy╛ zkusφm sestavit Apache s PHP jako╛to statick²m modulem pomocφ --activate-module=src/modules/php4/libphp4.a, hlßsφ to, ╛e m∙j kompilßtor nevyhovuje ANSI.

Toto je zavßd∞jφcφ chybovΘ hlß╣enφ, kterΘ bylo odstran∞no v pozd∞j╣φch verzφch.

11. Kdy╛ zkusφm sestavit PHP s parametrem --with-apxs, dostanu zßhadnΘ chybovΘ zprßvy.

Je t°eba zkontrolovat t°i v∞ci. Nejd°φve, z d∙vodu, ╛e kdy╛ Apache vytvß°φ apxs skript v Perlu, n∞kdy ukonΦφ kompilaci bez odpovφdajφcφch prom∞nn²ch. Najd∞te skript apxs (zkuste p°φkaz 'which apxs', n∞kdy b²vß v /usr/local/apache/bin/apxs nebo /usr/sbin/apxs). Otev°te ho a zkontrolujte °ßdky podobnΘ t∞mto:
my $CFG_CFLAGS_SHLIB  = 'á';          # nahrazeno pomocφ Makefile.tmpl
my $CFG_LD_SHLIB      = 'á';          # nahrazeno pomocφ Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = 'á';          # nahrazeno pomocφ Makefile.tmpl
Pokud vidφte toto, na╣li jste ten problΘm. Mohou se tam vyskytovat mezery nebo jinΘ nekorektnφ hodnoty, nap°. 'q()'. Zm∞≥te °ßdky takto:
my $CFG_CFLAGS_SHLIB  = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = 'gcc';             # nahrazeno pomocφ Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared);        # nahrazeno pomocφ Makefile.tmpl
Druh² mo╛n² problΘm by m∞l vyskytovat pouze na Red Hat Linuxu 6.1 a 6.2. Skript apxs v t∞chto distribucφch Red Hat je po╣kozen². Najd∞te °ßdek
my $CFG_LIBEXECDIR    = 'modules';         # nahrazeno pomocφ APACI install
Pokud vidφte v²╣e uveden² °ßdek, nahra∩te ho tφmto:
my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # nahrazeno pomocφ APACI install
Nakonec, kdy╛ budete p°einstalovßvat Apache, za°a∩te 'make clean' mezi './configure' a 'make'.

12. During 'make', I get errors in microtime, and a lot of 'RUSAGE_' stuff.

During the 'make' portion of installation, if you encounter problems that look similar to this:
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

Vß╣ systΘm je po╣kozen. Musφte opravit soubory v /usr/include instalacφ balφku glibc-devel, kter² pat°φ k va╣emu glibc. Nemß to absolutn∞ nic spoleΦnΘho s PHP. D∙kaz zφskßte tφmto jednoduch²m testem:
$ cat >test.c <<X
    #include <sys/resource.h>
    X
    $ gcc -E test.c >/dev/null
Pokud se objevφ chyby, ve va╣ich hlaviΦkov²ch souborech panuje chaos.

13. Chci upgradovat svΘ PHP. Kde najdu tvar °ßdku ./configure, kter² byl pou╛it pro sestavenφ stßvajφcφ instalace PHP?

Kdy╛ se podφvßte do souboru config.nice ve zdrojovΘm stromu souΦasnΘ instalace PHP. Nenφ-li k dispozici, jednodu╣e spus╗te skript
Naho°e ve v²pisu najdete °ßdek ./configure, kter² byl pou╛it p°i sestavovßnφ stßvajφcφ instalace.