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