com web/rmtools: basic pickle build with dep libs: client/include/PickleBuildVC.php client/include/PickleExt.php client/script/pickle.php
| From: | Anatol Belski | Date: | Tue, 05 May 2015 21:35:20 +0000 |
| Subject: | com web/rmtools: basic pickle build with dep libs: client/include/PickleBuildVC.php client/include/PickleExt.php client/script/pickle.php | ||
| Groups: | php.webmaster | ||
| Request: | Send a blank email to php-webmaster+get-25996@lists.php.net to get a copy of this message | ||
Commit: 62db17def58b2ec958ac9e27b900f5d1fc51072a
Author: Anatol Belski <ab@php.net> Tue, 5 May 2015 23:35:20 +0200
Parents: bd33a5a3b63558db7988c03a7f98e8a67a4a06ba
Branches: master pecl_legacy
Link: http://git.php.net/?p=web/rmtools.git;a=commitdiff;h=62db17def58b2ec958ac9e27b900f5d1fc51072a
Log:
basic pickle build with dep libs
Changed paths:
M client/include/PickleBuildVC.php
M client/include/PickleExt.php
M client/script/pickle.php
Diff:
diff --git a/client/include/PickleBuildVC.php b/client/include/PickleBuildVC.php
index bb07f91..7c79515 100644
--- a/client/include/PickleBuildVC.php
+++ b/client/include/PickleBuildVC.php
@@ -44,6 +44,10 @@ class PickleBuildVC
$this->compiler = $branch->config->builds[$build_name]['compiler'];
$this->architecture = $branch->config->builds[$build_name]['arch'];
$this->thread_safe =
(boolean)$branch->config->builds[$build_name]['thread_safe'];
+ $this->pecl_deps_base =
$branch->config->builds[$build_name]['pecl_deps_base'];
+ if (!file_exists($this->pecl_deps_base)) {
+ throw new \Exception("Dependency libs not found under
'{$this->pecl_deps_base}'");
+ }
$vc_env_prefix = strtoupper($this->compiler);
@@ -128,9 +132,16 @@ class PickleBuildVC
chdir(TMP_DIR);
+ $conf_opts = $ext->getConfigureOpts();
+ if ($conf_opts && file_exists($conf_opts)) {
+ $ext_config_opt = "--with-configure-options=$conf_opts";
+ } else {
+ $ext_config_opt = "--defaults";
+ }
+
/* XXX check if --quiet needed */
$opts = " --binary "
- . " --defaults " /* XXX if no force options was supplied, use --defaults. The logic is
to implement. */
+ . " $ext_config_opt "
. "--tmp-dir={$this->int_dir} "
. "--pack-logs "
. "release "
@@ -140,6 +151,8 @@ class PickleBuildVC
$ret = exec_single_log($cmd, NULL, $this->env);
+ $ext->cleanConfigureOpts();
+
chdir($old_cwd);
return $ret;
@@ -149,5 +162,10 @@ class PickleBuildVC
{
}
+
+ public function getIntDir()
+ {
+ return $this->int_dir;
+ }
}
diff --git a/client/include/PickleExt.php b/client/include/PickleExt.php
index c401011..2292a8b 100644
--- a/client/include/PickleExt.php
+++ b/client/include/PickleExt.php
@@ -13,6 +13,7 @@ class PickleExt
protected $deplister_cmd = 'c:\apps\bin\deplister.exe';
protected $build;
protected $pkg_config;
+ protected $conf_opts;
protected $pickle_cmd;
@@ -80,7 +81,7 @@ class PickleExt
public function cleanup()
{
- // pass
+ $this->cleanConfigureOpts();
}
protected function complexPkgNameMatch($cnf_name) {
@@ -166,6 +167,133 @@ if (!function_exists('rmtools\combinations')) {
return $config && isset($config['ignore']);
}
+
+ /* Depending on other extensions is neither handled nor supported by phpize.
+ This will need significant change in the PHP build, but still doable.
+ Or, it'll need some quite tricky business inside rmtools, still doable
+ as well. */
+ public function getConfigureOpts()
+ {
+ $config = $this->getPackageConfig();
+
+ /* Ext isn't known, force pickle --defaults */
+ if (!$config) {
+ return NULL;
+ }
+
+ $conf = $this->buildConfigureLine($config);
+
+ $fn = $this->build->getIntDir() . DIRECTORY_SEPARATOR . $this->getName() .
".conf";
+ if (strlen($conf) != file_put_contents($fn, $conf)) {
+ throw new \Exception("Error writing build config into '$fn'");
+ }
+
+ $this->conf_opts = $fn;
+ return $this->conf_opts;
+ }
+
+ public function cleanConfigureOpts()
+ {
+ if (file_exists($this->conf_opts)) {
+ unlink($this->conf_opts);
+ }
+ }
+
+ protected function buildConfigureLine(array $data)
+ {
+ $ret = '';
+ $ignore_main_opt = false;
+
+ if (!isset($data['type'])
+ || !in_array($data['type'], array('with', 'enable'))) {
+ throw new \Exception("Unknown extention configure type, expected enable/with");
+ }
+
+ $main_opt = '--' . $data['type'] . '-' . str_replace('_',
'-', $this->name);
+
+ if (isset($data['opts']) && $data['opts']) {
+ $data['opts'] = !is_array($data['opts']) ? array($data['opts']) :
$data['opts'];
+ foreach($data['opts'] as $opt) {
+ if ($opt) {
+ /* XXX simple check for opt syntax */
+ $ret .= ' "' . $opt . '" ';
+ }
+ /* the main enable/with option was overridden in the ini */
+ if (strstr($opt, "$main_opt=") !== false) {
+ $ignore_main_opt = true;
+ }
+ }
+ } else {
+ $data['opts'] = array();
+ }
+
+ $ignore_main_opt = $ignore_main_opt || isset($data['no_conf']);
+
+ if (!$ignore_main_opt) {
+ $ret .= ' "' . $main_opt . '=shared" ';
+ }
+
+ if (isset($data['libs']) && $data['libs']) {
+ $data['libs'] = !is_array($data['libs']) ? array($data['libs']) :
$data['libs'];
+ $deps_path = $this->build->pecl_deps_base;
+ $extra_lib = $extra_inc = array();
+
+ foreach($data['libs'] as $lib) {
+ if (!$lib) {
+ continue;
+ }
+
+ $lib_conf = $this->getLibraryConfig($lib);
+
+ $lib_path = $deps_path . DIRECTORY_SEPARATOR . $lib;
+
+ $some_lib_path = $lib_path . DIRECTORY_SEPARATOR . 'lib';
+ if (!file_exists($some_lib_path)) {
+ throw new \Exception("Path '$some_lib_path' doesn't exist");
+ }
+ $extra_lib[] = $some_lib_path;
+
+ $some_lib_inc_path = $lib_path . DIRECTORY_SEPARATOR . 'include';
+ if (!file_exists($some_lib_inc_path)) {
+ throw new \Exception("Path '$some_lib_inc_path' doesn't exist");
+ }
+ $extra_inc[] = $some_lib_inc_path;
+
+ /* If expand_include not set, consider true. */
+ if (!isset($lib_conf['expand_include']) || $lib_conf['expand_include']) {
+ $dirs = glob("$some_lib_inc_path/*", GLOB_ONLYDIR);
+ foreach ($dirs as $dir) {
+ $extra_inc[] = $dir;
+ }
+ }
+ }
+
+ if (!empty($extra_lib)) {
+ $ret .= ' "--with-extra-libs=' . implode(';', $extra_lib) .
'" '
+ . ' "--with-extra-includes=' . implode(';', $extra_inc) .
'" ';
+ }
+ } else {
+ $data['libs'] = array();
+ }
+
+ $this->configure_data = $data;
+
+ return $ret;
+ }
+
+ public function getLibraryConfig($name)
+ {
+ $ret = array();
+
+ $known_path = __DIR__ . '/../data/config/pickle/libs.ini';
+ $lib_conf = parse_ini_file($known_path, true, INI_SCANNER_RAW);
+
+ if (isset($lib_conf[$name]) && is_array($lib_conf[$name])) {
+ $ret = $lib_conf[$name];
+ }
+
+ return $ret;
+ }
}
diff --git a/client/script/pickle.php b/client/script/pickle.php
index 90ebd19..17e3852 100644
--- a/client/script/pickle.php
+++ b/client/script/pickle.php
@@ -77,17 +77,28 @@ foreach ($builds as $build_name) {
echo "Running pickle build" . PHP_EOL;
+ try {
$ret = $build->build($ext);
+ } catch (Exception $e) {
+ echo 'Error: ' . $e->getMessage() . PHP_EOL;
+
+ $ret = array("return_value" => 1, "log" => "");
+ /* send error mail*/
+
+ continue;
+ }
+
if ($ret["return_value"]) {
/* XXX build->clean() is gonna remove all the temp files, pack the logs before */
$build->clean();
- //$ext->cleanup();
+ $ext->cleanup();
$was_errors = true;
unset($ext);
unset($build);
+ echo "Build failed" . PHP_EOL;
echo $ret["log"];
continue;