From 539cb7bcda85dac2a0da5f1357876c4466426776 Mon Sep 17 00:00:00 2001
From: Matthew Pickering <matthewtpickering@gmail.com>
Date: Thu, 16 May 2024 13:52:31 +0100
Subject: [PATCH] Add extra ghc options to multi-repl file

These options are configured into the program by Cabal, so we also need
to extract these and put them into the mutli-file.

Fixes #10015
---
 .../src/Distribution/Simple/GHC/Build/Link.hs |  4 +-
 .../MultiRepl/ExtraOptions/CHANGELOG.md       |  5 +++
 .../MultiRepl/ExtraOptions/LICENSE            | 30 ++++++++++++++
 .../MultiRepl/ExtraOptions/app/Main.hs        | 10 +++++
 .../MultiRepl/ExtraOptions/cabal.out          | 13 +++++++
 .../MultiRepl/ExtraOptions/cabal.project      |  6 +++
 .../MultiRepl/ExtraOptions/cabal.test.hs      |  6 +++
 .../ExtraOptions/extra-options.cabal          | 39 +++++++++++++++++++
 .../MultiRepl/ExtraOptions/src/MyLib.hs       |  6 +++
 .../MultiRepl/ExtraOptions/test/Main.hs       |  6 +++
 10 files changed, 124 insertions(+), 1 deletion(-)
 create mode 100644 cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/CHANGELOG.md
 create mode 100644 cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/LICENSE
 create mode 100644 cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/app/Main.hs
 create mode 100644 cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/cabal.out
 create mode 100644 cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/cabal.project
 create mode 100644 cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/cabal.test.hs
 create mode 100644 cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/extra-options.cabal
 create mode 100644 cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/src/MyLib.hs
 create mode 100644 cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/test/Main.hs

diff --git a/Cabal/src/Distribution/Simple/GHC/Build/Link.hs b/Cabal/src/Distribution/Simple/GHC/Build/Link.hs
index 9f454e0ea5..ee0f21ffa6 100644
--- a/Cabal/src/Distribution/Simple/GHC/Build/Link.hs
+++ b/Cabal/src/Distribution/Simple/GHC/Build/Link.hs
@@ -711,7 +711,9 @@ runReplOrWriteFlags ghcProg lbi rflags ghcOpts pkg_name target =
           writeFileAtomic (out_dir </> this_unit) $
             BS.pack $
               escapeArgs $
-                extra_opts ++ renderGhcOptions comp platform (ghcOpts{ghcOptMode = NoFlag})
+                extra_opts
+                  ++ renderGhcOptions comp platform (ghcOpts{ghcOptMode = NoFlag})
+                  ++ programOverrideArgs ghcProg
 
 replNoLoad :: Ord a => ReplOptions -> NubListR a -> NubListR a
 replNoLoad replFlags l
diff --git a/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/CHANGELOG.md b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/CHANGELOG.md
new file mode 100644
index 0000000000..fd67fc8144
--- /dev/null
+++ b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Revision history for extra-options
+
+## 0.1.0.0 -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
diff --git a/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/LICENSE b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/LICENSE
new file mode 100644
index 0000000000..5c92e310c8
--- /dev/null
+++ b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2024, Matthew Pickering
+
+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 Matthew Pickering 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.
diff --git a/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/app/Main.hs b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/app/Main.hs
new file mode 100644
index 0000000000..576a1174fe
--- /dev/null
+++ b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/app/Main.hs
@@ -0,0 +1,10 @@
+module Main where
+
+import qualified MyLib (someFunc)
+
+#ifdef FOO
+main :: IO ()
+main = do
+  putStrLn "Hello, Haskell!"
+  MyLib.someFunc
+#endif
diff --git a/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/cabal.out b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/cabal.out
new file mode 100644
index 0000000000..2032e6d454
--- /dev/null
+++ b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/cabal.out
@@ -0,0 +1,13 @@
+# cabal v2-repl
+Resolving dependencies...
+Build profile: -w ghc-<GHCVER> -O1
+In order, the following will be built:
+ - extra-options-0.1.0.0 (interactive) (lib) (first run)
+ - extra-options-0.1.0.0 (interactive) (test:extra-options-test) (first run)
+ - extra-options-0.1.0.0 (interactive) (exe:extra-options) (first run)
+Configuring library for extra-options-0.1.0.0...
+Preprocessing library for extra-options-0.1.0.0...
+Configuring test suite 'extra-options-test' for extra-options-0.1.0.0...
+Preprocessing test suite 'extra-options-test' for extra-options-0.1.0.0...
+Configuring executable 'extra-options' for extra-options-0.1.0.0...
+Preprocessing executable 'extra-options' for extra-options-0.1.0.0...
diff --git a/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/cabal.project b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/cabal.project
new file mode 100644
index 0000000000..f991c04133
--- /dev/null
+++ b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/cabal.project
@@ -0,0 +1,6 @@
+packages: .
+
+tests: True
+
+program-options
+  ghc-options: -XCPP -DFOO
diff --git a/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/cabal.test.hs b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/cabal.test.hs
new file mode 100644
index 0000000000..313609f30a
--- /dev/null
+++ b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/cabal.test.hs
@@ -0,0 +1,6 @@
+import Test.Cabal.Prelude
+
+main = do
+  cabalTest $ do
+    skipUnlessGhcVersion ">= 9.4"
+    void $ cabalWithStdin "v2-repl" ["--enable-multi-repl","all"] ""
diff --git a/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/extra-options.cabal b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/extra-options.cabal
new file mode 100644
index 0000000000..e1b9c13aad
--- /dev/null
+++ b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/extra-options.cabal
@@ -0,0 +1,39 @@
+cabal-version:   3.0
+name:            extra-options
+version:         0.1.0.0
+license:         BSD-3-Clause
+license-file:    LICENSE
+author:          Matthew Pickering
+maintainer:      matthewtpickering@gmail.com
+build-type:      Simple
+extra-doc-files: CHANGELOG.md
+
+common warnings
+    ghc-options: -Wall
+
+library
+    import:           warnings
+    exposed-modules:  MyLib
+    build-depends:    base
+    hs-source-dirs:   src
+    default-language: Haskell2010
+
+executable extra-options
+    import:           warnings
+    main-is:          Main.hs
+    build-depends:
+        base,
+        extra-options
+
+    hs-source-dirs:   app
+    default-language: Haskell2010
+
+test-suite extra-options-test
+    import:           warnings
+    default-language: Haskell2010
+    type:             exitcode-stdio-1.0
+    hs-source-dirs:   test
+    main-is:          Main.hs
+    build-depends:
+        base,
+        extra-options
diff --git a/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/src/MyLib.hs b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/src/MyLib.hs
new file mode 100644
index 0000000000..acdf14c0c9
--- /dev/null
+++ b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/src/MyLib.hs
@@ -0,0 +1,6 @@
+module MyLib (someFunc) where
+
+#ifdef FOO
+someFunc :: IO ()
+someFunc = putStrLn "someFunc"
+#endif
diff --git a/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/test/Main.hs b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/test/Main.hs
new file mode 100644
index 0000000000..f60b8ae537
--- /dev/null
+++ b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/test/Main.hs
@@ -0,0 +1,6 @@
+module Main (main) where
+
+#ifdef FOO
+main :: IO ()
+main = putStrLn "Test suite not yet implemented."
+#endif
-- 
GitLab