Merge pull request #1928 from 'cross-win-osx'.

This includes a lot of fixes for cross-building to Windows and Mac OS X
and could possibly fix things even for non-cross-builds, like for
example OpenSSL on Windows.

The main reason for merging this in 14.04 already is that we already
have runInWindowsVM in master and it doesn't work until we actually
cross-build Cygwin's setup binary as the upstream version is a fast
moving target which gets _overwritten_ on every new release.

Conflicts:
	pkgs/top-level/all-packages.nix
This commit is contained in:
aszlig
2014-04-21 10:00:35 +02:00
36 changed files with 523 additions and 124 deletions

View File

@@ -7,21 +7,13 @@
# OSS is no longer supported, for it's much crappier than ALSA and
# PulseAudio.
assert alsaSupport || pulseaudioSupport;
assert !(stdenv ? cross) -> alsaSupport || pulseaudioSupport;
assert openglSupport -> (mesa != null && x11Support);
assert x11Support -> (x11 != null && libXrandr != null);
assert alsaSupport -> alsaLib != null;
assert pulseaudioSupport -> pulseaudio != null;
let
configureFlagsFun = attrs: ''
--disable-oss --disable-video-x11-xme
--disable-x11-shared --disable-alsa-shared --enable-rpath --disable-pulseaudio-shared
--disable-osmesa-shared
${if alsaSupport then "--with-alsa-prefix=${attrs.alsaLib}/lib" else ""}
'';
in
stdenv.mkDerivation rec {
version = "1.2.15";
name = "SDL-${version}";
@@ -32,20 +24,46 @@ stdenv.mkDerivation rec {
};
# Since `libpulse*.la' contain `-lgdbm', PulseAudio must be propagated.
propagatedBuildInputs = stdenv.lib.optionals x11Support [ x11 libXrandr ] ++
propagatedNativeBuildInputs =
stdenv.lib.optionals x11Support [ x11 libXrandr ] ++
stdenv.lib.optional pulseaudioSupport pulseaudio;
buildInputs = [ pkgconfig audiofile ] ++
buildInputs = let
notMingw = !(stdenv ? cross) || stdenv.cross.libc != "msvcrt";
in stdenv.lib.optional notMingw audiofile;
nativeBuildInputs = [ pkgconfig ] ++
stdenv.lib.optional openglSupport [ mesa ] ++
stdenv.lib.optional alsaSupport alsaLib;
# XXX: By default, SDL wants to dlopen() PulseAudio, in which case
# we must arrange to add it to its RPATH; however, `patchelf' seems
# to fail at doing this, hence `--disable-pulseaudio-shared'.
configureFlags = configureFlagsFun { inherit alsaLib; };
configureFlags = [
"--disable-oss"
"--disable-video-x11-xme"
"--disable-x11-shared"
"--disable-alsa-shared"
"--enable-rpath"
"--disable-pulseaudio-shared"
"--disable-osmesa-shared"
] ++ stdenv.lib.optionals (stdenv ? cross) ([
"--without-x"
] ++ stdenv.lib.optional alsaSupport "--with-alsa-prefix=${alsaLib}/lib");
crossAttrs = {
configureFlags = configureFlagsFun { alsaLib = alsaLib.crossDrv; };
crossAttrs =stdenv.lib.optionalAttrs (stdenv.cross.libc == "libSystem") {
patches = let
f = rev: sha256: fetchurl {
url = "http://hg.libsdl.org/SDL/raw-rev/${rev}";
inherit sha256;
};
in [
(f "e9466ead70e5" "0ygir3k83d0vxp7s3k48jn3j8n2bnv9wm6613wpx3ybnjrxabrip")
(f "bbfb41c13a87" "17v29ybjifvka19m8qf14rjc43nfdwk9v9inaizznarhb17amlnv")
];
postPatch = ''
sed -i -e 's/ *-fpascal-strings//' configure
'';
};
passthru = {inherit openglSupport;};

View File

@@ -3,7 +3,7 @@
stdenv.mkDerivation rec {
name = "audiofile-0.3.6";
buildInputs = stdenv.lib.optional (!stdenv.isDarwin) alsaLib;
nativeBuildInputs = stdenv.lib.optional stdenv.isLinux alsaLib;
src = fetchurl {
url = "http://audiofile.68k.org/${name}.tar.gz";

View File

@@ -1,5 +1,7 @@
{ stdenv, fetchurl, mesa_glu, x11, libXmu, libXi }:
with stdenv.lib;
stdenv.mkDerivation rec {
name = "glew-1.10.0";
@@ -8,23 +10,38 @@ stdenv.mkDerivation rec {
sha256 = "01zki46dr5khzlyywr3cg615bcal32dazfazkf360s1znqh17i4r";
};
buildInputs = [ x11 libXmu libXi ];
propagatedBuildInputs = [ mesa_glu ]; # GL/glew.h includes GL/glu.h
nativeBuildInputs = [ x11 libXmu libXi ];
propagatedNativeBuildInputs = [ mesa_glu ]; # GL/glew.h includes GL/glu.h
patchPhase = ''
sed -i 's|lib64|lib|' config/Makefile.linux
${optionalString (stdenv ? cross) ''
sed -i -e 's/\(INSTALL.*\)-s/\1/' Makefile
''}
'';
buildPhase = "make all";
installPhase = ''
GLEW_DEST=$out make install.all
buildFlags = [ "all" ];
installFlags = [ "install.all" ];
preInstall = ''
export GLEW_DEST="$out"
'';
postInstall = ''
mkdir -pv $out/share/doc/glew
mkdir -p $out/lib/pkgconfig
cp glew*.pc $out/lib/pkgconfig
cp -r README.txt LICENSE.txt doc $out/share/doc/glew
'';
crossAttrs.makeFlags = [
"CC=${stdenv.cross.config}-gcc"
"LD=${stdenv.cross.config}-gcc"
"AR=${stdenv.cross.config}-ar"
"STRIP="
] ++ optional (stdenv.cross.libc == "msvcrt") "SYSTEM=mingw"
++ optional (stdenv.cross.libc == "libSystem") "SYSTEM=darwin";
meta = {
description = "An OpenGL extension loading library for C(++)";
homepage = http://glew.sourceforge.net/;

View File

@@ -24,6 +24,12 @@ stdenv.mkDerivation rec {
make check
'';
crossAttrs = let
isCross64 = stdenv.cross.config == "x86_64-w64-mingw32";
in stdenv.lib.optionalAttrs isCross64 {
configureFlags = [ "--disable-asm" "--disable-padlock-support" ];
};
meta = {
description = "GNU Libgcrypt, a general-pupose cryptographic library";

View File

@@ -1,4 +1,4 @@
{ stdenv, fetchurl, bash }:
{ stdenv, fetchurl, bash, gettext }:
stdenv.mkDerivation (rec {
name = "libgpg-error-1.12";
@@ -8,6 +8,10 @@ stdenv.mkDerivation (rec {
sha256 = "0pz58vr12qihq2f0bypjxsb6cf6ajq5258fmfm8s6lvwm3b9xz6a";
};
# If architecture-dependant MO files aren't available, they're generated
# during build, so we need gettext for cross-builds.
crossAttrs.buildInputs = [ gettext ];
doCheck = true;
meta = {

View File

@@ -1,4 +1,6 @@
{ stdenv, fetchurl }:
{ stdenv, fetchurl, static ? false }:
with stdenv.lib;
stdenv.mkDerivation {
name = "libjpeg-8d";
@@ -7,6 +9,8 @@ stdenv.mkDerivation {
url = http://www.ijg.org/files/jpegsrc.v8d.tar.gz;
sha256 = "1cz0dy05mgxqdgjf52p54yxpyy95rgl30cnazdrfmw7hfca9n0h0";
};
configureFlags = optional static "--enable-static --disable-shared";
meta = {
homepage = http://www.ijg.org/;

View File

@@ -1,6 +1,6 @@
{ stdenv, fetchurl, zlib, xz }:
assert zlib != null;
assert !(stdenv ? cross) -> zlib != null;
stdenv.mkDerivation rec {
name = "libpng-1.2.51";
@@ -16,6 +16,13 @@ stdenv.mkDerivation rec {
passthru = { inherit zlib; };
crossAttrs = stdenv.lib.optionalAttrs (stdenv.cross.libc == "libSystem") {
propagatedBuildInputs = [];
passthru = {};
};
configureFlags = "--enable-static";
meta = {
description = "The official reference implementation for the PNG file format";
homepage = http://www.libpng.org/pub/png/libpng.html;

View File

@@ -12,7 +12,7 @@ diff -ru -x '*~' openssl-1.0.0e-orig/crypto/x509/x509_def.c openssl-1.0.0e/crypt
#include "cryptlib.h"
#include <openssl/crypto.h>
#include <openssl/x509.h>
@@ -71,7 +75,19 @@
@@ -71,7 +75,25 @@
{ return(X509_CERT_DIR); }
const char *X509_get_default_cert_file(void)
@@ -23,9 +23,15 @@ diff -ru -x '*~' openssl-1.0.0e-orig/crypto/x509/x509_def.c openssl-1.0.0e/crypt
+ if (!init) {
+ init = 1;
+ char * s = getenv("OPENSSL_X509_CERT_FILE");
+ if (s && getuid() == geteuid()) {
+ strncpy(buf, s, sizeof(buf));
+ buf[sizeof(buf) - 1] = 0;
+ if (s) {
+#ifndef OPENSSL_SYS_WINDOWS
+ if (getuid() == geteuid()) {
+#endif
+ strncpy(buf, s, sizeof(buf));
+ buf[sizeof(buf) - 1] = 0;
+#ifndef OPENSSL_SYS_WINDOWS
+ }
+#endif
+ }
+ }
+ return buf;

View File

@@ -8,7 +8,9 @@ let
(throw "openssl needs its platform name cross building" null)
stdenv.cross;
patchesCross = isCross:
patchesCross = isCross: let
isDarwin = stdenv.isDarwin || (isCross && stdenv.cross.libc == "libSystem");
in
[ # Allow the location of the X509 certificate file (the CA
# bundle) to be set through the environment variable
# OPENSSL_X509_CERT_FILE. This is necessary because the
@@ -29,7 +31,7 @@ let
./kfreebsd-gnu.patch
]
++ stdenv.lib.optional stdenv.isDarwin ./darwin-arch.patch;
++ stdenv.lib.optional isDarwin ./darwin-arch.patch;
in
@@ -91,6 +93,8 @@ stdenv.mkDerivation {
rm $out/bin/c_rehash $out/ssl/misc/CA.pl $out/ssl/misc/tsget
'';
configureScript = "./Configure";
} // stdenv.lib.optionalAttrs (opensslCrossSystem == "darwin64-x86_64-cc") {
CC = "gcc";
};
meta = {

View File

@@ -1,4 +1,8 @@
{ stdenv, fetchurl, unicodeSupport ? true, cplusplusSupport ? true }:
{ stdenv, fetchurl, unicodeSupport ? true, cplusplusSupport ? true
, windows ? null
}:
with stdenv.lib;
stdenv.mkDerivation rec {
name = "pcre-8.34";
@@ -16,12 +20,16 @@ stdenv.mkDerivation rec {
--enable-jit
${if unicodeSupport then "--enable-unicode-properties" else ""}
${if !cplusplusSupport then "--disable-cpp" else ""}
'' + stdenv.lib.optionalString stdenv.isDarwin "CXXFLAGS=-O0";
'' + optionalString stdenv.isDarwin "CXXFLAGS=-O0";
doCheck = with stdenv; !(isCygwin || isFreeBSD);
# XXX: test failure on Cygwin
# we are running out of stack on both freeBSDs on Hydra
crossAttrs = optionalAttrs (stdenv.cross.libc == "msvcrt") {
buildInputs = [ windows.mingw_w64_pthreads.crossDrv ];
};
meta = {
homepage = "http://www.pcre.org/";
description = "A library for Perl Compatible Regular Expressions";
@@ -35,7 +43,7 @@ stdenv.mkDerivation rec {
PCRE library is free, even for building proprietary software.
'';
platforms = stdenv.lib.platforms.all;
maintainers = [ stdenv.lib.maintainers.simons ];
platforms = platforms.all;
maintainers = [ maintainers.simons ];
};
}

View File

@@ -148,8 +148,7 @@ stdenv.mkDerivation rec {
'';
crossAttrs = let
isMingw = stdenv.cross.config == "i686-pc-mingw32" ||
stdenv.cross.config == "x86_64-w64-mingw32";
isMingw = stdenv.cross.libc == "msvcrt";
in {
# I've not tried any case other than i686-pc-mingw32.
# -nomake tools: it fails linking some asian language symbols

View File

@@ -36,6 +36,8 @@ stdenv.mkDerivation rec {
"-f" "win32/Makefile.gcc"
"PREFIX=${stdenv.cross.config}-"
] ++ (if static then [] else [ "SHARED_MODE=1" ]);
} // stdenv.lib.optionalAttrs (stdenv.cross.libc == "libSystem") {
makeFlags = [ "RANLIB=${stdenv.cross.config}-ranlib" ];
};
# zlib doesn't like the automatic --disable-shared from the Cygwin stdenv.