From 539cb7bcda85dac2a0da5f1357876c4466426776 Mon Sep 17 00:00:00 2001 From: Matthew Pickering Date: Thu, 16 May 2024 13:52:31 +0100 Subject: [PATCH 1/2] 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 9f454e0ea5f..ee0f21ffa6d 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 00000000000..fd67fc8144e --- /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 00000000000..5c92e310c86 --- /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 00000000000..576a1174fe8 --- /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 00000000000..2032e6d4542 --- /dev/null +++ b/cabal-testsuite/PackageTests/MultiRepl/ExtraOptions/cabal.out @@ -0,0 +1,13 @@ +# cabal v2-repl +Resolving dependencies... +Build profile: -w ghc- -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 00000000000..f991c04133a --- /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 00000000000..313609f30ad --- /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 00000000000..e1b9c13aadc --- /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 00000000000..acdf14c0c9e --- /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 00000000000..f60b8ae5379 --- /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 From c3708d21fc39a1bd67bbdee09853bbd3b88e6d1a Mon Sep 17 00:00:00 2001 From: Matthew Pickering Date: Thu, 16 May 2024 14:02:39 +0100 Subject: [PATCH 2/2] Fix rendering of `-j` option in multi-repl Before this was rendered as.. ``` /run/current-system/sw/bin/ghc --interactive -package-env - -j 'NumJobs (Just 8)' ... ``` Due to this place not being updated when support for semaphores was added. --- cabal-install/src/Distribution/Client/CmdRepl.hs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cabal-install/src/Distribution/Client/CmdRepl.hs b/cabal-install/src/Distribution/Client/CmdRepl.hs index 39468a8e545..e381b291d7d 100644 --- a/cabal-install/src/Distribution/Client/CmdRepl.hs +++ b/cabal-install/src/Distribution/Client/CmdRepl.hs @@ -139,6 +139,7 @@ import Distribution.Types.Library ( Library (..) , emptyLibrary ) +import Distribution.Types.ParStrat import Distribution.Types.Version ( Version , mkVersion @@ -467,6 +468,10 @@ replAction flags@NixStyleFlags{extraFlags = r@ReplFlags{..}, ..} targetStrings g in -- GHC considers the last unit passed to be the active one other_units ++ active_unit_files + render_j Serial = "1" + render_j (UseSem n) = show @Int n + render_j (NumJobs mn) = maybe "" (show @Int) mn + -- run ghc --interactive with runProgramInvocation verbosity $ programInvocation ghcProg' $ @@ -475,7 +480,7 @@ replAction flags@NixStyleFlags{extraFlags = r@ReplFlags{..}, ..} targetStrings g , "-package-env" , "-" -- to ignore ghc.environment.* files , "-j" - , show (buildSettingNumJobs (buildSettings ctx)) + , render_j (buildSettingNumJobs (buildSettings ctx)) ] : [ ["-unit", "@" ++ dir unit] | unit <- unit_files_ordered