скучаете на зимних каникулах?

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Тогда позволю себе добавить:

1. Устанавливаем Visual Studio (2003,2005)
2. Скачиваем файл win32build http://www.php.net/extra/win32build.zip
3. Распаковываем содержимое файла win32build в каталог "C:\Program Files\Microsoft Visual Studio 8\VC" (или туда куда устанавливали Visual Studio)
4. Скачиваем исходный код PHP
5. Распаковываем в каталог php5 (к примеру c:\php5)
6. Запускаем файл (%comspec% /k ""C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"" x86)
8. Переходим в каталог c:\php5
9. Набираем buildconf.bat жмем ввод
10. Набираем cscript /nologo configure.js --help, ознакамливаемся с содержим, выбираем те опции которые необходимы
11. cscript /nologo configure.js --enable-snapshot-build
12. Далее жмем nmake

Отлаживать в Visual удобней, всего лишь добавляем в конфигурации проекта строку php test.php, ну и в ini прописываем подгрузку экстеншена. а уж после отладки, откомпилировать на линуксе, проблем не составит.
 

ran

Новичок
Попробовал выполнить ./buildconf --force без выполнения ./ext_skel и получил:
Код:
# ./buildconf --force
Forcing buildconf
using default Zend directory
buildconf: checking installation...
buildconf: autoconf version 2.61 (ok)
buildconf: Your version of autoconf likely contains buggy cache code.
           Running cvsclean for you.
           To avoid this, install autoconf-2.13.
если я все правильно понял, то после ./ext_skel появляется "скелет" будушего екстеншена
buildconf проходит по все директории ext и из config.m4 берет значение PHP_ARG_WITH и добавляет опцией для ./configure.

сделал минимальный код для config.m4: добавить опцию и в любом случае включить при сборке екстеншн(независимо от параметров)
Код:
PHP_ARG_WITH(upnp, for upnp support,
[  --with-upnp             Include upnp support])
PHP_NEW_EXTENSION(upnp, upnp.c, $ext_shared)
После выполнения ./buildconf --force получаю такой ответ и --with-upnp не появляется
Код:
# ./buildconf --force
Forcing buildconf
using default Zend directory
buildconf: checking installation...
buildconf: autoconf version 2.61 (ok)
buildconf: Your version of autoconf likely contains buggy cache code.
           Running cvsclean for you.
           To avoid this, install autoconf-2.13.
rebuilding configure
aclocal.m4:2090: PHP_PROG_LEX is expanded from...
не могу понять, почему появляется вот эта строка(которая, как я думаю, и содержит ошибку):
aclocal.m4:2090: PHP_PROG_LEX is expanded from...
 

tony2001

TeaM PHPClub
если я все правильно понял, то после ./ext_skel появляется "скелет" будушего екстеншена
buildconf проходит по все директории ext и из config.m4 берет значение PHP_ARG_WITH и добавляет опцией для ./configure.
в общем, да.

Код:
# cd /local/dev/php/5_3
# cd ext/
# ./ext_skel --extname=upnp
Creating directory upnp
Creating basic files: config.m4 config.w32 .cvsignore upnp.c php_upnp.h CREDITS EXPERIMENTAL tests/001.phpt upnp.php [done].

To use your new extension, you will have to execute the following steps:

1.  $ cd ..
2.  $ vi ext/upnp/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-upnp
5.  $ make
6.  $ ./php -f ext/upnp/upnp.php
7.  $ vi ext/upnp/upnp.c
8.  $ make

Repeat steps 3-6 until you are satisfied with ext/upnp/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.

# vim upnp/config.m4
# cd -
/local/dev/php/5_3
# ./buildconf
using default Zend directory
rebuilding configure
aclocal.m4:2090: PHP_PROG_LEX is expanded from...
rebuilding main/php_config.h.in
<--skip. привет автоконфу 2.60-->

# ./configure --help | grep upnp
  --with-upnp             Include upnp support
-~{}~ 11.01.08 18:53:

>не могу понять, почему появляется вот эта строка(которая, как я думаю, и содержит ошибку):
>aclocal.m4:2090: PHP_PROG_LEX is expanded from...

она появляется потому, что autoconf > 2.50 не совместим с < 2.50.
этот варнинг можно исправить, но тогда autoconf < 2.50 работать не будет.
к делу это отношения не имеет, configure при этом нормально генерится.

-~{}~ 11.01.08 18:54:

вообще-то, рекомендованной версией autoconf является 2.13.
но, повторяю, все остальные тоже работают, просто более медленно и с варнингами.
 

ran

Новичок
ура, получилось :)
удалил исходники, проделал еще раз все то же и появилось.
такое ощущение, что когда впервые запустил ./buildconf --force, но не отредактировал config.m4 - он не включил екстеншн (что логично, потому что все закоментировано), но после редактирования конфига ./buidlconf уже не реагировал на изменения.
tony2001, не нужно ничего наподобии make clean или это меня проглючило и --force указывает на немедленный ребилд?

Автор оригинала: tony2001
но, повторяю, все остальные тоже работают, просто более медленно и с варнингами.
да, варнингов было достаточно много.


если в SEARCH_PATH = '/tmp/upnp' - поиск будет производиться в корневой папке tmp или в /home/username/tmp? (upnp установлена в корне под root-ом)
 

tony2001

TeaM PHPClub
можно просто удалить configure, тогда он точно пересоберётся заново.

