about summary refs log tree commit diff
path: root/pkgs/development/compilers/ghc/Cabal-3.12-paths-fix-cycle-aarch64-darwin.patch
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/compilers/ghc/Cabal-3.12-paths-fix-cycle-aarch64-darwin.patch')
-rw-r--r--pkgs/development/compilers/ghc/Cabal-3.12-paths-fix-cycle-aarch64-darwin.patch596
1 files changed, 0 insertions, 596 deletions
diff --git a/pkgs/development/compilers/ghc/Cabal-3.12-paths-fix-cycle-aarch64-darwin.patch b/pkgs/development/compilers/ghc/Cabal-3.12-paths-fix-cycle-aarch64-darwin.patch
deleted file mode 100644
index f094790088c2..000000000000
--- a/pkgs/development/compilers/ghc/Cabal-3.12-paths-fix-cycle-aarch64-darwin.patch
+++ /dev/null
@@ -1,596 +0,0 @@
-This patch is based on https://github.com/sternenseemann/cabal/compare/Cabal-v3.12.0.0..e836ef53c1f80bf99a70f9c4ee5976e9f3830215
-and has been postprocessed with `filterdiff --strip=1 --addoldprefix=a/libraries/Cabal/ --addnewprefix=b/libraries/Cabal/`.
-
-Reasoning and explanation of the patch can be found in the comment in the diff for PathsModule.hs below.
-
-diffCabal/src/Distribution/Simple/Build/PathsModule.hs b/Cabal/src/Distribution/Simple/Build/PathsModule.hs
-index 892e5bd38..391f5b130 100644
---- a/libraries/Cabal/Cabal/src/Distribution/Simple/Build/PathsModule.hs
-+++ b/libraries/Cabal/Cabal/src/Distribution/Simple/Build/PathsModule.hs
-@@ -51,6 +51,7 @@ generatePathsModule pkg_descr lbi clbi =
-       , Z.zIsWindows = isWindows
-       , Z.zIsI386 = buildArch == I386
-       , Z.zIsX8664 = buildArch == X86_64
-+      , Z.zOr = (||)
-       , Z.zNot = not
-       , Z.zManglePkgName = showPkgName
-       , Z.zPrefix = show flat_prefix
-@@ -60,8 +61,110 @@ generatePathsModule pkg_descr lbi clbi =
-       , Z.zDatadir = zDatadir
-       , Z.zLibexecdir = zLibexecdir
-       , Z.zSysconfdir = zSysconfdir
-+      , -- Sadly we can't be cleverer about this – we can't have literals in the template
-+        Z.zShouldEmitDataDir = shouldEmit "DataDir"
-+      , Z.zShouldEmitLibDir = shouldEmit "LibDir"
-+      , Z.zShouldEmitDynLibDir = shouldEmit "DynLibDir"
-+      , Z.zShouldEmitLibexecDir = shouldEmit "LibexecDir"
-+      , Z.zShouldEmitSysconfDir = shouldEmit "SysconfDir"
-+      , Z.zWarning = zWarning
-+      , Z.zShouldEmitWarning = zShouldEmitWarning
-       }
-   where
-+    -- GHC's NCG backend for aarch64-darwin does not support link-time dead code
-+    -- elimination to the extent that NCG does for other targets. Consequently,
-+    -- we struggle with unnecessarily retained store path references due to the
-+    -- use of `Paths_*` modules – even if `getLibDir` is not used, it'll end up
-+    -- in the final library or executables we build.
-+    --
-+    -- When using a different output for the executables and library, this
-+    -- becomes more sinister: The library will contain a reference to the bin
-+    -- output and itself due to `getLibDir` and `getBinDir`, but the executables
-+    -- will do so, too. Either due to linking dynamically or because the library
-+    -- is linked statically into the executable and retains those references.
-+    -- Since Nix disallows cyclical references between two outputs, it becomes
-+    -- impossible to use the `Paths_*` module and a separate `bin` output for
-+    -- aarch64-darwin.
-+    --
-+    -- The solution we have resorted to for now, is to trim the `Paths_*` module
-+    -- dynamically depending on what references *could* be used without causing
-+    -- a cyclical reference. That has the effect that any code that would not
-+    -- cause a cyclical reference with dead code elimination will compile and
-+    -- work for aarch64-darwin. If the code would use a `get*Dir` function that
-+    -- has been omitted, this would indicate that the code would have caused a
-+    -- cyclical reference anyways.
-+    --
-+    -- The logic for this makes some pretty big assumptions about installation
-+    -- prefixes that probably only hold fully in nixpkgs with
-+    -- `haskellPackages.mkDerivation`. Simple uses outside nixpkgs that have
-+    -- everything below the same prefix should continue to work as expected,
-+    -- though.
-+    --
-+    -- We assume the following:
-+    --
-+    -- - flat_prefix is `$out`.
-+    -- - flat_libdir etc. are always below `$out`.
-+    --
-+    -- Since in the normal case due to static linking `$bin` and `$out` will
-+    -- have the same references in libraries/executables, we need to either
-+    -- prevent usage of `getBinDir` or `getLibDir` to break the cycle in case
-+    -- `flat_bindir` is not below `$out`. We have decided to always allow usage
-+    -- of `getBinDir`, so `getLibDir` gets dropped if a separate `bin` output is
-+    -- used. This has the simple reason that `$out` which contains `flat_libdir`
-+    -- tends to be quite big – we would like to have a `bin` output that doesn't
-+    -- require keeping that around.
-+    pathEmittable :: FilePath -> Bool
-+    pathEmittable p
-+      -- If the executable installation target is below `$out` the reference
-+      -- cycle is within a single output (since libs are installed to `$out`)
-+      -- and thus unproblematic. We can use any and all `get*Dir` functions.
-+      | flat_prefix `isPrefixOf` flat_bindir = True
-+      -- Otherwise, we need to disallow all `get*Dir` functions that would cause
-+      -- a reference to `$out` which contains the libraries that would in turn
-+      -- reference `$bin`. This always include `flat_libdir` and friends, but
-+      -- can also include `flat_datadir` if no separate output for data files is
-+      -- used.
-+      | otherwise = not (flat_prefix `isPrefixOf` p)
-+
-+    -- This list maps the "name" of the directory to whether we want to include
-+    -- it in the `Paths_*` module or not. `shouldEmit` performs a lookup in this.
-+    dirs :: [(String, Bool)]
-+    dirs =
-+      map
-+        (\(name, path) -> (name, pathEmittable path))
-+        [ ("LibDir", flat_libdir)
-+        , ("DynLibDir", flat_dynlibdir)
-+        , ("DataDir", flat_datadir)
-+        , ("LibexecDir", flat_libexecdir)
-+        , ("SysconfDir", flat_sysconfdir)
-+        ]
-+
-+    shouldEmit :: String -> Bool
-+    shouldEmit name =
-+      case lookup name dirs of
-+        Just b -> b
-+        Nothing -> error "panic! BUG in Cabal Paths_ patch for aarch64-darwin, report this at https://github.com/nixos/nixpkgs/issues"
-+
-+    -- This is a comma separated list of all functions that have been emitted.
-+    -- This is included in a GHC warning which will be attached to the `Paths_*`
-+    -- module in case we are dropping any `get*Dir` functions that would
-+    -- normally exist.
-+    --
-+    -- TODO: getDataFileName is not accounted for at the moment.
-+    omittedFunctions :: String
-+    omittedFunctions =
-+      intercalate ", " $
-+        map (("get" ++) . fst) $
-+          filter (not . snd) dirs
-+
-+    zWarning :: String
-+    zWarning =
-+      show $
-+        "The following functions have been omitted by a nixpkgs-specific patch to Cabal: "
-+          ++ omittedFunctions
-+    zShouldEmitWarning :: Bool
-+    zShouldEmitWarning = any (not . snd) dirs
-+
-     supports_cpp = supports_language_pragma
-     supports_rebindable_syntax = ghc_newer_than (mkVersion [7, 0, 1])
-     supports_language_pragma = ghc_newer_than (mkVersion [6, 6, 1])
-diffCabal/src/Distribution/Simple/Build/PathsModule/Z.hs b/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs
-index 25c924720..a8278675e 100644
---- a/libraries/Cabal/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs
-+++ b/libraries/Cabal/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs
-@@ -19,6 +19,14 @@ data Z
-          zDatadir :: FilePath,
-          zLibexecdir :: FilePath,
-          zSysconfdir :: FilePath,
-+         zShouldEmitLibDir :: Bool,
-+         zShouldEmitDynLibDir :: Bool,
-+         zShouldEmitLibexecDir :: Bool,
-+         zShouldEmitDataDir :: Bool,
-+         zShouldEmitSysconfDir :: Bool,
-+         zShouldEmitWarning :: Bool,
-+         zWarning :: String,
-+         zOr :: (Bool -> Bool -> Bool),
-          zNot :: (Bool -> Bool),
-          zManglePkgName :: (PackageName -> String)}
-     deriving Generic
-@@ -54,10 +62,51 @@ render z_root = execWriter $ do
-   tell "{-# OPTIONS_GHC -w #-}\n"
-   tell "module Paths_"
-   tell (zManglePkgName z_root (zPackageName z_root))
--  tell " (\n"
-+  tell "\n"
-+  tell "  "
-+  if (zShouldEmitWarning z_root)
-+  then do
-+    tell "{-# WARNING "
-+    tell (zWarning z_root)
-+    tell " #-}"
-+    return ()
-+  else do
-+    return ()
-+  tell "\n"
-+  tell "  (\n"
-   tell "    version,\n"
--  tell "    getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir,\n"
--  tell "    getDataFileName, getSysconfDir\n"
-+  tell "    getBinDir,\n"
-+  if (zOr z_root (zNot z_root (zAbsolute z_root)) (zShouldEmitLibDir z_root))
-+  then do
-+    tell "    getLibDir,\n"
-+    return ()
-+  else do
-+    return ()
-+  if (zOr z_root (zNot z_root (zAbsolute z_root)) (zShouldEmitDynLibDir z_root))
-+  then do
-+    tell "    getDynLibDir,\n"
-+    return ()
-+  else do
-+    return ()
-+  if (zOr z_root (zNot z_root (zAbsolute z_root)) (zShouldEmitLibexecDir z_root))
-+  then do
-+    tell "    getLibexecDir,\n"
-+    return ()
-+  else do
-+    return ()
-+  if (zOr z_root (zNot z_root (zAbsolute z_root)) (zShouldEmitDataDir z_root))
-+  then do
-+    tell "    getDataFileName,\n"
-+    tell "    getDataDir,\n"
-+    return ()
-+  else do
-+    return ()
-+  if (zOr z_root (zNot z_root (zAbsolute z_root)) (zShouldEmitSysconfDir z_root))
-+  then do
-+    tell "    getSysconfDir\n"
-+    return ()
-+  else do
-+    return ()
-   tell "  ) where\n"
-   tell "\n"
-   if (zNot z_root (zAbsolute z_root))
-@@ -106,12 +155,15 @@ render z_root = execWriter $ do
-   tell (zVersionDigits z_root)
-   tell " []\n"
-   tell "\n"
--  tell "getDataFileName :: FilePath -> IO FilePath\n"
--  tell "getDataFileName name = do\n"
--  tell "  dir <- getDataDir\n"
--  tell "  return (dir `joinFileName` name)\n"
--  tell "\n"
--  tell "getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir, getSysconfDir :: IO FilePath\n"
-+  if (zOr z_root (zNot z_root (zAbsolute z_root)) (zShouldEmitDataDir z_root))
-+  then do
-+    tell "getDataFileName :: FilePath -> IO FilePath\n"
-+    tell "getDataFileName name = do\n"
-+    tell "  dir <- getDataDir\n"
-+    tell "  return (dir `joinFileName` name)\n"
-+    return ()
-+  else do
-+    return ()
-   tell "\n"
-   let
-     z_var0_function_defs = do
-@@ -139,6 +191,7 @@ render z_root = execWriter $ do
-   tell "\n"
-   if (zRelocatable z_root)
-   then do
-+    tell "\n"
-     tell "\n"
-     tell "getPrefixDirReloc :: FilePath -> IO FilePath\n"
-     tell "getPrefixDirReloc dirRel = do\n"
-@@ -148,31 +201,37 @@ render z_root = execWriter $ do
-     tell (zBindir z_root)
-     tell ") `joinFileName` dirRel)\n"
-     tell "\n"
-+    tell "getBinDir     :: IO FilePath\n"
-     tell "getBinDir     = catchIO (getEnv \""
-     tell (zManglePkgName z_root (zPackageName z_root))
-     tell "_bindir\")     (\\_ -> getPrefixDirReloc $ "
-     tell (zBindir z_root)
-     tell ")\n"
-+    tell "getLibDir     :: IO FilePath\n"
-     tell "getLibDir     = catchIO (getEnv \""
-     tell (zManglePkgName z_root (zPackageName z_root))
-     tell "_libdir\")     (\\_ -> getPrefixDirReloc $ "
-     tell (zLibdir z_root)
-     tell ")\n"
-+    tell "getDynLibDir  :: IO FilePath\n"
-     tell "getDynLibDir  = catchIO (getEnv \""
-     tell (zManglePkgName z_root (zPackageName z_root))
-     tell "_dynlibdir\")  (\\_ -> getPrefixDirReloc $ "
-     tell (zDynlibdir z_root)
-     tell ")\n"
-+    tell "getDataDir    :: IO FilePath\n"
-     tell "getDataDir    = catchIO (getEnv \""
-     tell (zManglePkgName z_root (zPackageName z_root))
-     tell "_datadir\")    (\\_ -> getPrefixDirReloc $ "
-     tell (zDatadir z_root)
-     tell ")\n"
-+    tell "getLibexecDir :: IO FilePath\n"
-     tell "getLibexecDir = catchIO (getEnv \""
-     tell (zManglePkgName z_root (zPackageName z_root))
-     tell "_libexecdir\") (\\_ -> getPrefixDirReloc $ "
-     tell (zLibexecdir z_root)
-     tell ")\n"
-+    tell "getSysconfDir :: IO FilePath\n"
-     tell "getSysconfDir = catchIO (getEnv \""
-     tell (zManglePkgName z_root (zPackageName z_root))
-     tell "_sysconfdir\") (\\_ -> getPrefixDirReloc $ "
-@@ -186,72 +245,119 @@ render z_root = execWriter $ do
-     if (zAbsolute z_root)
-     then do
-       tell "\n"
--      tell "bindir, libdir, dynlibdir, datadir, libexecdir, sysconfdir :: FilePath\n"
-+      tell "bindir     :: FilePath\n"
-       tell "bindir     = "
-       tell (zBindir z_root)
-       tell "\n"
--      tell "libdir     = "
--      tell (zLibdir z_root)
--      tell "\n"
--      tell "dynlibdir  = "
--      tell (zDynlibdir z_root)
-+      tell "getBinDir     :: IO FilePath\n"
-+      tell "getBinDir     = catchIO (getEnv \""
-+      tell (zManglePkgName z_root (zPackageName z_root))
-+      tell "_bindir\")     (\\_ -> return bindir)\n"
-       tell "\n"
--      tell "datadir    = "
--      tell (zDatadir z_root)
-+      if (zShouldEmitLibDir z_root)
-+      then do
-+        tell "libdir     :: FilePath\n"
-+        tell "libdir     = "
-+        tell (zLibdir z_root)
-+        tell "\n"
-+        tell "getLibDir     :: IO FilePath\n"
-+        tell "getLibDir     = catchIO (getEnv \""
-+        tell (zManglePkgName z_root (zPackageName z_root))
-+        tell "_libdir\")     (\\_ -> return libdir)\n"
-+        return ()
-+      else do
-+        return ()
-       tell "\n"
--      tell "libexecdir = "
--      tell (zLibexecdir z_root)
-+      if (zShouldEmitDynLibDir z_root)
-+      then do
-+        tell "dynlibdir  :: FilePath\n"
-+        tell "dynlibdir  = "
-+        tell (zDynlibdir z_root)
-+        tell "\n"
-+        tell "getDynLibDir  :: IO FilePath\n"
-+        tell "getDynLibDir  = catchIO (getEnv \""
-+        tell (zManglePkgName z_root (zPackageName z_root))
-+        tell "_dynlibdir\")  (\\_ -> return dynlibdir)\n"
-+        return ()
-+      else do
-+        return ()
-       tell "\n"
--      tell "sysconfdir = "
--      tell (zSysconfdir z_root)
-+      if (zShouldEmitDataDir z_root)
-+      then do
-+        tell "datadir    :: FilePath\n"
-+        tell "datadir    = "
-+        tell (zDatadir z_root)
-+        tell "\n"
-+        tell "getDataDir    :: IO FilePath\n"
-+        tell "getDataDir    = catchIO (getEnv \""
-+        tell (zManglePkgName z_root (zPackageName z_root))
-+        tell "_datadir\")    (\\_ -> return datadir)\n"
-+        return ()
-+      else do
-+        return ()
-       tell "\n"
-+      if (zShouldEmitLibexecDir z_root)
-+      then do
-+        tell "libexecdir :: FilePath\n"
-+        tell "libexecdir = "
-+        tell (zLibexecdir z_root)
-+        tell "\n"
-+        tell "getLibexecDir :: IO FilePath\n"
-+        tell "getLibexecDir = catchIO (getEnv \""
-+        tell (zManglePkgName z_root (zPackageName z_root))
-+        tell "_libexecdir\") (\\_ -> return libexecdir)\n"
-+        return ()
-+      else do
-+        return ()
-       tell "\n"
--      tell "getBinDir     = catchIO (getEnv \""
--      tell (zManglePkgName z_root (zPackageName z_root))
--      tell "_bindir\")     (\\_ -> return bindir)\n"
--      tell "getLibDir     = catchIO (getEnv \""
--      tell (zManglePkgName z_root (zPackageName z_root))
--      tell "_libdir\")     (\\_ -> return libdir)\n"
--      tell "getDynLibDir  = catchIO (getEnv \""
--      tell (zManglePkgName z_root (zPackageName z_root))
--      tell "_dynlibdir\")  (\\_ -> return dynlibdir)\n"
--      tell "getDataDir    = catchIO (getEnv \""
--      tell (zManglePkgName z_root (zPackageName z_root))
--      tell "_datadir\")    (\\_ -> return datadir)\n"
--      tell "getLibexecDir = catchIO (getEnv \""
--      tell (zManglePkgName z_root (zPackageName z_root))
--      tell "_libexecdir\") (\\_ -> return libexecdir)\n"
--      tell "getSysconfDir = catchIO (getEnv \""
--      tell (zManglePkgName z_root (zPackageName z_root))
--      tell "_sysconfdir\") (\\_ -> return sysconfdir)\n"
-+      if (zShouldEmitSysconfDir z_root)
-+      then do
-+        tell "sysconfdir :: FilePath\n"
-+        tell "sysconfdir = "
-+        tell (zSysconfdir z_root)
-+        tell "\n"
-+        tell "getSysconfDir :: IO FilePath\n"
-+        tell "getSysconfDir = catchIO (getEnv \""
-+        tell (zManglePkgName z_root (zPackageName z_root))
-+        tell "_sysconfdir\") (\\_ -> return sysconfdir)\n"
-+        return ()
-+      else do
-+        return ()
-       tell "\n"
-       return ()
-     else do
-       if (zIsWindows z_root)
-       then do
-+        tell "\n"
-         tell "\n"
-         tell "prefix :: FilePath\n"
-         tell "prefix = "
-         tell (zPrefix z_root)
-         tell "\n"
-         tell "\n"
-+        tell "getBinDir     :: IO FilePath\n"
-         tell "getBinDir     = getPrefixDirRel $ "
-         tell (zBindir z_root)
-         tell "\n"
-+        tell "getLibDir     :: IO FilePath\n"
-         tell "getLibDir     = "
-         tell (zLibdir z_root)
-         tell "\n"
-+        tell "getDynLibDir  :: IO FilePath\n"
-         tell "getDynLibDir  = "
-         tell (zDynlibdir z_root)
-         tell "\n"
-+        tell "getDataDir    :: IO FilePath\n"
-         tell "getDataDir    = catchIO (getEnv \""
-         tell (zManglePkgName z_root (zPackageName z_root))
-         tell "_datadir\")    (\\_ -> "
-         tell (zDatadir z_root)
-         tell ")\n"
-+        tell "getLibexecDir :: IO FilePath\n"
-         tell "getLibexecDir = "
-         tell (zLibexecdir z_root)
-         tell "\n"
-+        tell "getSysconfDir :: IO FilePath\n"
-         tell "getSysconfDir = "
-         tell (zSysconfdir z_root)
-         tell "\n"
-diffcabal-dev-scripts/src/GenPathsModule.hs b/cabal-dev-scripts/src/GenPathsModule.hs
-index 46ef779e2..e9f5e099f 100644
---- a/libraries/Cabal/cabal-dev-scripts/src/GenPathsModule.hs
-+++ b/libraries/Cabal/cabal-dev-scripts/src/GenPathsModule.hs
-@@ -41,6 +41,16 @@ $(capture "decls" [d|
-         , zLibexecdir :: FilePath
-         , zSysconfdir :: FilePath
- 
-+        , zShouldEmitLibDir     :: Bool
-+        , zShouldEmitDynLibDir  :: Bool
-+        , zShouldEmitLibexecDir :: Bool
-+        , zShouldEmitDataDir    :: Bool
-+        , zShouldEmitSysconfDir :: Bool
-+
-+        , zShouldEmitWarning :: Bool
-+        , zWarning           :: String
-+
-+        , zOr                         :: Bool -> Bool -> Bool
-         , zNot                        :: Bool -> Bool
-         , zManglePkgName              :: PackageName -> String
-         }
-difftemplates/Paths_pkg.template.hs b/templates/Paths_pkg.template.hs
-index 8e1e03d27..cc5c86701 100644
---- a/libraries/Cabal/templates/Paths_pkg.template.hs
-+++ b/libraries/Cabal/templates/Paths_pkg.template.hs
-@@ -14,10 +14,31 @@
- {% endif %}
- {-# OPTIONS_GHC -fno-warn-missing-import-lists #-}
- {-# OPTIONS_GHC -w #-}
--module Paths_{{ manglePkgName packageName }} (
-+module Paths_{{ manglePkgName packageName }}
-+  {% if shouldEmitWarning %}{-# WARNING {{ warning }} #-}{% endif %}
-+  (
-     version,
--    getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir,
--    getDataFileName, getSysconfDir
-+    getBinDir,
-+{# We only care about the absolute case for our emit logic, since only in this
-+   case references are incurred. We are not going to hit isWindows and relocatable
-+   has no absolute references to begin with.
-+#}
-+{% if or (not absolute) shouldEmitLibDir %}
-+    getLibDir,
-+{% endif %}
-+{% if or (not absolute) shouldEmitDynLibDir %}
-+    getDynLibDir,
-+{% endif %}
-+{% if or (not absolute) shouldEmitLibexecDir %}
-+    getLibexecDir,
-+{% endif %}
-+{% if or (not absolute) shouldEmitDataDir %}
-+    getDataFileName,
-+    getDataDir,
-+{% endif %}
-+{% if or (not absolute) shouldEmitSysconfDir %}
-+    getSysconfDir
-+{% endif %}
-   ) where
- 
- {% if not absolute %}
-@@ -56,12 +77,12 @@ catchIO = Exception.catch
- version :: Version
- version = Version {{ versionDigits }} []
- 
-+{% if or (not absolute) shouldEmitDataDir %}
- getDataFileName :: FilePath -> IO FilePath
- getDataFileName name = do
-   dir <- getDataDir
-   return (dir `joinFileName` name)
--
--getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir, getSysconfDir :: IO FilePath
-+{% endif %}
- 
- {% defblock function_defs %}
- minusFileName :: FilePath -> String -> FilePath
-@@ -90,48 +111,93 @@ splitFileName p = (reverse (path2++drive), reverse fname)
- 
- {% if relocatable %}
- 
-+{# Relocatable can not incur any absolute references, so we can ignore it.
-+   Additionally, --enable-relocatable is virtually useless in Nix builds
-+#}
-+
- getPrefixDirReloc :: FilePath -> IO FilePath
- getPrefixDirReloc dirRel = do
-   exePath <- getExecutablePath
-   let (dir,_) = splitFileName exePath
-   return ((dir `minusFileName` {{ bindir }}) `joinFileName` dirRel)
- 
-+getBinDir     :: IO FilePath
- getBinDir     = catchIO (getEnv "{{ manglePkgName packageName }}_bindir")     (\_ -> getPrefixDirReloc $ {{ bindir }})
-+getLibDir     :: IO FilePath
- getLibDir     = catchIO (getEnv "{{ manglePkgName packageName }}_libdir")     (\_ -> getPrefixDirReloc $ {{ libdir }})
-+getDynLibDir  :: IO FilePath
- getDynLibDir  = catchIO (getEnv "{{ manglePkgName packageName }}_dynlibdir")  (\_ -> getPrefixDirReloc $ {{ dynlibdir }})
-+getDataDir    :: IO FilePath
- getDataDir    = catchIO (getEnv "{{ manglePkgName packageName }}_datadir")    (\_ -> getPrefixDirReloc $ {{ datadir }})
-+getLibexecDir :: IO FilePath
- getLibexecDir = catchIO (getEnv "{{ manglePkgName packageName }}_libexecdir") (\_ -> getPrefixDirReloc $ {{ libexecdir }})
-+getSysconfDir :: IO FilePath
- getSysconfDir = catchIO (getEnv "{{ manglePkgName packageName }}_sysconfdir") (\_ -> getPrefixDirReloc $ {{ sysconfdir }})
- 
- {% useblock function_defs %}
- 
- {% elif absolute %}
- 
--bindir, libdir, dynlibdir, datadir, libexecdir, sysconfdir :: FilePath
-+bindir     :: FilePath
- bindir     = {{ bindir }}
--libdir     = {{ libdir }}
--dynlibdir  = {{ dynlibdir }}
--datadir    = {{ datadir }}
--libexecdir = {{ libexecdir }}
--sysconfdir = {{ sysconfdir }}
--
-+getBinDir     :: IO FilePath
- getBinDir     = catchIO (getEnv "{{ manglePkgName packageName }}_bindir")     (\_ -> return bindir)
-+
-+{% if shouldEmitLibDir %}
-+libdir     :: FilePath
-+libdir     = {{ libdir }}
-+getLibDir     :: IO FilePath
- getLibDir     = catchIO (getEnv "{{ manglePkgName packageName }}_libdir")     (\_ -> return libdir)
-+{% endif %}
-+
-+{% if shouldEmitDynLibDir %}
-+dynlibdir  :: FilePath
-+dynlibdir  = {{ dynlibdir }}
-+getDynLibDir  :: IO FilePath
- getDynLibDir  = catchIO (getEnv "{{ manglePkgName packageName }}_dynlibdir")  (\_ -> return dynlibdir)
-+{% endif %}
-+
-+{% if shouldEmitDataDir %}
-+datadir    :: FilePath
-+datadir    = {{ datadir }}
-+getDataDir    :: IO FilePath
- getDataDir    = catchIO (getEnv "{{ manglePkgName packageName }}_datadir")    (\_ -> return datadir)
-+{% endif %}
-+
-+{% if shouldEmitLibexecDir %}
-+libexecdir :: FilePath
-+libexecdir = {{ libexecdir }}
-+getLibexecDir :: IO FilePath
- getLibexecDir = catchIO (getEnv "{{ manglePkgName packageName }}_libexecdir") (\_ -> return libexecdir)
-+{% endif %}
-+
-+{% if shouldEmitSysconfDir %}
-+sysconfdir :: FilePath
-+sysconfdir = {{ sysconfdir }}
-+getSysconfDir :: IO FilePath
- getSysconfDir = catchIO (getEnv "{{ manglePkgName packageName }}_sysconfdir") (\_ -> return sysconfdir)
-+{% endif %}
- 
- {% elif isWindows %}
- 
-+{# We are only trying to fix the problem for aarch64-darwin with this patch,
-+   so let's ignore Windows which we can reach via pkgsCross, for example.
-+#}
-+
- prefix :: FilePath
- prefix = {{ prefix }}
- 
-+getBinDir     :: IO FilePath
- getBinDir     = getPrefixDirRel $ {{ bindir }}
-+getLibDir     :: IO FilePath
- getLibDir     = {{ libdir }}
-+getDynLibDir  :: IO FilePath
- getDynLibDir  = {{ dynlibdir }}
-+getDataDir    :: IO FilePath
- getDataDir    = catchIO (getEnv "{{ manglePkgName packageName }}_datadir")    (\_ -> {{ datadir }})
-+getLibexecDir :: IO FilePath
- getLibexecDir = {{ libexecdir }}
-+getSysconfDir :: IO FilePath
- getSysconfDir = {{ sysconfdir }}
- 
- getPrefixDirRel :: FilePath -> IO FilePath