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 { stdenv, lib, fetchgit, fetchFromGitHub, gyp, readline, python, which, icu
, patchelf, coreutils , patchelf, coreutils, cctools
, doCheck ? false , doCheck ? false
, static ? false , static ? false
}: }:
@ -126,7 +126,13 @@ stdenv.mkDerivation rec {
# Patch based off of: # Patch based off of:
# https://github.com/cowboyd/libv8/tree/v5.1.281.67.0/patches # 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 = '' postPatch = ''
sed -i 's,#!/usr/bin/env python,#!${python}/bin/python,' gypfiles/gyp_v8 sed -i 's,#!/usr/bin/env python,#!${python}/bin/python,' gypfiles/gyp_v8
@ -152,12 +158,13 @@ stdenv.mkDerivation rec {
''; '';
nativeBuildInputs = [ which ]; 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"; NIX_CFLAGS_COMPILE = "-Wno-error=strict-overflow";
buildFlags = [ buildFlags = [
"LINK=g++" "LINK=c++"
"-C out" "-C out"
"builddir=$(CURDIR)/Release" "builddir=$(CURDIR)/Release"
"BUILDTYPE=Release" "BUILDTYPE=Release"
@ -174,7 +181,7 @@ stdenv.mkDerivation rec {
install -vD out/Release/mksnapshot "$out/bin/mksnapshot" install -vD out/Release/mksnapshot "$out/bin/mksnapshot"
${if static then "" ${if static then ""
else if stdenv.isDarwin 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 -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 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 '' '' else ''
@ -190,7 +197,7 @@ stdenv.mkDerivation rec {
meta = with lib; { meta = with lib; {
description = "Google's open source JavaScript engine"; description = "Google's open source JavaScript engine";
maintainers = with maintainers; [ cstrahan proglodyte ]; maintainers = with maintainers; [ cstrahan proglodyte ];
platforms = platforms.linux; platforms = platforms.linux ++ platforms.darwin;
license = licenses.bsd3; 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 { v8 = callPackage ../development/libraries/v8 {
inherit (python2Packages) python gyp; inherit (python2Packages) python gyp;
cctools = darwin.cctools;
}; };
v8_static = lowPrio (self.v8.override { static = true; }); v8_static = lowPrio (self.v8.override { static = true; });