| OLD | NEW |
| (Empty) |
| 1 # | |
| 2 # Copyright (C) 2005 Nikolas Zimmermann <wildfox@kde.org> | |
| 3 # Copyright (C) 2011 Google Inc. | |
| 4 # | |
| 5 # This library is free software; you can redistribute it and/or | |
| 6 # modify it under the terms of the GNU Library General Public | |
| 7 # License as published by the Free Software Foundation; either | |
| 8 # version 2 of the License, or (at your option) any later version. | |
| 9 # | |
| 10 # This library is distributed in the hope that it will be useful, | |
| 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 13 # Library General Public License for more details. | |
| 14 # | |
| 15 # You should have received a copy of the GNU Library General Public License | |
| 16 # along with this library; see the file COPYING.LIB. If not, write to | |
| 17 # the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
| 18 # Boston, MA 02110-1301, USA. | |
| 19 # | |
| 20 | |
| 21 use strict; | |
| 22 use warnings; | |
| 23 | |
| 24 use Config; | |
| 25 use IPC::Open2; | |
| 26 use IPC::Open3; | |
| 27 | |
| 28 BEGIN { | |
| 29 use Exporter (); | |
| 30 our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); | |
| 31 $VERSION = 1.00; | |
| 32 @ISA = qw(Exporter); | |
| 33 @EXPORT = qw(&applyPreprocessor); | |
| 34 %EXPORT_TAGS = ( ); | |
| 35 @EXPORT_OK = (); | |
| 36 } | |
| 37 | |
| 38 # Returns an array of lines. | |
| 39 sub applyPreprocessor | |
| 40 { | |
| 41 my $fileName = shift; | |
| 42 my $defines = shift; | |
| 43 my $preprocessor = shift; | |
| 44 | |
| 45 my @args = (); | |
| 46 if (!$preprocessor) { | |
| 47 require Config; | |
| 48 if ($ENV{CC}) { | |
| 49 $preprocessor = $ENV{CC}; | |
| 50 } elsif (($Config::Config{'osname'}) =~ /solaris/i) { | |
| 51 $preprocessor = "/usr/sfw/bin/gcc"; | |
| 52 } else { | |
| 53 $preprocessor = "/usr/bin/gcc"; | |
| 54 } | |
| 55 push(@args, qw(-E -P -x c++)); | |
| 56 } | |
| 57 | |
| 58 # Remove double quotations from $defines and extract macros. | |
| 59 # For example, if $defines is ' "A=1" "B=1" C=1 "" D ', | |
| 60 # then it is converted into four macros -DA=1, -DB=1, -DC=1 and -DD. | |
| 61 $defines =~ s/\"//g; | |
| 62 my @macros = grep { $_ } split(/\s+/, $defines); # grep skips empty macros. | |
| 63 @macros = map { "-D$_" } @macros; | |
| 64 | |
| 65 my $pid = 0; | |
| 66 if ($Config{osname} eq "cygwin" || $Config{osname} eq 'MSWin32') { | |
| 67 # This call can fail if Windows rebases cygwin, so retry a few times unt
il it succeeds. | |
| 68 for (my $tries = 0; !$pid && ($tries < 20); $tries++) { | |
| 69 eval { | |
| 70 # Suppress STDERR so that if we're using cl.exe, the output | |
| 71 # name isn't needlessly echoed. | |
| 72 use Symbol 'gensym'; my $err = gensym; | |
| 73 $pid = open3(\*PP_IN, \*PP_OUT, $err, split(' ', $preprocessor),
@args, @macros, $fileName); | |
| 74 1; | |
| 75 } or do { | |
| 76 sleep 1; | |
| 77 } | |
| 78 }; | |
| 79 } else { | |
| 80 $pid = open2(\*PP_OUT, \*PP_IN, split(' ', $preprocessor), @args, @macro
s, $fileName); | |
| 81 } | |
| 82 close PP_IN; | |
| 83 my @documentContent = <PP_OUT>; | |
| 84 close PP_OUT; | |
| 85 waitpid($pid, 0); | |
| 86 return @documentContent; | |
| 87 } | |
| 88 | |
| 89 1; | |
| OLD | NEW |