]> git.pld-linux.org Git - packages/rpm.git/blob - rpm-php-requires.php
619ebecc33826cee5387d52d0319234a3c1517d0
[packages/rpm.git] / rpm-php-requires.php
1 #!/usr/bin/php
2 <?php
3 /**
4  *
5  * Check system dependences between php-pear modules.
6  *
7  * Paweł Gołaszewski <blues@pld-linux.org> (Perl version)
8  * Michał Moskal <malekith@pld-linux.org> (Perl version)
9  * Elan Ruusamäe <glen@pld-linux.org>
10  *
11  * Requires: php-pear-PHP_CompatInfo
12  * Requires: php-pcre
13  */
14
15 /**
16  * Produce pear(Path/To/File.php) deps
17  * Ported to PHP from Perl version of rpm-php-requires.
18  *
19  * @TODO: use tokenizer to parse php files.
20  */
21 function peardeps($files) {
22         // files inside php_pear_dir have this prefix
23         $prefix = RPM_BUILD_ROOT. PHP_PEAR_DIR . DIRECTORY_SEPARATOR;
24         $length = strlen($prefix);
25
26         $req = array();
27         foreach ($files as $f) {
28                 // skip non-php files
29                 if (substr($f, -4) != '.php') {
30                         continue;
31                 }
32
33                 // subdir inside php_pear_dir
34                 if (substr($f, 0, $length) == $prefix) {
35                         $file_dir = dirname(substr($f, $length));
36                 } else {
37                         $file_dir = null;
38                 }
39
40                 foreach (file($f) as $line) {
41                         // skip comments -- not perfect, matches "*" at start of line (very rare altho)
42                         if (preg_match('/^\s*(#|\/\/|\*|\/\*)/', $line)) {
43                                 continue;
44                         }
45
46                         if (preg_match("/(\W|^)(require|include)(_once)?
47                                         \s* \(? \s*
48                                         (\"([^\"]*)\"|'([^']*)')
49                                         \s* \)? \s* ;/x", $line, $m)) {
50
51                                 if ($m[5]) {
52                                         $x = $m[5];
53                                 } else if ($m[6]) {
54                                         $x = $m[6];
55                                 } else {
56                                         continue 2;
57                                 }
58
59                                 if (substr($x, 0, 2) == './' || substr($x, -1) == '$') {  # XXX must be: CONTAINS DOLLAR
60                                         continue 2;
61                                 }
62
63                                 if (substr($x, -4) != '.php') {
64                                         continue 2;
65                                 }
66                                 $req[$x] = 1;
67                                 continue 2;
68                         }
69
70                         if (is_null($file_dir)) {
71                                 continue;
72                         }
73
74                         if (preg_match("/(\W|^)(require|include)(_once)?
75                                         \s* \(? \s* dirname \s* \( \s* __FILE__ \s* \) \s* \. \s*
76                                         (\"([^\"]*)\"|'([^']*)')
77                                         \s* \)? \s* ;/x", $line, $m)) {
78
79                                 if ($m[5]) {
80                                         $x = $m[5];
81                                 } else if ($m[6]) {
82                                         $x = $m[6];
83                                 } else {
84                                         continue 2;
85                                 }
86
87                                 if (substr($x, -1) == '$') { # XXX must be: CONTAINS DOLLAR
88                                         continue 2;
89                                 }
90                                 if (substr($x, -4) != '.php') {
91                                         continue 2;
92                                 }
93
94                                 $x = "$file_dir/$x";
95                                 // remove double slashes
96                                 // TODO: resolve simpletest/test/../socket.php -> simpletest/socket.php
97                                 $x = str_replace("//", "/", $x);
98                                 $req[$x] = 1;
99                                 continue;
100                         }
101                 }
102         }
103
104         foreach (array_keys($req) as $f) {
105                 // skip self deps
106                 if (array_key_exists($f, $files)) {
107                         continue;
108                 }
109                 echo "pear($f)\n";
110         }
111 }
112
113 /**
114  * Produce dependencies for extensions using PEAR PHP_CompatInfo package.
115  */
116 function extdeps($files) {
117         require_once 'PHP/CompatInfo.php';
118
119         $info = new PHP_CompatInfo('null');
120         $res = $info->parseData($files);
121
122         // minimum php version we accept
123         // "%define php_min_version 5.1.2" in spec to minimum version to be 5.1.2
124         $version = max(PHP_MIN_VERSION, $res['version']);
125
126         if (version_compare($version, '5.0.0', 'ge')) {
127                 # force php-<name> only deps when php5
128                 # XXX what about php-pecl-<name> virtual provides?
129                 $fmt = 'php-%s';
130                 $epoch = 4;
131         } else {
132                 $fmt = 'php(%s)';
133                 $epoch = 3;
134         }
135         echo "php-common >= ", $epoch, ":", $version, "\n";
136
137         // process extensions
138         foreach ($res['extensions'] as $ext) {
139                 // bz2 ext is in php-bzip2 package
140                 if ($ext == 'bz2') {
141                         $ext = 'bzip2';
142                 }
143                 // libxml ext is in php-xml package
144                 if ($ext == 'libxml') {
145                         $ext = 'xml';
146                 }
147
148                 // these need to be lowercased
149                 if (in_array($ext, array('SPL', 'PDO', 'SQLite', 'Reflection', 'SimpleXML'))) {
150                         $ext = strtolower($ext);
151                 }
152
153                 printf("$fmt\n", $ext);
154         }
155 }
156
157 define('RPM_BUILD_ROOT', getenv('RPM_BUILD_ROOT'));
158 define('PHP_PEAR_DIR', '/usr/share/pear');
159 define('PHP_MIN_VERSION', getenv('PHP_MIN_VERSION'));
160
161 if ($argc > 1) {
162         $files = array_splice($argv, 1);
163 } else {
164         $files = explode(PHP_EOL, trim(file_get_contents('php://stdin')));
165 }
166
167 peardeps($files);
168 extdeps($files);
This page took 0.030546 seconds and 2 git commands to generate.