Ninja: 'рдирд┐рдВрдЬрд╛ -t compdb' рдХреЛ рд╣рд░ рдирд┐рдпрдо рдХреЛ рдбрдВрдк рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдХреЛ рдирд┐рд░реНрдорд┐рдд 29 рдЬрдире░ 2018  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: ninja-build/ninja

рдореИрдВ рдирд┐рдВрдЬрд╛ рдХреА COMPDB рдкреАрдврд╝реА рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдХреЗрд╡рд▓ [\n] рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реИрдз-рд╕реА рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП?

рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдВрдЬрд╛ рд╕рдВрд╕реНрдХрд░рдг 1.8.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рднреА рдЗрд╕ рдЙрдкрдХрд░рдг рд╕реЗ рднреНрд░рдорд┐рдд рд╣реВрдБред рдореБрдЭреЗ cc cxx рдЬреИрд╕реЗ рдирд┐рдпрдо рдирд╛рдо рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВ , рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдореБрдЭреЗ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕реЗ рд╣рд░ рдирд┐рдпрдо рдХреЛ рдбрдВрдк рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕рд▓рд┐рдПред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рдпрд╛ рд╕реАрдПрдордХреЗ, рд▓реЗрдХрд┐рди рдЬрдм рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реАрдПрдордХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдпрдо рдирд╛рдо рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдмрд╛рд░реЛрдХ рдФрд░ рднрд░рдкреВрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрди рд╕рднреА рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рд╕реНрдЯрд╛рд░реНрдЯрд░ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдЕрдкрдиреЗ рдЙрдмрдВрдЯреВ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ,

--- 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;
+        }
       }
     }
   }

рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рдиреЗ рдФрд░ рд╕реВрдЪреА рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдХрднреА рднреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХреА, рдХреНрдпреЛрдВрдХрд┐ рд╕реАрдПрдордХреЗ рд╕рдВрдХрд▓рди рдЖрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдЕрдкрдирд╛ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрд░реЛрдХреНрдд рдЖрдкрдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рднреА рдЗрд╕ рдЙрдкрдХрд░рдг рд╕реЗ рднреНрд░рдорд┐рдд рд╣реВрдБред рдореБрдЭреЗ cc cxx рдЬреИрд╕реЗ рдирд┐рдпрдо рдирд╛рдо рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВ , рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдореБрдЭреЗ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕реЗ рд╣рд░ рдирд┐рдпрдо рдХреЛ рдбрдВрдк рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕рд▓рд┐рдПред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рдпрд╛ рд╕реАрдПрдордХреЗ, рд▓реЗрдХрд┐рди рдЬрдм рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реАрдПрдордХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдпрдо рдирд╛рдо рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдмрд╛рд░реЛрдХ рдФрд░ рднрд░рдкреВрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрди рд╕рднреА рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рд╕реНрдЯрд╛рд░реНрдЯрд░ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдЕрдкрдиреЗ рдЙрдмрдВрдЯреВ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ,

--- 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;
+        }
       }
     }
   }

рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рдиреЗ рдФрд░ рд╕реВрдЪреА рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдХрднреА рднреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХреА, рдХреНрдпреЛрдВрдХрд┐ рд╕реАрдПрдордХреЗ рд╕рдВрдХрд▓рди рдЖрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдЕрдкрдирд╛ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрд░реЛрдХреНрдд рдЖрдкрдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕реЗ рд╣рд░ рдЙрд╕ рдирд┐рдпрдо рдХреЛ рдбрдВрдк рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдХреЗрд╡рд▓ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдлреЙрд▓рдмреИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдореБрдЭреЗ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ https://github.com/ninja-build/ninja/issues/1024#issuecomment -178885017 рдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред

рдЬреА рдмреЛрд▓рд┐рдпреЗ.....

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

dabrahams picture dabrahams  ┬╖  16рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

greened picture greened  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MRYangY picture MRYangY  ┬╖  23рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gjasny picture gjasny  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mdempsky picture mdempsky  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