84d049668dd0db66e94324e5196b6988cf149b1c
[WebKit-https.git] / Tools / Scripts / copy-webkitlibraries-to-product-directory
1 #!/usr/bin/perl -w
2
3 # Copyright (C) 2005-2016 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 #
9 # 1.  Redistributions of source code must retain the above copyright
10 #     notice, this list of conditions and the following disclaimer. 
11 # 2.  Redistributions in binary form must reproduce the above copyright
12 #     notice, this list of conditions and the following disclaimer in the
13 #     documentation and/or other materials provided with the distribution. 
14 #
15 # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
16 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 # DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
19 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
26 use strict;
27 use File::Spec;
28 use FindBin;
29 use Getopt::Long qw(:config pass_through);
30 use lib $FindBin::Bin;
31 use webkitdirs;
32
33 my $showHelp = 0;
34 my $wksi = 0;
35 my $clean = 0;
36 my $useFullLibPaths = 0;
37 my $osxVersion;
38 my $force = 0;
39
40 determineXcodeSDK();
41
42 my $programName = basename($0);
43 my $usage = <<EOF;
44 Usage: $programName [options]
45   --help                        Show this help message
46   --[no-]wksi                   Toggle copying WebKitSystemInterface drops (default: $wksi)
47   --clean                       Clean the libraries (default: $clean)
48   --[no-]use-full-lib-paths     Toggle using full library paths
49   --sdk=<sdk>                   Use a specific Xcode SDK
50   --device                      Use the current iphoneos.internal SDK (iOS only)
51   --simulator                   Use the current iphonesimulator SDK (iOS only)
52   --osx-version=<version>       Set the OS X version to use when deciding what to copy.
53   --[no-]force                  Toggle forcing the copy - i.e. ignoring timestamps (default: $force)
54 EOF
55
56 GetOptions(
57     'help' => \$showHelp,
58     'wksi!' => \$wksi,
59     'clean' => \$clean,
60     'use-full-lib-paths!' => \$useFullLibPaths,
61     'osx-version=s' => \$osxVersion,
62     'force!' => \$force
63 );
64
65 if ($showHelp) {
66    print STDERR $usage;
67    exit 1;
68 }
69
70 my $productDir = shift @ARGV;
71 if ($productDir) {
72     $productDir = File::Spec->rel2abs($productDir);
73 } else {
74     $productDir = $ENV{BUILT_PRODUCTS_DIR} || productDir();
75 }
76
77 if (!isIOSWebKit() && !$osxVersion &&!isAnyWindows()) {
78     $osxVersion = `sw_vers -productVersion | cut -d. -f-2`;
79     chomp($osxVersion);
80 }
81
82 chdirWebKit();
83
84 sub executeRanlib($)
85 {
86     my ($library) = @_;
87     my @args;
88     push @args, ("-sdk", xcodeSDK()) if xcodeSDK();
89     push @args, "ranlib";
90     push @args, "-no_warning_for_no_symbols" if isIOSWebKit();
91     system("xcrun", @args, $library) == 0 or die;
92 }
93
94 sub unpackIfNecessary
95 {
96     my ($targetDir, $sampleFile, $package, $hasLibraries) = @_;
97     if ($force || !-e $sampleFile || -M $sampleFile > -M $package) {
98         print "Unpacking $package into $targetDir\n";
99         (system("tar -C $targetDir -xmf $package") == 0) or die;
100         if ($hasLibraries) {
101             foreach my $library (`tar -tf $package`) {
102                 chomp $library;
103                 print "   Ranlib $library\n";
104                 executeRanlib($targetDir . "/" . $library);
105             }
106         }
107         return 1;
108     }
109     return 0;
110 }
111
112 sub dittoHeaders
113 {
114     my ($srcHeader, $header) = @_;
115     if ($force || !-e $header || -M $header > -M $srcHeader) {
116         print "Updating $header\n";
117         (system("ditto", $srcHeader, $header) == 0) or die;
118     }
119 }
120
121 if ($clean) {
122     print "Cleaning.\n";    
123     (system("rm", "-rf", File::Spec->catfile($productDir, "usr", "local", "include", "WebKitSystemInterface.h")) == 0) or die;
124     unlink glob "$productDir/libWebKitSystemInterface*" or die if glob "$productDir/libWebKitSystemInterface*";
125     unlink glob "$productDir/usr/local/lib/libWebKitSystemInterface*" or die if glob "$productDir/usr/local/lib/libWebKitSystemInterface*";
126     unlink glob "$productDir/libLTO*" or die if glob "$productDir/libLTO*";
127 }
128
129 if ($wksi) {
130     (system("mkdir", "-p", "$productDir/usr/local/include") == 0) or die;
131     
132     my $libraryDir = $useFullLibPaths ? "$productDir/usr/local/lib" : $productDir;
133     (system("mkdir", "-p", $libraryDir) == 0) or die;
134
135     my @librariesToCopy;
136     if (isIOSWebKit()) {
137         push(@librariesToCopy, (
138             "libWebKitSystemInterfaceIOSDevice9.a",
139             "libWebKitSystemInterfaceIOSSimulator9.a",
140         ));
141     } else {
142         push(@librariesToCopy, (
143             "libWebKitSystemInterfaceYosemite.a",
144             "libWebKitSystemInterfaceElCapitan.a",
145             "libWebKitSystemInterfaceOSX10.12.a"
146         ));
147     }
148
149     foreach my $libraryName (@librariesToCopy) {
150         my $sourceLibrary = "WebKitLibraries/" . $libraryName;
151         my $targetLibrary = "$libraryDir/" . $libraryName;
152         if ($force || !-e $targetLibrary || -M $targetLibrary > -M $sourceLibrary) {
153             print "Updating $targetLibrary\n";
154             (system("ditto", $sourceLibrary, $targetLibrary) == 0) or die;
155             executeRanlib($targetLibrary);
156         }
157     }
158     
159     dittoHeaders("WebKitLibraries/WebKitSystemInterface.h", "$productDir/usr/local/include/WebKitSystemInterface.h");
160 }
161
162 sub fileContains
163 {
164     my ($filename, $string) = @_;
165     open my $fileHandle, '<', $filename or die;
166     while (<$fileHandle>) {
167         return 1 if /^$string$/;
168     }
169     return 0;
170 }
171
172 sub isContentOfFileEqualToString($$)
173 {
174     my ($filename, $string) = @_;
175     open my $fileHandle, '<', $filename or die;
176     binmode $fileHandle;
177     my $contents = <$fileHandle>;
178     return $contents eq $string;
179 }
180