mirror of
https://github.com/reactos/CMake.git
synced 2025-03-03 17:39:10 +00:00

This introduces concurrent thread processing in the `_autogen` target wich processes AUTOMOC and AUTOUIC. Source file parsing is distributed among the threads by using a job queue from which the threads pull new parse jobs. Each thread might start an independent ``moc`` or ``uic`` process. Altogether this roughly speeds up the AUTOMOC and AUTOUIC build process by the number of physical CPUs on the host system. The exact number of threads to start in the `_autogen` target is controlled by the new AUTOGEN_PARALLEL target property which is initialized by the new CMAKE_AUTOGEN_PARALLEL variable. If AUTOGEN_PARALLEL is empty or unset (which is the default) the thread count is set to the number of physical CPUs on the host system. The AUTOMOC/AUTOUIC generator and the AUTORCC generator are refactored to use a libuv loop internally. Closes #17422.
102 lines
2.3 KiB
C++
102 lines
2.3 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#ifndef cmQtAutoGeneratorRcc_h
|
|
#define cmQtAutoGeneratorRcc_h
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#include "cmQtAutoGen.h"
|
|
#include "cmQtAutoGenerator.h"
|
|
#include "cm_uv.h"
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
class cmMakefile;
|
|
|
|
// @brief AUTORCC generator
|
|
class cmQtAutoGeneratorRcc : public cmQtAutoGenerator
|
|
{
|
|
CM_DISABLE_COPY(cmQtAutoGeneratorRcc)
|
|
public:
|
|
cmQtAutoGeneratorRcc();
|
|
~cmQtAutoGeneratorRcc() override;
|
|
|
|
private:
|
|
// -- Types
|
|
|
|
/// @brief Processing stage
|
|
enum class StageT
|
|
{
|
|
SETTINGS_READ,
|
|
TEST_QRC_RCC_FILES,
|
|
TEST_RESOURCES_READ,
|
|
TEST_RESOURCES,
|
|
TEST_INFO_FILE,
|
|
GENERATE,
|
|
GENERATE_RCC,
|
|
GENERATE_WRAPPER,
|
|
SETTINGS_WRITE,
|
|
FINISH,
|
|
END
|
|
};
|
|
|
|
// -- Abstract processing interface
|
|
bool Init(cmMakefile* makefile) override;
|
|
bool Process() override;
|
|
// -- Process stage
|
|
static void UVPollStage(uv_async_t* handle);
|
|
void PollStage();
|
|
void SetStage(StageT stage);
|
|
// -- Settings file
|
|
void SettingsFileRead();
|
|
void SettingsFileWrite();
|
|
// -- Tests
|
|
bool TestQrcRccFiles();
|
|
bool TestResourcesRead();
|
|
bool TestResources();
|
|
void TestInfoFile();
|
|
// -- Generation
|
|
void GenerateParentDir();
|
|
bool GenerateRcc();
|
|
void GenerateWrapper();
|
|
|
|
// -- Utility
|
|
bool StartProcess(std::string const& workingDirectory,
|
|
std::vector<std::string> const& command,
|
|
bool mergedOutput);
|
|
|
|
private:
|
|
// -- Config settings
|
|
bool SettingsChanged_;
|
|
std::string ConfigSuffix_;
|
|
MultiConfigT MultiConfig_;
|
|
// -- Directories
|
|
std::string AutogenBuildDir_;
|
|
// -- Qt environment
|
|
std::string RccExecutable_;
|
|
std::vector<std::string> RccListOptions_;
|
|
// -- Job
|
|
std::string QrcFile_;
|
|
std::string QrcFileName_;
|
|
std::string QrcFileDir_;
|
|
std::string RccFile_;
|
|
std::string RccFileWrapper_;
|
|
std::string RccFileBuild_;
|
|
std::vector<std::string> Options_;
|
|
std::vector<std::string> Inputs_;
|
|
// -- Subprocess
|
|
ProcessResultT ProcessResult_;
|
|
std::unique_ptr<ReadOnlyProcessT> Process_;
|
|
// -- Settings file
|
|
std::string SettingsFile_;
|
|
std::string SettingsString_;
|
|
// -- libuv loop
|
|
StageT Stage_;
|
|
bool Error_;
|
|
bool Generate_;
|
|
bool BuildFileChanged_;
|
|
};
|
|
|
|
#endif
|