blob: dbb7df0affc9aa2fb2dea69a3a8aab219ddfa17c [file] [log] [blame]
#!/usr/bin/perl -w
# Copyright (C) 2005, 2008, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
use strict;
use FindBin;
use lib $FindBin::Bin;
use webkitdirs;
my $productDir = shift @ARGV;
$productDir = $ENV{BUILT_PRODUCTS_DIR} if !$productDir;
chdirWebKit();
my @librariesToCopy = (
"libWebKitSystemInterfaceLion.a",
"libWebKitSystemInterfaceMountainLion.a",
"libWebKitSystemInterfaceMavericks.a",
);
my $ranlib = `xcrun -find ranlib`;
chomp $ranlib;
foreach my $libName (@librariesToCopy) {
my $srcLib = "WebKitLibraries/" . $libName;
my $lib = "$productDir/" . $libName;
if (!-e $lib || -M $lib > -M $srcLib) {
print "Updating $lib\n";
(system("ditto", $srcLib, $lib) == 0) or die;
(system($ranlib, $lib) == 0) or die;
}
}
(system("mkdir", "-p", "$productDir/usr/local/include") == 0) or die;
sub unpackIfNecessary
{
my ($targetDir, $sampleFile, $package, $hasLibraries) = @_;
if (!-e $sampleFile || -M $sampleFile > -M $package) {
print "Unpacking $package into $targetDir\n";
(system("tar -C $targetDir -xmf $package") == 0) or die;
if ($hasLibraries) {
foreach my $library (`tar -tf $package`) {
chomp $library;
print " Ranlib $library\n";
(system($ranlib, $targetDir . "/" . $library) == 0) or die;
}
}
return 1;
}
return 0;
}
sub dittoHeaders
{
my ($srcHeader, $header) = @_;
if (!-e $header || -M $header > -M $srcHeader) {
print "Updating $header\n";
(system("ditto", $srcHeader, $header) == 0) or die;
}
}
dittoHeaders("WebKitLibraries/WebKitSystemInterface.h", "$productDir/usr/local/include/WebKitSystemInterface.h");
if ($ENV{ENABLE_FTL_JIT}) {
# Determine where to get LLVM binaries and headers.
my $majorDarwinVersion = (split /\./, `uname -r`)[0];
my $llvmLibraryPackage;
my $llvmIncludePackage;
my $useOwnLLVM = 0;
my $ownLLVMDirectory;
if (defined($ENV{LLVM_SOURCE_PATH})) {
$useOwnLLVM = 1;
$ownLLVMDirectory = $ENV{LLVM_SOURCE_PATH};
} elsif (-d "llvm" && -e "llvm/LLVMBuild.txt") {
$useOwnLLVM = 1;
$ownLLVMDirectory = sourceDir() . "/llvm";
} elsif (defined($ENV{LLVM_LIBRARY_PACKAGE}) && defined($ENV{LLVM_INCLUDE_PACKAGE})) {
$llvmLibraryPackage = $ENV{LLVM_LIBRARY_PACKAGE};
$llvmIncludePackage = $ENV{LLVM_INCLUDE_PACKAGE};
} elsif ($majorDarwinVersion == 11) {
$llvmLibraryPackage = "WebKitLibraries/LLVMLibrariesLion.tar.bz2";
$llvmIncludePackage = "WebKitLibraries/LLVMIncludesLion.tar.bz2";
} elsif ($majorDarwinVersion == 12) {
$llvmLibraryPackage = "WebKitLibraries/LLVMLibrariesMountainLion.tar.bz2";
$llvmIncludePackage = "WebKitLibraries/LLVMIncludesMountainLion.tar.bz2";
} else {
print "Don't know where to find LLVM!\n";
print "\n";
print "Try defining LLVM_LIBRARY_PACKAGE and LLVM_INCLUDE_PACKAGE.\n";
print "\n";
print "Alternatively, you can check out llvm trunk into the WebKit directory:\n";
print "svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm\n";
exit 1;
}
sub fileContains
{
my ($filename, $string) = @_;
open my $fileHandle, '<', $filename or die;
while (<$fileHandle>) {
return 1 if /^$string$/;
}
return 0;
}
sub fileContentsEquals
{
my ($filename, $string) = @_;
open my $fileHandle, '<', $filename or die;
binmode $fileHandle;
my $contents = <$fileHandle>;
return $contents eq $string;
}
my $shouldUpdateLLVMLibraryToken = 0;
if ($useOwnLLVM) {
if (!-e "$ownLLVMDirectory/Makefile.config") {
print("Configuring LLVM.\n");
(system("sh", "Tools/Scripts/configure-llvm", $ownLLVMDirectory)==0) or die;
}
print("Building LLVM.\n");
chdir $ownLLVMDirectory;
(system("make -j `sysctl -n hw.activecpu`") == 0) or die;
chdirWebKit();
my $ownLLVMBuildMode = "";
if (fileContains($ownLLVMDirectory . "/Makefile.config", "ENABLE_OPTIMIZED=1")) {
$ownLLVMBuildMode .= "Release";
} else {
$ownLLVMBuildMode .= "Debug";
}
if (fileContains($ownLLVMDirectory . "/Makefile.config", "DISABLE_ASSERTIONS=1")) {
# Nothing to do.
} else {
$ownLLVMBuildMode .= "+Asserts";
}
my $librarySourceDirectory = "$ownLLVMDirectory/$ownLLVMBuildMode/lib";
my $libraryTargetDirectory = $productDir;
$shouldUpdateLLVMLibraryToken = 0;
print("Symlinking libraries from $librarySourceDirectory to $libraryTargetDirectory\n");
opendir (my $dirHandle, $librarySourceDirectory);
while (my $filename = readdir($dirHandle)) {
next if $filename !~ /\.a$/;
next if $filename =~ /libgtest/;
print " Symlink $filename\n";
my $sourceLibrary = "$librarySourceDirectory/$filename";
my $targetLibrary = "$libraryTargetDirectory/$filename";
my $ranlibToken = "$libraryTargetDirectory/.ranlibToken-$filename";
unlink($targetLibrary);
symlink($sourceLibrary, $targetLibrary);
if (!-e $ranlibToken
|| !fileContentsEquals($ranlibToken, $sourceLibrary)
|| -M $ranlibToken > -M $sourceLibrary) {
print " Ranlib $filename\n";
(system($ranlib, $targetLibrary) == 0) or die;
(open my $fileHandle, ">", $ranlibToken) or die;
print {$fileHandle} "$sourceLibrary";
close $fileHandle;
$shouldUpdateLLVMLibraryToken = 1;
}
}
closedir $dirHandle;
} else {
$shouldUpdateLLVMLibraryToken =
unpackIfNecessary($productDir, "$productDir/libLLVMCore.a", $llvmLibraryPackage, 1);
}
if ($useOwnLLVM) {
(system("rm", "-rf", "$productDir/usr/local/include/llvm") == 0) or die;
(system("rm", "-rf", "$productDir/usr/local/include/llvm-c") == 0) or die;
symlink("$ownLLVMDirectory/include/llvm", "$productDir/usr/local/include/llvm") or die;
symlink("$ownLLVMDirectory/include/llvm-c", "$productDir/usr/local/include/llvm-c") or die;
} else {
unpackIfNecessary("$productDir/usr/local/include", "$productDir/usr/local/include/llvm-c/Core.h", $llvmIncludePackage, 0);
}
my $llvmLibraryToken = "$productDir/usr/local/include/WebKitLLVMLibraryToken.h";
if ($shouldUpdateLLVMLibraryToken || !-e $llvmLibraryToken) {
(open my $fileHandle, ">", $llvmLibraryToken) or die;
print {$fileHandle} "/* This file fools WebKit's build system into relinking JavaScriptCore if the LLVM libraries changed. */\n";
close $fileHandle;
}
}