<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/faq.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'uk',
  ),
  'this' => 
  array (
    0 => 'faq.build.php',
    1 => 'Проблеми збірки',
    2 => 'Проблеми збірки',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'ЧаПи',
  ),
  'prev' => 
  array (
    0 => 'faq.installation.php',
    1 => 'Встановлення',
  ),
  'next' => 
  array (
    0 => 'faq.using.php',
    1 => 'Використання PHP',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'uk',
    'path' => 'faq/build.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.build" class="chapter">
  <h1 class="title">Проблеми збірки</h1>

  

  <p class="para">
   У цьому розділі зібрано найпоширеніші помилки, які виникають під час
   збирання PHP.
  </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.build.configure">
     
      Я отримав останню версію PHP, використавши анонімний сервіс Git, але в ній
      немає скрипту конфігурації!
     
    </a></li><li><a href="#faq.build.configuring">
     
      Я маю проблеми з налаштуванням PHP для роботи з Apache. Каже, що не може
      знайти httpd.h, проте він точно там, де я вказав!
     
    </a></li><li><a href="#faq.build.lex">
     
      Під час конфігурації PHP (./configure), ви натрапили на
      помилку, подібну до наступної:
     
     
      
       checking lex output file root... ./configure: lex: command not found
       configure: error: cannot find output from lex; giving up
      
     
    </a></li><li><a href="#faq.build.apache-sharedcore">
     
      Коли я намагаюся запустити Apache, отримую таке повідомлення:
     
     
      
       fatal: relocation error: file /path/to/libphp4.so:
       symbol ap_block_alarms: referenced symbol not found
      
     
    </a></li><li><a href="#faq.build.not-found">
     
      Коли я запускаю скрипт конфігурації, він каже, що не може включити файли
      або бібліотеку GD, gdbm, чи якогось іншого пакунка.
     
    </a></li><li><a href="#faq.build.yytname">
     
      Коли компілюється файл language-parser.tab.c, то
      виводяться помилки yytname undeclared.
     
    </a></li><li><a href="#faq.build.link">
     
      Коли я запускаю make, наче все йде добре, але
      завершується невдачею під час компонування програми, скаржачись, що не
      може знайти якісь файли.
     
    </a></li><li><a href="#faq.build.undefined">
     
      Коли компоную PHP, воно скаржиться на кількість невизначених посилань.
     
    </a></li><li><a href="#faq.build.not-running">
     
      Я послідовно виконав усі кроки встановлення PHP, як модуля Apache у Unix,
      а мої скрипти показуються в браузері, як простий текст, або браузер
      пропонує мені зберегти файл.
     
    </a></li><li><a href="#faq.build.activate-module">
     
      Там сказано використати
      --activate-module=src/modules/php4/libphp4.a, але
      такого файлу немає, тож я замінив параметр на
      --activate-module=src/modules/php4/libmodphp4.a, та це
      не спрацювало! Що відбувається?
     
    </a></li><li><a href="#faq.build.ansi">
     
      Коли я намагаюсь зібрати Apache із PHP, як статичним модулем,
      використовуючи
      --activate-module=src/modules/php4/libphp4.a, воно
      каже, що мій компілятор не сумісний з ANSI.
     
    </a></li><li><a href="#faq.build.apxs">
     
      Коли я намагаюся зібрати PHP, використовуючи
      --with-apxs, отримую дивне повідомлення
      про помилку.
     
    </a></li><li><a href="#faq.build.microtime">
     
      Протягом виконання make часто з&#039;являються помилки і
      більшість про RUSAGE_.
     
    </a></li><li><a href="#faq.build.mysql.tempnam">
     
      Коли компілюю PHP з підтримкою MySQL, configure працює добре, але
      виконуючи make, я отримую помилку схожу на:
      ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function 
      my_tempnam&#039;: /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the 
      use of tempnam&#039; is dangerous, better use mkstemp&#039;, 
      що не так?
     
    </a></li><li><a href="#faq.build.upgrade">
     
      Я хочу оновити мій PHP. Де я можу дізнатися повну команду
      ./configure, яка була виконана для збирання
      поточної встановленої версії?
     
    </a></li><li><a href="#faq.build.gdlibs">
     
      Під час збирання PHP з підтримкою GD виводяться дивні помилки компіляції
      або під час виконання &mdash; помилки сегментації.
     
    </a></li><li><a href="#faq.installation.needgnu">
     
      Під час компіляції PHP я, здається, отримую випадкові помилки, наче вона
      зависає. Я використовую Solaris, якщо це важливо.
     
    </a></li></ol></div>
   <dl class="qandaentry" id="faq.build.configure">
    <dt><strong>
     
      Я отримав останню версію PHP, використавши анонімний сервіс Git, але в ній
      немає скрипту конфігурації!
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      У вас має бути встановленим пакунок GNU autoconf, за допомогою якого
      зможете генерувати скрипт конфігурації з
      <var class="filename">configure.in</var>. Достатньо виконати
      <strong class="command">./buildconf</strong> в початковій теці після отримання
      початкового коду з сервера Git. (Крім того, допоки ви не запустите
      <strong class="command">configure</strong> з параметром
      <code class="literal">--enable-maintainer-mode</code>, скрипт конфігурації не буде
      автоматично перебудовано, коли файл <var class="filename">configure.in</var>
      оновиться, і вам доведеться робити це вручну, коли
      <var class="filename">configure.in</var> зміниться. Ознакою того є слова
      @VARIABLE@ у вашому Makefile після запуску конфігурації чи
      <var class="filename">config.status</var>.)
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.configuring">
    <dt><strong>
     
      Я маю проблеми з налаштуванням PHP для роботи з Apache. Каже, що не може
      знайти <var class="filename">httpd.h</var>, проте він точно там, де я вказав!
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Ви повинні назвати скрипту конфігурації розташування початкової теки
      початкових кодів Apache. Це означає, що треба вказати
      <strong class="option configure">--with-apache=/path/to/apache</strong>, а
      <em>не</em> 
      <strong class="option configure">--with-apache=/path/to/apache/src</strong>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.lex">
    <dt><strong>
     
      Під час конфігурації PHP (<code class="literal">./configure</code>), ви натрапили на
      помилку, подібну до наступної:
     
     
      <div class="example-contents screen"><br />
       checking lex output file root... ./configure: lex: command not found<br />
       configure: error: cannot find output from lex; giving up<br />
      </div>
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Уважно перечитайте інструкції зі
      <a href="install.unix.php" class="link">встановлення</a> та майте на увазі, що вам
      потрібні встановлені пакунки flex і bison, щоб скомпілювати PHP. Залежно
      від ваших налаштувань, bison і flex встановлюються або з джерела, або з
      пакета, наприклад RPM.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.apache-sharedcore">
    <dt><strong>
     
      Коли я намагаюся запустити Apache, отримую таке повідомлення:
     
     
      <div class="example-contents screen"><br />
       fatal: relocation error: file /path/to/libphp4.so:<br />
       symbol ap_block_alarms: referenced symbol not found<br />
      </div>
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Зазвичай ця помилка з&#039;являється, коли Apache було скомпільовано, як DSO
      для спільного використання. Спробуйте переконфігурувати Apache,
      упевнившись, що ви використали принаймні наступні прапорці:
     </p>
     <p class="para">
      <div class="example-contents screen"><br />
      --enable-shared=max --enable-rule=SHARED_CORE<br />
      </div>
     </p>
     <p class="para">
      Більше інформації вгорі файлу Apache&#039;а <var class="filename">INSTALL</var> або на
      <a href="http://httpd.apache.org/docs/current/dso.html" class="link external">&raquo;&nbsp;Сторінці посібника з DSO</a> від
      Apache.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.not-found">
    <dt><strong>
     
      Коли я запускаю скрипт конфігурації, він каже, що не може включити файли
      або бібліотеку GD, gdbm, чи якогось іншого пакунка.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Ви можете зробити так, щоб скрипт конфігурації шукав файли-заголовки та
      бібліотеки в нестандартних місцях, задавши додаткові прапорці для
      препроцесора C і компонувальника, наприклад:
      <div class="example-contents">
<div class="cdata"><pre>
    CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
</pre></div>
      </div>

      Якщо ви використовуєте csh-варіант оболонки для авторизації (а нащо?), це
      буде:
      <div class="example-contents">
<div class="cdata"><pre>
    env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
</pre></div>
      </div>

     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.yytname">
    <dt><strong>
     
      Коли компілюється файл <var class="filename">language-parser.tab.c</var>, то
      виводяться помилки <code class="literal">yytname undeclared</code>.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Вам треба оновити пакунок Bison. Найновіша версія за адресою
      <a href="http://www.gnu.org/software/bison/bison.html" class="link external">&raquo;&nbsp;http://www.gnu.org/software/bison/bison.html</a>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.link">
    <dt><strong>
     
      Коли я запускаю <strong class="command">make</strong>, наче все йде добре, але
      завершується невдачею під час компонування програми, скаржачись, що не
      може знайти якісь файли.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Деякі старі версії make не можуть правильно помістити скомпільовані файли
      у теки. Спробуйте запустити <strong class="command">cp *.o functions</strong>, потім
      перезапустити <strong class="command">make</strong>, щоб побачити, чи це допоможе. Якщо
      так, то вам конче треба отримати найновішу версію GNU make.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.undefined">
    <dt><strong>
     
      Коли компоную PHP, воно скаржиться на кількість невизначених посилань.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Подивіться на рядок з посиланнями, та упевніться, що усі необхідні
      бібліотеки були включені. Здебільшого це &quot;-ldl&quot; та бібліотеки, потрібні
      для включених баз даних.
     </p>
     <p class="para">
      Дехто каже, що треба дописати &#039;-ldl&#039; відразу після
      <var class="filename">libphp4.a</var>, коли компонуєте модуль для Apache.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.not-running">
    <dt><strong>
     
      Я послідовно виконав усі кроки встановлення PHP, як модуля Apache у Unix,
      а мої скрипти показуються в браузері, як простий текст, або браузер
      пропонує мені зберегти файл.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Це означає, що PHP-модуль чомусь не викликається.
      Перед проханням про додаткову допомогу треба перевірити три речі:
      <ul class="itemizedlist">
       <li class="listitem">
        <span class="simpara">
         Упевніться, що запущений вами двійковий httpd — той, що ви перед
         цим зібрали. Для цього виконайте: <code class="literal">/path/to/binary/httpd -l</code>
        </span>
        <span class="simpara">
         Якщо ви не бачите у списку <var class="filename">mod_php4.c</var>, отже
         запущено не той двійковий файл. Знайдіть і встановіть потрібний.
        </span>
       </li>
       <li class="listitem">
        <span class="simpara">
         Упевніться, що ви додали правильний MIME тип у одному з ваших
         <code class="literal">.conf</code> файлів Apache. Наприклад:
         <code class="literal">AddType application/x-httpd-php .php</code>
        </span>
        <span class="simpara"> 
         Також перевірте, чи інструкція AddType не знаходиться за межами
         блоку &lt;Virtualhost&gt; або &lt;Directory&gt;, бо це не дозволить
         застосувати її до вашого тестового скрипта.
        </span>
       </li>
       <li class="listitem">
        <span class="simpara">
         В решті решт, стандартне розташування файлів конфігурації Apache у
         версій 1.2 і 1.3 — відрізняється. Перевірте, що файли конфігурації,
         в які ви записали AddType, будуть прочитані. Можна навмисно внести
         помилку у ваш файл <var class="filename">httpd.conf</var> або будь-яку іншу очевидну зміну, яка
         сигналізуватиме, що файл прочитано коректно.
        </span>
       </li>
      </ul>
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.activate-module">
    <dt><strong>
     
      Там сказано використати
      <code class="literal">--activate-module=src/modules/php4/libphp4.a</code>, але
      такого файлу немає, тож я замінив параметр на
      <code class="literal">--activate-module=src/modules/php4/libmodphp4.a</code>, та це
      не спрацювало! Що відбувається?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Зауважте, що файлу <var class="filename">libphp4.a</var> і не має існувати.
      Процес Apache створить його!
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.ansi">
    <dt><strong>
     
      Коли я намагаюсь зібрати Apache із PHP, як статичним модулем,
      використовуючи
      <code class="literal">--activate-module=src/modules/php4/libphp4.a</code>, воно
      каже, що мій компілятор не сумісний з ANSI.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Це хибне повідомлення про помилку від Apache, яке буде виправлене в
      майбутніх версіях.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.apxs">
    <dt><strong>
     
      Коли я намагаюся зібрати PHP, використовуючи
      <strong class="option configure">--with-apxs</strong>, отримую дивне повідомлення
      про помилку.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Треба перевірити три речі. По-перше, інколи Apache створює
      Perl-скрипт &quot;apxs&quot;, а останній не містить даних про потрібний
      компілятор та поставлених прапорців. Знайдіть ваш скрипт apxs (спробуйте
      команду <strong class="command">which apxs</strong>), зазвичай він знаходиться у
      <var class="filename">/usr/local/apache/bin/apxs</var> або
      <var class="filename">/usr/sbin/apxs</var>. Відкрийте його і перевірте рядки,
      схожі на ці:
      <div class="example-contents">
<div class="cdata"><pre>
my $CFG_CFLAGS_SHLIB  = &#039; &#039;;          # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = &#039; &#039;;          # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = &#039; &#039;;          # substituted via Makefile.tmpl
</pre></div>
      </div>

      Якщо це те, що ви бачите, проблему знайдено. Вони можуть містити тільки
      пробіли або інші некоректні значення, такі як &#039;q()&#039;.  Замініть ці рядки на
      наступні:
      <div class="example-contents">
<div class="cdata"><pre>
my $CFG_CFLAGS_SHLIB  = &#039;-fpic -DSHARED_MODULE&#039;; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = &#039;gcc&#039;;                   # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared);              # substituted via Makefile.tmpl 
</pre></div>
      </div>

      Друга можлива проблема може виникати у Red Hat 6.1 та 6.2. Скрипт apxs у
      Red Hat зламаний. Знайдіть цей рядок:
      <div class="example-contents">
<div class="cdata"><pre>
my $CFG_LIBEXECDIR    = &#039;modules&#039;;         # substituted via APACI install
</pre></div>
      </div>

      Якщо ви бачите такий рядок, замініть його на:
      <div class="example-contents">
<div class="cdata"><pre>
my $CFG_LIBEXECDIR    = &#039;/usr/lib/apache&#039;; # substituted via APACI install
</pre></div>
      </div>

       По-третє, якщо переналаштовуєте або перевстановлюєте Apache, допишіть
       <strong class="command">make clean</strong> після <strong class="command">./configure</strong> та
       перед <strong class="command">make</strong>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.microtime">
    <dt><strong>
     
      Протягом виконання <strong class="command">make</strong> часто з&#039;являються помилки і
      більшість про <code class="literal">RUSAGE_</code>.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Якщо протягом виконання <strong class="command">make</strong> ви зіткнулися з такими
      проблемами:
      <div class="example-contents">
<div class="cdata"><pre>
microtime.c: In function `php_if_getrusage&#039;:
microtime.c:94: storage size of `usg&#039; isn&#039;t known
microtime.c:97: `RUSAGE_SELF&#039; 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&#039; undeclared (first use in this function)
make[3]: *** [microtime.lo] Error 1
make[3]: Leaving directory `/home/master/php-4.0.1/ext/standard&#039;
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/master/php-4.0.1/ext/standard&#039;
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/master/php-4.0.1/ext&#039;
make: *** [all-recursive] Error 1
</pre></div>
      </div>

     </p>
     <p class="para">
      Ваша система зламана. Потрібно полагодити ваші файли у
      <var class="filename">/usr/include</var>, встановивши пакунок glibc-devel, з тою
      ж версією, що і у вашого glibc. Це не має абсолютно нічого спільного з
      PHP. Щоб переконатися в цьому, спробуйте цей простий тест:
     <div class="example-contents">
<div class="cdata"><pre>
$ cat &gt;test.c &lt;&lt;X
#include &lt;sys/resource.h&gt;
X
$ gcc -E test.c &gt;/dev/null
</pre></div>
      </div>

      Якщо висвітяться помилки, знайте — ваші include-файли зіпсовані. 
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.build.mysql.tempnam">
    <dt><strong>
     
      Коли компілюю PHP з підтримкою MySQL, configure працює добре, але
      виконуючи <code class="literal">make</code>, я отримую помилку схожу на:
      <em>ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function 
      my_tempnam&#039;: /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the 
      use of tempnam&#039; is dangerous, better use mkstemp&#039;</em>, 
      що не так?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Найперше, важливо усвідомити, що це <code class="literal">попередження</code>, а не
      фатальна помилка. Через те, що здебільшого це кінцевий вивід команди
      <code class="literal">make</code>, може здатися, що це фатальна помилка, але ні.
      Звісно, якщо ви налаштували свій компілятор &quot;вмирати&quot; від попереджень, то
      це буде нею. Ще майте на увазі, що стандартно підтримка MySQL ввімкнена.
     </p>
     <blockquote class="note"><p><strong class="note">Зауваження</strong>: 
      <p class="para">
       Починаючи з PHP 4.3.2, після завершення збірки (make) ви також бачитимете
       наступний текст:
      </p>
      <p class="para">
       <div class="example-contents screen"><br />
        Build complete.<br />
        (It is safe to ignore warnings about tempnam and tmpnam).<br />
       </div>
      </p>
     </p></blockquote>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.build.upgrade">
    <dt><strong>
     
      Я хочу оновити мій PHP. Де я можу дізнатися повну команду
      <strong class="command">./configure</strong>, яка була виконана для збирання
      поточної встановленої версії?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      У файлі config.nice, або у дереві початкових кодів встановленого PHP, якщо це
      недоступно, можете просто запустити скрипт
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php phpinfo</span><span style="color: #007700">(); </span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>
. Вгорі результату буде показано командний рядок
      <strong class="command">./configure</strong>, який було використано для збирання даної
      версії PHP.
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.build.gdlibs">
    <dt><strong>
     
      Під час збирання PHP з підтримкою GD виводяться дивні помилки компіляції
      або під час виконання — помилки сегментації.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Упевніться, що ваша бібліотека GD та PHP залежні від однакових бібліотек
      (напр. libpng).
     </p>
    </dd>
   </dl>   
   
   <dl class="qandaentry" id="faq.installation.needgnu">
    <dt><strong>
     
      Під час компіляції PHP я, здається, отримую випадкові помилки, наче вона
      зависає. Я використовую Solaris, якщо це важливо.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Використання не-GNU утиліт для компіляції PHP може спричинити проблеми.
      Використовуйте інструменти GNU для впевненості у належній компіляції PHP.
      Наприклад, у Solaris, використання BSD-сумісних версій
      <code class="literal">sed</code> від SunOS або Solaris не спрацює, натомість версії
      <code class="literal">sed</code> від GNU або Sun POSIX (xpg4) будуть працювати.
      Посилання: <a href="http://www.gnu.org/software/sed/sed.html" class="link external">&raquo;&nbsp;GNU sed</a>,
      <a href="http://www.gnu.org/software/flex/flex.html" class="link external">&raquo;&nbsp;GNU flex</a> та
      <a href="http://www.gnu.org/software/bison/bison.html" class="link external">&raquo;&nbsp;GNU bison</a>.
     </p>
    </dd>
   </dl>
  
 </div>
<?php manual_footer($setup); ?>