From e9cfb9b01a146357f75773ed16fc9f0c94c06d12 Mon Sep 17 00:00:00 2001 From: Francesco Gazzetta Date: Mon, 5 Mar 2018 16:50:48 +0000 Subject: [PATCH 1/3] Set symlink-bindir in the default config file It is set to the same directory used by the old cabal install command, ie `~/.cabal/bin` on linux, as it will be used to "install" (symlink) executables by new-install. --- cabal-install/Distribution/Client/Config.hs | 9 ++++++++- cabal-install/changelog | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) 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 From 1c0db3f49af2d832b36c4cd979d4f1465f02f6b0 Mon Sep 17 00:00:00 2001 From: Francesco Gazzetta Date: Mon, 5 Mar 2018 16:55:45 +0000 Subject: [PATCH 2/3] Correctly get the symlinkBinDir --- cabal-install/Distribution/Client/CmdInstall.hs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/cabal-install/Distribution/Client/CmdInstall.hs b/cabal-install/Distribution/Client/CmdInstall.hs index 60386b02a71..4238324559d 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 @@ -187,11 +186,15 @@ 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) + 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 mkPkgBinDir symlinkBindir) $ Map.toList $ targetsMap buildCtx runProjectPostBuildPhase verbosity baseCtx buildCtx buildOutcomes From 5e106be9e4a0250ae6c8f6ca3b10619eacd54662 Mon Sep 17 00:00:00 2001 From: Francesco Gazzetta Date: Mon, 5 Mar 2018 16:56:14 +0000 Subject: [PATCH 3/3] Notify the user that an executable got symlinked Before there wasn't much feedback. Most times the only thing that got printed was "Up to date". --- cabal-install/Distribution/Client/CmdInstall.hs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/cabal-install/Distribution/Client/CmdInstall.hs b/cabal-install/Distribution/Client/CmdInstall.hs index 4238324559d..38421b73d95 100644 --- a/cabal-install/Distribution/Client/CmdInstall.hs +++ b/cabal-install/Distribution/Client/CmdInstall.hs @@ -58,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 ) @@ -195,7 +196,7 @@ installAction (configFlags, configExFlags, installFlags, haddockFlags) $ projectConfigBuildOnly $ projectConfig $ baseCtx createDirectoryIfMissingVerbose verbosity False symlinkBindir - traverse_ (symlinkBuiltPackage mkPkgBinDir symlinkBindir) + traverse_ (symlinkBuiltPackage verbosity mkPkgBinDir symlinkBindir) $ Map.toList $ targetsMap buildCtx runProjectPostBuildPhase verbosity baseCtx buildCtx buildOutcomes where @@ -213,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