You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tqt3/qmake/generators/win32/msvc_dsp.cpp

1093 lines
43 KiB

/****************************************************************************
**
** Implementation of DspMakefileGenerator 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 "msvc_dsp.h"
#include "option.h"
#include <ntqdir.h>
#include <ntqregexp.h>
#include <stdlib.h>
#include <time.h>
DspMakefileGenerator::DspMakefileGenerator(TQMakeProject *p) : Win32MakefileGenerator(p), init_flag(FALSE)
{
}
bool
DspMakefileGenerator::writeMakefile(TQTextStream &t)
{
if(!project->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) {
/* for now just dump, I need to generated an empty dsp or something.. */
fprintf(stderr, "Project file not generated because all requirements not met:\n\t%s\n",
var("QMAKE_FAILED_REQUIREMENTS").latin1());
return TRUE;
}
if(project->first("TEMPLATE") == "vcapp" ||
project->first("TEMPLATE") == "vclib") {
return writeDspParts(t);
}
else if(project->first("TEMPLATE") == "subdirs") {
writeHeader(t);
writeSubDirs(t);
return TRUE;
}
return FALSE;
}
bool
DspMakefileGenerator::writeDspParts(TQTextStream &t)
{
TQString dspfile;
if ( !project->variables()["DSP_TEMPLATE"].isEmpty() ) {
dspfile = project->first("DSP_TEMPLATE");
} else {
dspfile = project->first("MSVCDSP_TEMPLATE");
}
if (dspfile.startsWith("\"") && dspfile.endsWith("\""))
dspfile = dspfile.mid(1, dspfile.length() - 2);
TQString dspfile_loc = findTemplate(dspfile);
TQFile file(dspfile_loc);
if(!file.open(IO_ReadOnly)) {
fprintf(stderr, "Cannot open dsp file: %s\n", dspfile.latin1());
return FALSE;
}
TQTextStream dsp(&file);
TQString platform = "Win32";
if ( !project->variables()["QMAKE_PLATFORM"].isEmpty() )
platform = varGlue("QMAKE_PLATFORM", "", " ", "");
// Setup PCH variables
precompH = project->first("PRECOMPILED_HEADER");
TQString namePCH = TQFileInfo(precompH).fileName();
usePCH = !precompH.isEmpty() && project->isActiveConfig("precompile_header");
if (usePCH) {
// Created files
TQString origTarget = project->first("QMAKE_ORIG_TARGET");
origTarget.replace(TQRegExp("-"), "_");
precompObj = "\"$(IntDir)\\" + origTarget + Option::obj_ext + "\"";
precompPch = "\"$(IntDir)\\" + origTarget + ".pch\"";
// Add PRECOMPILED_HEADER to HEADERS
if (!project->variables()["HEADERS"].contains(precompH))
project->variables()["HEADERS"] += precompH;
// Add precompile compiler options
project->variables()["PRECOMPILED_FLAGS_REL"] = "/Yu\"" + namePCH + "\" /FI\"" + namePCH + "\" ";
project->variables()["PRECOMPILED_FLAGS_DEB"] = "/Yu\"" + namePCH + "\" /FI\"" + namePCH + "\" ";
// Return to variable pool
project->variables()["PRECOMPILED_OBJECT"] = precompObj;
project->variables()["PRECOMPILED_PCH"] = precompPch;
}
int rep;
TQString line;
while ( !dsp.eof() ) {
line = dsp.readLine();
while((rep = line.find(TQRegExp("\\$\\$[a-zA-Z0-9_-]*"))) != -1) {
TQString torep = line.mid(rep, line.find(TQRegExp("[^\\$a-zA-Z0-9_-]"), rep) - rep);
TQString variable = torep.right(torep.length()-2);
t << line.left(rep); //output the left side
line = line.right(line.length() - (rep + torep.length())); //now past the variable
if(variable == "MSVCDSP_SOURCES") {
if(project->variables()["SOURCES"].isEmpty())
continue;
TQString mocpath = var( "QMAKE_MOC" );
mocpath = mocpath.replace( TQRegExp( "\\..*$" ), "" ) + " ";
TQStringList list = project->variables()["SOURCES"] + project->variables()["DEF_FILE"];
if(!project->isActiveConfig("flat"))
list.sort();
TQStringList::Iterator it;
for( it = list.begin(); it != list.end(); ++it) {
beginGroupForFile((*it), t);
t << "# Begin Source File\n\nSOURCE=" << (*it) << endl;
if (usePCH && (*it).endsWith(".c"))
t << "# SUBTRACT CPP /FI\"" << namePCH << "\" /Yu\"" << namePCH << "\" /Fp" << endl;
if ( project->isActiveConfig("moc") && (*it).endsWith(Option::cpp_moc_ext)) {
TQString base = (*it);
base.replace(TQRegExp("\\..*$"), "").upper();
base.replace(TQRegExp("[^a-zA-Z]"), "_");
TQString build = "\n\n# Begin Custom Build - Moc'ing " + findMocSource((*it)) +
"...\n" "InputPath=.\\" + (*it) + "\n\n" "\"" + (*it) + "\""
" : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\n"
"\t" + mocpath + findMocSource((*it)) + " -o " +
(*it) + "\n\n" "# End Custom Build\n\n";
t << "USERDEP_" << base << "=\".\\" << findMocSource((*it)) << "\" \"$(TQTDIR)\\bin\\moc.exe\"" << endl << endl;
t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Release\"" << build
<< "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Debug\""
<< build << "!ENDIF " << endl << endl;
}
t << "# End Source File" << endl;
}
endGroups(t);
} else if(variable == "MSVCDSP_IMAGES") {
if(project->variables()["IMAGES"].isEmpty())
continue;
t << "# Begin Source File\n\nSOURCE=" << project->first("QMAKE_IMAGE_COLLECTION") << endl;
t << "# End Source File" << endl;
} else if(variable == "MSVCDSP_HEADERS") {
if(project->variables()["HEADERS"].isEmpty())
continue;
TQStringList list = project->variables()["HEADERS"];
if(!project->isActiveConfig("flat"))
list.sort();
for(TQStringList::Iterator it = list.begin(); it != list.end(); ++it) {
// beginGroupForFile((*it), t);
t << "# Begin Source File\n\nSOURCE=" << (*it) << endl << endl;
TQString compilePCH;
TQStringList customDependencies;
TQString createMOC;
TQString buildCmdsR, buildCmdsD;
TQString buildCmds = "\nBuildCmds= \\\n";
// Create unique baseID
TQString base = (*it);
{
base.replace(TQRegExp("\\..*$"), "").upper();
base.replace(TQRegExp("[^a-zA-Z]"), "_");
}
if (usePCH && precompH.endsWith(*it)) {
TQString basicBuildCmd = TQString("\tcl.exe /TP /W3 /FD /c /D \"WIN32\" /Yc /Fp\"%1\" /Fo\"%2\" %3 %4 %5 %6 %7 %8 %9 /D \"")
.arg(precompPch)
.arg(precompObj)
.arg(var("MSVCDSP_INCPATH"))
.arg(var("MSVCDSP_DEFINES"))
.arg(var("MSVCDSP_CXXFLAGS"));
buildCmdsR = basicBuildCmd
.arg("/D \"NDEBUG\"")
.arg(var("QMAKE_CXXFLAGS_RELEASE"))
.arg(var("MSVCDSP_MTDEF"))
.arg(var("MSVCDSP_RELDEFS"));
buildCmdsD = basicBuildCmd
.arg("/D \"_DEBUG\" /Od")
.arg(var("QMAKE_CXXFLAGS_DEBUG"))
.arg(var("MSVCDSP_MTDEFD"))
.arg(var("MSVCDSP_DEBUG_OPT"));
if (project->first("TEMPLATE") == "vcapp") { // App
buildCmdsR += var("MSVCDSP_WINCONDEF");
buildCmdsD += var("MSVCDSP_WINCONDEF");
} else if (project->isActiveConfig("dll")) { // Dll
buildCmdsR += "_WINDOWS\" /D \"_USRDLL";
buildCmdsD += "_WINDOWS\" /D \"_USRDLL";
} else { // Lib
buildCmdsR += "_LIB";
buildCmdsD += "_LIB";
}
buildCmdsR += "\" /Fd\"$(IntDir)\\\\\" " + (*it) + " \\\n";
buildCmdsD += "\" /Fd\"$(IntDir)\\\\\" " + (*it) + " \\\n";
compilePCH = precompPch + " : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\n $(BuildCmds)\n\n";
TQStringList &tmp = findDependencies(precompH);
if(!tmp.isEmpty()) // Got Deps for PCH
customDependencies += tmp;
}
if (project->isActiveConfig("moc") && !findMocDestination((*it)).isEmpty()) {
TQString mocpath = var( "QMAKE_MOC" );
mocpath = mocpath.replace( TQRegExp( "\\..*$" ), "" ) + " ";
buildCmds += "\t" + mocpath + (*it) + " -o " + findMocDestination((*it)) + " \\\n";
createMOC = "\"" + findMocDestination((*it)) + "\" : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\n $(BuildCmds)\n\n";
customDependencies += "\"$(TQTDIR)\\bin\\moc.exe\"";
}
if (!createMOC.isEmpty() || !compilePCH.isEmpty()) {
bool doMOC = !createMOC.isEmpty();
bool doPCH = !compilePCH.isEmpty();
TQString build = "\n\n# Begin Custom Build - "+
TQString(doMOC?"Moc'ing ":"") +
TQString((doMOC&&doPCH)?" and ":"") +
TQString(doPCH?"Creating PCH cpp from ":"") +
(*it) + "...\nInputPath=.\\" + (*it) + "\n\n" +
buildCmds + "%1\n" +
createMOC +
compilePCH +
"# End Custom Build\n\n";
t << "USERDEP_" << base << "=" << valGlue(customDependencies, "\"", "\" \"", "\"") << endl << endl;
t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Release\"" << build.arg(buildCmdsR)
<< "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Debug\"" << build.arg(buildCmdsD)
<< "!ENDIF " << endl << endl;
}
t << "# End Source File" << endl;
}
// endGroups(t);
} else if(variable == "MSVCDSP_FORMSOURCES" || variable == "MSVCDSP_FORMHEADERS") {
if(project->variables()["FORMS"].isEmpty())
continue;
TQString uiSourcesDir;
TQString uiHeadersDir;
if(!project->variables()["UI_DIR"].isEmpty()) {
uiSourcesDir = project->first("UI_DIR");
uiHeadersDir = project->first("UI_DIR");
} else {
if ( !project->variables()["UI_SOURCES_DIR"].isEmpty() )
uiSourcesDir = project->first("UI_SOURCES_DIR");
else
uiSourcesDir = "";
if ( !project->variables()["UI_HEADERS_DIR"].isEmpty() )
uiHeadersDir = project->first("UI_HEADERS_DIR");
else
uiHeadersDir = "";
}
TQStringList list = project->variables()["FORMS"];
if(!project->isActiveConfig("flat"))
list.sort();
TQString ext = variable == "MSVCDSP_FORMSOURCES" ? ".cpp" : ".h";
for(TQStringList::Iterator it = list.begin(); it != list.end(); ++it) {
TQString base = (*it);
int dot = base.findRev(".");
base.replace( dot, base.length() - dot, ext );
TQString fname = base;
int lbs = fname.findRev( "\\" );
TQString fpath;
if ( lbs != -1 )
fpath = fname.left( lbs + 1 );
fname = fname.right( fname.length() - lbs - 1 );
if ( ext == ".cpp" && !uiSourcesDir.isEmpty() )
fname.prepend(uiSourcesDir);
else if ( ext == ".h" && !uiHeadersDir.isEmpty() )
fname.prepend(uiHeadersDir);
else
fname = base;
// beginGroupForFile(fname, t);
t << "# Begin Source File\n\nSOURCE=" << fname
<< "\n# End Source File" << endl;
}
// endGroups(t);
} else if(variable == "MSVCDSP_TRANSLATIONS" ) {
if(project->variables()["TRANSLATIONS"].isEmpty())
continue;
t << "# Begin Group \"Translations\"\n";
t << "# Prop Default_Filter \"ts\"\n";
TQStringList list = project->variables()["TRANSLATIONS"];
if(!project->isActiveConfig("flat"))
list.sort();
for(TQStringList::Iterator it = list.begin(); it != list.end(); ++it) {
TQString sify = *it;
sify.replace('/', '\\' );
TQString base = (*it);
base.replace(TQRegExp("\\..*$"), "").upper();
base.replace(TQRegExp("[^a-zA-Z]"), "_");
// beginGroupForFile(sify, t);
t << "# Begin Source File\n\nSOURCE=" << sify << endl;
t << "\n# End Source File" << endl;
}
// endGroups(t);
t << "\n# End Group\n";
} else if (variable == "MSVCDSP_MOCSOURCES" && project->isActiveConfig("moc")) {
if ( project->variables()["SRCMOC"].isEmpty())
continue;
TQString mocpath = var( "QMAKE_MOC" );
mocpath = mocpath.replace( TQRegExp( "\\..*$" ), "" ) + " ";
TQStringList list = project->variables()["SRCMOC"];
if(!project->isActiveConfig("flat"))
list.sort();
for(TQStringList::Iterator it = list.begin(); it != list.end(); ++it) {
// beginGroupForFile((*it), t);
t << "# Begin Source File\n\nSOURCE=" << (*it) << endl;
if ( project->isActiveConfig("moc") && (*it).endsWith(Option::cpp_moc_ext)) {
TQString base = (*it);
base.replace(TQRegExp("\\..*$"), "").upper();
base.replace(TQRegExp("[^a-zA-Z]"), "_");
TQString build = "\n\n# Begin Custom Build - Moc'ing " + findMocSource((*it)) +
"...\n" "InputPath=.\\" + (*it) + "\n\n" "\"" + (*it) + "\""
" : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\n"
"\t" + mocpath + findMocSource((*it)) + " -o " +
(*it) + "\n\n" "# End Custom Build\n\n";
t << "USERDEP_" << base << "=\".\\" << findMocSource((*it)) << "\" \"$(TQTDIR)\\bin\\moc.exe\"" << endl << endl;
t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Release\"" << build
<< "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Debug\""
<< build << "!ENDIF " << endl << endl;
}
t << "# End Source File" << endl;
}
// endGroups(t);
} else if(variable == "MSVCDSP_PICTURES") {
if(project->variables()["IMAGES"].isEmpty())
continue;
t << "# Begin Group \"Images\"\n"
<< "# Prop Default_Filter \"png jpeg bmp xpm\"\n";
TQStringList list = project->variables()["IMAGES"];
if(!project->isActiveConfig("flat"))
list.sort();
TQStringList::Iterator it;
// dump the image list to a file UIC can read.
TQFile f( "images.tmp" );
f.open( IO_WriteOnly );
TQTextStream ts( &f );
for( it = list.begin(); it != list.end(); ++it )
ts << " " << *it;
f.close();
// create an output step for images not more than once
bool imagesBuildDone = FALSE;
for( it = list.begin(); it != list.end(); ++it ) {
// beginGroupForFile((*it), t);
t << "# Begin Source File\n\nSOURCE=" << (*it) << endl;
TQString base = (*it);
TQString uicpath = var("QMAKE_UIC");
uicpath = uicpath.replace(TQRegExp("\\..*$"), "") + " ";
if ( !imagesBuildDone ) {
imagesBuildDone = TRUE;
TQString build = "\n\n# Begin Custom Build - Creating image collection...\n"
"InputPath=.\\" + base + "\n\n";
build += "\"" + project->first("QMAKE_IMAGE_COLLECTION") + "\" : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\n";
build += "\t" + uicpath + "-embed " + project->first("QMAKE_ORIG_TARGET") + " -f images.tmp -o "
+ project->first("QMAKE_IMAGE_COLLECTION") + "\n\n";
build.append("# End Custom Build\n\n");
t << "USERDEP_" << base << "=";
TQStringList::Iterator it2 = list.begin();
while ( it2 != list.end() ) {
t << "\"" << (*it2) << "\"";
it2++;
if ( it2 != list.end() )
t << "\\\n";
}
t << endl << endl;
t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Release\"" << build
<< "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Debug\"" << build
<< "!ENDIF \n\n" << endl;
}
t << "# End Source File" << endl;
}
// endGroups(t);
t << "\n# End Group\n";
} else if(variable == "MSVCDSP_FORMS") {
if(project->variables()["FORMS"].isEmpty())
continue;
t << "# Begin Group \"Forms\"\n"
<< "# Prop Default_Filter \"ui\"\n";
TQString uicpath = var("QMAKE_UIC");
uicpath = uicpath.replace(TQRegExp("\\..*$"), "") + " ";
TQString mocpath = var( "QMAKE_MOC" );
mocpath = mocpath.replace( TQRegExp( "\\..*$" ), "" ) + " ";
TQStringList list = project->variables()["FORMS"];
if(!project->isActiveConfig("flat"))
list.sort();
for(TQStringList::Iterator it = list.begin(); it != list.end(); ++it) {
TQString base = (*it);
// beginGroupForFile(base, t);
t << "# Begin Source File\n\nSOURCE=" << base << endl;
TQString fname = base;
fname.replace(".ui", "");
int lbs = fname.findRev( "\\" );
TQString fpath;
if ( lbs != -1 )
fpath = fname.left( lbs + 1 );
fname = fname.right( fname.length() - lbs - 1 );
TQString mocFile;
if(!project->variables()["MOC_DIR"].isEmpty())
mocFile = project->first("MOC_DIR");
else
mocFile = fpath;
TQString uiSourcesDir;
TQString uiHeadersDir;
if(!project->variables()["UI_DIR"].isEmpty()) {
uiSourcesDir = project->first("UI_DIR");
uiHeadersDir = project->first("UI_DIR");
} else {
if ( !project->variables()["UI_SOURCES_DIR"].isEmpty() )
uiSourcesDir = project->first("UI_SOURCES_DIR");
else
uiSourcesDir = fpath;
if ( !project->variables()["UI_HEADERS_DIR"].isEmpty() )
uiHeadersDir = project->first("UI_HEADERS_DIR");
else
uiHeadersDir = fpath;
}
t << "USERDEP_" << base << "=\"$(TQTDIR)\\bin\\moc.exe\" \"$(TQTDIR)\\bin\\uic.exe\"" << endl << endl;
TQString build = "\n\n# Begin Custom Build - Uic'ing " + base + "...\n"
"InputPath=.\\" + base + "\n\n" "BuildCmds= \\\n\t" + uicpath + base +
" -o " + uiHeadersDir + fname + ".h \\\n" "\t" + uicpath + base +
" -i " + fname + ".h -o " + uiSourcesDir + fname + ".cpp \\\n"
"\t" + mocpath + " " + uiHeadersDir +
fname + ".h -o " + mocFile + Option::h_moc_mod + fname + Option::h_moc_ext + " \\\n";
build.append("\n\"" + uiHeadersDir + fname + ".h\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n"
"\t$(BuildCmds)\n\n"
"\"" + uiSourcesDir + fname + ".cpp\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n"
"\t$(BuildCmds)\n\n"
"\"" + mocFile + Option::h_moc_mod + fname + Option::h_moc_ext + "\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n"
"\t$(BuildCmds)\n\n");
build.append("# End Custom Build\n\n");
t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Release\"" << build
<< "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Debug\"" << build
<< "!ENDIF \n\n" << "# End Source File" << endl;
}
// endGroups(t);
t << "\n# End Group\n";
} else if(variable == "MSVCDSP_LEXSOURCES") {
if(project->variables()["LEXSOURCES"].isEmpty())
continue;
t << "# Begin Group \"Lexables\"\n"
<< "# Prop Default_Filter \"l\"\n";
TQString lexpath = var("QMAKE_LEX") + varGlue("QMAKE_LEXFLAGS", " ", " ", "") + " ";
TQStringList list = project->variables()["LEXSOURCES"];
if(!project->isActiveConfig("flat"))
list.sort();
for(TQStringList::Iterator it = list.begin(); it != list.end(); ++it) {
TQString fname = (*it);
// beginGroupForFile(fname, t);
t << "# Begin Source File\n\nSOURCE=" << fname << endl;
fname.replace(".l", Option::lex_mod + Option::cpp_ext.first());
TQString build = "\n\n# Begin Custom Build - Lex'ing " + (*it) + "...\n"
"InputPath=.\\" + (*it) + "\n\n"
"\"" + fname + "\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n"
"\t" + lexpath + (*it) + "\\\n"
"\tdel " + fname + "\\\n"
"\tcopy lex.yy.c " + fname + "\n\n" +
"# End Custom Build\n\n";
t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Release\"" << build
<< "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Debug\"" << build
<< "!ENDIF \n\n" << build
<< "# End Source File" << endl;
}
// endGroups(t);
t << "\n# End Group\n";
} else if(variable == "MSVCDSP_YACCSOURCES") {
if(project->variables()["YACCSOURCES"].isEmpty())
continue;
t << "# Begin Group \"Yaccables\"\n"
<< "# Prop Default_Filter \"y\"\n";
TQString yaccpath = var("QMAKE_YACC") + varGlue("QMAKE_YACCFLAGS", " ", " ", "") + " ";
TQStringList list = project->variables()["YACCSOURCES"];
if(!project->isActiveConfig("flat"))
list.sort();
for(TQStringList::Iterator it = list.begin(); it != list.end(); ++it) {
TQString fname = (*it);
// beginGroupForFile(fname, t);
t << "# Begin Source File\n\nSOURCE=" << fname << endl;
fname.replace(".y", Option::yacc_mod);
TQString build = "\n\n# Begin Custom Build - Yacc'ing " + (*it) + "...\n"
"InputPath=.\\" + (*it) + "\n\n"
"\"" + fname + Option::cpp_ext.first() + "\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n"
"\t" + yaccpath + (*it) + "\\\n"
"\tdel " + fname + Option::h_ext.first() + "\\\n"
"\tmove y.tab.h " + fname + Option::h_ext.first() + "\n\n" +
"\tdel " + fname + Option::cpp_ext.first() + "\\\n"
"\tmove y.tab.c " + fname + Option::cpp_ext.first() + "\n\n" +
"# End Custom Build\n\n";
t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Release\"" << build
<< "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Debug\"" << build
<< "!ENDIF \n\n"
<< "# End Source File" << endl;
}
// endGroups(t);
t << "\n# End Group\n";
} else if( variable == "MSVCDSP_CONFIGMODE" ) {
if( project->isActiveConfig( "debug" ) )
t << "Debug";
else
t << "Release";
} else if( variable == "MSVCDSP_IDLSOURCES" ) {
TQStringList list = project->variables()["MSVCDSP_IDLSOURCES"];
if(!project->isActiveConfig("flat"))
list.sort();
for(TQStringList::Iterator it = list.begin(); it != list.end(); ++it) {
t << "# Begin Source File" << endl << endl;
t << "SOURCE=" << (*it) << endl;
t << "# PROP Exclude_From_Build 1" << endl;
t << "# End Source File" << endl << endl;
}
}
else
t << var(variable);
}
t << line << endl;
}
t << endl;
file.close();
return TRUE;
}
void
DspMakefileGenerator::init()
{
if(init_flag)
return;
TQStringList::Iterator it;
init_flag = TRUE;
const bool thread = project->isActiveConfig("thread");
if ( project->isActiveConfig("stl") ) {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_STL_ON"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_STL_ON"];
} else {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_STL_OFF"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_STL_OFF"];
}
if ( project->isActiveConfig("exceptions") ) {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_EXCEPTIONS_ON"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_EXCEPTIONS_ON"];
} else {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_EXCEPTIONS_OFF"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_EXCEPTIONS_OFF"];
}
if ( project->isActiveConfig("rtti") ) {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_ON"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_ON"];
} else {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_OFF"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_OFF"];
}
/* this should probably not be here, but I'm using it to wrap the .t files */
if(project->first("TEMPLATE") == "vcapp" )
project->variables()["QMAKE_APP_FLAG"].append("1");
else if(project->first("TEMPLATE") == "vclib")
project->variables()["QMAKE_LIB_FLAG"].append("1");
if ( project->variables()["QMAKESPEC"].isEmpty() )
project->variables()["QMAKESPEC"].append( getenv("QMAKESPEC") );
bool is_qt = (project->first("TARGET") == "qt" TQTDLL_POSTFIX || project->first("TARGET") == "tqt-mt" TQTDLL_POSTFIX);
project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"];
TQStringList &configs = project->variables()["CONFIG"];
if (project->isActiveConfig("shared"))
project->variables()["DEFINES"].append("QT_DLL");
if (project->isActiveConfig("qt_dll"))
if(configs.findIndex("qt") == -1) configs.append("qt");
if ( project->isActiveConfig("qtopia") ) {
if(configs.findIndex("qtopialib") == -1)
configs.append("qtopialib");
if(configs.findIndex("qtopiainc") == -1)
configs.append("qtopiainc");
}
if ( project->isActiveConfig("qt") ) {
if ( project->isActiveConfig( "plugin" ) ) {
project->variables()["CONFIG"].append("dll");
project->variables()["DEFINES"].append("QT_PLUGIN");
}
if ( (project->variables()["DEFINES"].findIndex("QT_NODLL") == -1) &&
((project->variables()["DEFINES"].findIndex("QT_MAKEDLL") != -1 ||
project->variables()["DEFINES"].findIndex("QT_DLL") != -1) ||
(getenv("QT_DLL") && !getenv("QT_NODLL"))) ) {
project->variables()["QMAKE_QT_DLL"].append("1");
if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() )
project->variables()["CONFIG"].append("dll");
}
}
if ( project->isActiveConfig("dll") || !project->variables()["QMAKE_APP_FLAG"].isEmpty() ) {
project->variables()["CONFIG"].remove("staticlib");
project->variables()["QMAKE_APP_OR_DLL"].append("1");
} else {
project->variables()["CONFIG"].append("staticlib");
}
if ( project->isActiveConfig("qt") || project->isActiveConfig("opengl") ) {
project->variables()["CONFIG"].append("windows");
}
if ( !project->variables()["VERSION"].isEmpty() ) {
TQString version = project->variables()["VERSION"][0];
int firstDot = version.find( "." );
TQString major = version.left( firstDot );
TQString minor = version.right( version.length() - firstDot - 1 );
minor.replace( ".", "" );
project->variables()["MSVCDSP_VERSION"].append( "/VERSION:" + major + "." + minor );
}
if ( project->isActiveConfig("qtopiainc") )
project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_TQTOPIA"];
if ( project->isActiveConfig("qtopialib") ) {
if(!project->isEmpty("QMAKE_LIBDIR_TQTOPIA"))
project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_TQTOPIA"];
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QTOPIA"];
}
if ( project->isActiveConfig("qt") ) {
project->variables()["CONFIG"].append("moc");
project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_TQT"];
project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_TQT"];
if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) {
if ( !project->variables()["QMAKE_QT_DLL"].isEmpty() ) {
project->variables()["DEFINES"].append("QT_MAKEDLL");
project->variables()["QMAKE_LFLAGS"].append("/base:\"0x39D00000\"");
}
} else {
if( thread )
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_THREAD"];
else
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT"];
if ( !project->variables()["QMAKE_QT_DLL"].isEmpty() ) {
int hver = findHighestVersion(project->first("QMAKE_LIBDIR_TQT"), "qt");
if ( hver == -1 )
hver = findHighestVersion(project->first("QMAKE_LIBDIR_TQT"), "tqt-mt");
if(hver != -1) {
TQString ver;
ver.sprintf("qt%s" TQTDLL_POSTFIX "%d.lib", (thread ? "-mt" : ""), hver);
TQStringList &libs = project->variables()["QMAKE_LIBS"];
for(TQStringList::Iterator libit = libs.begin(); libit != libs.end(); ++libit)
(*libit).replace(TQRegExp("qt(-mt)?\\.lib"), ver);
}
}
if ( !project->isActiveConfig("dll") && !project->isActiveConfig("plugin") ) {
project->variables()["QMAKE_LIBS"] +=project->variables()["QMAKE_LIBS_QT_ENTRY"];
}
}
}
if ( project->isActiveConfig("debug") ) {
if ( !project->first("OBJECTS_DIR").isEmpty() )
project->variables()["MSVCDSP_OBJECTSDIRDEB"] = project->first("OBJECTS_DIR");
else
project->variables()["MSVCDSP_OBJECTSDIRDEB"] = "Debug";
project->variables()["MSVCDSP_OBJECTSDIRREL"] = "Release";
if ( !project->first("DESTDIR").isEmpty() )
project->variables()["MSVCDSP_TARGETDIRDEB"] = project->first("DESTDIR");
else
project->variables()["MSVCDSP_TARGETDIRDEB"] = "Debug";
project->variables()["MSVCDSP_TARGETDIRREL"] = "Release";
} else {
if ( !project->first("OBJECTS_DIR").isEmpty() )
project->variables()["MSVCDSP_OBJECTSDIRREL"] = project->first("OBJECTS_DIR");
else
project->variables()["MSVCDSP_OBJECTSDIRREL"] = "Release";
project->variables()["MSVCDSP_OBJECTSDIRDEB"] = "Debug";
if ( !project->first("DESTDIR").isEmpty() )
project->variables()["MSVCDSP_TARGETDIRREL"] = project->first("DESTDIR");
else
project->variables()["MSVCDSP_TARGETDIRREL"] = "Release";
project->variables()["MSVCDSP_TARGETDIRDEB"] = "Debug";
}
if ( project->isActiveConfig("opengl") ) {
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_OPENGL"];
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_OPENGL"];
}
if ( thread ) {
if(project->isActiveConfig("qt"))
project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("TQT_THREAD_SUPPORT" );
if ( project->isActiveConfig("dll") || project->first("TARGET") == "qtmain"
|| !project->variables()["QMAKE_QT_DLL"].isEmpty() ) {
project->variables()["MSVCDSP_MTDEFD"] += project->variables()["QMAKE_CXXFLAGS_MT_DLLDBG"];
project->variables()["MSVCDSP_MTDEF"] += project->variables()["QMAKE_CXXFLAGS_MT_DLL"];
} else {
// YES we want to use the DLL even in a static build
project->variables()["MSVCDSP_MTDEFD"] += project->variables()["QMAKE_CXXFLAGS_MT_DBG"];
project->variables()["MSVCDSP_MTDEF"] += project->variables()["QMAKE_CXXFLAGS_MT"];
}
if ( !project->variables()["DEFINES"].contains("QT_DLL") && is_qt
&& project->first("TARGET") != "qtmain" )
project->variables()["QMAKE_LFLAGS"].append("/NODEFAULTLIB:\"libc\"");
}
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 ( project->isActiveConfig("dll") ) {
project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CFLAGS_CONSOLE_DLL"];
project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CXXFLAGS_CONSOLE_DLL"];
project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_LFLAGS_CONSOLE_DLL"];
project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"] = project->variables()["QMAKE_LFLAGS_WINDOWS_DLL"];
if ( !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) {
TQString ver_xyz(project->first("VERSION"));
ver_xyz.replace(".", "");
project->variables()["TARGET_EXT"].append(ver_xyz + ".dll");
} else {
project->variables()["TARGET_EXT"].append(".dll");
}
} else {
project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CFLAGS_CONSOLE"];
project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CXXFLAGS_CONSOLE"];
project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_LFLAGS_CONSOLE"];
project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"] = project->variables()["QMAKE_LFLAGS_WINDOWS"];
if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty() )
project->variables()["TARGET_EXT"].append(".exe");
else
project->variables()["TARGET_EXT"].append(".lib");
}
if ( project->isActiveConfig("windows") ) {
if ( project->isActiveConfig("console") ) {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"];
} else {
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"];
}
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_WINDOWS"];
} else {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"];
}
project->variables()["MSVCDSP_VER"] = "6.00";
project->variables()["MSVCDSP_DEBUG_OPT"] = "/GZ /ZI";
if(!project->isActiveConfig("incremental")) {
project->variables()["QMAKE_LFLAGS"].append(TQString("/incremental:no"));
if ( is_qt )
project->variables()["MSVCDSP_DEBUG_OPT"] = "/GZ /Zi";
}
TQString msvcdsp_project;
if ( project->variables()["TARGET"].count() )
msvcdsp_project = project->variables()["TARGET"].first();
TQString targetfilename = project->variables()["TARGET"].first();
project->variables()["TARGET"].first() += project->first("TARGET_EXT");
if ( project->isActiveConfig("moc") )
setMocAware(TRUE);
project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"];
project->variables()["QMAKE_FILETAGS"] += TQStringList::split(' ',
"HEADERS SOURCES DEF_FILE RC_FILE TARGET QMAKE_LIBS DESTDIR DLLDESTDIR INCLUDEPATH");
TQStringList &l = project->variables()["QMAKE_FILETAGS"];
for(it = l.begin(); it != l.end(); ++it) {
TQStringList &gdmf = project->variables()[(*it)];
for(TQStringList::Iterator inner = gdmf.begin(); inner != gdmf.end(); ++inner)
(*inner) = Option::fixPathToTargetOS((*inner), FALSE);
}
MakefileGenerator::init();
if ( msvcdsp_project.isEmpty() )
msvcdsp_project = Option::output.name();
msvcdsp_project = msvcdsp_project.right( msvcdsp_project.length() - msvcdsp_project.findRev( "\\" ) - 1 );
msvcdsp_project = msvcdsp_project.left( msvcdsp_project.findRev( "." ) );
msvcdsp_project.replace("-", "");
project->variables()["MSVCDSP_PROJECT"].append(msvcdsp_project);
TQStringList &proj = project->variables()["MSVCDSP_PROJECT"];
for(it = proj.begin(); it != proj.end(); ++it)
(*it).replace(TQRegExp("\\.[a-zA-Z0-9_]*$"), "");
if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty() ) {
project->variables()["MSVCDSP_TEMPLATE"].append("win32app" + project->first( "DSP_EXTENSION" ) );
if ( project->isActiveConfig("console") ) {
project->variables()["MSVCDSP_CONSOLE"].append("Console");
project->variables()["MSVCDSP_WINCONDEF"].append("_CONSOLE");
project->variables()["MSVCDSP_DSPTYPE"].append("0x0103");
} else {
project->variables()["MSVCDSP_CONSOLE"].clear();
project->variables()["MSVCDSP_WINCONDEF"].append("_WINDOWS");
project->variables()["MSVCDSP_DSPTYPE"].append("0x0101");
}
} else {
if ( project->isActiveConfig("dll") ) {
project->variables()["MSVCDSP_TEMPLATE"].append("win32dll" + project->first( "DSP_EXTENSION" ) );
} else {
project->variables()["MSVCDSP_TEMPLATE"].append("win32lib" + project->first( "DSP_EXTENSION" ) );
}
}
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_WINDOWS"];
processPrlFiles();
// Update -lname to name.lib,
TQStringList &libList = project->variables()["QMAKE_LIBS"];
for( TQStringList::Iterator stIt = libList.begin(); stIt != libList.end(); ) {
TQString s = *stIt;
if( s.startsWith( "-l" ) ) {
stIt = libList.remove( stIt );
stIt = libList.insert( stIt, s.mid( 2 ) + ".lib" );
} else if( s.startsWith( "-L" ) ) {
stIt = libList.remove( stIt );
project->variables()["QMAKE_LIBDIR"].append(TQDir::convertSeparators(s.mid( 2 )));
} else {
stIt++;
}
}
project->variables()["MSVCDSP_LFLAGS" ] += project->variables()["QMAKE_LFLAGS"];
if ( !project->variables()["QMAKE_LIBDIR"].isEmpty() )
project->variables()["MSVCDSP_LFLAGS" ].append(varGlue("QMAKE_LIBDIR","/LIBPATH:\"","\" /LIBPATH:\"","\""));
project->variables()["MSVCDSP_CXXFLAGS" ] += project->variables()["QMAKE_CXXFLAGS"];
project->variables()["MSVCDSP_DEFINES"].append(varGlue("DEFINES","/D ","" " /D ",""));
project->variables()["MSVCDSP_DEFINES"].append(varGlue("PRL_EXPORT_DEFINES","/D ","" " /D ",""));
if (!project->variables()["RES_FILE"].isEmpty())
project->variables()["QMAKE_LIBS"] += project->variables()["RES_FILE"];
TQStringList &libs = project->variables()["QMAKE_LIBS"];
for(TQStringList::Iterator libit = libs.begin(); libit != libs.end(); ++libit) {
TQString lib = (*libit);
lib.replace(TQRegExp("\""), "");
project->variables()["MSVCDSP_LIBS"].append(" \"" + lib + "\"");
}
TQStringList &incs = project->variables()["INCLUDEPATH"];
for(TQStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) {
TQString inc = (*incit);
inc.replace("\"", "");
if(inc.endsWith("\\")) // Remove trailing \'s from paths
inc.truncate(inc.length()-1);
if (inc.startsWith("\"") && inc.endsWith("\""))
inc = inc.mid(1, inc.length() - 2);
project->variables()["MSVCDSP_INCPATH"].append("/I \"" + inc + "\"");
}
project->variables()["MSVCDSP_INCPATH"].append("/I \"" + specdir() + "\"");
if ( project->isActiveConfig("qt") ) {
project->variables()["MSVCDSP_RELDEFS"].append("/D \"TQT_NO_DEBUG\"");
} else {
project->variables()["MSVCDSP_RELDEFS"].clear();
}
TQString dest;
TQString postLinkStep;
TQString copyDllStep;
if ( !project->variables()["QMAKE_POST_LINK"].isEmpty() )
postLinkStep += var("QMAKE_POST_LINK");
if ( !project->variables()["DESTDIR"].isEmpty() ) {
project->variables()["TARGET"].first().prepend(project->first("DESTDIR"));
Option::fixPathToTargetOS(project->first("TARGET"));
dest = project->first("TARGET");
if ( project->first("TARGET").startsWith("$(TQTDIR)") )
dest.replace( "$(TQTDIR)", getenv("TQTDIR") );
project->variables()["MSVCDSP_TARGET"].append(
TQString("/out:\"") + dest + "\"");
if ( project->isActiveConfig("dll") ) {
TQString imp = dest;
imp.replace(".dll", ".lib");
project->variables()["MSVCDSP_TARGET"].append(TQString(" /implib:\"") + imp + "\"");
}
}
if ( project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty() ) {
TQStringList dlldirs = project->variables()["DLLDESTDIR"];
if ( dlldirs.count() )
copyDllStep += "\t";
for ( TQStringList::Iterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) {
copyDllStep += "copy \"$(TargetPath)\" \"" + *dlldir + "\"\t";
}
}
if ( !postLinkStep.isEmpty() || !copyDllStep.isEmpty() ) {
project->variables()["MSVCDSP_POST_LINK_DBG"].append(
"# Begin Special Build Tool\n"
"SOURCE=$(InputPath)\n"
"PostBuild_Desc=Post Build Step\n"
"PostBuild_Cmds=" + postLinkStep + copyDllStep + "\n"
"# End Special Build Tool\n" );
project->variables()["MSVCDSP_POST_LINK_REL"].append(
"# Begin Special Build Tool\n"
"SOURCE=$(InputPath)\n"
"PostBuild_Desc=Post Build Step\n"
"PostBuild_Cmds=" + postLinkStep + copyDllStep + "\n"
"# End Special Build Tool\n" );
}
if ( !project->variables()["SOURCES"].isEmpty() || !project->variables()["RC_FILE"].isEmpty() ) {
project->variables()["SOURCES"] += project->variables()["RC_FILE"];
}
TQStringList &list = project->variables()["FORMS"];
for( it = list.begin(); it != list.end(); ++it ) {
if ( TQFile::exists( *it + ".h" ) )
project->variables()["SOURCES"].append( *it + ".h" );
}
project->variables()["QMAKE_INTERNAL_PRL_LIBS"] << "MSVCDSP_LIBS";
}
TQString
DspMakefileGenerator::findTemplate(const TQString &file)
{
TQString ret;
if(!TQFile::exists((ret = file)) &&
!TQFile::exists((ret = TQString(Option::mkfile::qmakespec + "/" + file))) &&
!TQFile::exists((ret = TQString(getenv("TQTDIR")) + "/mkspecs/win32-msvc/" + file)) &&
!TQFile::exists((ret = (TQString(getenv("HOME")) + "/.tmake/" + file))))
return "";
return ret;
}
void
DspMakefileGenerator::processPrlVariable(const TQString &var, const TQStringList &l)
{
if(var == "QMAKE_PRL_DEFINES") {
TQStringList &out = project->variables()["MSVCDSP_DEFINES"];
for(TQStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
if(out.findIndex((*it)) == -1)
out.append((" /D \"" + *it + "\""));
}
} else {
MakefileGenerator::processPrlVariable(var, l);
}
}
void
DspMakefileGenerator::beginGroupForFile(TQString file, TQTextStream &t,
const TQString& filter)
{
if(project->isActiveConfig("flat"))
return;
fileFixify(file, TQDir::currentDirPath(), TQDir::currentDirPath(), TRUE);
file = file.section(Option::dir_sep, 0, -2);
if(file.right(Option::dir_sep.length()) != Option::dir_sep)
file += Option::dir_sep;
if(file == currentGroup)
return;
if(file.isEmpty() || !TQDir::isRelativePath(file)) {
endGroups(t);
return;
}
TQString tempFile = file;
if(tempFile.startsWith(currentGroup))
tempFile = tempFile.mid(currentGroup.length());
int dirSep = currentGroup.findRev( Option::dir_sep );
while( !tempFile.startsWith( currentGroup ) && dirSep != -1 ) {
currentGroup.truncate( dirSep );
dirSep = currentGroup.findRev( Option::dir_sep );
if ( !tempFile.startsWith( currentGroup ) && dirSep != -1 )
t << "\n# End Group\n";
}
if ( !file.startsWith( currentGroup ) ) {
t << "\n# End Group\n";
currentGroup = "";
}
TQStringList dirs = TQStringList::split(Option::dir_sep, file.right( file.length() - currentGroup.length() ) );
for(TQStringList::Iterator dir_it = dirs.begin(); dir_it != dirs.end(); ++dir_it) {
t << "# Begin Group \"" << (*dir_it) << "\"\n"
<< "# Prop Default_Filter \"" << filter << "\"\n";
}
currentGroup = file;
}
void
DspMakefileGenerator::endGroups(TQTextStream &t)
{
if(project->isActiveConfig("flat"))
return;
else if(currentGroup.isEmpty())
return;
TQStringList dirs = TQStringList::split(Option::dir_sep, currentGroup);
for(TQStringList::Iterator dir_it = dirs.end(); dir_it != dirs.begin(); --dir_it) {
t << "\n# End Group\n";
}
currentGroup = "";
}
bool
DspMakefileGenerator::openOutput(TQFile &file) const
{
TQString outdir;
if(!file.name().isEmpty()) {
if(TQDir::isRelativePath(file.name()))
file.setName(Option::output_dir + file.name()); //pwd when qmake was run
TQFileInfo fi(file);
if(fi.isDir())
outdir = file.name() + TQDir::separator();
}
if(!outdir.isEmpty() || file.name().isEmpty())
file.setName(outdir + project->first("TARGET") + project->first("DSP_EXTENSION"));
if(TQDir::isRelativePath(file.name())) {
TQString ofile;
ofile = file.name();
int slashfind = ofile.findRev('\\');
if (slashfind == -1) {
ofile = ofile.replace(TQRegExp("-"), "_");
} else {
int hypenfind = ofile.find('-', slashfind);
while (hypenfind != -1 && slashfind < hypenfind) {
ofile = ofile.replace(hypenfind, 1, "_");
hypenfind = ofile.find('-', hypenfind + 1);
}
}
file.setName(Option::fixPathToLocalOS(TQDir::currentDirPath() + Option::dir_sep + ofile));
}
return Win32MakefileGenerator::openOutput(file);
}