Skip to content

Commit

Permalink
Implement "tool-depends" in Cabal, and legacy "build-tools" via desugar
Browse files Browse the repository at this point in the history
  • Loading branch information
Ericson2314 committed Nov 16, 2016
1 parent eda3485 commit 3269f83
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 29 deletions.
7 changes: 4 additions & 3 deletions Cabal/Distribution/Backpack/ComponentsGraph.hs
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@ import Distribution.PackageDescription as PD hiding (Flag)
import Distribution.Simple.LocalBuildInfo
import Distribution.Types.ComponentRequestedSpec
import Distribution.Types.Dependency
import Distribution.Types.ExeDependency
import Distribution.Types.LegacyExeDependency
import Distribution.Types.UnqualComponentName
import Distribution.Simple.Utils
import Distribution.Compat.Graph (Node(..))
import Distribution.FooBar
import qualified Distribution.Compat.Graph as Graph

import Distribution.Text
Expand Down Expand Up @@ -55,9 +57,8 @@ toComponentsGraph enabled pkg_descr =
-- The dependencies for the given component
componentDeps component =
[ CExeName toolname
| LegacyExeDependency name _ <- buildTools bi
, let toolname = mkUnqualComponentName name
, toolname `elem` map exeName (executables pkg_descr) ]
| (ExeDependency _ toolname _)
<- getAllInternalToolDependencies pkg_descr bi ]

++ [ if pkgname == packageName pkg_descr
then CLibName
Expand Down
7 changes: 5 additions & 2 deletions Cabal/Distribution/Backpack/ConfiguredComponent.hs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import Distribution.Compat.Prelude hiding ((<>))
import Distribution.Backpack.Id

import Distribution.Types.Dependency
import Distribution.Types.ExeDependency
import Distribution.Types.LegacyExeDependency
import Distribution.Types.IncludeRenaming
import Distribution.Types.Mixin
Expand All @@ -28,6 +29,7 @@ import Distribution.PackageDescription as PD hiding (Flag)
import Distribution.Simple.Setup as Setup
import Distribution.Simple.LocalBuildInfo
import Distribution.Version
import Distribution.FooBar

import qualified Data.Set as Set
import qualified Data.Map as Map
Expand Down Expand Up @@ -143,8 +145,9 @@ toConfiguredComponent pkg_descr this_cid
| otherwise
= Map.toList external_lib_map
exe_deps = [ cid
| LegacyExeDependency name _ <- buildTools bi
, Just cid <- [ Map.lookup (mkUnqualComponentName name) exe_map ] ]
| (ExeDependency _ toolName _)
<- getAllInternalToolDependencies pkg_descr bi
, Just cid <- [ Map.lookup toolName exe_map ] ]

-- | Also computes the 'ComponentId', and sets cc_public if necessary.
-- This is Cabal-only; cabal-install won't use this.
Expand Down
2 changes: 1 addition & 1 deletion Cabal/Distribution/Backpack/LinkedComponent.hs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ data LinkedComponent
lc_insts :: [(ModuleName, OpenModule)],
lc_component :: Component,
lc_shape :: ModuleShape,
-- | Local buildTools dependencies
-- | Local "build-tools" and "tool-depends" dependencies
lc_internal_build_tools :: [OpenUnitId],
lc_public :: Bool,
lc_includes :: [(OpenUnitId, ModuleRenaming)],
Expand Down
11 changes: 11 additions & 0 deletions Cabal/Distribution/FooBar.hs
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,14 @@ getAllToolDependencies pkg bi =
-- conditions.
isInternal :: PackageDescription -> ExeDependency -> Bool
isInternal pkg (ExeDependency n _ _) = n == packageName pkg


-- | Get internal "tool-depends", along with internal "build-tools"
--
-- This is a tiny function, but used in a number of places. The same
-- restrictions that apply to `isInternal` also apply to this function.
getAllInternalToolDependencies :: PackageDescription
-> BuildInfo
-> [ExeDependency]
getAllInternalToolDependencies pkg bi =
filter (isInternal pkg) $ getAllToolDependencies pkg bi
3 changes: 1 addition & 2 deletions Cabal/Distribution/PackageDescription/Check.hs
Original file line number Diff line number Diff line change
Expand Up @@ -602,8 +602,7 @@ checkFields pkg =
internalExeDeps =
[ dep
| bi <- allBuildInfo pkg
, dep <- getAllToolDependencies pkg bi
, isInternal pkg dep
, dep <- getAllInternalToolDependencies pkg bi
]

