summaryrefslogtreecommitdiff
path: root/qmake/generators/unix/unixmake.cpp
Side-by-side diff
Diffstat (limited to 'qmake/generators/unix/unixmake.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--qmake/generators/unix/unixmake.cpp168
1 files changed, 126 insertions, 42 deletions
diff --git a/qmake/generators/unix/unixmake.cpp b/qmake/generators/unix/unixmake.cpp
index 7df95b2..e274481 100644
--- a/qmake/generators/unix/unixmake.cpp
+++ b/qmake/generators/unix/unixmake.cpp
@@ -1,20 +1,20 @@
/****************************************************************************
** $Id$
**
** Definition of ________ class.
**
** Created : 970521
**
-** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2003 Trolltech AS. All rights reserved.
**
** This file is part of the network module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
@@ -63,36 +63,35 @@ UnixMakefileGenerator::init()
else if(project->first("TEMPLATE") == "subdirs") {
MakefileGenerator::init();
if(project->isEmpty("MAKEFILE"))
project->variables()["MAKEFILE"].append("Makefile");
if(project->isEmpty("QMAKE"))
project->variables()["QMAKE"].append("qmake");
if(project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].findIndex("qmake_all") == -1)
project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].append("qmake_all");
return; /* subdirs is done */
}
if( project->isEmpty("QMAKE_EXTENSION_SHLIB") ) {
- QString os = project->variables()["QMAKESPEC"].first().section( '-', 0, 0 );
- if ( os == "cygwin" ) {
- project->variables()["QMAKE_EXTENSION_SHLIB"].append( "dll" );
- } else {
+ if ( project->isEmpty("QMAKE_CYGWIN_SHLIB") ) {
project->variables()["QMAKE_EXTENSION_SHLIB"].append( "so" );
+ } else {
+ project->variables()["QMAKE_EXTENSION_SHLIB"].append( "dll" );
}
}
if( project->isEmpty("QMAKE_COPY_FILE") )
project->variables()["QMAKE_COPY_FILE"].append( "$(COPY) -p" );
if( project->isEmpty("QMAKE_COPY_DIR") )
project->variables()["QMAKE_COPY_DIR"].append( "$(COPY) -pR" );
- //If the TARGET looks like a path split it into DESTDIR and the resulting TARGET
+ //If the TARGET looks like a path split it into DESTDIR and the resulting TARGET
if(!project->isEmpty("TARGET")) {
QString targ = project->first("TARGET");
int slsh = QMAX(targ.findRev('/'), targ.findRev(Option::dir_sep));
if(slsh != -1) {
if(project->isEmpty("DESTDIR"))
project->values("DESTDIR").append("");
else if(project->first("DESTDIR").right(1) != Option::dir_sep)
project->variables()["DESTDIR"] = project->first("DESTDIR") + Option::dir_sep;
project->variables()["DESTDIR"] = project->first("DESTDIR") + targ.left(slsh+1);
project->variables()["TARGET"] = targ.mid(slsh+1);
}
}
@@ -129,25 +128,25 @@ UnixMakefileGenerator::init()
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_RELEASE"];
}
if(!project->isEmpty("QMAKE_INCREMENTAL"))
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_INCREMENTAL"];
else if(!project->isEmpty("QMAKE_LFLAGS_PREBIND") &&
!project->variables()["QMAKE_LIB_FLAG"].isEmpty() &&
project->isActiveConfig("dll"))
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_PREBIND"];
if(!project->isEmpty("QMAKE_INCDIR"))
project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR"];
if(!project->isEmpty("QMAKE_LIBDIR")) {
if ( !project->isEmpty("QMAKE_RPATH") )
- project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR", " " + var("QMAKE_RPATH"),
+ project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR", " " + var("QMAKE_RPATH"),
" " + var("QMAKE_RPATH"), "");
project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue( "QMAKE_LIBDIR", "-L", " -L", "" );
}
if ( extern_libs && (project->isActiveConfig("qt") || project->isActiveConfig("opengl")) ) {
if(configs.findIndex("x11lib") == -1)
configs.append("x11lib");
if ( project->isActiveConfig("opengl") && configs.findIndex("x11inc") == -1 )
configs.append("x11inc");
}
if ( project->isActiveConfig("x11") ) {
if(configs.findIndex("x11lib") == -1)
configs.append("x11lib");
@@ -157,68 +156,68 @@ UnixMakefileGenerator::init()
if ( project->isActiveConfig("qt") ) {
if ( project->isActiveConfig("accessibility" ) )
project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_ACCESSIBILITY_SUPPORT");
if ( project->isActiveConfig("tablet") )
project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_TABLET_SUPPORT");
if(configs.findIndex("moc")) configs.append("moc");
project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_QT"];
if ( !project->isActiveConfig("debug") )
project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_NO_DEBUG");
if ( !is_qt ) {
if ( !project->isEmpty("QMAKE_LIBDIR_QT") ) {
if ( !project->isEmpty("QMAKE_RPATH") )
- project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR_QT", " " + var("QMAKE_RPATH"),
+ project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR_QT", " " + var("QMAKE_RPATH"),
" " + var("QMAKE_RPATH"), "");
project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR_QT", "-L", " -L", "");
}
if (project->isActiveConfig("thread") && !project->isEmpty("QMAKE_LIBS_QT_THREAD"))
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_THREAD"];
else
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT"];
}
}
- if ( project->isActiveConfig("thread") ) {
- if(project->isActiveConfig("qt"))
- project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_THREAD_SUPPORT");
- if ( !project->isEmpty("QMAKE_CFLAGS_THREAD"))
- project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_THREAD"];
- if( !project->isEmpty("QMAKE_CXXFLAGS_THREAD"))
- project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_THREAD"];
- project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_THREAD"];
- project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_THREAD"];
- if(!project->isEmpty("QMAKE_LFLAGS_THREAD"))
- project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_THREAD"];
- }
if ( project->isActiveConfig("opengl") ) {
project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_OPENGL"];
- if(!project->isEmpty("QMAKE_LIBDIR_OPENGL"))
+ if(!project->isEmpty("QMAKE_LIBDIR_OPENGL"))
project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR_OPENGL", "-L", " -L", "");
if ( is_qt )
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_OPENGL_QT"];
else
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_OPENGL"];
}
if(project->isActiveConfig("global_init_link_order"))
project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"];
- if ( project->isActiveConfig("x11sm") )
- project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_X11SM"];
- if ( project->isActiveConfig("dylib") )
- project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_DYNLOAD"];
if ( project->isActiveConfig("x11inc") )
project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_X11"];
if ( project->isActiveConfig("x11lib") ) {
if(!project->isEmpty("QMAKE_LIBDIR_X11"))
project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR_X11", "-L", " -L", "");
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_X11"];
}
+ if ( project->isActiveConfig("x11sm") )
+ project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_X11SM"];
+ if ( project->isActiveConfig("dylib") )
+ project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_DYNLOAD"];
+ if ( project->isActiveConfig("thread") ) {
+ if(project->isActiveConfig("qt"))
+ project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_THREAD_SUPPORT");
+ if ( !project->isEmpty("QMAKE_CFLAGS_THREAD"))
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_THREAD"];
+ if( !project->isEmpty("QMAKE_CXXFLAGS_THREAD"))
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_THREAD"];
+ project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_THREAD"];
+ project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_THREAD"];
+ if(!project->isEmpty("QMAKE_LFLAGS_THREAD"))
+ project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_THREAD"];
+ }
if ( project->isActiveConfig("moc") )
setMocAware(TRUE);
if ( project->isEmpty("QMAKE_RUN_CC") )
project->variables()["QMAKE_RUN_CC"].append("$(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src");
if ( project->isEmpty("QMAKE_RUN_CC_IMP") )
project->variables()["QMAKE_RUN_CC_IMP"].append("$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<");
if ( project->isEmpty("QMAKE_RUN_CXX") )
project->variables()["QMAKE_RUN_CXX"].append("$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src");
if ( project->isEmpty("QMAKE_RUN_CXX_IMP") )
project->variables()["QMAKE_RUN_CXX_IMP"].append("$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<");
project->variables()["QMAKE_FILETAGS"] += QStringList::split("HEADERS SOURCES TARGET DESTDIR", " ");
if ( !project->isEmpty("PRECOMPH") ) {
@@ -331,41 +330,125 @@ UnixMakefileGenerator::uniqueSetLFlags(const QStringList &list1, QStringList &li
ret.append("-framework " + framework_in);
} else {
ret.append("-framework");
ret.append(framework_in);
}
}
}
} else {
unique = (list2.findIndex((*it)) == -1);
}
} else if(QFile::exists((*it))) {
unique = (list2.findIndex((*it)) == -1);
- }
+ }
if(unique)
ret.append((*it));
}
return ret;
}
void
UnixMakefileGenerator::processPrlVariable(const QString &var, const QStringList &l)
{
- if(var == "QMAKE_PRL_LIBS")
+ if(var == "QMAKE_PRL_LIBS")
project->variables()["QMAKE_CURRENT_PRL_LIBS"] += uniqueSetLFlags(l, project->variables()["QMAKE_LIBS"]);
else
MakefileGenerator::processPrlVariable(var, l);
}
+bool
+UnixMakefileGenerator::findLibraries()
+{
+ QPtrList<MakefileDependDir> libdirs;
+ libdirs.setAutoDelete(TRUE);
+ const QString lflags[] = { "QMAKE_LIBDIR_FLAGS", "QMAKE_LIBS", QString::null };
+ for(int i = 0; !lflags[i].isNull(); i++) {
+ QStringList &l = project->variables()[lflags[i]];
+ for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ QString stub, dir, extn, opt = (*it).stripWhiteSpace();
+ if(opt.startsWith("-")) {
+ if(opt.startsWith("-L")) {
+ QString r = opt.right(opt.length() - 2), l = r;
+ fixEnvVariables(l);
+ libdirs.append(new MakefileDependDir(r.replace("\"",""),
+ l.replace("\"","")));
+ } else if(opt.startsWith("-l")) {
+ stub = opt.mid(2);
+ } else if(project->isActiveConfig("macx") && opt.startsWith("-framework")) {
+ if(opt.length() > 11) {
+ opt = opt.mid(11);
+ } else {
+ ++it;
+ opt = (*it);
+ }
+ extn = "";
+ dir = "/System/Library/Frameworks/" + opt + ".framework/";
+ stub = opt;
+ }
+ } else {
+ extn = dir = "";
+ stub = opt;
+ int slsh = opt.findRev(Option::dir_sep);
+ if(slsh != -1) {
+ dir = opt.left(slsh);
+ stub = opt.mid(slsh+1);
+ }
+ QRegExp stub_reg("^.*lib(" + stub + "[^./=]*)\\.(.*)$");
+ if(stub_reg.exactMatch(stub)) {
+ stub = stub_reg.cap(1);
+ extn = stub_reg.cap(2);
+ }
+ }
+ if(!stub.isEmpty()) {
+ const QString modifs[] = { "-mt", QString::null };
+ for(int modif = 0; !modifs[modif].isNull(); modif++) {
+ bool found = FALSE;
+ QStringList extens;
+ if(!extn.isNull())
+ extens << extn;
+ else
+ extens << project->variables()["QMAKE_EXTENSION_SHLIB"].first() << "a";
+ for(QStringList::Iterator extit = extens.begin(); extit != extens.end(); ++extit) {
+ if(dir.isNull()) {
+ QString lib_stub;
+ for(MakefileDependDir *mdd = libdirs.first(); mdd; mdd = libdirs.next() ) {
+ if(QFile::exists(mdd->local_dir + Option::dir_sep + "lib" + stub +
+ modifs[modif] + "." + (*extit))) {
+ lib_stub = stub + modifs[modif];
+ break;
+ }
+ }
+ if(!lib_stub.isNull()) {
+ (*it) = "-l" + lib_stub;
+ found = TRUE;
+ break;
+ }
+ } else {
+ if(QFile::exists("lib" + stub + modifs[modif] + "." + (*extit))) {
+ (*it) = "lib" + stub + modifs[modif] + "." + (*extit);
+ found = TRUE;
+ break;
+ }
+ }
+ }
+ if(found)
+ break;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
void
UnixMakefileGenerator::processPrlFiles()
{
QDict<void> processed;
QPtrList<MakefileDependDir> libdirs;
libdirs.setAutoDelete(TRUE);
const QString lflags[] = { "QMAKE_LIBDIR_FLAGS", "QMAKE_LIBS", QString::null };
for(int i = 0; !lflags[i].isNull(); i++) {
for(bool ret = FALSE; TRUE; ret = FALSE) {
QStringList l_out;
QStringList &l = project->variables()[lflags[i]];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
@@ -393,25 +476,25 @@ UnixMakefileGenerator::processPrlFiles()
break;
}
}
} else if(project->isActiveConfig("macx") && opt.startsWith("-framework")) {
if(opt.length() > 11) {
opt = opt.mid(11);
} else {
++it;
opt = (*it);
}
QString prl = "/System/Library/Frameworks/" + opt +
".framework/" + opt + Option::prl_ext;
- if(processPrlFile(prl))
+ if(processPrlFile(prl))
ret = TRUE;
l_out.append("-framework");
}
if(!opt.isEmpty())
l_out.append(opt);
l_out += uniqueSetLFlags(project->variables()["QMAKE_CURRENT_PRL_LIBS"], l_out);
} else {
if(!processed[opt] && processPrlFile(opt)) {
processed.insert(opt, (void*)1);
ret = TRUE;
}
if(!opt.isEmpty())
@@ -425,96 +508,97 @@ UnixMakefileGenerator::processPrlFiles()
break;
}
}
}
QString
UnixMakefileGenerator::defaultInstall(const QString &t)
{
if(t != "target" || project->first("TEMPLATE") == "subdirs")
return QString();
bool resource = FALSE;
+ const QString root = "$(INSTALL_ROOT)";
QStringList &uninst = project->variables()[t + ".uninstall"];
- QString ret, destdir=fileFixify(project->first("DESTDIR"));
+ QString ret, destdir=project->first("DESTDIR");
QString targetdir = Option::fixPathToTargetOS(project->first("target.path"), FALSE);
if(!destdir.isEmpty() && destdir.right(1) != Option::dir_sep)
destdir += Option::dir_sep;
- targetdir = "$(INSTALL_ROOT)" + Option::fixPathToTargetOS(targetdir, FALSE);
+ targetdir = fileFixify(targetdir);
if(targetdir.right(1) != Option::dir_sep)
targetdir += Option::dir_sep;
QStringList links;
QString target="$(TARGET)";
if(project->first("TEMPLATE") == "app") {
target = "$(QMAKE_TARGET)";
if(project->isActiveConfig("resource_fork") && !project->isActiveConfig("console")) {
destdir += "../../../";
target += ".app";
resource = TRUE;
}
} else if(project->first("TEMPLATE") == "lib") {
if(project->isActiveConfig("create_prl") && !project->isEmpty("QMAKE_INTERNAL_PRL_FILE")) {
QString dst_prl = project->first("QMAKE_INTERNAL_PRL_FILE");
int slsh = dst_prl.findRev('/');
if(slsh != -1)
dst_prl = dst_prl.right(dst_prl.length() - slsh - 1);
- dst_prl = targetdir + dst_prl;
- ret += "-$(COPY) " + project->first("QMAKE_INTERNAL_PRL_FILE") + " " + dst_prl;
+ dst_prl = root + targetdir + dst_prl;
+ ret += "-$(COPY) \"" + project->first("QMAKE_INTERNAL_PRL_FILE") + "\" \"" + dst_prl + "\"";
if(!uninst.isEmpty())
uninst.append("\n\t");
uninst.append("-$(DEL_FILE) \"" + dst_prl + "\"");
}
- QString os = project->variables()["QMAKESPEC"].first().section( '-', 0, 0 );
- if ( os != "cygwin" ) {
+ if ( project->isEmpty("QMAKE_CYGWIN_SHLIB") ) {
if ( !project->isActiveConfig("staticlib") && !project->isActiveConfig("plugin") ) {
- if ( os == "hpux" ) {
- links << "$(TARGET0)";
- } else {
+ if ( project->isEmpty("QMAKE_HPUX_SHLIB") ) {
links << "$(TARGET0)" << "$(TARGET1)" << "$(TARGET2)";
+ } else {
+ links << "$(TARGET0)";
}
}
}
}
QString src_targ = target;
if(!destdir.isEmpty())
src_targ = Option::fixPathToTargetOS(destdir + target, FALSE);
- QString dst_targ = fileFixify(targetdir + target);
+ QString dst_targ = root + fileFixify(targetdir + target);
if(!ret.isEmpty())
ret += "\n\t";
ret += QString(resource ? "-$(COPY_DIR)" : "-$(COPY)") + " \"" +
src_targ + "\" \"" + dst_targ + "\"";
- if(!project->isEmpty("QMAKE_STRIP")) {
+ if(!project->isActiveConfig("debug") && !project->isEmpty("QMAKE_STRIP")) {
ret += "\n\t-" + var("QMAKE_STRIP");
+ if(!project->isEmpty("QMAKE_STRIPFLAGS_LIB") && project->first("TEMPLATE") == "lib")
+ ret += " " + var("QMAKE_STRIPFLAGS_LIB");
if(resource)
- ret = " \"" + dst_targ + "/Contents/MacOS/$(QMAKE_TARGET)";
+ ret = " \"" + dst_targ + "/Contents/MacOS/$(QMAKE_TARGET)\"";
else
ret += " \"" + dst_targ + "\"";
}
if(!uninst.isEmpty())
uninst.append("\n\t");
if(resource)
uninst.append("-$(DEL_FILE) -r \"" + dst_targ + "\"");
else
uninst.append("-$(DEL_FILE) \"" + dst_targ + "\"");
if(!links.isEmpty()) {
for(QStringList::Iterator it = links.begin(); it != links.end(); it++) {
if(Option::target_mode == Option::TARG_WIN_MODE ||
Option::target_mode == Option::TARG_MAC9_MODE) {
} else if(Option::target_mode == Option::TARG_UNIX_MODE ||
Option::target_mode == Option::TARG_MACX_MODE) {
QString link = Option::fixPathToTargetOS(destdir + (*it), FALSE);
int lslash = link.findRev(Option::dir_sep);
if(lslash != -1)
link = link.right(link.length() - (lslash + 1));
- QString dst_link = fileFixify(targetdir + link);
+ QString dst_link = root + fileFixify(targetdir + link);
ret += "\n\t-$(SYMLINK) \"$(TARGET)\" \"" + dst_link + "\"";
if(!uninst.isEmpty())
uninst.append("\n\t");
uninst.append("-$(DEL_FILE) \"" + dst_link + "\"");
}
}
}
return ret;
}
-