From 4f517b41de434ba002e102e8d73c0372a8c5984a Mon Sep 17 00:00:00 2001 From: Tommy Bidne Date: Tue, 3 Mar 2026 10:38:48 +1300 Subject: [PATCH] Require cabal.project packages and/or optional-packages field Currently, if a cabal.project file is present and the `packages` and `optional-packages` fields do not exist, a warning will be issued, and cabal will fail with a different, potentially misleading error message: "There is no .cabal package file or cabal.project file..." This changes it so that the prior warning is now an error, hence will cause cabal to fail before the misleading error is given. That at least one of these fields is required is already specified in the docs, hence this is not a specification change. See #7401. --- .../src/Distribution/Client/DistDirLayout.hs | 6 ++++++ .../src/Distribution/Client/Errors.hs | 9 +++++++++ .../Client/ProjectOrchestration.hs | 4 +++- .../Distribution/Client/ProjectPlanning.hs | 2 +- .../tests/fixtures/configure/cabal.project | 2 ++ .../tests/fixtures/configure/dummy.cabal | 17 ++++++++++++++++ .../ProjectPackages/Empty/cabal.out | 11 ++++++++++ .../ProjectPackages/Empty/cabal.test.hs | 5 +++++ .../ProjectPackages/FieldNoCabal/cabal.out | 2 ++ .../FieldNoCabal/cabal.project | 1 + .../FieldNoCabal/cabal.test.hs | 9 +++++++++ .../ProjectPackages/MultiLocalField/cabal.out | 10 ++++++++++ .../MultiLocalField/cabal.project | 1 + .../MultiLocalField/cabal.project.local | 1 + .../MultiLocalField/cabal.test.hs | 5 +++++ .../MultiLocalField/main.cabal | 14 +++++++++++++ .../ProjectPackages/MultiNoField/cabal.out | 7 +++++++ .../MultiNoField/cabal.project | 1 + .../MultiNoField/cabal.project.local | 1 + .../MultiNoField/cabal.test.hs | 5 +++++ .../ProjectPackages/MultiNoField/main.cabal | 14 +++++++++++++ .../ProjectPackages/NoField/cabal.out | 7 +++++++ .../ProjectPackages/NoField/cabal.project | 1 + .../ProjectPackages/NoField/cabal.test.hs | 5 +++++ .../ProjectPackages/NoField/main.cabal | 14 +++++++++++++ .../ProjectPackages/NoFieldNoCabal/cabal.out | 7 +++++++ .../NoFieldNoCabal/cabal.project | 1 + .../NoFieldNoCabal/cabal.test.hs | 5 +++++ .../ProjectPackages/OtherNoField/cabal.out | 7 +++++++ .../OtherNoField/cabal.test.hs | 5 +++++ .../OtherNoField/dir/cabal.project | 1 + .../ProjectPackages/OtherNoField/main.cabal | 14 +++++++++++++ .../ProjectPackages/ParentNoField/cabal.out | 9 +++++++++ .../ParentNoField/cabal.project | 1 + .../ParentNoField/cabal.test.hs | 5 +++++ .../ParentNoField/dir/main.cabal | 14 +++++++++++++ .../ReplProjectTargetTwoPkgs/cabal.out | 5 ++--- changelog.d/pr-11574 | 20 +++++++++++++++++++ 38 files changed, 243 insertions(+), 5 deletions(-) create mode 100644 cabal-install/tests/fixtures/configure/dummy.cabal create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/Empty/cabal.out create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/Empty/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/FieldNoCabal/cabal.out create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/FieldNoCabal/cabal.project create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/FieldNoCabal/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.out create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.project create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.project.local create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/main.cabal create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.out create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.project create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.project.local create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/main.cabal create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/NoField/cabal.out create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/NoField/cabal.project create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/NoField/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/NoField/main.cabal create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/NoFieldNoCabal/cabal.out create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/NoFieldNoCabal/cabal.project create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/NoFieldNoCabal/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/cabal.out create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/dir/cabal.project create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/main.cabal create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/cabal.out create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/cabal.project create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/dir/main.cabal create mode 100644 changelog.d/pr-11574 diff --git a/cabal-install/src/Distribution/Client/DistDirLayout.hs b/cabal-install/src/Distribution/Client/DistDirLayout.hs index 64140152453..0a6e51b09e7 100644 --- a/cabal-install/src/Distribution/Client/DistDirLayout.hs +++ b/cabal-install/src/Distribution/Client/DistDirLayout.hs @@ -9,6 +9,7 @@ module Distribution.Client.DistDirLayout DistDirLayout (..) , DistDirParams (..) , defaultDistDirLayout + , distProjectFileMain -- * 'ProjectRoot' , ProjectRoot (..) @@ -316,3 +317,8 @@ mkCabalDirLayout mstoreDir mlogDir = do cabalLogsDirectory <- maybe defaultLogsDir pure mlogDir pure $ CabalDirLayout{..} + +-- | Given the 'DistDirLayout''s distProjectFile function, returns the +-- main project file (i.e. cabal.project). +distProjectFileMain :: (String -> FilePath) -> FilePath +distProjectFileMain f = f "" diff --git a/cabal-install/src/Distribution/Client/Errors.hs b/cabal-install/src/Distribution/Client/Errors.hs index 1ac7a595d55..78c1f399cbe 100644 --- a/cabal-install/src/Distribution/Client/Errors.hs +++ b/cabal-install/src/Distribution/Client/Errors.hs @@ -192,6 +192,7 @@ data CabalInstallException | LegacyAndParsecParseResultsDiffer FilePath String String | CabalFileParseFailure CabalFileParseError | ProjectConfigParseFailure ProjectConfigParseError + | ProjectConfigNoPackages FilePath deriving (Show) exceptionCodeCabalInstall :: CabalInstallException -> Int @@ -348,6 +349,7 @@ exceptionCodeCabalInstall e = case e of LegacyAndParsecParseResultsDiffer{} -> 7165 CabalFileParseFailure{} -> 7166 ProjectConfigParseFailure{} -> 7167 + ProjectConfigNoPackages{} -> 7168 exceptionMessageCabalInstall :: CabalInstallException -> String exceptionMessageCabalInstall e = case e of @@ -885,6 +887,13 @@ exceptionMessageCabalInstall e = case e of renderCabalFileParseError cbfError ProjectConfigParseFailure pcfError -> renderProjectConfigParseError pcfError + ProjectConfigNoPackages configPath -> + concat + [ "The project config '" + , configPath + , "' requires at least one of the fields 'packages' " + , "or 'optional-packages', but neither was specified." + ] instance Exception (VerboseException CabalInstallException) where displayException :: VerboseException CabalInstallException -> [Char] diff --git a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs index bcf472e5117..1d5cf59dcb9 100644 --- a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs +++ b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs @@ -307,8 +307,10 @@ establishProjectBaseContextWithRoot verbosity cliConfig projectRoot currentComma projectConfig -- https://github.com/haskell/cabal/issues/6013 + -- https://github.com/haskell/cabal/issues/7401 + let projPath = distProjectFileMain (distProjectFile distDirLayout) when (null (projectPackages projectConfig) && null (projectPackagesOptional projectConfig)) $ - warn verbosity "There are no packages or optional-packages in the project" + dieWithException verbosity (ProjectConfigNoPackages projPath) return ProjectBaseContext diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning.hs b/cabal-install/src/Distribution/Client/ProjectPlanning.hs index f4633696917..8c5dd9c591d 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanning.hs @@ -379,7 +379,7 @@ rebuildProjectConfig configPath <- getConfigFilePath verbosity projectConfigConfigFile return ( configPath - , distProjectFile "" + , distProjectFileMain distProjectFile , (projectConfigHcFlavor, projectConfigHcPath, projectConfigHcPkg) , projectConfigProjectFileParser , progsearchpath diff --git a/cabal-install/tests/fixtures/configure/cabal.project b/cabal-install/tests/fixtures/configure/cabal.project index 8d7afa6e902..1e13703260a 100644 --- a/cabal-install/tests/fixtures/configure/cabal.project +++ b/cabal-install/tests/fixtures/configure/cabal.project @@ -1,2 +1,4 @@ ignore-project: False optimization: 2 + +packages: . diff --git a/cabal-install/tests/fixtures/configure/dummy.cabal b/cabal-install/tests/fixtures/configure/dummy.cabal new file mode 100644 index 00000000000..f3e3d87526d --- /dev/null +++ b/cabal-install/tests/fixtures/configure/dummy.cabal @@ -0,0 +1,17 @@ +cabal-version: 3.0 + +-- Required by ./cabal.project, due to cabal.project requiring a valid +-- packages or optional-packages field. + +name: main +version: 0.1 +build-type: Simple +category: Test +maintainer: Dummy +synopsis: Dummy +description: Dummy +license: BSD-3-Clause + +library + build-depends: base + default-language: Haskell2010 diff --git a/cabal-testsuite/PackageTests/ProjectPackages/Empty/cabal.out b/cabal-testsuite/PackageTests/ProjectPackages/Empty/cabal.out new file mode 100644 index 00000000000..8bb9bcdc12c --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/Empty/cabal.out @@ -0,0 +1,11 @@ +# cabal v2-build +Error: [Cabal-7136] +There is no .cabal package file or cabal.project file. To build packages locally you need at minimum a .cabal file. You can use 'cabal init' to create one. + +For non-trivial projects you will also want a cabal.project file in the root directory of your project. This file lists the packages in your project and all other build configuration. See the Cabal user guide for full details. + +# cabal v2-build +Error: [Cabal-7136] +There is no .cabal package file or cabal.project file. To build packages locally you need at minimum a .cabal file. You can use 'cabal init' to create one. + +For non-trivial projects you will also want a cabal.project file in the root directory of your project. This file lists the packages in your project and all other build configuration. See the Cabal user guide for full details. diff --git a/cabal-testsuite/PackageTests/ProjectPackages/Empty/cabal.test.hs b/cabal-testsuite/PackageTests/ProjectPackages/Empty/cabal.test.hs new file mode 100644 index 00000000000..c4e1063f486 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/Empty/cabal.test.hs @@ -0,0 +1,5 @@ +import Test.Cabal.Prelude + +main = cabalTest $ do + fails $ cabal "v2-build" ["--dry-run"] + fails $ cabal "v2-build" ["--dry-run", "all"] diff --git a/cabal-testsuite/PackageTests/ProjectPackages/FieldNoCabal/cabal.out b/cabal-testsuite/PackageTests/ProjectPackages/FieldNoCabal/cabal.out new file mode 100644 index 00000000000..8165f4408ff --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/FieldNoCabal/cabal.out @@ -0,0 +1,2 @@ +# cabal v2-build +# cabal v2-build diff --git a/cabal-testsuite/PackageTests/ProjectPackages/FieldNoCabal/cabal.project b/cabal-testsuite/PackageTests/ProjectPackages/FieldNoCabal/cabal.project new file mode 100644 index 00000000000..e6fdbadb439 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/FieldNoCabal/cabal.project @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/ProjectPackages/FieldNoCabal/cabal.test.hs b/cabal-testsuite/PackageTests/ProjectPackages/FieldNoCabal/cabal.test.hs new file mode 100644 index 00000000000..670ccac3e7d --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/FieldNoCabal/cabal.test.hs @@ -0,0 +1,9 @@ +import Test.Cabal.Prelude + +main = cabalTest $ do + let expected = "- The package directory '.' does not contain any .cabal file." + r1 <- fails $ cabal' "v2-build" ["--dry-run"] + assertOutputContains expected r1 + + r2 <- fails $ cabal' "v2-build" ["--dry-run", "all"] + assertOutputContains expected r2 diff --git a/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.out b/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.out new file mode 100644 index 00000000000..3618f5c219b --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.out @@ -0,0 +1,10 @@ +# cabal v2-build +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - main-0.1 (lib) (first run) + +# cabal v2-build +Build profile: -w ghc- -O1 +In order, the following would be built: + - main-0.1 (lib) (first run) diff --git a/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.project b/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.project new file mode 100644 index 00000000000..0711ed9dddb --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.project @@ -0,0 +1 @@ +-- empty diff --git a/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.project.local b/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.project.local new file mode 100644 index 00000000000..e6fdbadb439 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.project.local @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.test.hs b/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.test.hs new file mode 100644 index 00000000000..ac01c990e05 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/cabal.test.hs @@ -0,0 +1,5 @@ +import Test.Cabal.Prelude + +main = cabalTest $ do + cabal "v2-build" ["--dry-run"] + cabal "v2-build" ["--dry-run", "all"] diff --git a/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/main.cabal b/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/main.cabal new file mode 100644 index 00000000000..5e11f7c002d --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/MultiLocalField/main.cabal @@ -0,0 +1,14 @@ +cabal-version: 3.0 + +name: main +version: 0.1 +build-type: Simple +category: Test +maintainer: Joe +synopsis: Test input +description: Test input +license: BSD-3-Clause + +library + build-depends: base + default-language: Haskell2010 diff --git a/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.out b/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.out new file mode 100644 index 00000000000..06178c57f4d --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.out @@ -0,0 +1,7 @@ +# cabal v2-build +Error: [Cabal-7168] +The project config '/cabal.project' requires at least one of the fields 'packages' or 'optional-packages', but neither was specified. + +# cabal v2-build +Error: [Cabal-7168] +The project config '/cabal.project' requires at least one of the fields 'packages' or 'optional-packages', but neither was specified. diff --git a/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.project b/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.project new file mode 100644 index 00000000000..0711ed9dddb --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.project @@ -0,0 +1 @@ +-- empty diff --git a/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.project.local b/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.project.local new file mode 100644 index 00000000000..0711ed9dddb --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.project.local @@ -0,0 +1 @@ +-- empty diff --git a/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.test.hs b/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.test.hs new file mode 100644 index 00000000000..c4e1063f486 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/cabal.test.hs @@ -0,0 +1,5 @@ +import Test.Cabal.Prelude + +main = cabalTest $ do + fails $ cabal "v2-build" ["--dry-run"] + fails $ cabal "v2-build" ["--dry-run", "all"] diff --git a/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/main.cabal b/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/main.cabal new file mode 100644 index 00000000000..5e11f7c002d --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/MultiNoField/main.cabal @@ -0,0 +1,14 @@ +cabal-version: 3.0 + +name: main +version: 0.1 +build-type: Simple +category: Test +maintainer: Joe +synopsis: Test input +description: Test input +license: BSD-3-Clause + +library + build-depends: base + default-language: Haskell2010 diff --git a/cabal-testsuite/PackageTests/ProjectPackages/NoField/cabal.out b/cabal-testsuite/PackageTests/ProjectPackages/NoField/cabal.out new file mode 100644 index 00000000000..06178c57f4d --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/NoField/cabal.out @@ -0,0 +1,7 @@ +# cabal v2-build +Error: [Cabal-7168] +The project config '/cabal.project' requires at least one of the fields 'packages' or 'optional-packages', but neither was specified. + +# cabal v2-build +Error: [Cabal-7168] +The project config '/cabal.project' requires at least one of the fields 'packages' or 'optional-packages', but neither was specified. diff --git a/cabal-testsuite/PackageTests/ProjectPackages/NoField/cabal.project b/cabal-testsuite/PackageTests/ProjectPackages/NoField/cabal.project new file mode 100644 index 00000000000..0711ed9dddb --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/NoField/cabal.project @@ -0,0 +1 @@ +-- empty diff --git a/cabal-testsuite/PackageTests/ProjectPackages/NoField/cabal.test.hs b/cabal-testsuite/PackageTests/ProjectPackages/NoField/cabal.test.hs new file mode 100644 index 00000000000..c4e1063f486 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/NoField/cabal.test.hs @@ -0,0 +1,5 @@ +import Test.Cabal.Prelude + +main = cabalTest $ do + fails $ cabal "v2-build" ["--dry-run"] + fails $ cabal "v2-build" ["--dry-run", "all"] diff --git a/cabal-testsuite/PackageTests/ProjectPackages/NoField/main.cabal b/cabal-testsuite/PackageTests/ProjectPackages/NoField/main.cabal new file mode 100644 index 00000000000..5e11f7c002d --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/NoField/main.cabal @@ -0,0 +1,14 @@ +cabal-version: 3.0 + +name: main +version: 0.1 +build-type: Simple +category: Test +maintainer: Joe +synopsis: Test input +description: Test input +license: BSD-3-Clause + +library + build-depends: base + default-language: Haskell2010 diff --git a/cabal-testsuite/PackageTests/ProjectPackages/NoFieldNoCabal/cabal.out b/cabal-testsuite/PackageTests/ProjectPackages/NoFieldNoCabal/cabal.out new file mode 100644 index 00000000000..06178c57f4d --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/NoFieldNoCabal/cabal.out @@ -0,0 +1,7 @@ +# cabal v2-build +Error: [Cabal-7168] +The project config '/cabal.project' requires at least one of the fields 'packages' or 'optional-packages', but neither was specified. + +# cabal v2-build +Error: [Cabal-7168] +The project config '/cabal.project' requires at least one of the fields 'packages' or 'optional-packages', but neither was specified. diff --git a/cabal-testsuite/PackageTests/ProjectPackages/NoFieldNoCabal/cabal.project b/cabal-testsuite/PackageTests/ProjectPackages/NoFieldNoCabal/cabal.project new file mode 100644 index 00000000000..0711ed9dddb --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/NoFieldNoCabal/cabal.project @@ -0,0 +1 @@ +-- empty diff --git a/cabal-testsuite/PackageTests/ProjectPackages/NoFieldNoCabal/cabal.test.hs b/cabal-testsuite/PackageTests/ProjectPackages/NoFieldNoCabal/cabal.test.hs new file mode 100644 index 00000000000..c4e1063f486 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/NoFieldNoCabal/cabal.test.hs @@ -0,0 +1,5 @@ +import Test.Cabal.Prelude + +main = cabalTest $ do + fails $ cabal "v2-build" ["--dry-run"] + fails $ cabal "v2-build" ["--dry-run", "all"] diff --git a/cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/cabal.out b/cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/cabal.out new file mode 100644 index 00000000000..3b260f99cf8 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/cabal.out @@ -0,0 +1,7 @@ +# cabal v2-build +Error: [Cabal-7168] +The project config '/dir/cabal.project' requires at least one of the fields 'packages' or 'optional-packages', but neither was specified. + +# cabal v2-build +Error: [Cabal-7168] +The project config '/dir/cabal.project' requires at least one of the fields 'packages' or 'optional-packages', but neither was specified. diff --git a/cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/cabal.test.hs b/cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/cabal.test.hs new file mode 100644 index 00000000000..f54919aa525 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/cabal.test.hs @@ -0,0 +1,5 @@ +import Test.Cabal.Prelude + +main = cabalTest $ do + fails $ cabal "v2-build" ["--dry-run", "--project-file", "dir/cabal.project"] + fails $ cabal "v2-build" ["--dry-run", "--project-file", "dir/cabal.project", "all"] diff --git a/cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/dir/cabal.project b/cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/dir/cabal.project new file mode 100644 index 00000000000..0711ed9dddb --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/dir/cabal.project @@ -0,0 +1 @@ +-- empty diff --git a/cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/main.cabal b/cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/main.cabal new file mode 100644 index 00000000000..5e11f7c002d --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/OtherNoField/main.cabal @@ -0,0 +1,14 @@ +cabal-version: 3.0 + +name: main +version: 0.1 +build-type: Simple +category: Test +maintainer: Joe +synopsis: Test input +description: Test input +license: BSD-3-Clause + +library + build-depends: base + default-language: Haskell2010 diff --git a/cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/cabal.out b/cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/cabal.out new file mode 100644 index 00000000000..97c26613061 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/cabal.out @@ -0,0 +1,9 @@ +# cabal v2-build +Configuration is affected by cabal.project at ''. +Error: [Cabal-7168] +The project config '/cabal.project' requires at least one of the fields 'packages' or 'optional-packages', but neither was specified. + +# cabal v2-build +Configuration is affected by cabal.project at ''. +Error: [Cabal-7168] +The project config '/cabal.project' requires at least one of the fields 'packages' or 'optional-packages', but neither was specified. diff --git a/cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/cabal.project b/cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/cabal.project new file mode 100644 index 00000000000..0711ed9dddb --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/cabal.project @@ -0,0 +1 @@ +-- empty diff --git a/cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/cabal.test.hs b/cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/cabal.test.hs new file mode 100644 index 00000000000..72c2887a0e4 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/cabal.test.hs @@ -0,0 +1,5 @@ +import Test.Cabal.Prelude + +main = cabalTest $ withDirectory "./dir" $ do + fails $ cabal "v2-build" ["--dry-run"] + fails $ cabal "v2-build" ["--dry-run", "all"] diff --git a/cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/dir/main.cabal b/cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/dir/main.cabal new file mode 100644 index 00000000000..5e11f7c002d --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectPackages/ParentNoField/dir/main.cabal @@ -0,0 +1,14 @@ +cabal-version: 3.0 + +name: main +version: 0.1 +build-type: Simple +category: Test +maintainer: Joe +synopsis: Test input +description: Test input +license: BSD-3-Clause + +library + build-depends: base + default-language: Haskell2010 diff --git a/cabal-testsuite/PackageTests/ReplProjectTargetTwoPkgs/cabal.out b/cabal-testsuite/PackageTests/ReplProjectTargetTwoPkgs/cabal.out index 0ac1db40591..8520b73152f 100644 --- a/cabal-testsuite/PackageTests/ReplProjectTargetTwoPkgs/cabal.out +++ b/cabal-testsuite/PackageTests/ReplProjectTargetTwoPkgs/cabal.out @@ -26,9 +26,8 @@ Please pick a single [package:][ctype:]component (or all) as target for the REPL - pkg-two # checking repl command with an 'empty.project' with no packages # cabal repl -Warning: There are no packages or optional-packages in the project -Error: [Cabal-7076] -There are no packages in 'empty.project'. Please add a package to the project and pick a single [package:][ctype:]component (or all) as target for the REPL command. +Error: [Cabal-7168] +The project config '/empty.project' requires at least one of the fields 'packages' or 'optional-packages', but neither was specified. # checking repl command with a missing 'missing.project' # cabal repl # checking repl command with a missing 'missing.project' diff --git a/changelog.d/pr-11574 b/changelog.d/pr-11574 new file mode 100644 index 00000000000..ecc990b5496 --- /dev/null +++ b/changelog.d/pr-11574 @@ -0,0 +1,20 @@ +synopsis: Require cabal.project packages and/or optional-packages field. +packages: cabal-install +prs: #11574 +issues: #7401 +significance: + +description: { + +Currently, if a cabal.project file is present and the `packages` and +`optional-packages` fields do not exist, a warning will be issued, and +cabal will fail with a different, potentially misleading error message: + + "There is no .cabal package file or cabal.project file..." + +This changes it so that the prior warning is now an error, hence will cause +cabal to fail before the misleading error is given. That at least one of +these fields is required is already specified in the docs, hence this is not +a specification change. + +}