0ba9504c7efbde2815bf69d3f0d637c04649530f
[WebKit-https.git] / Tools / Scripts / copy-webkitlibraries-to-product-directory
1 #!/usr/bin/perl -w
2
3 # Copyright (C) 2005, 2008, 2010, 2011, 2012, 2013 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 FindBin;
28 use lib $FindBin::Bin;
29 use webkitdirs;
30
31 my $productDir = shift @ARGV;
32 $productDir = $ENV{BUILT_PRODUCTS_DIR} if !$productDir;
33
34 chdirWebKit();
35
36 my @librariesToCopy = (
37     "libWebKitSystemInterfaceLion.a",
38     "libWebKitSystemInterfaceMountainLion.a",
39 );
40
41 my $ranlib = `xcrun -find ranlib`;
42 chomp $ranlib;
43 foreach my $libName (@librariesToCopy) {
44     my $srcLib = "WebKitLibraries/" . $libName;
45     my $lib = "$productDir/" . $libName;
46     if (!-e $lib || -M $lib > -M $srcLib) {
47         print "Updating $lib\n";
48         (system("ditto", $srcLib, $lib) == 0) or die;
49         (system($ranlib, $lib) == 0) or die;
50     }
51 }
52
53 (system("mkdir", "-p", "$productDir/usr/local/include") == 0) or die;
54
55 sub unpackIfNecessary
56 {
57     my ($targetDir, $sampleFile, $package, $hasLibraries) = @_;
58     if (!-e $sampleFile || -M $sampleFile > -M $package) {
59         print "Unpacking $package into $targetDir\n";
60         (system("tar -C $targetDir -xmf $package") == 0) or die;
61         if ($hasLibraries) {
62             foreach my $library (`tar -tf $package`) {
63                 chomp $library;
64                 print "   Ranlib $library\n";
65                 (system($ranlib, $targetDir . "/" . $library) == 0) or die;
66             }
67         }
68         return 1;
69     }
70     return 0;
71 }
72
73 sub dittoHeaders
74 {
75     my ($srcHeader, $header) = @_;
76     if (!-e $header || -M $header > -M $srcHeader) {
77         print "Updating $header\n";
78         (system("ditto", $srcHeader, $header) == 0) or die;
79     }
80 }
81
82 dittoHeaders("WebKitLibraries/WebKitSystemInterface.h", "$productDir/usr/local/include/WebKitSystemInterface.h");
83
84 if ($ENV{ENABLE_FTL_JIT}) {
85     # Determine where to get LLVM binaries and headers.
86     my $majorDarwinVersion = (split /\./, `uname -r`)[0];
87     my $llvmLibraryPackage;
88     my $llvmIncludePackage;
89     my $useOwnLLVM = 0;
90     my $ownLLVMDirectory;
91     if (defined($ENV{LLVM_SOURCE_PATH})) {
92         $useOwnLLVM = 1;
93         $ownLLVMDirectory = $ENV{LLVM_SOURCE_PATH};
94     } elsif (-d "llvm" && -e "llvm/LLVMBuild.txt") {
95         $useOwnLLVM = 1;
96         $ownLLVMDirectory = sourceDir() . "/llvm";
97     } elsif (defined($ENV{LLVM_LIBRARY_PACKAGE}) && defined($ENV{LLVM_INCLUDE_PACKAGE})) {
98         $llvmLibraryPackage = $ENV{LLVM_LIBRARY_PACKAGE};
99         $llvmIncludePackage = $ENV{LLVM_INCLUDE_PACKAGE};
100     } elsif ($majorDarwinVersion == 11) {
101         $llvmLibraryPackage = "WebKitLibraries/LLVMLibrariesLion.tar.bz2";
102         $llvmIncludePackage = "WebKitLibraries/LLVMIncludesLion.tar.bz2";
103     } elsif ($majorDarwinVersion == 12) {
104         $llvmLibraryPackage = "WebKitLibraries/LLVMLibrariesMountainLion.tar.bz2";
105         $llvmIncludePackage = "WebKitLibraries/LLVMIncludesMountainLion.tar.bz2";
106     } else {
107         print "Don't know where to find LLVM!\n";
108         print "\n";
109         print "Try defining LLVM_LIBRARY_PACKAGE and LLVM_INCLUDE_PACKAGE.\n";
110         print "\n";
111         print "Alternatively, you can check out llvm trunk into the WebKit directory:\n";
112         print "svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm\n";
113         exit 1;
114     }
115
116     sub fileContains
117     {
118         my ($filename, $string) = @_;
119         open my $fileHandle, '<', $filename or die;
120         while (<$fileHandle>) {
121             return 1 if /^$string$/;
122         }
123         return 0;
124     }
125
126     sub fileContentsEquals
127     {
128         my ($filename, $string) = @_;
129         open my $fileHandle, '<', $filename or die;
130         binmode $fileHandle;
131         my $contents = <$fileHandle>;
132         return $contents eq $string;
133     }
134
135     my $shouldUpdateLLVMLibraryToken = 0;
136
137     if ($useOwnLLVM) {
138         if (!-e "$ownLLVMDirectory/Makefile.config") {
139             print("Configuring LLVM.\n");
140             (system("sh", "Tools/Scripts/configure-llvm", $ownLLVMDirectory)==0) or die;
141         }
142
143         print("Building LLVM.\n");
144         chdir $ownLLVMDirectory;
145         (system("make -j `sysctl -n hw.availcpu`") == 0) or die;
146         chdirWebKit();
147         
148         my $ownLLVMBuildMode = "";
149         if (fileContains($ownLLVMDirectory . "/Makefile.config", "ENABLE_OPTIMIZED=1")) {
150             $ownLLVMBuildMode .= "Release";
151         } else {
152             $ownLLVMBuildMode .= "Debug";
153         }
154         
155         if (fileContains($ownLLVMDirectory . "/Makefile.config", "DISABLE_ASSERTIONS=1")) {
156             # Nothing to do.
157         } else {
158             $ownLLVMBuildMode .= "+Asserts";
159         }
160         
161         my $librarySourceDirectory = "$ownLLVMDirectory/$ownLLVMBuildMode/lib";
162         my $libraryTargetDirectory = $productDir;
163         $shouldUpdateLLVMLibraryToken = 0;
164         print("Symlinking libraries from $librarySourceDirectory to $libraryTargetDirectory\n");
165         opendir (my $dirHandle, $librarySourceDirectory);
166         while (my $filename = readdir($dirHandle)) {
167             next if $filename !~ /\.a$/;
168             next if $filename =~ /libgtest/;
169             print "   Symlink $filename\n";
170             my $sourceLibrary = "$librarySourceDirectory/$filename";
171             my $targetLibrary = "$libraryTargetDirectory/$filename";
172             my $ranlibToken = "$libraryTargetDirectory/.ranlibToken-$filename";
173             unlink($targetLibrary);
174             symlink($sourceLibrary, $targetLibrary);
175             if (!-e $ranlibToken
176                 || !fileContentsEquals($ranlibToken, $sourceLibrary)
177                 || -M $ranlibToken > -M $sourceLibrary) {
178                 print "   Ranlib $filename\n";
179                 (system($ranlib, $targetLibrary) == 0) or die;
180                 (open my $fileHandle, ">", $ranlibToken) or die;
181                 print {$fileHandle} "$sourceLibrary";
182                 close $fileHandle;
183                 $shouldUpdateLLVMLibraryToken = 1;
184             }
185         }
186         closedir $dirHandle;
187     } else {
188         $shouldUpdateLLVMLibraryToken =
189             unpackIfNecessary($productDir, "$productDir/libLLVMCore.a", $llvmLibraryPackage, 1);
190     }
191
192     if ($useOwnLLVM) {
193         (system("rm", "-rf", "$productDir/usr/local/include/llvm") == 0) or die;
194         (system("rm", "-rf", "$productDir/usr/local/include/llvm-c") == 0) or die;
195         symlink("$ownLLVMDirectory/include/llvm", "$productDir/usr/local/include/llvm") or die;
196         symlink("$ownLLVMDirectory/include/llvm-c", "$productDir/usr/local/include/llvm-c") or die;
197     } else {
198         unpackIfNecessary("$productDir/usr/local/include", "$productDir/usr/local/include/llvm-c/Core.h", $llvmIncludePackage, 0);
199     }
200
201     my $llvmLibraryToken = "$productDir/usr/local/include/WebKitLLVMLibraryToken.h";
202     if ($shouldUpdateLLVMLibraryToken || !-e $llvmLibraryToken) {
203         (open my $fileHandle, ">", $llvmLibraryToken) or die;
204         print {$fileHandle} "/* This file fools WebKit's build system into relinking JavaScriptCore if the LLVM libraries changed. */\n";
205         close $fileHandle;
206     }
207
208 }
209