diff --git a/src/Stack/Package.hs b/src/Stack/Package.hs index ed9e099ada..17ccabd018 100644 --- a/src/Stack/Package.hs +++ b/src/Stack/Package.hs @@ -804,11 +804,17 @@ resolveComponentFiles component build names = do -- | Get all C sources and extra source files in a build. buildOtherSources :: BuildInfo -> RIO Ctx [DotCabalPath] buildOtherSources build = do + cwd <- liftIO getCurrentDir dir <- asks (parent . ctxFile) - -- TODO: add warnMissing here too + file <- asks ctxFile csources <- - forMaybeM (cSources build) $ \fp -> - findCandidate [dir] (DotCabalCFile fp) + forMaybeM (cSources build) $ \fp -> do + result <- resolveDirFile dir fp + case result of + Nothing -> do + warnMissingFile "File" cwd fp file + return Nothing + Just p -> return $ Just (DotCabalCFilePath p) jsources <- forMaybeM (targetJsSources build) $ \fp -> findCandidate [dir] (DotCabalFile fp) @@ -1231,14 +1237,16 @@ findCandidate dirs name = do -- Otherwise, return everything (xs, ys) -> xs ++ ys - resolveCandidate - :: (MonadIO m, MonadThrow m) - => Path Abs Dir -> FilePath.FilePath -> m [Path Abs File] - resolveCandidate x y = do - -- The standard canonicalizePath does not work for this case - p <- parseCollapsedAbsFile (toFilePath x FilePath. y) - exists <- doesFileExist p - return $ if exists then [p] else [] + resolveCandidate dir = fmap maybeToList . resolveDirFile dir + +resolveDirFile + :: (MonadIO m, MonadThrow m) + => Path Abs Dir -> FilePath.FilePath -> m (Maybe (Path Abs File)) +resolveDirFile x y = do + -- The standard canonicalizePath does not work for this case + p <- parseCollapsedAbsFile (toFilePath x FilePath. y) + exists <- doesFileExist p + return $ if exists then Just p else Nothing -- | Warn the user that multiple candidates are available for an -- entry, but that we picked one anyway and continued. @@ -1315,16 +1323,19 @@ resolveOrWarn subject resolver path = file <- asks ctxFile dir <- asks (parent . ctxFile) result <- resolver dir path - when (isNothing result) $ - prettyWarnL - [ fromString . T.unpack $ subject -- TODO: needs style? - , flow "listed in" - , maybe (pretty file) pretty (stripProperPrefix cwd file) - , flow "file does not exist:" - , style Dir . fromString $ path - ] + when (isNothing result) $ warnMissingFile subject cwd path file return result +warnMissingFile :: Text -> Path Abs Dir -> FilePath -> Path Abs File -> RIO Ctx () +warnMissingFile subject cwd path fromFile = + prettyWarnL + [ fromString . T.unpack $ subject -- TODO: needs style? + , flow "listed in" + , maybe (pretty fromFile) pretty (stripProperPrefix cwd fromFile) + , flow "file does not exist:" + , style Dir . fromString $ path + ] + -- | Resolve the file, if it can't be resolved, warn for the user -- (purely to be helpful). resolveFileOrWarn :: FilePath.FilePath