add configure -extprefix option

this adds the possibility to put the actual qt installation outside the
sysroot it is configured for. this makes it possible to install an
x-built qt without "polluting" the sysroot, which makes it possible to
have read-only sysroots, and multiple qt builds for one sysroot.

-prefix is the location within the sysroot as seen by the target itself,
and gets "burned" into QLibraryInfo in QtCore.
-extprefix is the location in the host file system and gets "burned"
into QLibraryInfo in qmake. if it is not specified, it defaults to the
sysrootified prefix, which is the previous behavior.

Task-number: QTBUG-26680
Change-Id: Ia43833c4e27733159afeb8c8b9b2d981378d0cd1
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Oswald Buddenhagen 2013-08-09 13:34:04 +02:00 committed by The Qt Project
parent 3e283402e1
commit a6eb28d3f6
4 changed files with 150 additions and 5 deletions

80
configure vendored
View File

@ -384,6 +384,16 @@ filterLibraryOptions()
filterPathOptions -L "$DEFAULT_LIBDIRS" filterPathOptions -L "$DEFAULT_LIBDIRS"
} }
substPrefix()
{
base=${1#$QT_SYSROOT_PREFIX}
if [ x"$base" != x"$1" ]; then
echo "$QT_EXT_PREFIX$base"
else
echo "$1"
fi
}
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
# device options # device options
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
@ -1014,6 +1024,7 @@ QT_HOST_PREFIX=
QT_HOST_BINS= QT_HOST_BINS=
QT_HOST_LIBS= QT_HOST_LIBS=
QT_HOST_DATA= QT_HOST_DATA=
QT_EXT_PREFIX=
#flags for SQL drivers #flags for SQL drivers
QT_CFLAGS_PSQL= QT_CFLAGS_PSQL=
@ -1139,6 +1150,7 @@ while [ "$#" -gt 0 ]; do
-hostdatadir| \ -hostdatadir| \
-hostbindir| \ -hostbindir| \
-hostlibdir| \ -hostlibdir| \
-extprefix| \
-sysroot| \ -sysroot| \
-depths| \ -depths| \
-make| \ -make| \
@ -1347,6 +1359,9 @@ while [ "$#" -gt 0 ]; do
hostlibdir) hostlibdir)
QT_HOST_LIBS="$VAL" QT_HOST_LIBS="$VAL"
;; ;;
extprefix)
QT_EXT_PREFIX="$VAL"
;;
pkg-config) pkg-config)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_PKGCONFIG="$VAL" CFG_PKGCONFIG="$VAL"
@ -3174,6 +3189,39 @@ if [ -z "$QT_INSTALL_TESTS" ]; then #default
fi fi
QT_INSTALL_TESTS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_TESTS"` QT_INSTALL_TESTS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_TESTS"`
#------- sysroot-external install paths --------
QT_SYSROOT_PREFIX=$QT_INSTALL_PREFIX
QT_SYSROOT_DOCS=$QT_INSTALL_DOCS
QT_SYSROOT_HEADERS=$QT_INSTALL_HEADERS
QT_SYSROOT_LIBS=$QT_INSTALL_LIBS
QT_SYSROOT_LIBEXECS=$QT_INSTALL_LIBEXECS
QT_SYSROOT_BINS=$QT_INSTALL_BINS
QT_SYSROOT_PLUGINS=$QT_INSTALL_PLUGINS
QT_SYSROOT_IMPORTS=$QT_INSTALL_IMPORTS
QT_SYSROOT_QML=$QT_INSTALL_QML
QT_SYSROOT_ARCHDATA=$QT_INSTALL_ARCHDATA
QT_SYSROOT_DATA=$QT_INSTALL_DATA
QT_SYSROOT_TRANSLATIONS=$QT_INSTALL_TRANSLATIONS
QT_SYSROOT_EXAMPLES=$QT_INSTALL_EXAMPLES
QT_SYSROOT_TESTS=$QT_INSTALL_TESTS
if [ -n "$QT_EXT_PREFIX" ]; then
QT_INSTALL_PREFIX=$QT_EXT_PREFIX
QT_INSTALL_DOCS=`substPrefix "$QT_INSTALL_DOCS"`
QT_INSTALL_HEADERS=`substPrefix "$QT_INSTALL_HEADERS"`
QT_INSTALL_LIBS=`substPrefix "$QT_INSTALL_LIBS"`
QT_INSTALL_LIBEXECS=`substPrefix "$QT_INSTALL_LIBEXECS"`
QT_INSTALL_BINS=`substPrefix "$QT_INSTALL_BINS"`
QT_INSTALL_PLUGINS=`substPrefix "$QT_INSTALL_PLUGINS"`
QT_INSTALL_IMPORTS=`substPrefix "$QT_INSTALL_IMPORTS"`
QT_INSTALL_QML=`substPrefix "$QT_INSTALL_QML"`
QT_INSTALL_ARCHDATA=`substPrefix "$QT_INSTALL_ARCHDATA"`
QT_INSTALL_DATA=`substPrefix "$QT_INSTALL_DATA"`
QT_INSTALL_TRANSLATIONS=`substPrefix "$QT_INSTALL_TRANSLATIONS"`
QT_INSTALL_EXAMPLES=`substPrefix "$QT_INSTALL_EXAMPLES"`
QT_INSTALL_TESTS=`substPrefix "$QT_INSTALL_TESTS"`
fi
#------- host paths -------- #------- host paths --------
if [ -z "$QT_HOST_PREFIX" ]; then if [ -z "$QT_HOST_PREFIX" ]; then
@ -3341,10 +3389,13 @@ Installation options:
-prefix <dir> ...... This will install everything relative to <dir> -prefix <dir> ...... This will install everything relative to <dir>
(default $QT_INSTALL_PREFIX) (default $QT_INSTALL_PREFIX)
-extprefix <dir> ... When -sysroot is used, install everything to <dir>,
rather than into SYSROOT/PREFIX.
-hostprefix [dir] .. Tools and libraries needed when developing -hostprefix [dir] .. Tools and libraries needed when developing
applications are installed in [dir]. If [dir] is applications are installed in [dir]. If [dir] is
not given, the current build directory will be used. not given, the current build directory will be used.
(default PREFIX) (default EXTPREFIX)
You may use these to separate different parts of the install: You may use these to separate different parts of the install:
@ -3869,6 +3920,12 @@ esac
shortxspec=`echo $XQMAKESPEC | sed "s,^${relpath}/mkspecs/,,"` shortxspec=`echo $XQMAKESPEC | sed "s,^${relpath}/mkspecs/,,"`
shortspec=`echo $QMAKESPEC | sed "s,^${relpath}/mkspecs/,,"` shortspec=`echo $QMAKESPEC | sed "s,^${relpath}/mkspecs/,,"`
if [ -z "$QT_EXT_PREFIX" ]; then
QMAKE_SYSROOTIFY=y
else
QMAKE_SYSROOTIFY=n
fi
cat > "$outpath/src/corelib/global/qconfig.cpp.new" <<EOF cat > "$outpath/src/corelib/global/qconfig.cpp.new" <<EOF
/* License Info */ /* License Info */
static const char qt_configure_licensee_str [256 + 12] = "qt_lcnsuser=$Licensee"; static const char qt_configure_licensee_str [256 + 12] = "qt_lcnsuser=$Licensee";
@ -3879,6 +3936,22 @@ static const char qt_configure_installation [12+11] = "qt_instdate=`
/* Installation Info */ /* Installation Info */
static const char qt_configure_prefix_path_strs[][256 + 12] = { static const char qt_configure_prefix_path_strs[][256 + 12] = {
#ifndef QT_BUILD_QMAKE
"qt_prfxpath=$QT_SYSROOT_PREFIX",
"qt_docspath=$QT_SYSROOT_DOCS",
"qt_hdrspath=$QT_SYSROOT_HEADERS",
"qt_libspath=$QT_SYSROOT_LIBS",
"qt_lbexpath=$QT_SYSROOT_LIBEXECS",
"qt_binspath=$QT_SYSROOT_BINS",
"qt_plugpath=$QT_SYSROOT_PLUGINS",
"qt_impspath=$QT_SYSROOT_IMPORTS",
"qt_qml2path=$QT_SYSROOT_QML",
"qt_adatpath=$QT_SYSROOT_ARCHDATA",
"qt_datapath=$QT_SYSROOT_DATA",
"qt_trnspath=$QT_SYSROOT_TRANSLATIONS",
"qt_xmplpath=$QT_SYSROOT_EXAMPLES",
"qt_tstspath=$QT_SYSROOT_TESTS",
#else
"qt_prfxpath=$QT_INSTALL_PREFIX", "qt_prfxpath=$QT_INSTALL_PREFIX",
"qt_docspath=$QT_INSTALL_DOCS", "qt_docspath=$QT_INSTALL_DOCS",
"qt_hdrspath=$QT_INSTALL_HEADERS", "qt_hdrspath=$QT_INSTALL_HEADERS",
@ -3893,7 +3966,6 @@ static const char qt_configure_prefix_path_strs[][256 + 12] = {
"qt_trnspath=$QT_INSTALL_TRANSLATIONS", "qt_trnspath=$QT_INSTALL_TRANSLATIONS",
"qt_xmplpath=$QT_INSTALL_EXAMPLES", "qt_xmplpath=$QT_INSTALL_EXAMPLES",
"qt_tstspath=$QT_INSTALL_TESTS", "qt_tstspath=$QT_INSTALL_TESTS",
#ifdef QT_BUILD_QMAKE
"qt_ssrtpath=$CFG_SYSROOT", "qt_ssrtpath=$CFG_SYSROOT",
"qt_hpfxpath=$QT_HOST_PREFIX", "qt_hpfxpath=$QT_HOST_PREFIX",
"qt_hbinpath=$QT_HOST_BINS", "qt_hbinpath=$QT_HOST_BINS",
@ -3904,6 +3976,10 @@ static const char qt_configure_prefix_path_strs[][256 + 12] = {
#endif #endif
}; };
static const char qt_configure_settings_path_str[256 + 12] = "qt_stngpath=$QT_INSTALL_SETTINGS"; static const char qt_configure_settings_path_str[256 + 12] = "qt_stngpath=$QT_INSTALL_SETTINGS";
#ifdef QT_BUILD_QMAKE
static const char qt_sysrootify_prefix[] = "qt_ssrtfpfx=$QMAKE_SYSROOTIFY";
#endif
EOF EOF
cat >> "$outpath/src/corelib/global/qconfig.cpp.new" <<EOF cat >> "$outpath/src/corelib/global/qconfig.cpp.new" <<EOF

View File

@ -309,7 +309,7 @@ QLibraryInfo::location(LibraryLocation loc)
QString ret = rawLocation(loc, FinalPaths); QString ret = rawLocation(loc, FinalPaths);
// Automatically prepend the sysroot to target paths // Automatically prepend the sysroot to target paths
if (loc < SysrootPath || loc > LastHostPath) { if ((loc < SysrootPath || loc > LastHostPath) && qt_sysrootify_prefix[12] == 'y') {
QString sysroot = rawLocation(SysrootPath, FinalPaths); QString sysroot = rawLocation(SysrootPath, FinalPaths);
if (!sysroot.isEmpty() && ret.length() > 2 && ret.at(1) == QLatin1Char(':') if (!sysroot.isEmpty() && ret.length() > 2 && ret.at(1) == QLatin1Char(':')
&& (ret.at(2) == QLatin1Char('/') || ret.at(2) == QLatin1Char('\\'))) && (ret.at(2) == QLatin1Char('/') || ret.at(2) == QLatin1Char('\\')))

View File

@ -1165,6 +1165,13 @@ void Configure::parseCmdLine()
dictionary[ "QT_HOST_DATA" ] = configCmdLine.at(i); dictionary[ "QT_HOST_DATA" ] = configCmdLine.at(i);
} }
else if (configCmdLine.at(i) == "-extprefix") {
++i;
if (i == argCount)
break;
dictionary[ "QT_EXT_PREFIX" ] = configCmdLine.at(i);
}
else if (configCmdLine.at(i) == "-make-tool") { else if (configCmdLine.at(i) == "-make-tool") {
++i; ++i;
if (i == argCount) if (i == argCount)
@ -1649,8 +1656,10 @@ bool Configure::displayHelp()
desc( "-prefix <dir>", "This will install everything relative to <dir> (default $QT_INSTALL_PREFIX)\n"); desc( "-prefix <dir>", "This will install everything relative to <dir> (default $QT_INSTALL_PREFIX)\n");
desc( "-extprefix <dir>", "When -sysroot is used, install everything to <dir>, rather than into SYSROOT/PREFIX.\n");
desc( "-hostprefix [dir]", "Tools and libraries needed when developing applications are installed in [dir]. " desc( "-hostprefix [dir]", "Tools and libraries needed when developing applications are installed in [dir]. "
"If [dir] is not given, the current build directory will be used. (default PREFIX)\n"); "If [dir] is not given, the current build directory will be used. (default EXTPREFIX)\n");
desc("You may use these to separate different parts of the install:\n\n"); desc("You may use these to separate different parts of the install:\n\n");
@ -3623,6 +3632,13 @@ static QString stripPrefix(const QString &str, const QString &pfx)
return str.startsWith(pfx) ? str.mid(pfx.length()) : str; return str.startsWith(pfx) ? str.mid(pfx.length()) : str;
} }
void Configure::substPrefix(QString *path)
{
QString spfx = dictionary["QT_SYSROOT_PREFIX"];
if (path->startsWith(spfx))
path->replace(0, spfx.size(), dictionary["QT_EXT_PREFIX"]);
}
void Configure::generateQConfigCpp() void Configure::generateQConfigCpp()
{ {
// if QT_INSTALL_* have not been specified on commandline, define them now from QT_INSTALL_PREFIX // if QT_INSTALL_* have not been specified on commandline, define them now from QT_INSTALL_PREFIX
@ -3662,6 +3678,39 @@ void Configure::generateQConfigCpp()
if (!dictionary["QT_INSTALL_TESTS"].size()) if (!dictionary["QT_INSTALL_TESTS"].size())
dictionary["QT_INSTALL_TESTS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/tests"; dictionary["QT_INSTALL_TESTS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/tests";
QChar sysrootifyPrefix = QLatin1Char('y');
dictionary["QT_SYSROOT_PREFIX"] = dictionary["QT_INSTALL_PREFIX"];
dictionary["QT_SYSROOT_HEADERS"] = dictionary["QT_INSTALL_HEADERS"];
dictionary["QT_SYSROOT_LIBS"] = dictionary["QT_INSTALL_LIBS"];
dictionary["QT_SYSROOT_ARCHDATA"] = dictionary["QT_INSTALL_ARCHDATA"];
dictionary["QT_SYSROOT_LIBEXECS"] = dictionary["QT_INSTALL_LIBEXECS"];
dictionary["QT_SYSROOT_BINS"] = dictionary["QT_INSTALL_BINS"];
dictionary["QT_SYSROOT_PLUGINS"] = dictionary["QT_INSTALL_PLUGINS"];
dictionary["QT_SYSROOT_IMPORTS"] = dictionary["QT_INSTALL_IMPORTS"];
dictionary["QT_SYSROOT_QML"] = dictionary["QT_INSTALL_QML"];
dictionary["QT_SYSROOT_DATA"] = dictionary["QT_INSTALL_DATA"];
dictionary["QT_SYSROOT_DOCS"] = dictionary["QT_INSTALL_DOCS"];
dictionary["QT_SYSROOT_TRANSLATIONS"] = dictionary["QT_INSTALL_TRANSLATIONS"];
dictionary["QT_SYSROOT_EXAMPLES"] = dictionary["QT_INSTALL_EXAMPLES"];
dictionary["QT_SYSROOT_TESTS"] = dictionary["QT_INSTALL_TESTS"];
if (dictionary["QT_EXT_PREFIX"].size()) {
sysrootifyPrefix = QLatin1Char('n');
dictionary["QT_INSTALL_PREFIX"] = dictionary["QT_EXT_PREFIX"];
substPrefix(&dictionary["QT_INSTALL_HEADERS"]);
substPrefix(&dictionary["QT_INSTALL_LIBS"]);
substPrefix(&dictionary["QT_INSTALL_ARCHDATA"]);
substPrefix(&dictionary["QT_INSTALL_LIBEXECS"]);
substPrefix(&dictionary["QT_INSTALL_BINS"]);
substPrefix(&dictionary["QT_INSTALL_PLUGINS"]);
substPrefix(&dictionary["QT_INSTALL_IMPORTS"]);
substPrefix(&dictionary["QT_INSTALL_QML"]);
substPrefix(&dictionary["QT_INSTALL_DATA"]);
substPrefix(&dictionary["QT_INSTALL_DOCS"]);
substPrefix(&dictionary["QT_INSTALL_TRANSLATIONS"]);
substPrefix(&dictionary["QT_INSTALL_EXAMPLES"]);
substPrefix(&dictionary["QT_INSTALL_TESTS"]);
}
bool haveHpx = false; bool haveHpx = false;
if (dictionary["QT_HOST_PREFIX"].isEmpty()) if (dictionary["QT_HOST_PREFIX"].isEmpty())
dictionary["QT_HOST_PREFIX"] = dictionary["QT_INSTALL_PREFIX"]; dictionary["QT_HOST_PREFIX"] = dictionary["QT_INSTALL_PREFIX"];
@ -3689,6 +3738,22 @@ void Configure::generateQConfigCpp()
<< "static const char qt_configure_installation [11 + 12] = \"qt_instdate=" << QDate::currentDate().toString(Qt::ISODate) << "\";" << endl << "static const char qt_configure_installation [11 + 12] = \"qt_instdate=" << QDate::currentDate().toString(Qt::ISODate) << "\";" << endl
<< endl << endl
<< "static const char qt_configure_prefix_path_strs[][12 + 512] = {" << endl << "static const char qt_configure_prefix_path_strs[][12 + 512] = {" << endl
<< "#ifndef QT_BUILD_QMAKE" << endl
<< " \"qt_prfxpath=" << formatPath(dictionary["QT_SYSROOT_PREFIX"]) << "\"," << endl
<< " \"qt_docspath=" << formatPath(dictionary["QT_SYSROOT_DOCS"]) << "\"," << endl
<< " \"qt_hdrspath=" << formatPath(dictionary["QT_SYSROOT_HEADERS"]) << "\"," << endl
<< " \"qt_libspath=" << formatPath(dictionary["QT_SYSROOT_LIBS"]) << "\"," << endl
<< " \"qt_lbexpath=" << formatPath(dictionary["QT_SYSROOT_LIBEXECS"]) << "\"," << endl
<< " \"qt_binspath=" << formatPath(dictionary["QT_SYSROOT_BINS"]) << "\"," << endl
<< " \"qt_plugpath=" << formatPath(dictionary["QT_SYSROOT_PLUGINS"]) << "\"," << endl
<< " \"qt_impspath=" << formatPath(dictionary["QT_SYSROOT_IMPORTS"]) << "\"," << endl
<< " \"qt_qml2path=" << formatPath(dictionary["QT_SYSROOT_QML"]) << "\"," << endl
<< " \"qt_adatpath=" << formatPath(dictionary["QT_SYSROOT_ARCHDATA"]) << "\"," << endl
<< " \"qt_datapath=" << formatPath(dictionary["QT_SYSROOT_DATA"]) << "\"," << endl
<< " \"qt_trnspath=" << formatPath(dictionary["QT_SYSROOT_TRANSLATIONS"]) << "\"," << endl
<< " \"qt_xmplpath=" << formatPath(dictionary["QT_SYSROOT_EXAMPLES"]) << "\"," << endl
<< " \"qt_tstspath=" << formatPath(dictionary["QT_SYSROOT_TESTS"]) << "\"," << endl
<< "#else" << endl
<< " \"qt_prfxpath=" << formatPath(dictionary["QT_INSTALL_PREFIX"]) << "\"," << endl << " \"qt_prfxpath=" << formatPath(dictionary["QT_INSTALL_PREFIX"]) << "\"," << endl
<< " \"qt_docspath=" << formatPath(dictionary["QT_INSTALL_DOCS"]) << "\"," << endl << " \"qt_docspath=" << formatPath(dictionary["QT_INSTALL_DOCS"]) << "\"," << endl
<< " \"qt_hdrspath=" << formatPath(dictionary["QT_INSTALL_HEADERS"]) << "\"," << endl << " \"qt_hdrspath=" << formatPath(dictionary["QT_INSTALL_HEADERS"]) << "\"," << endl
@ -3703,7 +3768,6 @@ void Configure::generateQConfigCpp()
<< " \"qt_trnspath=" << formatPath(dictionary["QT_INSTALL_TRANSLATIONS"]) << "\"," << endl << " \"qt_trnspath=" << formatPath(dictionary["QT_INSTALL_TRANSLATIONS"]) << "\"," << endl
<< " \"qt_xmplpath=" << formatPath(dictionary["QT_INSTALL_EXAMPLES"]) << "\"," << endl << " \"qt_xmplpath=" << formatPath(dictionary["QT_INSTALL_EXAMPLES"]) << "\"," << endl
<< " \"qt_tstspath=" << formatPath(dictionary["QT_INSTALL_TESTS"]) << "\"," << endl << " \"qt_tstspath=" << formatPath(dictionary["QT_INSTALL_TESTS"]) << "\"," << endl
<< "#ifdef QT_BUILD_QMAKE" << endl
<< " \"qt_ssrtpath=" << formatPath(dictionary["CFG_SYSROOT"]) << "\"," << endl << " \"qt_ssrtpath=" << formatPath(dictionary["CFG_SYSROOT"]) << "\"," << endl
<< " \"qt_hpfxpath=" << formatPath(dictionary["QT_HOST_PREFIX"]) << "\"," << endl << " \"qt_hpfxpath=" << formatPath(dictionary["QT_HOST_PREFIX"]) << "\"," << endl
<< " \"qt_hbinpath=" << formatPath(dictionary["QT_HOST_BINS"]) << "\"," << endl << " \"qt_hbinpath=" << formatPath(dictionary["QT_HOST_BINS"]) << "\"," << endl
@ -3718,6 +3782,9 @@ void Configure::generateQConfigCpp()
tmpStream << "static const char qt_configure_settings_path_str [256 + 12] = \"qt_stngpath=" << formatPath(dictionary["QT_INSTALL_SETTINGS"]) << "\";" << endl; tmpStream << "static const char qt_configure_settings_path_str [256 + 12] = \"qt_stngpath=" << formatPath(dictionary["QT_INSTALL_SETTINGS"]) << "\";" << endl;
tmpStream << endl tmpStream << endl
<< "#ifdef QT_BUILD_QMAKE\n"
<< "static const char qt_sysrootify_prefix[] = \"qt_ssrtfpfx=" << sysrootifyPrefix << "\";\n"
<< "#endif\n\n"
<< "/* strlen( \"qt_lcnsxxxx\") == 12 */" << endl << "/* strlen( \"qt_lcnsxxxx\") == 12 */" << endl
<< "#define QT_CONFIGURE_LICENSEE qt_configure_licensee_str + 12;" << endl << "#define QT_CONFIGURE_LICENSEE qt_configure_licensee_str + 12;" << endl
<< "#define QT_CONFIGURE_LICENSED_PRODUCTS qt_configure_licensed_products_str + 12;" << endl; << "#define QT_CONFIGURE_LICENSED_PRODUCTS qt_configure_licensed_products_str + 12;" << endl;

View File

@ -158,6 +158,8 @@ private:
int descIndent; int descIndent;
int outputWidth; int outputWidth;
void substPrefix(QString *path);
QString formatPath(const QString &path); QString formatPath(const QString &path);
QString formatPaths(const QStringList &paths); QString formatPaths(const QStringList &paths);