* first shot at "pear build" command for building extensions from C code

This commit is contained in:
Stig Bakken 2002-05-27 01:20:10 +00:00
parent 735f4a129f
commit 622c684164
4 changed files with 157 additions and 5 deletions

102
pear/PEAR/Command/Build.php Normal file
View File

@ -0,0 +1,102 @@
<?php
//
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2002 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Author: Stig Bakken <ssb@fast.no> |
// | Tomas V.V.Cox <cox@idecnet.com> |
// | |
// +----------------------------------------------------------------------+
//
// $Id$
require_once "PEAR/Command/Common.php";
/**
* PEAR commands for building extensions.
*
*/
class PEAR_Command_Build extends PEAR_Command_Common
{
var $commands = array(
'build' => array(
'summary' => 'Build an Extension From C Source',
'function' => 'doBuild',
'shortcut' => 'b',
'options' => array(),
'doc' => '[package.xml]
Builds one or more extensions contained in a package.'
),
);
/**
* PEAR_Command_Build constructor.
*
* @access public
*/
function PEAR_Command_Build(&$ui, &$config)
{
parent::PEAR_Command_Common($ui, $config);
}
function doBuild($command, $options, $params)
{
if (sizeof($params) < 1) {
$params[0] = 'package.xml';
}
$obj = &new PEAR_Common();
if (PEAR::isError($info = $obj->infoFromAny($params[0]))) {
return $info;
}
$configure_command = "./configure";
if (isset($info['configure_options'])) {
foreach ($info['configure_options'] as $o) {
$r = $this->ui->userDialog($o['prompt'], 'text', @$o['default']);
if ($r == 'yes' && substr($o['name'], 0, 5) == 'with-') {
$configure_command .= " --$o[name]";
} else {
$configure_command .= " --$o[name]=$r";
}
}
}
if (isset($_ENV['MAKE'])) {
$make_command = $_ENV['MAKE'];
} else {
$make_command = 'make';
}
$to_run = array(
"phpize",
$configure_command,
$make_command,
);
foreach ($to_run as $cmd) {
if (PEAR::isError($err = $this->_runCommand($cmd))) {
return $err;
}
}
return true;
}
function _runCommand($command)
{
$pp = @popen($command, "r");
if (!$pp) {
return $this->raiseError("failed to run `$command'");
}
while ($line = fgets($pp, 1024)) {
$this->ui->displayLine(rtrim($line));
}
pclose($pp);
}
}

View File

@ -61,7 +61,7 @@ $GLOBALS['_PEAR_Common_dependency_relations'] = array('has','eq','lt','le','gt',
* Valid file roles
* @var array
*/
$GLOBALS['_PEAR_Common_file_roles'] = array('php','ext','test','doc','data','extsrc','script');
$GLOBALS['_PEAR_Common_file_roles'] = array('php','ext','test','doc','data','src','script');
/**
* Valid replacement types
@ -446,6 +446,16 @@ class PEAR_Common extends PEAR
$this->pkginfo['release_deps'][$this->d_i] = $attribs;
}
break;
case 'configureoptions':
if (!$this->in_changelog) {
$this->pkginfo['configure_options'] = array();
}
break;
case 'configureoption':
if (!$this->in_changelog) {
$this->pkginfo['configure_options'][] = $attribs;
}
break;
}
}
@ -868,6 +878,19 @@ class PEAR_Common extends PEAR
}
$ret .= "$indent </deps>\n";
}
if (isset($pkginfo['configure_options'])) {
$ret .= "$indent <configureoptions>\n";
foreach ($pkginfo['configure_options'] as $c) {
$ret .= "$indent <configureoption name=\"".
htmlspecialchars($c['name']) . "\"";
if (isset($c['default'])) {
$ret .= " default=\"" . htmlspecialchars($c['default']) . "\"";
}
$ret .= " prompt=\"" . htmlspecialchars($c['prompt']) . "\"";
$ret .= "/>\n";
}
$ret .= "$indent </configureoptions>\n";
}
if (isset($pkginfo['filelist'])) {
$ret .= "$indent <filelist>\n";
foreach ($pkginfo['filelist'] as $file => $fa) {
@ -1036,6 +1059,17 @@ class PEAR_Common extends PEAR
$i++;
}
}
if (!empty($info['configure_options'])) {
$i = 1;
foreach ($info['configure_options'] as $c) {
if (empty($c['name'])) {
$errors[] = "configure option $i: missing name";
}
if (empty($c['prompt'])) {
$errors[] = "configure option $i: missing prompt";
}
}
}
if (empty($info['filelist'])) {
$errors[] = 'no files';
} else {

View File

@ -35,6 +35,11 @@
<state>beta</state>
<date>YYYY-MM-DD</date>
<notes>
* fixed broken "help" command
* new command: "info"
* new command: "config-help"
* un-indent multi-line data from xml description files
* new command: "build"
</notes>
<filelist>
<file role="data" name="package.dtd"/>
@ -45,6 +50,7 @@
<file role="php" name="Command.php"/>
<dir name="Command">
<file role="php" name="Auth.php"/>
<file role="php" name="Build.php"/>
<file role="php" name="Common.php"/>
<file role="php" name="Config.php"/>
<file role="php" name="Install.php"/>

View File

@ -1,5 +1,5 @@
<!--
$Id: package.dtd,v 1.24 2002-04-28 07:58:41 ssb Exp $
$Id: package.dtd,v 1.25 2002-05-27 01:20:07 ssb Exp $
This is the PEAR package description, version 1.0b7.
It should be used with the informal public identifier:
@ -43,7 +43,7 @@
<!ELEMENT changelog (release)+>
<!ELEMENT release (version|license|state|date|notes|filelist|deps|provides|script)+>
<!ELEMENT release (version|license|state|date|notes|filelist|deps|provides|script|configureoptions)+>
<!ELEMENT version (#PCDATA)>
@ -60,9 +60,11 @@
baseinstalldir CDATA #IMPLIED>
<!ELEMENT file (replace*)>
<!ATTLIST file role (php|ext|test|doc|data|script) 'php'
<!ATTLIST file role (php|ext|src|test|doc|data|script) 'php'
debug (na|on|off) 'na'
threaded (na|on|off) 'na'
zts (na|on|off) 'na'
phpapi NUMBER #IMPLIED
zendapi NUMBER #IMPLIED
format CDATA #IMPLIED
baseinstalldir CDATA #IMPLIED
platform CDATA #IMPLIED
@ -103,3 +105,11 @@
pre-build |post-build |
pre-configure|post-configure|
pre-setup |post-setup ) #REQUIRED>
<!ELEMENT configureoptions (configureoption*)>
<!ELEMENT configureoption EMPTY>
<!ATTLIST configureoption
name CDATA #REQUIRED
default CDATA #IMPLIED
prompt CDATA #REQUIRED>