1
0
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:
Gabor Bencze
2019-08-21 20:49:22 +02:00
committed by Brad King
parent 7533e47ccc
commit c2c222eba1
3 changed files with 27 additions and 43 deletions

View File

@@ -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>(),

View File

@@ -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);
}
}
}
}

View File

@@ -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