New patches: [Added c2hs dependency resolver Lennart Kolmodin **20060901171957] { hunk ./Distribution/PreProcess.hs 49 +import qualified Distribution.PreProcess.C2hs as C2hs (resolvDepAndOrder) hunk ./Distribution/PreProcess.hs 56 - moduleToFilePath, die, dieWithLocation) + moduleToFilePath, moduleToFilePath2, + die, dieWithLocation) hunk ./Distribution/PreProcess.hs 59 -import Control.Monad (unless) +import Control.Monad (liftM,unless) hunk ./Distribution/PreProcess.hs 106 + c2hsProcess pkg_descr lbi bi verbose (libModules pkg_descr) hunk ./Distribution/PreProcess.hs 117 + c2hsProcess pkg_descr lbi bi verbose (otherModules bi) hunk ./Distribution/PreProcess.hs 314 +-- |Make sure to run the preprocessor on c2hs (.chs) files in the correct order since +-- they have dependencies between each other. +c2hsProcess :: PackageDescription -> LocalBuildInfo -> BuildInfo -> Int -> [String] -> IO () +c2hsProcess pkg_descr lbi bi verbose modules = do + let searchLoc = nub $ hsSourceDirs bi ++ maybe [] (hsSourceDirs . libBuildInfo) (library pkg_descr) + sources <- liftM concat $ flip mapM modules $ \mod -> + moduleToFilePath2 searchLoc mod ["chs"] + unless (null sources) $ + setupMessage "Resolving c2hs dependencies for" pkg_descr + sourcesOrdered <- C2hs.resolvDepAndOrder sources + flip mapM_ sourcesOrdered $ \(loc, file) -> do + let (srcStem, ext) = splitFileExt file + ppC2hs bi lbi file (srcStem `joinFileExt` "hs") verbose + +-- vim: ts=8 sw=8 : + addfile ./Distribution/PreProcess/C2hs.hs hunk ./Distribution/PreProcess/C2hs.hs 1 +----------------------------------------------------------------------------- +-- | +-- Module : Distribution.PreProcess.C2hs +-- +-- Maintainer : Isaac Jones +-- Stability : alpha +-- Portability : portable +-- +{- Copyright (c) 2003-2005, Isaac Jones, Malcolm Wallace +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Isaac Jones nor the names of other + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -} + +module Distribution.PreProcess.C2hs + ( resolvDepAndOrder + ) where + +import Control.Monad (liftM) +import Data.Graph +import Data.List +import qualified Data.Map as Map +import qualified Data.Set as Set +import System.Directory (doesFileExist,getModificationTime) + +import Distribution.Compat.ReadP +import Distribution.Compat.FilePath (joinFileName, joinFileExt, splitFileExt) +import Distribution.Simple.Utils (die) + +type C2hsFile = (String, String) -- ^ (source directory, module path with extension) +type Module = String -- ^ module path with extension + +-- |Takes a list of c2hs files and returns those who needs preprocessing +-- in the order they should be processed +resolvDepAndOrder :: [C2hsFile] -- ^ (loc, fileWithExt) + -> IO [C2hsFile] +resolvDepAndOrder files = do + deps <- mapM readDeps files + let graphInput = zipWith (\locFile@(loc,file) deps -> (locFile, file, deps)) files deps + depMap = Map.fromList $ zip (map snd files) deps + sccs = stronglyConnComp graphInput + cyclicCheck scc = + case scc of + AcyclicSCC v -> return v + CyclicSCC vs -> do + putStrLn "Cyclic c2hs dependencies! Files involved:" + mapM_ (\(loc, file) -> putStrLn $ "Cyclic: " ++ (loc `joinFileName` file)) vs + die "Cannot resolve c2hs dependencies" + sortedFiles <- liftM reverse $ mapM cyclicCheck sccs + needsPreprocessing depMap Map.empty sortedFiles + +-- |Returns a list of files that needs preprocessing +needsPreprocessing :: Map.Map Module [Module] -- ^ dependency map + -> Map.Map Module () -- ^ preprocessed files + -> [C2hsFile] -- ^ files to check + -> IO [C2hsFile] +needsPreprocessing _ _ [] = return [] +needsPreprocessing depMap preprocessed (x@(loc,file):xs) = do + let preprocessIf b cont = + if b + then liftM (x:) $ needsPreprocessing depMap (Map.insert file () preprocessed) xs + else cont + (file', _) = splitFileExt file + hs_file = (loc `joinFileName` file' `joinFileExt` "hs") + chs_file = (loc `joinFileName` file) + + -- if a dependency has been recompiled then we need to preprocess + dependsOn <- Map.lookup file depMap + preprocessIf (not . null $ (Map.keys preprocessed) \\ dependsOn) $ do + + -- we need to preprocess if we haven't done it before + hs_exists <- doesFileExist hs_file + preprocessIf (not hs_exists) $ do + + -- if the the .chs file has been updated more recently than the .hs + -- we need to preprocess + hs_date <- getModificationTime hs_file + chs_date <- getModificationTime chs_file + preprocessIf (chs_date > hs_date) $ do + + -- looks like we are in the clear, no preprocessing needed! + needsPreprocessing depMap preprocessed xs + +-- |Read dependencies from .chs file +readDeps :: (String, String) -> IO [String] +readDeps (loc, file) = do + -- we assume that the {#import ...#} is written on a single line + contents <- readFile (loc `joinFileName` file) + let deps = map fst $ concatMap (readP_to_S pDeps) (lines contents) + return deps + +pDeps = do + string "{#" + skipSpaces + string "import" + skipSpaces + optional $ do + string "qualified" + skipSpaces + mod <- munch1 $ \c -> + case c of + ' ' -> False + '#' -> False + _ -> True + skipSpaces + string "#}" + return mod hunk ./Distribution/Simple/Utils.hs 59 + moduleToFilePath2, } Context: [Add BangPatterns to Extensions simonpj@microsoft.com**20060901125632] [Don't ignore C-objects when linking prof-libraries. Lemmih **20060827090226] [export PWarning for interface closure Ross Paterson **20060827162252] [hide internal modules from haddock Ross Paterson **20060827161235] [non-GHC: use System.Console.GetOpt Ross Paterson **20060827145601] [Hugs-only comment tweak Ross Paterson **20060827145539] [fix haddock reference Ross Paterson **20060827145437] [change title to Haskell Hierarchical Libraries Ross Paterson **20060827131348] [Make haddock target support the --hoogle flag Simon Marlow **20060822150720 Originally Neil Mitchell's patch, minor conflict fixed by me. ] [Change default installation dirs for executables on Windows: Simon Marlow **20060822134232 before: bindir = $prefix\$pkgid datadir = $prefix now: bindir = $prefix\Haskell\bin datadir = $prefix\Haskell datasubdir is still $pkgid, so data files for an exectuable will be installed in $prefix\Haskell\$pkgid. the idea is that all executables are installed in the same directory by default, so setting PATH is easier. Also, data files belonging to Haskell programs are grouped together under $prefix\Haskell. ] [On second thoughts, follow the Cabal docs for the syntax of package names Simon Marlow **20060822120025 Each package component must now contain at least one letter, a weaker requirement than always beginning with a letter. ] [Components of a package name should not begin with a digit Simon Marlow **20060822113719 Avoids ambiguities with package identifiers like "foo-1" (the 1 is the version number). ] [Use long-style args to haddock. Duncan Coutts **20060821230753] [Do not expose modules that are internal to the Cabal package Duncan Coutts **20060821174312 This brings it in sync with the package.conf. ] [Make -o use the filename as GHC will, i.e. with .exe on the end for Windows. This fixes a GHC 6.4.2 bug with relinking every time. Neil Mitchell**20060821143021] [Use 30k by default for max command line length. Duncan Coutts **20060821121534 We'll see if anyone complains. ] [Use ghc from the path by default in the Makefile Duncan Coutts **20060818173551] [Add xargs function and use it when linking. Duncan Coutts **20060818010449 When using GHC's --split-objs we end up with lots of files to link. This can mean overflowing the maximum length of the command line when invoking ar or ld. On windows the maximum length is 32k. On other systems it's not a great deal more. GHC currently deals with this problem by using xargs. This patch does more or less the same. ] [Try to support TH with profiling. See ticket #91. Duncan Coutts **20060802175922 This needs testing. ] [repair Distribution.Compat.Map for non-GHC Ross Paterson **20060810124314] [Avoid use of deprecated Data.FiniteMap, if possible Simon Marlow **20060809153232 Distribution.Compat.Map taken from Haddock. ] [Change 'getInstalledPkg' to the more sensible 'getLatestPkg'. Lemmih **20060806135545] [Don't check for packagesDirName and servListFile, they may not exist. Lemmih **20060806135423] [GHC build only: set $(MKDEPENDHS) in addition to $(HC) Simon Marlow **20060803092216] [pass the whole packageId to GHC with the -package-name flag Simon Marlow **20060720150931 This shouldn't make any difference to current GHC's, but will be required by the new GHC package code. ] [install: pass the verbose flag to register too Simon Marlow **20060728085914] [Add documentation of new LocalBuildInfo fields Duncan Coutts **20060726230130] [Wrap excessively long line Duncan Coutts **20060726221702] [Hold back on forcing vanilla libs for TH for the moment Duncan Coutts **20060726221532 When we get confirmation from GHC devs that it's the right thing to do then we can add it in. ] [Add initial support for --enable/disable-library-vanilla flags jeremy.shaw@linspireinc.com**20060720174408 For additional information see these mail threads: http://www.haskell.org//pipermail/libraries/2006-July/005522.html http://urchin.earth.li/pipermail/debian-haskell/2006-July/000220.html ] [build and install cabal-setup as part of GHC build Simon Marlow **20060720140417] [fix indentation in do block for H'98 compatibility Malcolm.Wallace@cs.york.ac.uk**20060711162221] [resolve conflicts from henning-thielemann's work. Thanks Henning! ijones@syntaxpolice.org**20060708185016] [install Haddock documentation in share/package/doc/html and register that path in the ghc-pkg cabal@henning-thielemann.de**20060609194058] [PackageDescription: haddockName generates the name of the .haddock file cabal@henning-thielemann.de**20060609193924] [PackageDescription: added toMaybe, some logical simplifications cabal@henning-thielemann.de**20060609193508] [Distribution.Simple.Utils: copyDirectoryRecursiveVerbose cabal@henning-thielemann.de**20060609192715] [Distribution.Compat.Directory: added getDirectoryContentsWithoutSpecial cabal@henning-thielemann.de**20060609192421] [Distribution.simple: haddock option --use-package tells which packages to hyperlink to cabal@henning-thielemann.de**20060605183304] [stripPrefix -> dropPrefix cabal@henning-thielemann.de**20060604195549] [generate .haddock interface file when running haddock cabal@henning-thielemann.de**20060604195216] [UNDO: Merge "unrecognized long opt" fix from 6.4.2 Simon Marlow **20060705142842 This patch undid the previous patch, "merge from base". I asked Sven to revert it, but didn't get an answer. See GHC bug #473. ] [Change flags passed to hsc2hs Duncan Coutts **20060704001926 The extra-libraries must be passed as -L-l${lib} or linking the C prog that hsc2hs generates may fail if any symbols are referenced. Also can't use cppOptions function since hsc2hs doesn't support -U. Need to do -U flags in ccOptions seperately. ] [finish interaction with remote HTTP servers audreyt@audreyt.org**20060624233156] [stage 2 patch: implement the "list" command audreyt@audreyt.org**20060624231421] [it's now 00-latest not latest audreyt@audreyt.org**20060624221907] [implement support for flat-file layout audreyt@audreyt.org**20060624221547] [parsec is not a dependency Simon Marlow **20060518131434 It is apparently required for the wash2hs test, however. ] [Merge "unrecognized long opt" fix from 6.4.2 Sven Panne **20060506110640] [Cabal.xml: entity greencard was mixed up with haddock cabal@henning-thielemann.de**20060411161212] [Change calls to 'make' into '$(MAKE)' Duncan Coutts **20060502174630 This is the portable thing to do and fixes things on FreeBSD where make/=gmake ] [Hugs: copy paths module to the right place, this time Ross Paterson **20060503132510] [pass correct -P flag to ffihugs Ross Paterson **20060503122452 The -P flag wasn't superfluous, but it was wrong for executables. ] [Hugs: copy path module into package build dir Ross Paterson **20060503122300] [add header file for GetModuleFileNameA Ross Paterson **20060502141641] [remove superfluous ffihugs -P option Ross Paterson **20060502104635] [fix for Hugs Ross Paterson **20060502101054 Add explicit types for a couple of constants to work around Hugs's imperfect implementation of the monomorphism restriction. ] [TAG 1.1.4 duncan.coutts@worc.ox.ac.uk**20060502095901] [TAG shipped in GHC 6.4.2 Simon Marlow **20060424093133] [Hugs: also compile the paths module Ross Paterson **20060501171206] [markup fix Ross Paterson **20060501145015] [move cabal-install/etc-cabal-get to cabal-install/etc-cabal-install alson@alsonkemp.com**20060430175158] [Complete move of cabal-get to cabal-install + some fixups alson@alsonkemp.com**20060430174300] [basic information for installing ijones@syntaxpolice.org**20060430063205] [build and install cabal-setup ijones@syntaxpolice.org**20060430063144] [add etc-cabal-get as a data-file ijones@syntaxpolice.org**20060430055332] [bumping cabal version number. 1.1.4 will be the one released with ghc 6.4.2. ijones@syntaxpolice.org**20060430044905] [modify makefile for cabal-install ijones@syntaxpolice.org**20060430041617] [cabal-get will become cabal-install ijones@syntaxpolice.org**20060430025633] [getting rid of cabal-install in favor of cabal-get ijones@syntaxpolice.org**20060430024951] [Remove erroneous exports... alson@alsonkemp.com**20060428195702] [Patch to fix "-ixyz" being overwritten by "-i" and to remove Cabal's dependency on the Cabal package. alson@alsonkemp.com**20060428055353] [Separate build into "make build" and "make install" alson@alsonkemp.com**20060428034151] [Fixups to get cabal-get into Cabal alson@alsonkemp.com**20060428032617] [Update Cabal with cabal-get alson@alsonkemp.com**20060427204050] [Fix JHC command lines. Einar Karttunen **20060427005922] [document install-includes and register --inplace Simon Marlow **20060428130542] [fix imports for Windows simonmar@microsoft.com**20060428075617] [Better support for packages that need to install header files Simon Marlow **20060426140627 There's a new field for .cabal files: install-includes: foo.h bar.h This means the same as 'includes', except that the files named therein will be installed into $libdir/include. 'includes' should only be used for headers already installed on the system. Directories listed in 'include-dirs' still turn into -I options for hsc2hs, cpphs, and C compilations. However, for installation purposes, relative directories in 'include-dirs' are now treated differently from absolute directories: - an absolute directory is copied to the include-dirs field of the installed package config - files names in install-includes are assumed to be found in one of the *relative* directories listed in include-dirs So the common pattern for providing a header file that you want to be available everywhere including to via-C compilations against this package: include-dirs: myincludes install-includes: foo.h will install the header file myincludes/foo.h in $libdir/include/foo.h. ] [merge from base: Simon Marlow **20060426121408 Wed Apr 26 13:11:10 BST 2006 Simon Marlow * RequireOrder: do not collect unrecognised options after a non-opt ] [pass unrecognised options before the command name to the command Simon Marlow **20060426121321 Previously, options before the command name other than --help were just ignored, which is quite confusing behaviour. So now, ./setup --with-compiler=ghc-6.4.2 configure works as you expect, instead of ignoring the --with-compiler option. ] [First attempt at a cabal-setup command Simon Marlow **20060303162233 cabal-setup is a replacement for 'runhaskell Setup.hs'. It accepts exactly the same commands. Additionally, the following new features are provided: * Setup.{hs,lhs} is optional. If omitted, cabal-setup behaves just like Distribution.Simple.defaultMain. * If the .cabal file contains a cabal-version field, then Setup.hs is built using an appropriate version of Cabal. This might entail creating Setup.hs if it doesn't exist. * cabal-setup interprets the options --with-compiler and --with-hc-pkg to determine the compiler used to compile Setup.hs. Later, we could add support for building multiple packages in dependency order, as per recent discussions on libraries@haskell.org. ] [add new modules Ross Paterson **20060425195548] [Implement "setup register --inplace", and a few other minor things Simon Marlow **20060425144733 There are a few changes in this patch: - New flag to register, --inplace. "setup register --inplace" registers the package for use in the build tree, i.e. without installing. It works with GHC only, currently. - The parameters to RegisterCmd, UnregisterCmd and InstallCmd are a legacy from before the time of hooks (or something) and don't serve any purpose any more, AFAICT. So I removed them. - I don't think "setup register" worked propertly before if --user was given to configure. It does now. - New flag to register: --with-hc-pkg (just the same as when given to configure, but lets you override it at register-time) ] [Refactoring only: separate compiler-specific simple build implementation Simon Marlow **20060425111957] [get LocalBuildInfo from Distribution.LocalBuildInfo Simon Marlow **20060425111921] [warning cleanup Simon Marlow **20060425102302] [Distribution.Compat.FilePath should be hidden Simon Marlow **20060411141305 This also matches package.conf.in. ] [Hide Distribution.GetOpt; it just re-exports System.Console.GetOpt anyway Simon Marlow **20060411141045 This also matches Cabal.cabal. ] [GHC FFI flag should be -fffi not -ffi, the latter merely happens to work. Duncan Coutts **20060318022010] [Make ghc-6.2 packages be exposed by default. Duncan Coutts **20060221135026 For ghc-6.4 when Cabal registers packages it exposes them by default. However it does not do the same fo ghc-6.2. This change corrects the discrepancy. This patch is already being used in Gentoo with Cabal 1.1.3. ] [test case for buildinfo with multiple executables ijones@syntaxpolice.org**20060408213048] [It is no longer necessary to run 'configure' before 'clean' or 'sdist', addressing http://haskell.galois.com/trac/hackage/ticket/12. Nick Alexander **20060404054127 In order to change this behaviour, it was necessary to modify the hook interface, specifically cleanHook, postClean, sDistHook, postSDist. They now take a Maybe LocalBuildInfo, since a LocalBuildInfo might not be available in .setup-config. ] [windows patch from brian.mabry.edwards@gmail.com ijones@syntaxpolice.org**20060404171731] [oops, don't enable -split-objs by default Simon Marlow **20060314124358] [export configDependency Simon Marlow **20060303155527] [comment fix Simon Marlow **20060303155516] [don't check cabal-version during parsing, it doesn't work Simon Marlow **20060303155500 because parsers are evaluated multiple times due to backtracking. ] [no need to use a verbatim copy of System.Console.GetOpt, omit if possible Simon Marlow **20060303144025] [Support for -split-objs with GHC Simon Marlow **20060302170907 New configure option: --enable-split-objs creates libraries using -split-objs with GHC (current HEAD or later only, the configure checks for version 6.5). Fixes ticket #19. ] [Initial support for JHC Einar Karttunen **20060206233543] [added some fields to test suite for duncan's mods ijones@syntaxpolice.org**20060204223256] [fixup PackageDescription test code Duncan Coutts **20060201183912 just ignore the extra ParseOk warnings field ] [ignore "x-" extension fields without a warning Duncan Coutts **20060201183145] [Make unknown fields a warning rather than an error Duncan Coutts **20060201182944 Add support for warnings to the ParseResult type. Change existing warnings from using Debug.Trace to use this new warning support. ] [fix conflict Simon Marlow **20060206095833] [push and pull all ijones@syntaxpolice.org**20060201185441] [combine GNUmakefile and Makefile Simon Marlow **20060206095400] [now build Setup.lhs instead of using runghc on it. still uses runhugs. ijones@syntaxpolice.org**20060130054810] [cabal-install uses defaultMain if it can't find Setup.lhs ijones@syntaxpolice.org**20060130050710] [cleaned up suffix handler params to hooks ijones@syntaxpolice.org**20060116064811 Summary if last few changes: I modified the hooks interface quite a bit, again. There's good news and bad news about this. The good news is that it's cleaned up and should be easier to maintain and to avoid future modifications. The bad news is that this change itself will break stuff, of course. If you have any trouble building your Setup scripts, please let me know. I really think that it was best to bite the bullet right now in one big go instead of down the road with lots of little changes. I have a lot more confidence in the hooks interface, and I don't actually expect that it'll change as often. I made the types more consistent, and made sure there are accessor functions on each of the Flags types so that if the flags types change in the future, it shouldn't break lots of code. Another piece of good / bad news is that I decided not to get rid of the pre & post hooks. They are nice for convenience and it wouldn't be nearly so easy to write hooks without them. That's bad because the interface to hooks is still pretty big, which means that there's more likelihood that it'll change in the future. Another weakness in the Hooks interface is that with command hooks (like sDistHook) it's tempting to add parameters to them; basically the stuff that we compute between the preSDist and sDist hook. I removed such params and have their values computed elsewhere. Cabal hackers, please avoid adding parameters to these command hooks if at all possible in order to keep the interface steady. If you need to compute a value to pass to these functions, compute it in the function and / or make it available as a function that someone crafting hooks can use as well, or consider whether it belongs in one of the parameters already being passed to the hooks, PackageDescription, LocalBuildInfo, UserHooks, Flags. ] [make the order of params to cmd hooks consistent ijones@syntaxpolice.org**20060116055858] [remove some flags from sdist, some cleanup ijones@syntaxpolice.org**20060116053818] [clarifying and making flags types consistent ijones@syntaxpolice.org**20060116035033] [changing tuple types to records w/ fields ijones@syntaxpolice.org**20060115234317] [moving TODO stuff to wiki ijones@syntaxpolice.org**20060115234303] [fix version number in fptools makefile to match .cabal file ijones@syntaxpolice.org**20060201183331] [Add extraGHCiLibraries to the InstalledPackageInfo and extend the parser. Duncan Coutts **20060131163640] [re-add the GNUmakefiles Simon Marlow *-20060123115236 These are now safe after we added "-f Makefile" to the make args when invoked from the GHC build system. This repo should now be useable as the main Cabal repo. ] [re-add the GNUmakefiles Simon Marlow **20060123115236 These are now safe after we added "-f Makefile" to the make args when invoked from the GHC build system. This repo should now be useable as the main Cabal repo. ] [TAG checkpoint simonmar@microsoft.com**20060113152542] Patch bundle hash: 0ade5e628be4e20dbc1d8f2200270372cdce9002