| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/perl | |
| 2 | |
| 3 # Copyright (C) 2006, 2007, 2008, 2010, 2011 Apple Inc. All rights reserved. | |
| 4 # | |
| 5 # Redistribution and use in source and binary forms, with or without | |
| 6 # modification, are permitted provided that the following conditions | |
| 7 # are met: | |
| 8 # 1. Redistributions of source code must retain the above copyright | |
| 9 # notice, this list of conditions and the following disclaimer. | |
| 10 # 2. Redistributions in binary form must reproduce the above copyright | |
| 11 # notice, this list of conditions and the following disclaimer in the | |
| 12 # documentation and/or other materials provided with the distribution. | |
| 13 # | |
| 14 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' | |
| 15 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, | |
| 16 # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
| 17 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS | |
| 18 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
| 19 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
| 20 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
| 21 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
| 22 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
| 23 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF | |
| 24 # THE POSSIBILITY OF SUCH DAMAGE. | |
| 25 | |
| 26 # "check-for-inappropriate-objc-class-names" script for WebKit Open Source Proje
ct | |
| 27 | |
| 28 # Intended to be invoked from an Xcode build step to check if a framework | |
| 29 # defines any Objective-C class whose name does not have one of the prefixes | |
| 30 # the framework is allowed to use. | |
| 31 | |
| 32 use warnings; | |
| 33 use strict; | |
| 34 | |
| 35 use File::Basename; | |
| 36 | |
| 37 sub touch($); | |
| 38 | |
| 39 my @allowedPrefixes = @ARGV; | |
| 40 | |
| 41 # Xcode will automatically link ObjC binaries against libarclite in some cases,
which defines a class called __ARCLite__. | |
| 42 push(@allowedPrefixes, "__ARCLite"); | |
| 43 | |
| 44 die "No allowed prefixes passed on the command line" if !@allowedPrefixes; | |
| 45 | |
| 46 my $arch = $ENV{'CURRENT_ARCH'}; | |
| 47 my $target = $ENV{'TARGET_NAME'}; | |
| 48 my $variant = $ENV{'CURRENT_VARIANT'}; | |
| 49 my $coverageBuild = $ENV{'WEBKIT_COVERAGE_BUILD'}; | |
| 50 | |
| 51 my $executablePath = "$ENV{'TARGET_BUILD_DIR'}/$ENV{'EXECUTABLE_PATH'}"; | |
| 52 | |
| 53 my $buildTimestampPath = $ENV{'TARGET_TEMP_DIR'} . "/" . basename($0) . join('-'
, @allowedPrefixes) . ".timestamp"; | |
| 54 my $buildTimestampAge = -M $buildTimestampPath; | |
| 55 my $executablePathAge = -M $executablePath; | |
| 56 my $scriptAge = -M $0; | |
| 57 | |
| 58 my $pattern = "^(" . join('|', @allowedPrefixes) . ")"; | |
| 59 | |
| 60 my $sawError = 0; | |
| 61 | |
| 62 if (!defined $executablePathAge || !defined $buildTimestampAge || $executablePat
hAge < $buildTimestampAge || $scriptAge < $buildTimestampAge) { | |
| 63 if (!open NM, "(nm -Ugjp '$executablePath' | sed 's/^/STDOUT:/') 2>&1 |") { | |
| 64 print "ERROR: Could not open $executablePath\n"; | |
| 65 $sawError = 1; | |
| 66 next; | |
| 67 } | |
| 68 my @badNames; | |
| 69 while (<NM>) { | |
| 70 if (/^STDOUT:/) { | |
| 71 next unless /^STDOUT:_OBJC_CLASS_\$_/; | |
| 72 chomp; | |
| 73 my $className = substr($_, 21); | |
| 74 push(@badNames, $className) unless $className =~ /$pattern/; | |
| 75 } else { | |
| 76 print STDERR if $_ ne "nm: no name list\n"; | |
| 77 } | |
| 78 } | |
| 79 close NM; | |
| 80 | |
| 81 if (@badNames) { | |
| 82 | |
| 83 my $shortName = $executablePath; | |
| 84 $shortName =~ s/.*\///; | |
| 85 | |
| 86 print "ERROR: $shortName defines one or more Objective-C classes with in
appropriate names. ($executablePath)\n"; | |
| 87 for my $className (@badNames) { | |
| 88 print "ERROR: Inappropriate Objective-C class name: $className.\n"; | |
| 89 } | |
| 90 | |
| 91 if (@allowedPrefixes > 1) { | |
| 92 print "ERROR: Objective-C class names in $target must have one of th
ese prefixes: " . join(", ", map('"' . $_ . '"', @allowedPrefixes)) . ".\n"; | |
| 93 } else { | |
| 94 print "ERROR: Objective-C class names in $target must have the prefi
x \"" . $allowedPrefixes[0] . "\".\n"; | |
| 95 } | |
| 96 | |
| 97 $sawError = 1; | |
| 98 } | |
| 99 } | |
| 100 | |
| 101 if ($sawError and !$coverageBuild) { | |
| 102 unlink $executablePath; | |
| 103 exit 1; | |
| 104 } | |
| 105 | |
| 106 touch($buildTimestampPath); | |
| 107 exit 0; | |
| 108 | |
| 109 sub touch($) | |
| 110 { | |
| 111 my ($path) = @_; | |
| 112 open(TOUCH, ">", $path) or die "$!"; | |
| 113 close(TOUCH); | |
| 114 } | |
| OLD | NEW |