de-duplicate writeout of config files

Change-Id: Iaad06f170cf2be3d3fca533a735b69316347ed5b
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
This commit is contained in:
Oswald Buddenhagen 2013-07-15 16:45:44 +02:00 committed by The Qt Project
parent 8a245c9fc2
commit ca645afdc4
2 changed files with 90 additions and 89 deletions

View File

@ -2806,21 +2806,19 @@ void Configure::generateOutputVars()
void Configure::generateCachefile()
{
// Generate .qmake.cache
QFile cacheFile(buildPath + "/.qmake.cache");
if (cacheFile.open(QFile::WriteOnly | QFile::Text)) { // Truncates any existing file.
QTextStream cacheStream(&cacheFile);
{
FileWriter cacheStream(buildPath + "/.qmake.cache");
cacheStream << "QT_SOURCE_TREE = " << formatPath(dictionary["QT_SOURCE_TREE"]) << endl;
cacheStream << "QT_BUILD_TREE = " << formatPath(dictionary["QT_BUILD_TREE"]) << endl;
cacheStream.flush();
cacheFile.close();
if (!cacheStream.flush())
dictionary[ "DONE" ] = "error";
}
// Generate qmodule.pri
QFile moduleFile(dictionary[ "QT_BUILD_TREE" ] + "/mkspecs/qmodule.pri");
if (moduleFile.open(QFile::WriteOnly | QFile::Text)) { // Truncates any existing file.
QTextStream moduleStream(&moduleFile);
{
FileWriter moduleStream(dictionary[ "QT_BUILD_TREE" ] + "/mkspecs/qmodule.pri");
moduleStream << "QT_BUILD_PARTS += " << buildParts.join(' ') << endl;
if (!skipModules.isEmpty())
@ -2882,8 +2880,8 @@ void Configure::generateCachefile()
for (QStringList::Iterator var = qmakeVars.begin(); var != qmakeVars.end(); ++var)
moduleStream << (*var) << endl;
moduleStream.flush();
moduleFile.close();
if (!moduleStream.flush())
dictionary[ "DONE" ] = "error";
}
}
@ -3079,9 +3077,8 @@ bool Configure::compilerSupportsFlag(const QString &compilerAndArgs)
void Configure::generateQConfigPri()
{
// Generate qconfig.pri
QFile configFile(dictionary[ "QT_BUILD_TREE" ] + "/mkspecs/qconfig.pri");
if (configFile.open(QFile::WriteOnly | QFile::Text)) { // Truncates any existing file.
QTextStream configStream(&configFile);
{
FileWriter configStream(dictionary[ "QT_BUILD_TREE" ] + "/mkspecs/qconfig.pri");
configStream << "CONFIG+= ";
configStream << dictionary[ "BUILD" ];
@ -3151,8 +3148,8 @@ void Configure::generateQConfigPri()
if (dictionary[ "SHARED" ] == "no")
configStream << "QT_DEFAULT_QPA_PLUGIN = q" << qpaPlatformName() << endl;
configStream.flush();
configFile.close();
if (!configStream.flush())
dictionary[ "DONE" ] = "error";
}
}
@ -3190,13 +3187,8 @@ QString Configure::addDefine(QString def)
void Configure::generateConfigfiles()
{
QDir(buildPath).mkpath("src/corelib/global");
QString outName(buildPath + "/src/corelib/global/qconfig.h");
QTemporaryFile tmpFile;
QTextStream tmpStream;
if (tmpFile.open()) {
tmpStream.setDevice(&tmpFile);
{
FileWriter tmpStream(buildPath + "/src/corelib/global/qconfig.h");
if (dictionary[ "QCONFIG" ] == "full") {
tmpStream << "/* Everything */" << endl;
@ -3206,8 +3198,7 @@ void Configure::generateConfigfiles()
tmpStream << "#ifndef QT_BOOTSTRAPPED" << endl;
QFile inFile(sourcePath + "/src/corelib/global/" + configName);
if (inFile.open(QFile::ReadOnly)) {
QByteArray buffer = inFile.readAll();
tmpFile.write(buffer.constData(), buffer.size());
tmpStream << QTextStream(&inFile).readAll();
inFile.close();
}
tmpStream << "#endif // QT_BOOTSTRAPPED" << endl;
@ -3338,68 +3329,40 @@ void Configure::generateConfigfiles()
tmpStream<<"#define QT_QPA_DEFAULT_PLATFORM_NAME \"" << qpaPlatformName() << "\""<<endl;
tmpStream.flush();
tmpFile.flush();
// Replace old qconfig.h with new one
::SetFileAttributes((wchar_t*)outName.utf16(), FILE_ATTRIBUTE_NORMAL);
QFile::remove(outName);
tmpFile.copy(outName);
tmpFile.close();
if (!tmpStream.flush())
dictionary[ "DONE" ] = "error";
}
QTemporaryFile tmpFile2;
if (tmpFile2.open()) {
tmpStream.setDevice(&tmpFile2);
{
FileWriter tmpStream(buildPath + "/include/QtCore/qconfig.h");
tmpStream << "#include \"../../src/corelib/global/qconfig.h\"" << endl;
tmpStream.flush();
tmpFile2.flush();
outName = buildPath + "/include/QtCore/qconfig.h";
::SetFileAttributes((wchar_t*)outName.utf16(), FILE_ATTRIBUTE_NORMAL);
QFile::remove(outName);
tmpFile2.copy(outName);
tmpFile2.close();
if (!tmpStream.flush())
dictionary[ "DONE" ] = "error";
}
QTemporaryFile tmpFile2a;
if (tmpFile2a.open()) {
tmpStream.setDevice(&tmpFile2a);
{
FileWriter tmpStream(buildPath + "/include/QtCore/QtConfig");
tmpStream << "#include \"qconfig.h\"" << endl;
tmpStream.flush();
tmpFile2a.flush();
outName = buildPath + "/include/QtCore/QtConfig";
::SetFileAttributes((wchar_t*)outName.utf16(), FILE_ATTRIBUTE_NORMAL);
QFile::remove(outName);
tmpFile2a.copy(outName);
tmpFile2a.close();
if (!tmpStream.flush())
dictionary[ "DONE" ] = "error";
}
QTemporaryFile tmpFile3;
if (tmpFile3.open()) {
tmpStream.setDevice(&tmpFile3);
if (dictionary["EDITION"] == "Evaluation" || qmakeDefines.contains("QT_EVAL")) {
FileWriter tmpStream(buildPath + "/src/corelib/global/qconfig_eval.cpp");
tmpStream << "/* Evaluation license key */" << endl
<< "static const volatile char qt_eval_key_data [512 + 12] = \"qt_qevalkey=" << licenseInfo["LICENSEKEYEXT"] << "\";" << endl;
tmpStream.flush();
tmpFile3.flush();
outName = buildPath + "/src/corelib/global/qconfig_eval.cpp";
::SetFileAttributes((wchar_t*)outName.utf16(), FILE_ATTRIBUTE_NORMAL);
QFile::remove(outName);
if (dictionary["EDITION"] == "Evaluation" || qmakeDefines.contains("QT_EVAL"))
tmpFile3.copy(outName);
tmpFile3.close();
if (!tmpStream.flush())
dictionary[ "DONE" ] = "error";
}
QFile qdeviceFile(dictionary["QT_BUILD_TREE"] + "/mkspecs/qdevice.pri");
if (qdeviceFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
tmpStream.setDevice(&qdeviceFile);
{
FileWriter tmpStream(dictionary["QT_BUILD_TREE"] + "/mkspecs/qdevice.pri");
QString android_platform(dictionary.contains("ANDROID_PLATFORM")
? dictionary["ANDROID_PLATFORM"]
: QString("android-9"));
@ -3420,8 +3383,9 @@ void Configure::generateConfigfiles()
tmpStream << " DEFAULT_ANDROID_TARGET_ARCH = " << android_arch << endl;
tmpStream << " DEFAULT_ANDROID_NDK_TOOLCHAIN_VERSION = " << android_tc_vers << endl;
tmpStream << "}" << endl;
tmpStream.flush();
qdeviceFile.close();
if (!tmpStream.flush())
dictionary[ "DONE" ] = "error";
}
}
@ -3716,17 +3680,13 @@ void Configure::generateQConfigCpp()
if (dictionary["QT_HOST_DATA"].isEmpty())
dictionary["QT_HOST_DATA"] = haveHpx ? dictionary["QT_HOST_PREFIX"] : dictionary["QT_INSTALL_ARCHDATA"];
// Generate the new qconfig.cpp file
QDir(buildPath).mkpath("src/corelib/global");
const QString outName(buildPath + "/src/corelib/global/qconfig.cpp");
QString specPfx = dictionary["QT_HOST_DATA"] + "/mkspecs/";
QString hostSpec = stripPrefix(dictionary["QMAKESPEC"], specPfx);
QString targSpec = dictionary.contains("XQMAKESPEC") ? stripPrefix(dictionary["XQMAKESPEC"], specPfx) : hostSpec;
QTemporaryFile tmpFile;
if (tmpFile.open()) {
QTextStream tmpStream(&tmpFile);
// Generate the new qconfig.cpp file
{
FileWriter tmpStream(buildPath + "/src/corelib/global/qconfig.cpp");
tmpStream << "/* Licensed */" << endl
<< "static const char qt_configure_licensee_str [512 + 12] = \"qt_lcnsuser=" << licenseInfo["LICENSEE"] << "\";" << endl
<< "static const char qt_configure_licensed_products_str [512 + 12] = \"qt_lcnsprod=" << dictionary["EDITION"] << "\";" << endl
@ -3771,14 +3731,8 @@ void Configure::generateQConfigCpp()
if ((platform() != WINDOWS) && (platform() != WINDOWS_CE))
tmpStream << "#define QT_CONFIGURE_SETTINGS_PATH qt_configure_settings_path_str + 12;" << endl;
tmpStream.flush();
tmpFile.flush();
// Replace old qconfig.cpp with new one
::SetFileAttributes((wchar_t*)outName.utf16(), FILE_ATTRIBUTE_NORMAL);
QFile::remove(outName);
tmpFile.copy(outName);
tmpFile.close();
if (!tmpStream.flush())
dictionary[ "DONE" ] = "error";
}
}
@ -4270,4 +4224,41 @@ int Configure::platform() const
return WINDOWS;
}
FileWriter::FileWriter(const QString &name)
: QTextStream()
, m_name(name)
{
m_buffer.open(QIODevice::WriteOnly);
setDevice(&m_buffer);
}
bool FileWriter::flush()
{
QTextStream::flush();
QString dir = QFileInfo(m_name).absolutePath();
if (!QDir().mkpath(dir)) {
cout << "Cannot create directory " << qPrintable(QDir::toNativeSeparators(dir)) << ".\n";
return false;
}
QFile file(m_name + ".new");
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
if (file.write(m_buffer.data()) == m_buffer.data().size()) {
file.close();
if (file.error() == QFile::NoError) {
::SetFileAttributes((wchar_t*)m_name.utf16(), FILE_ATTRIBUTE_NORMAL);
QFile::remove(m_name);
if (!file.rename(m_name)) {
cout << "Cannot replace file " << qPrintable(QDir::toNativeSeparators(m_name)) << ".\n";
return false;
}
return true;
}
}
}
cout << "Cannot create file " << qPrintable(QDir::toNativeSeparators(file.fileName()))
<< ": " << qPrintable(file.errorString()) << ".\n";
file.remove();
return false;
}
QT_END_NAMESPACE

View File

@ -43,6 +43,7 @@
#include <qstring.h>
#include <qstringlist.h>
#include <qlist.h>
#include <qbuffer.h>
#include <qtextstream.h>
#include <qdir.h>
@ -191,5 +192,14 @@ public:
Configure::ProjectType qmakeTemplate;
};
class FileWriter : public QTextStream
{
public:
FileWriter(const QString &name);
bool flush();
private:
QString m_name;
QBuffer m_buffer;
};
QT_END_NAMESPACE