summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFred Baksik <fdk17@ftml.net>2022-03-16 20:24:46 (GMT)
committerFred Baksik <fdk17@ftml.net>2022-03-17 23:11:42 (GMT)
commitad426aa697cd5737ca58b95f2acb9a55735d126b (patch)
treedb43fa44b361c5cb0682aa1f40c4c74bb778f30c
parent2f2e88900e922a225264125cbb9d08a002526121 (diff)
downloadCMake-ad426aa697cd5737ca58b95f2acb9a55735d126b.zip
CMake-ad426aa697cd5737ca58b95f2acb9a55735d126b.tar.gz
CMake-ad426aa697cd5737ca58b95f2acb9a55735d126b.tar.bz2
GHS: Create RERUN_CMAKE Custom Target
Create a Custom Target that will re-run CMake on user demand if any of the CMake input files have changed.
-rw-r--r--Source/cmGlobalGhsMultiGenerator.cxx111
-rw-r--r--Source/cmGlobalGhsMultiGenerator.h5
2 files changed, 115 insertions, 1 deletions
diff --git a/Source/cmGlobalGhsMultiGenerator.cxx b/Source/cmGlobalGhsMultiGenerator.cxx
index 836efb2..4371d71 100644
--- a/Source/cmGlobalGhsMultiGenerator.cxx
+++ b/Source/cmGlobalGhsMultiGenerator.cxx
@@ -9,6 +9,7 @@
#include <cm/memory>
#include <cm/string>
#include <cmext/algorithm>
+#include <cmext/memory>
#include "cmDocumentationEntry.h"
#include "cmGeneratedFileStream.h"
@@ -18,6 +19,7 @@
#include "cmLocalGhsMultiGenerator.h"
#include "cmMakefile.h"
#include "cmMessageType.h"
+#include "cmSourceFile.h"
#include "cmState.h"
#include "cmStateTypes.h"
#include "cmStringAlgorithms.h"
@@ -32,6 +34,8 @@ const char* cmGlobalGhsMultiGenerator::DEFAULT_BUILD_PROGRAM = "gbuild";
#elif defined(_WIN32)
const char* cmGlobalGhsMultiGenerator::DEFAULT_BUILD_PROGRAM = "gbuild.exe";
#endif
+const char* cmGlobalGhsMultiGenerator::CHECK_BUILD_SYSTEM_TARGET =
+ "RERUN_CMAKE";
cmGlobalGhsMultiGenerator::cmGlobalGhsMultiGenerator(cmake* cm)
: cmGlobalGenerator(cm)
@@ -476,6 +480,13 @@ void cmGlobalGhsMultiGenerator::Generate()
this->WriteFileHeader(ftarget);
this->WriteCustomTargetBOD(ftarget);
ftarget.Close();
+
+ // create the stamp file when running CMake
+ if (!this->StampFile.empty()) {
+ cmGeneratedFileStream fstamp(this->StampFile);
+ fstamp.SetCopyIfDifferent(false);
+ fstamp.Close();
+ }
}
void cmGlobalGhsMultiGenerator::OutputTopLevelProject(
@@ -682,3 +693,103 @@ bool cmGlobalGhsMultiGenerator::VisitTarget(
/* already complete */
return false;
}
+
+bool cmGlobalGhsMultiGenerator::AddCheckTarget()
+{
+ // Skip the target if no regeneration is to be done.
+ if (this->GlobalSettingIsOn("CMAKE_SUPPRESS_REGENERATION")) {
+ return false;
+ }
+
+ // Get the generators.
+ std::vector<std::unique_ptr<cmLocalGenerator>> const& generators =
+ this->LocalGenerators;
+ auto& lg =
+ cm::static_reference_cast<cmLocalGhsMultiGenerator>(generators[0]);
+
+ // The name of the output file for the custom command.
+ this->StampFile = lg.GetBinaryDirectory() + std::string("/CMakeFiles/") +
+ CHECK_BUILD_SYSTEM_TARGET;
+
+ // Add a custom rule to re-run CMake if any input files changed.
+ {
+ // Collect the input files used to generate all targets in this
+ // project.
+ std::vector<std::string> listFiles;
+ for (const auto& gen : generators) {
+ cm::append(listFiles, gen->GetMakefile()->GetListFiles());
+ }
+
+ // Add the cache file.
+ listFiles.push_back(cmStrCat(
+ this->GetCMakeInstance()->GetHomeOutputDirectory(), "/CMakeCache.txt"));
+
+ // Print not implemented warning.
+ if (this->GetCMakeInstance()->DoWriteGlobVerifyTarget()) {
+ std::ostringstream msg;
+ msg << "Any pre-check scripts, such as those generated for file(GLOB "
+ "CONFIGURE_DEPENDS), will not be run by gbuild.";
+ this->GetCMakeInstance()->IssueMessage(MessageType::AUTHOR_WARNING,
+ msg.str());
+ }
+
+ // Sort the list of input files and remove duplicates.
+ std::sort(listFiles.begin(), listFiles.end(), std::less<std::string>());
+ auto newEnd = std::unique(listFiles.begin(), listFiles.end());
+ listFiles.erase(newEnd, listFiles.end());
+
+ // Create a rule to re-run CMake and create output file.
+ std::string argS = cmStrCat("-S", lg.GetSourceDirectory());
+ std::string argB = cmStrCat("-B", lg.GetBinaryDirectory());
+ cmCustomCommandLines commandLines = cmMakeSingleCommandLine(
+ { cmSystemTools::GetCMakeCommand(), argS, argB });
+
+ /* Create the target(Exclude from ALL_BUILD).
+ *
+ * The build tool, currently, does not support rereading the project files
+ * if they get updated. So do not run this target as part of ALL_BUILD.
+ */
+ auto cc = cm::make_unique<cmCustomCommand>();
+ cmTarget* tgt =
+ lg.AddUtilityCommand(CHECK_BUILD_SYSTEM_TARGET, true, std::move(cc));
+ auto ptr = cm::make_unique<cmGeneratorTarget>(tgt, &lg);
+ auto* gt = ptr.get();
+ lg.AddGeneratorTarget(std::move(ptr));
+
+ // Add the rule.
+ cc = cm::make_unique<cmCustomCommand>();
+ cc->SetOutputs(this->StampFile);
+ cc->SetDepends(listFiles);
+ cc->SetCommandLines(commandLines);
+ cc->SetComment("Checking Build System");
+ cc->SetCMP0116Status(cmPolicies::NEW);
+ cc->SetEscapeOldStyle(false);
+ cc->SetStdPipesUTF8(true);
+
+ if (cmSourceFile* file =
+ lg.AddCustomCommandToOutput(std::move(cc), true)) {
+ gt->AddSource(file->ResolveFullPath());
+ } else {
+ cmSystemTools::Error("Error adding rule for " + this->StampFile);
+ }
+ // Organize in the "predefined targets" folder:
+ if (this->UseFolderProperty()) {
+ tgt->SetProperty("FOLDER", this->GetPredefinedTargetsFolder());
+ }
+ }
+
+ return true;
+}
+
+void cmGlobalGhsMultiGenerator::AddExtraIDETargets()
+{
+ // ToDo: Add ALL_BUILD project target? Yes, need to replace current method
+
+ /* Add Custom Target to check if CMake needs to be rerun.
+ *
+ * The build tool, currently, does not support rereading the project files
+ * if they get updated. So do not make the other targets dependent on this
+ * check.
+ */
+ this->AddCheckTarget();
+}
diff --git a/Source/cmGlobalGhsMultiGenerator.h b/Source/cmGlobalGhsMultiGenerator.h
index 26ea3c7..7343e55 100644
--- a/Source/cmGlobalGhsMultiGenerator.h
+++ b/Source/cmGlobalGhsMultiGenerator.h
@@ -92,6 +92,7 @@ protected:
const cmBuildOptions& buildOptions = cmBuildOptions(),
std::vector<std::string> const& makeOptions =
std::vector<std::string>()) override;
+ void AddExtraIDETargets() override;
private:
void GetToolset(cmMakefile* mf, std::string& tsd, const std::string& ts);
@@ -111,10 +112,12 @@ private:
void WriteAllTarget(cmLocalGenerator* root,
std::vector<cmLocalGenerator*>& generators,
std::string& all_target);
-
+ bool AddCheckTarget();
+ std::string StampFile;
static std::string TrimQuotes(std::string str);
static const char* DEFAULT_BUILD_PROGRAM;
+ static const char* CHECK_BUILD_SYSTEM_TARGET;
bool ComputeTargetBuildOrder(cmGeneratorTarget const* tgt,
std::vector<cmGeneratorTarget const*>& build);