Implement packager and installer hooks
authorMichael Wallner <mike@php.net>
Fri, 6 Mar 2015 08:11:02 +0000 (09:11 +0100)
committerMichael Wallner <mike@php.net>
Fri, 6 Mar 2015 09:08:15 +0000 (10:08 +0100)
commite1c1b76f0a87c7573e30468763d47c0b97b11e8e
tree7b5b41f6efac5f9dcc480dbb1e844454e505b9ea
parent0813c3a5e5dc60c691f7f658b8fe3b51925c6bc1
Implement packager and installer hooks

==Packager hook
If not --pecl nor --git are explicitely given, look for a
pharext_install.php in --source. This script will be exectuted by the
Packager. It must return a callable with the following signature:

function(Packager $pkg, $path) : function(Packager $pkg, $path);

So, the callback should return another callable.
The primary callback is meant to set things like --name and --release,
so you don't have to on the command line; build automation FTW.
The secondary callback is meant to create the file iterator of the
source dir, but if you're in a git clone, you might easily just return a
new pharext\GitSourceDir and be done.

==Installer hook
The packager will look for a pharext_install.php file within the root of
the source dir. This script will be executed by the Installer; it must
return a callable with the following signature:

function(Installer $installer) : function(Installer $installer);

So, again, the callback should return another callable.
The primary callback is meant to add your own command line arguments to
the CliArgs parser, and the secnodary callback is meant to proccess
those args.

For --pecl source dirs a pharext_install.php script is automatically
generated from the package.xml.

==Examples for pecl_http

pharext_package.php
---8<---
<?php

namespace pharext;

return function(Packager $packager, $path) {
$args = $packager->getArgs();
$args->name = "pecl_http";
$args->release = current(preg_filter("/^.*PHP_PECL_HTTP_VERSION\s+\"(.*)\".*$/s", "\$1", file("../http.git/php_http.h")));
return function (Packager $packager, $path) {
return new GitSourceDir($packager, $path);
};
};
?>
--->8---

pharext_install.php
---8<---
<?php

namespace pharext;

return function(Installer $installer) {
$installer->getArgs()->compile([
[null, "with-http-zlib-dir", "Where to find zlib",
CliArgs::OPTARG],
[null, "with-http-libcurl-dir", "Where to find libcurl",
CliArgs::OPTARG],
[null, "with-http-libevent-dir", "Where to find libev{,ent{,2}}",
CliArgs::OPTARG],
[null, "with-http-libidn-dir", "Where to find libidn",
CliArgs::OPTARG],
]);

return function(Installer $installer) {
$opts = [
"with-http-zlib-dir",
"with-http-libcurl-dir",
"with-http-libevent-dir",
"with-http-libidn-dir",
];
$args = $installer->getArgs();
foreach ($opts as $opt) {
if (isset($args[$opt])) {
$args->configure = "--$opt=".$args[$opt];
}
}
};
};
?>
--->8---
Makefile
bin/pharext
src/pharext/CliArgs.php
src/pharext/CliCommand.php
src/pharext/Installer.php
src/pharext/Packager.php
src/pharext/PeclSourceDir.php
src/pharext/PharextSourceDir.php [new file with mode: 0644]
src/pharext_install.tpl.php [new file with mode: 0644]
tests/src/pharext/CliCommandTest.php