Cleaned up the Sublime Text 2 Generator code a bit.
This commit is contained in:
parent
75b060ff20
commit
4d585b109d
|
@ -106,11 +106,107 @@ void cmExtraSublimeTextGenerator
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// A set of folders to include in the project
|
|
||||||
std::set<std::string> folderIncludePatternsSet;
|
|
||||||
// Collect all files, this includes source files and list files
|
// Collect all files, this includes source files and list files
|
||||||
std::vector<std::string> allFiles;
|
std::vector<std::string> allFiles;
|
||||||
|
GetFileList(lgs, allFiles);
|
||||||
|
// A set of folders to include in the project
|
||||||
|
std::set<std::string> folderIncludePatternsSet;
|
||||||
std::stringstream fileIncludePatternsStream;
|
std::stringstream fileIncludePatternsStream;
|
||||||
|
GetFileStringAndFolderSet(lgs, mf, allFiles, fileIncludePatternsStream,
|
||||||
|
folderIncludePatternsSet);
|
||||||
|
// Write the folder entries to the project file
|
||||||
|
const std::string &homeRelative = cmSystemTools::RelativePath(
|
||||||
|
lgs[0]->GetMakefile()->GetHomeOutputDirectory(),
|
||||||
|
lgs[0]->GetMakefile()->GetHomeDirectory());
|
||||||
|
fout << "{\n";
|
||||||
|
fout << "\t\"folders\":\n\t[\n\t";
|
||||||
|
fout << "\t{\n\t\t\t\"path\": \"" << homeRelative << "\",\n";
|
||||||
|
fout << "\t\t\t\"folder_include_patterns\": [";
|
||||||
|
std::set<std::string>::const_iterator folderIter =
|
||||||
|
folderIncludePatternsSet.begin();
|
||||||
|
while (folderIter != folderIncludePatternsSet.end())
|
||||||
|
{
|
||||||
|
fout << "\"" << *folderIter << "\"";
|
||||||
|
folderIter++;
|
||||||
|
if (folderIter != folderIncludePatternsSet.end())
|
||||||
|
{
|
||||||
|
fout << ", ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fout << "],\n";
|
||||||
|
fout << "\t\t\t\"file_include_patterns\": [" <<
|
||||||
|
fileIncludePatternsStream.str() << "]\n";
|
||||||
|
fout << "\t\t},\n\t";
|
||||||
|
// In order for SublimeClang's path resolution to work, the directory that
|
||||||
|
// contains the sublime-project file must be included here. We just ensure
|
||||||
|
// that no files or subfolders are included
|
||||||
|
fout << "\t{\n\t\t\t\"path\": \"./\",\n";
|
||||||
|
fout << "\t\t\t\"folder_exclude_patterns\": [\"*\"],\n";
|
||||||
|
fout << "\t\t\t\"file_exclude_patterns\": [\"*\"]\n";
|
||||||
|
fout << "\t\t}\n\t";
|
||||||
|
// End of the folders section
|
||||||
|
fout << "]";
|
||||||
|
|
||||||
|
// Write the beginning of the build systems section to the project file
|
||||||
|
fout << ",\n\t\"build_systems\":\n\t[\n\t";
|
||||||
|
|
||||||
|
// Set of include directories over all targets (sublime text/sublimeclang
|
||||||
|
// doesn't currently support these settings per build system, only project
|
||||||
|
// wide
|
||||||
|
std::set<std::string> includeDirs;
|
||||||
|
std::set<std::string> defines;
|
||||||
|
AppendAllTargets(lgs, mf, fout, includeDirs, defines);
|
||||||
|
// End of build_systems
|
||||||
|
fout << "\n\t]";
|
||||||
|
|
||||||
|
// Write the settings section with sublimeclang options
|
||||||
|
fout << ",\n\t\"settings\":\n\t{\n\t";
|
||||||
|
fout << "\t\"sublimeclang_options\":\n\t\t[\n\t\t";
|
||||||
|
std::set<std::string>::const_iterator stringSetIter = includeDirs.begin();
|
||||||
|
while (stringSetIter != includeDirs.end())
|
||||||
|
{
|
||||||
|
const std::string &includeDir = *stringSetIter;
|
||||||
|
const std::string &relative = cmSystemTools::RelativePath(
|
||||||
|
lgs[0]->GetMakefile()->GetHomeOutputDirectory(),
|
||||||
|
includeDir.c_str());
|
||||||
|
// It appears that a relative path to the sublime-project file doesn't
|
||||||
|
// always work. So we use ${folder:${project_path:<project_filename>}}
|
||||||
|
// that SublimeClang will expand to the correct path
|
||||||
|
fout << "\t\"-I${folder:${project_path:" << mf->GetProjectName() <<
|
||||||
|
".sublime-project}}/" << relative << "\"";
|
||||||
|
stringSetIter++;
|
||||||
|
if ((stringSetIter != includeDirs.end()) || (!defines.empty()))
|
||||||
|
{
|
||||||
|
fout << ",";
|
||||||
|
}
|
||||||
|
fout << "\n\t\t";
|
||||||
|
}
|
||||||
|
stringSetIter = defines.begin();
|
||||||
|
while (stringSetIter != defines.end())
|
||||||
|
{
|
||||||
|
fout << "\t\"-D" << *stringSetIter << "\"";
|
||||||
|
stringSetIter++;
|
||||||
|
if (stringSetIter != defines.end())
|
||||||
|
{
|
||||||
|
fout << ",";
|
||||||
|
}
|
||||||
|
fout << "\n\t\t";
|
||||||
|
}
|
||||||
|
// End of the sublimeclang_options section
|
||||||
|
fout << "]\n\t";
|
||||||
|
// End of the settings section
|
||||||
|
fout << "}\n";
|
||||||
|
|
||||||
|
// End of file
|
||||||
|
fout << "}";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get a list of all files and a set of all directories and subdirectories
|
||||||
|
// with source files
|
||||||
|
void cmExtraSublimeTextGenerator
|
||||||
|
::GetFileList(const std::vector<cmLocalGenerator*>& lgs,
|
||||||
|
std::vector<std::string>& allFiles)
|
||||||
|
{
|
||||||
for (std::vector<cmLocalGenerator *>::const_iterator
|
for (std::vector<cmLocalGenerator *>::const_iterator
|
||||||
it = lgs.begin();
|
it = lgs.begin();
|
||||||
it != lgs.end();
|
it != lgs.end();
|
||||||
|
@ -152,7 +248,15 @@ void cmExtraSublimeTextGenerator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmExtraSublimeTextGenerator::
|
||||||
|
GetFileStringAndFolderSet(const std::vector<cmLocalGenerator*>& lgs,
|
||||||
|
const cmMakefile* mf,
|
||||||
|
const std::vector<std::string>& allFiles,
|
||||||
|
std::stringstream& fileIncludePatternsStream,
|
||||||
|
std::set<std::string>& folderIncludePatternsSet)
|
||||||
|
{
|
||||||
// Convert
|
// Convert
|
||||||
const char* cmakeRoot = mf->GetDefinition("CMAKE_ROOT");
|
const char* cmakeRoot = mf->GetDefinition("CMAKE_ROOT");
|
||||||
for (std::vector<std::string>::const_iterator jt = allFiles.begin();
|
for (std::vector<std::string>::const_iterator jt = allFiles.begin();
|
||||||
|
@ -205,47 +309,15 @@ void cmExtraSublimeTextGenerator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Write the folder entries to the project file
|
}
|
||||||
const std::string &homeRelative = cmSystemTools::RelativePath(
|
|
||||||
lgs[0]->GetMakefile()->GetHomeOutputDirectory(),
|
|
||||||
lgs[0]->GetMakefile()->GetHomeDirectory());
|
|
||||||
fout << "{\n";
|
|
||||||
fout << "\t\"folders\":\n\t[\n\t";
|
|
||||||
fout << "\t{\n\t\t\t\"path\": \"" << homeRelative << "\",\n";
|
|
||||||
fout << "\t\t\t\"folder_include_patterns\": [";
|
|
||||||
std::set<std::string>::const_iterator folderIter =
|
|
||||||
folderIncludePatternsSet.begin();
|
|
||||||
while (folderIter != folderIncludePatternsSet.end())
|
|
||||||
{
|
|
||||||
fout << "\"" << *folderIter << "\"";
|
|
||||||
folderIter++;
|
|
||||||
if (folderIter != folderIncludePatternsSet.end())
|
|
||||||
{
|
|
||||||
fout << ", ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fout << "],\n";
|
|
||||||
fout << "\t\t\t\"file_include_patterns\": [" <<
|
|
||||||
fileIncludePatternsStream.str() << "]\n";
|
|
||||||
fout << "\t\t},\n\t";
|
|
||||||
// In order for SublimeClang's path resolution to work, the directory that
|
|
||||||
// contains the sublime-project file must be included here. We just ensure
|
|
||||||
// that no files or subfolders are included
|
|
||||||
fout << "\t{\n\t\t\t\"path\": \"./\",\n";
|
|
||||||
fout << "\t\t\t\"folder_exclude_patterns\": [\"*\"],\n";
|
|
||||||
fout << "\t\t\t\"file_exclude_patterns\": [\"*\"]\n";
|
|
||||||
fout << "\t\t}\n\t";
|
|
||||||
// End of the folders section
|
|
||||||
fout << "]";
|
|
||||||
|
|
||||||
// Write the beginning of the build systems section to the project file
|
void cmExtraSublimeTextGenerator::
|
||||||
fout << ",\n\t\"build_systems\":\n\t[\n\t";
|
AppendAllTargets(const std::vector<cmLocalGenerator*>& lgs,
|
||||||
|
const cmMakefile* mf,
|
||||||
// Set of include directories over all targets (sublime text/sublimeclang
|
cmGeneratedFileStream& fout,
|
||||||
// doesn't currently support these settings per build system, only project
|
std::set<std::string>& includeDirs,
|
||||||
// wide
|
std::set<std::string>& defines)
|
||||||
std::set<std::string> includeDirs;
|
{
|
||||||
std::set<std::string> defines;
|
|
||||||
std::string make = mf->GetRequiredDefinition("CMAKE_MAKE_PROGRAM");
|
std::string make = mf->GetRequiredDefinition("CMAKE_MAKE_PROGRAM");
|
||||||
std::string compiler = "";
|
std::string compiler = "";
|
||||||
this->AppendTarget(fout, "all", 0, make.c_str(), mf, compiler.c_str(),
|
this->AppendTarget(fout, "all", 0, make.c_str(), mf, compiler.c_str(),
|
||||||
|
@ -334,49 +406,6 @@ void cmExtraSublimeTextGenerator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// End of build_systems
|
|
||||||
fout << "\n\t]";
|
|
||||||
|
|
||||||
// Write the settings section with sublimeclang options
|
|
||||||
fout << ",\n\t\"settings\":\n\t{\n\t";
|
|
||||||
fout << "\t\"sublimeclang_options\":\n\t\t[\n\t\t";
|
|
||||||
std::set<std::string>::const_iterator stringSetIter = includeDirs.begin();
|
|
||||||
while (stringSetIter != includeDirs.end())
|
|
||||||
{
|
|
||||||
const std::string &includeDir = *stringSetIter;
|
|
||||||
const std::string &relative = cmSystemTools::RelativePath(
|
|
||||||
lgs[0]->GetMakefile()->GetHomeOutputDirectory(),
|
|
||||||
includeDir.c_str());
|
|
||||||
// It appears that a relative path to the sublime-project file doesn't
|
|
||||||
// always work. So we use ${folder:${project_path:<project_filename>}}
|
|
||||||
// that SublimeClang will expand to the correct path
|
|
||||||
fout << "\t\"-I${folder:${project_path:" << mf->GetProjectName() <<
|
|
||||||
".sublime-project}}/" << relative << "\"";
|
|
||||||
stringSetIter++;
|
|
||||||
if ((stringSetIter != includeDirs.end()) || (!defines.empty()))
|
|
||||||
{
|
|
||||||
fout << ",";
|
|
||||||
}
|
|
||||||
fout << "\n\t\t";
|
|
||||||
}
|
|
||||||
stringSetIter = defines.begin();
|
|
||||||
while (stringSetIter != defines.end())
|
|
||||||
{
|
|
||||||
fout << "\t\"-D" << *stringSetIter << "\"";
|
|
||||||
stringSetIter++;
|
|
||||||
if (stringSetIter != defines.end())
|
|
||||||
{
|
|
||||||
fout << ",";
|
|
||||||
}
|
|
||||||
fout << "\n\t\t";
|
|
||||||
}
|
|
||||||
// End of the sublimeclang_options section
|
|
||||||
fout << "]\n\t";
|
|
||||||
// End of the settings section
|
|
||||||
fout << "}\n";
|
|
||||||
|
|
||||||
// End of file
|
|
||||||
fout << "}";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate the build_system entry for one target
|
// Generate the build_system entry for one target
|
||||||
|
|
|
@ -45,7 +45,22 @@ private:
|
||||||
|
|
||||||
void CreateNewProjectFile(const std::vector<cmLocalGenerator*>& lgs,
|
void CreateNewProjectFile(const std::vector<cmLocalGenerator*>& lgs,
|
||||||
const std::string& filename);
|
const std::string& filename);
|
||||||
|
void GetFileList(const std::vector<cmLocalGenerator*>& lgs,
|
||||||
|
std::vector<std::string>& allFiles);
|
||||||
|
void GetFileStringAndFolderSet(const std::vector<cmLocalGenerator*>& lgs,
|
||||||
|
const cmMakefile* mf,
|
||||||
|
const std::vector<std::string>& allFiles,
|
||||||
|
std::stringstream& fileIncludePatternsStream,
|
||||||
|
std::set<std::string>&
|
||||||
|
folderIncludePatternsSet);
|
||||||
|
/** Appends all targets as build systems to the project file and get all
|
||||||
|
* include directories and compiler definitions used.
|
||||||
|
*/
|
||||||
|
void AppendAllTargets(const std::vector<cmLocalGenerator*>& lgs,
|
||||||
|
const cmMakefile* mf,
|
||||||
|
cmGeneratedFileStream& fout,
|
||||||
|
std::set<std::string>& includeDirs,
|
||||||
|
std::set<std::string>& defines);
|
||||||
std::string BuildMakeCommand(const std::string& make, const char* makefile,
|
std::string BuildMakeCommand(const std::string& make, const char* makefile,
|
||||||
const char* target);
|
const char* target);
|
||||||
void AppendTarget(cmGeneratedFileStream& fout,
|
void AppendTarget(cmGeneratedFileStream& fout,
|
||||||
|
|
Loading…
Reference in New Issue