depInternalLibraryWithExtraVersion =
Expand Down
16 changes: 6 additions & 10 deletions Cabal/Distribution/Simple/Build.hs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import Prelude ()
import Distribution.Compat.Prelude

import Distribution.Types.Dependency
import Distribution.Types.LegacyExeDependency
import Distribution.Types.ExeDependency
import Distribution.Types.LocalBuildInfo
import Distribution.Types.TargetInfo
import Distribution.Types.ComponentRequestedSpec
Expand Down Expand Up @@ -72,12 +72,12 @@ import Distribution.Simple.Utils
import Distribution.System
import Distribution.Text
import Distribution.Verbosity
import Distribution.FooBar

import Distribution.Compat.Graph (IsNode(..))

import Control.Monad
import qualified Data.Set as Set
import Data.List ( intersect )
import System.FilePath ( (</>), (<.>), takeDirectory )
import System.Directory ( getCurrentDirectory )

Expand Down Expand Up @@ -534,14 +534,10 @@ addInternalBuildTools pkg lbi bi progs =
foldr updateProgram progs internalBuildTools
where
internalBuildTools =
[ simpleConfiguredProgram toolName (FoundOnSystem toolLocation)
| toolName <- toolNames
, let toolLocation = buildDir lbi </> toolName </> toolName <.> exeExtension ]
toolNames = intersect buildToolNames internalExeNames
internalExeNames = map (unUnqualComponentName . exeName) (executables pkg)
buildToolNames = map buildToolName (buildTools bi)
where
buildToolName (LegacyExeDependency pname _) = pname
[ simpleConfiguredProgram toolName' (FoundOnSystem toolLocation)
| ExeDependency _ toolName _ <- getAllInternalToolDependencies pkg bi
, let toolName' = unUnqualComponentName toolName
, let toolLocation = buildDir lbi </> toolName' </> toolName' <.> exeExtension ]


-- TODO: build separate libs in separate dirs so that we can build
Expand Down
18 changes: 7 additions & 11 deletions Cabal/Distribution/Simple/Configure.hs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ import Distribution.Simple.Setup as Setup
import Distribution.Simple.BuildTarget
import Distribution.Simple.LocalBuildInfo
import Distribution.Types.Dependency
import Distribution.Types.ExeDependency
import Distribution.Types.LegacyExeDependency
import Distribution.Types.PkgconfigDependency
import Distribution.Types.LocalBuildInfo
Expand All @@ -99,6 +100,7 @@ import Distribution.Backpack.Configure
import Distribution.Backpack.PreExistingComponent
import Distribution.Backpack.ConfiguredComponent (newPackageDepsBehaviour)
import Distribution.Backpack.Id
import Distribution.FooBar
import Distribution.Utils.LogProgress

import qualified Distribution.Simple.GHC as GHC
Expand Down Expand Up @@ -566,17 +568,11 @@ configure (pkg_descr0', pbi) cfg = do
--
-- TODO: Factor this into a helper package.
let requiredBuildTools =
[ buildTool
| let exeNames = map (unUnqualComponentName . exeName) (executables pkg_descr)
, bi <- enabledBuildInfos pkg_descr enabled
, buildTool@(LegacyExeDependency toolPName reqVer)
<- buildTools bi
, let isInternal =
toolPName `elem` exeNames
-- we assume all internal build-tools are
-- versioned with the package:
&& packageVersion pkg_descr `withinRange` reqVer
, not isInternal ]
[ LegacyExeDependency (unUnqualComponentName eName) versionRange
| bi <- enabledBuildInfos pkg_descr enabled
, buildTool@(ExeDependency _ eName versionRange)
<- getAllToolDependencies pkg_descr bi
, not $ isInternal pkg_descr buildTool ]

programDb' <-
configureAllKnownPrograms (lessVerbose verbosity) programDb
Expand Down

0 comments on commit 3269f83

Please sign in to comment.