diff --git a/cabal-debian.cabal b/cabal-debian.cabal
--- a/cabal-debian.cabal
+++ b/cabal-debian.cabal
@@ -1,6 +1,6 @@
 cabal-version:  3.0
 Name:           cabal-debian
-Version:        5.2.4
+Version:        5.2.5
 Copyright:      Copyright (c) 2007-2014, David Fox, Jeremy Shaw; 2017-2024 Clint Adams
 License:        BSD-3-Clause
 License-File:   LICENSE
@@ -136,7 +136,7 @@
   test-data/artvaluereport2/output/debian/artvaluereport2-backups.install
   test-data/artvaluereport2/output/debian/copyright
   test-data/artvaluereport2/output/debian/source/format
-Tested-With:    GHC ==9.10.1 || ==9.8.2 || ==9.6.6
+Tested-With:    GHC ==9.12.1 || ==9.10.1 || ==9.8.2 || ==9.6.6
 
 Source-Repository head
   type: git
@@ -149,11 +149,11 @@
   Build-Depends:
     base >= 4.17 && < 5,
     bifunctors,
-    Cabal >= 3.0,
+    Cabal >= 3.0 && < 3.15,
     containers,
     data-default,
     deepseq,
-    Diff >= 0.3.1,
+    Diff >= 0.3.1 && < 2,
     directory,
     exceptions,
     filepath,
@@ -218,7 +218,7 @@
   Build-Depends:
     base >= 4.17 && <5,
     cabal-debian,
-    Cabal >= 3.0,
+    Cabal >= 3.0 && < 3.15,
     debian >= 3.95,
     lens,
     mtl,
@@ -233,10 +233,10 @@
   Build-Depends:
     base >= 4.17 && < 5,
     cabal-debian,
-    Cabal >= 3.0,
+    Cabal >= 3.0 && < 3.15,
     containers,
     debian >= 3.95,
-    Diff >= 0.3.1,
+    Diff >= 0.3.1 && < 2,
     directory,
     filepath,
     hsemail >= 2,
diff --git a/src/Debian/Debianize/Finalize.hs b/src/Debian/Debianize/Finalize.hs
--- a/src/Debian/Debianize/Finalize.hs
+++ b/src/Debian/Debianize/Finalize.hs
@@ -62,6 +62,9 @@
 import System.IO (hPutStrLn, stderr)
 import Text.Parsec.Rfc2822 (NameAddr(..))
 import Distribution.Pretty (Pretty(pretty))
