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.
This commit is contained in:
Brad King 2015-01-16 15:35:36 -05:00
parent bda4f0b661
commit 0238d0c397
2 changed files with 28 additions and 2 deletions

View File

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

View File

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