From 312a4124e3e197e3525f60d5b9684e208e1c8df4 Mon Sep 17 00:00:00 2001
From: Teo Camarasu <teo.camarasu@tracsis.com>
Date: Wed, 24 Apr 2024 11:47:53 +0100
Subject: [PATCH] Downgrade NoLibraryFound from an error to a warning

This makes Setup copy/install succeed if there's
nothing to do because the package doesn't contain
a library or executable.

This allows downstream users of Cabal to avoid having to
add workarounds for this edge case.

Resolves #6750
---
 Cabal/src/Distribution/Simple/Errors.hs           |  3 ++-
 Cabal/src/Distribution/Simple/Install.hs          |  2 +-
 .../OnlyTestSuite/OnlyTestSuite.cabal             | 15 +++++++++++++++
 .../PackageTests/OnlyTestSuite/cabal.cabal.out    |  6 ++++++
 .../PackageTests/OnlyTestSuite/cabal.out          |  6 ++++++
 .../PackageTests/OnlyTestSuite/cabal.test.hs      |  6 ++++++
 .../PackageTests/OnlyTestSuite/test/Main.hs       |  4 ++++
 changelog.d/issue-6750                            | 13 +++++++++++++
 8 files changed, 53 insertions(+), 2 deletions(-)
 create mode 100644 cabal-testsuite/PackageTests/OnlyTestSuite/OnlyTestSuite.cabal
 create mode 100644 cabal-testsuite/PackageTests/OnlyTestSuite/cabal.cabal.out
 create mode 100644 cabal-testsuite/PackageTests/OnlyTestSuite/cabal.out
 create mode 100644 cabal-testsuite/PackageTests/OnlyTestSuite/cabal.test.hs
 create mode 100644 cabal-testsuite/PackageTests/OnlyTestSuite/test/Main.hs
 create mode 100644 changelog.d/issue-6750

diff --git a/Cabal/src/Distribution/Simple/Errors.hs b/Cabal/src/Distribution/Simple/Errors.hs
index 45029565e9..8513f92c7b 100644
--- a/Cabal/src/Distribution/Simple/Errors.hs
+++ b/Cabal/src/Distribution/Simple/Errors.hs
@@ -47,7 +47,8 @@ data CabalException
   | EnableBenchMark
   | BenchMarkNameDisabled String
   | NoBenchMark String
-  | NoLibraryFound
+  | -- | @NoLibraryFound@ has been downgraded to a warning, and is therefore no longer emitted.
+    NoLibraryFound
   | CompilerNotInstalled CompilerFlavor
   | CantFindIncludeFile String
   | UnsupportedTestSuite String
diff --git a/Cabal/src/Distribution/Simple/Install.hs b/Cabal/src/Distribution/Simple/Install.hs
index c1134e2b35..c46f28b352 100644
--- a/Cabal/src/Distribution/Simple/Install.hs
+++ b/Cabal/src/Distribution/Simple/Install.hs
@@ -147,7 +147,7 @@ install_setupHooks
 
       checkHasLibsOrExes =
         unless (hasLibs pkg_descr || hasForeignLibs pkg_descr || hasExes pkg_descr) $
-          dieWithException verbosity NoLibraryFound
+          warn verbosity "No executables and no library found. Nothing to do."
 
 -- | Copy package global files.
 copyPackage
diff --git a/cabal-testsuite/PackageTests/OnlyTestSuite/OnlyTestSuite.cabal b/cabal-testsuite/PackageTests/OnlyTestSuite/OnlyTestSuite.cabal
new file mode 100644
index 0000000000..c449f91998
--- /dev/null
+++ b/cabal-testsuite/PackageTests/OnlyTestSuite/OnlyTestSuite.cabal
@@ -0,0 +1,15 @@
+cabal-version:      3.0
+name:               OnlyTestSuite
+version:            0.1.0.0
+build-type:         Simple
+
+common warnings
+    ghc-options: -Wall
+
+test-suite OnlyTestSuite-test
+    import:           warnings
+    default-language: Haskell2010
+    type:             exitcode-stdio-1.0
+    hs-source-dirs:   test
+    main-is:          Main.hs
+    build-depends:    base
diff --git a/cabal-testsuite/PackageTests/OnlyTestSuite/cabal.cabal.out b/cabal-testsuite/PackageTests/OnlyTestSuite/cabal.cabal.out
new file mode 100644
index 0000000000..829de87b0c
--- /dev/null
+++ b/cabal-testsuite/PackageTests/OnlyTestSuite/cabal.cabal.out
@@ -0,0 +1,6 @@
+# Setup configure
+Configuring OnlyTestSuite-0.1.0.0...
+# Setup build
+Building OnlyTestSuite-0.1.0.0...
+# Setup copy
+Warning: No executables and no library found. Nothing to do.
diff --git a/cabal-testsuite/PackageTests/OnlyTestSuite/cabal.out b/cabal-testsuite/PackageTests/OnlyTestSuite/cabal.out
new file mode 100644
index 0000000000..829de87b0c
--- /dev/null
+++ b/cabal-testsuite/PackageTests/OnlyTestSuite/cabal.out
@@ -0,0 +1,6 @@
+# Setup configure
+Configuring OnlyTestSuite-0.1.0.0...
+# Setup build
+Building OnlyTestSuite-0.1.0.0...
+# Setup copy
+Warning: No executables and no library found. Nothing to do.
diff --git a/cabal-testsuite/PackageTests/OnlyTestSuite/cabal.test.hs b/cabal-testsuite/PackageTests/OnlyTestSuite/cabal.test.hs
new file mode 100644
index 0000000000..6e715d370e
--- /dev/null
+++ b/cabal-testsuite/PackageTests/OnlyTestSuite/cabal.test.hs
@@ -0,0 +1,6 @@
+import Test.Cabal.Prelude
+main = setupAndCabalTest $ do
+  withPackageDb $ do
+    setup "configure" []
+    setup "build" []
+    setup "copy" []
diff --git a/cabal-testsuite/PackageTests/OnlyTestSuite/test/Main.hs b/cabal-testsuite/PackageTests/OnlyTestSuite/test/Main.hs
new file mode 100644
index 0000000000..3e2059e31f
--- /dev/null
+++ b/cabal-testsuite/PackageTests/OnlyTestSuite/test/Main.hs
@@ -0,0 +1,4 @@
+module Main (main) where
+
+main :: IO ()
+main = putStrLn "Test suite not yet implemented."
diff --git a/changelog.d/issue-6750 b/changelog.d/issue-6750
new file mode 100644
index 0000000000..e392258267
--- /dev/null
+++ b/changelog.d/issue-6750
@@ -0,0 +1,13 @@
+synopsis: Make Setup copy/install succeed when there's no executable or library
+packages: Cabal
+prs: #9926
+issues: #6750
+
+description: {
+  Historically the Setup copy and install steps would fail if the package didn't
+  contain an executable or library component. In this case there's nothing to do.
+
+  This required workarounds for downstream users of Cabal to handle this edge case.
+  Now that this error has been downgraded to a warning, Cabal will succeed if 
+  there's nothing to do.
+}
-- 
GitLab