From 53a0f5b97bb305140a076d866eeabe4b1875f34b Mon Sep 17 00:00:00 2001 From: Franklin Chen Date: Fri, 9 Oct 2015 14:18:21 -0400 Subject: [PATCH 1/2] Support GHC 7.10. Add new GitHub URL. Add Travis. --- .gitignore | 9 +++ .travis.yml | 130 +++++++++++++++++++++++++++++++++++++ plugins.cabal | 4 ++ src/System/Plugins/Env.hs | 51 ++++++++------- src/System/Plugins/Load.hs | 8 ++- stack.yaml | 29 +++++++++ 6 files changed, 206 insertions(+), 25 deletions(-) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 stack.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c3a9f0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +/config.h +/config.log +/config.mk +/config.status +/testsuite/hier/hier2/A/B/C/Module.hi +/testsuite/hier/hier2/A/B/C/Module.o +/testsuite/makewith/io/TestIO.conf +/testsuite/makewith/unsafeio/Unsafe.conf +/.stack-work/ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..97af964 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,130 @@ +# This file has been generated -- see https://github.com/hvr/multi-ghc-travis +language: c +sudo: false + +cache: + directories: + - $HOME/.cabsnap + - $HOME/.cabal/packages + +before_cache: + - rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log + - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.tar + +matrix: + include: + - env: CABALVER=1.16 GHCVER=7.0.1 + compiler: ": #GHC 7.0.1" + addons: {apt: {packages: [cabal-install-1.16,ghc-7.0.1,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.16 GHCVER=7.0.2 + compiler: ": #GHC 7.0.2" + addons: {apt: {packages: [cabal-install-1.16,ghc-7.0.2,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.16 GHCVER=7.0.3 + compiler: ": #GHC 7.0.3" + addons: {apt: {packages: [cabal-install-1.16,ghc-7.0.3,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.16 GHCVER=7.0.4 + compiler: ": #GHC 7.0.4" + addons: {apt: {packages: [cabal-install-1.16,ghc-7.0.4,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.16 GHCVER=7.2.1 + compiler: ": #GHC 7.2.1" + addons: {apt: {packages: [cabal-install-1.16,ghc-7.2.1,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.16 GHCVER=7.2.2 + compiler: ": #GHC 7.2.2" + addons: {apt: {packages: [cabal-install-1.16,ghc-7.2.2,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.16 GHCVER=7.4.1 + compiler: ": #GHC 7.4.1" + addons: {apt: {packages: [cabal-install-1.16,ghc-7.4.1,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.16 GHCVER=7.4.2 + compiler: ": #GHC 7.4.2" + addons: {apt: {packages: [cabal-install-1.16,ghc-7.4.2,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.16 GHCVER=7.6.1 + compiler: ": #GHC 7.6.1" + addons: {apt: {packages: [cabal-install-1.16,ghc-7.6.1,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.16 GHCVER=7.6.2 + compiler: ": #GHC 7.6.2" + addons: {apt: {packages: [cabal-install-1.16,ghc-7.6.2,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.16 GHCVER=7.6.3 + compiler: ": #GHC 7.6.3" + addons: {apt: {packages: [cabal-install-1.16,ghc-7.6.3,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.18 GHCVER=7.8.1 + compiler: ": #GHC 7.8.1" + addons: {apt: {packages: [cabal-install-1.18,ghc-7.8.1,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.18 GHCVER=7.8.2 + compiler: ": #GHC 7.8.2" + addons: {apt: {packages: [cabal-install-1.18,ghc-7.8.2,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.18 GHCVER=7.8.3 + compiler: ": #GHC 7.8.3" + addons: {apt: {packages: [cabal-install-1.18,ghc-7.8.3,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.18 GHCVER=7.8.4 + compiler: ": #GHC 7.8.4" + addons: {apt: {packages: [cabal-install-1.18,ghc-7.8.4,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.22 GHCVER=7.10.1 + compiler: ": #GHC 7.10.1" + addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.1,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=1.22 GHCVER=7.10.2 + compiler: ": #GHC 7.10.2" + addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.2,happy-1.19.5], sources: [hvr-ghc]}} + - env: CABALVER=head GHCVER=head + compiler: ": #GHC head" + addons: {apt: {packages: [cabal-install-head,ghc-head,happy-1.19.5], sources: [hvr-ghc]}} + + allow_failures: + - env: CABALVER=head GHCVER=head + +before_install: + - unset CC + - export PATH=/opt/happy/1.19.5/bin:/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH + +install: + - cabal --version + - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]" + - if [ -f $HOME/.cabal/packages/hackage.haskell.org/00-index.tar.gz ]; + then + zcat $HOME/.cabal/packages/hackage.haskell.org/00-index.tar.gz > + $HOME/.cabal/packages/hackage.haskell.org/00-index.tar; + fi + - travis_retry cabal update -v + - sed -i 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config + - cabal install --only-dependencies --enable-tests --enable-benchmarks --dry -v > installplan.txt + - sed -i -e '1,/^Resolving /d' installplan.txt; cat installplan.txt + +# check whether current requested install-plan matches cached package-db snapshot + - if diff -u installplan.txt $HOME/.cabsnap/installplan.txt; + then + echo "cabal build-cache HIT"; + rm -rfv .ghc; + cp -a $HOME/.cabsnap/ghc $HOME/.ghc; + cp -a $HOME/.cabsnap/lib $HOME/.cabsnap/share $HOME/.cabsnap/bin $HOME/.cabal/; + else + echo "cabal build-cache MISS"; + rm -rf $HOME/.cabsnap; + mkdir -p $HOME/.ghc $HOME/.cabal/lib $HOME/.cabal/share $HOME/.cabal/bin; + cabal install --only-dependencies --enable-tests --enable-benchmarks; + fi + +# snapshot package-db on cache miss + - if [ ! -d $HOME/.cabsnap ]; + then + echo "snapshotting package-db to build-cache"; + mkdir $HOME/.cabsnap; + cp -a $HOME/.ghc $HOME/.cabsnap/ghc; + cp -a $HOME/.cabal/lib $HOME/.cabal/share $HOME/.cabal/bin installplan.txt $HOME/.cabsnap/; + fi + +# Here starts the actual work to be performed for the package under test; +# any command which exits with a non-zero exit code causes the build to fail. +script: + - if [ -f configure.ac ]; then autoreconf -i; fi + - cabal configure --enable-tests --enable-benchmarks -v2 # -v2 provides useful information for debugging + - cabal build # this builds all libraries and executables (including tests/benchmarks) + - cabal test + - cabal check + - cabal sdist # tests that a source-distribution can be generated + +# Check that the resulting source distribution can be built & installed. +# If there are no other `.tar.gz` files in `dist`, this can be even simpler: +# `cabal install --force-reinstalls dist/*-*.tar.gz` + - SRC_TGZ=$(cabal info . | awk '{print $2;exit}').tar.gz && + (cd dist && cabal install --force-reinstalls "$SRC_TGZ") + +# EOF diff --git a/plugins.cabal b/plugins.cabal index 3803879..e91c7bf 100644 --- a/plugins.cabal +++ b/plugins.cabal @@ -59,3 +59,7 @@ library if impl(ghc >= 7.2) build-depends: ghc-paths + +source-repository head + type: git + location: https://github.com/stepcut/plugins diff --git a/src/System/Plugins/Env.hs b/src/System/Plugins/Env.hs index ae37bd2..415f525 100644 --- a/src/System/Plugins/Env.hs +++ b/src/System/Plugins/Env.hs @@ -1,22 +1,22 @@ {-# LANGUAGE CPP #-} -- -- Copyright (C) 2004-5 Don Stewart - http://www.cse.unsw.edu.au/~dons --- +-- -- This library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. --- +-- -- This library is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- Lesser General Public License for more details. --- +-- -- You should have received a copy of the GNU Lesser General Public -- License along with this library; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -- USA --- +-- module System.Plugins.Env ( env, @@ -69,11 +69,14 @@ import System.IO.Error ( catch, ioError, isDoesNotExistError ) import Control.Concurrent.MVar ( MVar(), newMVar, withMVar ) -import Distribution.Package hiding (depends, packageName, PackageName(..)) +import Distribution.Package hiding (depends, packageName, PackageName(..) +#if MIN_VERSION_ghc(7,10,0) + , installedPackageId +#endif + ) import Distribution.Text import Distribution.InstalledPackageInfo --- import Distribution.Package hiding (packageName, PackageName(..)) import Distribution.Simple.Compiler import Distribution.Simple.GHC import Distribution.Simple.PackageIndex @@ -93,7 +96,7 @@ emptyFM = M.empty addToFM :: (Ord key) => FiniteMap key elt -> key -> elt -> FiniteMap key elt addToFM = \m k e -> M.insert k e m -addWithFM :: (Ord key) +addWithFM :: (Ord key) => (elt -> elt -> elt) -> FiniteMap key elt -> key -> elt -> FiniteMap key elt addWithFM = \comb m k e -> M.insertWith comb k e m @@ -147,9 +150,9 @@ type MergeEnv = FiniteMap (FilePath,FilePath) FilePath -- multiple package.conf's kept in separate namespaces type PkgEnvs = [PkgEnv] -type Env = (MVar (), +type Env = (MVar (), IORef ModEnv, - IORef DepEnv, + IORef DepEnv, IORef PkgEnvs, IORef StaticPkgEnv, IORef MergeEnv) @@ -160,7 +163,7 @@ type Env = (MVar (), -- packages and their informations. Initially all we know is the default -- package.conf information. -- -env = unsafePerformIO $ do +env = unsafePerformIO $ do mvar <- newMVar () ref1 <- newIORef emptyFM -- loaded objects ref2 <- newIORef emptyFM @@ -202,10 +205,10 @@ modifyPkgEnv :: Env -> (PkgEnvs -> IO PkgEnvs) -> IO () modifyStaticPkgEnv :: Env -> (StaticPkgEnv -> IO StaticPkgEnv) -> IO () modifyMerged :: Env -> (MergeEnv -> IO MergeEnv)-> IO () -modifyModEnv (mvar,ref,_,_,_,_) f = lockAndWrite mvar ref f -modifyDepEnv (mvar,_,ref,_,_,_) f = lockAndWrite mvar ref f -modifyPkgEnv (mvar,_,_,ref,_,_) f = lockAndWrite mvar ref f -modifyStaticPkgEnv (mvar,_,_,_,ref,_) f = lockAndWrite mvar ref f +modifyModEnv (mvar,ref,_,_,_,_) f = lockAndWrite mvar ref f +modifyDepEnv (mvar,_,ref,_,_,_) f = lockAndWrite mvar ref f +modifyPkgEnv (mvar,_,_,ref,_,_) f = lockAndWrite mvar ref f +modifyStaticPkgEnv (mvar,_,_,_,ref,_) f = lockAndWrite mvar ref f modifyMerged (mvar,_,_,_,_,ref) f = lockAndWrite mvar ref f -- private @@ -285,7 +288,7 @@ rmModuleDeps m = modifyDepEnv env $ \fm -> return $ delFromFM fm m -- stored in the environment. -- addPkgConf :: FilePath -> IO () -addPkgConf f = do +addPkgConf f = do ps <- readPackageConf f modifyPkgEnv env $ \ls -> return $ union ls ps @@ -295,22 +298,22 @@ addPkgConf f = do -- GHC 6.12) -- union :: PkgEnvs -> [PackageConfig] -> PkgEnvs -union ls ps' = +union ls ps' = let fm = emptyFM -- new FM for this package.conf in foldr addOnePkg fm ps' : ls - where + where -- we add each package with and without it's version number and with the full installedPackageId addOnePkg p fm' = addToPkgEnvs (addToPkgEnvs (addToPkgEnvs fm' (display $ sourcePackageId p) p) (display $ installedPackageId p) p) (packageName p) p - + -- if no version number specified, pick the higher version addToPkgEnvs = addWithFM higherVersion - higherVersion pkgconf1 pkgconf2 + higherVersion pkgconf1 pkgconf2 | installedPackageId pkgconf1 >= installedPackageId pkgconf2 = pkgconf1 | otherwise = pkgconf2 - --- + +-- -- | generate a PkgEnv from the system package.conf -- The path to the default package.conf was determined by /configure/ -- This imposes a constraint that you must build your plugins with the @@ -364,7 +367,7 @@ lookupPkg :: PackageName -> IO ([FilePath],[FilePath]) lookupPkg pn = go [] pn where go :: [PackageName] -> PackageName -> IO ([FilePath],[FilePath]) - go seen p = do + go seen p = do (ps, (f, g)) <- lookupPkg' p static <- isStaticPkg p (f', g') <- liftM unzip $ mapM (go (nub $ seen ++ ps)) (ps \\ seen) @@ -453,7 +456,7 @@ lookupPkg' p = withPkgEnvs env $ \fms -> go fms p fix_topdir (x:xs) = replace_topdir x : fix_topdir xs replace_topdir [] = [] - replace_topdir ('$':xs) + replace_topdir ('$':xs) | take 6 xs == "topdir" = ghcLibraryPath ++ (drop 6 xs) | otherwise = '$' : replace_topdir xs replace_topdir (x:xs) = x : replace_topdir xs @@ -533,7 +536,7 @@ a b = a ++ "/" ++ b -packageName :: PackageConfig -> PackageName +packageName :: PackageConfig -> PackageName packageDeps :: PackageConfig -> [PackageName] -- updImportDirs :: ([FilePath] -> [FilePath]) -> PackageConfig -> PackageConfig -- updLibraryDirs :: ([FilePath] -> [FilePath]) -> PackageConfig -> PackageConfig diff --git a/src/System/Plugins/Load.hs b/src/System/Plugins/Load.hs index 58c3e77..3702271 100644 --- a/src/System/Plugins/Load.hs +++ b/src/System/Plugins/Load.hs @@ -72,7 +72,11 @@ import System.Plugins.LoadTypes -- import Language.Hi.Parser import BinIface import HscTypes +#if MIN_VERSION_ghc(7,10,0) +import Module (moduleName, moduleNameString, packageKeyString) +#else import Module (moduleName, moduleNameString, packageIdString) +#endif import HscMain (newHscEnv) import TcRnMonad (initTcRnIf) @@ -701,7 +705,9 @@ loadDepends obj incpaths = do -- and find some packages to load, as well. let ps = dep_pkgs ds -#if MIN_VERSION_ghc(7,2,0) +#if MIN_VERSION_ghc(7,10,0) + ps' <- filterM loaded . map packageKeyString . nub $ map fst ps +#elif MIN_VERSION_ghc(7,2,0) ps' <- filterM loaded . map packageIdString . nub $ map fst ps #else ps' <- filterM loaded . map packageIdString . nub $ ps diff --git a/stack.yaml b/stack.yaml new file mode 100644 index 0000000..8202132 --- /dev/null +++ b/stack.yaml @@ -0,0 +1,29 @@ +# For more information, see: https://github.com/commercialhaskell/stack/blob/master/doc/yaml_configuration.md + +# Specifies the GHC version and set of packages available (e.g., lts-3.5, nightly-2015-09-21, ghc-7.10.2) +resolver: lts-3.8 + +# Local packages, usually specified by relative directory name +packages: +- '.' + +# Packages to be pulled from upstream that are not in the resolver (e.g., acme-missiles-0.3) +extra-deps: [] + +# Override default flag values for local packages and extra-deps +flags: {} + +# Control whether we use the GHC we find on the path +# system-ghc: true + +# Require a specific version of stack, using version ranges +# require-stack-version: -any # Default +# require-stack-version: >= 0.1.4.0 + +# Override the architecture used by stack, especially useful on Windows +# arch: i386 +# arch: x86_64 + +# Extra directories used by stack for building +# extra-include-dirs: [/path/to/dir] +# extra-lib-dirs: [/path/to/dir] From e890fd8174b92ea56f7974da313b3e2a2c8287dc Mon Sep 17 00:00:00 2001 From: Franklin Chen Date: Fri, 9 Oct 2015 15:18:48 -0400 Subject: [PATCH 2/2] Remove Travis build for 7.2.* because failing. --- .travis.yml | 12 ------------ plugins.cabal | 7 ++++++- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 97af964..ef7ae1f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,12 +25,6 @@ matrix: - env: CABALVER=1.16 GHCVER=7.0.4 compiler: ": #GHC 7.0.4" addons: {apt: {packages: [cabal-install-1.16,ghc-7.0.4,happy-1.19.5], sources: [hvr-ghc]}} - - env: CABALVER=1.16 GHCVER=7.2.1 - compiler: ": #GHC 7.2.1" - addons: {apt: {packages: [cabal-install-1.16,ghc-7.2.1,happy-1.19.5], sources: [hvr-ghc]}} - - env: CABALVER=1.16 GHCVER=7.2.2 - compiler: ": #GHC 7.2.2" - addons: {apt: {packages: [cabal-install-1.16,ghc-7.2.2,happy-1.19.5], sources: [hvr-ghc]}} - env: CABALVER=1.16 GHCVER=7.4.1 compiler: ": #GHC 7.4.1" addons: {apt: {packages: [cabal-install-1.16,ghc-7.4.1,happy-1.19.5], sources: [hvr-ghc]}} @@ -64,12 +58,6 @@ matrix: - env: CABALVER=1.22 GHCVER=7.10.2 compiler: ": #GHC 7.10.2" addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.2,happy-1.19.5], sources: [hvr-ghc]}} - - env: CABALVER=head GHCVER=head - compiler: ": #GHC head" - addons: {apt: {packages: [cabal-install-head,ghc-head,happy-1.19.5], sources: [hvr-ghc]}} - - allow_failures: - - env: CABALVER=head GHCVER=head before_install: - unset CC diff --git a/plugins.cabal b/plugins.cabal index e91c7bf..442d924 100644 --- a/plugins.cabal +++ b/plugins.cabal @@ -20,7 +20,12 @@ author: Don Stewart 2004..2010 maintainer: Jeremy Shaw cabal-version: >= 1.6 build-type: Configure -Tested-with: GHC >= 6.12.1 +Tested-with: GHC == 7.0.* +-- not working , GHC == 7.2.* + , GHC == 7.4.* + , GHC == 7.6.* + , GHC == 7.8.* + , GHC == 7.10.* extra-source-files: config.guess, config.h.in, config.mk.in, config.sub, configure, configure.ac, install.sh, Makefile, testsuite/makewith/io/TestIO.conf.in,