diff --git a/cabal-install/Distribution/Client/CmdInstall.hs b/cabal-install/Distribution/Client/CmdInstall.hs index 60386b02a71..38421b73d95 100644 --- a/cabal-install/Distribution/Client/CmdInstall.hs +++ b/cabal-install/Distribution/Client/CmdInstall.hs @@ -22,7 +22,6 @@ import Distribution.Client.CmdErrorMessages import Distribution.Client.Setup ( GlobalFlags, ConfigFlags(..), ConfigExFlags, InstallFlags ) -import qualified Distribution.Client.Setup as Client import Distribution.Client.Types ( PackageSpecifier(NamedPackage), UnresolvedSourcePackage ) import Distribution.Client.ProjectPlanning.Types @@ -59,7 +58,8 @@ import Distribution.Types.UnqualComponentName import Distribution.Verbosity ( Verbosity, normal ) import Distribution.Simple.Utils - ( wrapText, die', withTempDirectory, createDirectoryIfMissingVerbose ) + ( wrapText, die', notice + , withTempDirectory, createDirectoryIfMissingVerbose ) import qualified Data.Map as Map import System.Directory ( getTemporaryDirectory, makeAbsolute ) @@ -187,12 +187,16 @@ installAction (configFlags, configExFlags, installFlags, haddockFlags) (compilerId compiler) -- If there are exes, symlink them - let defaultSymlinkBindir = error $ - "TODO: how do I get the default ~/.cabal (or ~/.local) directory?" - ++ " (use --symlink-bindir explicitly for now)" "bin" - symlinkBindir <- makeAbsolute $ fromFlagOrDefault defaultSymlinkBindir - (Client.installSymlinkBinDir installFlags) - traverse_ (symlinkBuiltPackage mkPkgBinDir symlinkBindir) + let symlinkBindirUnknown = + "symlink-bindir is not defined. Set it in your cabal config file " + ++ "or use --symlink-bindir=" + symlinkBindir <- fromFlagOrDefault (die' verbosity symlinkBindirUnknown) + $ fmap makeAbsolute + $ projectConfigSymlinkBinDir + $ projectConfigBuildOnly + $ projectConfig $ baseCtx + createDirectoryIfMissingVerbose verbosity False symlinkBindir + traverse_ (symlinkBuiltPackage verbosity mkPkgBinDir symlinkBindir) $ Map.toList $ targetsMap buildCtx runProjectPostBuildPhase verbosity baseCtx buildCtx buildOutcomes where @@ -210,22 +214,24 @@ disableTestsBenchsByDefault configFlags = , configBenchmarks = Flag False <> configBenchmarks configFlags } -- | Symlink every exe from a package from the store to a given location -symlinkBuiltPackage :: (UnitId -> FilePath) -- ^ A function to get an UnitId's +symlinkBuiltPackage :: Verbosity + -> (UnitId -> FilePath) -- ^ A function to get an UnitId's -- store directory -> FilePath -- ^ Where to put the symlink -> ( UnitId , [(ComponentTarget, [TargetSelector])] ) -> IO () -symlinkBuiltPackage mkSourceBinDir destDir (pkg, components) = - traverse_ (symlinkBuiltExe (mkSourceBinDir pkg) destDir) exes +symlinkBuiltPackage verbosity mkSourceBinDir destDir (pkg, components) = + traverse_ (symlinkBuiltExe verbosity (mkSourceBinDir pkg) destDir) exes where exes = catMaybes $ (exeMaybe . fst) <$> components exeMaybe (ComponentTarget (CExeName exe) _) = Just exe exeMaybe _ = Nothing -- | Symlink a specific exe. -symlinkBuiltExe :: FilePath -> FilePath -> UnqualComponentName -> IO Bool -symlinkBuiltExe sourceDir destDir exe = +symlinkBuiltExe :: Verbosity -> FilePath -> FilePath -> UnqualComponentName -> IO Bool +symlinkBuiltExe verbosity sourceDir destDir exe = do + notice verbosity $ "Symlinking " ++ unUnqualComponentName exe symlinkBinary destDir sourceDir diff --git a/cabal-install/Distribution/Client/Config.hs b/cabal-install/Distribution/Client/Config.hs index 56e860a1b0d..97b9c6dcaa3 100644 --- a/cabal-install/Distribution/Client/Config.hs +++ b/cabal-install/Distribution/Client/Config.hs @@ -463,6 +463,7 @@ initialSavedConfig = do logsDir <- defaultLogsDir worldFile <- defaultWorldFile extraPath <- defaultExtraPath + symlinkPath <- defaultSymlinkPath return mempty { savedGlobalFlags = mempty { globalCacheDir = toFlag cacheDir, @@ -475,7 +476,8 @@ initialSavedConfig = do savedInstallFlags = mempty { installSummaryFile = toNubList [toPathTemplate (logsDir "build.log")], installBuildReports= toFlag AnonymousReports, - installNumJobs = toFlag Nothing + installNumJobs = toFlag Nothing, + installSymlinkBinDir = toFlag symlinkPath } } @@ -510,6 +512,11 @@ defaultExtraPath = do dir <- defaultCabalDir return [dir "bin"] +defaultSymlinkPath :: IO FilePath +defaultSymlinkPath = do + dir <- defaultCabalDir + return (dir "bin") + defaultCompiler :: CompilerFlavor defaultCompiler = fromMaybe GHC defaultCompilerFlavor diff --git a/cabal-install/changelog b/cabal-install/changelog index 6d92ecaa9c8..289d47d2b66 100644 --- a/cabal-install/changelog +++ b/cabal-install/changelog @@ -15,6 +15,8 @@ * Completed the 'new-exec' command (#3638). Same as above. * Added a preliminary 'new-install' command (#4558, nonlocal exes part) which allows to quickly install executables from Hackage. + * Set symlink-bindir (used by new-install) to .cabal/bin by default on + .cabal/config initialization. * 'cabal update' now supports '--index-state' which can be used to roll back the index to an earlier state. * '--allow-{newer,older}' syntax has been enhanced. Dependency