diff --git a/cabal-install/Distribution/Client/Install.hs b/cabal-install/Distribution/Client/Install.hs index a81562742ba7a5d103738bc8be7424ecc887f27d..b34dc6f13f5b051f53357a6016fae2a169006c84 100644 --- a/cabal-install/Distribution/Client/Install.hs +++ b/cabal-install/Distribution/Client/Install.hs @@ -47,7 +47,6 @@ import System.Exit ( ExitCode(..) ) import Distribution.Compat.Exception ( catchIO, catchExit ) -import Control.Exception ( assert ) import Control.Monad ( forM_, mapM ) import System.Directory @@ -1427,9 +1426,7 @@ installUnpackedPackage verbosity installLock numJobs ipkgs <- genPkgConfs mLogPath let ipkgs' = case ipkgs of [ipkg] -> [ipkg { Installed.installedUnitId = uid }] - _ -> assert (any ((== uid) - . Installed.installedUnitId) - ipkgs) ipkgs + _ -> ipkgs let packageDBs = interpretPackageDbFlags (fromFlag (configUserInstall configFlags)) (configPackageDBs configFlags) diff --git a/cabal-install/cabal-install.cabal b/cabal-install/cabal-install.cabal index 7661a01e35088cdd0bab4dbcc7e0eb168603c37a..2573810bb42190ff34e4d017cd3029eed89c762a 100644 --- a/cabal-install/cabal-install.cabal +++ b/cabal-install/cabal-install.cabal @@ -80,6 +80,12 @@ Extra-Source-Files: tests/IntegrationTests/custom/segfault/plain.cabal tests/IntegrationTests/exec/Foo.hs tests/IntegrationTests/exec/My.hs + tests/IntegrationTests/exec/T4049.sh + tests/IntegrationTests/exec/T4049/UseLib.c + tests/IntegrationTests/exec/T4049/csrc/MyForeignLibWrapper.c + tests/IntegrationTests/exec/T4049/my-foreign-lib.cabal + tests/IntegrationTests/exec/T4049/src/MyForeignLib/Hello.hs + tests/IntegrationTests/exec/T4049/src/MyForeignLib/SomeBindings.hsc tests/IntegrationTests/exec/adds_sandbox_bin_directory_to_path.out tests/IntegrationTests/exec/adds_sandbox_bin_directory_to_path.sh tests/IntegrationTests/exec/auto_configures_on_exec.out diff --git a/cabal-install/tests/IntegrationTests.hs b/cabal-install/tests/IntegrationTests.hs index 15489ec455910d20b35736476b091a6a9facfc03..28161c14c18931cdb60f6c90826ee8739f5e7cec 100644 --- a/cabal-install/tests/IntegrationTests.hs +++ b/cabal-install/tests/IntegrationTests.hs @@ -12,9 +12,9 @@ import Distribution.Compat.CreatePipe (createPipe) import Distribution.Compat.Environment (setEnv, getEnvironment) import Distribution.Compat.Internal.TempFile (createTempDirectory) import Distribution.Simple.Configure (findDistPrefOrDefault) -import Distribution.Simple.Program.Builtin (ghcPkgProgram) +import Distribution.Simple.Program.Builtin (ghcPkgProgram, gccProgram, ghcProgram) import Distribution.Simple.Program.Db - (defaultProgramDb, requireProgram, setProgramSearchPath) + (defaultProgramDb, requireProgram, setProgramSearchPath, lookupProgramVersion) import Distribution.Simple.Program.Find (ProgramSearchPathEntry(ProgramSearchPathDir), defaultProgramSearchPath) import Distribution.Simple.Program.Types @@ -22,6 +22,7 @@ import Distribution.Simple.Program.Types import Distribution.Simple.Setup ( Flag(..) ) import Distribution.Simple.Utils ( findProgramVersion, copyDirectoryRecursive, installOrdinaryFile ) import Distribution.Verbosity (normal) +import Distribution.Version (anyVersion) -- Third party modules. import Control.Concurrent.Async (withAsync, wait) @@ -294,6 +295,15 @@ main = do setEnv "CABAL_ARGS_NO_CONFIG_FILE" " " -- Don't get Unicode output from GHC setEnv "LC_ALL" "C" + -- Try to find something that can compile C programs + findGcc <- lookupProgramVersion normal gccProgram anyVersion defaultProgramDb + case findGcc of + Left _ -> do + -- set CC to GHC blabla + (ghc, _) <- requireProgram normal ghcProgram defaultProgramDb + setEnv "CCOMP" $ programPath ghc ++ " -no-hs-main" + Right (gcc, _, _) -> do + setEnv "CCOMP" (programPath gcc) -- Discover all the test categories categories <- discoverTestCategories baseDirectory -- Discover tests in each category diff --git a/cabal-install/tests/IntegrationTests/exec/T4049.sh b/cabal-install/tests/IntegrationTests/exec/T4049.sh new file mode 100644 index 0000000000000000000000000000000000000000..8bb30d3773b0bc2e012687b16d9ca3c1fbefd31a --- /dev/null +++ b/cabal-install/tests/IntegrationTests/exec/T4049.sh @@ -0,0 +1,9 @@ +. ./common.sh + +require_ghc_ge 708 + +cd T4049 +cabal sandbox init > /dev/null +cabal install --enable-shared > /dev/null +sh -c "$CCOMP UseLib.c -o UseLib -l myforeignlib -L \"$PWD/.cabal-sandbox/lib\" > /dev/null" +cabal exec "$PWD/UseLib" diff --git a/cabal-install/tests/IntegrationTests/exec/T4049/UseLib.c b/cabal-install/tests/IntegrationTests/exec/T4049/UseLib.c new file mode 100644 index 0000000000000000000000000000000000000000..65770da6380d58a2580b85c0c59a6db50d8f9513 --- /dev/null +++ b/cabal-install/tests/IntegrationTests/exec/T4049/UseLib.c @@ -0,0 +1,9 @@ +#include <stdio.h> + +int main() +{ + myForeignLibInit(); + sayHi(); + myForeignLibExit(); + return 0; +} diff --git a/cabal-install/tests/IntegrationTests/exec/T4049/csrc/MyForeignLibWrapper.c b/cabal-install/tests/IntegrationTests/exec/T4049/csrc/MyForeignLibWrapper.c new file mode 100644 index 0000000000000000000000000000000000000000..2660c6a335ef444a65436bd259f192a29d843d8e --- /dev/null +++ b/cabal-install/tests/IntegrationTests/exec/T4049/csrc/MyForeignLibWrapper.c @@ -0,0 +1,23 @@ +#include <stdlib.h> +#include "HsFFI.h" + +HsBool myForeignLibInit(void){ + int argc = 2; + char *argv[] = { "+RTS", "-A32m", NULL }; + char **pargv = argv; + + // Initialize Haskell runtime + hs_init(&argc, &pargv); + + // do any other initialization here and + // return false if there was a problem + return HS_BOOL_TRUE; +} + +void myForeignLibExit(void){ + hs_exit(); +} + +int cFoo2() { + return 1234; +} diff --git a/cabal-install/tests/IntegrationTests/exec/T4049/my-foreign-lib.cabal b/cabal-install/tests/IntegrationTests/exec/T4049/my-foreign-lib.cabal new file mode 100644 index 0000000000000000000000000000000000000000..05ab5eef604a82079222fd6987389a6b06ced2c1 --- /dev/null +++ b/cabal-install/tests/IntegrationTests/exec/T4049/my-foreign-lib.cabal @@ -0,0 +1,19 @@ +name: my-foreign-lib +version: 0.1.0.0 +author: Edsko de Vries +maintainer: edsko@well-typed.com +build-type: Simple +cabal-version: >=1.10 + +foreign-library myforeignlib + type: native-shared + + if os(windows) + options: standalone + + other-modules: MyForeignLib.Hello + MyForeignLib.SomeBindings + build-depends: base + hs-source-dirs: src + c-sources: csrc/MyForeignLibWrapper.c + default-language: Haskell2010 diff --git a/cabal-install/tests/IntegrationTests/exec/T4049/src/MyForeignLib/Hello.hs b/cabal-install/tests/IntegrationTests/exec/T4049/src/MyForeignLib/Hello.hs new file mode 100644 index 0000000000000000000000000000000000000000..cc6b20ecb0cbc5afa6e45cf553754b1adaad6c00 --- /dev/null +++ b/cabal-install/tests/IntegrationTests/exec/T4049/src/MyForeignLib/Hello.hs @@ -0,0 +1,10 @@ +-- | Module with single foreign export +module MyForeignLib.Hello (sayHi) where + +import MyForeignLib.SomeBindings + +foreign export ccall sayHi :: IO () + +-- | Say hi! +sayHi :: IO () +sayHi = putStrLn $ "Hi from a foreign library! Foo has value " ++ show valueOfFoo diff --git a/cabal-install/tests/IntegrationTests/exec/T4049/src/MyForeignLib/SomeBindings.hsc b/cabal-install/tests/IntegrationTests/exec/T4049/src/MyForeignLib/SomeBindings.hsc new file mode 100644 index 0000000000000000000000000000000000000000..beea7f8c49c98882dcc6c8ea798a70edf715572c --- /dev/null +++ b/cabal-install/tests/IntegrationTests/exec/T4049/src/MyForeignLib/SomeBindings.hsc @@ -0,0 +1,10 @@ +-- | Module that needs the hsc2hs preprocessor +module MyForeignLib.SomeBindings where + +#define FOO 1 + +#ifdef FOO +-- | Value guarded by a CPP flag +valueOfFoo :: Int +valueOfFoo = 5678 +#endif