v8: fixes build on darwin

v8 compilation on macOS was failing because of missing dependency and
wrong linker. The approach to make it work is similar to the nodejs
package.
This commit is contained in:
Lukasz Czyzykowski 2017-05-15 19:25:33 +02:00
parent 37cb24a318
commit 3de66330cd
3 changed files with 78 additions and 6 deletions

View File

@ -1,5 +1,5 @@
{ stdenv, lib, fetchgit, fetchFromGitHub, gyp, readline, python, which, icu
, patchelf, coreutils
, patchelf, coreutils, cctools
, doCheck ? false
, static ? false
}:
@ -126,7 +126,13 @@ stdenv.mkDerivation rec {
# Patch based off of:
# https://github.com/cowboyd/libv8/tree/v5.1.281.67.0/patches
patches = lib.optional (!doCheck) ./libv8-5.4.232.patch;
patches = lib.optional (!doCheck) ./libv8-5.4.232.patch
++ stdenv.lib.optionals stdenv.isDarwin [ ./no-xcode.patch ];
prePatch = ''
chmod +w tools/gyp/pylib/gyp
chmod +w tools/gyp/pylib/gyp/xcode_emulation.py
'';
postPatch = ''
sed -i 's,#!/usr/bin/env python,#!${python}/bin/python,' gypfiles/gyp_v8
@ -152,12 +158,13 @@ stdenv.mkDerivation rec {
'';
nativeBuildInputs = [ which ];
buildInputs = [ readline python icu patchelf ];
buildInputs = [ readline python icu patchelf ]
++ stdenv.lib.optionals stdenv.isDarwin [ cctools ];
NIX_CFLAGS_COMPILE = "-Wno-error=strict-overflow";
buildFlags = [
"LINK=g++"
"LINK=c++"
"-C out"
"builddir=$(CURDIR)/Release"
"BUILDTYPE=Release"
@ -174,7 +181,7 @@ stdenv.mkDerivation rec {
install -vD out/Release/mksnapshot "$out/bin/mksnapshot"
${if static then ""
else if stdenv.isDarwin then ''
install -vD out/Release/lib.target/libv8.dylib "$out/lib/libv8.dylib"
install -vD out/Release/libv8.dylib "$out/lib/libv8.dylib"
install_name_tool -change /usr/local/lib/libv8.dylib $out/lib/libv8.dylib -change /usr/lib/libgcc_s.1.dylib ${stdenv.cc.cc.lib}/lib/libgcc_s.1.dylib $out/bin/d8
install_name_tool -id $out/lib/libv8.dylib -change /usr/lib/libgcc_s.1.dylib ${stdenv.cc.cc.lib}/lib/libgcc_s.1.dylib $out/lib/libv8.dylib
'' else ''
@ -190,7 +197,7 @@ stdenv.mkDerivation rec {
meta = with lib; {
description = "Google's open source JavaScript engine";
maintainers = with maintainers; [ cstrahan proglodyte ];
platforms = platforms.linux;
platforms = platforms.linux ++ platforms.darwin;
license = licenses.bsd3;
};
}

View File

@ -0,0 +1,64 @@
--- a/tools/gyp/pylib/gyp/xcode_emulation.py
+++ a/tools/gyp/pylib/gyp/xcode_emulation.py
@@ -473,10 +473,16 @@
def _XcodeSdkPath(self, sdk_root):
if sdk_root not in XcodeSettings._sdk_path_cache:
- sdk_path = self._GetSdkVersionInfoItem(sdk_root, '--show-sdk-path')
- XcodeSettings._sdk_path_cache[sdk_root] = sdk_path
- if sdk_root:
- XcodeSettings._sdk_root_cache[sdk_path] = sdk_root
+ try:
+ sdk_path = self._GetSdkVersionInfoItem(sdk_root, '--show-sdk-path')
+ XcodeSettings._sdk_path_cache[sdk_root] = sdk_path
+ if sdk_root:
+ XcodeSettings._sdk_root_cache[sdk_path] = sdk_root
+ except:
+ # if this fails it's because xcodebuild failed, which means
+ # the user is probably on a CLT-only system, where there
+ # is no valid SDK root
+ XcodeSettings._sdk_path_cache[sdk_root] = None
return XcodeSettings._sdk_path_cache[sdk_root]
def _AppendPlatformVersionMinFlags(self, lst):
@@ -606,10 +612,11 @@
framework_root = sdk_root
else:
framework_root = ''
- config = self.spec['configurations'][self.configname]
- framework_dirs = config.get('mac_framework_dirs', [])
- for directory in framework_dirs:
- cflags.append('-F' + directory.replace('$(SDKROOT)', framework_root))
+ if 'SDKROOT' in self._Settings():
+ config = self.spec['configurations'][self.configname]
+ framework_dirs = config.get('mac_framework_dirs', [])
+ for directory in framework_dirs:
+ cflags.append('-F' + directory.replace('$(SDKROOT)', framework_root))
self.configname = None
return cflags
@@ -861,10 +868,11 @@
sdk_root = self._SdkPath()
if not sdk_root:
sdk_root = ''
- config = self.spec['configurations'][self.configname]
- framework_dirs = config.get('mac_framework_dirs', [])
- for directory in framework_dirs:
- ldflags.append('-F' + directory.replace('$(SDKROOT)', sdk_root))
+ if 'SDKROOT' in self._Settings():
+ config = self.spec['configurations'][self.configname]
+ framework_dirs = config.get('mac_framework_dirs', [])
+ for directory in framework_dirs:
+ ldflags.append('-F' + directory.replace('$(SDKROOT)', sdk_root))
platform_root = self._XcodePlatformPath(configname)
if sdk_root and platform_root and self._IsXCTest():
@@ -1358,7 +1366,7 @@
if version:
version = re.match(r'(\d\.\d\.?\d*)', version).groups()[0]
else:
- raise GypError("No Xcode or CLT version detected!")
+ version = "7.0.0"
# The CLT has no build information, so we return an empty string.
version_list = [version, '']
version = version_list[0]

View File

@ -10198,6 +10198,7 @@ with pkgs;
v8 = callPackage ../development/libraries/v8 {
inherit (python2Packages) python gyp;
cctools = darwin.cctools;
};
v8_static = lowPrio (self.v8.override { static = true; });