From 6c5d40fcad94319172df6ad1c4409db001d83b97 Mon Sep 17 00:00:00 2001
From: "Edward Z. Yang" <ezyang@cs.stanford.edu>
Date: Mon, 31 Oct 2016 16:54:22 -0700
Subject: [PATCH] Test case for #4049.

Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu>
Signed-off-by: Auke Booij <auke@tulcod.com>
---
 cabal-install/Distribution/Client/Install.hs  |  5 +---
 cabal-install/cabal-install.cabal             |  6 +++++
 cabal-install/tests/IntegrationTests.hs       | 14 +++++++++--
 .../tests/IntegrationTests/exec/T4049.sh      |  9 ++++++++
 .../IntegrationTests/exec/T4049/UseLib.c      |  9 ++++++++
 .../exec/T4049/csrc/MyForeignLibWrapper.c     | 23 +++++++++++++++++++
 .../exec/T4049/my-foreign-lib.cabal           | 19 +++++++++++++++
 .../exec/T4049/src/MyForeignLib/Hello.hs      | 10 ++++++++
 .../T4049/src/MyForeignLib/SomeBindings.hsc   | 10 ++++++++
 9 files changed, 99 insertions(+), 6 deletions(-)
 create mode 100644 cabal-install/tests/IntegrationTests/exec/T4049.sh
 create mode 100644 cabal-install/tests/IntegrationTests/exec/T4049/UseLib.c
 create mode 100644 cabal-install/tests/IntegrationTests/exec/T4049/csrc/MyForeignLibWrapper.c
 create mode 100644 cabal-install/tests/IntegrationTests/exec/T4049/my-foreign-lib.cabal
 create mode 100644 cabal-install/tests/IntegrationTests/exec/T4049/src/MyForeignLib/Hello.hs
 create mode 100644 cabal-install/tests/IntegrationTests/exec/T4049/src/MyForeignLib/SomeBindings.hsc

diff --git a/cabal-install/Distribution/Client/Install.hs b/cabal-install/Distribution/Client/Install.hs
index a81562742b..b34dc6f13f 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 7661a01e35..2573810bb4 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 15489ec455..28161c14c1 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 0000000000..8bb30d3773
--- /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 0000000000..65770da638
--- /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 0000000000..2660c6a335
--- /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 0000000000..05ab5eef60
--- /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 0000000000..cc6b20ecb0
--- /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 0000000000..beea7f8c49
--- /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
-- 
GitLab