Ninja: يجب أن يتخلص "ninja -t compdb" من كل قاعدة

تم إنشاؤها على ٢٩ يناير ٢٠١٨  ·  4تعليقات  ·  مصدر: ninja-build/ninja

أحاول استخدام وظيفة إنشاء compdb للنينجا ، لكن يبدو أنني أخرج فقط [\n] كل مرة. لا توجد وثائق لهذا الخيار ، لذلك يبدو أنه لا ينبغي أن تكون هناك متطلبات أخرى سوى تشغيل الأمر بخيار -C صالح؟

استخدام الإصدار 1.8.2 من النينجا في حالة الضرورة.

feature

التعليق الأكثر فائدة

أنا أيضًا في حيرة من أمري بسبب هذه الأداة. لا أواجه مشكلات في تمرير أسماء القواعد مثل cc cxx إذا كانت موجودة ، ولكن مشكلتي كانت أنني اكتشفت بدون أي حجج ، يجب أن تتخلص من كل قاعدة تعرفها ، وأن ترجع فقط إلى التصفية عند إعطائها الحجج للقيام بها وبالتالي.

لست متأكدًا مما إذا كان هذا هو المشروع الذي أعمل عليه أم CMake ، ولكن عند التشغيل باستخدام CMake في هذا المشروع ، فإن أسماء القواعد باروكية وفيرة بشكل لا يصدق ، لذا فإن كتابتها كلها أمر غير بداية بالنسبة لي. بدلاً من ذلك ، أستخدم هذا التصحيح للحزمة على جهاز كمبيوتر Ubuntu الخاص بي ،

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

لم أزعج أبدًا تنظيفه ونشره في القائمة ، لأن CMake يوفر طريقته الخاصة لإنشاء أوامر تجميع ، ولكن ما سبق قد يساعدك في وضعك.

ال 4 كومينتر

أنا أيضًا في حيرة من أمري بسبب هذه الأداة. لا أواجه مشكلات في تمرير أسماء القواعد مثل cc cxx إذا كانت موجودة ، ولكن مشكلتي كانت أنني اكتشفت بدون أي حجج ، يجب أن تتخلص من كل قاعدة تعرفها ، وأن ترجع فقط إلى التصفية عند إعطائها الحجج للقيام بها وبالتالي.

لست متأكدًا مما إذا كان هذا هو المشروع الذي أعمل عليه أم CMake ، ولكن عند التشغيل باستخدام CMake في هذا المشروع ، فإن أسماء القواعد باروكية وفيرة بشكل لا يصدق ، لذا فإن كتابتها كلها أمر غير بداية بالنسبة لي. بدلاً من ذلك ، أستخدم هذا التصحيح للحزمة على جهاز كمبيوتر Ubuntu الخاص بي ،

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

لم أزعج أبدًا تنظيفه ونشره في القائمة ، لأن CMake يوفر طريقته الخاصة لإنشاء أوامر تجميع ، ولكن ما سبق قد يساعدك في وضعك.

لم أكن أحسب أي حجج ، يجب أن تتخلص من كل قاعدة تعرفها ، وأن ترجع فقط إلى التصفية عندما تقدم لها الحجج للقيام بذلك.

هذا يبدو معقولا بالنسبة لي.

كما هو مذكور في https://github.com/ninja-build/ninja/issues/1024#issuecomment -178885017 ، أعتقد أن هذا سيكون تغييرًا جيدًا.

نعم من فضلك.....

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات