Skip to content

Add with-compiler field for cabal scripts #6310

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cabal/Cabal.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,7 @@ library
Distribution.Types.UnqualComponentName
Distribution.Types.IncludeRenaming
Distribution.Types.Mixin
Distribution.Types.Script
Distribution.Types.SetupBuildInfo
Distribution.Types.TestSuite
Distribution.Types.TestSuiteInterface
Expand Down Expand Up @@ -521,6 +522,7 @@ library
Distribution.Types.Library.Lens
Distribution.Types.PackageDescription.Lens
Distribution.Types.PackageId.Lens
Distribution.Types.Script.Lens
Distribution.Types.SetupBuildInfo.Lens
Distribution.Types.SourceRepo.Lens
Distribution.Types.TestSuite.Lens
Expand Down
17 changes: 17 additions & 0 deletions Cabal/Distribution/PackageDescription/FieldGrammar.hs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ module Distribution.PackageDescription.FieldGrammar (
setupBInfoFieldGrammar,
-- * Component build info
buildInfoFieldGrammar,
-- * Script
scriptFieldGrammar
) where

import Distribution.Compat.Lens
Expand All @@ -57,6 +59,7 @@ import Distribution.Types.ExecutableScope
import Distribution.Types.ForeignLib
import Distribution.Types.ForeignLibType
import Distribution.Types.LibraryVisibility
import Distribution.Types.Script
import Distribution.Types.UnqualComponentName
import Distribution.Version (anyVersion)

