summaryrefslogtreecommitdiff
authormickeyl <mickeyl>2003-12-28 00:32:51 (UTC)
committer mickeyl <mickeyl>2003-12-28 00:32:51 (UTC)
commite889485e945d8fa9564566f286114be10d2a1ce5 (patch) (side-by-side diff)
tree23eb3b07521f36d22b165793164c25f1d0acdaae
parent7812187f6732eef351e501d993aa664b7e351cbb (diff)
downloadopie-e889485e945d8fa9564566f286114be10d2a1ce5.zip
opie-e889485e945d8fa9564566f286114be10d2a1ce5.tar.gz
opie-e889485e945d8fa9564566f286114be10d2a1ce5.tar.bz2
fix qmake 1.05a to generate the PRO line in a Makefile
this feature seemed to have been removed in 1.05a - it was in 1.04a and is needed for opie-lupdate to work
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--qmake/generators/unix/unixmake2.cpp1
1 files changed, 1 insertions, 0 deletions
diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp
index 7fbb9f4..d8a4a0d 100644
--- a/qmake/generators/unix/unixmake2.cpp
+++ b/qmake/generators/unix/unixmake2.cpp
@@ -1,400 +1,401 @@
/****************************************************************************
** $Id$
**
** Definition of ________ class.
**
** Created : 970521
**
** Copyright (C) 1992-2002 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.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "unixmake.h"
#include "option.h"
#include <qregexp.h>
#include <qfile.h>
#include <qdir.h>
#include <time.h>
UnixMakefileGenerator::UnixMakefileGenerator(QMakeProject *p) : MakefileGenerator(p), init_flag(FALSE), include_deps(FALSE)
{
}
bool
UnixMakefileGenerator::writeMakefile(QTextStream &t)
{
writeHeader(t);
if(!project->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) {
t << "all clean:" << "\n\t"
<< "@echo \"Some of the required modules ("
<< var("QMAKE_FAILED_REQUIREMENTS") << ") are not available.\"" << "\n\t"
<< "@echo \"Skipped.\"" << endl << endl;
writeMakeQmake(t);
return TRUE;
}
if (project->variables()["TEMPLATE"].first() == "app" ||
project->variables()["TEMPLATE"].first() == "lib") {
writeMakeParts(t);
return MakefileGenerator::writeMakefile(t);
} else if(project->variables()["TEMPLATE"].first() == "subdirs") {
writeSubdirs(t);
return TRUE;
}
return FALSE;
}
void
UnixMakefileGenerator::writeMakeParts(QTextStream &t)
{
QString deps = fileFixify(Option::output.name()), prl;
bool do_incremental = (project->isActiveConfig("incremental") &&
!project->variables()["QMAKE_INCREMENTAL"].isEmpty() &&
(!project->variables()["QMAKE_APP_FLAG"].isEmpty() ||
!project->isActiveConfig("staticlib"))),
src_incremental=FALSE, moc_incremental=FALSE;
t << "####### Compiler, tools and options" << endl << endl;
t << "CC = ";
if (project->isActiveConfig("thread") &&
! project->variables()["QMAKE_CC_THREAD"].isEmpty())
t << var("QMAKE_CC_THREAD") << endl;
else
t << var("QMAKE_CC") << endl;
t << "CXX = ";
if (project->isActiveConfig("thread") &&
! project->variables()["QMAKE_CXX_THREAD"].isEmpty())
t << var("QMAKE_CXX_THREAD") << endl;
else
t << var("QMAKE_CXX") << endl;
t << "LEX = " << var("QMAKE_LEX") << endl;
t << "YACC = " << var("QMAKE_YACC") << endl;
t << "CFLAGS = " << var("QMAKE_CFLAGS") << " "
<< varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " "
<< varGlue("DEFINES","-D"," -D","") << endl;
t << "CXXFLAGS = " << var("QMAKE_CXXFLAGS") << " "
<< varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " "
<< varGlue("DEFINES","-D"," -D","") << endl;
t << "LEXFLAGS = " << var("QMAKE_LEXFLAGS") << endl;
t << "YACCFLAGS= " << var("QMAKE_YACCFLAGS") << endl;
t << "INCPATH = " << "-I" << specdir();
if(!project->isActiveConfig("no_include_pwd")) {
QString pwd = fileFixify(QDir::currentDirPath());
if(pwd.isEmpty())
pwd = ".";
t << " -I" << pwd;
}
t << varGlue("INCLUDEPATH"," -I", " -I", "") << endl;
if(!project->isActiveConfig("staticlib")) {
t << "LINK = ";
if (project->isActiveConfig("thread") &&
! project->variables()["QMAKE_LINK_THREAD"].isEmpty())
t << var("QMAKE_LINK_THREAD") << endl;
else
t << var("QMAKE_LINK") << endl;
t << "LFLAGS = " << var("QMAKE_LFLAGS") << endl;
t << "LIBS = " << "$(SUBLIBS) " << var("QMAKE_LIBDIR_FLAGS") << " " << var("QMAKE_LIBS") << endl;
}
t << "AR = " << var("QMAKE_AR") << endl;
t << "RANLIB = " << var("QMAKE_RANLIB") << endl;
t << "MOC = " << var("QMAKE_MOC") << endl;
t << "UIC = " << var("QMAKE_UIC") << endl;
t << "QMAKE = " << (project->isEmpty("QMAKE_QMAKE") ? QString("qmake") : var("QMAKE_QMAKE")) << endl;
t << "TAR = " << var("QMAKE_TAR") << endl;
t << "GZIP = " << var("QMAKE_GZIP") << endl;
t << "COPY = " << var("QMAKE_COPY") << endl;
t << "COPY_FILE= " << var("QMAKE_COPY_FILE") << endl;
t << "COPY_DIR = " << var("QMAKE_COPY_DIR") << endl;
t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl;
t << "SYMLINK = " << var("QMAKE_SYMBOLIC_LINK") << endl;
t << "DEL_DIR = " << var("QMAKE_DEL_DIR") << endl;
t << "MOVE = " << var("QMAKE_MOVE") << endl;
+ t << "PRO = " << fileFixify(project->projectFile() )<< endl;
t << "CHK_DIR_EXISTS= " << var("QMAKE_CHK_DIR_EXISTS") << endl;
t << "MKDIR = " << var("QMAKE_MKDIR") << endl;
t << endl;
t << "####### Output directory" << endl << endl;
if (! project->variables()["OBJECTS_DIR"].isEmpty())
t << "OBJECTS_DIR = " << var("OBJECTS_DIR") << endl;
else
t << "OBJECTS_DIR = ./" << endl;
t << endl;
/* files */
t << "####### Files" << endl << endl;
t << "HEADERS = " << varList("HEADERS") << endl;
t << "SOURCES = " << varList("SOURCES") << endl;
if(do_incremental) {
QStringList &objs = project->variables()["OBJECTS"], &incrs = project->variables()["QMAKE_INCREMENTAL"], incrs_out;
t << "OBJECTS = ";
for(QStringList::Iterator objit = objs.begin(); objit != objs.end(); ++objit) {
bool increment = FALSE;
for(QStringList::Iterator incrit = incrs.begin(); incrit != incrs.end(); ++incrit) {
if((*objit).find(QRegExp((*incrit), TRUE, TRUE)) != -1) {
increment = TRUE;
incrs_out.append((*objit));
break;
}
}
if(!increment)
t << "\\\n\t\t" << (*objit);
}
if(incrs_out.count() == objs.count()) { //we just switched places, no real incrementals to be done!
t << incrs_out.join(" \\\n\t\t") << endl;
} else if(!incrs_out.count()) {
t << endl;
} else {
src_incremental = TRUE;
t << endl;
t << "INCREMENTAL_OBJECTS = " << incrs_out.join(" \\\n\t\t") << endl;
}
} else {
t << "OBJECTS = " << varList("OBJECTS") << endl;
}
t << "FORMS = " << varList("FORMS") << endl;
t << "UICDECLS = " << varList("UICDECLS") << endl;
t << "UICIMPLS = " << varList("UICIMPLS") << endl;
QString srcMoc = varList("SRCMOC"), objMoc = varList("OBJMOC");
t << "SRCMOC = " << srcMoc << endl;
if(do_incremental) {
QStringList &objs = project->variables()["OBJMOC"],
&incrs = project->variables()["QMAKE_INCREMENTAL"], incrs_out;
t << "OBJMOC = ";
for(QStringList::Iterator objit = objs.begin(); objit != objs.end(); ++objit) {
bool increment = FALSE;
for(QStringList::Iterator incrit = incrs.begin(); incrit != incrs.end(); ++incrit) {
if((*objit).find(QRegExp((*incrit), TRUE, TRUE)) != -1) {
increment = TRUE;
incrs_out.append((*objit));
break;
}
}
if(!increment)
t << "\\\n\t\t" << (*objit);
}
if(incrs_out.count() == objs.count()) { //we just switched places, no real incrementals to be done!
t << incrs_out.join(" \\\n\t\t") << endl;
} else if(!incrs_out.count()) {
t << endl;
} else {
moc_incremental = TRUE;
t << endl;
t << "INCREMENTAL_OBJMOC = " << incrs_out.join(" \\\n\t\t") << endl;
}
} else {
t << "OBJMOC = " << objMoc << endl;
}
if(do_incremental && !moc_incremental && !src_incremental)
do_incremental = FALSE;
t << "DIST = " << valList(fileFixify(project->variables()["DISTFILES"])) << endl;
t << "QMAKE_TARGET = " << var("QMAKE_ORIG_TARGET") << endl;
t << "DESTDIR = " << var("DESTDIR") << endl;
t << "TARGET = " << var("TARGET") << endl;
if(project->isActiveConfig("plugin") ) {
t << "TARGETD = " << var("TARGET") << endl;
} else if (!project->isActiveConfig("staticlib") && project->variables()["QMAKE_APP_FLAG"].isEmpty()) {
t << "TARGETA = " << var("TARGETA") << endl;
if (project->isEmpty("QMAKE_HPUX_SHLIB")) {
t << "TARGETD = " << var("TARGET_x.y.z") << endl;
t << "TARGET0 = " << var("TARGET_") << endl;
t << "TARGET1 = " << var("TARGET_x") << endl;
t << "TARGET2 = " << var("TARGET_x.y") << endl;
} else {
t << "TARGETD = " << var("TARGET_x") << endl;
t << "TARGET0 = " << var("TARGET_") << endl;
}
}
t << endl;
// blasted incldues
QStringList &qeui = project->variables()["QMAKE_EXTRA_UNIX_INCLUDES"];
QStringList::Iterator it;
for( it = qeui.begin(); it != qeui.end(); ++it)
t << "include " << (*it) << endl;
/* rules */
t << "first: all" << endl;
t << "####### Implicit rules" << endl << endl;
t << ".SUFFIXES: .c";
QStringList::Iterator cppit;
for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit)
t << " " << (*cppit);
t << endl << endl;
for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit)
t << (*cppit) << ".o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
t << ".c.o:\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl;
if(include_deps) {
QString cmd=var("QMAKE_CFLAGS_DEPS") + " ";
cmd += varGlue("DEFINES","-D"," -D","") + varGlue("PRL_EXPORT_DEFINES"," -D"," -D","");
if(!project->isEmpty("QMAKE_ABSOLUTE_SOURCE_PATH"))
cmd += " -I" + project->first("QMAKE_ABSOLUTE_SOURCE_PATH") + " ";
cmd += " $(INCPATH) " + varGlue("DEPENDPATH", "-I", " -I", "");
QString odir;
if(!project->variables()["OBJECTS_DIR"].isEmpty())
odir = project->first("OBJECTS_DIR");
t << "###### Dependencies" << endl << endl;
t << odir << ".deps/%.d: %.cpp\n\t"
<< "@echo Creating depend for $<" << "\n\t"
<< "@test -d $(@D) || mkdir -p $(@D)" << "\n\t"
<< "@$(CXX) " << cmd << " $< | sed \"s,^\\($(*F).o\\):," << odir << "\\1:,g\" >$@" << endl << endl;
t << odir << ".deps/%.d: %.c\n\t"
<< "@echo Creating depend for $<" << "\n\t"
<< "@test -d $(@D) || mkdir -p $(@D)" << "\n\t"
<< "@$(CC) " << cmd << " $< | sed \"s,^\\($(*F).o\\):," << odir << "\\1:,g\" >$@" << endl << endl;
QString src[] = { "SOURCES", "UICIMPLS", "SRCMOC", QString::null };
for(int x = 0; !src[x].isNull(); x++) {
QStringList &l = project->variables()[src[x]];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
if(!(*it).isEmpty()) {
QString d_file;
if((*it).endsWith(".c")) {
d_file = (*it).left((*it).length() - 2);
} else {
for(QStringList::Iterator cppit = Option::cpp_ext.begin();
cppit != Option::cpp_ext.end(); ++cppit) {
if((*it).endsWith((*cppit))) {
d_file = (*it).left((*it).length() - (*cppit).length());
break;
}
}
}
if(!d_file.isEmpty()) {
d_file = odir + ".deps/" + d_file + ".d";
QStringList deps = findDependencies((*it)).grep(QRegExp(Option::moc_ext + "$"));
if(!deps.isEmpty())
t << d_file << ": " << deps.join(" ") << endl;
t << "-include " << d_file << endl;
}
}
}
}
}
t << "####### Build rules" << endl << endl;
if(!project->variables()["SUBLIBS"].isEmpty()) {
QString libdir = "tmp/";
if(!project->isEmpty("SUBLIBS_DIR"))
libdir = project->first("SUBLIBS_DIR");
t << "SUBLIBS= ";
QStringList &l = project->variables()["SUBLIBS"];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it)
t << libdir << "lib" << (*it) << ".a ";
t << endl << endl;
}
if(project->isActiveConfig("depend_prl") && !project->isEmpty("QMAKE_PRL_INTERNAL_FILES")) {
QStringList &l = project->variables()["QMAKE_PRL_INTERNAL_FILES"];
QStringList::Iterator it;
for(it = l.begin(); it != l.end(); ++it) {
QMakeProject proj;
if(proj.read((*it), QDir::currentDirPath()) && !proj.isEmpty("QMAKE_PRL_BUILD_DIR")) {
QString dir;
int slsh = (*it).findRev(Option::dir_sep);
if(slsh != -1)
dir = (*it).left(slsh + 1);
QString targ = dir + proj.first("QMAKE_PRL_TARGET");
deps += " " + targ;
t << targ << ":" << "\n\t"
<< "@echo \"Creating '" << targ << "'\"" << "\n\t"
<< "(cd " << proj.first("QMAKE_PRL_BUILD_DIR") << ";"
<< "$(MAKE) )" << endl;
}
}
}
if(!project->variables()["QMAKE_APP_FLAG"].isEmpty()) {
QString destdir = project->first("DESTDIR");
if(do_incremental) {
//incremental target
QString incr_target = var("TARGET") + "_incremental";
if(incr_target.find(Option::dir_sep) != -1)
incr_target = incr_target.right(incr_target.length() -
(incr_target.findRev(Option::dir_sep) + 1));
QString incr_deps, incr_objs;
if(project->first("QMAKE_INCREMENTAL_STYLE") == "ld") {
QString incr_target_dir = var("OBJECTS_DIR") + incr_target + Option::obj_ext;
//actual target
t << incr_target_dir << ": $(OBJECTS)" << "\n\t"
<< "ld -r -o "<< incr_target_dir << " $(OBJECTS)" << endl;
//communicated below
deps.prepend(incr_target_dir + " ");
incr_deps = "$(UICDECLS) $(INCREMENTAL_OBJECTS) $(INCREMENTAL_OBJMOC) $(OBJMOC)";
if(!incr_objs.isEmpty())
incr_objs += " ";
incr_objs += incr_target_dir;
} else {
//actual target
QString incr_target_dir = var("DESTDIR") + "lib" + incr_target + "." +
project->variables()["QMAKE_EXTENSION_SHLIB"].first();
QString incr_lflags = var("QMAKE_LFLAGS_SHLIB") + " ";
if(project->isActiveConfig("debug"))
incr_lflags += var("QMAKE_LFLAGS_DEBUG");
else
incr_lflags += var("QMAKE_LFLAGS_RELEASE");
t << incr_target_dir << ": $(INCREMENTAL_OBJECTS) $(INCREMENTAL_OBJMOC)" << "\n\t";
if(!destdir.isEmpty())
t << "\n\t" << "test -d " << destdir << " || mkdir -p " << destdir << "\n\t";
t << "$(LINK) " << incr_lflags << " -o "<< incr_target_dir <<
" $(INCREMENTAL_OBJECTS) $(INCREMENTAL_OBJMOC)" << endl;
//communicated below
if(!destdir.isEmpty()) {
if(!incr_objs.isEmpty())
incr_objs += " ";
incr_objs += "-L" + destdir;
} else {
if(!incr_objs.isEmpty())
incr_objs += " ";
incr_objs += "-L" + QDir::currentDirPath();
}
if(!incr_objs.isEmpty())
incr_objs += " ";
incr_objs += " -l" + incr_target;
deps.prepend(incr_target_dir + " ");
incr_deps = "$(UICDECLS) $(OBJECTS) $(OBJMOC)";
}
t << "all: " << deps << " " << varGlue("ALL_DEPS",""," "," ") << "$(TARGET)"
<< endl << endl;
//real target
t << var("TARGET") << ": " << var("PRE_TARGETDEPS") << " " << incr_deps
<< " " << var("POST_TARGETDEPS") << "\n\t";
if(!destdir.isEmpty())
t << "\n\t" << "test -d " << destdir << " || mkdir -p " << destdir << "\n\t";
if(!project->isEmpty("QMAKE_PRE_LINK"))
t << var("QMAKE_PRE_LINK") << "\n\t";
t << "$(LINK) $(LFLAGS) -o $(TARGET) " << incr_deps << " " << incr_objs << " $(LIBS)";