Skip to content

Commit

Permalink
Add parsing of InstallDirs
Browse files Browse the repository at this point in the history
  • Loading branch information
jgotoh committed May 31, 2024
1 parent 0adc71d commit d7cdff0
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 4 deletions.
83 changes: 83 additions & 0 deletions Cabal/src/Distribution/Simple/InstallDirs.hs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}

-----------------------------------------------------------------------------
Expand Down Expand Up @@ -45,17 +46,21 @@ module Distribution.Simple.InstallDirs
, compilerTemplateEnv
, packageTemplateEnv
, abiTemplateEnv
, installDirsGrammar
, installDirsTemplateEnv
) where

import Distribution.Compat.Prelude
import Prelude ()

import Distribution.Compat.Environment (lookupEnv)
import Distribution.Compat.Lens (Lens')
import Distribution.Compiler
import Distribution.FieldGrammar
import Distribution.Package
import Distribution.Parsec
import Distribution.Pretty
import Distribution.Simple.Flag
import Distribution.Simple.InstallDirs.Internal
import Distribution.System

Expand Down Expand Up @@ -560,3 +565,81 @@ foreign import CALLCONV unsafe "shlobj.h SHGetFolderPathW"
-> Prelude.IO CInt
#endif
{- FOURMOLU_ENABLE -}

-- ---------------------------------------------------------------------------
-- FieldGrammar

installDirsGrammar :: ParsecFieldGrammar' (InstallDirs (Flag PathTemplate))
installDirsGrammar =
InstallDirs
<$> optionalFieldDef "prefix" installDirsPrefixLens mempty
<*> optionalFieldDef "bindir" installDirsBindirLens mempty
<*> optionalFieldDef "libdir" installDirsLibdirLens mempty
<*> optionalFieldDef "libsubdir" installDirsLibsubdirLens mempty
<*> optionalFieldDef "dynlibdir" installDirsDynlibdirLens mempty
<*> (pure NoFlag) -- flibdir
<*> optionalFieldDef "libexecdir" installDirsLibexecdirLens mempty
<*> optionalFieldDef "libexecsubdir" installDirsLibexecsubdirLens mempty
<*> (pure NoFlag) -- includedir
<*> optionalFieldDef "datadir" installDirsDatadirLens mempty
<*> optionalFieldDef "datasubdir" installDirsDatasubdirLens mempty
<*> optionalFieldDef "docdir" installDirsDocdirLens mempty
<*> (pure NoFlag) -- mandir
<*> optionalFieldDef "htmldir" installDirsHtmldirLens mempty
<*> optionalFieldDef "haddockdir" installDirsHaddockdirLens mempty
<*> optionalFieldDef "sysconfdir" installDirsSysconfdirLens mempty

-- ---------------------------------------------------------------------------
-- Lenses

installDirsPrefixLens :: Lens' (InstallDirs a) a
installDirsPrefixLens f c = fmap (\x -> c{prefix = x}) (f (prefix c))
{-# INLINEABLE installDirsPrefixLens #-}

installDirsBindirLens :: Lens' (InstallDirs a) a
installDirsBindirLens f c = fmap (\x -> c{bindir = x}) (f (bindir c))
{-# INLINEABLE installDirsBindirLens #-}

installDirsLibdirLens :: Lens' (InstallDirs a) a
installDirsLibdirLens f c = fmap (\x -> c{libdir = x}) (f (libdir c))
{-# INLINEABLE installDirsLibdirLens #-}

installDirsLibsubdirLens :: Lens' (InstallDirs a) a
installDirsLibsubdirLens f c = fmap (\x -> c{libsubdir = x}) (f (libsubdir c))
{-# INLINEABLE installDirsLibsubdirLens #-}

installDirsDynlibdirLens :: Lens' (InstallDirs a) a
installDirsDynlibdirLens f c = fmap (\x -> c{dynlibdir = x}) (f (dynlibdir c))
{-# INLINEABLE installDirsDynlibdirLens #-}

installDirsLibexecdirLens :: Lens' (InstallDirs a) a
installDirsLibexecdirLens f c = fmap (\x -> c{libexecdir = x}) (f (libexecdir c))
{-# INLINEABLE installDirsLibexecdirLens #-}

installDirsLibexecsubdirLens :: Lens' (InstallDirs a) a
installDirsLibexecsubdirLens f c = fmap (\x -> c{libexecsubdir = x}) (f (libexecsubdir c))
{-# INLINEABLE installDirsLibexecsubdirLens #-}

installDirsDatadirLens :: Lens' (InstallDirs a) a
installDirsDatadirLens f c = fmap (\x -> c{datadir = x}) (f (datadir c))
{-# INLINEABLE installDirsDatadirLens #-}

installDirsDatasubdirLens :: Lens' (InstallDirs a) a
installDirsDatasubdirLens f c = fmap (\x -> c{datasubdir = x}) (f (datasubdir c))
{-# INLINEABLE installDirsDatasubdirLens #-}

installDirsDocdirLens :: Lens' (InstallDirs a) a
installDirsDocdirLens f c = fmap (\x -> c{docdir = x}) (f (docdir c))
{-# INLINEABLE installDirsDocdirLens #-}

installDirsHtmldirLens :: Lens' (InstallDirs a) a
installDirsHtmldirLens f c = fmap (\x -> c{htmldir = x}) (f (htmldir c))
{-# INLINEABLE installDirsHtmldirLens #-}

installDirsHaddockdirLens :: Lens' (InstallDirs a) a
installDirsHaddockdirLens f c = fmap (\x -> c{haddockdir = x}) (f (haddockdir c))
{-# INLINEABLE installDirsHaddockdirLens #-}

installDirsSysconfdirLens :: Lens' (InstallDirs a) a
installDirsSysconfdirLens f c = fmap (\x -> c{sysconfdir = x}) (f (sysconfdir c))
{-# INLINEABLE installDirsSysconfdirLens #-}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import Distribution.Client.Utils.Parsec
import Distribution.Compat.Prelude
import Distribution.FieldGrammar
import Distribution.Simple.Flag
import Distribution.Simple.InstallDirs
import Distribution.Solver.Types.ConstraintSource (ConstraintSource (..))
import Distribution.Solver.Types.ProjectConfigPath
import Distribution.Types.PackageVersionConstraint (PackageVersionConstraint (..))
Expand Down Expand Up @@ -77,7 +78,7 @@ projectConfigSharedFieldGrammar source =
<*> optionalFieldDefAla "with-compiler" (alaFlag FilePathNT) L.projectConfigHcPath mempty
<*> optionalFieldDefAla "with-hc-pkg" (alaFlag FilePathNT) L.projectConfigHcPkg mempty
<*> optionalFieldDef "doc-index-file" L.projectConfigHaddockIndex mempty
<*> pure mempty -- cli flag: projectConfigInstallDirs
<*> blurFieldGrammar L.projectConfigInstallDirs installDirsGrammar
<*> monoidalFieldAla "package-dbs" (alaList' CommaFSep PackageDBNT) L.projectConfigPackageDBs
<*> pure mempty -- cli flag: projectConfigRemoteRepos
<*> pure mempty -- cli flag: projectConfigLocalNoIndexRepos
Expand Down
7 changes: 6 additions & 1 deletion cabal-install/src/Distribution/Client/ProjectConfig/Lens.hs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ import Distribution.Simple.Compiler
, ProfDetailLevel
)
import Distribution.Simple.InstallDirs
( PathTemplate
( InstallDirs
, PathTemplate
)
import Distribution.Simple.Setup
( DumpBuildInfo (..)
Expand Down Expand Up @@ -206,6 +207,10 @@ projectConfigHaddockIndex :: Lens' ProjectConfigShared (Flag PathTemplate)
projectConfigHaddockIndex f s = fmap (\x -> s{T.projectConfigHaddockIndex = x}) (f (T.projectConfigHaddockIndex s))
{-# INLINEABLE projectConfigHaddockIndex #-}

projectConfigInstallDirs :: Lens' ProjectConfigShared (InstallDirs (Flag PathTemplate))
projectConfigInstallDirs f s = fmap (\x -> s{T.projectConfigInstallDirs = x}) (f (T.projectConfigInstallDirs s))
{-# INLINEABLE projectConfigInstallDirs #-}

projectConfigPackageDBs :: Lens' ProjectConfigShared [Maybe PackageDB]
projectConfigPackageDBs f s = fmap (\x -> s{T.projectConfigPackageDBs = x}) (f (T.projectConfigPackageDBs s))
{-# INLINEABLE projectConfigPackageDBs #-}
Expand Down
22 changes: 20 additions & 2 deletions cabal-testsuite/PackageTests/ProjectConfig/Parsec/cabal.test.hs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import Distribution.Compiler (CompilerFlavor (..))
import Distribution.Parsec (simpleParsec)
import Distribution.Simple.Compiler (DebugInfoLevel (..), OptimisationLevel (..), PackageDB (..), ProfDetailLevel (..))
import Distribution.Simple.Flag
import Distribution.Simple.InstallDirs (toPathTemplate)
import Distribution.Simple.InstallDirs (InstallDirs (..), toPathTemplate)
import Distribution.Simple.Setup (DumpBuildInfo (..), Flag, HaddockTarget (..), TestShowDetails (..))
import Distribution.Solver.Types.ConstraintSource (ConstraintSource (..))
import Distribution.Solver.Types.ProjectConfigPath (ProjectConfigPath (..))
Expand Down Expand Up @@ -173,7 +173,25 @@ testProjectConfigShared = do
projectConfigHcPath = toFlag "/some/path/to/compiler"
projectConfigHcPkg = toFlag "/some/path/to/ghc-pkg"
projectConfigHaddockIndex = toFlag $ toPathTemplate "/path/to/haddock-index"
projectConfigInstallDirs = mempty -- cli only
projectConfigInstallDirs =
InstallDirs
{ prefix = Flag $ toPathTemplate "my/prefix-path"
, bindir = Flag $ toPathTemplate "bin/dir/"
, libdir = Flag $ toPathTemplate "lib/dir/path"
, libsubdir = Flag $ toPathTemplate "/lib/sub/dir"
, dynlibdir = Flag $ toPathTemplate "dyn/lib/dir/path"
, flibdir = mempty
, libexecdir = Flag $ toPathTemplate "lib/exec/dir/"
, libexecsubdir = Flag $ toPathTemplate "libexec/subdir"
, includedir = mempty
, datadir = Flag $ toPathTemplate "path/to/datadir/"
, datasubdir = Flag $ toPathTemplate "a/datadir/subdir"
, docdir = Flag $ toPathTemplate "path/to/docs"
, mandir = mempty
, htmldir = Flag $ toPathTemplate "dir/html/"
, haddockdir = Flag $ toPathTemplate "haddock/dir"
, sysconfdir = Flag $ toPathTemplate "sys/conf/dir"
}
projectConfigPackageDBs = [Nothing, Just (SpecificPackageDB "foo"), Nothing, Just (SpecificPackageDB "bar"), Just (SpecificPackageDB "baz")]
projectConfigRemoteRepos = mempty -- cli only
projectConfigLocalNoIndexRepos = mempty -- cli only
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,18 @@ prefer-oldest: True
extra-prog-path: /foo/bar, /baz/quux
extra-prog-path-shared-only: /foo/bar, /baz/quux
multi-repl: True

-- InstallDirs
prefix: my/prefix-path
bindir: bin/dir/
libdir: lib/dir/path
libsubdir: /lib/sub/dir
dynlibdir: dyn/lib/dir/path
libexecdir: lib/exec/dir/
libexecsubdir: libexec/subdir
datadir: path/to/datadir/
datasubdir: a/datadir/subdir
docdir: path/to/docs
htmldir: dir/html/
haddockdir: haddock/dir
sysconfdir: sys/conf/dir

0 comments on commit d7cdff0

Please sign in to comment.