From 3e31042a1e2a0e5766ddb54ad7b3dad34e86e121 Mon Sep 17 00:00:00 2001 From: Francesco Gazzetta Date: Sat, 8 Jun 2019 21:35:37 +0200 Subject: [PATCH] Add a flag to allow depending on private libraries This is intended to be used by tools like cabal-install so they can add multilibs-compatibility even to older ghcs --- Cabal/Distribution/Simple/Configure.hs | 9 ++++++++- Cabal/Distribution/Simple/Setup.hs | 13 ++++++++++++- cabal-install/Distribution/Client/Config.hs | 3 ++- .../Distribution/Client/ProjectConfig/Legacy.hs | 6 ++++-- .../Distribution/Client/ProjectPlanning.hs | 3 +++ 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/Cabal/Distribution/Simple/Configure.hs b/Cabal/Distribution/Simple/Configure.hs index e0b850291d7..e0fee661d2d 100644 --- a/Cabal/Distribution/Simple/Configure.hs +++ b/Cabal/Distribution/Simple/Configure.hs @@ -477,6 +477,7 @@ configure (pkg_descr0, pbi) cfg = do (dependencySatisfiable use_external_internal_deps (fromFlagOrDefault False (configExactConfiguration cfg)) + (fromFlagOrDefault False (configAllowDependingOnPrivateLibs cfg)) (packageName pkg_descr0) installedPackageSet internalPackageSet @@ -882,6 +883,7 @@ getInternalPackages pkg_descr0 = dependencySatisfiable :: Bool -- ^ use external internal deps? -> Bool -- ^ exact configuration? + -> Bool -- ^ allow depending on private libs? -> PackageName -> InstalledPackageIndex -- ^ installed set -> Map PackageName (Maybe UnqualComponentName) -- ^ internal set @@ -890,7 +892,9 @@ dependencySatisfiable -> (Dependency -> Bool) dependencySatisfiable use_external_internal_deps - exact_config pn installedPackageSet internalPackageSet requiredDepsMap + exact_config + allow_private_deps + pn installedPackageSet internalPackageSet requiredDepsMap (Dependency depName vr sublibs) | exact_config @@ -951,6 +955,9 @@ dependencySatisfiable visible lib = maybe False -- Does not even exist (wasn't in the depsMap) (\ipi -> Installed.libVisibility ipi == LibraryVisibilityPublic + -- If the override is enabled, the visibility does + -- not matter (it's handled externally) + || allow_private_deps -- If it's a library of the same package then it's -- always visible. -- This is only triggered when passing a component diff --git a/Cabal/Distribution/Simple/Setup.hs b/Cabal/Distribution/Simple/Setup.hs index c778d407a61..498b8a83712 100644 --- a/Cabal/Distribution/Simple/Setup.hs +++ b/Cabal/Distribution/Simple/Setup.hs @@ -273,9 +273,13 @@ data ConfigFlags = ConfigFlags { -- ^Halt and show an error message indicating an error in flag assignment configRelocatable :: Flag Bool, -- ^ Enable relocatable package built configDebugInfo :: Flag DebugInfoLevel, -- ^ Emit debug info. - configUseResponseFiles :: Flag Bool + configUseResponseFiles :: Flag Bool, -- ^ Whether to use response files at all. They're used for such tools -- as haddock, or or ld. + configAllowDependingOnPrivateLibs :: Flag Bool + -- ^ Allow depending on private sublibraries. This is used by external + -- tools (like cabal-install) so they can add multiple-public-libraries + -- compatibility to older ghcs by checking visibility externally. } deriving (Generic, Read, Show) @@ -703,6 +707,13 @@ configureOptions showOrParseArgs = configUseResponseFiles (\v flags -> flags { configUseResponseFiles = v }) (boolOpt' ([], ["disable-response-files"]) ([], [])) + + ,option "" ["allow-depending-on-private-libs"] + ( "Allow depending on private libraries. " + ++ "If set, the library visibility check MUST be done externally." ) + configAllowDependingOnPrivateLibs + (\v flags -> flags { configAllowDependingOnPrivateLibs = v }) + trueArg ] where liftInstallDirs = diff --git a/cabal-install/Distribution/Client/Config.hs b/cabal-install/Distribution/Client/Config.hs index b23de306203..51ff20a4433 100644 --- a/cabal-install/Distribution/Client/Config.hs +++ b/cabal-install/Distribution/Client/Config.hs @@ -413,7 +413,8 @@ instance Semigroup SavedConfig where configExactConfiguration = combine configExactConfiguration, configFlagError = combine configFlagError, configRelocatable = combine configRelocatable, - configUseResponseFiles = combine configUseResponseFiles + configUseResponseFiles = combine configUseResponseFiles, + configAllowDependingOnPrivateLibs = combine configAllowDependingOnPrivateLibs } where combine = combine' savedConfigureFlags diff --git a/cabal-install/Distribution/Client/ProjectConfig/Legacy.hs b/cabal-install/Distribution/Client/ProjectConfig/Legacy.hs index 7e0e65733e9..9d143c8045e 100644 --- a/cabal-install/Distribution/Client/ProjectConfig/Legacy.hs +++ b/cabal-install/Distribution/Client/ProjectConfig/Legacy.hs @@ -687,7 +687,8 @@ convertToLegacyAllPackageConfig configFlagError = mempty, --TODO: ??? configRelocatable = mempty, configDebugInfo = mempty, - configUseResponseFiles = mempty + configUseResponseFiles = mempty, + configAllowDependingOnPrivateLibs = mempty } haddockFlags = mempty { @@ -757,7 +758,8 @@ convertToLegacyPerPackageConfig PackageConfig {..} = configFlagError = mempty, --TODO: ??? configRelocatable = packageConfigRelocatable, configDebugInfo = packageConfigDebugInfo, - configUseResponseFiles = mempty + configUseResponseFiles = mempty, + configAllowDependingOnPrivateLibs = mempty } installFlags = mempty { diff --git a/cabal-install/Distribution/Client/ProjectPlanning.hs b/cabal-install/Distribution/Client/ProjectPlanning.hs index 054da23a129..a0a6b183547 100644 --- a/cabal-install/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/Distribution/Client/ProjectPlanning.hs @@ -3390,6 +3390,9 @@ setupHsConfigureFlags (ReadyPackage elab@ElaboratedConfiguredPackage{..}) configUserInstall = mempty -- don't rely on defaults configPrograms_ = mempty -- never use, shouldn't exist configUseResponseFiles = mempty + -- TODO set to true when the solver can prevent private-library-deps by itself + -- (issue #6039) + configAllowDependingOnPrivateLibs = mempty setupHsConfigureArgs :: ElaboratedConfiguredPackage -> [String]