Skip to content

Commit a0538d9

Browse files
authored
Merge pull request #9134 from jasagredo/jasagredo/each-pkgconfig-once
Try each pkg-config query separatedly
2 parents a180fba + 9f15045 commit a0538d9

File tree

4 files changed

+36
-7
lines changed

4 files changed

+36
-7
lines changed

Cabal/src/Distribution/Simple/Program/Builtin.hs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,4 +400,11 @@ pkgConfigProgram :: Program
400400
pkgConfigProgram =
401401
(simpleProgram "pkg-config")
402402
{ programFindVersion = findProgramVersion "--version" id
403+
, programPostConf = \_ pkgConfProg ->
404+
let programOverrideEnv' =
405+
programOverrideEnv pkgConfProg
406+
++ [ ("PKG_CONFIG_ALLOW_SYSTEM_CFLAGS", Just "1")
407+
, ("PKG_CONFIG_ALLOW_SYSTEM_LIBS", Just "1")
408+
]
409+
in pure $ pkgConfProg{programOverrideEnv = programOverrideEnv'}
403410
}

cabal-install-solver/src/Distribution/Solver/Types/PkgConfigDb.hs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,18 @@ readPkgConfigDb verbosity progdb = handle ioErrorHandler $ do
7070
(pkgVersions, _errs, exitCode) <-
7171
getProgramInvocationOutputAndErrors verbosity
7272
(programInvocation pkgConfig ("--modversion" : pkgNames))
73-
case exitCode of
74-
ExitSuccess -> (return . pkgConfigDbFromList . zip pkgNames) (lines pkgVersions)
75-
-- if there's a single broken pc file the above fails, so we fall back into calling it individually
76-
_ -> do
77-
info verbosity ("call to pkg-config --modversion on all packages failed. Falling back to querying pkg-config individually on each package")
78-
pkgConfigDbFromList . catMaybes <$> mapM (getIndividualVersion pkgConfig) pkgNames
73+
if exitCode == ExitSuccess && length pkgNames == length pkgList
74+
then (return . pkgConfigDbFromList . zip pkgNames) (lines pkgVersions)
75+
else
76+
-- if there's a single broken pc file the above fails, so we fall back
77+
-- into calling it individually
78+
--
79+
-- Also some implementations of @pkg-config@ do not provide more than
80+
-- one package version, so if the returned list is shorter than the
81+
-- requested one, we fall back to querying one by one.
82+
do
83+
info verbosity ("call to pkg-config --modversion on all packages failed. Falling back to querying pkg-config individually on each package")
84+
pkgConfigDbFromList . catMaybes <$> mapM (getIndividualVersion pkgConfig) pkgNames
7985
where
8086
-- For when pkg-config invocation fails (possibly because of a
8187
-- too long command line).
@@ -92,7 +98,7 @@ readPkgConfigDb verbosity progdb = handle ioErrorHandler $ do
9298
getIndividualVersion pkgConfig pkg = do
9399
(pkgVersion, _errs, exitCode) <-
94100
getProgramInvocationOutputAndErrors verbosity
95-
(programInvocation pkgConfig ["--modversion",pkg])
101+
(programInvocation pkgConfig ["--modversion", pkg])
96102
return $ case exitCode of
97103
ExitSuccess -> Just (pkg, pkgVersion)
98104
_ -> Nothing

changelog.d/pkgconfig-envvars

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
synopsis: PkgConfig environment variables
2+
prs: #9134
3+
4+
description: {
5+
6+
- `cabal` invokes `pkg-config` with `PKG_CONFIG_ALLOW_SYSTEM_CFLAGS` and `PKG_CONFIG_ALLOW_SYSTEM_LIBS` set
7+
8+
}

changelog.d/pkgconfig-once

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
synopsis: PkgConfig individual calls
2+
prs: #9134
3+
4+
description: {
5+
6+
- `cabal` invokes `pkg-config` individually for each lib if querying for all doesn't return the expected result
7+
8+
}

0 commit comments

Comments
 (0)