@@ -2,8 +2,10 @@
22
33module Distribution.Nixpkgs.Haskell.FromCabal.Name ( toNixName, libNixName, buildToolNixName ) where
44
5+import Data.Maybe
56import Data.String
67import Distribution.Package
8+import Distribution.Text
79import Language.Nix
810
911-- | Map Cabal names to Nix attribute names.
@@ -11,31 +13,28 @@ toNixName :: PackageName -> Identifier
1113toNixName (PackageName "") = error "toNixName: invalid empty package name"
1214toNixName (PackageName n) = fromString n
1315
14−-- | Map libraries to Nix packages.
16+-- | Map library names specified in Cabal files to Nix package identifiers.
1517--
1618-- TODO: This list should not be hard-coded here; it belongs into the Nixpkgs
17−-- repository.
19+-- repository.
20+--
21+-- TODO: Re-use hook matching system from PostProcess.hs here.
1822
1923libNixName :: String -> [Identifier]
2024libNixName "" = []
2125libNixName "adns" = return "adns"
2226libNixName "alsa" = return "alsaLib"
2327libNixName "alut" = return "freealut"
24−libNixName "appindicator-0.1" = return "appindicator"
25−libNixName "appindicator3-0.1" = return "appindicator"
28+libNixName "appindicator-0.1" = return "libappindicator-gtk2"
29+libNixName "appindicator3-0.1" = return "libappindicator-gtk3"
2630libNixName "asound" = return "alsaLib"
27−libNixName "awesomium-1.6.5" = return "awesomium"
2831libNixName "b2" = return "libb2"
29−libNixName "babl-0.1" = return "babl"
3032libNixName "bz2" = return "bzip2"
3133libNixName "c++" = [] -- What is that?
3234libNixName "cairo-gobject" = return "cairo"
3335libNixName "cairo-pdf" = return "cairo"
3436libNixName "cairo-ps" = return "cairo"
3537libNixName "cairo-svg" = return "cairo"
36−libNixName "CEGUIBase-0.7.7" = return "CEGUIBase"
37−libNixName "CEGUIOgreRenderer-0.7.7" = return "CEGUIOgreRenderer"
38−libNixName "clutter-1.0" = return "clutter"
3938libNixName "crypt" = [] -- provided by glibc
4039libNixName "crypto" = return "openssl"
4140libNixName "curses" = return "ncurses"
@@ -48,21 +47,16 @@ libNixName "gdk-2.0" = return "gtk2"
4847libNixName "gdk-3.0" = return "gtk3"
4948libNixName "gdk-pixbuf-2.0" = return "gdk_pixbuf"
5049libNixName "gdk-x11-2.0" = return "gdk_x11"
51−libNixName "gegl-0.3" = return "gegl"
5250libNixName "gio-2.0" = return "glib"
5351libNixName "GL" = return "mesa"
54−libNixName "glib-2.0" = return "glib"
5552libNixName "GLU" = ["freeglut","mesa"]
5653libNixName "glut" = ["freeglut","mesa"]
57−libNixName "gmime-2.4" = return "gmime"
5854libNixName "gnome-keyring" = return "gnome_keyring"
5955libNixName "gnome-keyring-1" = return "gnome_keyring"
6056libNixName "gnome-vfs-2.0" = return "gnome_vfs"
6157libNixName "gnome-vfs-module-2.0" = return "gnome_vfs_module"
6258libNixName "gobject-2.0" = return "glib"
6359libNixName "gobject-introspection-1.0" = return "gobjectIntrospection"
64−libNixName "gstreamer-0.10" = return "gstreamer"
65−libNixName "gstreamer-1.0" = return "gstreamer"
6660libNixName "gstreamer-audio-0.10" = return "gst_plugins_base"
6761libNixName "gstreamer-audio-1.0" = return "gst_plugins_base"
6862libNixName "gstreamer-base-0.10" = return "gst_plugins_base"
@@ -76,9 +70,6 @@ libNixName "gthread-2.0" = return "glib"
7670libNixName "gtk+-2.0" = return "gtk2"
7771libNixName "gtk+-3.0" = return "gtk3"
7872libNixName "gtk-x11-2.0" = return "gtk_x11"
79−libNixName "gtkglext-1.0" = return "gtkglext"
80−libNixName "gtksourceview-2.0" = return "gtksourceview"
81−libNixName "gtksourceview-3.0" = return "gtksourceview"
8273libNixName "hidapi-libusb" = return "hidapi"
8374libNixName "icudata" = return "icu"
8475libNixName "icui18n" = return "icu"
@@ -89,34 +80,22 @@ libNixName "ImageMagick" = return "imagemagick"
8980libNixName "Imlib2" = return "imlib2"
9081libNixName "iw" = return "wirelesstools"
9182libNixName "jack" = return "libjack2"
92−libNixName "javascriptcoregtk-3.0" = return "javascriptcoregtk"
93−libNixName "javascriptcoregtk-4.0" = return "javascriptcoregtk"
9483libNixName "jpeg" = return "libjpeg"
9584libNixName "jvm" = return "jdk"
9685libNixName "lapack" = return "liblapack"
9786libNixName "ldap" = return "openldap"
9887libNixName "libavutil" = return "ffmpeg"
99−libNixName "libglade-2.0" = return "libglade"
10088libNixName "libgsasl" = return "gsasl"
10189libNixName "libpcre" = return "pcre"
10290libNixName "libR" = return "R"
103−libNixName "librsvg-2.0" = return "librsvg"
104−libNixName "libsoup-2.4" = return "libsoup"
10591libNixName "libsoup-gnome-2.4" = return "libsoup"
10692libNixName "libsystemd" = return "systemd"
107−libNixName "libusb-1.0" = return "libusb"
10893libNixName "libxml-2.0" = return "libxml2"
10994libNixName "libzip" = return "libzip"
11095libNixName "libzmq" = return "zeromq"
111−libNixName "llvm-3.0" = return "llvm"
112−libNixName "llvm-3.5" = return "llvm"
113−libNixName "llvm-3.6" = return "llvm"
114−libNixName "llvm-3.7" = return "llvm"
115−libNixName "llvm-3.8" = return "llvm"
11696libNixName "m" = [] -- in stdenv
11797libNixName "magic" = return "file"
11898libNixName "MagickWand" = return "imagemagick"
119−libNixName "mono-2.0" = return "mono"
12099libNixName "mpi" = return "openmpi"
121100libNixName "ncursesw" = return "ncurses"
122101libNixName "netsnmp" = return "net_snmp"
@@ -129,7 +108,6 @@ libNixName "pcap" = return "libpcap"
129108libNixName "pfs-1.2" = return "pfstools"
130109libNixName "png" = return "libpng"
131110libNixName "poppler-glib" = return "poppler"
132−libNixName "portaudio-2.0" = return "portaudio"
133111libNixName "pq" = return "postgresql"
134112libNixName "pthread" = []
135113libNixName "pulse" = return "libpulseaudio"
@@ -146,9 +124,8 @@ libNixName "rtlsdr" = return "rtl-sdr"
146124libNixName "ruby1.8" = return "ruby"
147125libNixName "sane-backends" = return "saneBackends"
148126libNixName "sass" = return "libsass"
149−libNixName "sctp" = return "lksctp-tools" -- This is linux-specific, we should create a common attribute if we ever add sctp support for other systems
127+libNixName "sctp" = return "lksctp-tools" -- This is linux-specific, we should create a common attribute if we ever add sctp support for other systems.
150128libNixName "sdl2" = return "SDL2"
151−libNixName "SDL2-2.0" = return "SDL2"
152129libNixName "sndfile" = return "libsndfile"
153130libNixName "sodium" = return "libsodium"
154131libNixName "sqlite3" = return "sqlite"
@@ -160,13 +137,10 @@ libNixName "taglib_c" = return "taglib"
160137libNixName "tag_c" = return "taglib"
161138libNixName "udev" = return "systemd";
162139libNixName "uuid" = return "libossp_uuid";
163−libNixName "vte-2.90" = return "vte"
164−libNixName "vte-2.91" = return "vte"
165140libNixName "wayland-client" = return "wayland"
166141libNixName "wayland-cursor" = return "wayland"
167142libNixName "wayland-egl" = return "mesa"
168143libNixName "wayland-server" = return "wayland"
169−libNixName "webkit-1.0" = return "webkit"
170144libNixName "webkit2gtk-4.0" = return "webkit2gtk"
171145libNixName "webkit2gtk-web-extension-4.0" = return "webkit2gtk-web-extension"
172146libNixName "webkitgtk" = return "webkit"
@@ -190,7 +164,7 @@ libNixName "Xxf86vm" = return "libXxf86vm"
190164libNixName "yaml-0.1" = return "libyaml"
191165libNixName "z" = return "zlib"
192166libNixName "zmq" = return "zeromq"
193−libNixName x = return (fromString x)
167+libNixName x = return (guessNixIdentifier x)
194168
195169-- | Map build tool names to Nix attribute names.
196170buildToolNixName :: String -> [Identifier]
@@ -206,3 +180,22 @@ buildToolNixName "nix-env" = return "nix"
206180buildToolNixName "nix-instantiate" = return "nix"
207181buildToolNixName "nix-store" = return "nix"
208182buildToolNixName x = return (fromString x)
183+
184+-- | Helper function to extract the package name from a String that may or may
185+-- not be formatted like a Cabal package identifier.
186+--
187+-- >>> guessNixIdentifier "foo-1.0"
188+-- Identifier "foo"
189+-- >>> guessNixIdentifier "foo"
190+-- Identifier "foo"
191+-- >>> guessNixIdentifier "foo - 0"
192+-- Identifier "foo - 0"
193+-- >>> guessNixIdentifier "1foo-1.0"
194+-- Identifier "1foo"
195+-- >>> guessNixIdentifier "-foo-1.0"
196+-- Identifier "-foo-1.0"
197+
198+guessNixIdentifier :: String -> Identifier
199+guessNixIdentifier x = fromString (fromMaybe x maybePackageId)
200+ where
201+ maybePackageId = unPackageName . pkgName <$> simpleParse x