@@ -70,12 +70,18 @@ readPkgConfigDb verbosity progdb = handle ioErrorHandler $ do
70
70
(pkgVersions, _errs, exitCode) <-
71
71
getProgramInvocationOutputAndErrors verbosity
72
72
(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
79
85
where
80
86
-- For when pkg-config invocation fails (possibly because of a
81
87
-- too long command line).
@@ -92,7 +98,7 @@ readPkgConfigDb verbosity progdb = handle ioErrorHandler $ do
92
98
getIndividualVersion pkgConfig pkg = do
93
99
(pkgVersion, _errs, exitCode) <-
94
100
getProgramInvocationOutputAndErrors verbosity
95
- (programInvocation pkgConfig [" --modversion" ,pkg])
101
+ (programInvocation pkgConfig [" --modversion" , pkg])
96
102
return $ case exitCode of
97
103
ExitSuccess -> Just (pkg, pkgVersion)
98
104
_ -> Nothing
0 commit comments