Browse Source

cmake: Generate an internal 'Labels.json' file next to 'Labels.txt'

In each internal target directory we generate a "Labels.txt" file
containing labels for that target and its sources, but it uses an
internal format.  In order to make the list of labels easier to
publish, use a json format and call it "Labels.json".

Since we now use jsoncpp headers, link CMakeLib to the jsoncpp library.
Brad King 10 năm trước cách đây
mục cha
commit
0238d0c397
2 tập tin đã thay đổi với 28 bổ sung2 xóa
  1. 3 1
      Source/CMakeLists.txt
  2. 25 1
      Source/cmGlobalGenerator.cxx

+ 3 - 1
Source/CMakeLists.txt

@@ -500,7 +500,9 @@ add_library(CMakeLib ${SRCS})
 target_link_libraries(CMakeLib cmsys
   ${CMAKE_EXPAT_LIBRARIES} ${CMAKE_ZLIB_LIBRARIES}
   ${CMAKE_TAR_LIBRARIES} ${CMAKE_COMPRESS_LIBRARIES}
-  ${CMAKE_CURL_LIBRARIES} )
+  ${CMAKE_CURL_LIBRARIES}
+  cmjsoncpp
+  )
 
 # On Apple we need CoreFoundation
 if(APPLE)

+ 25 - 1
Source/cmGlobalGenerator.cxx

@@ -38,6 +38,8 @@
 
 #if defined(CMAKE_BUILD_WITH_CMAKE)
 # include <cmsys/MD5.h>
+# include "cm_jsoncpp_value.h"
+# include "cm_jsoncpp_writer.h"
 #endif
 
 #include <stdlib.h> // required for atof
@@ -2911,10 +2913,21 @@ void cmGlobalGenerator::WriteSummary(cmTarget* target)
   std::string dir = target->GetSupportDirectory();
   std::string file = dir;
   file += "/Labels.txt";
+  std::string json_file = dir + "/Labels.json";
 
+#ifdef CMAKE_BUILD_WITH_CMAKE
   // Check whether labels are enabled for this target.
   if(const char* value = target->GetProperty("LABELS"))
     {
+    Json::Value lj_root(Json::objectValue);
+    Json::Value& lj_target =
+      lj_root["target"] = Json::objectValue;
+    lj_target["name"] = target->GetName();
+    Json::Value& lj_target_labels =
+      lj_target["labels"] = Json::arrayValue;
+    Json::Value& lj_sources =
+      lj_root["sources"] = Json::arrayValue;
+
     cmSystemTools::MakeDirectory(dir.c_str());
     cmGeneratedFileStream fout(file.c_str());
 
@@ -2929,6 +2942,7 @@ void cmGlobalGenerator::WriteSummary(cmTarget* target)
           li != labels.end(); ++li)
         {
         fout << " " << *li << "\n";
+        lj_target_labels.append(*li);
         }
       }
 
@@ -2954,23 +2968,33 @@ void cmGlobalGenerator::WriteSummary(cmTarget* target)
         {
         continue;
         }
+      Json::Value& lj_source = lj_sources.append(Json::objectValue);
       cmSourceFile* sf = *si;
-      fout << sf->GetFullPath() << "\n";
+      std::string const& sfp = sf->GetFullPath();
+      fout << sfp << "\n";
+      lj_source["file"] = sfp;
       if(const char* svalue = sf->GetProperty("LABELS"))
         {
         labels.clear();
+        Json::Value& lj_source_labels =
+          lj_source["labels"] = Json::arrayValue;
         cmSystemTools::ExpandListArgument(svalue, labels);
         for(std::vector<std::string>::const_iterator li = labels.begin();
             li != labels.end(); ++li)
           {
           fout << " " << *li << "\n";
+          lj_source_labels.append(*li);
           }
         }
       }
+    cmGeneratedFileStream json_fout(json_file.c_str());
+    json_fout << lj_root;
     }
   else
+#endif
     {
     cmSystemTools::RemoveFile(file);
+    cmSystemTools::RemoveFile(json_file);
     }
 }