diff --git a/shake-language-c.cabal b/shake-language-c.cabal
--- a/shake-language-c.cabal
+++ b/shake-language-c.cabal
@@ -13,7 +13,7 @@
 -- limitations under the License.
 
 Name:         shake-language-c
-Version:      0.9.1
+Version:      0.10.0
 Synopsis:     Utilities for cross-compiling with Shake
 Description:  This library provides <http://hackage.haskell.org/package/shake Shake> utilities for cross-compiling @C@, @C++@ and @ObjC@ code for various target platforms. Currently supported target platforms are Android, iOS, Linux, MacOS X, Windows\/MinGW and Google Portable Native Client (PNaCl). Supported host platforms are MacOS X, Linux and Windows.
 Category:     Development
diff --git a/src/Development/Shake/Language/C/Config.hs b/src/Development/Shake/Language/C/Config.hs
--- a/src/Development/Shake/Language/C/Config.hs
+++ b/src/Development/Shake/Language/C/Config.hs
@@ -8,6 +8,7 @@
 -}
 module Development.Shake.Language.C.Config(
     withConfig
+  , mkConfig
   , parsePaths
   , getPaths
 ) where
@@ -19,7 +20,7 @@
 import Development.Shake.Config (readConfigFileWithEnv)
 import Development.Shake.Language.C.Util (words')
 
-newtype Config = Config ([(String, String)], FilePath, String) deriving (Show,Typeable,Eq,Hashable,Binary,NFData)
+newtype Config = Config ([FilePath], FilePath, [(String, String)], String) deriving (Show,Typeable,Eq,Hashable,Binary,NFData)
 
 {- | Given a list of dependencies, return a function that takes an environment
 of variable bindings, a configuration file path and a configuration variable
@@ -42,11 +43,38 @@
                      -> String
                      -> Action (Maybe String))
 withConfig deps = do
-  fileCache <- newCache $ \(env, file) -> do
+  fileCache <- newCache $ \(file, env) -> do
     need deps
     liftIO $ readConfigFileWithEnv env file
-  query <- addOracle $ \(Config (env, file, key)) -> Map.lookup key <$> fileCache (env, file)
-  return $ \env file key -> query (Config (env, file, key))
+  query <- addOracle $ \(Config (_, file, env, key)) -> Map.lookup key <$> fileCache (file, env)
+  return $ \env file key -> query (Config ([], file, env, key))
+
+{- | Return a function that takes a list of dependencies, a configuration file
+path, an environment of variable bindings and a configuration variable and
+returns the corresponding configuration value.
+
+This function is more flexible than `Development.Shake.Config.usingConfigFile`.
+It allows the use of multiple configuration files as well as specifying default
+variable bindings.
+
+Typical usage would be something like this:
+
+> -- In the Rules monad
+> getConfig <- mkConfig
+> -- Then in an Action
+> ... value <- getConfig ["some_generated_config.cfg"] [("variable", "default value")] "config.cfg" "variable"
+-}
+mkConfig :: Rules (     [FilePath]
+                     -> FilePath
+                     -> [(String,String)]
+                     -> String
+                     -> Action (Maybe String))
+mkConfig = do
+  fileCache <- newCache $ \(deps, file, env) -> do
+    need deps
+    liftIO $ readConfigFileWithEnv env file
+  query <- addOracle $ \(Config (deps, file, env, key)) -> Map.lookup key <$> fileCache (deps, file, env)
+  return $ \deps file env key -> query (Config (deps, file, env, key))
 
 -- | Parse a list of space separated paths from an input string. Spaces can be escaped by @\\@ characters.
 --
