Add a new location for QML 2.x imports

This commits adds a -qmldir configuration option for the configures to
allow the user to change the default location (it defaults to
$archdatadir/qml).

It adds a QLibraryInfo::Qml2ImportsPath value for
QLibraryInfo::location, a qmake property of QT_INSTALL_QML and a qt.conf
configure location entry "Qml2Imports".

At the same time, it makes the qmake .prf files dealing with QML plugins
be the QML 2 version. Those files are new in Qt 5, so we have the option
to choose which version we want to use.

Discussed-on: http://lists.qt-project.org/pipermail/development/2012-October/007136.html
Change-Id: I8c1c53e8685a5934ed0a9a42ba5663297b81a677
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
This commit is contained in:
Thiago Macieira 2012-10-15 13:23:13 -07:00 committed by The Qt Project
parent 36270e4505
commit df3631045c
10 changed files with 58 additions and 12 deletions

17
configure vendored
View File

@ -884,6 +884,7 @@ QT_INSTALL_LIBS=
QT_INSTALL_BINS= QT_INSTALL_BINS=
QT_INSTALL_PLUGINS= QT_INSTALL_PLUGINS=
QT_INSTALL_IMPORTS= QT_INSTALL_IMPORTS=
QT_INSTALL_QML=
QT_INSTALL_ARCHDATA= QT_INSTALL_ARCHDATA=
QT_INSTALL_DATA= QT_INSTALL_DATA=
QT_INSTALL_TRANSLATIONS= QT_INSTALL_TRANSLATIONS=
@ -993,7 +994,7 @@ while [ "$#" -gt 0 ]; do
VAL=no VAL=no
;; ;;
#Qt style options that pass an argument #Qt style options that pass an argument
-prefix|-docdir|-headerdir|-plugindir|-importdir|-archdatadir|-datadir|-libdir|-bindir|-translationdir|-sysconfdir|-examplesdir|-testsdir|-depths|-make|-nomake|-platform|-xplatform|-device|-device-option|-sdk|-arch|-host-arch|-mysql_config|-sysroot|-hostdatadir|-hostbindir|-qpa|-qconfig) -prefix|-docdir|-headerdir|-plugindir|-importdir|-qmldir|-archdatadir|-datadir|-libdir|-bindir|-translationdir|-sysconfdir|-examplesdir|-testsdir|-depths|-make|-nomake|-platform|-xplatform|-device|-device-option|-sdk|-arch|-host-arch|-mysql_config|-sysroot|-hostdatadir|-hostbindir|-qpa|-qconfig)
VAR=`echo $1 | sed "s,^-\(.*\),\1,"` VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
shift shift
VAL="$1" VAL="$1"
@ -1208,6 +1209,9 @@ while [ "$#" -gt 0 ]; do
importdir) importdir)
QT_INSTALL_IMPORTS="$VAL" QT_INSTALL_IMPORTS="$VAL"
;; ;;
qmldir)
QT_INSTALL_QML="$VAL"
;;
archdatadir) archdatadir)
QT_INSTALL_ARCHDATA="$VAL" QT_INSTALL_ARCHDATA="$VAL"
;; ;;
@ -2816,6 +2820,12 @@ if [ -z "$QT_INSTALL_IMPORTS" ]; then #default
fi fi
QT_INSTALL_IMPORTS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_IMPORTS"` QT_INSTALL_IMPORTS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_IMPORTS"`
#qml
if [ -z "$QT_INSTALL_QML" ]; then #default
QT_INSTALL_QML="$QT_INSTALL_ARCHDATA/qml" #fallback
fi
QT_INSTALL_QML=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_QML"`
if [ -z "$QT_INSTALL_TRANSLATIONS" ]; then #default if [ -z "$QT_INSTALL_TRANSLATIONS" ]; then #default
QT_INSTALL_TRANSLATIONS="$QT_INSTALL_DATA/translations" #fallback QT_INSTALL_TRANSLATIONS="$QT_INSTALL_DATA/translations" #fallback
fi fi
@ -3012,8 +3022,10 @@ Installation options:
(default PREFIX) (default PREFIX)
-plugindir <dir> ...... Plugins will be installed to <dir> -plugindir <dir> ...... Plugins will be installed to <dir>
(default ARCHDATADIR/plugins) (default ARCHDATADIR/plugins)
-importdir <dir> ...... Imports for QML will be installed to <dir> -importdir <dir> ...... Imports for QML1 will be installed to <dir>
(default ARCHDATADIR/imports) (default ARCHDATADIR/imports)
-qmldir <dir> ......... Imports for QML2 will be installed to <dir>
(default ARCHDATADIR/qml)
-datadir <dir> ........ Arch-independent data used by Qt will be installed to <dir> -datadir <dir> ........ Arch-independent data used by Qt will be installed to <dir>
(default PREFIX) (default PREFIX)
-docdir <dir> ......... Documentation will be installed to <dir> -docdir <dir> ......... Documentation will be installed to <dir>
@ -3497,6 +3509,7 @@ static const char qt_configure_prefix_path_strs[][256 + 12] = {
"qt_binspath=$QT_INSTALL_BINS", "qt_binspath=$QT_INSTALL_BINS",
"qt_plugpath=$QT_INSTALL_PLUGINS", "qt_plugpath=$QT_INSTALL_PLUGINS",
"qt_impspath=$QT_INSTALL_IMPORTS", "qt_impspath=$QT_INSTALL_IMPORTS",
"qt_qml2path=$QT_INSTALL_QML",
"qt_adatpath=$QT_INSTALL_ARCHDATA", "qt_adatpath=$QT_INSTALL_ARCHDATA",
"qt_datapath=$QT_INSTALL_DATA", "qt_datapath=$QT_INSTALL_DATA",
"qt_trnspath=$QT_INSTALL_TRANSLATIONS", "qt_trnspath=$QT_INSTALL_TRANSLATIONS",

View File

@ -10,9 +10,9 @@ for(qmlf, QML_FILES): fq_qml_files += $$absolute_path($$qmlf, $$_PRO_FILE_PWD_)
OTHER_FILES += $$fq_qml_files OTHER_FILES += $$fq_qml_files
qml1_target: \ qml1_target: \
instbase = $$[QT_INSTALL_IMPORTS]/QtDeclarative
else: \
instbase = $$[QT_INSTALL_IMPORTS] instbase = $$[QT_INSTALL_IMPORTS]
else: \
instbase = $$[QT_INSTALL_QML]
exists($$[QT_HOST_PREFIX]/.qmake.cache) { exists($$[QT_HOST_PREFIX]/.qmake.cache) {
# These bizarre rules copy the files to the qtbase build directory # These bizarre rules copy the files to the qtbase build directory

View File

@ -17,17 +17,19 @@ isEmpty(CXX_MODULE) {
TARGET = declarative_$${TARGET} TARGET = declarative_$${TARGET}
} }
isEmpty(TARGETPATH): TARGETPATH = $$eval(QT.$${CXX_MODULE}.name) isEmpty(TARGETPATH): TARGETPATH = $$eval(QT.$${CXX_MODULE}.name)
DESTDIR = $$eval(QT.$${CXX_MODULE}.imports)/$$TARGETPATH
QMLTYPEFILE = $$_PRO_FILE_PWD_/plugins.qmltypes QMLTYPEFILE = $$_PRO_FILE_PWD_/plugins.qmltypes
exists($$QMLTYPEFILE): QML_FILES += $$QMLTYPEFILE exists($$QMLTYPEFILE): QML_FILES += $$QMLTYPEFILE
# Install rules # Install rules
qml1_target: \ qml1_target {
instbase = $$[QT_INSTALL_IMPORTS]/QtDeclarative DESTDIR = $$eval(QT.$${CXX_MODULE}.imports)/$$TARGETPATH
else: \
instbase = $$[QT_INSTALL_IMPORTS] instbase = $$[QT_INSTALL_IMPORTS]
} else {
DESTDIR = $$eval(QT.$${CXX_MODULE}.qml)/$$TARGETPATH
instbase = $$[QT_INSTALL_QML]
}
target.path = $$instbase/$$TARGETPATH target.path = $$instbase/$$TARGETPATH
INSTALLS += target INSTALLS += target

View File

@ -21,6 +21,7 @@ QMAKE_QT_CONFIG = $$[QT_HOST_DATA/get]/mkspecs/qconfig.pri
QT_MODULE_PLUGIN_BASE = $$[QT_INSTALL_PLUGINS] QT_MODULE_PLUGIN_BASE = $$[QT_INSTALL_PLUGINS]
QT_MODULE_BIN_BASE = $$[QT_INSTALL_BINS] QT_MODULE_BIN_BASE = $$[QT_INSTALL_BINS]
QT_MODULE_IMPORT_BASE = $$[QT_INSTALL_IMPORTS] QT_MODULE_IMPORT_BASE = $$[QT_INSTALL_IMPORTS]
QT_MODULE_QML_BASE = $$[QT_INSTALL_QML]
include($$mod) include($$mod)
} }
} }
@ -29,6 +30,7 @@ QMAKE_QT_CONFIG = $$[QT_HOST_DATA/get]/mkspecs/qconfig.pri
unset(QT_MODULE_PLUGIN_BASE) unset(QT_MODULE_PLUGIN_BASE)
unset(QT_MODULE_BIN_BASE) unset(QT_MODULE_BIN_BASE)
unset(QT_MODULE_IMPORT_BASE) unset(QT_MODULE_IMPORT_BASE)
unset(QT_MODULE_QML_BASE)
} }
load(qt_functions) load(qt_functions)

