import qualified Distribution.ModuleName as ModuleName
import Distribution.PackageDescription
+import Distribution.PackageDescription.Check hiding (doesFileExist)
import Distribution.PackageDescription.Configuration
import Distribution.PackageDescription.Parse
import Distribution.Simple
import Distribution.Simple.Configure
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Program
-import Distribution.Simple.Utils (defaultPackageDesc)
+import Distribution.Simple.Utils (defaultPackageDesc, writeFileAtomic)
import Distribution.Simple.Build (writeAutogenFiles)
-import Distribution.Simple.Register (writeInstalledConfig)
+import Distribution.Simple.Register
import Distribution.Text
import Distribution.Verbosity
import qualified Distribution.InstalledPackageInfo as Installed
- ( InstalledPackageInfo_(..) )
import qualified Distribution.Simple.PackageIndex as PackageIndex
- ( topologicalOrder, lookupPackageName, insert )
-import Control.Monad
+import Data.List
import Data.Maybe
import System.IO
import System.Directory
case args of
"haddock" : distDir : dir : args' ->
runHaddock distDir dir args'
+ "check" : dir : [] ->
+ doCheck dir
"install" : ghcpkg : ghcpkgconfig : directory : distDir
: myDestDir : myPrefix : myLibdir : myDocdir : args' ->
doInstall ghcpkg ghcpkgconfig directory distDir
userHooks :: UserHooks
userHooks = autoconfUserHooks
+doCheck :: FilePath -> IO ()
+doCheck directory
+ = withCurrentDirectory directory
+ $ do let verbosity = normal
+ gpdFile <- defaultPackageDesc verbosity
+ gpd <- readPackageDescription verbosity gpdFile
+ case partition isFailure $ checkPackage gpd Nothing of
+ ([], []) -> return ()
+ ([], warnings) -> mapM_ print warnings
+ (errs, _) -> do mapM_ print errs
+ exitWith (ExitFailure 1)
+ where isFailure (PackageDistSuspicious {}) = False
+ isFailure _ = True
+
runHaddock :: FilePath -> FilePath -> [String] -> IO ()
runHaddock distdir directory args
= withCurrentDirectory directory
defaultMainWithHooksArgs hooks ("register" : "--builddir" : distDir : args)
where
hooks = userHooks {
- copyHook = modHook (copyHook userHooks),
+ copyHook = noGhcPrimHook (modHook (copyHook userHooks)),
regHook = modHook (regHook userHooks)
}
- modHook f pd lbi us flags
- = let
- pd'
+ noGhcPrimHook f pd lbi us flags
+ = let pd'
| packageName pd == PackageName "ghc-prim" =
case library pd of
Just lib ->
Nothing ->
error "Expected a library, but none found"
| otherwise = pd
- idts = installDirTemplates lbi
+ in f pd' lbi us flags
+ modHook f pd lbi us flags
+ = let idts = installDirTemplates lbi
idts' = idts { prefix = toPathTemplate myPrefix,
libdir = toPathTemplate myLibdir,
libsubdir = toPathTemplate "$pkgid",
- docdir = toPathTemplate (myDocdir </> "$pkgid"),
+ docdir = toPathTemplate (myDocdir </> "$pkg"),
htmldir = toPathTemplate "$docdir" }
progs = withPrograms lbi
prog = ConfiguredProgram {
installDirTemplates = idts',
withPrograms = progs'
}
- in f pd' lbi' us flags
+ in f pd lbi' us flags
generate :: [String] -> FilePath -> FilePath -> IO ()
generate config_args distdir directory
= withCurrentDirectory directory
- $ do let verbosity = verbose
+ $ do let verbosity = normal
gpdFile <- defaultPackageDesc verbosity
gpd <- readPackageDescription verbosity gpdFile
withArgs (["configure", "--distdir", distdir] ++ config_args)
(case buildType (flattenPackageDescription gpd) of
Just Configure -> defaultMainWithHooks autoconfUserHooks
- _other -> defaultMain)
- -- not quite right, but good enough for us
+ -- time has a "Custom" Setup.hs, but it's actually Configure
+ -- plus a "./Setup test" hook. However, Cabal is also
+ -- "Custom", but doesn't have a configure script.
+ Just Custom ->
+ do configureExists <- doesFileExist "configure"
+ if configureExists
+ then defaultMainWithHooks autoconfUserHooks
+ else defaultMain
+ -- not quite right, but good enough for us:
+ _ -> defaultMain)
lbi <- getPersistBuildConfig distdir
let pd0 = localPkgDescr lbi
hooked_bi <-
- if (buildType pd0 == Just Configure)
+ if (buildType pd0 == Just Configure) || (buildType pd0 == Just Custom)
then do
maybe_infoFile <- defaultHookedPackageDesc
case maybe_infoFile of
writeAutogenFiles verbosity pd lbi
-- generate inplace-pkg-config
- when (isJust $ library pd) $
- writeInstalledConfig distdir pd lbi True Nothing
+ case (library pd, libraryConfig lbi) of
+ (Nothing, Nothing) -> return ()
+ (Just lib, Just clbi) -> do
+ cwd <- getCurrentDirectory
+ let installedPkgInfo = inplaceInstalledPackageInfo cwd distdir
+ pd lib lbi clbi
+ content = Installed.showInstalledPackageInfo installedPkgInfo ++ "\n"
+ writeFileAtomic (distdir </> "inplace-pkg-config") content
+ _ -> error "Inconsistent lib components; can't happen?"
let
- libBiModules lib = (libBuildInfo lib, libModules pd)
- exeBiModules exe = (buildInfo exe, ModuleName.main : exeModules pd)
+ libBiModules lib = (libBuildInfo lib, libModules lib)
+ exeBiModules exe = (buildInfo exe, ModuleName.main : exeModules exe)
biModuless = (maybeToList $ fmap libBiModules $ library pd)
++ (map exeBiModules $ executables pd)
buildableBiModuless = filter isBuildable biModuless
let xs = [variablePrefix ++ "_VERSION = " ++ display (pkgVersion (package pd)),
variablePrefix ++ "_MODULES = " ++ unwords (map display modules),
variablePrefix ++ "_HS_SRC_DIRS = " ++ unwords (hsSourceDirs bi),
- variablePrefix ++ "_DEPS = " ++ unwords (map display (packageDeps lbi)),
- variablePrefix ++ "_DEP_NAMES = " ++ unwords (map (display . packageName) (packageDeps lbi)),
+ variablePrefix ++ "_DEPS = " ++ unwords (map display (externalPackageDeps lbi)),
+ variablePrefix ++ "_DEP_NAMES = " ++ unwords (map (display . packageName) (externalPackageDeps lbi)),
variablePrefix ++ "_INCLUDE_DIRS = " ++ unwords (includeDirs bi),
variablePrefix ++ "_INCLUDES = " ++ unwords (includes bi),
variablePrefix ++ "_INSTALL_INCLUDES = " ++ unwords (installIncludes bi),
variablePrefix ++ "_EXTRA_LIBRARIES = " ++ unwords (extraLibs bi),
variablePrefix ++ "_EXTRA_LIBDIRS = " ++ unwords (extraLibDirs bi),
variablePrefix ++ "_C_SRCS = " ++ unwords (cSources bi),
+ variablePrefix ++ "_CMM_SRCS = $(addprefix cbits/,$(notdir $(wildcard " ++ directory ++ "/cbits/*.cmm)))",
-- XXX This includes things it shouldn't, like:
-- -odir dist-bootstrapping/build
variablePrefix ++ "_HC_OPTS = " ++ escape (unwords
writeFile (distdir ++ "/package-data.mk") $ unlines xs
where
escape = foldr (\c xs -> if c == '#' then '\\':'#':xs else c:xs) []
+