@@ -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
0 commit comments