{-# LANGUAGE OverloadedStrings #-}

module Distribution.Nixpkgs.Haskell.FromCabal.Name ( toNixName, libNixName, buildToolNixName ) where

import Data.Maybe
import Data.String
import Distribution.Package
import Distribution.Text
import Language.Nix

-- | Map Cabal names to Nix identifiers that don't need to be quoted.
--
--   Currently this only supports 'PackageName's that consist of nothing but ASCII
--   characters (as needs to be the case with all Hackage packages).
--   Cabal package names are not changed if they already are a Nix identifier
--   that doesn't need quoting (with some notable exceptions). If they would need
--   quoting, they are prefixed with an underscore.
--
--   >>> toNixName $ mkPackageName "cabal2nix"
--   Identifier "cabal2nix"
--   >>> toNixName $ mkPackageName "4Blocks"
--   Identifier "_4Blocks"
--   >>> toNixName $ mkPackageName "assert"
--   Identifier "_assert"
--
--   Package names that clash with attribute names that have a special meaning
--   to the Nix evaluator are also prefixed (e.g.
--   [@type@ is evaluated eagerly]((https://github.com/NixOS/cabal2nix/issues/163)).
--
--   The mapping is intended to be reversible, but this isn't implemented by
--   @cabal2nix@ yet (and untested). It also should not be considered
--   stable yet, in particular the following may be changed:
--
--   - Future versions of @cabal2nix@ may prefix more 'PackageName's.
--   - The mapping may be extended to support all possible 'PackageName's.
--
--   See also:
--
--   - [Cabal documentation on the package name field](https://cabal.readthedocs.io/en/stable/cabal-package-description-file.html#pkg-field-name)
--   - "Language.Nix.Identifier"
--   - [Nix documentation on identifiers](https://nix.dev/manual/nix/2.30/language/identifiers.html#identifier)
toNixName :: PackageName -> Identifier
toNixName :: PackageName -> Identifier
toNixName PackageName
n = String -> Identifier
forall a. IsString a => String -> a
fromString (String -> Identifier) -> String -> Identifier
forall a b. (a -> b) -> a -> b
$
  case PackageName -> String
unPackageName PackageName
n of
    String
"" -> String -> String
forall a. HasCallStack => String -> a
error String
"toNixName: BUG: received empty package name"
    Char
'_':String
_ -> String -> String
forall a. HasCallStack => String -> a
error String
"toNixName: BUG: PackageName starts with an underscore, but shouldn't"
    String
name
      -- From the Cabal documentation:
      --
      --   A valid package name comprises an alphanumeric ‘word’; or two or more
      --   such words separated by a hyphen character (-). A word cannot be
      --   comprised only of the digits 0 to 9.
      --
      -- Cabal also latin unicode characters while Hackage enforces that package
      -- names are ASCII.
      --
      -- If the package name comes from Hackage, the set of legal characters
      -- ([a-zA-Z0-9-]) is a subset of those permissible as a Nix identifier
      -- without quoting ([a-zA-Z0-9_'-]). The main difference are the rules
      -- governing what may go where. In the following cases a Hackage package
      -- name is not a simple identifier and 'needsQuoting' returns True:
      --
      -- - if the first “word” of the package name starts with a number, e.g. 4Blocks.
      -- - if the package name is the same one of the 'nixKeywords'.
      --
      -- If we prefix these strings with an underscore, they no longer need quoting.
      -- Because Cabal 'PackageName's may not contain underscores this mapped name
      -- can never clash. (Reversing the mapping is very simple at the moment as
      -- a result.)
      --
      -- We additionally prefix perfectly usable identifiers like type and
      -- recurseForDerivations if they have special meaning to the Nix evaluator
      -- (or Hydra etc.) since it may cause evaluation failures if we expose a
      -- package under haskellPackages instead of whatever value(s) Nix may
      -- expect.
      --
      -- TODO: Add mapping for non-ASCII 'PackageName's, using __ prefix (?)
      | String -> Bool
needsQuoting String
name Bool -> Bool -> Bool
|| String
name String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
haveSpecialSemantics -> Char
'_'Char -> String -> String
forall a. a -> [a] -> [a]
:String
name
      | Bool
otherwise -> String
name
  where
    -- Special attributes that affect the behavior of the Nix evaluator in some way.
    -- See https://github.com/NixOS/cabal2nix/issues/163.
    -- We can ignore underscore prefixed attrs like __toString, __functor.
    -- Only type is the name of a real package at the moment.
    haveSpecialSemantics :: [String]
haveSpecialSemantics = [ String
"type", String
"outPath", String
"recurseForDerivations" ]

-- | Map library names specified in Cabal files to Nix package identifiers.
--
-- TODO: This list should not be hard-coded here; it belongs into the Nixpkgs
--       repository.
--
-- TODO: Re-use hook matching system from PostProcess.hs here.

libNixName :: String -> [Identifier]
libNixName :: String -> [Identifier]
libNixName String
""                                   = []
libNixName String
"adns"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"adns"
libNixName String
"alsa"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"alsa-lib"
libNixName String
"alut"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"freealut"
libNixName String
"appindicator-0.1"                   = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libappindicator-gtk2"
libNixName String
"appindicator3-0.1"                  = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libappindicator-gtk3"
libNixName String
"asound"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"alsa-lib"
libNixName String
"ayatana-appindicator3-0.1"          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libayatana-appindicator"
libNixName String
"b2"                                 = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libb2"
libNixName String
"boost_context"                      = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"boost"
libNixName String
"bz2"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"bzip2"
libNixName String
"c++"                                = []  -- What is that?
libNixName String
"cairo-gobject"                      = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"cairo"
libNixName String
"cairo-pdf"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"cairo"
libNixName String
"cairo-ps"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"cairo"
libNixName String
"cairo-svg"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"cairo"
libNixName String
"clang"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libclang"
libNixName String
"clang-3.8"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libclang"  -- TODO: guessNixIdentifier before libNixName…
libNixName String
"crypt"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libxcrypt" -- starting with NixOS 22.11, glibc's libcrypt will no longer be built
libNixName String
"crypto"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"openssl"
libNixName String
"curses"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"ncurses"
libNixName String
"dbusmenu-glib-0.4"                  = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libdbusmenu"
libNixName String
"dbusmenu-gtk3-0.4"                  = [Identifier
"libdbusmenu-gtk3", Identifier
"gtk3"]
libNixName String
"dl"                                 = []  -- provided by glibc
libNixName String
"ff"                                 = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libff"
libNixName String
"fftw3"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"fftw"
libNixName String
"fftw3f"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"fftwFloat"
libNixName String
"FLAC"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"flac"
libNixName String
"freetype2"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"freetype"
libNixName String
"gconf"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"GConf"
libNixName String
"gconf-2.0"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"GConf"
libNixName String
"gdk-2.0"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk2"
libNixName String
"gdk-3.0"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk3"
libNixName String
"gdk-pixbuf-2.0"                     = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gdk-pixbuf"
libNixName String
"gdk-x11-2.0"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gdk_x11"
libNixName String
"geos_c"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"geos"
libNixName String
"gdk-x11-3.0"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk3"
libNixName String
"gio-2.0"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"glib"
libNixName String
"GL"                                 = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libGL"
libNixName String
"GLEW"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"glew"
libNixName String
"GLU"                                = [Identifier
"libGLU",Identifier
"libGL"]
libNixName String
"glut"                               = [Identifier
"freeglut",Identifier
"libGLU",Identifier
"libGL"]
libNixName String
"gmodule"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"glib"
libNixName String
"gmodule-2.0"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"glib"
libNixName String
"gnome-keyring"                      = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libgnome-keyring"
libNixName String
"gnome-keyring-1"                    = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libgnome-keyring"
libNixName String
"gnome-vfs-2.0"                      = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gnome-vfs"
libNixName String
"gnome-vfs-module-2.0"               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gnome-vfs_module"
libNixName String
"gobject-2.0"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"glib"
libNixName String
"gobject-introspection-1.0"          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gobject-introspection"
libNixName String
"graphene-gobject-1.0"               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"graphene"
libNixName String
"gstreamer-audio-0.10"               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gst-plugins-base"
libNixName String
"gstreamer-audio-1.0"                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gst-plugins-base"
libNixName String
"gstreamer-base-0.10"                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gst-plugins-base"
libNixName String
"gstreamer-base-1.0"                 = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gst-plugins-base"
libNixName String
"gstreamer-controller-0.10"          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gstreamer"
libNixName String
"gstreamer-dataprotocol-0.10"        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gstreamer"
libNixName String
"gstreamer-net-0.10"                 = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gst-plugins-base"
libNixName String
"gstreamer-plugins-base-0.10"        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gst-plugins-base"
libNixName String
"gstreamer-video-1.0"                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gst-plugins-base"
libNixName String
"gthread-2.0"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"glib"
libNixName String
"gtk+-2.0"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk2"
libNixName String
"gtk+-3.0"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk3"
libNixName String
"gtk-x11-2.0"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk_x11"
libNixName String
"gtk4-atspi"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk4"
libNixName String
"gtk4-broadway"                      = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk4"
libNixName String
"gtk4"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk4"
libNixName String
"gtk4-unix-print"                    = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk4"
libNixName String
"gtk4-wayland"                       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk4"
libNixName String
"gtk4-x11"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk4"
libNixName String
"gtksourceview-3.0"                  = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtksourceview3"
libNixName String
"gtksourceview-5"                    = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtksourceview5"
libNixName String
"harfbuzz-gobject"                   = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"harfbuzz"
libNixName String
"harfbuzz-subset"                    = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"harfbuzz"
libNixName String
"hidapi-libusb"                      = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"hidapi"
libNixName String
"icu-i18n"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"icu"
libNixName String
"icu-io"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"icu"
libNixName String
"icu-uc"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"icu"
libNixName String
"icudata"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"icu"
libNixName String
"icui18n"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"icu"
libNixName String
"icuio"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"icu"
libNixName String
"icuuc"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"icu"
libNixName String
"idn"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libidn"
libNixName String
"ImageMagick"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"imagemagick"
libNixName String
"Imlib2"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"imlib2"
libNixName String
"iw"                                 = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"wirelesstools"
libNixName String
"jack"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libjack2"
libNixName String
"javascriptcoregtk"                  = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"webkitgtk"
libNixName String
"javascriptcoregtk-4.1"              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"webkitgtk_4_1"
libNixName String
"javascriptcoregtk-6.0"              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"webkitgtk_6_0"
libNixName String
"jpeg"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libjpeg"
libNixName String
"jvm"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"jdk"
libNixName String
"lapack"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"liblapack"
libNixName String
"lber"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"openldap"
libNixName String
"ldap"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"openldap"
libNixName String
"libavutil"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"ffmpeg"
libNixName String
"libbrotlienc"                       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"brotli"
libNixName String
"libbrotlidec"                       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"brotli"
libNixName String
"libcurl"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"curl"
libNixName String
"libcrypto"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"openssl"
libNixName String
"libglog"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"glog"
libNixName String
"libgsasl"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gsasl"
libNixName String
"liblzma"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"xz"
libNixName String
"libnm"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"networkmanager"
libNixName String
"libpcre"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"pcre"
libNixName String
"libpcre2"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"pcre2"
libNixName String
"libpcre2-8"                         = String -> [Identifier]
libNixName String
"libpcre2"
libNixName String
"libpipewire-0.3"                    = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"pipewire"
libNixName String
"libqrencode"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"qrencode"
libNixName String
"libR"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"R"
libNixName String
"libsecp256k1"                       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"secp256k1"
libNixName String
"libsoup-2.4"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libsoup_2_4"
libNixName String
"libsoup-gnome-2.4"                  = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libsoup_2_4"
libNixName String
"libsoup-3.0"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libsoup_3"
libNixName String
"libspa-0.2"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"pipewire"
libNixName String
"libsystemd"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"systemd"
libNixName String
"libudev"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"systemd"
libNixName String
"libxml-2.0"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libxml2"
libNixName String
"libxxhash"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"xxHash"
libNixName String
"libzip"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libzip"
libNixName String
"libzmq"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"zeromq"
libNixName String
"liquid"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"liquid-dsp"
libNixName String
"llama"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"llama-cpp"
libNixName String
"lzma"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"xz"
libNixName String
"m"                                  = []  -- in stdenv
libNixName String
"magic"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"file"
libNixName String
"MagickWand"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"imagemagick"
libNixName String
"mnl"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libmnl"
libNixName String
"mpi"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"openmpi"
libNixName String
"mysql"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"mariadb"
libNixName String
"ncursesw"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"ncurses"
libNixName String
"netsnmp"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"net-snmp"
libNixName String
"nix-cmd"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"nix"
libNixName String
"nix-expr-c"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"nix"
libNixName String
"nix-expr"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"nix"
libNixName String
"nix-fetchers-c"                     = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"nix"
libNixName String
"nix-fetchers"                       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"nix"
libNixName String
"nix-flake-c"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"nix"
libNixName String
"nix-flake"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"nix"
libNixName String
"nix-main-c"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"nix"
libNixName String
"nix-main"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"nix"
libNixName String
"nix-store-c"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"nix"
libNixName String
"nix-store"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"nix"
libNixName String
"nix-util-c"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"nix"
libNixName String
"nix-util"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"nix"
libNixName String
"notify"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libnotify"
libNixName String
"odbc"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"unixODBC"
libNixName String
"openblas"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"openblasCompat"
libNixName String
"panelw"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"ncurses"
libNixName String
"pangocairo"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"pango"
libNixName String
"pcap"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libpcap"
libNixName String
"pfs-1.2"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"pfstools"
libNixName String
"png"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libpng"
libNixName String
"poppler-cpp"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"poppler"
libNixName String
"poppler-glib"                       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"poppler_gi"
libNixName String
"pq"                                 = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libpq"
libNixName String
"pthread"                            = []
libNixName String
"pulse"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libpulseaudio"
libNixName String
"pulse-simple"                       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libpulseaudio"
libNixName String
"python-3.3"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"python33"
libNixName String
"python-3.4"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"python34"
libNixName String
"python3-embed"                      = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"python3"
libNixName String
"Qt5Core"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"qt5"
libNixName String
"Qt5Gui"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"qt5"
libNixName String
"Qt5Qml"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"qt5"
libNixName String
"Qt5Quick"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"qt5"
libNixName String
"Qt5Widgets"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"qt5"
libNixName String
"quadprog"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"QuadProgpp"
libNixName String
"rt"                                 = [] -- in glibc
libNixName String
"rtlsdr"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"rtl-sdr"
libNixName String
"ruby1.8"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"ruby"
libNixName String
"sass"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libsass"
libNixName String
"sctp"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"lksctp-tools" -- This is linux-specific, we should create a common attribute if we ever add sctp support for other systems.
libNixName String
"sdl2"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"SDL2"
libNixName String
"sndfile"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libsndfile"
libNixName String
"SoapySDR"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"soapysdr"
libNixName String
"sodium"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libsodium"
libNixName String
"sqlite3"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"sqlite"
libNixName String
"ssh2"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libssh2"
libNixName String
"ssl"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"openssl"
libNixName String
"statgrab"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libstatgrab"
libNixName String
"stdc++"                             = [] -- What is that?
libNixName String
"stdc++.dll"                         = [] -- What is that?
libNixName String
"systemd-journal"                    = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"systemd"
libNixName String
"tag_c"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"taglib"
libNixName String
"taglib_c"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"taglib"
libNixName String
"tdjson"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"tdlib"
libNixName String
"tensorflow"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libtensorflow"
libNixName String
"udev"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"systemd";
libNixName String
"uuid"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libossp_uuid";
libNixName String
"vte-2.91"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"vte"
libNixName String
"vulkan"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"vulkan-loader"
libNixName String
"wayland-client"                     = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"wayland"
libNixName String
"wayland-cursor"                     = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"wayland"
libNixName String
"wayland-egl"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libGL"
libNixName String
"wayland-server"                     = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"wayland"
libNixName String
"webkit"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"webkitgtk" -- this is an alias, so it only works for downstream expressions not in hackage-packages.nix
libNixName String
"webkit2gtk"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"webkitgtk"
libNixName String
"webkit2gtk-4.1"                     = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"webkitgtk_4_1"
libNixName String
"webkit2gtk-6.0"                     = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"webkitgtk_6_0"
libNixName String
"webkit2gtk-web-extension-4.1"       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"webkitgtk_4_1"
libNixName String
"webkit2gtk-web-extension-6.0"       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"webkitgtk_6_0"
libNixName String
"wxGTK"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"wxGTK32"
libNixName String
"X11"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libX11"
libNixName String
"x11"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libX11"
libNixName String
"xau"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libXau"
libNixName String
"Xcursor"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libXcursor"
libNixName String
"xerces-c"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"xercesc"
libNixName String
"Xext"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libXext"
libNixName String
"xft"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libXft"
libNixName String
"Xi"                                 = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libXi"
libNixName String
"Xinerama"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libXinerama"
libNixName String
"xkbcommon"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libxkbcommon"
libNixName String
"xml2"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libxml2"
libNixName String
"Xpm"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libXpm"
libNixName String
"Xrandr"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libXrandr"
libNixName String
"Xrender"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libXrender"
libNixName String
"xscrnsaver"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libXScrnSaver"
libNixName String
"Xss"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libXScrnSaver"
libNixName String
"Xtst"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libXtst"
libNixName String
"Xxf86vm"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libXxf86vm"
libNixName String
"yaml"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libyaml"
libNixName String
"yaml-0.1"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"libyaml"
libNixName String
"z"                                  = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"zlib"
libNixName String
"zmq"                                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"zeromq"
libNixName String
"TKBO"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKBRep"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKBin"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKBinL"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKBinTObj"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKBinXCAF"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKBool"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKCAF"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKCDF"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKDCAF"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKDE"                               = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKDECascade"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKDEGLTF"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKDEIGES"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKDEOBJ"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKDEPLY"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKDESTEP"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKDESTL"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKDEVRML"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKDraw"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKExpress"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKFeat"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKFillet"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKG2d"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKG3d"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKGeomAlgo"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKGeomBase"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKHLR"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKLCAF"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKMath"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKMesh"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKMeshVS"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKOffset"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKOpenGl"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKOpenGlTest"                       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKPrim"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKQADraw"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKRWMesh"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKService"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKShHealing"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKStd"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKStdL"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKTObj"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKTObjDRAW"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKTopAlgo"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKTopTest"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKV3d"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKVCAF"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKViewerTest"                       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXCAF"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXDEDRAW"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXMesh"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXSBase"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXSDRAW"                           = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXSDRAWDE"                         = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXSDRAWGLTF"                       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXSDRAWIGES"                       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXSDRAWOBJ"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXSDRAWPLY"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXSDRAWSTEP"                       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXSDRAWSTL"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXSDRAWVRML"                       = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXml"                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXmlL"                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXmlTObj"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKXmlXCAF"                          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
"TKernel"                            = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"opencascade-occt"
libNixName String
x                                    = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> Identifier
guessNixIdentifier String
x)

-- | Map build tool names to Nix attribute names.
buildToolNixName :: String -> [Identifier]
buildToolNixName :: String -> [Identifier]
buildToolNixName String
""                             = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> Identifier
forall a. HasCallStack => String -> a
error String
"buildToolNixName: invalid empty dependency name")
buildToolNixName String
"cabal"                        = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"cabal-install"
buildToolNixName String
"fltk-config"                  = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"fltk"
buildToolNixName String
"ghc"                          = []
buildToolNixName String
"gtk2hsC2hs"                   = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk2hs-buildtools"
buildToolNixName String
"gtk2hsHookGenerator"          = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk2hs-buildtools"
buildToolNixName String
"gtk2hsTypeGen"                = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"gtk2hs-buildtools"
buildToolNixName String
"hsc2hs"                       = []
buildToolNixName String
"utillinux"                    = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return Identifier
"util-linux"
buildToolNixName String
x                              = Identifier -> [Identifier]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> Identifier
forall a. IsString a => String -> a
fromString String
x)

-- | Helper function to extract the package name from a String that may or may
-- not be formatted like a Cabal package identifier.
--
-- >>> guessNixIdentifier "foo-1.0"
-- Identifier "foo"
-- >>> guessNixIdentifier "foo"
-- Identifier "foo"
-- >>> guessNixIdentifier "foo - 0"
-- Identifier "foo - 0"
-- >>> guessNixIdentifier "1foo-1.0"
-- Identifier "1foo"
-- >>> guessNixIdentifier "-foo-1.0"
-- Identifier "-foo-1.0"

guessNixIdentifier :: String -> Identifier
guessNixIdentifier :: String -> Identifier
guessNixIdentifier String
x = String -> Identifier
forall a. IsString a => String -> a
fromString (String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe String
x Maybe String
maybePackageId)
  where
    maybePackageId :: Maybe String
maybePackageId = PackageName -> String
unPackageName (PackageName -> String)
-> (PackageIdentifier -> PackageName)
-> PackageIdentifier
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageIdentifier -> PackageName
pkgName (PackageIdentifier -> String)
-> Maybe PackageIdentifier -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Maybe PackageIdentifier
forall a. Parsec a => String -> Maybe a
simpleParse String
x