No edit summary |
(Use more common %if 0%{foo} idiom) |
||
Line 33: | Line 33: | ||
Requires(postun): %{__pecl} | Requires(postun): %{__pecl} | ||
%if %{?php_zend_api} | %if 0%{?php_zend_api} | ||
Requires: php(zend-abi) = %{php_zend_api} | Requires: php(zend-abi) = %{php_zend_api} | ||
Requires: php(api) = %{php_core_api} | Requires: php(api) = %{php_core_api} | ||
Line 42: | Line 42: | ||
Provides: php-pecl(foo) = %{version} | Provides: php-pecl(foo) = %{version} | ||
</pre> | </pre> | ||
= Change proposal (ABI Check) = | = Change proposal (ABI Check) = |
Revision as of 18:28, 4 December 2009
[[TableOfContents(3)]
Proposed Changes to PHP Guidelines
Synopsis
This page describes items that need to be changed in the PHP Guidelines or other items that need to be reviewed or ratified by the Fedora Packaging Comittee and FESCo .
Actual Guidelines
File Placement
Non-PEAR PHP extensions should put their Class files in /usr/share/php.
Change proposal (subfolder)
File Placement
Non-PEAR PHP software which provides shared libraries should put its PHP source files for such shared libraries in a subfolder of /usr/share/php, named according to the name of the software. For example, a library called "Whizz_Bang" (with a RPM called php-something-Whizz-Bang) would put the PHP source files for its shared libraries in /usr/share/php/Whizz_Bang.
Actual Guidelines
Requires and Provides
PECL Packages
A PECL package MUST have:
BuildRequires: php-devel, php-pear Requires(post): %{__pecl} Requires(postun): %{__pecl} %if 0%{?php_zend_api} Requires: php(zend-abi) = %{php_zend_api} Requires: php(api) = %{php_core_api} %else Requires: php-api = %{php_apiver} %endif Provides: php-pecl(foo) = %{version}
Change proposal (ABI Check)
Requires and Provides
C extensions (PECL and others)
To be certain that a binary extension will run correctly with a particular version of PHP, it is necessary to check that a particular package has both API and ABIs matching the installed version of PHP. The mechanism for doing this has evolved over time and is as follows:
For Fedora (all current versions):
BuildRequires: php-devel Requires: php(zend-abi) = %{php_zend_api} Requires: php(api) = %{php_core_api}
For Fedora EPEL 5:
%global php_apiver %((echo 0; php -i 2>/dev/null | sed -n 's/^PHP API => //p') | tail -1) BuildRequires: php-devel Requires: php-api = %{php_apiver}
There is no way of checking the ABI with packages for Fedora EPEL 5.
For a spec file which is compatible with both Fedora and EPEL 5:
%global php_apiver %((echo 0; php -i 2>/dev/null | sed -n 's/^PHP API => //p') | tail -1) %if %{?php_zend_api}0 Requires: php(zend-abi) = %{php_zend_api} Requires: php(api) = %{php_core_api} %else Requires: php-api = %{php_apiver} %endif
No API/ABI dependencies are available for Fedora EPEL 4 packages.
PECL Packages
PECL extension MUST have ABI check (see previous)
A PECL package MUST also have:
BuildRequires: php-pear Requires(post): %{__pecl} Requires(postun): %{__pecl} Provides: php-pecl(foo) = %{version}
Actual Guidelines
Macros and scriptlets
PECL Modules
The php-pear package in Fedora Core 5 and above (version 1:1.4.9-1.2) provides several useful macros:
- %{pecl_phpdir}
- %{pecl_docdir}
- %{pecl_testdir}
- %{pecl_datadir}
- %{pecl_xmldir}
You may need to define a few additional macros to extract some information from PHP. It is recommended that you use the following:
%global php_apiver %((echo 0; php -i 2>/dev/null | sed -n 's/^PHP API => //p') | tail -1) %{!?__pecl: %{expand: %%global __pecl %{_bindir}/pecl}} %{!?php_extdir: %{expand: %%global php_extdir %(php-config --extension-dir)}}
And here are some recommended scriptlets for properly registering and unregistering the module:
%if 0%{?pecl_install:1} %post %{pecl_install} %{pecl_xmldir}/%{name}.xml >/dev/null || : %endif %if 0%{?pecl_uninstall:1} %postun if [ $1 -eq 0 ] ; then %{pecl_uninstall} %{pecl_name} >/dev/null || : fi %endif
Change proposal (just a additional comment)
Conditions around the post/postun scriplets can be removed if the extension requires php >= 5.2.0, where pecl_install always defined. So it is only mandatory for EPEL packages.