View File

@ -81,7 +81,8 @@ MODULE_PRI = $$MODULE_QMAKE_OUTDIR/mkspecs/modules-inst/qt_lib_$${MODULE}.pri
"QT.$${MODULE}.libs = \$\$QT_MODULE_LIB_BASE" \ "QT.$${MODULE}.libs = \$\$QT_MODULE_LIB_BASE" \
"QT.$${MODULE}.rpath = $$[QT_INSTALL_LIBS/raw]" \ "QT.$${MODULE}.rpath = $$[QT_INSTALL_LIBS/raw]" \
"QT.$${MODULE}.plugins = \$\$QT_MODULE_PLUGIN_BASE" \ "QT.$${MODULE}.plugins = \$\$QT_MODULE_PLUGIN_BASE" \
"QT.$${MODULE}.imports = \$\$QT_MODULE_IMPORT_BASE$$MODULE_IMPORT_SUFFIX" \ "QT.$${MODULE}.imports = \$\$QT_MODULE_IMPORT_BASE" \
"QT.$${MODULE}.qml = \$\$QT_MODULE_QML_BASE" \
"QT.$${MODULE}.depends =$$join(MODULE_DEPENDS, " ", " ")" \ "QT.$${MODULE}.depends =$$join(MODULE_DEPENDS, " ", " ")" \
$$module_privdep \ $$module_privdep \
$$module_build_type \ $$module_build_type \

View File

@ -52,6 +52,7 @@
"QT_MODULE_BIN_BASE = $$MODULE_BASE_OUTDIR/bin" \ "QT_MODULE_BIN_BASE = $$MODULE_BASE_OUTDIR/bin" \
"QT_MODULE_INCLUDE_BASE = $$MODULE_BASE_OUTDIR/include" \ "QT_MODULE_INCLUDE_BASE = $$MODULE_BASE_OUTDIR/include" \
"QT_MODULE_IMPORT_BASE = $$MODULE_BASE_OUTDIR/imports" \ "QT_MODULE_IMPORT_BASE = $$MODULE_BASE_OUTDIR/imports" \
"QT_MODULE_QML_BASE = $$MODULE_BASE_OUTDIR/qml" \
"QT_MODULE_LIB_BASE = $$MODULE_BASE_OUTDIR/lib" \ "QT_MODULE_LIB_BASE = $$MODULE_BASE_OUTDIR/lib" \
"QT_MODULE_PLUGIN_BASE = $$MODULE_BASE_OUTDIR/plugins" \ "QT_MODULE_PLUGIN_BASE = $$MODULE_BASE_OUTDIR/plugins" \
$$module_rpathlink \ $$module_rpathlink \
@ -69,7 +70,7 @@
include($$MODULE_FWD_PRI) include($$MODULE_FWD_PRI)
for(var, $$list(VERSION MAJOR_VERSION MINOR_VERSION PATCH_VERSION \ for(var, $$list(VERSION MAJOR_VERSION MINOR_VERSION PATCH_VERSION \
name depends private_depends module_config CONFIG DEFINES sources \ name depends private_depends module_config CONFIG DEFINES sources \
includes private_includes bins libs plugins imports \ includes private_includes bins libs plugins imports qml \
)):defined(QT.$${MODULE}.$$var, var):cache(QT.$${MODULE}.$$var, transient) )):defined(QT.$${MODULE}.$$var, var):cache(QT.$${MODULE}.$$var, transient)
cache(QT_CONFIG, transient) cache(QT_CONFIG, transient)

View File

@ -65,6 +65,7 @@ static const struct {
{ "QT_INSTALL_TESTS", QLibraryInfo::TestsPath, false }, { "QT_INSTALL_TESTS", QLibraryInfo::TestsPath, false },
{ "QT_INSTALL_PLUGINS", QLibraryInfo::PluginsPath, false }, { "QT_INSTALL_PLUGINS", QLibraryInfo::PluginsPath, false },
{ "QT_INSTALL_IMPORTS", QLibraryInfo::ImportsPath, false }, { "QT_INSTALL_IMPORTS", QLibraryInfo::ImportsPath, false },
{ "QT_INSTALL_QML", QLibraryInfo::Qml2ImportsPath, false },
{ "QT_INSTALL_TRANSLATIONS", QLibraryInfo::TranslationsPath, false }, { "QT_INSTALL_TRANSLATIONS", QLibraryInfo::TranslationsPath, false },
{ "QT_INSTALL_CONFIGURATION", QLibraryInfo::SettingsPath, false }, { "QT_INSTALL_CONFIGURATION", QLibraryInfo::SettingsPath, false },
{ "QT_INSTALL_EXAMPLES", QLibraryInfo::ExamplesPath, false }, { "QT_INSTALL_EXAMPLES", QLibraryInfo::ExamplesPath, false },

View File

@ -257,6 +257,15 @@ QLibraryInfo::isDebugBuild()
#endif // QT_BOOTSTRAPPED #endif // QT_BOOTSTRAPPED
/*
* To add a new entry in QLibrary::LibraryLocation, add it to the enum above the bootstrapped values and:
* - add its relative path in the qtConfEntries[] array below
* (the key is what appears in a qt.conf file)
* - add a property name in qmake/property.cpp propList[] array
* (it's used with qmake -query)
* - add to qt_config.prf, qt_module.prf, qt_module_fwdpri.prf
*/
static const struct { static const struct {
char key[14], value[13]; char key[14], value[13];
} qtConfEntries[] = { } qtConfEntries[] = {
@ -267,6 +276,7 @@ static const struct {
{ "Binaries", "bin" }, { "Binaries", "bin" },
{ "Plugins", "plugins" }, // should be ${ArchData}/plugins { "Plugins", "plugins" }, // should be ${ArchData}/plugins
{ "Imports", "imports" }, // should be ${ArchData}/imports { "Imports", "imports" }, // should be ${ArchData}/imports
{ "Qml2Imports", "qml" }, // should be ${ArchData}/qml
{ "ArchData", "." }, { "ArchData", "." },
{ "Data", "." }, { "Data", "." },
{ "Translations", "translations" }, // should be ${Data}/translations { "Translations", "translations" }, // should be ${Data}/translations
@ -444,7 +454,8 @@ QLibraryInfo::rawLocation(LibraryLocation loc, PathGroup group)
\value LibrariesPath The location of installed libraries. \value LibrariesPath The location of installed libraries.
\value BinariesPath The location of installed Qt binaries (tools and applications). \value BinariesPath The location of installed Qt binaries (tools and applications).
\value PluginsPath The location of installed Qt plugins. \value PluginsPath The location of installed Qt plugins.
\value ImportsPath The location of installed QML extensions to import. \value ImportsPath The location of installed QML extensions to import (QML 1.x).
\value Qml2ImportsPath The location of installed QML extensions to import (QML 2.x).
\value ArchDataPath The location of general architecture-dependent Qt data. \value ArchDataPath The location of general architecture-dependent Qt data.
\value DataPath The location of general architecture-independent Qt data. \value DataPath The location of general architecture-independent Qt data.
\value TranslationsPath The location of translation information for Qt strings. \value TranslationsPath The location of translation information for Qt strings.

View File

@ -70,12 +70,14 @@ public:
BinariesPath, BinariesPath,
PluginsPath, PluginsPath,
ImportsPath, ImportsPath,
Qml2ImportsPath,
ArchDataPath, ArchDataPath,
DataPath, DataPath,
TranslationsPath, TranslationsPath,
ExamplesPath, ExamplesPath,
TestsPath, TestsPath,
// Insert new values above this line // Insert new values above this line
// Please read the comments in qlibraryinfo.cpp before adding
#ifdef QT_BOOTSTRAPPED #ifdef QT_BOOTSTRAPPED
// These are not subject to binary compatibility constraints // These are not subject to binary compatibility constraints
SysrootPath, SysrootPath,

View File

@ -1067,6 +1067,14 @@ void Configure::parseCmdLine()
break; break;
dictionary[ "QT_INSTALL_IMPORTS" ] = configCmdLine.at(i); dictionary[ "QT_INSTALL_IMPORTS" ] = configCmdLine.at(i);
} }
else if (configCmdLine.at(i) == "-qmldir") {
++i;
if (i == argCount)
break;
dictionary[ "QT_INSTALL_QML" ] = configCmdLine.at(i);
}
else if (configCmdLine.at(i) == "-archdatadir") { else if (configCmdLine.at(i) == "-archdatadir") {
++i; ++i;
if (i == argCount) if (i == argCount)
@ -1595,6 +1603,7 @@ bool Configure::displayHelp()
desc( "-archdatadir <dir>", "Architecture-dependent data used by Qt will be installed to <dir>\n(default PREFIX)"); desc( "-archdatadir <dir>", "Architecture-dependent data used by Qt will be installed to <dir>\n(default PREFIX)");
desc( "-plugindir <dir>", "Plugins will be installed to <dir>\n(default ARCHDATADIR/plugins)"); desc( "-plugindir <dir>", "Plugins will be installed to <dir>\n(default ARCHDATADIR/plugins)");
desc( "-importdir <dir>", "Imports for QML1 will be installed to <dir>\n(default ARCHDATADIR/imports)"); desc( "-importdir <dir>", "Imports for QML1 will be installed to <dir>\n(default ARCHDATADIR/imports)");
desc( "-qmldir <dir>", "Imports for QML2 will be installed to <dir>\n(default ARCHDATADIR/qml)");
desc( "-datadir <dir>", "Data used by Qt programs will be installed to <dir>\n(default PREFIX)"); desc( "-datadir <dir>", "Data used by Qt programs will be installed to <dir>\n(default PREFIX)");
desc( "-docdir <dir>", "Documentation will be installed to <dir>\n(default DATADIR/doc)"); desc( "-docdir <dir>", "Documentation will be installed to <dir>\n(default DATADIR/doc)");
desc( "-translationdir <dir>", "Translations of Qt programs will be installed to <dir>\n(default DATADIR/translations)"); desc( "-translationdir <dir>", "Translations of Qt programs will be installed to <dir>\n(default DATADIR/translations)");
@ -3414,7 +3423,8 @@ void Configure::displayConfig()
sout << "Libraries installed to......" << QDir::toNativeSeparators(dictionary["QT_INSTALL_LIBS"]) << endl; sout << "Libraries installed to......" << QDir::toNativeSeparators(dictionary["QT_INSTALL_LIBS"]) << endl;
sout << "Arch-dep. data to..........." << QDir::toNativeSeparators(dictionary["QT_INSTALL_ARCHDATA"]) << endl; sout << "Arch-dep. data to..........." << QDir::toNativeSeparators(dictionary["QT_INSTALL_ARCHDATA"]) << endl;
sout << "Plugins installed to........" << QDir::toNativeSeparators(dictionary["QT_INSTALL_PLUGINS"]) << endl; sout << "Plugins installed to........" << QDir::toNativeSeparators(dictionary["QT_INSTALL_PLUGINS"]) << endl;
sout << "Imports installed to........" << QDir::toNativeSeparators(dictionary["QT_INSTALL_IMPORTS"]) << endl; sout << "QML1 imports installed to..." << QDir::toNativeSeparators(dictionary["QT_INSTALL_IMPORTS"]) << endl;
sout << "QML2 imports installed to..." << QDir::toNativeSeparators(dictionary["QT_INSTALL_QML"]) << endl;
sout << "Binaries installed to......." << QDir::toNativeSeparators(dictionary["QT_INSTALL_BINS"]) << endl; sout << "Binaries installed to......." << QDir::toNativeSeparators(dictionary["QT_INSTALL_BINS"]) << endl;
sout << "Arch-indep. data to........." << QDir::toNativeSeparators(dictionary["QT_INSTALL_DATA"]) << endl; sout << "Arch-indep. data to........." << QDir::toNativeSeparators(dictionary["QT_INSTALL_DATA"]) << endl;
sout << "Docs installed to..........." << QDir::toNativeSeparators(dictionary["QT_INSTALL_DOCS"]) << endl; sout << "Docs installed to..........." << QDir::toNativeSeparators(dictionary["QT_INSTALL_DOCS"]) << endl;
@ -3550,6 +3560,8 @@ void Configure::generateQConfigCpp()
dictionary["QT_INSTALL_PLUGINS"] = qipempty ? "" : dictionary["QT_INSTALL_ARCHDATA"] + "/plugins"; dictionary["QT_INSTALL_PLUGINS"] = qipempty ? "" : dictionary["QT_INSTALL_ARCHDATA"] + "/plugins";
if (!dictionary["QT_INSTALL_IMPORTS"].size()) if (!dictionary["QT_INSTALL_IMPORTS"].size())
dictionary["QT_INSTALL_IMPORTS"] = qipempty ? "" : dictionary["QT_INSTALL_ARCHDATA"] + "/imports"; dictionary["QT_INSTALL_IMPORTS"] = qipempty ? "" : dictionary["QT_INSTALL_ARCHDATA"] + "/imports";
if (!dictionary["QT_INSTALL_QML"].size())
dictionary["QT_INSTALL_QML"] = qipempty ? "" : dictionary["QT_INSTALL_ARCHDATA"] + "/qml";
if (!dictionary["QT_INSTALL_DATA"].size()) if (!dictionary["QT_INSTALL_DATA"].size())
dictionary["QT_INSTALL_DATA"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"]; dictionary["QT_INSTALL_DATA"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"];
if (!dictionary["QT_INSTALL_DOCS"].size()) if (!dictionary["QT_INSTALL_DOCS"].size())
@ -3597,6 +3609,7 @@ void Configure::generateQConfigCpp()
<< " \"qt_binspath=" << formatPath(dictionary["QT_INSTALL_BINS"]) << "\"," << endl << " \"qt_binspath=" << formatPath(dictionary["QT_INSTALL_BINS"]) << "\"," << endl
<< " \"qt_plugpath=" << formatPath(dictionary["QT_INSTALL_PLUGINS"]) << "\"," << endl << " \"qt_plugpath=" << formatPath(dictionary["QT_INSTALL_PLUGINS"]) << "\"," << endl
<< " \"qt_impspath=" << formatPath(dictionary["QT_INSTALL_IMPORTS"]) << "\"," << endl << " \"qt_impspath=" << formatPath(dictionary["QT_INSTALL_IMPORTS"]) << "\"," << endl
<< " \"qt_qml2path=" << formatPath(dictionary["QT_INSTALL_QML"]) << "\"," << endl
<< " \"qt_adatpath=" << formatPath(dictionary["QT_INSTALL_ARCHDATA"]) << "\"," << endl << " \"qt_adatpath=" << formatPath(dictionary["QT_INSTALL_ARCHDATA"]) << "\"," << endl
<< " \"qt_datapath=" << formatPath(dictionary["QT_INSTALL_DATA"]) << "\"," << endl << " \"qt_datapath=" << formatPath(dictionary["QT_INSTALL_DATA"]) << "\"," << endl
<< " \"qt_trnspath=" << formatPath(dictionary["QT_INSTALL_TRANSLATIONS"]) << "\"," << endl << " \"qt_trnspath=" << formatPath(dictionary["QT_INSTALL_TRANSLATIONS"]) << "\"," << endl