Here's my first attempt at a revision of the build process used by pecl4win:

- the pecl sources and version numbers are gotten off the pecl website (transport layer can be easily switched if the server is the same); once a version is downloaded it is never again, unless deleted; the download script can operate on a given extension/version or globally on everything in the db

- the build script is modified to build the same pecl extension for all php versions. It is untested, since I do not have (yet) a working win32 build env (missing msdev at the moment)

The one question I have facing right now is: is the pversion column in the ext table used at all? If not, it could be converted to hold the pecl extension version. If it is used, I would have to add a new column to the ext table. Any way, most db queries would have to be rewritten. Any indication on the best approach would be preciated, before I start on it...

Bye
Gaetano

--- mk4.php    Fri Feb 02 01:52:26 2007
+++ mk42.php    Sun Jun 03 23:43:49 2007
@@ -4,16 +4,21 @@

require dirname(__FILE__) . '/conf.php';

+//$base="/php4build";
+$base="C:/htdocs/pecl4win_cvs/pecl4win/lib";
+
if (!strlen($argv[1])) {
  $branch = "4_3";
} else {
  $branch = $argv[1];
}

-if (!strlen($argv[2])) {
+if (!strlen(@$argv[2])) {
  $pecl_ext = "*";
} else {
-  $pecl_ext = $argv[2];
+  $pecl_ext = $argv;
+  array_shift($pecl_ext);
+  array_shift($pecl_ext);
}

if (!isset($conf[$branch])) {
@@ -30,15 +35,17 @@
putenv('LIB=' . $lib);

if ($pecl_ext != "*") {
-  $dsps = array($c['pecl_dir'] . "/ext/{$pecl_ext}/{$pecl_ext}.dsp");
+  $dsps = array();
+  foreach($pecl_ext as $pecl_ext2)
+    $dsps[] = $base . "/exts/{$pecl_ext2}/{$pecl_ext2}.dsp";
} else {
-  $dsps = glob($c['pecl_dir'] . "/ext/{$pecl_ext}/{$pecl_ext}.dsp");
+  $dsps = glob($base . "/exts/{$pecl_ext}/{$pecl_ext}.dsp");
}

$fail = "";

foreach ($dsps as $dsp) {
-  print "Trying $dsp...";
+  print "Trying $dsp...\n";
  $dir = dirname($dsp);
  chdir($dir);
  system("rm -rf $dir/Release_TS");
@@ -49,10 +56,10 @@

if ($res || ((!$content = @file_get_contents($c['pecl_dir'] . "/Release_TS/$fname")) && (!$content = @file_get_contents("$dir/Release_TS/$fname")) )) {
    print "$dir/Release_TS/$fname";
-    print "FAILED";
+    print " FAILED";
    $fail .= "\n\nFailed building $dsp\n" . implode("\n", $out);
  } else {
-    print "SUCCESS uploading $fname ";
+    print " SUCCESS uploading $fname ";
    $downloads = 0;

if (($res = $DB->query(safe_sql_str("select downloads from ext where fname=!s and branch=!s and pversion=!s", $fname, $branch, $c['version'])))
@@ -60,7 +67,7 @@
      $downloads = (int)$row['downloads'];
$DB->query(safe_sql_str("delete from ext where fname=!s and branch=!s and pversion=!s", $fname, $branch, $c['version']));
    }
- + $res = $DB->query(safe_sql_str("insert into ext(fname, branch, pversion, clog, md5hash, filesize, updated, content, downloads) values (!s, !s, !s, !s, !s, !i, !t, !b, !i)", $fname, $branch, $c['version'], implode("\n", $out), md5($content), strlen($content), time(), $content, $downloads));

    if ($res) {

--- buildall.sh    Fri Mar 16 00:36:21 2007
+++ buildall2.sh    Sun Jun 03 22:59:01 2007
@@ -1,11 +1,18 @@
#!/bin/bash
# $Id: buildall.sh,v 1.9 2007/03/15 22:36:21 edink Exp $

+###
+### base idea:
+### + get new revisions from pecl (ie those not yet downloaded)
+### + for every version of php: build it
+
. /etc/vcenv.sh 6

cvsopt="-z3 -q"
-base="/php4build"
-php="$base/bin/php -c $base/bin/php.ini"
+###base="/php4build"
+base="C:/htdocs/pecl4win_cvs/pecl4win/lib"
+###php="$base/bin/php -c $base/bin/php.ini"
+php="C:/php5/php -c C:/php5/php.ini"

if [ -f $base/lock.pecl ]; then
    echo Builder locked
@@ -14,44 +21,54 @@

touch $base/lock.pecl

+echo $php $base/bin/fetch.php all $base/exts
+exit 0
+
+# get new revisions from pecl (ie those not yet downloaded)
+cd $base/exts
+extlist=`$php $base/bin/fetch.php all $base/exts`
+
+
# Make php 4.3 and 4.4
-cd $base/pecl_4_3/ext
-cvs $cvsopt upd -dP
+###cd $base/pecl_4_3/ext
+###cvs $cvsopt upd -dP
# Compiler crashes on ingres module, delete it
-rm -rf ingres
-$php $base/bin/mk4.php 4_3
-$php $base/bin/mk4.php 4_4
+###rm -rf ingres
+$php $base/bin/mk42.php 4_3 $ext_list
+
+$php $base/bin/clean_ext2.php $ext_list
+$php $base/bin/mk42.php 4_4

# Make php 5.0
-cd $base/pecl_5_0
-cvs $cvsopt upd -dP
+###cd $base/pecl_5_0
+###cvs $cvsopt upd -dP
# Relic from the past no one wants to delete from cvs
-rm -rf pdo_ids
-$php $base/bin/clean_ext.php 5_0
-$php $base/bin/mk5.php 5_0
+###rm -rf pdo_ids
+$php $base/bin/clean_ext2.php $ext_list
+$php $base/bin/mk52.php 5_0

# Make php 5.1
-cd $base/pecl_5_0
-cvs $cvsopt upd -dP
+###cd $base/pecl_5_0
+###cvs $cvsopt upd -dP
# Relic from the past no one wants to delete from cvs
-rm -rf pdo_ids
-$php $base/bin/clean_ext.php 5_1
-$php $base/bin/mk5.php 5_1
+###rm -rf pdo_ids
+$php $base/bin/clean_ext2.php 5_1
+$php $base/bin/mk52.php 5_1

# Make php 5.2
-cd $base/pecl_5_2
-cvs $cvsopt upd -dP
+###cd $base/pecl_5_2
+###cvs $cvsopt upd -dP
# Relic from the past no one wants to delete from cvs
-rm -rf pdo_ids
-$php $base/bin/clean_ext.php 5_2
-$php $base/bin/mk5.php 5_2
+###rm -rf pdo_ids
+$php $base/bin/clean_ext2.php 5_2
+$php $base/bin/mk52.php 5_2

# Make php 6.0
-cd $base/pecl_6_0
-cvs $cvsopt upd -dP
+###cd $base/pecl_6_0
+###cvs $cvsopt upd -dP
# Relic from the past no one wants to delete from cvs
-rm -rf pdo_ids
-$php $base/bin/clean_ext.php 6_0
-$php $base/bin/mk5.php 6_0
+###rm -rf pdo_ids
+$php $base/bin/clean_ext2.php 6_0
+$php $base/bin/mk52.php 6_0

rm -f $base/lock.pecl


New file: fetch.php
<?php
/**
* Given a pecl extension name and a target dir, downloads all versions from pecl * and unpacks them as subdirectories. Optionally gets a single given version
* ('last' accepted to get latest version, and 'all' to get all extensions).
* Does not download extensions/versions that exist already locally as directory.
*
* @author Gaetano Giunta
* @version $Id: $
* @copyright (C) G. Giunta 2007
* @license code licensed under the BSD License
*/

if ($argc < 3)
{
   die ('Usage: fetch.php extension target_dir [version]');
}
$ext = $argv[1];
$dir = $argv[2];
$ver = $argc >= 4 ? $argv[3] : null;

//ini_set('display_errors', false);


/**
* Given a pecl extension name, returns an array of existing versions (or false) * @todo fetch more info, such as release date, alpha/beta/stable state, etc... ?
*/
function get_versions($ext)
{
   $file = file_get_contents('http://pecl.php.net/package/'.$ext.'/');
//$file = file_get_contents('c:/htdocs/pecl4win_cvs/pecl4win/lib/bin/hash.htm'); if (preg_match_all('|href="/package/'.$ext.'/([^"]*)|i', $file, $matches)) {
       return ($matches[1]);
   }
   else
       return false;
}

/// dowloads a given version of a given extension (in tgz format). 'last' ok as version name
function get_ext($ext, $ver)
{
   if ($ver == 'last')
   {
       return file_get_contents('http://pecl.php.net/get/'.$ext);
   }
   else
   {
return file_get_contents('http://pecl.php.net/get/'.$ext.'-'.$ver.'.tgz');
   }
}


if ($ext == '*' or $ext == 'all')
{
   require dirname(__FILE__) . '/conf.php';
   $res = $DB->query('select distinct fname from ext');
   $exts = array();
   while ($row = $DB->fetchRow($res))
   {
       $file = new stdClass;
       $DB->loadFromDbRow($file, $res, $row);
       $exts[] = substr($file->fname, 4, -4);
   }
}
else
{
   $exts = array($ext);
}

foreach($exts as $ext)
{
   if ($ver)
   {
       $vers = array($ver);
   }
   else
   {
       $vers = get_versions($ext);
       if ($vers == null)
       {
//echo "ERROR: could not fetch version list for extension $ext\n";
           $vers = array();
       }
   }

   foreach($vers as $version)
   {
       $filename = $ext.'-'.$version;
       // do not download again if it exists
       if (is_dir($dir.'/'.$filename))
       {
           continue;
       }
       $file = get_ext($ext, $version);
       if ($file != '')
       {
           /// @todo use php zip functions to degzip the file?
           file_put_contents($dir.'/'.$filename.'.tgz', $file);
system("gunzip $filename.tgz && tar -xvf $filename.tar && rm $filename.tar");
           echo "$filename ";
       }
       else
       {
//echo "ERROR: could not fetch version $version of extension $ext\n";
       }
   }
}
?>

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to