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