Ninja: 'ninja -t compdb' sollte jede Regel ausgeben

Erstellt am 29. Jan. 2018  ·  4Kommentare  ·  Quelle: ninja-build/ninja

Ich versuche, die Compdb-Generierungsfunktion von Ninja zu verwenden, aber es scheint jedes Mal nur [\n] auszugeben. Es gibt keine Dokumentation für diese Option, daher scheint es, als ob es keine anderen Anforderungen geben sollte, als den Befehl mit einer gültigen Option -C auszuführen?

Verwenden von Ninja-Version 1.8.2, falls das wichtig ist.

feature

Hilfreichster Kommentar

Ich bin auch verwirrt von diesem Tool. Ich habe keine Probleme Regel Namen wie cc cxx vorbei , wenn sie existieren, aber mein Problem mit ihm war , dass ich ohne Argumente dachte, es sollte jede Regel Dump es kennt, und nur Rückfall auf das Filtern , wenn Sie es Argumente geben zu tun so.

Ich bin mir nicht sicher, ob es das Projekt ist, an dem ich arbeite, oder CMake, aber wenn es in diesem Projekt mit CMake ausgeführt wird, sind die Regelnamen unglaublich barock und reichlich vorhanden, daher ist es für mich kein Anfang, sie alle einzutippen. Stattdessen verwende ich diesen Patch für das Paket auf meinem Ubuntu-Computer,

--- ninja-build-1.7.2.orig/src/ninja.cc
+++ ninja-build-1.7.2/src/ninja.cc
@@ -638,20 +638,36 @@ int NinjaMain::ToolCompilationDatabase(c
        e != state_.edges_.end(); ++e) {
     if ((*e)->inputs_.empty())
       continue;
-    for (int i = 0; i != argc; ++i) {
-      if ((*e)->rule_->name() == argv[i]) {
-        if (!first)
-          putchar(',');

-        printf("\n  {\n    \"directory\": \"");
-        EncodeJSONString(&cwd[0]);
-        printf("\",\n    \"command\": \"");
-        EncodeJSONString((*e)->EvaluateCommand().c_str());
-        printf("\",\n    \"file\": \"");
-        EncodeJSONString((*e)->inputs_[0]->path().c_str());
-        printf("\"\n  }");
+    if (argc == 0) {
+      if (!first)
+        putchar(',');

-        first = false;
+      printf("\n  {\n    \"directory\": \"");
+      EncodeJSONString(&cwd[0]);
+      printf("\",\n    \"command\": \"");
+      EncodeJSONString((*e)->EvaluateCommand().c_str());
+      printf("\",\n    \"file\": \"");
+      EncodeJSONString((*e)->inputs_[0]->path().c_str());
+      printf("\"\n  }");
+
+      first = false;
+    } else {
+      for (int i = 0; i != argc; ++i) {
+        if ((*e)->rule_->name() == argv[i]) {
+          if (!first)
+            putchar(',');
+
+          printf("\n  {\n    \"directory\": \"");
+          EncodeJSONString(&cwd[0]);
+          printf("\",\n    \"command\": \"");
+          EncodeJSONString((*e)->EvaluateCommand().c_str());
+          printf("\",\n    \"file\": \"");
+          EncodeJSONString((*e)->inputs_[0]->path().c_str());
+          printf("\"\n  }");
+
+          first = false;
+        }
       }
     }
   }

Ich habe mich nie die Mühe gemacht, es zu bereinigen und in die Liste zu posten, da CMake eine eigene Möglichkeit bietet, Kompilierungsbefehle zu generieren, aber das Obige könnte Ihnen in Ihrer Situation helfen.

Alle 4 Kommentare

Ich bin auch verwirrt von diesem Tool. Ich habe keine Probleme Regel Namen wie cc cxx vorbei , wenn sie existieren, aber mein Problem mit ihm war , dass ich ohne Argumente dachte, es sollte jede Regel Dump es kennt, und nur Rückfall auf das Filtern , wenn Sie es Argumente geben zu tun so.

Ich bin mir nicht sicher, ob es das Projekt ist, an dem ich arbeite, oder CMake, aber wenn es in diesem Projekt mit CMake ausgeführt wird, sind die Regelnamen unglaublich barock und reichlich vorhanden, daher ist es für mich kein Anfang, sie alle einzutippen. Stattdessen verwende ich diesen Patch für das Paket auf meinem Ubuntu-Computer,

--- ninja-build-1.7.2.orig/src/ninja.cc
+++ ninja-build-1.7.2/src/ninja.cc
@@ -638,20 +638,36 @@ int NinjaMain::ToolCompilationDatabase(c
        e != state_.edges_.end(); ++e) {
     if ((*e)->inputs_.empty())
       continue;
-    for (int i = 0; i != argc; ++i) {
-      if ((*e)->rule_->name() == argv[i]) {
-        if (!first)
-          putchar(',');

-        printf("\n  {\n    \"directory\": \"");
-        EncodeJSONString(&cwd[0]);
-        printf("\",\n    \"command\": \"");
-        EncodeJSONString((*e)->EvaluateCommand().c_str());
-        printf("\",\n    \"file\": \"");
-        EncodeJSONString((*e)->inputs_[0]->path().c_str());
-        printf("\"\n  }");
+    if (argc == 0) {
+      if (!first)
+        putchar(',');

-        first = false;
+      printf("\n  {\n    \"directory\": \"");
+      EncodeJSONString(&cwd[0]);
+      printf("\",\n    \"command\": \"");
+      EncodeJSONString((*e)->EvaluateCommand().c_str());
+      printf("\",\n    \"file\": \"");
+      EncodeJSONString((*e)->inputs_[0]->path().c_str());
+      printf("\"\n  }");
+
+      first = false;
+    } else {
+      for (int i = 0; i != argc; ++i) {
+        if ((*e)->rule_->name() == argv[i]) {
+          if (!first)
+            putchar(',');
+
+          printf("\n  {\n    \"directory\": \"");
+          EncodeJSONString(&cwd[0]);
+          printf("\",\n    \"command\": \"");
+          EncodeJSONString((*e)->EvaluateCommand().c_str());
+          printf("\",\n    \"file\": \"");
+          EncodeJSONString((*e)->inputs_[0]->path().c_str());
+          printf("\"\n  }");
+
+          first = false;
+        }
       }
     }
   }

Ich habe mich nie die Mühe gemacht, es zu bereinigen und in die Liste zu posten, da CMake eine eigene Möglichkeit bietet, Kompilierungsbefehle zu generieren, aber das Obige könnte Ihnen in Ihrer Situation helfen.

Ich dachte, ohne Argumente sollte es jede Regel, die es kennt, ausgeben und nur auf die Filterung zurückgreifen, wenn Sie ihm Argumente dafür geben.

Das klingt für mich vernünftig.

Wie auf https://github.com/ninja-build/ninja/issues/1024#issuecomment -178885017 erwähnt, denke ich, dass dies eine gute Änderung wäre.

ja bitte.....

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen