diff options
author | Brad King <brad.king@kitware.com> | 2018-06-01 13:48:56 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2018-06-01 13:49:37 (GMT) |
commit | 4144b78013448f01360cabedd92426bb177a94b7 (patch) | |
tree | 262fef256c2162444af798b4e163d22cb92723ff | |
parent | 5ba76299f8bc3d13a1a3a5542c46cf7c438be675 (diff) | |
parent | 5852acffa4b67a614df3343bcb29e6b9511d0704 (diff) | |
download | CMake-4144b78013448f01360cabedd92426bb177a94b7.zip CMake-4144b78013448f01360cabedd92426bb177a94b7.tar.gz CMake-4144b78013448f01360cabedd92426bb177a94b7.tar.bz2 |
Merge topic 'autogen_autorcc_multi_config'
5852acffa4 Autogen: Add AUTORCC configuration change test
41685c8ba0 Autogen: Let AUTORCC generate output for all configurations
2930a198f6 Autogen: Add lock file to AUTORCC commands
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !2117
17 files changed, 170 insertions, 11 deletions
diff --git a/Source/cmQtAutoGenInitializer.cxx b/Source/cmQtAutoGenInitializer.cxx index 566a2a9..d59f3a7 100644 --- a/Source/cmQtAutoGenInitializer.cxx +++ b/Source/cmQtAutoGenInitializer.cxx @@ -588,8 +588,13 @@ void cmQtAutoGenInitializer::InitCustomTargets() if (!qrc.Unique) { base += qrc.PathChecksum; } + + qrc.LockFile = base; + qrc.LockFile += ".lock"; + qrc.InfoFile = base; qrc.InfoFile += "Info.cmake"; + qrc.SettingsFile = base; qrc.SettingsFile += "Settings.txt"; } @@ -623,14 +628,26 @@ void cmQtAutoGenInitializer::InitCustomTargets() std::vector<std::string> ccOutput; ccOutput.push_back(qrc.RccFile); + cmCustomCommandLines commandLines; - { + if (this->MultiConfig) { + // Build for all configurations + for (std::string const& config : this->ConfigsList) { + cmCustomCommandLine currentLine; + currentLine.push_back(cmSystemTools::GetCMakeCommand()); + currentLine.push_back("-E"); + currentLine.push_back("cmake_autorcc"); + currentLine.push_back(qrc.InfoFile); + currentLine.push_back(config); + commandLines.push_back(std::move(currentLine)); + } + } else { cmCustomCommandLine currentLine; currentLine.push_back(cmSystemTools::GetCMakeCommand()); currentLine.push_back("-E"); currentLine.push_back("cmake_autorcc"); currentLine.push_back(qrc.InfoFile); - currentLine.push_back("$<CONFIGURATION>"); + currentLine.push_back("$<CONFIG>"); commandLines.push_back(std::move(currentLine)); } std::string ccComment = "Automatic RCC for "; @@ -1043,6 +1060,7 @@ void cmQtAutoGenInitializer::SetupCustomTargets() CWrite("ARCC_RCC_LIST_OPTIONS", cmJoin(this->RccListOptions, ";")); ofs << "# Rcc job\n"; + CWrite("ARCC_LOCK_FILE", qrc.LockFile); CWrite("ARCC_SOURCE", qrc.QrcFile); CWrite("ARCC_OUTPUT_CHECKSUM", qrc.PathChecksum); CWrite("ARCC_OUTPUT_NAME", diff --git a/Source/cmQtAutoGenInitializer.h b/Source/cmQtAutoGenInitializer.h index 2a47e46..5fbf0cb 100644 --- a/Source/cmQtAutoGenInitializer.h +++ b/Source/cmQtAutoGenInitializer.h @@ -32,6 +32,7 @@ public: } public: + std::string LockFile; std::string QrcFile; std::string QrcName; std::string PathChecksum; diff --git a/Source/cmQtAutoGenerator.cxx b/Source/cmQtAutoGenerator.cxx index bf184d8..750e1ed 100644 --- a/Source/cmQtAutoGenerator.cxx +++ b/Source/cmQtAutoGenerator.cxx @@ -367,10 +367,11 @@ bool cmQtAutoGenerator::FileSystem::FileRemove(std::string const& filename) return cmSystemTools::RemoveFile(filename); } -bool cmQtAutoGenerator::FileSystem::Touch(std::string const& filename) +bool cmQtAutoGenerator::FileSystem::Touch(std::string const& filename, + bool create) { std::lock_guard<std::mutex> lock(Mutex_); - return cmSystemTools::Touch(filename, false); + return cmSystemTools::Touch(filename, create); } bool cmQtAutoGenerator::FileSystem::MakeDirectory(std::string const& dirname) diff --git a/Source/cmQtAutoGenerator.h b/Source/cmQtAutoGenerator.h index 299e4c2..4e38413 100644 --- a/Source/cmQtAutoGenerator.h +++ b/Source/cmQtAutoGenerator.h @@ -124,7 +124,7 @@ public: bool FileDiffers(std::string const& filename, std::string const& content); bool FileRemove(std::string const& filename); - bool Touch(std::string const& filename); + bool Touch(std::string const& filename, bool create = false); // -- Directory access bool MakeDirectory(std::string const& dirname); diff --git a/Source/cmQtAutoGeneratorRcc.cxx b/Source/cmQtAutoGeneratorRcc.cxx index 84ec5e2..fdb556a 100644 --- a/Source/cmQtAutoGeneratorRcc.cxx +++ b/Source/cmQtAutoGeneratorRcc.cxx @@ -5,6 +5,7 @@ #include "cmAlgorithms.h" #include "cmCryptoHash.h" +#include "cmFileLockResult.h" #include "cmMakefile.h" #include "cmSystemTools.h" #include "cmUVHandlePtr.h" @@ -89,6 +90,7 @@ bool cmQtAutoGeneratorRcc::Init(cmMakefile* makefile) RccListOptions_ = InfoGetList("ARCC_RCC_LIST_OPTIONS"); // - Job + LockFile_ = InfoGet("ARCC_LOCK_FILE"); QrcFile_ = InfoGet("ARCC_SOURCE"); QrcFileName_ = cmSystemTools::GetFilenameName(QrcFile_); QrcFileDir_ = cmSystemTools::GetFilenamePath(QrcFile_); @@ -101,6 +103,10 @@ bool cmQtAutoGeneratorRcc::Init(cmMakefile* makefile) SettingsFile_ = InfoGetConfig("ARCC_SETTINGS_FILE"); // - Validity checks + if (LockFile_.empty()) { + Log().ErrorFile(GeneratorT::RCC, InfoFile(), "Lock file name missing"); + return false; + } if (SettingsFile_.empty()) { Log().ErrorFile(GeneratorT::RCC, InfoFile(), "Settings file name missing"); return false; @@ -170,8 +176,11 @@ void cmQtAutoGeneratorRcc::PollStage() switch (Stage_) { // -- Initialize case StageT::SETTINGS_READ: - SettingsFileRead(); - SetStage(StageT::TEST_QRC_RCC_FILES); + if (SettingsFileRead()) { + SetStage(StageT::TEST_QRC_RCC_FILES); + } else { + SetStage(StageT::FINISH); + } break; // -- Change detection @@ -252,7 +261,7 @@ std::string cmQtAutoGeneratorRcc::MultiConfigOutput() const return res; } -void cmQtAutoGeneratorRcc::SettingsFileRead() +bool cmQtAutoGeneratorRcc::SettingsFileRead() { // Compose current settings strings { @@ -278,21 +287,51 @@ void cmQtAutoGeneratorRcc::SettingsFileRead() } } + // Make sure the settings file exists + if (!FileSys().FileExists(SettingsFile_, true)) { + // Touch the settings file to make sure it exists + FileSys().Touch(SettingsFile_, true); + } + + // Lock the lock file + { + // Make sure the lock file exists + if (!FileSys().FileExists(LockFile_, true)) { + if (!FileSys().Touch(LockFile_, true)) { + Log().ErrorFile(GeneratorT::RCC, LockFile_, + "Lock file creation failed"); + Error_ = true; + return false; + } + } + // Lock the lock file + cmFileLockResult lockResult = + LockFileLock_.Lock(LockFile_, static_cast<unsigned long>(-1)); + if (!lockResult.IsOk()) { + Log().ErrorFile(GeneratorT::RCC, LockFile_, + "File lock failed: " + lockResult.GetOutputMessage()); + Error_ = true; + return false; + } + } + // Read old settings { std::string content; if (FileSys().FileRead(content, SettingsFile_)) { SettingsChanged_ = (SettingsString_ != SettingsFind(content, "rcc")); - // In case any setting changed remove the old settings file. + // In case any setting changed clear the old settings file. // This triggers a full rebuild on the next run if the current // build is aborted before writing the current settings in the end. if (SettingsChanged_) { - FileSys().FileRemove(SettingsFile_); + FileSys().FileWrite(GeneratorT::RCC, SettingsFile_, ""); } } else { SettingsChanged_ = true; } } + + return true; } void cmQtAutoGeneratorRcc::SettingsFileWrite() @@ -315,6 +354,9 @@ void cmQtAutoGeneratorRcc::SettingsFileWrite() Error_ = true; } } + + // Unlock the lock file + LockFileLock_.Release(); } bool cmQtAutoGeneratorRcc::TestQrcRccFiles() diff --git a/Source/cmQtAutoGeneratorRcc.h b/Source/cmQtAutoGeneratorRcc.h index 55e0998..74cec36 100644 --- a/Source/cmQtAutoGeneratorRcc.h +++ b/Source/cmQtAutoGeneratorRcc.h @@ -5,6 +5,7 @@ #include "cmConfigure.h" // IWYU pragma: keep +#include "cmFileLock.h" #include "cmQtAutoGenerator.h" #include "cm_uv.h" @@ -48,7 +49,7 @@ private: void PollStage(); void SetStage(StageT stage); // -- Settings file - void SettingsFileRead(); + bool SettingsFileRead(); void SettingsFileWrite(); // -- Tests bool TestQrcRccFiles(); @@ -77,6 +78,8 @@ private: std::string RccExecutable_; std::vector<std::string> RccListOptions_; // -- Job + std::string LockFile_; + cmFileLock LockFileLock_; std::string QrcFile_; std::string QrcFileName_; std::string QrcFileDir_; diff --git a/Tests/QtAutogen/CommonTests.cmake b/Tests/QtAutogen/CommonTests.cmake index 982a296..cd05aeb 100644 --- a/Tests/QtAutogen/CommonTests.cmake +++ b/Tests/QtAutogen/CommonTests.cmake @@ -43,3 +43,4 @@ if(NOT QT_TEST_VERSION STREQUAL 4) ADD_AUTOGEN_TEST(RerunMocPlugin) endif() ADD_AUTOGEN_TEST(RerunRccDepends) +ADD_AUTOGEN_TEST(RerunRccConfigChange) diff --git a/Tests/QtAutogen/RerunRccConfigChange/CMakeLists.txt b/Tests/QtAutogen/RerunRccConfigChange/CMakeLists.txt new file mode 100644 index 0000000..f09865d --- /dev/null +++ b/Tests/QtAutogen/RerunRccConfigChange/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.11.2) +project(RerunRccConfigChange) +include("../AutogenTest.cmake") + +# Tests rcc rebuilding after a configuration change + +# Dummy executable to generate a clean target +add_executable(dummy dummy.cpp) + +# When a .qrc or a file listed in a .qrc file changes, +# the target must be rebuilt +set(timeformat "%Y%j%H%M%S") +set(rccDepSD "${CMAKE_CURRENT_SOURCE_DIR}/RccConfigChange") +set(rccDepBD "${CMAKE_CURRENT_BINARY_DIR}/RccConfigChange") + +# Initial build +try_compile(RCC_DEPENDS + "${rccDepBD}" + "${rccDepSD}" + RccConfigChange + CMAKE_FLAGS "-DQT_TEST_VERSION=${QT_TEST_VERSION}" + "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}" + OUTPUT_VARIABLE output +) +if (NOT RCC_DEPENDS) + message(SEND_ERROR "Initial build of rccConfigChange failed. Output: ${output}") +endif() + +# - Rebuild Release +message("Rebuilding rccConfigChange in Release configuration") +execute_process(COMMAND "${CMAKE_COMMAND}" --build . --config Release WORKING_DIRECTORY "${rccDepBD}" RESULT_VARIABLE result) +if (result) + message(SEND_ERROR "Release build of rccConfigChange failed.") +endif() + +# - Rebuild Debug +message("Rebuilding rccConfigChange in Debug configuration") +execute_process(COMMAND "${CMAKE_COMMAND}" --build . --config Debug WORKING_DIRECTORY "${rccDepBD}" RESULT_VARIABLE result) +if (result) + message(SEND_ERROR "Debug build of rccConfigChange failed.") +endif() diff --git a/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/CMakeLists.txt b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/CMakeLists.txt new file mode 100644 index 0000000..3cddf5c --- /dev/null +++ b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.11.2) +project(RccConfigChange) +include("../../AutogenTest.cmake") + +# Enable AUTORCC for all targets +set(CMAKE_AUTORCC ON) + +# Initial resource files setup +configure_file(resGen/input1.txt.in resGen/input1.txt COPYONLY) +configure_file(resGen/input2.txt.in resGen/input2.txt COPYONLY) +configure_file(resGen.qrc.in resGen.qrc COPYONLY) + +# Generated qrc file with dependency +add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/resGen.qrc + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/resGen.qrc.in + COMMAND ${CMAKE_COMMAND} -E sleep 2 + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/resGen.qrc.in ${CMAKE_CURRENT_BINARY_DIR}/resGen.qrc +) + +# Target that uses a plain .qrc file +add_executable(rccConfigChangePlain main.cpp resPlain.qrc) +target_link_libraries(rccConfigChangePlain ${QT_QTCORE_TARGET}) + +# Target that uses a GENERATED .qrc file +add_executable(rccConfigChangeGen main.cpp ${CMAKE_CURRENT_BINARY_DIR}/resGen.qrc ) +target_link_libraries(rccConfigChangeGen ${QT_QTCORE_TARGET}) diff --git a/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/main.cpp b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/main.cpp new file mode 100644 index 0000000..766b775 --- /dev/null +++ b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/main.cpp @@ -0,0 +1,5 @@ + +int main() +{ + return 0; +} diff --git a/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resGen.qrc.in b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resGen.qrc.in new file mode 100644 index 0000000..9674772 --- /dev/null +++ b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resGen.qrc.in @@ -0,0 +1,6 @@ +<RCC> + <qresource prefix="/TextsGenerated"> + <file>resGen/input1.txt</file> + <file>resGen/input2.txt</file> + </qresource> +</RCC> diff --git a/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resGen/input1.txt.in b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resGen/input1.txt.in new file mode 100644 index 0000000..4f24589 --- /dev/null +++ b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resGen/input1.txt.in @@ -0,0 +1 @@ +Generated resource input. diff --git a/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resGen/input2.txt.in b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resGen/input2.txt.in new file mode 100644 index 0000000..4f24589 --- /dev/null +++ b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resGen/input2.txt.in @@ -0,0 +1 @@ +Generated resource input. diff --git a/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resPlain.qrc b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resPlain.qrc new file mode 100644 index 0000000..e448726 --- /dev/null +++ b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resPlain.qrc @@ -0,0 +1,6 @@ +<RCC> + <qresource prefix="/TextsPlain"> + <file>resPlain/input1.txt</file> + <file>resPlain/input2.txt</file> + </qresource> +</RCC> diff --git a/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resPlain/input1.txt b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resPlain/input1.txt new file mode 100644 index 0000000..03969c6 --- /dev/null +++ b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resPlain/input1.txt @@ -0,0 +1 @@ +Plain resource input. diff --git a/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resPlain/input2.txt b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resPlain/input2.txt new file mode 100644 index 0000000..03969c6 --- /dev/null +++ b/Tests/QtAutogen/RerunRccConfigChange/RccConfigChange/resPlain/input2.txt @@ -0,0 +1 @@ +Plain resource input. diff --git a/Tests/QtAutogen/RerunRccConfigChange/dummy.cpp b/Tests/QtAutogen/RerunRccConfigChange/dummy.cpp new file mode 100644 index 0000000..4837a76 --- /dev/null +++ b/Tests/QtAutogen/RerunRccConfigChange/dummy.cpp @@ -0,0 +1,5 @@ + +int main(int argv, char** args) +{ + return 0; +} |