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;
142 chdir $ownLLVMDirectory;
143 if (!-e "Makefile.config") {
144 print("Configuring LLVM.\n");
145 (system("./configure --enable-optimized=yes --enable-backtraces=no --enable-targets=x86_64 --enable-libcpp=yes --enable-zlib=no")==0) or die;
148 print("Building LLVM.\n");
149 chdir $ownLLVMDirectory;
150 (system("make -j `sysctl -n hw.availcpu`") == 0) or die;
153 my $ownLLVMBuildMode = "";
154 if (fileContains($ownLLVMDirectory . "/Makefile.config", "ENABLE_OPTIMIZED=1")) {
155 $ownLLVMBuildMode .= "Release";
157 $ownLLVMBuildMode .= "Debug";
160 if (fileContains($ownLLVMDirectory . "/Makefile.config", "DISABLE_ASSERTIONS=1")) {
163 $ownLLVMBuildMode .= "+Asserts";
166 my $librarySourceDirectory = "$ownLLVMDirectory/$ownLLVMBuildMode/lib";
167 my $libraryTargetDirectory = $productDir;
168 $shouldUpdateLLVMLibraryToken = 0;
169 print("Symlinking libraries from $librarySourceDirectory to $libraryTargetDirectory\n");
170 opendir (my $dirHandle, $librarySourceDirectory);
171 while (my $filename = readdir($dirHandle)) {
172 next if $filename !~ /\.a$/;
173 print " Symlink $filename\n";
174 my $sourceLibrary = "$librarySourceDirectory/$filename";
175 my $targetLibrary = "$libraryTargetDirectory/$filename";
176 my $ranlibToken = "$libraryTargetDirectory/.ranlibToken-$filename";
177 unlink($targetLibrary);
178 symlink($sourceLibrary, $targetLibrary);
180 || !fileContentsEquals($ranlibToken, $sourceLibrary)
181 || -M $ranlibToken > -M $sourceLibrary) {
182 print " Ranlib $filename\n";
183 (system($ranlib, $targetLibrary) == 0) or die;
184 (open my $fileHandle, ">", $ranlibToken) or die;
185 print {$fileHandle} "$sourceLibrary";
187 $shouldUpdateLLVMLibraryToken = 1;
192 $shouldUpdateLLVMLibraryToken =
193 unpackIfNecessary($productDir, "$productDir/libLLVMCore.a", $llvmLibraryPackage, 1);
197 (system("rm", "-rf", "$productDir/usr/local/include/llvm") == 0) or die;
198 (system("rm", "-rf", "$productDir/usr/local/include/llvm-c") == 0) or die;
199 symlink("$ownLLVMDirectory/include/llvm", "$productDir/usr/local/include/llvm") or die;
200 symlink("$ownLLVMDirectory/include/llvm-c", "$productDir/usr/local/include/llvm-c") or die;
202 unpackIfNecessary("$productDir/usr/local/include", "$productDir/usr/local/include/llvm-c/Core.h", $llvmIncludePackage, 0);
205 my $llvmLibraryToken = "$productDir/usr/local/include/WebKitLLVMLibraryToken.h";
206 if ($shouldUpdateLLVMLibraryToken || !-e $llvmLibraryToken) {
207 (open my $fileHandle, ">", $llvmLibraryToken) or die;
208 print {$fileHandle} "/* This file fools WebKit's build system into relinking JavaScriptCore if the LLVM libraries changed. */\n";