diff --git a/pkgs/development/web/nodejs/default.nix b/pkgs/development/web/nodejs/default.nix index f3025c97f167..064284da1f5b 100644 --- a/pkgs/development/web/nodejs/default.nix +++ b/pkgs/development/web/nodejs/default.nix @@ -1,6 +1,11 @@ -{ stdenv, fetchurl, openssl, python, zlib, v8, utillinux, http_parser, c-ares }: +{ stdenv, fetchurl, openssl, python, zlib, v8, utillinux, http_parser, c-ares, pkgconfig, runCommand }: let + dtrace = runCommand "dtrace-native" {} '' + mkdir -p $out/bin + ln -sv /usr/sbin/dtrace $out/bin + ''; + version = "0.10.8"; # !!! Should we also do shared libuv? @@ -16,7 +21,7 @@ let "--shared-${name}-libpath=${builtins.getAttr name deps}/lib" ]; - inherit (stdenv.lib) concatMap optional maintainers licenses platforms; + inherit (stdenv.lib) concatMap optional optionals maintainers licenses platforms; in stdenv.mkDerivation { name = "nodejs-${version}"; @@ -31,8 +36,15 @@ in stdenv.mkDerivation { sed -e 's|^#!/usr/bin/env python$|#!${python}/bin/python|g' -i configure ''; + patches = if stdenv.isDarwin then [ ./no-xcode.patch ] else null; + + postPatch = if stdenv.isDarwin then '' + (cd tools/gyp; patch -Np1 -i ${../../python-modules/gyp/no-darwin-cflags.patch}) + '' else null; + buildInputs = [ python ] - ++ optional stdenv.isLinux utillinux; + ++ (optional stdenv.isLinux utillinux) + ++ optionals stdenv.isDarwin [ pkgconfig openssl dtrace ]; setupHook = ./setup-hook.sh; meta = { diff --git a/pkgs/development/web/nodejs/no-xcode.patch b/pkgs/development/web/nodejs/no-xcode.patch new file mode 100644 index 000000000000..47a37bfaf3ca --- /dev/null +++ b/pkgs/development/web/nodejs/no-xcode.patch @@ -0,0 +1,78 @@ +diff --git a/tools/gyp/pylib/gyp/xcode_emulation.py b/tools/gyp/pylib/gyp/xcode_emulation.py +index 806f92b..5256856 100644 +--- a/tools/gyp/pylib/gyp/xcode_emulation.py ++++ b/tools/gyp/pylib/gyp/xcode_emulation.py +@@ -224,8 +224,7 @@ class XcodeSettings(object): + + def _GetSdkVersionInfoItem(self, sdk, infoitem): + job = subprocess.Popen(['xcodebuild', '-version', '-sdk', sdk, infoitem], +- stdout=subprocess.PIPE, +- stderr=subprocess.STDOUT) ++ stdout=subprocess.PIPE) + out = job.communicate()[0] + if job.returncode != 0: + sys.stderr.write(out + '\n') +@@ -234,9 +233,17 @@ class XcodeSettings(object): + + def _SdkPath(self): + sdk_root = self.GetPerTargetSetting('SDKROOT', default='macosx') ++ if sdk_root.startswith('/'): ++ return sdk_root + if sdk_root not in XcodeSettings._sdk_path_cache: +- XcodeSettings._sdk_path_cache[sdk_root] = self._GetSdkVersionInfoItem( +- sdk_root, 'Path') ++ try: ++ XcodeSettings._sdk_path_cache[sdk_root] = self._GetSdkVersionInfoItem( ++ sdk_root, 'Path') ++ 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): +@@ -339,10 +346,11 @@ class XcodeSettings(object): + + cflags += self._Settings().get('WARNING_CFLAGS', []) + +- config = self.spec['configurations'][self.configname] +- framework_dirs = config.get('mac_framework_dirs', []) +- for directory in framework_dirs: +- cflags.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: ++ cflags.append('-F' + directory.replace('$(SDKROOT)', sdk_root)) + + self.configname = None + return cflags +@@ -572,10 +580,11 @@ class XcodeSettings(object): + for rpath in self._Settings().get('LD_RUNPATH_SEARCH_PATHS', []): + ldflags.append('-Wl,-rpath,' + rpath) + +- config = self.spec['configurations'][self.configname] +- framework_dirs = config.get('mac_framework_dirs', []) +- for directory in framework_dirs: +- ldflags.append('-F' + directory.replace('$(SDKROOT)', self._SdkPath())) ++ 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)', self._SdkPath())) + + self.configname = None + return ldflags +@@ -700,7 +709,10 @@ class XcodeSettings(object): + l = '-l' + m.group(1) + else: + l = library +- return l.replace('$(SDKROOT)', self._SdkPath()) ++ if self._SdkPath(): ++ return l.replace('$(SDKROOT)', self._SdkPath()) ++ else: ++ return l + + def AdjustLibraries(self, libraries): + """Transforms entries like 'Cocoa.framework' in libraries into entries like