Fix qmlcachegen command line parameters

Add support for specifying the output file name

Change-Id: I3ec3cecae2334a7640baa928c0739c5521496d2d
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
Simon Hausmann 2017-03-02 15:52:38 +01:00
parent 38919dc825
commit 1102f6ca7f
3 changed files with 20 additions and 17 deletions

View File

@ -77,13 +77,7 @@ namespace QV4 {
namespace CompiledData { namespace CompiledData {
#ifdef V4_BOOTSTRAP #if !defined(V4_BOOTSTRAP)
static QString cacheFilePath(const QString &localSourcePath)
{
const QString localCachePath = localSourcePath + QLatin1Char('c');
return localCachePath;
}
#else
static QString cacheFilePath(const QUrl &url) static QString cacheFilePath(const QUrl &url)
{ {
const QString localSourcePath = QQmlFile::urlToLocalFileOrQrc(url); const QString localSourcePath = QQmlFile::urlToLocalFileOrQrc(url);
@ -408,7 +402,7 @@ bool CompilationUnit::memoryMapCode(QString *errorString)
#endif // V4_BOOTSTRAP #endif // V4_BOOTSTRAP
#if defined(V4_BOOTSTRAP) #if defined(V4_BOOTSTRAP)
bool CompilationUnit::saveToDisk(const QString &unitUrl, QString *errorString) bool CompilationUnit::saveToDisk(const QString &outputFileName, QString *errorString)
#else #else
bool CompilationUnit::saveToDisk(const QUrl &unitUrl, QString *errorString) bool CompilationUnit::saveToDisk(const QUrl &unitUrl, QString *errorString)
#endif #endif
@ -425,11 +419,12 @@ bool CompilationUnit::saveToDisk(const QUrl &unitUrl, QString *errorString)
*errorString = QStringLiteral("File has to be a local file."); *errorString = QStringLiteral("File has to be a local file.");
return false; return false;
} }
const QString outputFileName = cacheFilePath(unitUrl);
#endif #endif
#if QT_CONFIG(temporaryfile) #if QT_CONFIG(temporaryfile)
// Foo.qml -> Foo.qmlc // Foo.qml -> Foo.qmlc
QSaveFile cacheFile(cacheFilePath(unitUrl)); QSaveFile cacheFile(outputFileName);
if (!cacheFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { if (!cacheFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
*errorString = cacheFile.errorString(); *errorString = cacheFile.errorString();
return false; return false;

View File

@ -908,7 +908,7 @@ protected:
public: public:
#if defined(V4_BOOTSTRAP) #if defined(V4_BOOTSTRAP)
bool saveToDisk(const QString &unitUrl, QString *errorString); bool saveToDisk(const QString &outputFileName, QString *errorString);
#else #else
bool saveToDisk(const QUrl &unitUrl, QString *errorString); bool saveToDisk(const QUrl &unitUrl, QString *errorString);
#endif #endif

View File

@ -80,7 +80,7 @@ QString diagnosticErrorMessage(const QString &fileName, const QQmlJS::Diagnostic
return message; return message;
} }
static bool compileQmlFile(const QString &inputFileName, QV4::EvalISelFactory *iselFactory, Error *error) static bool compileQmlFile(const QString &inputFileName, const QString &outputFileName, QV4::EvalISelFactory *iselFactory, Error *error)
{ {
QmlIR::Document irDocument(/*debugMode*/false); QmlIR::Document irDocument(/*debugMode*/false);
@ -153,7 +153,7 @@ static bool compileQmlFile(const QString &inputFileName, QV4::EvalISelFactory *i
unit->flags |= QV4::CompiledData::Unit::PendingTypeCompilation; unit->flags |= QV4::CompiledData::Unit::PendingTypeCompilation;
irDocument.javaScriptCompilationUnit->data = unit; irDocument.javaScriptCompilationUnit->data = unit;
if (!irDocument.javaScriptCompilationUnit->saveToDisk(inputFileName, &error->message)) if (!irDocument.javaScriptCompilationUnit->saveToDisk(outputFileName, &error->message))
return false; return false;
free(unit); free(unit);
@ -161,7 +161,7 @@ static bool compileQmlFile(const QString &inputFileName, QV4::EvalISelFactory *i
return true; return true;
} }
static bool compileJSFile(const QString &inputFileName, QV4::EvalISelFactory *iselFactory, Error *error) static bool compileJSFile(const QString &inputFileName, const QString &outputFileName, QV4::EvalISelFactory *iselFactory, Error *error)
{ {
QmlIR::Document irDocument(/*debugMode*/false); QmlIR::Document irDocument(/*debugMode*/false);
@ -233,7 +233,8 @@ static bool compileJSFile(const QString &inputFileName, QV4::EvalISelFactory *is
// ### translation binding simplification // ### translation binding simplification
QScopedPointer<QV4::EvalInstructionSelection> isel(iselFactory->create(/*engine*/nullptr, /*executable allocator*/nullptr, &irDocument.jsModule, &irDocument.jsGenerator)); QV4::ExecutableAllocator allocator;
QScopedPointer<QV4::EvalInstructionSelection> isel(iselFactory->create(/*engine*/nullptr, &allocator, &irDocument.jsModule, &irDocument.jsGenerator));
// Disable lookups in non-standalone (aka QML) mode // Disable lookups in non-standalone (aka QML) mode
isel->setUseFastLookups(false); isel->setUseFastLookups(false);
irDocument.javaScriptCompilationUnit = isel->compile(/*generate unit*/false); irDocument.javaScriptCompilationUnit = isel->compile(/*generate unit*/false);
@ -243,7 +244,7 @@ static bool compileJSFile(const QString &inputFileName, QV4::EvalISelFactory *is
unit->flags |= QV4::CompiledData::Unit::StaticData; unit->flags |= QV4::CompiledData::Unit::StaticData;
irDocument.javaScriptCompilationUnit->data = unit; irDocument.javaScriptCompilationUnit->data = unit;
if (!irDocument.javaScriptCompilationUnit->saveToDisk(inputFileName, &error->message)) { if (!irDocument.javaScriptCompilationUnit->saveToDisk(outputFileName, &error->message)) {
engine->setDirectives(oldDirs); engine->setDirectives(oldDirs);
return false; return false;
} }
@ -270,6 +271,9 @@ int main(int argc, char **argv)
QCommandLineOption targetArchitectureOption(QStringLiteral("target-architecture"), QCoreApplication::translate("main", "Target architecture"), QCoreApplication::translate("main", "architecture")); QCommandLineOption targetArchitectureOption(QStringLiteral("target-architecture"), QCoreApplication::translate("main", "Target architecture"), QCoreApplication::translate("main", "architecture"));
parser.addOption(targetArchitectureOption); parser.addOption(targetArchitectureOption);
QCommandLineOption outputFileOption(QStringLiteral("o"), QCoreApplication::translate("main", "Output file name"), QCoreApplication::translate("main", "file name"));
parser.addOption(outputFileOption);
parser.addPositionalArgument(QStringLiteral("[qml file]"), parser.addPositionalArgument(QStringLiteral("[qml file]"),
QStringLiteral("QML source file to generate cache for.")); QStringLiteral("QML source file to generate cache for."));
@ -294,13 +298,17 @@ int main(int argc, char **argv)
Error error; Error error;
QString outputFileName = inputFile + QLatin1Char('c');
if (parser.isSet(outputFileOption))
outputFileName = parser.value(outputFileOption);
if (inputFile.endsWith(QLatin1String(".qml"))) { if (inputFile.endsWith(QLatin1String(".qml"))) {
if (!compileQmlFile(inputFile, isel.data(), &error)) { if (!compileQmlFile(inputFile, outputFileName, isel.data(), &error)) {
error.augment(QLatin1String("Error compiling qml file: ")).print(); error.augment(QLatin1String("Error compiling qml file: ")).print();
return EXIT_FAILURE; return EXIT_FAILURE;
} }
} else if (inputFile.endsWith(QLatin1String(".js"))) { } else if (inputFile.endsWith(QLatin1String(".js"))) {
if (!compileJSFile(inputFile, isel.data(), &error)) { if (!compileJSFile(inputFile, outputFileName, isel.data(), &error)) {
error.augment(QLatin1String("Error compiling qml file: ")).print(); error.augment(QLatin1String("Error compiling qml file: ")).print();
return EXIT_FAILURE; return EXIT_FAILURE;
} }