summaryrefslogtreecommitdiffstats
path: root/qmake/generators/win32/winmakefile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qmake/generators/win32/winmakefile.cpp')
-rw-r--r--qmake/generators/win32/winmakefile.cpp487
1 files changed, 0 insertions, 487 deletions
diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp
deleted file mode 100644
index 7c635d32c..000000000
--- a/qmake/generators/win32/winmakefile.cpp
+++ /dev/null
@@ -1,487 +0,0 @@
-/****************************************************************************
-**
-** Implementation of Win32MakefileGenerator class.
-**
-** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
-**
-** This file is part of qmake.
-**
-** This file may be used under the terms of the GNU General
-** Public License versions 2.0 or 3.0 as published by the Free
-** Software Foundation and appearing in the files LICENSE.GPL2
-** and LICENSE.GPL3 included in the packaging of this file.
-** Alternatively you may (at your option) use any later version
-** of the GNU General Public License if such license has been
-** publicly approved by Trolltech ASA (or its successors, if any)
-** and the KDE Free TQt Foundation.
-**
-** Please review the following information to ensure GNU General
-** Public Licensing requirements will be met:
-** http://trolltech.com/products/qt/licenses/licensing/opensource/.
-** If you are unsure which license is appropriate for your use, please
-** review the following information:
-** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
-** or contact the sales department at sales@trolltech.com.
-**
-** This file may be used under the terms of the Q Public License as
-** defined by Trolltech ASA and appearing in the file LICENSE.TQPL
-** included in the packaging of this file. Licensees holding valid TQt
-** Commercial licenses may use this file in accordance with the TQt
-** Commercial License Agreement provided with the Software.
-**
-** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
-** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
-** herein.
-**
-**********************************************************************/
-
-#include "winmakefile.h"
-#include "option.h"
-#include "project.h"
-#include "meta.h"
-#include <tqtextstream.h>
-#include <tqstring.h>
-#include <tqdict.h>
-#include <tqregexp.h>
-#include <tqstringlist.h>
-#include <tqdir.h>
-
-
-Win32MakefileGenerator::Win32MakefileGenerator(TQMakeProject *p) : MakefileGenerator(p)
-{
-
-}
-
-
-struct SubDir
-{
- TQString directory, profile, target, makefile;
-};
-
-void
-Win32MakefileGenerator::writeSubDirs(TQTextStream &t)
-{
- TQPtrList<SubDir> subdirs;
- {
- TQStringList subdirs_in = project->variables()["SUBDIRS"];
- for(TQStringList::Iterator it = subdirs_in.begin(); it != subdirs_in.end(); ++it) {
- TQString file = (*it);
- file = fileFixify(file);
- SubDir *sd = new SubDir;
- subdirs.append(sd);
- sd->makefile = "$(MAKEFILE)";
- if((*it).right(4) == ".pro") {
- int slsh = file.findRev(Option::dir_sep);
- if(slsh != -1) {
- sd->directory = file.left(slsh+1);
- sd->profile = file.mid(slsh+1);
- } else {
- sd->profile = file;
- }
- } else {
- sd->directory = file;
- }
- while(sd->directory.right(1) == Option::dir_sep)
- sd->directory = sd->directory.left(sd->directory.length() - 1);
- if(!sd->profile.isEmpty()) {
- TQString basename = sd->directory;
- int new_slsh = basename.findRev(Option::dir_sep);
- if(new_slsh != -1)
- basename = basename.mid(new_slsh+1);
- if(sd->profile != basename + ".pro")
- sd->makefile += "." + sd->profile.left(sd->profile.length() - 4); //no need for the .pro
- }
- sd->target = "sub-" + (*it);
- sd->target.replace('/', '-');
- sd->target.replace('.', '_');
- }
- }
- TQPtrListIterator<SubDir> it(subdirs);
-
- t << "MAKEFILE = " << (project->isEmpty("MAKEFILE") ? TQString("Makefile") : var("MAKEFILE")) << endl;
- t << "QMAKE = " << (project->isEmpty("QMAKE_QMAKE") ? TQString("qmake") : var("QMAKE_QMAKE")) << endl;
- t << "SUBTARGETS = ";
- for( it.toFirst(); it.current(); ++it)
- t << " \\\n\t\t" << it.current()->target;
- t << endl << endl;
- t << "all: $(MAKEFILE) $(SUBTARGETS)" << endl << endl;
-
- for( it.toFirst(); it.current(); ++it) {
- bool have_dir = !(*it)->directory.isEmpty();
-
- //make the makefile
- TQString mkfile = (*it)->makefile;
- if(have_dir)
- mkfile.prepend((*it)->directory + Option::dir_sep);
- t << mkfile << ":";
- if(have_dir)
- t << "\n\t" << "cd " << (*it)->directory;
- t << "\n\t" << "$(QMAKE) " << (*it)->profile << " " << buildArgs();
- t << " -o " << (*it)->makefile;
- if(have_dir) {
- int subLevels = it.current()->directory.contains(Option::dir_sep) + 1;
- t << "\n\t" << "@cd ..";
- for(int i = 1; i < subLevels; i++ )
- t << Option::dir_sep << "..";
- }
- t << endl;
-
- //now actually build
- t << (*it)->target << ": " << mkfile;
- if(project->variables()["QMAKE_NOFORCE"].isEmpty())
- t << " FORCE";
- if(have_dir)
- t << "\n\t" << "cd " << (*it)->directory;
- t << "\n\t" << "$(MAKE)";
- t << " -f " << (*it)->makefile;
- if(have_dir) {
- int subLevels = it.current()->directory.contains(Option::dir_sep) + 1;
- t << "\n\t" << "@cd ..";
- for(int i = 1; i < subLevels; i++ )
- t << Option::dir_sep << "..";
- }
- t << endl << endl;
- }
-
- if (project->isActiveConfig("ordered")) { // generate dependencies
- for( it.toFirst(); it.current(); ) {
- TQString tar = it.current()->target;
- ++it;
- if (it.current())
- t << it.current()->target << ": " << tar << endl;
- }
- t << endl;
- }
-
- if(project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].findIndex("qmake_all") == -1)
- project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].append("qmake_all");
- writeMakeQmake(t);
-
- t << "qmake_all:";
- if ( !subdirs.isEmpty() ) {
- for( it.toFirst(); it.current(); ++it) {
- bool have_dir = !(*it)->directory.isEmpty();
- TQString subdir = (*it)->directory;
- TQString profile = (*it)->profile;
- int subLevels = subdir.contains(Option::dir_sep) + 1;
- t << "\n\t";
- if(have_dir)
- t << "cd " << subdir << "\n\t";
- int lastSlash = subdir.findRev(Option::dir_sep);
- if(lastSlash != -1)
- subdir = subdir.mid( lastSlash + 1 );
- t << "$(QMAKE) "
- << ( !profile.isEmpty() ? profile : subdir + ".pro" )
- << " -o " << (*it)->makefile
- << " " << buildArgs() << "\n\t";
- if(have_dir) {
- t << "@cd ..";
- for(int i = 1; i < subLevels; i++ )
- t << Option::dir_sep << "..";
- }
- }
- } else {
- // Borland make does not like empty an empty command section, so insert
- // a dummy command.
- t << "\n\t" << "@cd .";
- }
- t << endl << endl;
-
- TQStringList targs;
- targs << "clean" << "install_subdirs" << "mocables" << "uicables" << "uiclean" << "mocclean";
- targs += project->values("SUBDIR_TARGETS");
- for(TQStringList::Iterator targ_it = targs.begin(); targ_it != targs.end(); ++targ_it) {
- t << (*targ_it) << ": qmake_all";
- TQString targ = (*targ_it);
- if(targ == "install_subdirs")
- targ = "install";
- else if(targ == "uninstall_subdirs")
- targ = "uninstall";
- if(targ == "clean")
- t << varGlue("QMAKE_CLEAN","\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ", "");
- if (!subdirs.isEmpty()) {
- for( it.toFirst(); it.current(); ++it) {
- int subLevels = (*it)->directory.contains(Option::dir_sep) + 1;
- bool have_dir = !(*it)->directory.isEmpty();
- if(have_dir)
- t << "\n\t" << "cd " << (*it)->directory;
- TQString in_file = " -f " + (*it)->makefile;
- t << "\n\t" << "$(MAKE) " << in_file << " " << targ;
- if(have_dir) {
- t << "\n\t" << "@cd ..";
- for(int i = 1; i < subLevels; i++ )
- t << Option::dir_sep << "..";
- }
- }
- } else {
- // Borland make does not like empty an empty command section, so
- // insert a dummy command.
- t << "\n\t" << "@cd .";
- }
- t << endl << endl;
- }
-
- //installations
- project->variables()["INSTALLDEPS"] += "install_subdirs";
- project->variables()["UNINSTALLDEPS"] += "uninstall_subdirs";
- writeInstalls(t, "INSTALLS");
-
- // user defined targets
- TQStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"];
- for(TQStringList::Iterator sit = qut.begin(); sit != qut.end(); ++sit) {
- TQString targ = var((*sit) + ".target"),
- cmd = var((*sit) + ".commands"), deps;
- if(targ.isEmpty())
- targ = (*sit);
- TQStringList &deplist = project->variables()[(*sit) + ".depends"];
- for(TQStringList::Iterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) {
- TQString dep = var((*dep_it) + ".target");
- if(dep.isEmpty())
- dep = (*dep_it);
- deps += " " + dep;
- }
- if(!project->variables()["QMAKE_NOFORCE"].isEmpty() &&
- project->variables()[(*sit) + ".CONFIG"].findIndex("phony") != -1)
- deps += TQString(" ") + "FORCE";
- t << targ << ":" << deps << "\n";
- if(!cmd.isEmpty())
- t << "\t" << cmd << endl;
- t << endl;
- }
- t << endl << endl;
-
- if(project->variables()["QMAKE_NOFORCE"].isEmpty())
- t << "FORCE:" << endl << endl;
-}
-
-
-int
-Win32MakefileGenerator::findHighestVersion(const TQString &d, const TQString &stem)
-{
- TQString bd = Option::fixPathToLocalOS(d, TRUE);
- if(!TQFile::exists(bd))
- return -1;
- if(!project->variables()["QMAKE_" + stem.upper() + "_VERSION_OVERRIDE"].isEmpty())
- return project->variables()["QMAKE_" + stem.upper() + "_VERSION_OVERRIDE"].first().toInt();
-
- TQDir dir(bd);
- int biggest=-1;
- TQStringList entries = dir.entryList();
- TQString dllStem = stem + TQTDLL_POSTFIX;
- TQRegExp regx( "(" + dllStem + "([0-9]*)).lib", FALSE );
- for(TQStringList::Iterator it = entries.begin(); it != entries.end(); ++it) {
- if(regx.exactMatch((*it)))
- biggest = TQMAX(biggest, (regx.cap(1) == dllStem ||
- regx.cap(2).isEmpty()) ? -1 : regx.cap(2).toInt());
- }
- TQMakeMetaInfo libinfo;
- if(libinfo.readLib(bd + dllStem)) {
- if(!libinfo.isEmpty("QMAKE_PRL_VERSION"))
- biggest = TQMAX(biggest, libinfo.first("QMAKE_PRL_VERSION").replace(".", "").toInt());
- }
- return biggest;
-}
-
-TQString
-Win32MakefileGenerator::findDependency(const TQString &dep)
-{
- {
- TQStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"];
- for(TQStringList::Iterator it = qut.begin(); it != qut.end(); ++it) {
- TQString targ = var((*it) + ".target");
- if(targ.isEmpty())
- targ = (*it);
- if(targ.endsWith(dep))
- return targ;
- }
- }
- {
- TQStringList &quc = project->variables()["QMAKE_EXTRA_WIN_COMPILERS"];
- for(TQStringList::Iterator it = quc.begin(); it != quc.end(); ++it) {
- TQString tmp_out = project->variables()[(*it) + ".output"].first();
- TQString tmp_cmd = project->variables()[(*it) + ".commands"].join(" ");
- if(tmp_out.isEmpty() || tmp_cmd.isEmpty())
- continue;
- TQStringList &tmp = project->variables()[(*it) + ".input"];
- for(TQStringList::Iterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) {
- TQStringList &inputs = project->variables()[(*it2)];
- for(TQStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) {
- TQString out = tmp_out;
- TQFileInfo fi(Option::fixPathToLocalOS((*input)));
- out.replace("${QMAKE_FILE_BASE}", fi.baseName());
- out.replace("${QMAKE_FILE_NAME}", fi.filePath());
- if(out.endsWith(dep))
- return out;
- }
- }
- }
- }
- return MakefileGenerator::findDependency(dep);
-}
-
-bool
-Win32MakefileGenerator::findLibraries(const TQString &where)
-{
-
- TQStringList &l = project->variables()[where];
- TQPtrList<MakefileDependDir> dirs;
- {
- TQStringList &libpaths = project->variables()["QMAKE_LIBDIR"];
- for(TQStringList::Iterator libpathit = libpaths.begin(); libpathit != libpaths.end(); ++libpathit) {
- TQString r = (*libpathit), l = r;
- fixEnvVariables(l);
- dirs.append(new MakefileDependDir(r.replace("\"",""), l.replace("\"","")));
- }
- }
- dirs.setAutoDelete(TRUE);
- for(TQStringList::Iterator it = l.begin(); it != l.end(); ) {
- TQChar quote;
- bool modified_opt = FALSE, remove = FALSE;
- TQString opt = (*it).stripWhiteSpace();
- if((opt[0] == '\'' || opt[0] == '"') && opt[(int)opt.length()-1] == opt[0]) {
- quote = opt[0];
- opt = opt.mid(1, opt.length()-2);
- }
- if(opt.startsWith("/LIBPATH:")) {
- TQString r = opt.mid(9), l = Option::fixPathToLocalOS(r);
- dirs.append(new MakefileDependDir(r.replace("\"",""),
- l.replace("\"","")));
- } else if(opt.startsWith("-L") || opt.startsWith("/L")) {
- TQString r = opt.mid(2), l = Option::fixPathToLocalOS(r);
- dirs.append(new MakefileDependDir(r.replace("\"",""),
- l.replace("\"","")));
- remove = TRUE; //we eat this switch
- } else if(opt.startsWith("-l") || opt.startsWith("/l")) {
- TQString lib = opt.right(opt.length() - 2), out;
- if(!lib.isEmpty()) {
- for(MakefileDependDir *mdd = dirs.first(); mdd; mdd = dirs.next() ) {
- TQString extension;
- int ver = findHighestVersion(mdd->local_dir, lib);
- if(ver > 0)
- extension += TQString::number(ver);
- extension += ".lib";
- if(TQMakeMetaInfo::libExists(mdd->local_dir + Option::dir_sep + lib) ||
- TQFile::exists(mdd->local_dir + Option::dir_sep + lib + extension)) {
- out = mdd->real_dir + Option::dir_sep + lib + extension;
- break;
- }
- }
- }
- if(out.isEmpty()) {
- remove = TRUE; //just eat it since we cannot find one..
- } else {
- modified_opt = TRUE;
- (*it) = out;
- }
- } else if(!TQFile::exists(Option::fixPathToLocalOS(opt))) {
- TQPtrList<MakefileDependDir> lib_dirs;
- TQString file = opt;
- int slsh = file.findRev(Option::dir_sep);
- if(slsh != -1) {
- TQString r = file.left(slsh+1), l = r;
- fixEnvVariables(l);
- lib_dirs.append(new MakefileDependDir(r.replace("\"",""), l.replace("\"","")));
- file = file.right(file.length() - slsh - 1);
- } else {
- lib_dirs = dirs;
- }
-#if 0
- if (!project->variables()["QMAKE_QT_DLL"].isEmpty()) {
- if(file.endsWith(".lib")) {
- file = file.left(file.length() - 4);
- if(!file.at(file.length()-1).isNumber()) {
- for(MakefileDependDir *mdd = lib_dirs.first(); mdd; mdd = lib_dirs.next() ) {
- TQString lib_tmpl(file + "%1" + ".lib");
- int ver = findHighestVersion(mdd->local_dir, file);
- if(ver != -1) {
- if(ver)
- lib_tmpl = lib_tmpl.arg(ver);
- else
- lib_tmpl = lib_tmpl.arg("");
- if(slsh != -1) {
- TQString dir = mdd->real_dir;
- if(!dir.endsWith(Option::dir_sep))
- dir += Option::dir_sep;
- lib_tmpl.prepend(dir);
- }
- modified_opt = TRUE;
- (*it) = lib_tmpl;
- break;
- }
- }
- }
- }
- }
-#endif
- }
- if(remove) {
- it = l.remove(it);
- } else {
- if(!quote.isNull() && modified_opt)
- (*it) = quote + (*it) + quote;
- ++it;
- }
- }
- return TRUE;
-}
-
-void
-Win32MakefileGenerator::processPrlFiles()
-{
- TQDict<void> processed;
- TQPtrList<MakefileDependDir> libdirs;
- libdirs.setAutoDelete(TRUE);
- {
- TQStringList &libpaths = project->variables()["QMAKE_LIBDIR"];
- for(TQStringList::Iterator libpathit = libpaths.begin(); libpathit != libpaths.end(); ++libpathit) {
- TQString r = (*libpathit), l = r;
- fixEnvVariables(l);
- libdirs.append(new MakefileDependDir(r.replace("\"",""),
- l.replace("\"","")));
- }
- }
- for(bool ret = FALSE; TRUE; ret = FALSE) {
- //read in any prl files included..
- TQStringList l_out;
- TQString where = "QMAKE_LIBS";
- if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS"))
- where = project->first("QMAKE_INTERNAL_PRL_LIBS");
- TQStringList &l = project->variables()[where];
- for(TQStringList::Iterator it = l.begin(); it != l.end(); ++it) {
- TQString opt = (*it);
- if(opt.startsWith("/")) {
- if(opt.startsWith("/LIBPATH:")) {
- TQString r = opt.mid(9), l = r;
- fixEnvVariables(l);
- libdirs.append(new MakefileDependDir(r.replace("\"",""),
- l.replace("\"","")));
- }
- } else {
- if(!processed[opt]) {
- if(processPrlFile(opt)) {
- processed.insert(opt, (void*)1);
- ret = TRUE;
- } else {
- for(MakefileDependDir *mdd = libdirs.first(); mdd; mdd = libdirs.next() ) {
- TQString prl = mdd->local_dir + Option::dir_sep + opt;
- if(processed[prl]) {
- break;
- } else if(processPrlFile(prl)) {
- processed.insert(prl, (void*)1);
- ret = TRUE;
- break;
- }
- }
- }
- }
- }
- if(!opt.isEmpty())
- l_out.append(opt);
- }
- if(ret)
- l = l_out;
- else
- break;
- }
-}