summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/cmQtAutoGenGlobalInitializer.cxx22
-rw-r--r--Source/cmQtAutoGenInitializer.cxx61
2 files changed, 65 insertions, 18 deletions
diff --git a/Source/cmQtAutoGenGlobalInitializer.cxx b/Source/cmQtAutoGenGlobalInitializer.cxx
index 0ed8af4..678ff14 100644
--- a/Source/cmQtAutoGenGlobalInitializer.cxx
+++ b/Source/cmQtAutoGenGlobalInitializer.cxx
@@ -75,14 +75,26 @@ cmQtAutoGenGlobalInitializer::cmQtAutoGenGlobalInitializer(
bool const uic = target->GetPropertyAsBool("AUTOUIC");
bool const rcc = target->GetPropertyAsBool("AUTORCC");
if (moc || uic || rcc) {
- // We support Qt4 and Qt5
+ std::string const mocExec =
+ target->GetSafeProperty("AUTOMOC_EXECUTABLE");
+ std::string const uicExec =
+ target->GetSafeProperty("AUTOUIC_EXECUTABLE");
+ std::string const rccExec =
+ target->GetSafeProperty("AUTORCC_EXECUTABLE");
+
+ // We support Qt4, Qt5 and Qt6
auto qtVersion = cmQtAutoGenInitializer::GetQtVersion(target);
- if ((qtVersion.Major == 4) || (qtVersion.Major == 5) ||
- (qtVersion.Major == 6)) {
+ bool const validQt = (qtVersion.Major == 4) ||
+ (qtVersion.Major == 5) || (qtVersion.Major == 6);
+ bool const mocIsValid = moc && (validQt || !mocExec.empty());
+ bool const uicIsValid = uic && (validQt || !uicExec.empty());
+ bool const rccIsValid = rcc && (validQt || !rccExec.empty());
+
+ if (mocIsValid || uicIsValid || rccIsValid) {
// Create autogen target initializer
Initializers_.emplace_back(cm::make_unique<cmQtAutoGenInitializer>(
- this, target, qtVersion, moc, uic, rcc, globalAutoGenTarget,
- globalAutoRccTarget));
+ this, target, qtVersion, mocIsValid, uicIsValid, rccIsValid,
+ globalAutoGenTarget, globalAutoRccTarget));
}
}
}
diff --git a/Source/cmQtAutoGenInitializer.cxx b/Source/cmQtAutoGenInitializer.cxx
index ffa6a35..e4d2c82 100644
--- a/Source/cmQtAutoGenInitializer.cxx
+++ b/Source/cmQtAutoGenInitializer.cxx
@@ -9,6 +9,7 @@
#include "cmCustomCommandLines.h"
#include "cmDuration.h"
#include "cmFilePathChecksum.h"
+#include "cmGeneratorExpression.h"
#include "cmGeneratorTarget.h"
#include "cmGlobalGenerator.h"
#include "cmLinkItem.h"
@@ -398,8 +399,16 @@ bool cmQtAutoGenInitializer::InitCustomTargets()
}
// Init uic specific settings
- if (this->Uic.Enabled && !InitUic()) {
- return false;
+ if (this->Uic.Enabled) {
+ if (InitUic()) {
+ auto* uicTarget = makefile->FindTargetToUse(
+ GetQtExecutableTargetName(this->QtVersion, "uic"));
+ if (uicTarget != nullptr) {
+ this->AutogenTarget.DependTargets.insert(uicTarget);
+ }
+ } else {
+ return false;
+ }
}
// Autogen target name
@@ -440,6 +449,12 @@ bool cmQtAutoGenInitializer::InitCustomTargets()
this->AutogenTarget.DependOrigin =
this->Target->GetPropertyAsBool("AUTOGEN_ORIGIN_DEPENDS");
+ auto* mocTarget = makefile->FindTargetToUse(
+ GetQtExecutableTargetName(this->QtVersion, "moc"));
+ if (mocTarget != nullptr) {
+ this->AutogenTarget.DependTargets.insert(mocTarget);
+ }
+
std::string const deps =
this->Target->GetSafeProperty("AUTOGEN_TARGET_DEPENDS");
if (!deps.empty()) {
@@ -1095,6 +1110,7 @@ bool cmQtAutoGenInitializer::InitRccTargets()
{
cmMakefile* makefile = this->Target->Target->GetMakefile();
cmLocalGenerator* localGen = this->Target->GetLocalGenerator();
+ auto rccTargetName = GetQtExecutableTargetName(this->QtVersion, "rcc");
for (Qrc const& qrc : this->Rcc.Qrcs) {
// Register info file as generated by CMake
@@ -1105,6 +1121,11 @@ bool cmQtAutoGenInitializer::InitRccTargets()
std::vector<std::string> ccOutput;
ccOutput.push_back(qrc.RccFile);
+ std::vector<std::string> ccDepends;
+ // Add the .qrc and info file to the custom command dependencies
+ ccDepends.push_back(qrc.QrcFile);
+ ccDepends.push_back(qrc.InfoFile);
+
cmCustomCommandLines commandLines;
if (this->MultiConfig) {
// Build for all configurations
@@ -1140,15 +1161,12 @@ bool cmQtAutoGenInitializer::InitRccTargets()
ccName += "_";
ccName += qrc.PathChecksum;
}
- std::vector<std::string> ccDepends;
- // Add the .qrc and info file to the custom target dependencies
- ccDepends.push_back(qrc.QrcFile);
- ccDepends.push_back(qrc.InfoFile);
cmTarget* autoRccTarget = makefile->AddUtilityCommand(
ccName, cmMakefile::TargetOrigin::Generator, true,
this->Dir.Work.c_str(), ccOutput, ccDepends, commandLines, false,
ccComment.c_str());
+
// Create autogen generator target
localGen->AddGeneratorTarget(
new cmGeneratorTarget(autoRccTarget, localGen));
@@ -1157,6 +1175,9 @@ bool cmQtAutoGenInitializer::InitRccTargets()
if (!this->TargetsFolder.empty()) {
autoRccTarget->SetProperty("FOLDER", this->TargetsFolder.c_str());
}
+ if (!rccTargetName.empty()) {
+ autoRccTarget->AddUtility(rccTargetName, makefile);
+ }
}
// Add autogen target to the origin target dependencies
this->Target->Target->AddUtility(ccName, makefile);
@@ -1169,16 +1190,15 @@ bool cmQtAutoGenInitializer::InitRccTargets()
// Create custom rcc command
{
std::vector<std::string> ccByproducts;
- std::vector<std::string> ccDepends;
- // Add the .qrc and info file to the custom command dependencies
- ccDepends.push_back(qrc.QrcFile);
- ccDepends.push_back(qrc.InfoFile);
// Add the resource files to the dependencies
for (std::string const& fileName : qrc.Resources) {
// Add resource file to the custom command dependencies
ccDepends.push_back(fileName);
}
+ if (!rccTargetName.empty()) {
+ ccDepends.push_back(rccTargetName);
+ }
makefile->AddCustomCommandToOutput(ccOutput, ccByproducts, ccDepends,
/*main_dependency*/ std::string(),
commandLines, ccComment.c_str(),
@@ -1421,21 +1441,36 @@ std::pair<bool, std::string> GetQtExecutable(
const cmQtAutoGen::IntegerVersion& qtVersion, cmGeneratorTarget* target,
const std::string& executable, bool ignoreMissingTarget, std::string* output)
{
+ const std::string upperExecutable = cmSystemTools::UpperCase(executable);
+ std::string result =
+ target->Target->GetSafeProperty("AUTO" + upperExecutable + "_EXECUTABLE");
+ if (!result.empty()) {
+ cmListFileBacktrace lfbt = target->Target->GetMakefile()->GetBacktrace();
+ cmGeneratorExpression ge(lfbt);
+ std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(result);
+ result = cge->Evaluate(target->GetLocalGenerator(), "");
+
+ return std::make_pair(true, result);
+ }
+
std::string err;
- std::string result;
// Find executable
{
const std::string targetName =
GetQtExecutableTargetName(qtVersion, executable);
if (targetName.empty()) {
- err = "The AUTOMOC, AUTOUIC and AUTORCC feature ";
+ err = "The AUTO" + upperExecutable + " feature ";
err += "supports only Qt 4, Qt 5 and Qt 6.";
} else {
cmLocalGenerator* localGen = target->GetLocalGenerator();
cmGeneratorTarget* tgt = localGen->FindGeneratorTargetToUse(targetName);
if (tgt != nullptr) {
- result = tgt->ImportedGetLocation("");
+ if (tgt->IsImported()) {
+ result = tgt->ImportedGetLocation("");
+ } else {
+ result = tgt->GetLocation("");
+ }
} else {
if (ignoreMissingTarget) {
return std::make_pair(true, "");