mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 10:47:59 +08:00
cmCommand refactor: cmOutputRequiredFilesCommand
This commit is contained in:
@@ -317,8 +317,7 @@ void GetProjectCommands(cmState* state)
|
||||
"load_command", cmLoadCommandCommand, cmPolicies::CMP0031,
|
||||
"The load_command command should not be called; see CMP0031.");
|
||||
state->AddDisallowedCommand(
|
||||
"output_required_files", cm::make_unique<cmOutputRequiredFilesCommand>(),
|
||||
cmPolicies::CMP0032,
|
||||
"output_required_files", cmOutputRequiredFilesCommand, cmPolicies::CMP0032,
|
||||
"The output_required_files command should not be called; see CMP0032.");
|
||||
state->AddDisallowedCommand(
|
||||
"subdir_depends", cm::make_unique<cmSubdirDependsCommand>(),
|
||||
|
@@ -5,9 +5,12 @@
|
||||
#include "cmsys/FStream.hxx"
|
||||
#include "cmsys/RegularExpression.hxx"
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <stdio.h>
|
||||
#include <utility>
|
||||
|
||||
#include "cmAlgorithms.h"
|
||||
#include "cmExecutionStatus.h"
|
||||
#include "cmGeneratorExpression.h"
|
||||
#include "cmMakefile.h"
|
||||
#include "cmSourceFile.h"
|
||||
@@ -15,8 +18,7 @@
|
||||
#include "cmSystemTools.h"
|
||||
#include "cmTarget.h"
|
||||
|
||||
class cmExecutionStatus;
|
||||
|
||||
namespace {
|
||||
/** \class cmDependInformation
|
||||
* \brief Store dependency information for a single source file.
|
||||
*
|
||||
@@ -453,43 +455,47 @@ protected:
|
||||
DirectoryToFileToPathMapType DirectoryToFileToPathMap;
|
||||
};
|
||||
|
||||
void ListDependencies(cmDependInformation const* info, FILE* fout,
|
||||
std::set<cmDependInformation const*>* visited);
|
||||
}
|
||||
|
||||
// cmOutputRequiredFilesCommand
|
||||
bool cmOutputRequiredFilesCommand::InitialPass(
|
||||
std::vector<std::string> const& args, cmExecutionStatus&)
|
||||
bool cmOutputRequiredFilesCommand(std::vector<std::string> const& args,
|
||||
cmExecutionStatus& status)
|
||||
{
|
||||
if (args.size() != 2) {
|
||||
this->SetError("called with incorrect number of arguments");
|
||||
status.SetError("called with incorrect number of arguments");
|
||||
return false;
|
||||
}
|
||||
|
||||
// store the arg for final pass
|
||||
this->File = args[0];
|
||||
this->OutputFile = args[1];
|
||||
const std::string& file = args[0];
|
||||
const std::string& outputFile = args[1];
|
||||
|
||||
// compute the list of files
|
||||
cmLBDepend md;
|
||||
md.SetMakefile(this->Makefile);
|
||||
md.AddSearchPath(this->Makefile->GetCurrentSourceDirectory());
|
||||
md.SetMakefile(&status.GetMakefile());
|
||||
md.AddSearchPath(status.GetMakefile().GetCurrentSourceDirectory());
|
||||
// find the depends for a file
|
||||
const cmDependInformation* info = md.FindDependencies(this->File.c_str());
|
||||
const cmDependInformation* info = md.FindDependencies(file.c_str());
|
||||
if (info) {
|
||||
// write them out
|
||||
FILE* fout = cmsys::SystemTools::Fopen(this->OutputFile, "w");
|
||||
FILE* fout = cmsys::SystemTools::Fopen(outputFile, "w");
|
||||
if (!fout) {
|
||||
this->SetError(cmStrCat("Can not open output file: ", this->OutputFile));
|
||||
status.SetError(cmStrCat("Can not open output file: ", outputFile));
|
||||
return false;
|
||||
}
|
||||
std::set<cmDependInformation const*> visited;
|
||||
this->ListDependencies(info, fout, &visited);
|
||||
ListDependencies(info, fout, &visited);
|
||||
fclose(fout);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void cmOutputRequiredFilesCommand::ListDependencies(
|
||||
cmDependInformation const* info, FILE* fout,
|
||||
std::set<cmDependInformation const*>* visited)
|
||||
namespace {
|
||||
void ListDependencies(cmDependInformation const* info, FILE* fout,
|
||||
std::set<cmDependInformation const*>* visited)
|
||||
{
|
||||
// add info to the visited set
|
||||
visited->insert(info);
|
||||
@@ -504,7 +510,8 @@ void cmOutputRequiredFilesCommand::ListDependencies(
|
||||
fprintf(fout, "%s\n", d->FullPath.c_str());
|
||||
}
|
||||
}
|
||||
this->ListDependencies(d, fout, visited);
|
||||
ListDependencies(d, fout, visited);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -5,34 +5,12 @@
|
||||
|
||||
#include "cmConfigure.h" // IWYU pragma: keep
|
||||
|
||||
#include <set>
|
||||
#include <stdio.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "cm_memory.hxx"
|
||||
|
||||
#include "cmCommand.h"
|
||||
|
||||
class cmDependInformation;
|
||||
class cmExecutionStatus;
|
||||
|
||||
class cmOutputRequiredFilesCommand : public cmCommand
|
||||
{
|
||||
public:
|
||||
std::unique_ptr<cmCommand> Clone() override
|
||||
{
|
||||
return cm::make_unique<cmOutputRequiredFilesCommand>();
|
||||
}
|
||||
bool InitialPass(std::vector<std::string> const& args,
|
||||
cmExecutionStatus& status) override;
|
||||
|
||||
void ListDependencies(cmDependInformation const* info, FILE* fout,
|
||||
std::set<cmDependInformation const*>* visited);
|
||||
|
||||
private:
|
||||
std::string File;
|
||||
std::string OutputFile;
|
||||
};
|
||||
bool cmOutputRequiredFilesCommand(std::vector<std::string> const& args,
|
||||
cmExecutionStatus& status);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user