diff --git a/src/kernel_services/ast_queries/json_compilation_database.ml b/src/kernel_services/ast_queries/json_compilation_database.ml
index 11c2802451cd21e4e895e0d32639d3a8ce2e1a34..01fbfdb999ca29ca080642fd61b578cd3e33fa2a 100644
--- a/src/kernel_services/ast_queries/json_compilation_database.ml
+++ b/src/kernel_services/ast_queries/json_compilation_database.ml
@@ -211,6 +211,16 @@ let update_flags_verbosely path flags =
   | Not_found ->
     Flags.add path flags
 
+let parse_build_entry bcdb_dir r =
+  let open Yojson.Basic.Util in
+  let filenames = r |> member "sources" |> to_list |> List.map to_string in
+  let args = List.map to_string (r |> member "arguments" |> to_list) in
+  let flags = filter_useful_flags ~requote:true args in
+  List.iter (fun filename ->
+      let path = Datatype.Filepath.of_string ~base_name:bcdb_dir filename in
+      update_flags_verbosely path flags
+    ) filenames
+
 let parse_compilation_entry jcdb_dir r =
   let open Yojson.Basic.Util in
   let filename = r |> member "file" |> to_string in
@@ -259,7 +269,15 @@ let compute_flags_from_file () =
       let r_list =
         Yojson.Basic.from_file jcdb_path |> Yojson.Basic.Util.to_list
       in
-      List.iter (parse_compilation_entry jcdb_dir) r_list;
+      let is_build_database =
+        try
+          List.hd r_list |> Yojson.Basic.Util.member "sources" <> `Null
+        with _ -> false
+      in
+      let parse_entry =
+        if is_build_database then parse_build_entry else parse_compilation_entry
+      in
+      List.iter (parse_entry jcdb_dir) r_list;
     with
     | Sys_error msg
     | Yojson.Json_error msg
diff --git a/tests/jcdb/build_commands.json b/tests/jcdb/build_commands.json
new file mode 100644
index 0000000000000000000000000000000000000000..f12bcb79f6035b3b33973efcc2271725ab1e6778
--- /dev/null
+++ b/tests/jcdb/build_commands.json
@@ -0,0 +1,20 @@
+[
+    {
+        "command": "/usr/bin/gcc -c jbdb.c jbdb2.c -DRETCODE=0",
+        "arguments": [
+            "/usr/bin/gcc",
+            "-c",
+            "jbdb.c",
+            "jbdb2.c",
+            "-DRETCODE=0"
+        ],
+        "sources": [
+            "jbdb.c",
+            "jbdb2.c"
+        ],
+        "targets": [
+            "jbdb.o",
+            "jbdb2.o"
+        ]
+    }
+]
diff --git a/tests/jcdb/jbdb.c b/tests/jcdb/jbdb.c
new file mode 100644
index 0000000000000000000000000000000000000000..d73218424429882a7b66ede7d3b67bb6c920f0d3
--- /dev/null
+++ b/tests/jcdb/jbdb.c
@@ -0,0 +1,7 @@
+/* run.config
+OPT: -json-compilation-database @PTEST_DIR@/build_commands.json -print
+*/
+
+int f2 () {
+  return RETCODE; // defined in build_commands.json
+}
diff --git a/tests/jcdb/jbdb2.c b/tests/jcdb/jbdb2.c
new file mode 100644
index 0000000000000000000000000000000000000000..db89a97f607bda7804244e621acd67adbf107bd1
--- /dev/null
+++ b/tests/jcdb/jbdb2.c
@@ -0,0 +1,7 @@
+/* run.config
+OPT: -json-compilation-database @PTEST_DIR@/build_commands.json -print
+*/
+
+int f1 () {
+  return RETCODE; // defined in build_commands.json
+}
diff --git a/tests/jcdb/oracle/jbdb.res.oracle b/tests/jcdb/oracle/jbdb.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..592d8314fdbf4108ad558ff912fd7ca8d5e600d1
--- /dev/null
+++ b/tests/jcdb/oracle/jbdb.res.oracle
@@ -0,0 +1,10 @@
+[kernel] Parsing tests/jcdb/jbdb.c (with preprocessing)
+/* Generated by Frama-C */
+int f2(void)
+{
+  int __retres;
+  __retres = 0;
+  return __retres;
+}
+
+
diff --git a/tests/jcdb/oracle/jbdb2.res.oracle b/tests/jcdb/oracle/jbdb2.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..376850836aa1aaf9fb60d6e7f3ff8729666477b7
--- /dev/null
+++ b/tests/jcdb/oracle/jbdb2.res.oracle
@@ -0,0 +1,10 @@
+[kernel] Parsing tests/jcdb/jbdb2.c (with preprocessing)
+/* Generated by Frama-C */
+int f1(void)
+{
+  int __retres;
+  __retres = 0;
+  return __retres;
+}
+
+