Changeset 651 for trunk/qmake/generators/symbian/symmake.cpp
- Timestamp:
- Mar 8, 2010, 12:52:58 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.6.2 (added) merged: 650 /branches/vendor/nokia/qt/current merged: 649 /branches/vendor/nokia/qt/4.6.1 removed
- Property svn:mergeinfo changed
-
trunk/qmake/generators/symbian/symmake.cpp
r561 r651 1 1 /**************************************************************************** 2 2 ** 3 ** Copyright (C) 20 09Nokia Corporation and/or its subsidiary(-ies).3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 4 4 ** All rights reserved. 5 5 ** Contact: Nokia Corporation (qt-info@nokia.com) … … 41 41 42 42 #include "symmake.h" 43 #include "initprojectdeploy_symbian.h"44 43 45 44 #include <qstring.h> … … 63 62 #define BLD_INF_TAG_TESTMMPFILES "prj_testmmpfiles" 64 63 #define BLD_INF_TAG_EXTENSIONS "prj_extensions" 64 #define BLD_INF_TAG_EXPORTS "prj_exports" 65 65 66 66 #define RSS_RULES "RSS_RULES" … … 89 89 90 90 #define SIS_TARGET "sis" 91 #define INSTALLER_SIS_TARGET "installer_sis" 91 92 #define OK_SIS_TARGET "ok_sis" 93 #define OK_INSTALLER_SIS_TARGET "ok_installer_sis" 92 94 #define FAIL_SIS_NOPKG_TARGET "fail_sis_nopkg" 93 95 #define FAIL_SIS_NOCACHE_TARGET "fail_sis_nocache" 94 #define RESTORE_BUILD_TARGET "restore_build"95 96 96 97 #define PRINT_FILE_CREATE_ERROR(filename) fprintf(stderr, "Error: Could not create '%s'\n", qPrintable(filename)); 98 99 #define MANUFACTURER_NOTE_FILE "manufacturer_note.txt" 100 #define DEFAULT_MANUFACTURER_NOTE \ 101 "The package is not supported for devices from this manufacturer. Please try the selfsigned " \ 102 "version of the package instead." 97 103 98 104 QString SymbianMakefileGenerator::fixPathForMmp(const QString& origPath, const QDir& parentDir) … … 204 210 // Generate pkg files if there are any actual files to deploy 205 211 bool generatePkg = false; 212 DeploymentList depList; 213 206 214 if (targetType == TypeExe) { 207 215 generatePkg = true; … … 216 224 217 225 if (generatePkg) { 218 generatePkgFile(iconFile );219 } 220 221 writeBldInfContent(t, generatePkg, iconFile );226 generatePkgFile(iconFile, depList); 227 } 228 229 writeBldInfContent(t, generatePkg, iconFile, depList); 222 230 223 231 // Generate empty wrapper makefile here, because wrapper makefile must exist before writeMkFile, … … 274 282 } 275 283 276 void SymbianMakefileGenerator::generatePkgFile(const QString &iconFile )284 void SymbianMakefileGenerator::generatePkgFile(const QString &iconFile, DeploymentList &depList) 277 285 { 278 286 QString pkgFilename = QString("%1_template.%2") … … 286 294 287 295 generatedFiles << pkgFile.fileName(); 296 QTextStream t(&pkgFile); 297 298 QString installerSisHeader = project->values("DEPLOYMENT.installer_header").join("\n"); 299 if (installerSisHeader.isEmpty()) 300 installerSisHeader = "0xA000D7CE"; // Use default self-signable UID if not defined 301 302 QString wrapperStreamBuffer; 303 QTextStream tw(&wrapperStreamBuffer); 304 305 QString dateStr = QDateTime::currentDateTime().toString(Qt::ISODate); 288 306 289 307 // Header info 290 QTextStream t(&pkgFile); 291 t << QString("; %1 generated by qmake at %2").arg(pkgFilename).arg(QDateTime::currentDateTime().toString(Qt::ISODate)) << endl; 292 t << "; This file is generated by qmake and should not be modified by the user" << endl; 293 t << ";" << endl << endl; 308 QString wrapperPkgFilename = QString("%1_installer.%2") 309 .arg(fixedTarget) 310 .arg("pkg"); 311 QString headerComment = "; %1 generated by qmake at %2\n" 312 "; This file is generated by qmake and should not be modified by the user\n" 313 ";\n\n"; 314 t << headerComment.arg(pkgFilename).arg(dateStr); 315 tw << headerComment.arg(wrapperPkgFilename).arg(dateStr); 294 316 295 317 // Construct QStringList from pkg_prerules since we need search it before printed to file … … 314 336 if (!containsStartWithItem('&', rawPkgPreRules)) { 315 337 // language, (*** hardcoded to english atm, should be parsed from TRANSLATIONS) 316 t << "; Language" << endl; 317 t << "&EN" << endl << endl; 338 QString languageCode = "; Language\n&EN\n\n"; 339 t << languageCode; 340 tw << languageCode; 318 341 } else { 319 342 // In case user defines langs, he must take care also about SIS header … … 324 347 // name of application, UID and version 325 348 QString applicationVersion = project->first("VERSION").isEmpty() ? "1,0,0" : project->first("VERSION").replace('.', ','); 349 QString sisHeader = "; SIS header: name, uid, version\n#{\"%1\"},(%2),%3\n\n"; 350 QString visualTarget = escapeFilePath(fileFixify(project->first("TARGET"))); 351 visualTarget = removePathSeparators(visualTarget); 352 QString wrapperTarget = visualTarget + " installer"; 353 354 if (installerSisHeader.startsWith("0x", Qt::CaseInsensitive)) { 355 tw << sisHeader.arg(wrapperTarget).arg(installerSisHeader).arg(applicationVersion); 356 } else { 357 tw << installerSisHeader << endl; 358 } 326 359 327 360 if (!containsStartWithItem('#', rawPkgPreRules)) { 328 QString visualTarget = escapeFilePath(fileFixify(project->first("TARGET"))); 329 visualTarget = removePathSeparators(visualTarget); 330 331 t << "; SIS header: name, uid, version" << endl; 332 t << QString("#{\"%1\"},(%2),%3").arg(visualTarget).arg(uid3).arg(applicationVersion) << endl << endl; 361 t << sisHeader.arg(visualTarget).arg(uid3).arg(applicationVersion); 333 362 } 334 363 335 364 // Localized vendor name 365 QString vendorName; 336 366 if (!containsStartWithItem('%', rawPkgPreRules)) { 337 t << "; Localised Vendor name" << endl; 338 t << "%{\"Vendor\"}" << endl << endl; 367 vendorName += "; Localised Vendor name\n%{\"Vendor\"}\n\n"; 339 368 } 340 369 341 370 // Unique vendor name 342 371 if (!containsStartWithItem(':', rawPkgPreRules)) { 343 t << "; Unique Vendor name" << endl; 344 t << ":\"Vendor\"" << endl << endl; 345 } 372 vendorName += "; Unique Vendor name\n:\"Vendor\"\n\n"; 373 } 374 375 t << vendorName; 376 tw << vendorName; 346 377 347 378 // PKG pre-rules - these are added before actual file installations i.e. SIS package body 348 379 if (rawPkgPreRules.size()) { 349 t << "; Manual PKG pre-rules from PRO files" << endl; 380 QString comment = "\n; Manual PKG pre-rules from PRO files\n"; 381 t << comment; 382 tw << comment; 383 350 384 foreach(QString item, rawPkgPreRules) { 385 // Only regular pkg file should have package dependencies or pkg header if that is 386 // defined using prerules. 387 if (!item.startsWith("(") && !item.startsWith("#")) { 388 tw << item << endl; 389 } 351 390 t << item << endl; 352 391 } 353 392 t << endl; 393 tw << endl; 394 } 395 396 // Begin Manufacturer block 397 if (!project->values("DEPLOYMENT.manufacturers").isEmpty()) { 398 QString manufacturerStr("IF "); 399 foreach(QString manufacturer, project->values("DEPLOYMENT.manufacturers")) { 400 manufacturerStr.append(QString("(MANUFACTURER)=(%1) OR \n ").arg(manufacturer)); 401 } 402 // Remove the final OR 403 manufacturerStr.chop(8); 404 t << manufacturerStr << endl; 354 405 } 355 406 … … 362 413 QString epocReleasePath = QString("%1epoc32/release/$(PLATFORM)/$(TARGET)") 363 414 .arg(epocRoot()); 364 365 415 366 416 if (targetType == TypeExe) { … … 398 448 399 449 // deploy any additional DEPLOYMENT files 400 DeploymentList depList;401 450 QString remoteTestPath; 402 451 remoteTestPath = QString("!:\\private\\%1").arg(privateDirUid); … … 428 477 t << endl; 429 478 } 479 } 480 481 // Close Manufacturer block 482 if (!project->values("DEPLOYMENT.manufacturers").isEmpty()) { 483 QString manufacturerFailNoteFile; 484 if (project->values("DEPLOYMENT.manufacturers.fail_note").isEmpty()) { 485 manufacturerFailNoteFile = QString("%1_" MANUFACTURER_NOTE_FILE).arg(uid3); 486 QFile ft(manufacturerFailNoteFile); 487 if (ft.open(QIODevice::WriteOnly)) { 488 generatedFiles << ft.fileName(); 489 QTextStream t2(&ft); 490 491 t2 << QString(DEFAULT_MANUFACTURER_NOTE) << endl; 492 } else { 493 PRINT_FILE_CREATE_ERROR(manufacturerFailNoteFile) 494 } 495 } else { 496 manufacturerFailNoteFile = project->values("DEPLOYMENT.manufacturers.fail_note").join(""); 497 } 498 499 t << "ELSEIF NOT(0) ; MANUFACTURER" << endl 500 << "\"" << fileInfo(manufacturerFailNoteFile).absoluteFilePath() << "\"" 501 << " - \"\", FILETEXT, TEXTEXIT" << endl 502 << "ENDIF ; MANUFACTURER" << endl; 503 } 504 505 // Write wrapper pkg 506 if (!installerSisHeader.isEmpty()) { 507 QFile wrapperPkgFile(wrapperPkgFilename); 508 if (!wrapperPkgFile.open(QIODevice::WriteOnly | QIODevice::Text)) { 509 PRINT_FILE_CREATE_ERROR(wrapperPkgFilename); 510 return; 511 } 512 513 generatedFiles << wrapperPkgFile.fileName(); 514 QTextStream twf(&wrapperPkgFile); 515 516 twf << wrapperStreamBuffer << endl; 517 518 // Wrapped files deployment 519 QString currentPath = qmake_getpwd(); 520 QString sisName = QString("%1.sis").arg(fixedTarget); 521 twf << "\"" << currentPath << "/" << sisName << "\" - \"c:\\adm\\" << sisName << "\"" << endl; 522 523 QString bootStrapPath = QLibraryInfo::location(QLibraryInfo::PrefixPath); 524 bootStrapPath.append("/smartinstaller.sis"); 525 QFileInfo fi(fileInfo(bootStrapPath)); 526 twf << "@\"" << fi.absoluteFilePath() << "\",(0x2002CCCD)" << endl; 430 527 } 431 528 } … … 1173 1270 } 1174 1271 1175 void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploymentExtension, const QString &iconFile )1272 void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploymentExtension, const QString &iconFile, DeploymentList &depList) 1176 1273 { 1177 1274 // Read user defined bld inf rules … … 1301 1398 t << item << endl; 1302 1399 userBldInfRules.remove(BLD_INF_TAG_EXTENSIONS); 1400 1401 t << endl << BLD_INF_TAG_EXPORTS << endl << endl; 1402 1403 // Generate export rules 1404 1405 // Export any deployed plugin stubs under /epoc32/data/z to support ROM builds 1406 for (int i = 0; i < depList.size(); ++i) { 1407 int index = depList.at(i).from.indexOf(PLUGIN_STUB_DIR); 1408 if (index != -1) { 1409 t << QString("%1 /epoc32/data/z%2") 1410 .arg(QString(depList.at(i).from).mid(index).replace('\\','/')) 1411 .arg(QString(depList.at(i).to).mid(2).replace('\\','/')) << endl; 1412 } 1413 } 1414 1415 userItems = userBldInfRules.value(BLD_INF_TAG_EXPORTS); 1416 foreach(QString item, userItems) 1417 t << item << endl; 1418 userBldInfRules.remove(BLD_INF_TAG_EXPORTS); 1303 1419 1304 1420 // Add rest of the user defined content … … 1763 1879 void SymbianMakefileGenerator::writeSisTargets(QTextStream &t) 1764 1880 { 1765 t << SIS_TARGET ": " RESTORE_BUILD_TARGET << endl; 1881 t << "-include " MAKE_CACHE_NAME << endl; 1882 t << endl; 1883 1884 t << SIS_TARGET ":" << endl; 1766 1885 QString siscommand = QString("\t$(if $(wildcard %1_template.%2),$(if $(wildcard %3)," \ 1767 1886 "$(MAKE) -s -f $(MAKEFILE) %4," \ … … 1787 1906 t << endl; 1788 1907 1908 QString sisName = fixedTarget; 1909 sisName += ".sis"; 1910 1911 t << sisName << ":" << endl; 1912 t << "\t$(MAKE) -s -f $(MAKEFILE) " SIS_TARGET << endl << endl; 1913 1914 t << INSTALLER_SIS_TARGET ": " << sisName << endl; 1915 siscommand = QString("\t$(if $(wildcard %1_installer.%2)," \ 1916 "$(MAKE) -s -f $(MAKEFILE) %3," \ 1917 "$(MAKE) -s -f $(MAKEFILE) %4)") 1918 .arg(fixedTarget) 1919 .arg("pkg") 1920 .arg(OK_INSTALLER_SIS_TARGET) 1921 .arg(FAIL_SIS_NOPKG_TARGET); 1922 t << siscommand << endl; 1923 t << endl; 1924 1925 t << OK_INSTALLER_SIS_TARGET ": " << endl; 1926 1927 pkgcommand = QString("\tcreatepackage.bat $(QT_SIS_OPTIONS) %1_installer.%2 - " \ 1928 "$(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)") 1929 .arg(fixedTarget) 1930 .arg("pkg"); 1931 t << pkgcommand << endl; 1932 t << endl; 1933 1789 1934 t << FAIL_SIS_NOPKG_TARGET ":" << endl; 1790 t << "\t$(error PKG file does not exist, ' SIS' target isonly supported for executables or projects with DEPLOYMENT statement)" << endl;1935 t << "\t$(error PKG file does not exist, '" SIS_TARGET "' and '" INSTALLER_SIS_TARGET "' target are only supported for executables or projects with DEPLOYMENT statement)" << endl; 1791 1936 t << endl; 1792 1937 1793 1938 t << FAIL_SIS_NOCACHE_TARGET ":" << endl; 1794 1939 t << "\t$(error Project has to be built or QT_SIS_TARGET environment variable has to be set before calling 'SIS' target)" << endl; 1795 t << endl;1796 1797 1798 t << RESTORE_BUILD_TARGET ":" << endl;1799 t << "-include " MAKE_CACHE_NAME << endl;1800 1940 t << endl; 1801 1941 }
Note:
See TracChangeset
for help on using the changeset viewer.