lol
1{ stdenv, lib, pkgArches,
2 name, version, src, monos, geckos, platforms,
3 # flex 2.6.3 causes: undefined reference to `yywrap'
4 pkgconfig, fontforge, makeWrapper, flex_2_6_1, bison,
5 supportFlags,
6 buildScript ? null, configureFlags ? []
7}:
8
9with import ./util.nix { inherit lib; };
10
11stdenv.mkDerivation ((lib.optionalAttrs (! isNull buildScript) {
12 builder = buildScript;
13}) // rec {
14 inherit name src configureFlags;
15
16 nativeBuildInputs = [
17 pkgconfig fontforge makeWrapper flex_2_6_1 bison
18 ];
19
20 buildInputs = toBuildInputs pkgArches (with supportFlags; (pkgs:
21 [ pkgs.freetype ]
22 ++ lib.optional stdenv.isLinux pkgs.libcap
23 ++ lib.optional pngSupport pkgs.libpng
24 ++ lib.optional jpegSupport pkgs.libjpeg
25 ++ lib.optional cupsSupport pkgs.cups
26 ++ lib.optional colorManagementSupport pkgs.lcms2
27 ++ lib.optional gettextSupport pkgs.gettext
28 ++ lib.optional dbusSupport pkgs.dbus
29 ++ lib.optional mpg123Support pkgs.mpg123
30 ++ lib.optional openalSupport pkgs.openal
31 ++ lib.optional cairoSupport pkgs.cairo
32 ++ lib.optional tiffSupport pkgs.libtiff
33 ++ lib.optional odbcSupport pkgs.unixODBC
34 ++ lib.optional netapiSupport pkgs.samba4
35 ++ lib.optional cursesSupport pkgs.ncurses
36 ++ lib.optional vaSupport pkgs.libva
37 ++ lib.optional pcapSupport pkgs.libpcap
38 ++ lib.optional v4lSupport pkgs.libv4l
39 ++ lib.optional saneSupport pkgs.sane-backends
40 ++ lib.optional gsmSupport pkgs.gsm
41 ++ lib.optional gphoto2Support pkgs.libgphoto2
42 ++ lib.optional ldapSupport pkgs.openldap
43 ++ lib.optional fontconfigSupport pkgs.fontconfig
44 ++ lib.optional alsaSupport pkgs.alsaLib
45 ++ lib.optional pulseaudioSupport pkgs.libpulseaudio
46 ++ lib.optional xineramaSupport pkgs.xorg.libXinerama
47 ++ lib.optional udevSupport pkgs.udev
48 ++ lib.optional vulkanSupport pkgs.vulkan-loader
49 ++ lib.optionals gstreamerSupport (with pkgs.gst_all_1; [ gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav ])
50 ++ lib.optionals gtkSupport [ pkgs.gtk3 pkgs.glib ]
51 ++ lib.optionals openclSupport [ pkgs.opencl-headers pkgs.ocl-icd ]
52 ++ lib.optionals xmlSupport [ pkgs.libxml2 pkgs.libxslt ]
53 ++ lib.optionals tlsSupport [ pkgs.openssl pkgs.gnutls ]
54 ++ lib.optionals openglSupport [ pkgs.libGLU_combined pkgs.mesa_noglu.osmesa pkgs.libdrm ]
55 ++ lib.optionals stdenv.isDarwin (with pkgs.buildPackages.darwin.apple_sdk.frameworks; [
56 CoreServices Foundation ForceFeedback AppKit OpenGL IOKit DiskArbitration Security
57 ApplicationServices AudioToolbox CoreAudio AudioUnit CoreMIDI OpenAL OpenCL Cocoa Carbon
58 ])
59 ++ lib.optionals stdenv.isLinux (with pkgs.xorg; [
60 libXi libXcursor libXrandr libXrender libXxf86vm libXcomposite libXext
61 ])
62 ++ [ pkgs.xorg.libX11 ]));
63
64 # Wine locates a lot of libraries dynamically through dlopen(). Add
65 # them to the RPATH so that the user doesn't have to set them in
66 # LD_LIBRARY_PATH.
67 NIX_LDFLAGS = map (path: "-rpath " + path) (
68 map (x: "${lib.getLib x}/lib") ([ stdenv.cc.cc ] ++ buildInputs)
69 # libpulsecommon.so is linked but not found otherwise
70 ++ lib.optionals supportFlags.pulseaudioSupport (map (x: "${lib.getLib x}/lib/pulseaudio")
71 (toBuildInputs pkgArches (pkgs: [ pkgs.libpulseaudio ])))
72 );
73
74 # Don't shrink the ELF RPATHs in order to keep the extra RPATH
75 # elements specified above.
76 dontPatchELF = true;
77
78 # Disable stripping to avoid breaking placeholder DLLs/EXEs.
79 # Symptoms of broken placeholders are: when the wineprefix is created
80 # drive_c/windows/system32 will only contain a few files instead of
81 # hundreds, there will be an error about winemenubuilder and MountMgr
82 # on startup of Wine, and the Drives tab in winecfg will show an error.
83 dontStrip = true;
84
85 ## FIXME
86 # Add capability to ignore known failing tests
87 # and enable doCheck
88 doCheck = false;
89
90 postInstall = let
91 links = prefix: pkg: "ln -s ${pkg} $out/${prefix}/${pkg.name}";
92 in ''
93 mkdir -p $out/share/wine/gecko $out/share/wine/mono/
94 ${lib.strings.concatStringsSep "\n"
95 ((map (links "share/wine/gecko") geckos)
96 ++ (map (links "share/wine/mono") monos))}
97 '' + lib.optionalString supportFlags.gstreamerSupport ''
98 for i in wine ; do
99 if [ -e "$out/bin/$i" ]; then
100 wrapProgram "$out/bin/$i" \
101 --argv0 "" \
102 --prefix GST_PLUGIN_SYSTEM_PATH_1_0 ":" "$GST_PLUGIN_SYSTEM_PATH_1_0"
103 fi
104 done
105 '';
106
107 enableParallelBuilding = true;
108
109 # https://bugs.winehq.org/show_bug.cgi?id=43530
110 # https://github.com/NixOS/nixpkgs/issues/31989
111 hardeningDisable = [ "bindnow" ]
112 ++ lib.optional (stdenv.hostPlatform.isDarwin) "fortify";
113
114 passthru = { inherit pkgArches; };
115 meta = {
116 inherit version platforms;
117 homepage = http://www.winehq.org/;
118 license = "LGPL";
119 description = "An Open Source implementation of the Windows API on top of X, OpenGL, and Unix";
120 maintainers = with stdenv.lib.maintainers; [ avnik raskin bendlas ];
121 };
122})