/tmp/upnp - это путь от корня.
 

ran

Новичок
tony2001
"скелет" екстеншена готов, к чему стоит перейти?
 

tony2001

TeaM PHPClub
добавлять функции по одной.
лучше всего начать с самой простой, вероятно UpnpRegisterClient и дальше по списку.

кстати, я смотрю тут либу надо инициализировать сначала.
судя по всему, лучше всего вызывать UpnpInit() в PHP_MINIT_FUNCTION и UpnpFinish() в PHP_RSHUTDOWN_FUNCTION.

хотя, было бы неплохо, если бы этого можно было избежать - скажем, завести глобальную переменную и выставлять там флаг - проинициализирована ли либа.
а флаг этот проверять в начале каждой функции (для этого можно сделать макрос из одной строки).
 

ran

Новичок
ясно, на выходных поразбираюсь, попробую посмотреть исходники других екстеншенов, восстановлю в памяти все, что знаю по C (почти год не трогал) :)
 

Develar

Новичок
tony2001
А почему вы выбрали именно openSuse, а не, к примеру, ubuntu?
Вы пользуетесь редактором vim или каким-то другим?
Какова политика партии в отношении пространств имен в pecl? Или действует вне зависимости от введения namespace правило "The class name should be prefixed with the name of the 'parent set' (e.g. the name of the extension)"?
 

tony2001

TeaM PHPClub
>А почему вы выбрали именно openSuse, а не, к примеру, ubuntu?

почему кто-то любит светлое пиво, а кто-то тёмное?
вопрос вкуса..

>Вы пользуетесь редактором vim или каким-то другим?

да.

>Какова политика партии в отношении пространств имен в pecl?

namespace'ов еще и в PHP по сути нет, не рано ли про PECL спрашивать?

>Или действует вне зависимости от введения namespace правило "The class name
>should be prefixed with the name of the 'parent set' (e.g. the name of the extension)"?

поскольку я не ожидаю, что все волшебным образом перескочат на 5.3 и 6.0 сразу после их выхода, мне кажется, имеет смысл делать префиксы - 10 лет это работало нормально.
 

Santiago

Новичок
tony2001
Если еще не поздно, то тоже хотел бы присоединиться :)
Библиотека upnp стоит в /tmp/upnp
В ext/upnp/config.m4 прописано,
SEARCH_PATH="/tmp/upnp" # you might want to change this
SEARCH_FOR="/include/upnp/upnp.h" # you most likely want to change this

После ./configure --with-upnp в конце вылезает ошибка,
checking for upnp support... yes
checking for upnp files in default path... found in /tmp/upnp
checking for upnp in -lupnp... no
configure: error: wrong upnp lib version or lib not found

Не могу понять в чем дело/
Куда смотреть, не подскажешь?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Эх, как же я пропустил такую тему!
Давно мечтаю о том, чтобы писать extension для PHP!
 

tony2001

TeaM PHPClub
>checking for upnp in -lupnp... no
>configure: error: wrong upnp lib version or lib not found

забыл поменять "LIBSYMBOL=upnp" на имя реальной функции из libupnp.
функции upnp() очевидно не существует.

grigori
присоединяйся.
 

ran

Новичок
после 2х недель отдыха от компов очень хочу продолжить :)
 

Santiago

Новичок
tony2001
Да, действительно, не разобрался сначала, зачем это ;) Спасибо.
Насколько я понял, макрос PHP_CHECK_LIBRARY нужен для проверки наличия некой функции в установленной библиотеке и, в принципе, необязателен. Кстати, есть ли где-то дока по специфичным макросам для PHP, которые отличаются от GNU Autoconf?

Теперь вопрос в следующем - какие функции библиотеки нужно реализовать в первую очередь (ну кроме, UpnpInit и UpnpFinish).
Должны ли функции враппера "повторять" функции либы? Или же, наоборот, все на усмотрение разработчика?
 

tony2001

TeaM PHPClub
>Насколько я понял, макрос PHP_CHECK_LIBRARY нужен для проверки наличия
>некой функции в установленной библиотеке

точно.

>и, в принципе, необязателен.

.. но желателен.

>Кстати, есть ли где-то дока по специфичным макросам для PHP, которые
>отличаются от GNU Autoconf?

они не отличаются, это просто самописные, которые используют стандартные (т.е. autoconf).
все макросы в acinclude.m4 и configure.in.
разбираться в них необязательно, нужны они достаточно редко.

>Теперь вопрос в следующем - какие функции библиотеки нужно реализовать в
>первую очередь (ну кроме, UpnpInit и UpnpFinish).

вероятно, стоит начать с простых.

>Должны ли функции враппера "повторять" функции либы?

интерфейс экстеншена неплохо бы продумать заранее, конечно.

>Или же, наоборот, все на усмотрение разработчика?

ну, в действиях должна быть какая-то логика.
скажем, я вижу это примерно так:

int upnp_get_server_port();
string upnp_get_server_ip();

уходить от родного API и выдумывать свой имеет смысл, если родное совсем сложное или просто нам не подходит.
тут, вроде, всё достаточно просто, даже функции с внятными именами.

-~{}~ 29.01.08 14:19:

Git репозиторий
http://git.daylessday.org/index.php?p=upnp.git
 

tony2001

TeaM PHPClub
это просто чтобы каждый не повторял ту стадию, которую мы уже прошли.
в принципе, имеет смысл там собирать наработки.
 
Сверху