+#if MIN_VERSION_Cabal(3,14,0)
+import Distribution.Utils.Path (interpretSymbolicPath)
+#endif
 
 -- | @debianize customize@ initializes the CabalT state from the
 -- environment and the cabal package description in (and possibly the
@@ -582,7 +585,12 @@
            installedExec = Set.unions (Map.elems installedExecMap)
 
        prefixPath <- dataTop
-       let dataFilePaths = Set.fromList (zip (List.map (prefixPath </>) (Cabal.dataFiles pkgDesc)) (Cabal.dataFiles pkgDesc)) :: Set (FilePath, FilePath)
+#if MIN_VERSION_Cabal(3,14,0)
+       let dFpD = List.map (interpretSymbolicPath Nothing) (Cabal.dataFiles pkgDesc)
+#else
+       let dFpD = Cabal.dataFiles pkgDesc
+#endif
+           dataFilePaths = Set.fromList (zip (List.map (prefixPath </>) dFpD) dFpD) :: Set (FilePath, FilePath)
            execFilePaths :: Set FilePath
            execFilePaths = Set.map (unUnqualComponentName . Cabal.exeName) (Set.filter (Cabal.buildable . Cabal.buildInfo) (Set.fromList (Cabal.executables pkgDesc))) :: Set FilePath
        let availableData = Set.union installedData dataFilePaths
diff --git a/src/Debian/Debianize/InputCabal.hs b/src/Debian/Debianize/InputCabal.hs
--- a/src/Debian/Debianize/InputCabal.hs
+++ b/src/Debian/Debianize/InputCabal.hs
@@ -26,7 +26,12 @@
 import Distribution.PackageDescription.Parsec (readGenericPackageDescription)
 #endif
 import Distribution.Types.ComponentRequestedSpec (ComponentRequestedSpec(ComponentRequestedSpec))
+#if MIN_VERSION_Cabal(3,14,0)
+import Distribution.Simple.Utils (defaultPackageDescCwd, die', setupMessage)
+import Distribution.Utils.Path (relativeSymbolicPath)
+#else
 import Distribution.Simple.Utils (defaultPackageDesc, die', setupMessage)
+#endif
 import Distribution.System as Cabal (buildArch, Platform(..))
 import qualified Distribution.System as Cabal (buildOS)
 #if MIN_VERSION_Cabal(3,2,0)
@@ -54,7 +59,11 @@
         -- Load a GenericPackageDescription from the current directory
         -- and from that create a finalized PackageDescription for the
         -- given CompilerId.
+#if MIN_VERSION_Cabal(3,14,0)
+        genPkgDesc <- liftIO $ defaultPackageDescCwd vb >>= readGenericPackageDescription vb Nothing . relativeSymbolicPath
+#else
         genPkgDesc <- liftIO $ defaultPackageDesc vb >>= readGenericPackageDescription vb
+#endif
         let finalized = finalizePD (mkFlagAssignment (toList fs)) (ComponentRequestedSpec True False) (const True) (Platform buildArch Cabal.buildOS) cinfo [] genPkgDesc
         ePkgDesc <- either (return . Left)
                            (\ (pkgDesc, _) -> do liftIO $ bracket (setFileCreationMask 0o022) setFileCreationMask $ \ _ -> autoreconf vb pkgDesc
diff --git a/src/Debian/Debianize/InputDebian.hs b/src/Debian/Debianize/InputDebian.hs
--- a/src/Debian/Debianize/InputDebian.hs
+++ b/src/Debian/Debianize/InputDebian.hs
@@ -1,4 +1,5 @@
 -- | Read an existing Debianization from a directory file.
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE DeriveDataTypeable, FlexibleInstances, ScopedTypeVariables, TypeSynonymInstances #-}
 {-# OPTIONS_GHC -Wall -fno-warn-orphans #-}
 module Debian.Debianize.InputDebian
@@ -38,6 +39,9 @@
 --import Debug.Trace (trace)
 import Distribution.Package (PackageIdentifier(..), unPackageName)
 import qualified Distribution.PackageDescription as Cabal (dataDir, PackageDescription(package))
+#if MIN_VERSION_Cabal(3,14,0)
+import Distribution.Utils.Path (interpretSymbolicPath)
+#endif
 import Prelude hiding (break, lines, log, null, readFile, sum, words)
 import System.Directory (doesFileExist)
 import System.FilePath ((</>), dropExtension, takeExtension)
@@ -298,6 +302,10 @@
 dataTop :: Monad m => CabalT m FilePath
 dataTop = do
   d <- use packageDescription
+#if MIN_VERSION_Cabal(3,14,0)
+  return $ case interpretSymbolicPath Nothing (Cabal.dataDir d) of
+#else
   return $ case Cabal.dataDir d of
+#endif
              "" -> "."
              x -> x
diff --git a/src/Debian/Debianize/Output.hs b/src/Debian/Debianize/Output.hs
--- a/src/Debian/Debianize/Output.hs
+++ b/src/Debian/Debianize/Output.hs
@@ -1,6 +1,7 @@
 -- | Wrappers around the debianization function to perform various
 -- tasks - output, describe, validate a debianization, run an external
 -- script to produce a debianization.
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE FlexibleInstances, OverloadedStrings, ScopedTypeVariables, StandaloneDeriving, TupleSections, TypeSynonymInstances, RankNTypes #-}
 {-# OPTIONS -Wall -fno-warn-name-shadowing -fno-warn-orphans #-}
@@ -22,7 +23,11 @@
 import Control.Monad.Fail (MonadFail)
 import Control.Monad.State (get, put, StateT)
 import Control.Monad.Trans (liftIO, MonadIO)
+#if MIN_VERSION_Diff(1,0,0)
+import Data.Algorithm.DiffContext (getContextDiff, prettyContextDiff, unnumber)
+#else
 import Data.Algorithm.DiffContext (getContextDiff, prettyContextDiff)
+#endif
 import Data.Map as Map (elems, toList)
 import Data.Maybe (fromMaybe)
 import Data.Text as Text (split, Text, unpack)
@@ -171,7 +176,11 @@
       doFile path (Just o) (Just n) =
           if o == n
           then Nothing -- Just (path ++ ": Unchanged\n")
+#if MIN_VERSION_Diff(1,0,0)
+          else Just (show (prettyContextDiff (text ("old" </> path)) (text ("new" </> path)) (text . unpack . unnumber) (getContextDiff (Just 2) (split (== '\n') o) (split (== '\n') n))))
+#else
           else Just (show (prettyContextDiff (text ("old" </> path)) (text ("new" </> path)) (text . unpack) (getContextDiff 2 (split (== '\n') o) (split (== '\n') n))))
+#endif
       doFile _path Nothing Nothing = error "Internal error in zipMaps"
 
 -- | Make sure the new debianization matches the existing
