3 # Copyright (C) 2005, 2008, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
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.
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.
28 use lib $FindBin::Bin;
31 my $productDir = shift @ARGV;
32 $productDir = $ENV{BUILT_PRODUCTS_DIR} if !$productDir;
36 my @librariesToCopy = (
37 "libWebKitSystemInterfaceLion.a",
38 "libWebKitSystemInterfaceMountainLion.a",
39 "libWebCoreSQLite3.a",
42 my $ranlib = `xcrun -find 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;
54 (system("mkdir", "-p", "$productDir/usr/local/include") == 0) or die;
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;
63 foreach my $library (`tar -tf $package`) {
65 print " Ranlib $library\n";
66 (system($ranlib, $targetDir . "/" . $library) == 0) or die;
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;
83 dittoHeaders("WebKitLibraries/WebKitSystemInterface.h", "$productDir/usr/local/include/WebKitSystemInterface.h");
84 dittoHeaders("WebKitLibraries/WebCoreSQLite3", "$productDir/WebCoreSQLite3");
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;
94 if (defined($ENV{LLVM_SOURCE_PATH})) {
96 $ownLLVMDirectory = $ENV{LLVM_SOURCE_PATH};
97 } elsif (-d "llvm" && -e "llvm/LLVMBuild.txt") {
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";
110 print "Don't know where to find LLVM!\n";
112 print "Try defining LLVM_LIBRARY_PACKAGE and LLVM_INCLUDE_PACKAGE.\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";
121 my ($filename, $string) = @_;
122 open my $fileHandle, '<', $filename or die;
123 while (<$fileHandle>) {
124 return 1 if /^$string$/;
129 sub fileContentsEquals
131 my ($filename, $string) = @_;
132 open my $fileHandle, '<', $filename or die;
134 my $contents = <$fileHandle>;
135 return $contents eq $string;
138 my $shouldUpdateLLVMLibraryToken = 0;
141 if (!-e "$ownLLVMDirectory/Makefile.config") {
142 print("Configuring LLVM.\n");
143 (system("sh", "Tools/Scripts/configure-llvm", $ownLLVMDirectory)==0) or die;
146 print("Building LLVM.\n");
147 chdir $ownLLVMDirectory;
148 (system("make -j `sysctl -n hw.availcpu`") == 0) or die;
151 my $ownLLVMBuildMode = "";
152 if (fileContains($ownLLVMDirectory . "/Makefile.config", "ENABLE_OPTIMIZED=1")) {
153 $ownLLVMBuildMode .= "Release";
155 $ownLLVMBuildMode .= "Debug";
158 if (fileContains($ownLLVMDirectory . "/Makefile.config", "DISABLE_ASSERTIONS=1")) {
161 $ownLLVMBuildMode .= "+Asserts";
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);
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";
185 $shouldUpdateLLVMLibraryToken = 1;
190 $shouldUpdateLLVMLibraryToken =
191 unpackIfNecessary($productDir, "$productDir/libLLVMCore.a", $llvmLibraryPackage, 1);
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;
200 unpackIfNecessary("$productDir/usr/local/include", "$productDir/usr/local/include/llvm-c/Core.h", $llvmIncludePackage, 0);
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";