fourthTier: developing LLVM in tandem with WebKit should be fun and easy
[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     }
70 }
71
72 sub dittoHeaders
73 {
74     my ($srcHeader, $header) = @_;
75     if (!-e $header || -M $header > -M $srcHeader) {
76         print "Updating $header\n";
77         (system("ditto", $srcHeader, $header) == 0) or die;
78     }
79 }
80
81 dittoHeaders("WebKitLibraries/WebKitSystemInterface.h", "$productDir/usr/local/include/WebKitSystemInterface.h");
82 dittoHeaders("WebKitLibraries/WebCoreSQLite3", "$productDir/WebCoreSQLite3");
83
84
85 if ($ENV{ENABLE_FTL_JIT}) {
86     # Determine where to get LLVM binaries and headers.
87     my $majorDarwinVersion = (split /\./, `uname -r`)[0];
88     my $llvmLibraryPackage;
89     my $llvmIncludePackage;
90     my $useOwnLLVM = 0;
91     my $ownLLVMDirectory;
92     if (defined($ENV{LLVM_SOURCE_PATH})) {
93         $useOwnLLVM = 1;
94         $ownLLVMDirectory = $ENV{LLVM_SOURCE_PATH};
95     } elsif (-d "llvm" && -e "llvm/LLVMBuild.txt") {
96         $useOwnLLVM = 1;
97         $ownLLVMDirectory = sourceDir() . "/llvm";
98     } elsif (defined($ENV{LLVM_LIBRARY_PACKAGE}) && defined($ENV{LLVM_INCLUDE_PACKAGE})) {
99         $llvmLibraryPackage = $ENV{LLVM_LIBRARY_PACKAGE};
100         $llvmIncludePackage = $ENV{LLVM_INCLUDE_PACKAGE};
101     } elsif ($majorDarwinVersion == 11) {
102         $llvmLibraryPackage = "WebKitLibraries/LLVMLibrariesLion.tar.bz2";
103         $llvmIncludePackage = "WebKitLibraries/LLVMIncludesLion.tar.bz2";
104     } elsif ($majorDarwinVersion == 12) {
105         $llvmLibraryPackage = "WebKitLibraries/LLVMLibrariesMountainLion.tar.bz2";
106         $llvmIncludePackage = "WebKitLibraries/LLVMIncludesMountainLion.tar.bz2";
107     } else {
108         print "Don't know where to find LLVM!\n";
109         print "Try defining LLVM_LIBRARY_PACKAGE and LLVM_INCLUDE_PACKAGE.\n";
110         exit 1;
111     }
112
113     sub fileContains
114     {
115         my ($filename, $string) = @_;
116         open my $fileHandle, '<', $filename or die;
117         while (<$fileHandle>) {
118             return 1 if /^$string$/;
119         }
120         return 0;
121     }
122
123     sub fileContentsEquals
124     {
125         my ($filename, $string) = @_;
126         open my $fileHandle, '<', $filename or die;
127         binmode $fileHandle;
128         my $contents = <$fileHandle>;
129         return $contents eq $string;
130     }
131
132     if ($useOwnLLVM) {
133         print("Building LLVM.\n");
134         chdir $ownLLVMDirectory;
135         my $numCPUString = `sysctl hw.ncpu`;
136         $numCPUString =~ /: /;
137         my $numCPUs = $';
138         (system("make -j $numCPUs") == 0) or die;
139         chdirWebKit();
140     
141         my $ownLLVMBuildMode = "";
142         if (fileContains($ownLLVMDirectory . "/Makefile.config", "ENABLE_OPTIMIZED=1")) {
143             $ownLLVMBuildMode .= "Release";
144         } else {
145             $ownLLVMBuildMode .= "Debug";
146         }
147     
148         # FIXME: Add support for builds that disable assertions.
149         $ownLLVMBuildMode .= "+Asserts";
150     
151         my $librarySourceDirectory = "$ownLLVMDirectory/$ownLLVMBuildMode/lib";
152         my $libraryTargetDirectory = $productDir;
153         print("Symlinking libraries from $librarySourceDirectory to $libraryTargetDirectory\n");
154         opendir (my $dirHandle, $librarySourceDirectory);
155         while (my $filename = readdir($dirHandle)) {
156             next if $filename !~ /\.a$/;
157             print "   Symlink $filename\n";
158             my $sourceLibrary = "$librarySourceDirectory/$filename";
159             my $targetLibrary = "$libraryTargetDirectory/$filename";
160             my $ranlibToken = "$libraryTargetDirectory/.ranlibToken-$filename";
161             unlink($targetLibrary);
162             symlink($sourceLibrary, $targetLibrary);
163             if (!-e $ranlibToken
164                 || !fileContentsEquals($ranlibToken, $sourceLibrary)
165                 || -M $ranlibToken > -M $sourceLibrary) {
166                 print "   Ranlib $filename\n";
167                 (system($ranlib, $targetLibrary) == 0) or die;
168                 (open my $fileHandle, ">", $ranlibToken) or die;
169                     print {$fileHandle} "$sourceLibrary";
170                     close $fileHandle;
171             }
172         }
173         closedir $dirHandle;
174         (system("rm", "-rf", "$productDir/usr/local/include/llvm") == 0) or die;
175         (system("rm", "-rf", "$productDir/usr/local/include/llvm-c") == 0) or die;
176         symlink("$ownLLVMDirectory/include/llvm", "$productDir/usr/local/include/llvm") or die;
177         symlink("$ownLLVMDirectory/include/llvm-c", "$productDir/usr/local/include/llvm-c") or die;
178     } else {
179         unpackIfNecessary("$productDir/usr/local/include", "$productDir/usr/local/include/llvm-c/Core.h", $llvmIncludePackage, 0);
180         unpackIfNecessary($productDir, "$productDir/libLLVMCore.a", $llvmLibraryPackage, 1);
181     }
182
183 }