Expand Down Expand Up @@ -539,3 +542,17 @@ setupBInfoFieldGrammar def = flip SetupBuildInfo def
<$> monoidalFieldAla "setup-depends" (alaList CommaVCat) L.setupDepends
{-# SPECIALIZE setupBInfoFieldGrammar :: Bool -> ParsecFieldGrammar' SetupBuildInfo #-}
{-# SPECIALIZE setupBInfoFieldGrammar :: Bool ->PrettyFieldGrammar' SetupBuildInfo #-}

-------------------------------------------------------------------------------
-- Script
-------------------------------------------------------------------------------

scriptFieldGrammar
:: (FieldGrammar g, Applicative (g Script), Applicative (g Executable), Applicative (g BuildInfo))
=> g Script Script
scriptFieldGrammar = Script
<$> blurFieldGrammar L.executable (executableFieldGrammar "script")
<*> optionalFieldAla "with-compiler" FilePathNT L.hcPath
{-# SPECIALIZE scriptFieldGrammar :: ParsecFieldGrammar' Script #-}
{-# SPECIALIZE scriptFieldGrammar :: PrettyFieldGrammar' Script #-}

2 changes: 2 additions & 0 deletions Cabal/Distribution/Types/Lens.hs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ module Distribution.Types.Lens (
module Distribution.Types.Library.Lens,
module Distribution.Types.PackageDescription.Lens,
module Distribution.Types.PackageId.Lens,
module Distribution.Types.Script.Lens,
module Distribution.Types.SetupBuildInfo.Lens,
module Distribution.Types.SourceRepo.Lens,
module Distribution.Types.TestSuite.Lens,
Expand All @@ -20,6 +21,7 @@ import Distribution.Types.GenericPackageDescription.Lens
import Distribution.Types.Library.Lens
import Distribution.Types.PackageDescription.Lens
import Distribution.Types.PackageId.Lens
import Distribution.Types.Script.Lens
import Distribution.Types.SetupBuildInfo.Lens
import Distribution.Types.SourceRepo.Lens
import Distribution.Types.TestSuite.Lens
17 changes: 17 additions & 0 deletions Cabal/Distribution/Types/Script.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
module Distribution.Types.Script (
Script(..)
) where

import Prelude ()
import Distribution.Compat.Prelude

import Distribution.Types.Executable

data Script = Script {
executable :: Executable,
hcPath :: Maybe FilePath
}
deriving (Generic, Show, Read, Eq, Typeable)

21 changes: 21 additions & 0 deletions Cabal/Distribution/Types/Script/Lens.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module Distribution.Types.Script.Lens (
Script,
module Distribution.Types.Script.Lens,
) where

import Distribution.Compat.Lens
import Distribution.Compat.Prelude
import Prelude ()

import Distribution.Types.Executable (Executable)
import Distribution.Types.Script (Script)

import qualified Distribution.Types.Script as T

executable :: Lens' Script Executable
executable f s = fmap (\x -> s { T.executable = x }) (f (T.executable s))
{-# INLINE executable #-}

hcPath :: Lens' Script (Maybe FilePath)
hcPath f s = fmap (\x -> s { T.hcPath = x }) (f (T.hcPath s))
{-# INLINE hcPath #-}
6 changes: 6 additions & 0 deletions Cabal/doc/nix-local-build.rst
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,12 @@ interpreter, or through this command:
$ cabal v2-run script.hs
$ cabal v2-run script.hs -- --arg1 # args are passed like this

Supported fields include:

- ``build-depends``

- ``with-compiler``

cabal v2-freeze
----------------

Expand Down
26 changes: 18 additions & 8 deletions cabal-install/Distribution/Client/CmdRun.hs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import Distribution.Client.GlobalFlags
( defaultGlobalFlags )
import qualified Distribution.Client.Setup as Client
import Distribution.Simple.Setup
( HaddockFlags, TestFlags, BenchmarkFlags, fromFlagOrDefault )
( HaddockFlags, TestFlags, BenchmarkFlags, fromFlagOrDefault, maybeToFlag )
import Distribution.Simple.Command
( CommandUI(..), usageAlternatives )
import Distribution.Types.ComponentName
Expand Down Expand Up @@ -70,7 +70,7 @@ import Distribution.Client.Types
import Distribution.FieldGrammar
( takeFields, parseFieldGrammar )
import Distribution.PackageDescription.FieldGrammar
( executableFieldGrammar )
( scriptFieldGrammar )
import Distribution.PackageDescription.PrettyPrint
( writeGenericPackageDescription )
import Distribution.Parsec
Expand All @@ -90,6 +90,8 @@ import Distribution.Types.GenericPackageDescription as GPD
( GenericPackageDescription(..), emptyGenericPackageDescription )
import Distribution.Types.PackageDescription
( PackageDescription(..), emptyPackageDescription )
import Distribution.Types.Script
( Script(..) )
import Distribution.Types.Version
( mkVersion )
import Distribution.Types.PackageName.Magic
Expand Down Expand Up @@ -332,20 +334,20 @@ handleShebang :: FilePath -> [String] -> IO ()
handleShebang script args =
runAction (commandDefaultFlags runCommand) (script:args) defaultGlobalFlags

parseScriptBlock :: BS.ByteString -> ParseResult Executable
parseScriptBlock :: BS.ByteString -> ParseResult Script
parseScriptBlock str =
case readFields str of
Right fs -> do
let (fields, _) = takeFields fs
parseFieldGrammar cabalSpecLatest fields (executableFieldGrammar "script")
parseFieldGrammar cabalSpecLatest fields scriptFieldGrammar
Left perr -> parseFatalFailure pos (show perr) where
ppos = P.errorPos perr
pos = Position (P.sourceLine ppos) (P.sourceColumn ppos)

readScriptBlock :: Verbosity -> BS.ByteString -> IO Executable
readScriptBlock :: Verbosity -> BS.ByteString -> IO Script
readScriptBlock verbosity = parseString parseScriptBlock verbosity "script block"

readScriptBlockFromScript :: Verbosity -> PlainOrLiterate -> BS.ByteString -> IO (Executable, BS.ByteString)
readScriptBlockFromScript :: Verbosity -> PlainOrLiterate -> BS.ByteString -> IO (Script, BS.ByteString)
readScriptBlockFromScript verbosity pol str = do
str' <- case extractScriptBlock pol str of
Left e -> die' verbosity $ "Failed extracting script block: " ++ e
Expand Down Expand Up @@ -401,7 +403,8 @@ handleScriptCase
-> BS.ByteString
-> IO (ProjectBaseContext, [TargetSelector])
handleScriptCase verbosity pol baseCtx tempDir scriptContents = do
(executable, contents') <- readScriptBlockFromScript verbosity pol scriptContents
(script, contents') <- readScriptBlockFromScript verbosity pol scriptContents
let Script executable hcPath = script

-- We need to create a dummy package that lives in our dummy project.
let
Expand Down Expand Up @@ -440,8 +443,15 @@ handleScriptCase verbosity pol baseCtx tempDir scriptContents = do
BS.writeFile (tempDir </> mainName) contents'

let
projectConfigShared' :: ProjectConfigShared
projectConfigShared' = (projectConfigShared (projectConfig baseCtx))
{ projectConfigHcPath = (maybeToFlag hcPath) <>
projectConfigHcPath (projectConfigShared (projectConfig baseCtx))
}
baseCtx' = baseCtx
{ localPackages = localPackages baseCtx ++ [SpecificSourcePackage sourcePackage] }
{ localPackages = localPackages baseCtx ++ [SpecificSourcePackage sourcePackage]
, projectConfig = (projectConfig baseCtx) { projectConfigShared = projectConfigShared' }
}
targetSelectors = [TargetPackage TargetExplicitNamed [pkgId] Nothing]

return (baseCtx', targetSelectors)
Expand Down
1 change: 1 addition & 0 deletions cabal-install/changelog
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* `v2-build` (and other `v2-`prefixed commands) now accept the
`--benchmark-option(s)` flags, which pass options to benchmark executables
(analogous to how `--test-option(s)` works). (#6209)
* `v2-run` can now read a `with-compiler` flag in the script metadata field

3.0.0.0 Mikhail Glushenkov <mikhail.glushenkov@gmail.com> August 2019
* Parse comma-separated lists for extra-prog-path, extra-lib-dirs, extra-framework-dirs,
Expand Down