author | zecke <zecke> | 2004-07-15 17:36:57 (UTC) |
---|---|---|
committer | zecke <zecke> | 2004-07-15 17:36:57 (UTC) |
commit | 323e9a7472a110b4befba7320540263147505bae (patch) (unidiff) | |
tree | 14c810bdb9c0603a30356b17b4bdf9ccb72741c6 /qmake/generators/win32 | |
parent | aa292b322f1ecb43dd8f4e3cd295855730dd9f59 (diff) | |
download | opie-323e9a7472a110b4befba7320540263147505bae.zip opie-323e9a7472a110b4befba7320540263147505bae.tar.gz opie-323e9a7472a110b4befba7320540263147505bae.tar.bz2 |
Manually updatet to qmake1.06a which includes support for precompiled
headers.
Opies 'PRO' keyword was already reintroduced
-rw-r--r-- | qmake/generators/win32/borland_bmake.cpp | 246 | ||||
-rw-r--r-- | qmake/generators/win32/borland_bmake.h | 11 | ||||
-rw-r--r-- | qmake/generators/win32/mingw_make.cpp | 1232 | ||||
-rw-r--r-- | qmake/generators/win32/mingw_make.h | 119 | ||||
-rw-r--r-- | qmake/generators/win32/msvc_dsp.cpp | 244 | ||||
-rw-r--r-- | qmake/generators/win32/msvc_dsp.h | 15 | ||||
-rw-r--r-- | qmake/generators/win32/msvc_nmake.cpp | 321 | ||||
-rw-r--r-- | qmake/generators/win32/msvc_nmake.h | 17 | ||||
-rw-r--r-- | qmake/generators/win32/msvc_objectmodel.cpp | 341 | ||||
-rw-r--r-- | qmake/generators/win32/msvc_objectmodel.h | 43 | ||||
-rw-r--r-- | qmake/generators/win32/msvc_vcproj.cpp | 712 | ||||
-rw-r--r-- | qmake/generators/win32/msvc_vcproj.h | 14 | ||||
-rw-r--r-- | qmake/generators/win32/winmakefile.cpp | 161 | ||||
-rw-r--r-- | qmake/generators/win32/winmakefile.h | 12 |
14 files changed, 2330 insertions, 1158 deletions
diff --git a/qmake/generators/win32/borland_bmake.cpp b/qmake/generators/win32/borland_bmake.cpp index 26eea88..12607cf 100644 --- a/qmake/generators/win32/borland_bmake.cpp +++ b/qmake/generators/win32/borland_bmake.cpp | |||
@@ -1,18 +1,16 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** |
3 | ** | 3 | ** |
4 | ** Definition of ________ class. | 4 | ** NmakeMakefileGenerator of BorlandMakefileGenerator class. |
5 | ** | 5 | ** |
6 | ** Created : 970521 | 6 | ** Copyright (C) 1992-2003 Trolltech AS. All rights reserved. |
7 | ** | 7 | ** |
8 | ** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. | 8 | ** This file is part of qmake. |
9 | ** | ||
10 | ** This file is part of the network module of the Qt GUI Toolkit. | ||
11 | ** | 9 | ** |
12 | ** This file may be distributed under the terms of the Q Public License | 10 | ** This file may be distributed under the terms of the Q Public License |
13 | ** as defined by Trolltech AS of Norway and appearing in the file | 11 | ** as defined by Trolltech AS of Norway and appearing in the file |
14 | ** LICENSE.QPL included in the packaging of this file. | 12 | ** LICENSE.QPL included in the packaging of this file. |
15 | ** | 13 | ** |
16 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This file may be distributed and/or modified under the terms of the |
17 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** GNU General Public License version 2 as published by the Free Software |
18 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** Foundation and appearing in the file LICENSE.GPL included in the |
@@ -78,20 +76,20 @@ BorlandMakefileGenerator::writeBorlandParts(QTextStream &t) | |||
78 | t << "!if !$d(BCB)" << endl; | 76 | t << "!if !$d(BCB)" << endl; |
79 | t << "BCB = $(MAKEDIR)\\.." << endl; | 77 | t << "BCB = $(MAKEDIR)\\.." << endl; |
80 | t << "!endif" << endl << endl; | 78 | t << "!endif" << endl << endl; |
81 | t << "####### Compiler, tools and options" << endl << endl; | 79 | t << "####### Compiler, tools and options" << endl << endl; |
82 | t << "CC =" << var("QMAKE_CC") << endl; | 80 | t << "CC =" << var("QMAKE_CC") << endl; |
83 | t << "CXX =" << var("QMAKE_CXX") << endl; | 81 | t << "CXX =" << var("QMAKE_CXX") << endl; |
84 | t << "LEX = " << var("QMAKE_LEX") << endl; | 82 | t << "LEX = " << var("QMAKE_LEX") << endl; |
85 | t << "YACC = " << var("QMAKE_YACC") << endl; | 83 | t << "YACC = " << var("QMAKE_YACC") << endl; |
86 | t << "CFLAGS =" << var("QMAKE_CFLAGS") << " " | 84 | t << "CFLAGS =" << var("QMAKE_CFLAGS") << " " |
87 | << varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " " | 85 | << varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " " |
88 | << varGlue("DEFINES","-D"," -D","") << endl; | 86 | << varGlue("DEFINES","-D"," -D","") << endl; |
89 | t << "CXXFLAGS=" << var("QMAKE_CXXFLAGS") << " " | 87 | t << "CXXFLAGS=" << var("QMAKE_CXXFLAGS") << " " |
90 | << varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " " | 88 | << varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " " |
91 | << varGlue("DEFINES","-D"," -D","") << endl; | 89 | << varGlue("DEFINES","-D"," -D","") << endl; |
92 | t << "LEXFLAGS=" << var("QMAKE_LEXFLAGS") << endl; | 90 | t << "LEXFLAGS=" << var("QMAKE_LEXFLAGS") << endl; |
93 | t << "YACCFLAGS=" << var("QMAKE_YACCFLAGS") << endl; | 91 | t << "YACCFLAGS=" << var("QMAKE_YACCFLAGS") << endl; |
94 | 92 | ||
95 | t << "INCPATH ="; | 93 | t << "INCPATH ="; |
96 | QStringList &incs = project->variables()["INCLUDEPATH"]; | 94 | QStringList &incs = project->variables()["INCLUDEPATH"]; |
97 | for(QStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) { | 95 | for(QStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) { |
@@ -109,47 +107,66 @@ BorlandMakefileGenerator::writeBorlandParts(QTextStream &t) | |||
109 | if ( !project->variables()["QMAKE_LIBDIR"].isEmpty() ) | 107 | if ( !project->variables()["QMAKE_LIBDIR"].isEmpty() ) |
110 | t << varGlue("QMAKE_LIBDIR","-L",";","") << " "; | 108 | t << varGlue("QMAKE_LIBDIR","-L",";","") << " "; |
111 | t << var("QMAKE_LFLAGS") << endl; | 109 | t << var("QMAKE_LFLAGS") << endl; |
112 | t << "LIBS =" << var("QMAKE_LIBS") << endl; | 110 | t << "LIBS =" << var("QMAKE_LIBS") << endl; |
113 | } | 111 | } |
114 | else { | 112 | else { |
115 | t << "LIB =" << var("QMAKE_LIB") << endl; | 113 | t << "LIB =" << var("QMAKE_LIB") << endl; |
116 | } | 114 | } |
117 | t << "MOC =" << (project->isEmpty("QMAKE_MOC") ? QString("moc") : | 115 | t << "MOC =" << (project->isEmpty("QMAKE_MOC") ? QString("moc") : |
118 | Option::fixPathToTargetOS(var("QMAKE_MOC"), FALSE)) << endl; | 116 | Option::fixPathToTargetOS(var("QMAKE_MOC"), FALSE)) << endl; |
119 | t << "UIC =" << (project->isEmpty("QMAKE_UIC") ? QString("uic") : | 117 | t << "UIC =" << (project->isEmpty("QMAKE_UIC") ? QString("uic") : |
120 | Option::fixPathToTargetOS(var("QMAKE_UIC"), FALSE)) << endl; | 118 | Option::fixPathToTargetOS(var("QMAKE_UIC"), FALSE)) << endl; |
121 | t << "QMAKE = " << (project->isEmpty("QMAKE_QMAKE") ? QString("qmake") : | 119 | t << "QMAKE = " << (project->isEmpty("QMAKE_QMAKE") ? QString("qmake") : |
122 | Option::fixPathToTargetOS(var("QMAKE_QMAKE"), FALSE)) << endl; | 120 | Option::fixPathToTargetOS(var("QMAKE_QMAKE"), FALSE)) << endl; |
123 | t << "IDC =" << (project->isEmpty("QMAKE_IDC") ? QString("idc") : | 121 | t << "IDC =" << (project->isEmpty("QMAKE_IDC") ? QString("idc") : |
124 | Option::fixPathToTargetOS(var("QMAKE_IDC"), FALSE)) << endl; | 122 | Option::fixPathToTargetOS(var("QMAKE_IDC"), FALSE)) << endl; |
125 | t << "IDL =" << (project->isEmpty("QMAKE_IDL") ? QString("midl") : | 123 | t << "IDL =" << (project->isEmpty("QMAKE_IDL") ? QString("midl") : |
126 | Option::fixPathToTargetOS(var("QMAKE_IDL"), FALSE)) << endl; | 124 | Option::fixPathToTargetOS(var("QMAKE_IDL"), FALSE)) << endl; |
127 | t << "ZIP =" << var("QMAKE_ZIP") << endl; | 125 | t << "ZIP =" << var("QMAKE_ZIP") << endl; |
128 | t << "DEF_FILE =" << varList("DEF_FILE") << endl; | 126 | t << "DEF_FILE =" << varList("DEF_FILE") << endl; |
129 | t << "RES_FILE =" << varList("RES_FILE") << endl; | 127 | t << "RES_FILE =" << varList("RES_FILE") << endl; |
130 | t << "COPY_FILE = " << var("QMAKE_COPY") << endl; | 128 | t << "COPY_FILE = " << var("QMAKE_COPY") << endl; |
131 | t << "COPY_DIR = " << var("QMAKE_COPY") << endl; | 129 | t << "COPY_DIR = " << var("QMAKE_COPY") << endl; |
132 | t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl; | 130 | t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl; |
133 | t << "DEL_DIR = " << var("QMAKE_DEL_DIR") << endl; | 131 | t << "DEL_DIR = " << var("QMAKE_DEL_DIR") << endl; |
134 | t << "MOVE = " << var("QMAKE_MOVE") << endl; | 132 | t << "MOVE = " << var("QMAKE_MOVE") << endl; |
135 | t << "CHK_DIR_EXISTS =" << var("QMAKE_CHK_DIR_EXISTS") << endl; | 133 | t << "CHK_DIR_EXISTS =" << var("QMAKE_CHK_DIR_EXISTS") << endl; |
136 | t << "MKDIR =" << var("QMAKE_MKDIR") << endl; | 134 | t << "MKDIR =" << var("QMAKE_MKDIR") << endl; |
135 | t << "INSTALL_FILE= " << var("QMAKE_INSTALL_FILE") << endl; | ||
136 | t << "INSTALL_DIR = " << var("QMAKE_INSTALL_DIR") << endl; | ||
137 | t << endl; | 137 | t << endl; |
138 | 138 | ||
139 | t << "####### Files" << endl << endl; | 139 | t << "####### Files" << endl << endl; |
140 | t << "HEADERS =" << varList("HEADERS") << endl; | 140 | t << "HEADERS =" << varList("HEADERS") << endl; |
141 | t << "SOURCES =" << varList("SOURCES") << endl; | 141 | t << "SOURCES =" << varList("SOURCES") << endl; |
142 | t << "OBJECTS =" << varList("OBJECTS") << endl; | 142 | t << "OBJECTS =" << varList("OBJECTS") << endl; |
143 | t << "FORMS =" << varList("FORMS") << endl; | 143 | t << "FORMS =" << varList("FORMS") << endl; |
144 | t << "UICDECLS =" << varList("UICDECLS") << endl; | 144 | t << "UICDECLS =" << varList("UICDECLS") << endl; |
145 | t << "UICIMPLS =" << varList("UICIMPLS") << endl; | 145 | t << "UICIMPLS =" << varList("UICIMPLS") << endl; |
146 | t << "SRCMOC =" << varList("SRCMOC") << endl; | 146 | t << "SRCMOC =" << varList("SRCMOC") << endl; |
147 | t << "OBJMOC =" << varList("OBJMOC") << endl; | 147 | t << "OBJMOC =" << varList("OBJMOC") << endl; |
148 | |||
149 | QString extraCompilerDeps; | ||
150 | if(!project->isEmpty("QMAKE_EXTRA_WIN_COMPILERS")) { | ||
151 | t << "OBJCOMP = " << varList("OBJCOMP") << endl; | ||
152 | extraCompilerDeps += " $(OBJCOMP) "; | ||
153 | |||
154 | QStringList &comps = project->variables()["QMAKE_EXTRA_WIN_COMPILERS"]; | ||
155 | for(QStringList::Iterator compit = comps.begin(); compit != comps.end(); ++compit) { | ||
156 | QStringList &vars = project->variables()[(*compit) + ".variables"]; | ||
157 | for(QStringList::Iterator varit = vars.begin(); varit != vars.end(); ++varit) { | ||
158 | QStringList vals = project->variables()[(*varit)]; | ||
159 | if(!vals.isEmpty()) | ||
160 | t << "QMAKE_COMP_" << (*varit) << " = " << valList(vals) << endl; | ||
161 | } | ||
162 | } | ||
163 | } | ||
164 | |||
148 | t << "DIST =" << varList("DISTFILES") << endl; | 165 | t << "DIST =" << varList("DISTFILES") << endl; |
149 | t << "TARGET =" | 166 | t << "TARGET =" |
150 | << varGlue("TARGET",project->first("DESTDIR"),"",project->first("TARGET_EXT")) | 167 | << varGlue("TARGET",project->first("DESTDIR"),"",project->first("TARGET_EXT")) |
151 | << endl; | 168 | << endl; |
152 | t << endl; | 169 | t << endl; |
153 | 170 | ||
154 | t << "####### Implicit rules" << endl << endl; | 171 | t << "####### Implicit rules" << endl << endl; |
155 | t << ".SUFFIXES: .c"; | 172 | t << ".SUFFIXES: .c"; |
@@ -157,140 +174,232 @@ BorlandMakefileGenerator::writeBorlandParts(QTextStream &t) | |||
157 | for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) | 174 | for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) |
158 | t << " " << (*cppit); | 175 | t << " " << (*cppit); |
159 | t << endl << endl; | 176 | t << endl << endl; |
160 | for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) | 177 | for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) |
161 | t << (*cppit) << Option::obj_ext << ":\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl; | 178 | t << (*cppit) << Option::obj_ext << ":\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl; |
162 | t << ".c" << Option::obj_ext << ":\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl; | 179 | t << ".c" << Option::obj_ext << ":\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl; |
163 | 180 | ||
164 | t << "####### Build rules" << endl << endl; | 181 | t << "####### Build rules" << endl << endl; |
165 | t << "all: " << varGlue("ALL_DEPS",""," "," ") << " $(TARGET)" << endl << endl; | 182 | t << "all: " << fileFixify(Option::output.name()) << " " << varGlue("ALL_DEPS"," "," "," ") << " $(TARGET)" << endl << endl; |
166 | t << "$(TARGET): " << var("PRE_TARGETDEPS") << " $(UICDECLS) $(OBJECTS) $(OBJMOC) " | 183 | t << "$(TARGET): " << var("PRE_TARGETDEPS") << " $(UICDECLS) $(OBJECTS) $(OBJMOC) " |
167 | << var("POST_TARGETDEPS"); | 184 | << extraCompilerDeps << var("POST_TARGETDEPS"); |
168 | if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) { | 185 | if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) { |
169 | t << "\n\t" << "$(LINK) @&&|" << "\n\t" | 186 | t << "\n\t" << "$(LINK) @&&|" << "\n\t" |
170 | << "$(LFLAGS) $(OBJECTS) $(OBJMOC),$(TARGET),,$(LIBS),$(DEF_FILE),$(RES_FILE)"; | 187 | << "$(LFLAGS) $(OBJECTS) $(OBJMOC),$(TARGET),,$(LIBS),$(DEF_FILE),$(RES_FILE)"; |
171 | } else { | 188 | } else { |
172 | t << "\n\t-del $(TARGET)" | 189 | t << "\n\t-$(DEL_FILE) $(TARGET)" |
173 | << "\n\t" << "$(LIB) $(TARGET) @&&|" << " \n+" | 190 | << "\n\t" << "$(LIB) $(TARGET) @&&|" << " \n+" |
174 | << project->variables()["OBJECTS"].join(" \\\n+") << " \\\n+" | 191 | << project->variables()["OBJECTS"].join(" \\\n+") << " \\\n+" |
175 | << project->variables()["OBJMOC"].join(" \\\n+"); | 192 | << project->variables()["OBJMOC"].join(" \\\n+"); |
176 | } | 193 | } |
194 | t << extraCompilerDeps; | ||
177 | t << endl << "|" << endl; | 195 | t << endl << "|" << endl; |
178 | 196 | ||
179 | if ( !project->variables()["QMAKE_POST_LINK"].isEmpty() ) | 197 | if ( !project->variables()["QMAKE_POST_LINK"].isEmpty() ) |
180 | t << "\t" <<var("QMAKE_POST_LINK") << endl; | 198 | t << "\t" <<var("QMAKE_POST_LINK") << endl; |
181 | 199 | ||
182 | if(project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty()) { | 200 | if(project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty()) { |
183 | QStringList dlldirs = project->variables()["DLLDESTDIR"]; | 201 | QStringList dlldirs = project->variables()["DLLDESTDIR"]; |
184 | for ( QStringList::Iterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) { | 202 | for ( QStringList::Iterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) { |
185 | t << "\n\t" << "-copy $(TARGET) " << *dlldir; | 203 | t << "\n\t" << "-$(COPY_FILE) \"$(TARGET)\" " << *dlldir; |
186 | } | 204 | } |
187 | } | 205 | } |
188 | QString targetfilename = project->variables()["TARGET"].first(); | 206 | QString targetfilename = project->variables()["TARGET"].first(); |
189 | if(project->isActiveConfig("activeqt")) { | 207 | if(project->isActiveConfig("activeqt")) { |
190 | QString version = project->variables()["VERSION"].first(); | 208 | QString version = project->variables()["VERSION"].first(); |
191 | if ( version.isEmpty() ) | 209 | if ( version.isEmpty() ) |
192 | version = "1.0"; | 210 | version = "1.0"; |
193 | 211 | ||
194 | if ( project->isActiveConfig("dll")) { | 212 | if ( project->isActiveConfig("dll")) { |
195 | t << "\n\t" << ("-$(IDC) $(TARGET) /idl tmp\\" + targetfilename + ".idl -version " + version); | 213 | t << "\n\t" << ("-$(IDC) $(TARGET) /idl " + var("OBJECTS_DIR") + targetfilename + ".idl -version " + version); |
196 | t << "\n\t" << ("-$(IDL) tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl"); | 214 | t << "\n\t" << ("-$(IDL) /nologo " + var("OBJECTS_DIR") + targetfilename + ".idl /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
197 | t << "\n\t" << ("-$(IDC) $(TARGET) /tlb tmp\\" + targetfilename + ".tlb"); | 215 | t << "\n\t" << ("-$(IDC) $(TARGET) /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
198 | t << "\n\t" << ("-$(IDC) $(TARGET) /regserver" ); | 216 | t << "\n\t" << ("-$(IDC) $(TARGET) /regserver" ); |
199 | } else { | 217 | } else { |
200 | t << "\n\t" << ("-$(TARGET) -dumpidl tmp\\" + targetfilename + ".idl -version " + version); | 218 | t << "\n\t" << ("-$(TARGET) -dumpidl " + var("OBJECTS_DIR") + targetfilename + ".idl -version " + version); |
201 | t << "\n\t" << ("-$(IDL) tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl"); | 219 | t << "\n\t" << ("-$(IDL) /nologo " + var("OBJECTS_DIR") + targetfilename + ".idl /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
202 | t << "\n\t" << ("-$(IDC) $(TARGET) /tlb tmp\\" + targetfilename + ".tlb"); | 220 | t << "\n\t" << ("-$(IDC) $(TARGET) /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
203 | t << "\n\t" << ("-$(TARGET) -regserver"); | 221 | t << "\n\t" << ("-$(TARGET) -regserver"); |
204 | } | 222 | } |
205 | } | 223 | } |
206 | t << endl << endl; | 224 | t << endl << endl; |
207 | 225 | ||
208 | if(!project->variables()["RC_FILE"].isEmpty()) { | 226 | if(!project->variables()["RC_FILE"].isEmpty()) { |
209 | t << var("RES_FILE") << ": " << var("RC_FILE") << "\n\t" | 227 | t << var("RES_FILE") << ": " << var("RC_FILE") << "\n\t" |
210 | << var("QMAKE_RC") << " " << var("RC_FILE") << endl << endl; | 228 | << var("QMAKE_RC") << " " << var("RC_FILE") << endl << endl; |
211 | } | 229 | } |
212 | t << "mocables: $(SRCMOC)" << endl << endl; | 230 | t << "mocables: $(SRCMOC)" << endl |
231 | << "uicables: $(UICIMPLS) $(UICDECLS)" << endl << endl; | ||
213 | 232 | ||
214 | writeMakeQmake(t); | 233 | writeMakeQmake(t); |
215 | 234 | ||
235 | QStringList dist_files = Option::mkfile::project_files; | ||
236 | if(!project->isEmpty("QMAKE_INTERNAL_INCLUDED_FILES")) | ||
237 | dist_files += project->variables()["QMAKE_INTERNAL_INCLUDED_FILES"]; | ||
238 | if(!project->isEmpty("TRANSLATIONS")) | ||
239 | dist_files << var("TRANSLATIONS"); | ||
240 | if(!project->isEmpty("FORMS")) { | ||
241 | QStringList &forms = project->variables()["FORMS"]; | ||
242 | for(QStringList::Iterator formit = forms.begin(); formit != forms.end(); ++formit) { | ||
243 | QString ui_h = fileFixify((*formit) + Option::h_ext.first()); | ||
244 | if(QFile::exists(ui_h) ) | ||
245 | dist_files << ui_h; | ||
246 | } | ||
247 | } | ||
216 | t << "dist:" << "\n\t" | 248 | t << "dist:" << "\n\t" |
217 | << "$(ZIP) " << var("PROJECT") << ".zip " << var("PROJECT") << ".pro $(SOURCES) $(HEADERS) $(DIST) $(FORMS)" | 249 | << "$(ZIP) " << var("QMAKE_ORIG_TARGET") << ".zip " << "$(SOURCES) $(HEADERS) $(DIST) $(FORMS) " |
218 | << endl << endl; | 250 | << dist_files.join(" ") << " " << var("TRANSLATIONS") << " " << var("IMAGES") << endl << endl; |
251 | |||
252 | t << "uiclean:"; | ||
253 | QString uiclean = varGlue("UICDECLS" ,"\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","") + varGlue("UICIMPLS" ,"\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ",""); | ||
254 | if ( uiclean.isEmpty() ) { | ||
255 | // Borland make does not like an empty command section | ||
256 | uiclean = "\n\t@cd ."; | ||
257 | } | ||
258 | t << uiclean << endl; | ||
259 | |||
260 | t << "mocclean:"; | ||
261 | QString mocclean = varGlue("SRCMOC" ,"\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","") + varGlue("OBJMOC" ,"\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ",""); | ||
262 | if ( mocclean.isEmpty() ) { | ||
263 | // Borland make does not like an empty command section | ||
264 | mocclean = "\n\t@cd ."; | ||
265 | } | ||
266 | t << mocclean << endl; | ||
219 | 267 | ||
220 | t << "clean:\n" | 268 | t << "clean: uiclean mocclean" |
221 | << varGlue("OBJECTS","\t-del ","\n\t-del ","") | 269 | << varGlue("OBJECTS","\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","") |
222 | << varGlue("SRCMOC" ,"\n\t-del ","\n\t-del ","") | 270 | << varGlue("QMAKE_CLEAN","\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","") |
223 | << varGlue("OBJMOC" ,"\n\t-del ","\n\t-del ","") | 271 | << varGlue("CLEAN_FILES","\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ",""); |
224 | << varGlue("UICDECLS" ,"\n\t-del ","\n\t-del ","") | ||
225 | << varGlue("UICIMPLS" ,"\n\t-del ","\n\t-del ","") | ||
226 | << varGlue("QMAKE_CLEAN","\n\t-del ","\n\t-del ","") | ||
227 | << varGlue("CLEAN_FILES","\n\t-del ","\n\t-del ",""); | ||
228 | if ( project->isActiveConfig("activeqt")) { | 272 | if ( project->isActiveConfig("activeqt")) { |
229 | t << ("\n\t-del tmp\\" + targetfilename + ".*"); | 273 | t << ("\n\t-$(DEL_FILE) " + var("OBJECTS_DIR") + targetfilename + ".idl"); |
230 | t << "\n\t-del tmp\\dump.*"; | 274 | t << ("\n\t-$(DEL_FILE) " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
231 | } | 275 | } |
232 | if(!project->isEmpty("IMAGES")) | 276 | if(!project->isEmpty("IMAGES")) |
233 | t << varGlue("QMAKE_IMAGE_COLLECTION", "\n\t-del ", "\n\t-del ", ""); | 277 | t << varGlue("QMAKE_IMAGE_COLLECTION", "\n\t-$(DEL_FILE) ", "\n\t-$(DEL_FILE) ", ""); |
278 | t << endl; | ||
234 | 279 | ||
235 | // blasted user defined targets | 280 | // user defined targets |
281 | QStringList::Iterator it; | ||
236 | QStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"]; | 282 | QStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"]; |
237 | for(QStringList::Iterator it = qut.begin(); it != qut.end(); ++it) { | 283 | for(it = qut.begin(); it != qut.end(); ++it) { |
238 | QString targ = var((*it) + ".target"), | 284 | QString targ = var((*it) + ".target"), |
239 | cmd = var((*it) + ".commands"), deps; | 285 | cmd = var((*it) + ".commands"), deps; |
240 | if(targ.isEmpty()) | 286 | if(targ.isEmpty()) |
241 | targ = (*it); | 287 | targ = (*it); |
242 | QStringList &deplist = project->variables()[(*it) + ".depends"]; | 288 | QStringList &deplist = project->variables()[(*it) + ".depends"]; |
243 | for(QStringList::Iterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) { | 289 | for(QStringList::Iterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) { |
244 | QString dep = var((*dep_it) + ".target"); | 290 | QString dep = var((*dep_it) + ".target"); |
245 | if(dep.isEmpty()) | 291 | if(dep.isEmpty()) |
246 | dep = (*dep_it); | 292 | dep = (*dep_it); |
247 | deps += " " + dep; | 293 | deps += " " + dep; |
248 | } | 294 | } |
295 | if(!project->variables()["QMAKE_NOFORCE"].isEmpty() && | ||
296 | project->variables()[(*it) + ".CONFIG"].findIndex("phony") != -1) | ||
297 | deps += QString(" ") + "FORCE"; | ||
249 | t << "\n\n" << targ << ":" << deps << "\n\t" | 298 | t << "\n\n" << targ << ":" << deps << "\n\t" |
250 | << cmd; | 299 | << cmd; |
251 | } | 300 | } |
252 | 301 | ||
253 | t << endl << endl; | 302 | t << endl << endl; |
254 | 303 | ||
304 | QStringList &quc = project->variables()["QMAKE_EXTRA_WIN_COMPILERS"]; | ||
305 | for(it = quc.begin(); it != quc.end(); ++it) { | ||
306 | QString tmp_out = project->variables()[(*it) + ".output"].first(); | ||
307 | QString tmp_cmd = project->variables()[(*it) + ".commands"].join(" "); | ||
308 | QString tmp_dep = project->variables()[(*it) + ".depends"].join(" "); | ||
309 | QStringList &vars = project->variables()[(*it) + ".variables"]; | ||
310 | if(tmp_out.isEmpty() || tmp_cmd.isEmpty()) | ||
311 | continue; | ||
312 | QStringList &tmp = project->variables()[(*it) + ".input"]; | ||
313 | for(QStringList::Iterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) { | ||
314 | QStringList &inputs = project->variables()[(*it2)]; | ||
315 | for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) { | ||
316 | QFileInfo fi(Option::fixPathToLocalOS((*input))); | ||
317 | QString in = Option::fixPathToTargetOS((*input), FALSE), | ||
318 | out = tmp_out, cmd = tmp_cmd, deps; | ||
319 | out.replace("${QMAKE_FILE_BASE}", fi.baseName()); | ||
320 | out.replace("${QMAKE_FILE_NAME}", fi.fileName()); | ||
321 | cmd.replace("${QMAKE_FILE_BASE}", fi.baseName()); | ||
322 | cmd.replace("${QMAKE_FILE_OUT}", out); | ||
323 | cmd.replace("${QMAKE_FILE_NAME}", fi.fileName()); | ||
324 | for(QStringList::Iterator it3 = vars.begin(); it3 != vars.end(); ++it3) | ||
325 | cmd.replace("$(" + (*it3) + ")", "$(QMAKE_COMP_" + (*it3)+")"); | ||
326 | if(!tmp_dep.isEmpty()) { | ||
327 | char buff[256]; | ||
328 | QString dep_cmd = tmp_dep; | ||
329 | dep_cmd.replace("${QMAKE_FILE_NAME}", fi.fileName()); | ||
330 | if(FILE *proc = QT_POPEN(dep_cmd.latin1(), "r")) { | ||
331 | while(!feof(proc)) { | ||
332 | int read_in = int(fread(buff, 1, 255, proc)); | ||
333 | if(!read_in) | ||
334 | break; | ||
335 | int l = 0; | ||
336 | for(int i = 0; i < read_in; i++) { | ||
337 | if(buff[i] == '\n' || buff[i] == ' ') { | ||
338 | deps += " " + QCString(buff+l, (i - l) + 1); | ||
339 | l = i; | ||
340 | } | ||
341 | } | ||
342 | } | ||
343 | fclose(proc); | ||
344 | } | ||
345 | } | ||
346 | t << out << ": " << in << deps << "\n\t" | ||
347 | << cmd << endl << endl; | ||
348 | } | ||
349 | } | ||
350 | } | ||
351 | t << endl; | ||
352 | |||
255 | t << "distclean: clean" | 353 | t << "distclean: clean" |
256 | << "\n\t-del $(TARGET)" | 354 | << "\n\t-$(DEL_FILE) $(TARGET)" |
257 | << endl << endl; | 355 | << endl << endl; |
258 | } | 356 | } |
259 | 357 | ||
260 | void | 358 | void |
261 | BorlandMakefileGenerator::init() | 359 | BorlandMakefileGenerator::init() |
262 | { | 360 | { |
263 | if(init_flag) | 361 | if(init_flag) |
264 | return; | 362 | return; |
265 | init_flag = TRUE; | 363 | init_flag = TRUE; |
266 | 364 | ||
267 | project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"]; | 365 | project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"]; |
268 | 366 | ||
269 | /* this should probably not be here, but I'm using it to wrap the .t files */ | 367 | /* this should probably not be here, but I'm using it to wrap the .t files */ |
270 | if(project->first("TEMPLATE") == "app") | 368 | if(project->first("TEMPLATE") == "app") |
271 | project->variables()["QMAKE_APP_FLAG"].append("1"); | 369 | project->variables()["QMAKE_APP_FLAG"].append("1"); |
272 | else if(project->first("TEMPLATE") == "lib") | 370 | else if(project->first("TEMPLATE") == "lib") |
273 | project->variables()["QMAKE_LIB_FLAG"].append("1"); | 371 | project->variables()["QMAKE_LIB_FLAG"].append("1"); |
274 | else if(project->first("TEMPLATE") == "subdirs") { | 372 | else if(project->first("TEMPLATE") == "subdirs") { |
275 | MakefileGenerator::init(); | 373 | MakefileGenerator::init(); |
276 | if(project->variables()["MAKEFILE"].isEmpty()) | 374 | if(project->variables()["MAKEFILE"].isEmpty()) |
277 | project->variables()["MAKEFILE"].append("Makefile"); | 375 | project->variables()["MAKEFILE"].append("Makefile"); |
278 | if(project->variables()["QMAKE"].isEmpty()) | 376 | if(project->variables()["QMAKE"].isEmpty()) |
279 | project->variables()["QMAKE"].append("qmake"); | 377 | project->variables()["QMAKE"].append("qmake"); |
280 | return; | 378 | return; |
281 | } | 379 | } |
282 | 380 | ||
381 | if(project->isEmpty("QMAKE_INSTALL_FILE")) | ||
382 | project->variables()["QMAKE_INSTALL_FILE"].append("$(COPY_FILE)"); | ||
383 | if(project->isEmpty("QMAKE_INSTALL_DIR")) | ||
384 | project->variables()["QMAKE_INSTALL_DIR"].append("$(COPY_DIR)"); | ||
385 | |||
283 | bool is_qt = (project->first("TARGET") == "qt"QTDLL_POSTFIX || project->first("TARGET") == "qtmt"QTDLL_POSTFIX); | 386 | bool is_qt = (project->first("TARGET") == "qt"QTDLL_POSTFIX || project->first("TARGET") == "qtmt"QTDLL_POSTFIX); |
284 | QStringList &configs = project->variables()["CONFIG"]; | 387 | QStringList &configs = project->variables()["CONFIG"]; |
285 | if (project->isActiveConfig("shared")) | 388 | if (project->isActiveConfig("shared")) |
286 | project->variables()["DEFINES"].append("QT_DLL"); | 389 | project->variables()["DEFINES"].append("QT_DLL"); |
287 | if (project->isActiveConfig("qt_dll")) | 390 | if (project->isActiveConfig("qt_dll")) |
288 | if(configs.findIndex("qt") == -1) configs.append("qt"); | 391 | if(configs.findIndex("qt") == -1) configs.append("qt"); |
392 | if ( project->isActiveConfig("qtopia") ) { | ||
393 | if(configs.findIndex("qtopialib") == -1) | ||
394 | configs.append("qtopialib"); | ||
395 | if(configs.findIndex("qtopiainc") == -1) | ||
396 | configs.append("qtopiainc"); | ||
397 | } | ||
289 | if ( project->isActiveConfig("qt") ) { | 398 | if ( project->isActiveConfig("qt") ) { |
290 | if ( project->isActiveConfig("plugin") ) { | 399 | if ( project->isActiveConfig("plugin") ) { |
291 | project->variables()["CONFIG"].append("dll"); | 400 | project->variables()["CONFIG"].append("dll"); |
292 | project->variables()["DEFINES"].append("QT_PLUGIN"); | 401 | project->variables()["DEFINES"].append("QT_PLUGIN"); |
293 | } | 402 | } |
294 | if ( (project->variables()["DEFINES"].findIndex("QT_NODLL") == -1) && | 403 | if ( (project->variables()["DEFINES"].findIndex("QT_NODLL") == -1) && |
295 | ((project->variables()["DEFINES"].findIndex("QT_MAKEDLL") != -1 || | 404 | ((project->variables()["DEFINES"].findIndex("QT_MAKEDLL") != -1 || |
296 | project->variables()["DEFINES"].findIndex("QT_DLL") != -1) || | 405 | project->variables()["DEFINES"].findIndex("QT_DLL") != -1) || |
@@ -309,30 +418,30 @@ BorlandMakefileGenerator::init() | |||
309 | if ( project->isActiveConfig("warn_off") ) { | 418 | if ( project->isActiveConfig("warn_off") ) { |
310 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_WARN_OFF"]; | 419 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_WARN_OFF"]; |
311 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_WARN_OFF"]; | 420 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_WARN_OFF"]; |
312 | } else if ( project->isActiveConfig("warn_on") ) { | 421 | } else if ( project->isActiveConfig("warn_on") ) { |
313 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_WARN_ON"]; | 422 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_WARN_ON"]; |
314 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_WARN_ON"]; | 423 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_WARN_ON"]; |
315 | } | 424 | } |
316 | if(project->isActiveConfig("qt")) { | 425 | if(project->isActiveConfig("qt")) { |
317 | if ( project->isActiveConfig("thread") ) | 426 | if ( project->isActiveConfig("thread") ) |
318 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_THREAD_SUPPORT"); | 427 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_THREAD_SUPPORT"); |
319 | if ( project->isActiveConfig("accessibility" ) ) | 428 | if ( project->isActiveConfig("accessibility" ) ) |
320 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_ACCESSIBILITY_SUPPORT"); | 429 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_ACCESSIBILITY_SUPPORT"); |
321 | if ( project->isActiveConfig("tablet") ) | 430 | if ( project->isActiveConfig("tablet") ) |
322 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_TABLET_SUPPORT"); | 431 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_TABLET_SUPPORT"); |
323 | } | 432 | } |
324 | 433 | ||
325 | if ( project->isActiveConfig("debug") ) { | 434 | if ( project->isActiveConfig("debug") ) { |
326 | if ( project->isActiveConfig("thread") ) { | 435 | if ( project->isActiveConfig("thread") ) { |
327 | if ( project->isActiveConfig("dll") ) { | 436 | if ( project->isActiveConfig("dll") ) { |
328 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT_DLLDBG"]; | 437 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT_DLLDBG"]; |
329 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT_DLLDBG"]; | 438 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT_DLLDBG"]; |
330 | } else { | 439 | } else { |
331 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT_DBG"]; | 440 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT_DBG"]; |
332 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT_DBG"]; | 441 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT_DBG"]; |
333 | } | 442 | } |
334 | } | 443 | } |
335 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_DEBUG"]; | 444 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_DEBUG"]; |
336 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_DEBUG"]; | 445 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_DEBUG"]; |
337 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_DEBUG"]; | 446 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_DEBUG"]; |
338 | } else { | 447 | } else { |
@@ -351,21 +460,28 @@ BorlandMakefileGenerator::init() | |||
351 | } | 460 | } |
352 | 461 | ||
353 | if ( !project->variables()["QMAKE_INCDIR"].isEmpty()) { | 462 | if ( !project->variables()["QMAKE_INCDIR"].isEmpty()) { |
354 | project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR"]; | 463 | project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR"]; |
355 | } | 464 | } |
356 | if ( project->isActiveConfig("qt") || project->isActiveConfig("opengl") ) { | 465 | if ( project->isActiveConfig("qt") || project->isActiveConfig("opengl") ) { |
357 | project->variables()["CONFIG"].append("windows"); | 466 | project->variables()["CONFIG"].append("windows"); |
358 | } | 467 | } |
468 | if ( project->isActiveConfig("qtopiainc") ) | ||
469 | project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_QTOPIA"]; | ||
470 | if ( project->isActiveConfig("qtopialib") ) { | ||
471 | if(!project->isEmpty("QMAKE_LIBDIR_QTOPIA")) | ||
472 | project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QTOPIA"]; | ||
473 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QTOPIA"]; | ||
474 | } | ||
359 | if ( project->isActiveConfig("qt") ) { | 475 | if ( project->isActiveConfig("qt") ) { |
360 | project->variables()["CONFIG"].append("moc"); | 476 | project->variables()["CONFIG"].append("moc"); |
361 | project->variables()["INCLUDEPATH"] +=project->variables()["QMAKE_INCDIR_QT"]; | 477 | project->variables()["INCLUDEPATH"] +=project->variables()["QMAKE_INCDIR_QT"]; |
362 | project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QT"]; | 478 | project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QT"]; |
363 | if ( !project->isActiveConfig("debug") ) | 479 | if ( !project->isActiveConfig("debug") ) |
364 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_NO_DEBUG"); | 480 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_NO_DEBUG"); |
365 | if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) { | 481 | if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) { |
366 | if ( !project->variables()["QMAKE_QT_DLL"].isEmpty()) { | 482 | if ( !project->variables()["QMAKE_QT_DLL"].isEmpty()) { |
367 | project->variables()["DEFINES"].append("QT_MAKEDLL"); | 483 | project->variables()["DEFINES"].append("QT_MAKEDLL"); |
368 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_QT_DLL"]; | 484 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_QT_DLL"]; |
369 | } | 485 | } |
370 | } else { | 486 | } else { |
371 | if(project->isActiveConfig("thread")) | 487 | if(project->isActiveConfig("thread")) |
@@ -463,34 +579,50 @@ BorlandMakefileGenerator::init() | |||
463 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_RTMT"]; | 579 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_RTMT"]; |
464 | } else { | 580 | } else { |
465 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_RT"]; | 581 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_RT"]; |
466 | } | 582 | } |
467 | if ( project->isActiveConfig("moc") ) { | 583 | if ( project->isActiveConfig("moc") ) { |
468 | setMocAware(TRUE); | 584 | setMocAware(TRUE); |
469 | } | 585 | } |
470 | project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"]; | 586 | project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"]; |
587 | // Update -lname to name.lib, and -Ldir to | ||
588 | QStringList &libList = project->variables()["QMAKE_LIBS"]; | ||
589 | for( QStringList::Iterator stIt = libList.begin(); stIt != libList.end(); ) { | ||
590 | QString s = *stIt; | ||
591 | if( s.startsWith( "-l" ) ) { | ||
592 | stIt = libList.remove( stIt ); | ||
593 | stIt = libList.insert( stIt, s.mid( 2 ) + ".lib" ); | ||
594 | } else if( s.startsWith( "-L" ) ) { | ||
595 | stIt = libList.remove( stIt ); | ||
596 | project->variables()["QMAKE_LIBDIR"].append(QDir::convertSeparators(s.mid( 2 ))); | ||
597 | } else { | ||
598 | stIt++; | ||
599 | } | ||
600 | } | ||
471 | project->variables()["QMAKE_FILETAGS"] += QStringList::split(' ', | 601 | project->variables()["QMAKE_FILETAGS"] += QStringList::split(' ', |
472 | "HEADERS SOURCES DEF_FILE RC_FILE TARGET QMAKE_LIBS DESTDIR DLLDESTDIR INCLUDEPATH"); | 602 | "HEADERS SOURCES DEF_FILE RC_FILE TARGET QMAKE_LIBS DESTDIR DLLDESTDIR INCLUDEPATH"); |
473 | QStringList &l = project->variables()["QMAKE_FILETAGS"]; | 603 | QStringList &l = project->variables()["QMAKE_FILETAGS"]; |
474 | for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) { | 604 | QStringList::Iterator it; |
605 | for(it = l.begin(); it != l.end(); ++it) { | ||
475 | QStringList &gdmf = project->variables()[(*it)]; | 606 | QStringList &gdmf = project->variables()[(*it)]; |
476 | for(QStringList::Iterator inner = gdmf.begin(); inner != gdmf.end(); ++inner) | 607 | for(QStringList::Iterator inner = gdmf.begin(); inner != gdmf.end(); ++inner) |
477 | (*inner) = Option::fixPathToTargetOS((*inner), FALSE); | 608 | (*inner) = Option::fixPathToTargetOS((*inner), FALSE); |
478 | } | 609 | } |
479 | 610 | ||
480 | if ( !project->variables()["RC_FILE"].isEmpty()) { | 611 | if ( !project->variables()["RC_FILE"].isEmpty()) { |
481 | if ( !project->variables()["RES_FILE"].isEmpty()) { | 612 | if ( !project->variables()["RES_FILE"].isEmpty()) { |
482 | fprintf(stderr, "Both .rc and .res file specified.\n"); | 613 | fprintf(stderr, "Both .rc and .res file specified.\n"); |
483 | fprintf(stderr, "Please specify one of them, not both."); | 614 | fprintf(stderr, "Please specify one of them, not both."); |
484 | exit(666); | 615 | exit(666); |
485 | } | 616 | } |
486 | project->variables()["RES_FILE"] = project->variables()["RC_FILE"]; | 617 | project->variables()["RES_FILE"] = project->variables()["RC_FILE"]; |
487 | project->variables()["RES_FILE"].first().replace(".rc",".res"); | 618 | project->variables()["RES_FILE"].first().replace(".rc",".res"); |
488 | project->variables()["POST_TARGETDEPS"] += project->variables()["RES_FILE"]; | 619 | project->variables()["POST_TARGETDEPS"] += project->variables()["RES_FILE"]; |
620 | project->variables()["CLEAN_FILES"] += project->variables()["RES_FILE"]; | ||
489 | } | 621 | } |
490 | MakefileGenerator::init(); | 622 | MakefileGenerator::init(); |
491 | if ( !project->variables()["VERSION"].isEmpty()) { | 623 | if ( !project->variables()["VERSION"].isEmpty()) { |
492 | QStringList l = QStringList::split('.', project->first("VERSION")); | 624 | QStringList l = QStringList::split('.', project->first("VERSION")); |
493 | project->variables()["VER_MAJ"].append(l[0]); | 625 | project->variables()["VER_MAJ"].append(l[0]); |
494 | project->variables()["VER_MIN"].append(l[1]); | 626 | project->variables()["VER_MIN"].append(l[1]); |
495 | } | 627 | } |
496 | 628 | ||
@@ -501,9 +633,29 @@ BorlandMakefileGenerator::init() | |||
501 | tdsPostfix = QStringList::split( '.', project->first("VERSION") ).join("") | 633 | tdsPostfix = QStringList::split( '.', project->first("VERSION") ).join("") |
502 | + ".tds"; | 634 | + ".tds"; |
503 | } else { | 635 | } else { |
504 | tdsPostfix = ".tds"; | 636 | tdsPostfix = ".tds"; |
505 | } | 637 | } |
506 | project->variables()["QMAKE_CLEAN"].append( | 638 | project->variables()["QMAKE_CLEAN"].append( |
507 | project->first("DESTDIR") + project->first("TARGET") + tdsPostfix ); | 639 | project->first("DESTDIR") + project->first("TARGET") + tdsPostfix ); |
508 | } | 640 | } |
641 | |||
642 | QStringList &quc = project->variables()["QMAKE_EXTRA_WIN_COMPILERS"]; | ||
643 | for(it = quc.begin(); it != quc.end(); ++it) { | ||
644 | QString tmp_out = project->variables()[(*it) + ".output"].first(); | ||
645 | if(tmp_out.isEmpty()) | ||
646 | continue; | ||
647 | QStringList &tmp = project->variables()[(*it) + ".input"]; | ||
648 | for(QStringList::Iterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) { | ||
649 | QStringList &inputs = project->variables()[(*it2)]; | ||
650 | for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) { | ||
651 | QFileInfo fi(Option::fixPathToLocalOS((*input))); | ||
652 | QString in = Option::fixPathToTargetOS((*input), FALSE), | ||
653 | out = tmp_out; | ||
654 | out.replace("${QMAKE_FILE_BASE}", fi.baseName()); | ||
655 | out.replace("${QMAKE_FILE_NAME}", fi.fileName()); | ||
656 | if(project->variables()[(*it) + ".CONFIG"].findIndex("no_link") == -1) | ||
657 | project->variables()["OBJCOMP"] += out; | ||
658 | } | ||
659 | } | ||
660 | } | ||
509 | } | 661 | } |
diff --git a/qmake/generators/win32/borland_bmake.h b/qmake/generators/win32/borland_bmake.h index 5ffed58..700e7f7 100644 --- a/qmake/generators/win32/borland_bmake.h +++ b/qmake/generators/win32/borland_bmake.h | |||
@@ -1,18 +1,16 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** |
3 | ** | 3 | ** |
4 | ** Definition of ________ class. | 4 | ** Definition of BorlandMakefileGenerator class. |
5 | ** | 5 | ** |
6 | ** Created : 970521 | 6 | ** Copyright (C) 1992-2003 Trolltech AS. All rights reserved. |
7 | ** | 7 | ** |
8 | ** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. | 8 | ** This file is part of qmake. |
9 | ** | ||
10 | ** This file is part of the network module of the Qt GUI Toolkit. | ||
11 | ** | 9 | ** |
12 | ** This file may be distributed under the terms of the Q Public License | 10 | ** This file may be distributed under the terms of the Q Public License |
13 | ** as defined by Trolltech AS of Norway and appearing in the file | 11 | ** as defined by Trolltech AS of Norway and appearing in the file |
14 | ** LICENSE.QPL included in the packaging of this file. | 12 | ** LICENSE.QPL included in the packaging of this file. |
15 | ** | 13 | ** |
16 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This file may be distributed and/or modified under the terms of the |
17 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** GNU General Public License version 2 as published by the Free Software |
18 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** Foundation and appearing in the file LICENSE.GPL included in the |
@@ -29,16 +27,17 @@ | |||
29 | ** information about Qt Commercial License Agreements. | 27 | ** information about Qt Commercial License Agreements. |
30 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. | 28 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. |
31 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
32 | ** | 30 | ** |
33 | ** Contact info@trolltech.com if any conditions of this licensing are | 31 | ** Contact info@trolltech.com if any conditions of this licensing are |
34 | ** not clear to you. | 32 | ** not clear to you. |
35 | ** | 33 | ** |
36 | **********************************************************************/ | 34 | **********************************************************************/ |
35 | |||
37 | #ifndef __BORLAND_BMAKE_H__ | 36 | #ifndef __BORLAND_BMAKE_H__ |
38 | #define __BORLAND_BMAKE_H__ | 37 | #define __BORLAND_BMAKE_H__ |
39 | 38 | ||
40 | #include "winmakefile.h" | 39 | #include "winmakefile.h" |
41 | 40 | ||
42 | class BorlandMakefileGenerator : public Win32MakefileGenerator | 41 | class BorlandMakefileGenerator : public Win32MakefileGenerator |
43 | { | 42 | { |
44 | bool init_flag; | 43 | bool init_flag; |
diff --git a/qmake/generators/win32/mingw_make.cpp b/qmake/generators/win32/mingw_make.cpp index 7f58a55..c693d6a 100644 --- a/qmake/generators/win32/mingw_make.cpp +++ b/qmake/generators/win32/mingw_make.cpp | |||
@@ -1,524 +1,708 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** |
3 | ** | 3 | ** |
4 | ** Definition of ________ class. | 4 | ** Implementation of MingwMakefileGenerator class. |
5 | ** | 5 | ** |
6 | ** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. | 6 | ** Copyright (C) 1992-2003 Trolltech AS. All rights reserved. |
7 | ** | 7 | ** |
8 | ** This file is part of the network module of the Qt GUI Toolkit. | 8 | ** This file is part of qmake. |
9 | ** | 9 | ** |
10 | ** This file may be distributed under the terms of the Q Public License | 10 | ** This file may be distributed under the terms of the Q Public License |
11 | ** as defined by Trolltech AS of Norway and appearing in the file | 11 | ** as defined by Trolltech AS of Norway and appearing in the file |
12 | ** LICENSE.QPL included in the packaging of this file. | 12 | ** LICENSE.QPL included in the packaging of this file. |
13 | ** | 13 | ** |
14 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This file may be distributed and/or modified under the terms of the |
15 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** GNU General Public License version 2 as published by the Free Software |
16 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** Foundation and appearing in the file LICENSE.GPL included in the |
17 | ** packaging of this file. | 17 | ** packaging of this file. |
18 | ** | 18 | ** |
19 | ** Licensees holding valid Qt Enterprise Edition licenses may use this | 19 | ** Licensees holding valid Qt Enterprise Edition licenses may use this |
20 | ** file in accordance with the Qt Commercial License Agreement provided | 20 | ** file in accordance with the Qt Commercial License Agreement provided |
21 | ** with the Software. | 21 | ** with the Software. |
22 | ** | 22 | ** |
23 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 23 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
24 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 24 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
25 | ** | 25 | ** |
26 | ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for | 26 | ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for |
27 | ** information about Qt Commercial License Agreements. | 27 | ** information about Qt Commercial License Agreements. |
28 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. | 28 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. |
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
30 | ** | 30 | ** |
31 | ** Contact info@trolltech.com if any conditions of this licensing are | 31 | ** Contact info@trolltech.com if any conditions of this licensing are |
32 | ** not clear to you. | 32 | ** not clear to you. |
33 | ** | 33 | ** |
34 | **********************************************************************/ | 34 | **********************************************************************/ |
35 | 35 | ||
36 | #include "mingw_make.h" | 36 | #include "mingw_make.h" |
37 | #include "option.h" | 37 | #include "option.h" |
38 | #include <qregexp.h> | 38 | #include <qregexp.h> |
39 | #include <qdir.h> | 39 | #include <qdir.h> |
40 | #include <stdlib.h> | 40 | #include <stdlib.h> |
41 | #include <time.h> | 41 | #include <time.h> |
42 | 42 | ||
43 | 43 | ||
44 | MingwMakefileGenerator::MingwMakefileGenerator(QMakeProject *p) : Win32MakefileGenerator(p), init_flag(FALSE) | 44 | MingwMakefileGenerator::MingwMakefileGenerator(QMakeProject *p) : Win32MakefileGenerator(p), init_flag(FALSE) |
45 | { | 45 | { |
46 | Option::obj_ext = ".o"; | 46 | Option::obj_ext = ".o"; |
47 | } | 47 | } |
48 | 48 | ||
49 | bool | 49 | bool |
50 | MingwMakefileGenerator::writeMakefile(QTextStream &t) | 50 | MingwMakefileGenerator::findLibraries() // todo - pascal |
51 | { | 51 | { |
52 | writeHeader(t); | 52 | return TRUE; |
53 | if(!project->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) { | 53 | } |
54 | t << "all clean:" << "\n\t" | 54 | |
55 | << "@echo \"Some of the required modules (" | 55 | bool |
56 | << var("QMAKE_FAILED_REQUIREMENTS") << ") are not available.\"" << "\n\t" | 56 | MingwMakefileGenerator::writeMakefile(QTextStream &t) |
57 | << "@echo \"Skipped.\"" << endl << endl; | 57 | { |
58 | writeMakeQmake(t); | 58 | writeHeader(t); |
59 | return TRUE; | 59 | if(!project->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) { |
60 | } | 60 | t << "all clean:" << "\n\t" |
61 | 61 | << "@echo \"Some of the required modules (" | |
62 | if(project->first("TEMPLATE") == "app" || | 62 | << var("QMAKE_FAILED_REQUIREMENTS") << ") are not available.\"" << "\n\t" |
63 | project->first("TEMPLATE") == "lib") { | 63 | << "@echo \"Skipped.\"" << endl << endl; |
64 | writeMingwParts(t); | 64 | writeMakeQmake(t); |
65 | return MakefileGenerator::writeMakefile(t); | 65 | return TRUE; |
66 | } | 66 | } |
67 | else if(project->first("TEMPLATE") == "subdirs") { | 67 | |
68 | writeSubDirs(t); | 68 | if(project->first("TEMPLATE") == "app" || |
69 | return TRUE; | 69 | project->first("TEMPLATE") == "lib") { |
70 | } | 70 | writeMingwParts(t); |
71 | return FALSE; | 71 | return MakefileGenerator::writeMakefile(t); |
72 | } | 72 | } |
73 | 73 | else if(project->first("TEMPLATE") == "subdirs") { | |
74 | void | 74 | writeSubDirs(t); |
75 | MingwMakefileGenerator::writeMingwParts(QTextStream &t) | 75 | return TRUE; |
76 | { | 76 | } |
77 | t << "####### Compiler, tools and options" << endl << endl; | 77 | return FALSE; |
78 | t << "CC =" << var("QMAKE_CC") << endl; | 78 | } |
79 | t << "CXX =" << var("QMAKE_CXX") << endl; | 79 | |
80 | t << "LEX = " << var("QMAKE_LEX") << endl; | 80 | void createLdObjectScriptFile(const QString & fileName, QStringList & objList) |
81 | t << "YACC = " << var("QMAKE_YACC") << endl; | 81 | { |
82 | t << "CFLAGS =" << var("QMAKE_CFLAGS") << " " | 82 | QString filePath = Option::output_dir + QDir::separator() + fileName; |
83 | << varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " " | 83 | QFile file(filePath); |
84 | << varGlue("DEFINES","-D"," -D","") << endl; | 84 | if (file.open(IO_WriteOnly | IO_Translate )) { |
85 | t << "CXXFLAGS =" << var("QMAKE_CXXFLAGS") << " " | 85 | QTextStream t(&file); |
86 | << varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " " | 86 | t << "INPUT(" << endl; |
87 | << varGlue("DEFINES","-D"," -D","") << endl; | 87 | for (QStringList::Iterator it = objList.begin(); it != objList.end(); ++it ) { |
88 | t << "LEXFLAGS=" << var("QMAKE_LEXFLAGS") << endl; | 88 | t << *it << endl; |
89 | t << "YACCFLAGS=" << var("QMAKE_YACCFLAGS") << endl; | 89 | } |
90 | 90 | t << ");" << endl; | |
91 | t << "INCPATH ="; | 91 | file.close(); |
92 | QStringList &incs = project->variables()["INCLUDEPATH"]; | 92 | } |
93 | for(QStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) { | 93 | } |
94 | QString inc = (*incit); | 94 | |
95 | inc.replace(QRegExp("\\\\$"), "\\\\"); | 95 | void |
96 | inc.replace(QRegExp("\""), ""); | 96 | MingwMakefileGenerator::writeMingwParts(QTextStream &t) |
97 | t << " -I" << inc ; | 97 | { |
98 | } | 98 | t << "####### Compiler, tools and options" << endl << endl; |
99 | t << " -I" << specdir() | 99 | t << "CC =" << var("QMAKE_CC") << endl; |
100 | << endl; | 100 | t << "CXX =" << var("QMAKE_CXX") << endl; |
101 | if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) { | 101 | t << "LEX = " << var("QMAKE_LEX") << endl; |
102 | t << "LINK =" << var("QMAKE_LINK") << endl; | 102 | t << "YACC = " << var("QMAKE_YACC") << endl; |
103 | t << "LFLAGS ="; | 103 | t << "CFLAGS =" << var("QMAKE_CFLAGS") << " " |
104 | if ( !project->variables()["QMAKE_LIBDIR"].isEmpty() ) | 104 | << varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " " |
105 | t << varGlue("QMAKE_LIBDIR","-L",";","") << " "; | 105 | << varGlue("DEFINES","-D"," -D","") << endl; |
106 | t << var("QMAKE_LFLAGS") << endl; | 106 | t << "CXXFLAGS =" << var("QMAKE_CXXFLAGS") << " " |
107 | t << "LIBS =" << var("QMAKE_LIBS").replace(QRegExp("(\\slib|^lib)")," -l") << endl; | 107 | << varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " " |
108 | } | 108 | << varGlue("DEFINES","-D"," -D","") << endl; |
109 | else { | 109 | t << "LEXFLAGS=" << var("QMAKE_LEXFLAGS") << endl; |
110 | t << "LIB =" << var("QMAKE_LIB") << endl; | 110 | t << "YACCFLAGS=" << var("QMAKE_YACCFLAGS") << endl; |
111 | } | 111 | |
112 | t << "MOC =" << (project->isEmpty("QMAKE_MOC") ? QString("moc") : | 112 | t << "INCPATH ="; |
113 | Option::fixPathToTargetOS(var("QMAKE_MOC"), FALSE)) << endl; | 113 | QStringList &incs = project->variables()["INCLUDEPATH"]; |
114 | t << "UIC =" << (project->isEmpty("QMAKE_UIC") ? QString("uic") : | 114 | for(QStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) { |
115 | Option::fixPathToTargetOS(var("QMAKE_UIC"), FALSE)) << endl; | 115 | QString inc = (*incit); |
116 | t << "QMAKE =" << (project->isEmpty("QMAKE_QMAKE") ? QString("qmake") : | 116 | inc.replace(QRegExp("\\\\$"), "\\\\"); |
117 | Option::fixPathToTargetOS(var("QMAKE_QMAKE"), FALSE)) << endl; | 117 | inc.replace(QRegExp("\""), ""); |
118 | t << "IDC =" << (project->isEmpty("QMAKE_IDC") ? QString("idc") : | 118 | t << " -I" << "\"" << inc << "\""; |
119 | Option::fixPathToTargetOS(var("QMAKE_IDC"), FALSE)) << endl; | 119 | } |
120 | t << "IDL =" << (project->isEmpty("QMAKE_IDL") ? QString("midl") : | 120 | t << " -I" << "\"" << specdir() << "\"" << endl; |
121 | Option::fixPathToTargetOS(var("QMAKE_IDL"), FALSE)) << endl; | 121 | if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) { |
122 | t << "ZIP =" << var("QMAKE_ZIP") << endl; | 122 | t << "LINK =" << var("QMAKE_LINK") << endl; |
123 | t << "DEF_FILE =" << varList("DEF_FILE") << endl; | 123 | t << "LFLAGS =" << var("QMAKE_LFLAGS") << endl; |
124 | t << "COPY_FILE= " << var("QMAKE_COPY") << endl; | 124 | t << "LIBS ="; |
125 | t << "COPY_DIR= " << var("QMAKE_COPY") << endl; | 125 | if ( !project->variables()["QMAKE_LIBDIR"].isEmpty() ) |
126 | t << "DEL_FILE= " << var("QMAKE_DEL_FILE") << endl; | 126 | t << varGlue("QMAKE_LIBDIR","-L\"","\" -L\"","\"") << " "; |
127 | t << "DEL_DIR= " << var("QMAKE_DEL_DIR") << endl; | 127 | t << var("QMAKE_LIBS").replace(QRegExp("(\\slib|^lib)")," -l") << endl; |
128 | t << "MOVE = " << var("QMAKE_MOVE") << endl; | 128 | } |
129 | t << "CHK_DIR_EXISTS =" << var("QMAKE_CHK_DIR_EXISTS") << endl; | 129 | else { |
130 | t << "MKDIR =" << var("QMAKE_MKDIR") << endl; | 130 | t << "LIB =" << var("QMAKE_LIB") << endl; |
131 | t << endl; | 131 | } |
132 | 132 | t << "MOC =" << (project->isEmpty("QMAKE_MOC") ? QString("moc") : | |
133 | t << "####### Output directory" << endl << endl; | 133 | Option::fixPathToTargetOS(var("QMAKE_MOC"), FALSE)) << endl; |
134 | if (! project->variables()["OBJECTS_DIR"].isEmpty()) | 134 | t << "UIC =" << (project->isEmpty("QMAKE_UIC") ? QString("uic") : |
135 | t << "OBJECTS_DIR = " << var("OBJECTS_DIR").replace(QRegExp("\\\\$"),"") << endl; | 135 | Option::fixPathToTargetOS(var("QMAKE_UIC"), FALSE)) << endl; |
136 | else | 136 | t << "QMAKE =" << (project->isEmpty("QMAKE_QMAKE") ? QString("qmake") : |
137 | t << "OBJECTS_DIR = . " << endl; | 137 | Option::fixPathToTargetOS(var("QMAKE_QMAKE"), FALSE)) << endl; |
138 | if (! project->variables()["MOC_DIR"].isEmpty()) | 138 | t << "IDC =" << (project->isEmpty("QMAKE_IDC") ? QString("idc") : |
139 | t << "MOC_DIR = " << var("MOC_DIR").replace(QRegExp("\\\\$"),"") << endl; | 139 | Option::fixPathToTargetOS(var("QMAKE_IDC"), FALSE)) << endl; |
140 | else | 140 | t << "IDL =" << (project->isEmpty("QMAKE_IDL") ? QString("midl") : |
141 | t << "MOC_DIR = . " << endl; | 141 | Option::fixPathToTargetOS(var("QMAKE_IDL"), FALSE)) << endl; |
142 | t << endl; | 142 | t << "ZIP =" << var("QMAKE_ZIP") << endl; |
143 | 143 | t << "DEF_FILE =" << varList("DEF_FILE") << endl; | |
144 | t << "####### Files" << endl << endl; | 144 | t << "COPY_FILE= " << var("QMAKE_COPY") << endl; |
145 | t << "HEADERS =" << varList("HEADERS") << endl; | 145 | t << "COPY_DIR= " << var("QMAKE_COPY") << endl; |
146 | t << "SOURCES =" << varList("SOURCES") << endl; | 146 | t << "DEL_FILE= " << var("QMAKE_DEL_FILE") << endl; |
147 | // t << "OBJECTS =" << varList("OBJECTS").replace(QRegExp("\\.obj"),".o") << endl; | 147 | t << "DEL_DIR= " << var("QMAKE_DEL_DIR") << endl; |
148 | t << "OBJECTS =" << varList("OBJECTS") << endl; | 148 | t << "MOVE = " << var("QMAKE_MOVE") << endl; |
149 | t << "FORMS =" << varList("FORMS") << endl; | 149 | t << "CHK_DIR_EXISTS =" << var("QMAKE_CHK_DIR_EXISTS") << endl; |
150 | t << "UICDECLS =" << varList("UICDECLS") << endl; | 150 | t << "MKDIR =" << var("QMAKE_MKDIR") << endl; |
151 | t << "UICIMPLS =" << varList("UICIMPLS") << endl; | 151 | t << "INSTALL_FILE= " << var("QMAKE_INSTALL_FILE") << endl; |
152 | t << "SRCMOC =" << varList("SRCMOC") << endl; | 152 | t << "INSTALL_DIR = " << var("QMAKE_INSTALL_DIR") << endl; |
153 | t << "OBJMOC =" << varList("OBJMOC") << endl; | 153 | t << endl; |
154 | // t << "OBJMOC =" << varList("OBJMOC").replace(QRegExp("\\.obj"),".o") << endl; | 154 | |
155 | t << "DIST =" << varList("DISTFILES") << endl; | 155 | t << "####### Output directory" << endl << endl; |
156 | t << "TARGET ="; | 156 | if (! project->variables()["OBJECTS_DIR"].isEmpty()) |
157 | if( !project->variables()[ "DESTDIR" ].isEmpty() ) | 157 | t << "OBJECTS_DIR = " << var("OBJECTS_DIR").replace(QRegExp("\\\\$"),"") << endl; |
158 | t << varGlue("TARGET",project->first("DESTDIR"),"",project->first("TARGET_EXT")); | 158 | else |
159 | else | 159 | t << "OBJECTS_DIR = . " << endl; |
160 | t << project->variables()[ "TARGET" ].first() << project->variables()[ "TARGET_EXT" ].first(); | 160 | if (! project->variables()["MOC_DIR"].isEmpty()) |
161 | t << endl; | 161 | t << "MOC_DIR = " << var("MOC_DIR").replace(QRegExp("\\\\$"),"") << endl; |
162 | t << endl; | 162 | else |
163 | 163 | t << "MOC_DIR = . " << endl; | |
164 | t << "####### Implicit rules" << endl << endl; | 164 | t << endl; |
165 | t << ".SUFFIXES: .cpp .cxx .cc .C .c" << endl << endl; | 165 | |
166 | t << ".cpp.o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl; | 166 | t << "####### Files" << endl << endl; |
167 | t << ".cxx.o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl; | 167 | t << "HEADERS =" << varList("HEADERS") << endl; |
168 | t << ".cc.o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl; | 168 | t << "SOURCES =" << varList("SOURCES") << endl; |
169 | t << ".C.o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl; | 169 | QString objectsLinkLine; |
170 | t << ".c.o:\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl; | 170 | if (!project->variables()["QMAKE_APP_OR_DLL"].isEmpty() && |
171 | 171 | project->variables()["OBJECTS"].count() > var("QMAKE_LINK_OBJECT_MAX").toUInt()) { | |
172 | t << "####### Build rules" << endl << endl; | 172 | createLdObjectScriptFile(var("QMAKE_LINK_OBJECT_SCRIPT"), project->variables()["OBJECTS"]); |
173 | t << "all: " << "$(OBJECTS_DIR) " << "$(MOC_DIR) " << varGlue("ALL_DEPS",""," "," ") << "$(TARGET)" << endl << endl; | 173 | objectsLinkLine = var("QMAKE_LINK_OBJECT_SCRIPT"); |
174 | t << "$(TARGET): " << var("PRE_TARGETDEPS") << " $(UICDECLS) $(OBJECTS) $(OBJMOC) " | 174 | } else { |
175 | << var("POST_TARGETDEPS"); | 175 | objectsLinkLine = "$(OBJECTS)"; |
176 | if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) { | 176 | } |
177 | t << "\n\t" << "$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)"; | 177 | t << "OBJECTS =" << varList("OBJECTS") << endl; |
178 | } else { | 178 | t << "FORMS =" << varList("FORMS") << endl; |
179 | t << "\n\t" << "$(LIB) $(TARGET) $(OBJECTS) $(OBJMOC)"; | 179 | t << "UICDECLS =" << varList("UICDECLS") << endl; |
180 | } | 180 | t << "UICIMPLS =" << varList("UICIMPLS") << endl; |
181 | 181 | t << "SRCMOC =" << varList("SRCMOC") << endl; | |
182 | if(project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty()) { | 182 | QString objmocLinkLine; |
183 | QStringList dlldirs = project->variables()["DLLDESTDIR"]; | 183 | if (!project->variables()["QMAKE_APP_OR_DLL"].isEmpty() && |
184 | for ( QStringList::Iterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) { | 184 | project->variables()["OBJMOC"].count() > var("QMAKE_LINK_OBJECT_MAX").toUInt()) { |
185 | t << "\n\t" << "copy $(TARGET) " << *dlldir; | 185 | createLdObjectScriptFile(var("QMAKE_LINK_OBJMOC_SCRIPT"), project->variables()["OBJMOC"]); |
186 | } | 186 | objmocLinkLine = var("QMAKE_LINK_OBJMOC_SCRIPT"); |
187 | } | 187 | } else { |
188 | QString targetfilename = project->variables()["TARGET"].first(); | 188 | objmocLinkLine = "$(OBJMOC)"; |
189 | if(project->isActiveConfig("activeqt")) { | 189 | } |
190 | QString version = project->variables()["VERSION"].first(); | 190 | t << "OBJMOC =" << varList("OBJMOC") << endl; |
191 | if ( version.isEmpty() ) | 191 | QString extraCompilerDeps; |
192 | version = "1.0"; | 192 | if(!project->isEmpty("QMAKE_EXTRA_WIN_COMPILERS")) { |
193 | 193 | t << "OBJCOMP = " << varList("OBJCOMP") << endl; | |
194 | if ( project->isActiveConfig("dll")) { | 194 | extraCompilerDeps += " $(OBJCOMP) "; |
195 | t << "\n\t" << ("-$(IDC) $(TARGET) /idl tmp\\" + targetfilename + ".idl -version " + version); | 195 | |
196 | t << "\n\t" << ("-$(IDL) tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl"); | 196 | QStringList &comps = project->variables()["QMAKE_EXTRA_WIN_COMPILERS"]; |
197 | t << "\n\t" << ("-$(IDC) $(TARGET) /tlb tmp\\" + targetfilename + ".tlb"); | 197 | for(QStringList::Iterator compit = comps.begin(); compit != comps.end(); ++compit) { |
198 | t << "\n\t" << ("-$(IDC) $(TARGET) /regserver" ); | 198 | QStringList &vars = project->variables()[(*compit) + ".variables"]; |
199 | } else { | 199 | for(QStringList::Iterator varit = vars.begin(); varit != vars.end(); ++varit) { |
200 | t << "\n\t" << ("-$(TARGET) -dumpidl tmp\\" + targetfilename + ".idl -version " + version); | 200 | QStringList vals = project->variables()[(*varit)]; |
201 | t << "\n\t" << ("-$(IDL) tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl"); | 201 | if(!vals.isEmpty()) |
202 | t << "\n\t" << ("-$(IDC) $(TARGET) /tlb tmp\\" + targetfilename + ".tlb"); | 202 | t << "QMAKE_COMP_" << (*varit) << " = " << valList(vals) << endl; |
203 | t << "\n\t" << "-$(TARGET) -regserver"; | 203 | } |
204 | } | 204 | } |
205 | } | 205 | } |
206 | t << endl << endl; | 206 | |
207 | 207 | t << "DIST =" << varList("DISTFILES") << endl; | |
208 | if(!project->variables()["RC_FILE"].isEmpty()) { | 208 | t << "TARGET ="; |
209 | t << var("RES_FILE") << ": " << var("RC_FILE") << "\n\t" | 209 | if( !project->variables()[ "DESTDIR" ].isEmpty() ) |
210 | << var("QMAKE_RC") << " -i " << var("RC_FILE") << " -o " << var("RC_FILE").replace(QRegExp("\\.rc"),".o") << endl << endl; | 210 | t << varGlue("TARGET",project->first("DESTDIR"),"",project->first("TARGET_EXT")); |
211 | } | 211 | else |
212 | project->variables()["RES_FILE"].first().replace(QRegExp("\\.rc"),".o"); | 212 | t << project->variables()[ "TARGET" ].first() << project->variables()[ "TARGET_EXT" ].first(); |
213 | 213 | t << endl; | |
214 | t << "mocables: $(SRCMOC)" << endl << endl; | 214 | t << endl; |
215 | 215 | ||
216 | t << "$(OBJECTS_DIR):" << "\n\t" | 216 | t << "####### Implicit rules" << endl << endl; |
217 | << "@if not exist $(OBJECTS_DIR) mkdir $(OBJECTS_DIR)" << endl << endl; | 217 | t << ".SUFFIXES: .cpp .cxx .cc .C .c" << endl << endl; |
218 | 218 | t << ".cpp.o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl; | |
219 | t << "$(MOC_DIR):" << "\n\t" | 219 | t << ".cxx.o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl; |
220 | << "@if not exist $(MOC_DIR) mkdir $(MOC_DIR)" << endl << endl; | 220 | t << ".cc.o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl; |
221 | 221 | t << ".C.o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl; | |
222 | writeMakeQmake(t); | 222 | t << ".c.o:\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl; |
223 | 223 | ||
224 | t << "dist:" << "\n\t" | 224 | t << "####### Build rules" << endl << endl; |
225 | << "$(ZIP) " << var("PROJECT") << ".zip " | 225 | t << "all: " << "$(OBJECTS_DIR) " << "$(MOC_DIR) " << varGlue("ALL_DEPS",""," "," ") << "$(TARGET)" << endl << endl; |
226 | << var("PROJECT") << ".pro $(SOURCES) $(HEADERS) $(DIST) $(FORMS)" << endl << endl; | 226 | t << "$(TARGET): " << var("PRE_TARGETDEPS") << " $(UICDECLS) $(OBJECTS) $(OBJMOC) " |
227 | 227 | << extraCompilerDeps << var("POST_TARGETDEPS"); | |
228 | t << "clean:" | 228 | if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) { |
229 | << varGlue("OBJECTS","\n\t-del ","\n\t-del ","").replace(QRegExp("\\.obj"),".o") | 229 | t << "\n\t" << "$(LINK) $(LFLAGS) -o $(TARGET) " << objectsLinkLine << " " << objmocLinkLine << " $(LIBS)"; |
230 | << varGlue("SRCMOC" ,"\n\t-del ","\n\t-del ","") | 230 | } else { |
231 | << varGlue("OBJMOC" ,"\n\t-del ","\n\t-del ","").replace(QRegExp("\\.obj"),".o") | 231 | t << "\n\t" << "$(LIB) $(TARGET) " << objectsLinkLine << " " << objmocLinkLine; |
232 | << varGlue("UICDECLS" ,"\n\t-del ","\n\t-del ","") | 232 | } |
233 | << varGlue("UICIMPLS" ,"\n\t-del ","\n\t-del ","") | 233 | t << extraCompilerDeps; |
234 | << "\n\t-del $(TARGET)" | 234 | if(project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty()) { |
235 | << varGlue("QMAKE_CLEAN","\n\t-del ","\n\t-del ","") | 235 | QStringList dlldirs = project->variables()["DLLDESTDIR"]; |
236 | << varGlue("CLEAN_FILES","\n\t-del ","\n\t-del ",""); | 236 | for ( QStringList::Iterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) { |
237 | if ( project->isActiveConfig("activeqt")) { | 237 | t << "\n\t" << "$(COPY_FILE) \"$(TARGET)\" " << *dlldir; |
238 | t << ("\n\t-del tmp\\" + targetfilename + ".*"); | 238 | } |
239 | t << "\n\t-del tmp\\dump.*"; | 239 | } |
240 | } | 240 | QString targetfilename = project->variables()["TARGET"].first(); |
241 | if(project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty()) | 241 | if(project->isActiveConfig("activeqt")) { |
242 | t << "\n\t-del " << var("DLLDESTDIR") << "\\" << project->variables()[ "TARGET" ].first() << project->variables()[ "TARGET_EXT" ].first(); | 242 | QString version = project->variables()["VERSION"].first(); |
243 | if(!project->isEmpty("IMAGES")) | 243 | if ( version.isEmpty() ) |
244 | t << varGlue("QMAKE_IMAGE_COLLECTION", "\n\t-del ", "\n\t-del ", ""); | 244 | version = "1.0"; |
245 | 245 | ||
246 | // blasted user defined targets | 246 | if ( project->isActiveConfig("dll")) { |
247 | QStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"]; | 247 | t << "\n\t" << ("-$(IDC) $(TARGET) /idl " + var("OBJECTS_DIR") + targetfilename + ".idl -version " + version); |
248 | for(QStringList::Iterator it = qut.begin(); it != qut.end(); ++it) { | 248 | t << "\n\t" << ("-$(IDL) /nologo " + var("OBJECTS_DIR") + targetfilename + ".idl /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
249 | QString targ = var((*it) + ".target"), | 249 | t << "\n\t" << ("-$(IDC) $(TARGET) /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
250 | cmd = var((*it) + ".commands"), deps; | 250 | t << "\n\t" << ("-$(IDC) $(TARGET) /regserver" ); |
251 | if(targ.isEmpty()) | 251 | } else { |
252 | targ = (*it); | 252 | t << "\n\t" << ("-$(TARGET) -dumpidl " + var("OBJECTS_DIR") + targetfilename + ".idl -version " + version); |
253 | QStringList &deplist = project->variables()[(*it) + ".depends"]; | 253 | t << "\n\t" << ("-$(IDL) /nologo " + var("OBJECTS_DIR") + targetfilename + ".idl /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
254 | for(QStringList::Iterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) { | 254 | t << "\n\t" << ("-$(IDC) $(TARGET) /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
255 | QString dep = var((*dep_it) + ".target"); | 255 | t << "\n\t" << "-$(TARGET) -regserver"; |
256 | if(dep.isEmpty()) | 256 | } |
257 | dep = (*dep_it); | 257 | } |
258 | deps += " " + dep; | 258 | t << endl << endl; |
259 | } | 259 | |
260 | t << "\n\n" << targ << ":" << deps << "\n\t" | 260 | if(!project->variables()["RC_FILE"].isEmpty()) { |
261 | << cmd; | 261 | t << var("RES_FILE") << ": " << var("RC_FILE") << "\n\t" |
262 | } | 262 | << var("QMAKE_RC") << " -i " << var("RC_FILE") << " -o " << var("RC_FILE").replace(QRegExp("\\.rc"),".o") << " --include-dir=" << QFileInfo(var("RC_FILE")).dirPath() << endl << endl; |
263 | 263 | } | |
264 | t << endl << endl; | 264 | project->variables()["RES_FILE"].first().replace(QRegExp("\\.rc"),".o"); |
265 | } | 265 | |
266 | 266 | t << "mocables: $(SRCMOC)" << endl << endl; | |
267 | 267 | ||
268 | void | 268 | t << "$(OBJECTS_DIR):" << "\n\t" |
269 | MingwMakefileGenerator::init() | 269 | << "@if not exist $(OBJECTS_DIR) $(MKDIR) $(OBJECTS_DIR)" << endl << endl; |
270 | { | 270 | |
271 | if(init_flag) | 271 | t << "$(MOC_DIR):" << "\n\t" |
272 | return; | 272 | << "@if not exist $(MOC_DIR) $(MKDIR) $(MOC_DIR)" << endl << endl; |
273 | init_flag = TRUE; | 273 | |
274 | 274 | writeMakeQmake(t); | |
275 | /* this should probably not be here, but I'm using it to wrap the .t files */ | 275 | |
276 | if(project->first("TEMPLATE") == "app") | 276 | t << "dist:" << "\n\t" |
277 | project->variables()["QMAKE_APP_FLAG"].append("1"); | 277 | << "$(ZIP) " << var("PROJECT") << ".zip " |
278 | else if(project->first("TEMPLATE") == "lib") | 278 | << var("PROJECT") << ".pro $(SOURCES) $(HEADERS) $(DIST) $(FORMS)" << endl << endl; |
279 | project->variables()["QMAKE_LIB_FLAG"].append("1"); | 279 | |
280 | else if(project->first("TEMPLATE") == "subdirs") { | 280 | t << "clean:" |
281 | MakefileGenerator::init(); | 281 | << varGlue("OBJECTS","\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","").replace(QRegExp("\\.obj"),".o") |
282 | if(project->variables()["MAKEFILE"].isEmpty()) | 282 | << varGlue("SRCMOC" ,"\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","") |
283 | project->variables()["MAKEFILE"].append("Makefile"); | 283 | << varGlue("OBJMOC" ,"\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","").replace(QRegExp("\\.obj"),".o") |
284 | if(project->variables()["QMAKE"].isEmpty()) | 284 | << varGlue("UICDECLS" ,"\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","") |
285 | project->variables()["QMAKE"].append("qmake"); | 285 | << varGlue("UICIMPLS" ,"\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","") |
286 | return; | 286 | << "\n\t-$(DEL_FILE) $(TARGET)" |
287 | } | 287 | << varGlue("QMAKE_CLEAN","\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","") |
288 | 288 | << varGlue("CLEAN_FILES","\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ",""); | |
289 | bool is_qt = (project->first("TARGET") == "qt"QTDLL_POSTFIX || project->first("TARGET") == "qt-mt"QTDLL_POSTFIX); | 289 | if ( project->isActiveConfig("activeqt")) { |
290 | project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"]; | 290 | t << ("\n\t-$(DEL_FILE) " + var("OBJECTS_DIR") + targetfilename + ".idl"); |
291 | 291 | t << ("\n\t-$(DEL_FILE) " + var("OBJECTS_DIR") + targetfilename + ".tlb"); | |
292 | // LIBS defined in Profile comes first for gcc | 292 | } |
293 | project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"]; | 293 | if(!project->isEmpty("IMAGES")) |
294 | 294 | t << varGlue("QMAKE_IMAGE_COLLECTION", "\n\t-$(DEL_FILE) ", "\n\t-$(DEL_FILE) ", ""); | |
295 | QString targetfilename = project->variables()["TARGET"].first(); | 295 | |
296 | QStringList &configs = project->variables()["CONFIG"]; | 296 | // user defined targets |
297 | if (project->isActiveConfig("qt") && project->isActiveConfig("shared")) | 297 | QStringList::Iterator it; |
298 | project->variables()["DEFINES"].append("QT_DLL"); | 298 | QStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"]; |
299 | if (project->isActiveConfig("qt_dll")) | 299 | |
300 | if(configs.findIndex("qt") == -1) configs.append("qt"); | 300 | for(it = qut.begin(); it != qut.end(); ++it) { |
301 | if ( project->isActiveConfig("qt") ) { | 301 | QString targ = var((*it) + ".target"), |
302 | if ( project->isActiveConfig( "plugin" ) ) { | 302 | cmd = var((*it) + ".commands"), deps; |
303 | project->variables()["CONFIG"].append("dll"); | 303 | if(targ.isEmpty()) |
304 | if(project->isActiveConfig("qt")) | 304 | targ = (*it); |
305 | project->variables()["DEFINES"].append("QT_PLUGIN"); | 305 | QStringList &deplist = project->variables()[(*it) + ".depends"]; |
306 | } | 306 | for(QStringList::Iterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) { |
307 | if ( (project->variables()["DEFINES"].findIndex("QT_NODLL") == -1) && | 307 | QString dep = var((*dep_it) + ".target"); |
308 | ((project->variables()["DEFINES"].findIndex("QT_MAKEDLL") != -1 || | 308 | if(dep.isEmpty()) |
309 | project->variables()["DEFINES"].findIndex("QT_DLL") != -1) || | 309 | dep = (*dep_it); |
310 | (getenv("QT_DLL") && !getenv("QT_NODLL"))) ) { | 310 | deps += " " + dep; |
311 | project->variables()["QMAKE_QT_DLL"].append("1"); | 311 | } |
312 | if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) | 312 | t << "\n\n" << targ << ":" << deps << "\n\t" |
313 | project->variables()["CONFIG"].append("dll"); | 313 | << cmd; |
314 | } | 314 | } |
315 | if ( project->isActiveConfig("thread") ) | 315 | |
316 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_THREAD_SUPPORT"); | 316 | t << endl << endl; |
317 | if ( project->isActiveConfig("accessibility" ) ) | 317 | |
318 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_ACCESSIBILITY_SUPPORT"); | 318 | QStringList &quc = project->variables()["QMAKE_EXTRA_WIN_COMPILERS"]; |
319 | if ( project->isActiveConfig("tablet") ) | 319 | for(it = quc.begin(); it != quc.end(); ++it) { |
320 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_TABLET_SUPPORT"); | 320 | QString tmp_out = project->variables()[(*it) + ".output"].first(); |
321 | } | 321 | QString tmp_cmd = project->variables()[(*it) + ".commands"].join(" "); |
322 | if ( project->isActiveConfig("dll") || !project->variables()["QMAKE_APP_FLAG"].isEmpty() ) { | 322 | QString tmp_dep = project->variables()[(*it) + ".depends"].join(" "); |
323 | project->variables()["CONFIG"].remove("staticlib"); | 323 | QStringList &vars = project->variables()[(*it) + ".variables"]; |
324 | project->variables()["QMAKE_APP_OR_DLL"].append("1"); | 324 | if(tmp_out.isEmpty() || tmp_cmd.isEmpty()) |
325 | } else { | 325 | continue; |
326 | project->variables()["CONFIG"].append("staticlib"); | 326 | QStringList &tmp = project->variables()[(*it) + ".input"]; |
327 | } | 327 | for(QStringList::Iterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) { |
328 | if ( project->isActiveConfig("warn_off") ) { | 328 | QStringList &inputs = project->variables()[(*it2)]; |
329 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_WARN_OFF"]; | 329 | for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) { |
330 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_WARN_OFF"]; | 330 | QFileInfo fi(Option::fixPathToLocalOS((*input))); |
331 | } else if ( project->isActiveConfig("warn_on") ) { | 331 | QString in = Option::fixPathToTargetOS((*input), FALSE), |
332 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_WARN_ON"]; | 332 | out = tmp_out, cmd = tmp_cmd, deps; |
333 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_WARN_ON"]; | 333 | out.replace("${QMAKE_FILE_BASE}", fi.baseName()); |
334 | } | 334 | out.replace("${QMAKE_FILE_NAME}", fi.fileName()); |
335 | if ( project->isActiveConfig("debug") ) { | 335 | cmd.replace("${QMAKE_FILE_BASE}", fi.baseName()); |
336 | if ( project->isActiveConfig("thread") ) { | 336 | cmd.replace("${QMAKE_FILE_OUT}", out); |
337 | // use the DLL RT even here | 337 | cmd.replace("${QMAKE_FILE_NAME}", fi.fileName()); |
338 | if ( project->variables()["DEFINES"].contains("QT_DLL") ) { | 338 | for(QStringList::Iterator it3 = vars.begin(); it3 != vars.end(); ++it3) |
339 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT_DLLDBG"]; | 339 | cmd.replace("$(" + (*it3) + ")", "$(QMAKE_COMP_" + (*it3)+")"); |
340 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT_DLLDBG"]; | 340 | if(!tmp_dep.isEmpty()) { |
341 | } else { | 341 | char buff[256]; |
342 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT_DBG"]; | 342 | QString dep_cmd = tmp_dep; |
343 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT_DBG"]; | 343 | dep_cmd.replace("${QMAKE_FILE_NAME}", fi.fileName()); |
344 | } | 344 | if(FILE *proc = QT_POPEN(dep_cmd.latin1(), "r")) { |
345 | } | 345 | while(!feof(proc)) { |
346 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_DEBUG"]; | 346 | int read_in = int(fread(buff, 1, 255, proc)); |
347 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_DEBUG"]; | 347 | if(!read_in) |
348 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_DEBUG"]; | 348 | break; |
349 | } else { | 349 | int l = 0; |
350 | if ( project->isActiveConfig("thread") ) { | 350 | for(int i = 0; i < read_in; i++) { |
351 | if ( project->variables()["DEFINES"].contains("QT_DLL") ) { | 351 | if(buff[i] == '\n' || buff[i] == ' ') { |
352 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT_DLL"]; | 352 | deps += " " + QCString(buff+l, (i - l) + 1); |
353 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT_DLL"]; | 353 | l = i; |
354 | } else { | 354 | } |
355 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT"]; | 355 | } |
356 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT"]; | 356 | } |
357 | } | 357 | fclose(proc); |
358 | } | 358 | } |
359 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RELEASE"]; | 359 | } |
360 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RELEASE"]; | 360 | t << out << ": " << in << deps << "\n\t" |
361 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_RELEASE"]; | 361 | << cmd << endl << endl; |
362 | } | 362 | } |
363 | 363 | } | |
364 | if ( !project->variables()["QMAKE_INCDIR"].isEmpty()) | 364 | } |
365 | project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR"]; | 365 | t << endl; |
366 | if ( project->isActiveConfig("qt") || project->isActiveConfig("opengl") ) | 366 | } |
367 | project->variables()["CONFIG"].append("windows"); | 367 | |
368 | if ( project->isActiveConfig("qt") ) { | 368 | |
369 | project->variables()["CONFIG"].append("moc"); | 369 | void |
370 | project->variables()["INCLUDEPATH"] +=project->variables()["QMAKE_INCDIR_QT"]; | 370 | MingwMakefileGenerator::init() |
371 | project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QT"]; | 371 | { |
372 | if ( !project->isActiveConfig("debug") ) | 372 | if(init_flag) |
373 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_NO_DEBUG"); | 373 | return; |
374 | if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) { | 374 | init_flag = TRUE; |
375 | if ( !project->variables()["QMAKE_QT_DLL"].isEmpty()) { | 375 | |
376 | project->variables()["DEFINES"].append("QT_MAKEDLL"); | 376 | /* this should probably not be here, but I'm using it to wrap the .t files */ |
377 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_QT_DLL"]; | 377 | if(project->first("TEMPLATE") == "app") |
378 | } | 378 | project->variables()["QMAKE_APP_FLAG"].append("1"); |
379 | } else { | 379 | else if(project->first("TEMPLATE") == "lib") |
380 | if(project->isActiveConfig("thread")) | 380 | project->variables()["QMAKE_LIB_FLAG"].append("1"); |
381 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_THREAD"]; | 381 | else if(project->first("TEMPLATE") == "subdirs") { |
382 | else | 382 | MakefileGenerator::init(); |
383 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT"]; | 383 | if(project->variables()["MAKEFILE"].isEmpty()) |
384 | if ( !project->variables()["QMAKE_QT_DLL"].isEmpty() ) { | 384 | project->variables()["MAKEFILE"].append("Makefile"); |
385 | int hver = findHighestVersion(project->first("QMAKE_LIBDIR_QT"), "qt"); | 385 | if(project->variables()["QMAKE"].isEmpty()) |
386 | if ( hver == -1 ) | 386 | project->variables()["QMAKE"].append("qmake"); |
387 | hver = findHighestVersion(project->first("QMAKE_LIBDIR_QT"), "qt-mt"); | 387 | return; |
388 | if(hver != -1) { | 388 | } |
389 | QString ver; | 389 | |
390 | ver.sprintf("libqt-%s" QTDLL_POSTFIX "%d.a", (project->isActiveConfig("thread") ? "-mt" : ""), hver); | 390 | if(project->isEmpty("QMAKE_INSTALL_FILE")) |
391 | QStringList &libs = project->variables()["QMAKE_LIBS"]; | 391 | project->variables()["QMAKE_INSTALL_FILE"].append("$(COPY_FILE)"); |
392 | // @@@HGTODO maybe we must change the replace regexp if we understand what's going on | 392 | if(project->isEmpty("QMAKE_INSTALL_DIR")) |
393 | for(QStringList::Iterator libit = libs.begin(); libit != libs.end(); ++libit) | 393 | project->variables()["QMAKE_INSTALL_DIR"].append("$(COPY_DIR)"); |
394 | (*libit).replace(QRegExp("qt(-mt)?\\.lib"), ver); | 394 | |
395 | } | 395 | bool is_qt = (project->first("TARGET") == "qt"QTDLL_POSTFIX || project->first("TARGET") == "qt-mt"QTDLL_POSTFIX); |
396 | } | 396 | project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"]; |
397 | if ( project->isActiveConfig( "activeqt" ) ) { | 397 | |
398 | project->variables().remove("QMAKE_LIBS_QT_ENTRY"); | 398 | // LIBS defined in Profile comes first for gcc |
399 | project->variables()["QMAKE_LIBS_QT_ENTRY"] = "qaxserver.lib"; | 399 | project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"]; |
400 | if ( project->isActiveConfig( "dll" ) ) | 400 | |
401 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_ENTRY"]; | 401 | QString targetfilename = project->variables()["TARGET"].first(); |
402 | } | 402 | QStringList &configs = project->variables()["CONFIG"]; |
403 | if ( !project->isActiveConfig("dll") && !project->isActiveConfig("plugin") ) { | 403 | |
404 | project->variables()["QMAKE_LIBS"] +=project->variables()["QMAKE_LIBS_QT_ENTRY"]; | 404 | if (project->isActiveConfig("qt") && project->isActiveConfig("shared")) |
405 | } | 405 | project->variables()["DEFINES"].append("QT_DLL"); |
406 | } | 406 | |
407 | } | 407 | if (project->isActiveConfig("qt_dll")) |
408 | if ( project->isActiveConfig("opengl") ) { | 408 | if (configs.findIndex("qt") == -1) |
409 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_OPENGL"]; | 409 | configs.append("qt"); |
410 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_OPENGL"]; | 410 | |
411 | } | 411 | if ( project->isActiveConfig("qt") ) { |
412 | if ( project->isActiveConfig("dll") ) { | 412 | if ( project->isActiveConfig( "plugin" ) ) { |
413 | project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CFLAGS_CONSOLE_DLL"]; | 413 | project->variables()["CONFIG"].append("dll"); |
414 | project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CXXFLAGS_CONSOLE_DLL"]; | 414 | if(project->isActiveConfig("qt")) |
415 | project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_LFLAGS_CONSOLE_DLL"]; | 415 | project->variables()["DEFINES"].append("QT_PLUGIN"); |
416 | project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"] = project->variables()["QMAKE_LFLAGS_WINDOWS_DLL"]; | 416 | } |
417 | if ( !project->variables()["QMAKE_LIB_FLAG"].isEmpty()) { | 417 | if ( (project->variables()["DEFINES"].findIndex("QT_NODLL") == -1) && |
418 | project->variables()["TARGET_EXT"].append( | 418 | ((project->variables()["DEFINES"].findIndex("QT_MAKEDLL") != -1 || |
419 | QStringList::split('.',project->first("VERSION")).join("") + ".dll"); | 419 | project->variables()["DEFINES"].findIndex("QT_DLL") != -1) || |
420 | } else { | 420 | (getenv("QT_DLL") && !getenv("QT_NODLL"))) ) { |
421 | project->variables()["TARGET_EXT"].append(".dll"); | 421 | project->variables()["QMAKE_QT_DLL"].append("1"); |
422 | } | 422 | if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) |
423 | } else { | 423 | project->variables()["CONFIG"].append("dll"); |
424 | project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CFLAGS_CONSOLE"]; | 424 | } |
425 | project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CXXFLAGS_CONSOLE"]; | 425 | if ( project->isActiveConfig("thread") ) |
426 | project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_LFLAGS_CONSOLE"]; | 426 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_THREAD_SUPPORT"); |
427 | project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"] = project->variables()["QMAKE_LFLAGS_WINDOWS"]; | 427 | if ( project->isActiveConfig("accessibility" ) ) |
428 | if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty()) { | 428 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_ACCESSIBILITY_SUPPORT"); |
429 | project->variables()["TARGET_EXT"].append(".exe"); | 429 | if ( project->isActiveConfig("tablet") ) |
430 | } else { | 430 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_TABLET_SUPPORT"); |
431 | project->variables()["TARGET_EXT"].append(".a"); | 431 | } |
432 | project->variables()["QMAKE_LFLAGS"].append("-static"); | 432 | |
433 | if(project->variables()["TARGET"].first().left(3) != "lib") | 433 | if ( project->isActiveConfig("dll") || !project->variables()["QMAKE_APP_FLAG"].isEmpty() ) { |
434 | project->variables()["TARGET"].first().prepend("lib"); | 434 | project->variables()["CONFIG"].remove("staticlib"); |
435 | } | 435 | project->variables()["QMAKE_APP_OR_DLL"].append("1"); |
436 | } | 436 | } else { |
437 | if ( project->isActiveConfig("windows") ) { | 437 | project->variables()["CONFIG"].append("staticlib"); |
438 | if ( project->isActiveConfig("console") ) { | 438 | } |
439 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"]; | 439 | |
440 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"]; | 440 | if ( project->isActiveConfig("warn_off") ) { |
441 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"]; | 441 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_WARN_OFF"]; |
442 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"]; | 442 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_WARN_OFF"]; |
443 | } else { | 443 | } else if ( project->isActiveConfig("warn_on") ) { |
444 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"]; | 444 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_WARN_ON"]; |
445 | } | 445 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_WARN_ON"]; |
446 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_WINDOWS"]; | 446 | } |
447 | } else { | 447 | |
448 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"]; | 448 | if ( project->isActiveConfig("debug") ) { |
449 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"]; | 449 | if ( project->isActiveConfig("thread") ) { |
450 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"]; | 450 | // use the DLL RT even here |
451 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"]; | 451 | if ( project->variables()["DEFINES"].contains("QT_DLL") ) { |
452 | } | 452 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT_DLLDBG"]; |
453 | 453 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT_DLLDBG"]; | |
454 | if ( project->isActiveConfig("moc") ) | 454 | } else { |
455 | setMocAware(TRUE); | 455 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT_DBG"]; |
456 | project->variables()["QMAKE_FILETAGS"] += QStringList::split(' ', | 456 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT_DBG"]; |
457 | "HEADERS SOURCES DEF_FILE RC_FILE TARGET QMAKE_LIBS DESTDIR DLLDESTDIR INCLUDEPATH"); | 457 | } |
458 | QStringList &l = project->variables()["QMAKE_FILETAGS"]; | 458 | } |
459 | for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) { | 459 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_DEBUG"]; |
460 | QStringList &gdmf = project->variables()[(*it)]; | 460 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_DEBUG"]; |
461 | for(QStringList::Iterator inner = gdmf.begin(); inner != gdmf.end(); ++inner) | 461 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_DEBUG"]; |
462 | (*inner) = Option::fixPathToTargetOS((*inner), FALSE); | 462 | } else { |
463 | } | 463 | if ( project->isActiveConfig("thread") ) { |
464 | 464 | if ( project->variables()["DEFINES"].contains("QT_DLL") ) { | |
465 | if ( project->isActiveConfig("dll") ) | 465 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT_DLL"]; |
466 | project->variables()["QMAKE_LFLAGS"].append(QString("-Wl,--out-implib,") + project->first("DESTDIR") + "\\lib"+ project->first("TARGET") + ".a"); | 466 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT_DLL"]; |
467 | 467 | } else { | |
468 | if ( !project->variables()["DEF_FILE"].isEmpty() ) | 468 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT"]; |
469 | project->variables()["QMAKE_LFLAGS"].append(QString("-Wl,--output-def,") + project->first("DEF_FILE")); | 469 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT"]; |
470 | // if(!project->isActiveConfig("incremental")) | 470 | } |
471 | //project->variables()["QMAKE_LFLAGS"].append(QString("/incremental:no")); | 471 | } |
472 | 472 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RELEASE"]; | |
473 | #if 0 | 473 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RELEASE"]; |
474 | if ( !project->variables()["VERSION"].isEmpty() ) { | 474 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_RELEASE"]; |
475 | QString version = project->variables()["VERSION"][0]; | 475 | } |
476 | int firstDot = version.find( "." ); | 476 | |
477 | QString major = version.left( firstDot ); | 477 | if ( !project->variables()["QMAKE_INCDIR"].isEmpty()) |
478 | QString minor = version.right( version.length() - firstDot - 1 ); | 478 | project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR"]; |
479 | minor.replace( ".", "" ); | 479 | |
480 | project->variables()["QMAKE_LFLAGS"].append( "/VERSION:" + major + "." + minor ); | 480 | if ( project->isActiveConfig("qt") || project->isActiveConfig("opengl") ) |
481 | } | 481 | project->variables()["CONFIG"].append("windows"); |
482 | #endif | 482 | |
483 | if ( !project->variables()["RC_FILE"].isEmpty()) { | 483 | if ( project->isActiveConfig("qt") ) { |
484 | if ( !project->variables()["RES_FILE"].isEmpty()) { | 484 | project->variables()["CONFIG"].append("moc"); |
485 | fprintf(stderr, "Both .rc and .res file specified.\n"); | 485 | project->variables()["INCLUDEPATH"] +=project->variables()["QMAKE_INCDIR_QT"]; |
486 | fprintf(stderr, "Please specify one of them, not both."); | 486 | project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QT"]; |
487 | exit(666); | 487 | if ( !project->isActiveConfig("debug") ) |
488 | } | 488 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_NO_DEBUG"); |
489 | project->variables()["RES_FILE"] = project->variables()["RC_FILE"]; | 489 | if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) { |
490 | project->variables()["RES_FILE"].first().replace(".rc",".o"); | 490 | if ( !project->variables()["QMAKE_QT_DLL"].isEmpty()) { |
491 | project->variables()["POST_TARGETDEPS"] += project->variables()["RES_FILE"]; | 491 | project->variables()["DEFINES"].append("QT_MAKEDLL"); |
492 | } | 492 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_QT_DLL"]; |
493 | if ( !project->variables()["RES_FILE"].isEmpty()) | 493 | } |
494 | project->variables()["QMAKE_LIBS"] += project->variables()["RES_FILE"]; | 494 | } else { |
495 | 495 | ||
496 | MakefileGenerator::init(); | 496 | if(project->isActiveConfig("thread")) |
497 | if ( !project->variables()["VERSION"].isEmpty()) { | 497 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_THREAD"]; |
498 | QStringList l = QStringList::split('.', project->first("VERSION")); | 498 | else |
499 | project->variables()["VER_MAJ"].append(l[0]); | 499 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT"]; |
500 | project->variables()["VER_MIN"].append(l[1]); | 500 | if ( !project->variables()["QMAKE_QT_DLL"].isEmpty() ) { |
501 | } | 501 | int hver = findHighestVersion(project->first("QMAKE_LIBDIR_QT"), "qt"); |
502 | if(project->isActiveConfig("dll")) { | 502 | if ( hver == -1 ) |
503 | project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") +"lib" + project->first("TARGET") + ".a"); | 503 | hver = findHighestVersion(project->first("QMAKE_LIBDIR_QT"), "qt-mt"); |
504 | } | 504 | if(hver != -1) { |
505 | } | 505 | QString ver; |
506 | 506 | ver.sprintf("libqt-%s" QTDLL_POSTFIX "%d.a", (project->isActiveConfig("thread") ? "-mt" : ""), hver); | |
507 | void | 507 | QStringList &libs = project->variables()["QMAKE_LIBS"]; |
508 | MingwMakefileGenerator::writeSubDirs(QTextStream &t) | 508 | // @@@HGTODO maybe we must change the replace regexp if we understand what's going on |
509 | { | 509 | for(QStringList::Iterator libit = libs.begin(); libit != libs.end(); ++libit) |
510 | QString qs ; | 510 | (*libit).replace(QRegExp("qt(-mt)?\\.lib"), ver); |
511 | QTextStream ts (&qs, IO_WriteOnly) ; | 511 | } |
512 | Win32MakefileGenerator::writeSubDirs( ts ) ; | 512 | } |
513 | QRegExp rx("(\\n\\tcd [^\\n\\t]+)(\\n\\t.+)\\n\\t@cd ..") ; | 513 | if ( project->isActiveConfig( "activeqt" ) ) { |
514 | rx.setMinimal(true); | 514 | project->variables().remove("QMAKE_LIBS_QT_ENTRY"); |
515 | int pos = 0 ; | 515 | project->variables()["QMAKE_LIBS_QT_ENTRY"] = "-lqaxserver"; |
516 | while ( -1 != (pos = rx.search( qs, pos))) | 516 | if ( project->isActiveConfig( "dll" ) ) { |
517 | { | 517 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_ENTRY"]; |
518 | QString qsMatch = rx.cap(2); | 518 | } |
519 | qsMatch.replace("\n\t"," && \\\n\t"); | 519 | } |
520 | qs.replace(pos+rx.cap(1).length(), rx.cap(2).length(), qsMatch ); | 520 | if ( !project->isActiveConfig("dll") && !project->isActiveConfig("plugin") ) { |
521 | pos += (rx.cap(1).length()+qsMatch.length()); | 521 | project->variables()["QMAKE_LIBS"] +=project->variables()["QMAKE_LIBS_QT_ENTRY"]; |
522 | } | 522 | } |
523 | t << qs ; | 523 | |
524 | } | 524 | // QMAKE_LIBS_QT_ENTRY should be first on the link line as it needs qt |
525 | project->variables()["QMAKE_LIBS"].remove(project->variables()["QMAKE_LIBS_QT_ENTRY"].first()); | ||
526 | project->variables()["QMAKE_LIBS"].prepend(project->variables()["QMAKE_LIBS_QT_ENTRY"].first()); | ||
527 | |||
528 | } | ||
529 | } | ||
530 | |||
531 | if ( project->isActiveConfig("opengl") ) { | ||
532 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_OPENGL"]; | ||
533 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_OPENGL"]; | ||
534 | } | ||
535 | |||
536 | if ( project->isActiveConfig("dll") ) { | ||
537 | project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CFLAGS_CONSOLE_DLL"]; | ||
538 | project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CXXFLAGS_CONSOLE_DLL"]; | ||
539 | project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_LFLAGS_CONSOLE_DLL"]; | ||
540 | project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"] = project->variables()["QMAKE_LFLAGS_WINDOWS_DLL"]; | ||
541 | if ( !project->variables()["QMAKE_LIB_FLAG"].isEmpty()) { | ||
542 | project->variables()["TARGET_EXT"].append( | ||
543 | QStringList::split('.',project->first("VERSION")).join("") + ".dll"); | ||
544 | } else { | ||
545 | project->variables()["TARGET_EXT"].append(".dll"); | ||
546 | } | ||
547 | } else { | ||
548 | project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CFLAGS_CONSOLE"]; | ||
549 | project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CXXFLAGS_CONSOLE"]; | ||
550 | project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_LFLAGS_CONSOLE"]; | ||
551 | project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"] = project->variables()["QMAKE_LFLAGS_WINDOWS"]; | ||
552 | if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty()) { | ||
553 | project->variables()["TARGET_EXT"].append(".exe"); | ||
554 | } else { | ||
555 | project->variables()["TARGET_EXT"].append(".a"); | ||
556 | project->variables()["QMAKE_LFLAGS"].append("-static"); | ||
557 | if(project->variables()["TARGET"].first().left(3) != "lib") | ||
558 | project->variables()["TARGET"].first().prepend("lib"); | ||
559 | } | ||
560 | } | ||
561 | |||
562 | if ( project->isActiveConfig("windows") ) { | ||
563 | if ( project->isActiveConfig("console") ) { | ||
564 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"]; | ||
565 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"]; | ||
566 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"]; | ||
567 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"]; | ||
568 | } else { | ||
569 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"]; | ||
570 | } | ||
571 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_WINDOWS"]; | ||
572 | } else { | ||
573 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"]; | ||
574 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"]; | ||
575 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"]; | ||
576 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"]; | ||
577 | } | ||
578 | |||
579 | if ( project->isActiveConfig("exceptions") ) { | ||
580 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_EXCEPTIONS_ON"]; | ||
581 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_EXCEPTIONS_ON"]; | ||
582 | } else { | ||
583 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_EXCEPTIONS_OFF"]; | ||
584 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_EXCEPTIONS_OFF"]; | ||
585 | } | ||
586 | |||
587 | if ( project->isActiveConfig("rtti") ) { | ||
588 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_ON"]; | ||
589 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_ON"]; | ||
590 | } else { | ||
591 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_OFF"]; | ||
592 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_OFF"]; | ||
593 | } | ||
594 | |||
595 | if ( project->isActiveConfig("moc") ) | ||
596 | setMocAware(TRUE); | ||
597 | |||
598 | // add -L libs to libdir | ||
599 | QStringList &libs = project->variables()["QMAKE_LIBS"]; | ||
600 | for ( QStringList::Iterator libit = libs.begin(); libit != libs.end(); ) { | ||
601 | if ( (*libit).startsWith( "-L" ) ) { | ||
602 | project->variables()["QMAKE_LIBDIR"] += (*libit).mid(2); | ||
603 | libit = libs.remove( libit ); | ||
604 | } else { | ||
605 | ++libit; | ||
606 | } | ||
607 | } | ||
608 | |||
609 | project->variables()["QMAKE_FILETAGS"] += QStringList::split(' ', | ||
610 | "HEADERS SOURCES DEF_FILE RC_FILE TARGET QMAKE_LIBS DESTDIR DLLDESTDIR INCLUDEPATH"); | ||
611 | QStringList &l = project->variables()["QMAKE_FILETAGS"]; | ||
612 | QStringList::Iterator it; | ||
613 | for(it = l.begin(); it != l.end(); ++it) { | ||
614 | QStringList &gdmf = project->variables()[(*it)]; | ||
615 | for(QStringList::Iterator inner = gdmf.begin(); inner != gdmf.end(); ++inner) | ||
616 | (*inner) = Option::fixPathToTargetOS((*inner), FALSE); | ||
617 | } | ||
618 | |||
619 | if ( project->isActiveConfig("dll") ) { | ||
620 | QString destDir = ""; | ||
621 | if (!project->first("DESTDIR").isEmpty()) | ||
622 | destDir = project->first("DESTDIR") + Option::dir_sep; | ||
623 | project->variables()["QMAKE_LFLAGS"].append(QString("-Wl,--out-implib,") + | ||
624 | destDir + "lib" + project->first("TARGET") + ".a"); | ||
625 | } | ||
626 | |||
627 | if ( !project->variables()["DEF_FILE"].isEmpty() ) | ||
628 | project->variables()["QMAKE_LFLAGS"].append(QString("-Wl,") + project->first("DEF_FILE")); | ||
629 | // if(!project->isActiveConfig("incremental")) | ||
630 | //project->variables()["QMAKE_LFLAGS"].append(QString("/incremental:no")); | ||
631 | |||
632 | #if 0 | ||
633 | if ( !project->variables()["VERSION"].isEmpty() ) { | ||
634 | QString version = project->variables()["VERSION"][0]; | ||
635 | int firstDot = version.find( "." ); | ||
636 | QString major = version.left( firstDot ); | ||
637 | QString minor = version.right( version.length() - firstDot - 1 ); | ||
638 | minor.replace( ".", "" ); | ||
639 | project->variables()["QMAKE_LFLAGS"].append( "/VERSION:" + major + "." + minor ); | ||
640 | } | ||
641 | #endif | ||
642 | |||
643 | if ( !project->variables()["RC_FILE"].isEmpty()) { | ||
644 | if ( !project->variables()["RES_FILE"].isEmpty()) { | ||
645 | fprintf(stderr, "Both .rc and .res file specified.\n"); | ||
646 | fprintf(stderr, "Please specify one of them, not both."); | ||
647 | exit(666); | ||
648 | } | ||
649 | project->variables()["RES_FILE"] = project->variables()["RC_FILE"]; | ||
650 | project->variables()["RES_FILE"].first().replace(".rc",".o"); | ||
651 | project->variables()["POST_TARGETDEPS"] += project->variables()["RES_FILE"]; | ||
652 | project->variables()["CLEAN_FILES"] += project->variables()["RES_FILE"]; | ||
653 | } | ||
654 | |||
655 | if ( !project->variables()["RES_FILE"].isEmpty()) | ||
656 | project->variables()["QMAKE_LIBS"] += project->variables()["RES_FILE"]; | ||
657 | |||
658 | MakefileGenerator::init(); | ||
659 | |||
660 | if ( !project->variables()["VERSION"].isEmpty()) { | ||
661 | QStringList l = QStringList::split('.', project->first("VERSION")); | ||
662 | project->variables()["VER_MAJ"].append(l[0]); | ||
663 | project->variables()["VER_MIN"].append(l[1]); | ||
664 | } | ||
665 | |||
666 | if(project->isActiveConfig("dll")) { | ||
667 | project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") +"lib" + project->first("TARGET") + ".a"); | ||
668 | } | ||
669 | |||
670 | QStringList &quc = project->variables()["QMAKE_EXTRA_WIN_COMPILERS"]; | ||
671 | for(it = quc.begin(); it != quc.end(); ++it) { | ||
672 | QString tmp_out = project->variables()[(*it) + ".output"].first(); | ||
673 | if(tmp_out.isEmpty()) | ||
674 | continue; | ||
675 | QStringList &tmp = project->variables()[(*it) + ".input"]; | ||
676 | for(QStringList::Iterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) { | ||
677 | QStringList &inputs = project->variables()[(*it2)]; | ||
678 | for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) { | ||
679 | QFileInfo fi(Option::fixPathToLocalOS((*input))); | ||
680 | QString in = Option::fixPathToTargetOS((*input), FALSE), | ||
681 | out = tmp_out; | ||
682 | out.replace("${QMAKE_FILE_BASE}", fi.baseName()); | ||
683 | out.replace("${QMAKE_FILE_NAME}", fi.fileName()); | ||
684 | if(project->variables()[(*it) + ".CONFIG"].findIndex("no_link") == -1) | ||
685 | project->variables()["OBJCOMP"] += out; | ||
686 | } | ||
687 | } | ||
688 | } | ||
689 | } | ||
690 | |||
691 | void | ||
692 | MingwMakefileGenerator::writeSubDirs(QTextStream &t) | ||
693 | { | ||
694 | QString qs ; | ||
695 | QTextStream ts (&qs, IO_WriteOnly) ; | ||
696 | Win32MakefileGenerator::writeSubDirs( ts ) ; | ||
697 | QRegExp rx("(\\n\\tcd [^\\n\\t]+)(\\n\\t.+)\\n\\t@cd ..") ; | ||
698 | rx.setMinimal(TRUE); | ||
699 | int pos = 0 ; | ||
700 | while ( -1 != (pos = rx.search( qs, pos))) | ||
701 | { | ||
702 | QString qsMatch = rx.cap(2); | ||
703 | qsMatch.replace("\n\t"," && \\\n\t"); | ||
704 | qs.replace(pos+rx.cap(1).length(), rx.cap(2).length(), qsMatch ); | ||
705 | pos += (rx.cap(1).length()+qsMatch.length()); | ||
706 | } | ||
707 | t << qs ; | ||
708 | } | ||
diff --git a/qmake/generators/win32/mingw_make.h b/qmake/generators/win32/mingw_make.h index c00bf1b..d971e3a 100644 --- a/qmake/generators/win32/mingw_make.h +++ b/qmake/generators/win32/mingw_make.h | |||
@@ -1,58 +1,61 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** |
3 | ** | 3 | ** |
4 | ** Definition of ________ class. | 4 | ** Definition of MingwMakefileGenerator class. |
5 | ** | 5 | ** |
6 | ** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. | 6 | ** Copyright (C) 1992-2003 Trolltech AS. All rights reserved. |
7 | ** | 7 | ** |
8 | ** This file is part of the network module of the Qt GUI Toolkit. | 8 | ** This file is part of qmake. |
9 | ** | 9 | ** |
10 | ** This file may be distributed under the terms of the Q Public License | 10 | ** This file may be distributed under the terms of the Q Public License |
11 | ** as defined by Trolltech AS of Norway and appearing in the file | 11 | ** as defined by Trolltech AS of Norway and appearing in the file |
12 | ** LICENSE.QPL included in the packaging of this file. | 12 | ** LICENSE.QPL included in the packaging of this file. |
13 | ** | 13 | ** |
14 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This file may be distributed and/or modified under the terms of the |
15 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** GNU General Public License version 2 as published by the Free Software |
16 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** Foundation and appearing in the file LICENSE.GPL included in the |
17 | ** packaging of this file. | 17 | ** packaging of this file. |
18 | ** | 18 | ** |
19 | ** Licensees holding valid Qt Enterprise Edition licenses may use this | 19 | ** Licensees holding valid Qt Enterprise Edition licenses may use this |
20 | ** file in accordance with the Qt Commercial License Agreement provided | 20 | ** file in accordance with the Qt Commercial License Agreement provided |
21 | ** with the Software. | 21 | ** with the Software. |
22 | ** | 22 | ** |
23 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 23 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
24 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 24 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
25 | ** | 25 | ** |
26 | ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for | 26 | ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for |
27 | ** information about Qt Commercial License Agreements. | 27 | ** information about Qt Commercial License Agreements. |
28 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. | 28 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. |
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
30 | ** | 30 | ** |
31 | ** Contact info@trolltech.com if any conditions of this licensing are | 31 | ** Contact info@trolltech.com if any conditions of this licensing are |
32 | ** not clear to you. | 32 | ** not clear to you. |
33 | ** | 33 | ** |
34 | **********************************************************************/ | 34 | **********************************************************************/ |
35 | #ifndef __MINGW_MAKE_H__ | 35 | |
36 | #define __MINGW_MAKE_H__ | 36 | #ifndef __MINGW_MAKE_H__ |
37 | 37 | #define __MINGW_MAKE_H__ | |
38 | #include "winmakefile.h" | 38 | |
39 | 39 | #include "winmakefile.h" | |
40 | class MingwMakefileGenerator : public Win32MakefileGenerator | 40 | |
41 | { | 41 | class MingwMakefileGenerator : public Win32MakefileGenerator |
42 | bool init_flag; | 42 | { |
43 | void writeMingwParts(QTextStream &); | 43 | bool init_flag; |
44 | void writeSubDirs(QTextStream &t) ; | 44 | void writeMingwParts(QTextStream &); |
45 | 45 | void writeSubDirs(QTextStream &t) ; | |
46 | bool writeMakefile(QTextStream &); | 46 | |
47 | void init(); | 47 | bool writeMakefile(QTextStream &); |
48 | 48 | void init(); | |
49 | public: | 49 | |
50 | MingwMakefileGenerator(QMakeProject *p); | 50 | virtual bool findLibraries(); |
51 | ~MingwMakefileGenerator(); | 51 | |
52 | 52 | public: | |
53 | }; | 53 | MingwMakefileGenerator(QMakeProject *p); |
54 | 54 | ~MingwMakefileGenerator(); | |
55 | inline MingwMakefileGenerator::~MingwMakefileGenerator() | 55 | |
56 | { } | 56 | }; |
57 | 57 | ||
58 | #endif /* __MINGW_MAKE_H__ */ | 58 | inline MingwMakefileGenerator::~MingwMakefileGenerator() |
59 | { } | ||
60 | |||
61 | #endif /* __MINGW_MAKE_H__ */ | ||
diff --git a/qmake/generators/win32/msvc_dsp.cpp b/qmake/generators/win32/msvc_dsp.cpp index 3fa0496..d2abac6 100644 --- a/qmake/generators/win32/msvc_dsp.cpp +++ b/qmake/generators/win32/msvc_dsp.cpp | |||
@@ -1,18 +1,16 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** |
3 | ** | 3 | ** |
4 | ** Definition of ________ class. | 4 | ** Implementation of DspMakefileGenerator class. |
5 | ** | 5 | ** |
6 | ** Created : 970521 | 6 | ** Copyright (C) 1992-2003 Trolltech AS. All rights reserved. |
7 | ** | 7 | ** |
8 | ** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. | 8 | ** This file is part of qmake. |
9 | ** | ||
10 | ** This file is part of the network module of the Qt GUI Toolkit. | ||
11 | ** | 9 | ** |
12 | ** This file may be distributed under the terms of the Q Public License | 10 | ** This file may be distributed under the terms of the Q Public License |
13 | ** as defined by Trolltech AS of Norway and appearing in the file | 11 | ** as defined by Trolltech AS of Norway and appearing in the file |
14 | ** LICENSE.QPL included in the packaging of this file. | 12 | ** LICENSE.QPL included in the packaging of this file. |
15 | ** | 13 | ** |
16 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This file may be distributed and/or modified under the terms of the |
17 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** GNU General Public License version 2 as published by the Free Software |
18 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** Foundation and appearing in the file LICENSE.GPL included in the |
@@ -73,25 +71,51 @@ bool | |||
73 | DspMakefileGenerator::writeDspParts(QTextStream &t) | 71 | DspMakefileGenerator::writeDspParts(QTextStream &t) |
74 | { | 72 | { |
75 | QString dspfile; | 73 | QString dspfile; |
76 | if ( !project->variables()["DSP_TEMPLATE"].isEmpty() ) { | 74 | if ( !project->variables()["DSP_TEMPLATE"].isEmpty() ) { |
77 | dspfile = project->first("DSP_TEMPLATE"); | 75 | dspfile = project->first("DSP_TEMPLATE"); |
78 | } else { | 76 | } else { |
79 | dspfile = project->first("MSVCDSP_TEMPLATE"); | 77 | dspfile = project->first("MSVCDSP_TEMPLATE"); |
80 | } | 78 | } |
79 | if (dspfile.startsWith("\"") && dspfile.endsWith("\"")) | ||
80 | dspfile = dspfile.mid(1, dspfile.length() - 2); | ||
81 | QString dspfile_loc = findTemplate(dspfile); | 81 | QString dspfile_loc = findTemplate(dspfile); |
82 | 82 | ||
83 | QFile file(dspfile_loc); | 83 | QFile file(dspfile_loc); |
84 | if(!file.open(IO_ReadOnly)) { | 84 | if(!file.open(IO_ReadOnly)) { |
85 | fprintf(stderr, "Cannot open dsp file: %s\n", dspfile.latin1()); | 85 | fprintf(stderr, "Cannot open dsp file: %s\n", dspfile.latin1()); |
86 | return FALSE; | 86 | return FALSE; |
87 | } | 87 | } |
88 | QTextStream dsp(&file); | 88 | QTextStream dsp(&file); |
89 | 89 | ||
90 | QString platform = "Win32"; | ||
91 | if ( !project->variables()["QMAKE_PLATFORM"].isEmpty() ) | ||
92 | platform = varGlue("QMAKE_PLATFORM", "", " ", ""); | ||
93 | |||
94 | // Setup PCH variables | ||
95 | precompH = project->first("PRECOMPILED_HEADER"); | ||
96 | QString namePCH = QFileInfo(precompH).fileName(); | ||
97 | usePCH = !precompH.isEmpty() && project->isActiveConfig("precompile_header"); | ||
98 | if (usePCH) { | ||
99 | // Created files | ||
100 | QString origTarget = project->first("QMAKE_ORIG_TARGET"); | ||
101 | origTarget.replace(QRegExp("-"), "_"); | ||
102 | precompObj = "\"$(IntDir)\\" + origTarget + Option::obj_ext + "\""; | ||
103 | precompPch = "\"$(IntDir)\\" + origTarget + ".pch\""; | ||
104 | // Add PRECOMPILED_HEADER to HEADERS | ||
105 | if (!project->variables()["HEADERS"].contains(precompH)) | ||
106 | project->variables()["HEADERS"] += precompH; | ||
107 | // Add precompile compiler options | ||
108 | project->variables()["PRECOMPILED_FLAGS_REL"] = "/Yu\"" + namePCH + "\" /FI\"" + namePCH + "\" "; | ||
109 | project->variables()["PRECOMPILED_FLAGS_DEB"] = "/Yu\"" + namePCH + "\" /FI\"" + namePCH + "\" "; | ||
110 | // Return to variable pool | ||
111 | project->variables()["PRECOMPILED_OBJECT"] = precompObj; | ||
112 | project->variables()["PRECOMPILED_PCH"] = precompPch; | ||
113 | } | ||
90 | int rep; | 114 | int rep; |
91 | QString line; | 115 | QString line; |
92 | while ( !dsp.eof() ) { | 116 | while ( !dsp.eof() ) { |
93 | line = dsp.readLine(); | 117 | line = dsp.readLine(); |
94 | while((rep = line.find(QRegExp("\\$\\$[a-zA-Z0-9_-]*"))) != -1) { | 118 | while((rep = line.find(QRegExp("\\$\\$[a-zA-Z0-9_-]*"))) != -1) { |
95 | QString torep = line.mid(rep, line.find(QRegExp("[^\\$a-zA-Z0-9_-]"), rep) - rep); | 119 | QString torep = line.mid(rep, line.find(QRegExp("[^\\$a-zA-Z0-9_-]"), rep) - rep); |
96 | QString variable = torep.right(torep.length()-2); | 120 | QString variable = torep.right(torep.length()-2); |
97 | 121 | ||
@@ -106,31 +130,33 @@ DspMakefileGenerator::writeDspParts(QTextStream &t) | |||
106 | 130 | ||
107 | QStringList list = project->variables()["SOURCES"] + project->variables()["DEF_FILE"]; | 131 | QStringList list = project->variables()["SOURCES"] + project->variables()["DEF_FILE"]; |
108 | if(!project->isActiveConfig("flat")) | 132 | if(!project->isActiveConfig("flat")) |
109 | list.sort(); | 133 | list.sort(); |
110 | QStringList::Iterator it; | 134 | QStringList::Iterator it; |
111 | for( it = list.begin(); it != list.end(); ++it) { | 135 | for( it = list.begin(); it != list.end(); ++it) { |
112 | beginGroupForFile((*it), t); | 136 | beginGroupForFile((*it), t); |
113 | t << "# Begin Source File\n\nSOURCE=" << (*it) << endl; | 137 | t << "# Begin Source File\n\nSOURCE=" << (*it) << endl; |
114 | if ( project->isActiveConfig("moc") && (*it).endsWith(Option::moc_ext)) { | 138 | if (usePCH && (*it).endsWith(".c")) |
139 | t << "# SUBTRACT CPP /FI\"" << namePCH << "\" /Yu\"" << namePCH << "\" /Fp" << endl; | ||
140 | if ( project->isActiveConfig("moc") && (*it).endsWith(Option::cpp_moc_ext)) { | ||
115 | QString base = (*it); | 141 | QString base = (*it); |
116 | base.replace(QRegExp("\\..*$"), "").upper(); | 142 | base.replace(QRegExp("\\..*$"), "").upper(); |
117 | base.replace(QRegExp("[^a-zA-Z]"), "_"); | 143 | base.replace(QRegExp("[^a-zA-Z]"), "_"); |
118 | 144 | ||
119 | QString build = "\n\n# Begin Custom Build - Moc'ing " + findMocSource((*it)) + | 145 | QString build = "\n\n# Begin Custom Build - Moc'ing " + findMocSource((*it)) + |
120 | "...\n" "InputPath=.\\" + (*it) + "\n\n" "\"" + (*it) + "\"" | 146 | "...\n" "InputPath=.\\" + (*it) + "\n\n" "\"" + (*it) + "\"" |
121 | " : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\n" | 147 | " : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\n" |
122 | "\t" + mocpath + findMocSource((*it)) + " -o " + | 148 | "\t" + mocpath + findMocSource((*it)) + " -o " + |
123 | (*it) + "\n\n" "# End Custom Build\n\n"; | 149 | (*it) + "\n\n" "# End Custom Build\n\n"; |
124 | 150 | ||
125 | t << "USERDEP_" << base << "=\".\\" << findMocSource((*it)) << "\" \"$(QTDIR)\\bin\\moc.exe\"" << endl << endl; | 151 | t << "USERDEP_" << base << "=\".\\" << findMocSource((*it)) << "\" \"$(QTDIR)\\bin\\moc.exe\"" << endl << endl; |
126 | 152 | ||
127 | t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Release\"" << build | 153 | t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Release\"" << build |
128 | << "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Debug\"" | 154 | << "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Debug\"" |
129 | << build << "!ENDIF " << endl << endl; | 155 | << build << "!ENDIF " << endl << endl; |
130 | } | 156 | } |
131 | t << "# End Source File" << endl; | 157 | t << "# End Source File" << endl; |
132 | } | 158 | } |
133 | endGroups(t); | 159 | endGroups(t); |
134 | } else if(variable == "MSVCDSP_IMAGES") { | 160 | } else if(variable == "MSVCDSP_IMAGES") { |
135 | if(project->variables()["IMAGES"].isEmpty()) | 161 | if(project->variables()["IMAGES"].isEmpty()) |
136 | continue; | 162 | continue; |
@@ -141,35 +167,87 @@ DspMakefileGenerator::writeDspParts(QTextStream &t) | |||
141 | continue; | 167 | continue; |
142 | 168 | ||
143 | QStringList list = project->variables()["HEADERS"]; | 169 | QStringList list = project->variables()["HEADERS"]; |
144 | if(!project->isActiveConfig("flat")) | 170 | if(!project->isActiveConfig("flat")) |
145 | list.sort(); | 171 | list.sort(); |
146 | for(QStringList::Iterator it = list.begin(); it != list.end(); ++it) { | 172 | for(QStringList::Iterator it = list.begin(); it != list.end(); ++it) { |
147 | // beginGroupForFile((*it), t); | 173 | // beginGroupForFile((*it), t); |
148 | t << "# Begin Source File\n\nSOURCE=" << (*it) << endl << endl; | 174 | t << "# Begin Source File\n\nSOURCE=" << (*it) << endl << endl; |
149 | if ( project->isActiveConfig("moc") && !findMocDestination((*it)).isEmpty()) { | 175 | QString compilePCH; |
150 | QString base = (*it); | 176 | QStringList customDependencies; |
177 | QString createMOC; | ||
178 | QString buildCmdsR, buildCmdsD; | ||
179 | QString buildCmds = "\nBuildCmds= \\\n"; | ||
180 | // Create unique baseID | ||
181 | QString base = (*it); | ||
182 | { | ||
151 | base.replace(QRegExp("\\..*$"), "").upper(); | 183 | base.replace(QRegExp("\\..*$"), "").upper(); |
152 | base.replace(QRegExp("[^a-zA-Z]"), "_"); | 184 | base.replace(QRegExp("[^a-zA-Z]"), "_"); |
185 | } | ||
186 | if (usePCH && precompH.endsWith(*it)) { | ||
187 | QString basicBuildCmd = QString("\tcl.exe /TP /W3 /FD /c /D \"WIN32\" /Yc /Fp\"%1\" /Fo\"%2\" %3 %4 %5 %6 %7 %8 %9 /D \"") | ||
188 | .arg(precompPch) | ||
189 | .arg(precompObj) | ||
190 | .arg(var("MSVCDSP_INCPATH")) | ||
191 | .arg(var("MSVCDSP_DEFINES")) | ||
192 | .arg(var("MSVCDSP_CXXFLAGS")); | ||
193 | buildCmdsR = basicBuildCmd | ||
194 | .arg("/D \"NDEBUG\"") | ||
195 | .arg(var("QMAKE_CXXFLAGS_RELEASE")) | ||
196 | .arg(var("MSVCDSP_MTDEF")) | ||
197 | .arg(var("MSVCDSP_RELDEFS")); | ||
198 | buildCmdsD = basicBuildCmd | ||
199 | .arg("/D \"_DEBUG\" /Od") | ||
200 | .arg(var("QMAKE_CXXFLAGS_DEBUG")) | ||
201 | .arg(var("MSVCDSP_MTDEFD")) | ||
202 | .arg(var("MSVCDSP_DEBUG_OPT")); | ||
203 | if (project->first("TEMPLATE") == "vcapp") {// App | ||
204 | buildCmdsR += var("MSVCDSP_WINCONDEF"); | ||
205 | buildCmdsD += var("MSVCDSP_WINCONDEF"); | ||
206 | } else if (project->isActiveConfig("dll")) {// Dll | ||
207 | buildCmdsR += "_WINDOWS\" /D \"_USRDLL"; | ||
208 | buildCmdsD += "_WINDOWS\" /D \"_USRDLL"; | ||
209 | } else { // Lib | ||
210 | buildCmdsR += "_LIB"; | ||
211 | buildCmdsD += "_LIB"; | ||
212 | } | ||
213 | buildCmdsR += "\" /Fd\"$(IntDir)\\\\\" " + (*it) + " \\\n"; | ||
214 | buildCmdsD += "\" /Fd\"$(IntDir)\\\\\" " + (*it) + " \\\n"; | ||
215 | |||
216 | compilePCH = precompPch + " : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\n $(BuildCmds)\n\n"; | ||
153 | 217 | ||
218 | QStringList &tmp = findDependencies(precompH); | ||
219 | if(!tmp.isEmpty()) // Got Deps for PCH | ||
220 | customDependencies += tmp; | ||
221 | } | ||
222 | if (project->isActiveConfig("moc") && !findMocDestination((*it)).isEmpty()) { | ||
154 | QString mocpath = var( "QMAKE_MOC" ); | 223 | QString mocpath = var( "QMAKE_MOC" ); |
155 | mocpath = mocpath.replace( QRegExp( "\\..*$" ), "" ) + " "; | 224 | mocpath = mocpath.replace( QRegExp( "\\..*$" ), "" ) + " "; |
156 | 225 | buildCmds += "\t" + mocpath + (*it) + " -o " + findMocDestination((*it)) + " \\\n"; | |
157 | QString build = "\n\n# Begin Custom Build - Moc'ing " + (*it) + | 226 | createMOC = "\"" + findMocDestination((*it)) +"\" : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\n $(BuildCmds)\n\n"; |
158 | "...\n" "InputPath=.\\" + (*it) + "\n\n" "\"" + findMocDestination((*it)) + | 227 | customDependencies += "\"$(QTDIR)\\bin\\moc.exe\""; |
159 | "\"" " : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\n" | 228 | } |
160 | "\t" + mocpath + (*it) + " -o " + | 229 | if (!createMOC.isEmpty() || !compilePCH.isEmpty()) { |
161 | findMocDestination((*it)) + "\n\n" "# End Custom Build\n\n"; | 230 | bool doMOC = !createMOC.isEmpty(); |
162 | 231 | bool doPCH = !compilePCH.isEmpty(); | |
163 | t << "USERDEP_" << base << "=\"$(QTDIR)\\bin\\moc.exe\"" << endl << endl; | 232 | QString build = "\n\n# Begin Custom Build - "+ |
164 | 233 | QString(doMOC?"Moc'ing ":"") + | |
165 | t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Release\"" << build | 234 | QString((doMOC&&doPCH)?" and ":"") + |
166 | << "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Debug\"" | 235 | QString(doPCH?"Creating PCH cpp from ":"") + |
167 | << build << "!ENDIF " << endl << endl; | 236 | (*it) + "...\nInputPath=.\\" + (*it) + "\n\n" + |
237 | buildCmds + "%1\n" + | ||
238 | createMOC + | ||
239 | compilePCH + | ||
240 | "# End Custom Build\n\n"; | ||
241 | |||
242 | t << "USERDEP_" << base << "=" << valGlue(customDependencies, "\"", "\" \"", "\"") << endl << endl; | ||
243 | t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Release\"" << build.arg(buildCmdsR) | ||
244 | << "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Debug\"" << build.arg(buildCmdsD) | ||
245 | << "!ENDIF " << endl << endl; | ||
168 | } | 246 | } |
169 | t << "# End Source File" << endl; | 247 | t << "# End Source File" << endl; |
170 | } | 248 | } |
171 | // endGroups(t); | 249 | // endGroups(t); |
172 | } else if(variable == "MSVCDSP_FORMSOURCES" || variable == "MSVCDSP_FORMHEADERS") { | 250 | } else if(variable == "MSVCDSP_FORMSOURCES" || variable == "MSVCDSP_FORMHEADERS") { |
173 | if(project->variables()["FORMS"].isEmpty()) | 251 | if(project->variables()["FORMS"].isEmpty()) |
174 | continue; | 252 | continue; |
175 | 253 | ||
@@ -247,31 +325,31 @@ DspMakefileGenerator::writeDspParts(QTextStream &t) | |||
247 | mocpath = mocpath.replace( QRegExp( "\\..*$" ), "" ) + " "; | 325 | mocpath = mocpath.replace( QRegExp( "\\..*$" ), "" ) + " "; |
248 | 326 | ||
249 | QStringList list = project->variables()["SRCMOC"]; | 327 | QStringList list = project->variables()["SRCMOC"]; |
250 | if(!project->isActiveConfig("flat")) | 328 | if(!project->isActiveConfig("flat")) |
251 | list.sort(); | 329 | list.sort(); |
252 | for(QStringList::Iterator it = list.begin(); it != list.end(); ++it) { | 330 | for(QStringList::Iterator it = list.begin(); it != list.end(); ++it) { |
253 | // beginGroupForFile((*it), t); | 331 | // beginGroupForFile((*it), t); |
254 | t << "# Begin Source File\n\nSOURCE=" << (*it) << endl; | 332 | t << "# Begin Source File\n\nSOURCE=" << (*it) << endl; |
255 | if ( project->isActiveConfig("moc") && (*it).endsWith(Option::moc_ext)) { | 333 | if ( project->isActiveConfig("moc") && (*it).endsWith(Option::cpp_moc_ext)) { |
256 | QString base = (*it); | 334 | QString base = (*it); |
257 | base.replace(QRegExp("\\..*$"), "").upper(); | 335 | base.replace(QRegExp("\\..*$"), "").upper(); |
258 | base.replace(QRegExp("[^a-zA-Z]"), "_"); | 336 | base.replace(QRegExp("[^a-zA-Z]"), "_"); |
259 | 337 | ||
260 | QString build = "\n\n# Begin Custom Build - Moc'ing " + findMocSource((*it)) + | 338 | QString build = "\n\n# Begin Custom Build - Moc'ing " + findMocSource((*it)) + |
261 | "...\n" "InputPath=.\\" + (*it) + "\n\n" "\"" + (*it) + "\"" | 339 | "...\n" "InputPath=.\\" + (*it) + "\n\n" "\"" + (*it) + "\"" |
262 | " : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\n" | 340 | " : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\n" |
263 | "\t" + mocpath + findMocSource((*it)) + " -o " + | 341 | "\t" + mocpath + findMocSource((*it)) + " -o " + |
264 | (*it) + "\n\n" "# End Custom Build\n\n"; | 342 | (*it) + "\n\n" "# End Custom Build\n\n"; |
265 | 343 | ||
266 | t << "USERDEP_" << base << "=\".\\" << findMocSource((*it)) << "\" \"$(QTDIR)\\bin\\moc.exe\"" << endl << endl; | 344 | t << "USERDEP_" << base << "=\".\\" << findMocSource((*it)) << "\" \"$(QTDIR)\\bin\\moc.exe\"" << endl << endl; |
267 | 345 | ||
268 | t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Release\"" << build | 346 | t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Release\"" << build |
269 | << "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Debug\"" | 347 | << "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Debug\"" |
270 | << build << "!ENDIF " << endl << endl; | 348 | << build << "!ENDIF " << endl << endl; |
271 | } | 349 | } |
272 | t << "# End Source File" << endl; | 350 | t << "# End Source File" << endl; |
273 | } | 351 | } |
274 | // endGroups(t); | 352 | // endGroups(t); |
275 | } else if(variable == "MSVCDSP_PICTURES") { | 353 | } else if(variable == "MSVCDSP_PICTURES") { |
276 | if(project->variables()["IMAGES"].isEmpty()) | 354 | if(project->variables()["IMAGES"].isEmpty()) |
277 | continue; | 355 | continue; |
@@ -382,29 +460,30 @@ DspMakefileGenerator::writeDspParts(QTextStream &t) | |||
382 | } | 460 | } |
383 | 461 | ||
384 | t << "USERDEP_" << base << "=\"$(QTDIR)\\bin\\moc.exe\" \"$(QTDIR)\\bin\\uic.exe\"" << endl << endl; | 462 | t << "USERDEP_" << base << "=\"$(QTDIR)\\bin\\moc.exe\" \"$(QTDIR)\\bin\\uic.exe\"" << endl << endl; |
385 | 463 | ||
386 | QString build = "\n\n# Begin Custom Build - Uic'ing " + base + "...\n" | 464 | QString build = "\n\n# Begin Custom Build - Uic'ing " + base + "...\n" |
387 | "InputPath=.\\" + base + "\n\n" "BuildCmds= \\\n\t" + uicpath + base + | 465 | "InputPath=.\\" + base + "\n\n" "BuildCmds= \\\n\t" + uicpath + base + |
388 | " -o " + uiHeadersDir + fname + ".h \\\n" "\t" + uicpath + base + | 466 | " -o " + uiHeadersDir + fname + ".h \\\n" "\t" + uicpath + base + |
389 | " -i " + fname + ".h -o " + uiSourcesDir + fname + ".cpp \\\n" | 467 | " -i " + fname + ".h -o " + uiSourcesDir + fname + ".cpp \\\n" |
390 | "\t" + mocpath + uiHeadersDir + fname + ".h -o " + mocFile + "moc_" + fname + ".cpp \\\n"; | 468 | "\t" + mocpath + " " + uiHeadersDir + |
469 | fname + ".h -o " + mocFile + Option::h_moc_mod + fname + Option::h_moc_ext + " \\\n"; | ||
391 | 470 | ||
392 | build.append("\n\"" + uiHeadersDir + fname + ".h\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n" | 471 | build.append("\n\"" + uiHeadersDir + fname + ".h\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n" |
393 | "\t$(BuildCmds)\n\n" | 472 | "\t$(BuildCmds)\n\n" |
394 | "\"" + uiSourcesDir + fname + ".cpp\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n" | 473 | "\"" + uiSourcesDir + fname + ".cpp\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n" |
395 | "\t$(BuildCmds)\n\n" | 474 | "\t$(BuildCmds)\n\n" |
396 | "\"" + mocFile + "moc_" + fname + ".cpp\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n" | 475 | "\"" + mocFile + Option::h_moc_mod + fname + Option::h_moc_ext + "\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n" |
397 | "\t$(BuildCmds)\n\n"); | 476 | "\t$(BuildCmds)\n\n"); |
398 | 477 | ||
399 | build.append("# End Custom Build\n\n"); | 478 | build.append("# End Custom Build\n\n"); |
400 | 479 | ||
401 | t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Release\"" << build | 480 | t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Release\"" << build |
402 | << "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Debug\"" << build | 481 | << "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Debug\"" << build |
403 | << "!ENDIF \n\n" << "# End Source File" << endl; | 482 | << "!ENDIF \n\n" << "# End Source File" << endl; |
404 | } | 483 | } |
405 | // endGroups(t); | 484 | // endGroups(t); |
406 | t << "\n# End Group\n"; | 485 | t << "\n# End Group\n"; |
407 | } else if(variable == "MSVCDSP_LEXSOURCES") { | 486 | } else if(variable == "MSVCDSP_LEXSOURCES") { |
408 | if(project->variables()["LEXSOURCES"].isEmpty()) | 487 | if(project->variables()["LEXSOURCES"].isEmpty()) |
409 | continue; | 488 | continue; |
410 | 489 | ||
@@ -424,18 +503,18 @@ DspMakefileGenerator::writeDspParts(QTextStream &t) | |||
424 | 503 | ||
425 | QString build = "\n\n# Begin Custom Build - Lex'ing " + (*it) + "...\n" | 504 | QString build = "\n\n# Begin Custom Build - Lex'ing " + (*it) + "...\n" |
426 | "InputPath=.\\" + (*it) + "\n\n" | 505 | "InputPath=.\\" + (*it) + "\n\n" |
427 | "\"" + fname + "\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n" | 506 | "\"" + fname + "\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n" |
428 | "\t" + lexpath + (*it) + "\\\n" | 507 | "\t" + lexpath + (*it) + "\\\n" |
429 | "\tdel " + fname + "\\\n" | 508 | "\tdel " + fname + "\\\n" |
430 | "\tcopy lex.yy.c " + fname + "\n\n" + | 509 | "\tcopy lex.yy.c " + fname + "\n\n" + |
431 | "# End Custom Build\n\n"; | 510 | "# End Custom Build\n\n"; |
432 | t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Release\"" << build | 511 | t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Release\"" << build |
433 | << "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Debug\"" << build | 512 | << "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Debug\"" << build |
434 | << "!ENDIF \n\n" << build | 513 | << "!ENDIF \n\n" << build |
435 | 514 | ||
436 | << "# End Source File" << endl; | 515 | << "# End Source File" << endl; |
437 | } | 516 | } |
438 | // endGroups(t); | 517 | // endGroups(t); |
439 | t << "\n# End Group\n"; | 518 | t << "\n# End Group\n"; |
440 | } else if(variable == "MSVCDSP_YACCSOURCES") { | 519 | } else if(variable == "MSVCDSP_YACCSOURCES") { |
441 | if(project->variables()["YACCSOURCES"].isEmpty()) | 520 | if(project->variables()["YACCSOURCES"].isEmpty()) |
@@ -460,18 +539,18 @@ DspMakefileGenerator::writeDspParts(QTextStream &t) | |||
460 | "\"" + fname + Option::cpp_ext.first() + "\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n" | 539 | "\"" + fname + Option::cpp_ext.first() + "\" : \"$(SOURCE)\" \"$(INTDIR)\" \"$(OUTDIR)\"" "\n" |
461 | "\t" + yaccpath + (*it) + "\\\n" | 540 | "\t" + yaccpath + (*it) + "\\\n" |
462 | "\tdel " + fname + Option::h_ext.first() + "\\\n" | 541 | "\tdel " + fname + Option::h_ext.first() + "\\\n" |
463 | "\tmove y.tab.h " + fname + Option::h_ext.first() + "\n\n" + | 542 | "\tmove y.tab.h " + fname + Option::h_ext.first() + "\n\n" + |
464 | "\tdel " + fname + Option::cpp_ext.first() + "\\\n" | 543 | "\tdel " + fname + Option::cpp_ext.first() + "\\\n" |
465 | "\tmove y.tab.c " + fname + Option::cpp_ext.first() + "\n\n" + | 544 | "\tmove y.tab.c " + fname + Option::cpp_ext.first() + "\n\n" + |
466 | "# End Custom Build\n\n"; | 545 | "# End Custom Build\n\n"; |
467 | 546 | ||
468 | t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Release\"" << build | 547 | t << "!IF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Release\"" << build |
469 | << "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - Win32 Debug\"" << build | 548 | << "!ELSEIF \"$(CFG)\" == \"" << var("MSVCDSP_PROJECT") << " - " << platform << " Debug\"" << build |
470 | << "!ENDIF \n\n" | 549 | << "!ENDIF \n\n" |
471 | << "# End Source File" << endl; | 550 | << "# End Source File" << endl; |
472 | } | 551 | } |
473 | // endGroups(t); | 552 | // endGroups(t); |
474 | t << "\n# End Group\n"; | 553 | t << "\n# End Group\n"; |
475 | } else if( variable == "MSVCDSP_CONFIGMODE" ) { | 554 | } else if( variable == "MSVCDSP_CONFIGMODE" ) { |
476 | if( project->isActiveConfig( "debug" ) ) | 555 | if( project->isActiveConfig( "debug" ) ) |
477 | t << "Debug"; | 556 | t << "Debug"; |
@@ -527,32 +606,39 @@ DspMakefileGenerator::init() | |||
527 | if ( project->isActiveConfig("rtti") ) { | 606 | if ( project->isActiveConfig("rtti") ) { |
528 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_ON"]; | 607 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_ON"]; |
529 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_ON"]; | 608 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_ON"]; |
530 | } else { | 609 | } else { |
531 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_OFF"]; | 610 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_OFF"]; |
532 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_OFF"]; | 611 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_OFF"]; |
533 | } | 612 | } |
534 | 613 | ||
614 | |||
535 | /* this should probably not be here, but I'm using it to wrap the .t files */ | 615 | /* this should probably not be here, but I'm using it to wrap the .t files */ |
536 | if(project->first("TEMPLATE") == "vcapp" ) | 616 | if(project->first("TEMPLATE") == "vcapp" ) |
537 | project->variables()["QMAKE_APP_FLAG"].append("1"); | 617 | project->variables()["QMAKE_APP_FLAG"].append("1"); |
538 | else if(project->first("TEMPLATE") == "vclib") | 618 | else if(project->first("TEMPLATE") == "vclib") |
539 | project->variables()["QMAKE_LIB_FLAG"].append("1"); | 619 | project->variables()["QMAKE_LIB_FLAG"].append("1"); |
540 | if ( project->variables()["QMAKESPEC"].isEmpty() ) | 620 | if ( project->variables()["QMAKESPEC"].isEmpty() ) |
541 | project->variables()["QMAKESPEC"].append( getenv("QMAKESPEC") ); | 621 | project->variables()["QMAKESPEC"].append( getenv("QMAKESPEC") ); |
542 | 622 | ||
543 | bool is_qt = (project->first("TARGET") == "qt"QTDLL_POSTFIX || project->first("TARGET") == "qt-mt"QTDLL_POSTFIX); | 623 | bool is_qt = (project->first("TARGET") == "qt"QTDLL_POSTFIX || project->first("TARGET") == "qt-mt"QTDLL_POSTFIX); |
544 | project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"]; | 624 | project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"]; |
545 | 625 | ||
546 | QStringList &configs = project->variables()["CONFIG"]; | 626 | QStringList &configs = project->variables()["CONFIG"]; |
547 | if (project->isActiveConfig("shared")) | 627 | if (project->isActiveConfig("shared")) |
548 | project->variables()["DEFINES"].append("QT_DLL"); | 628 | project->variables()["DEFINES"].append("QT_DLL"); |
549 | if (project->isActiveConfig("qt_dll")) | 629 | if (project->isActiveConfig("qt_dll")) |
550 | if(configs.findIndex("qt") == -1) configs.append("qt"); | 630 | if(configs.findIndex("qt") == -1) configs.append("qt"); |
631 | if ( project->isActiveConfig("qtopia") ) { | ||
632 | if(configs.findIndex("qtopialib") == -1) | ||
633 | configs.append("qtopialib"); | ||
634 | if(configs.findIndex("qtopiainc") == -1) | ||
635 | configs.append("qtopiainc"); | ||
636 | } | ||
551 | if ( project->isActiveConfig("qt") ) { | 637 | if ( project->isActiveConfig("qt") ) { |
552 | if ( project->isActiveConfig( "plugin" ) ) { | 638 | if ( project->isActiveConfig( "plugin" ) ) { |
553 | project->variables()["CONFIG"].append("dll"); | 639 | project->variables()["CONFIG"].append("dll"); |
554 | project->variables()["DEFINES"].append("QT_PLUGIN"); | 640 | project->variables()["DEFINES"].append("QT_PLUGIN"); |
555 | } | 641 | } |
556 | if ( (project->variables()["DEFINES"].findIndex("QT_NODLL") == -1) && | 642 | if ( (project->variables()["DEFINES"].findIndex("QT_NODLL") == -1) && |
557 | ((project->variables()["DEFINES"].findIndex("QT_MAKEDLL") != -1 || | 643 | ((project->variables()["DEFINES"].findIndex("QT_MAKEDLL") != -1 || |
558 | project->variables()["DEFINES"].findIndex("QT_DLL") != -1) || | 644 | project->variables()["DEFINES"].findIndex("QT_DLL") != -1) || |
@@ -576,16 +662,24 @@ DspMakefileGenerator::init() | |||
576 | QString version = project->variables()["VERSION"][0]; | 662 | QString version = project->variables()["VERSION"][0]; |
577 | int firstDot = version.find( "." ); | 663 | int firstDot = version.find( "." ); |
578 | QString major = version.left( firstDot ); | 664 | QString major = version.left( firstDot ); |
579 | QString minor = version.right( version.length() - firstDot - 1 ); | 665 | QString minor = version.right( version.length() - firstDot - 1 ); |
580 | minor.replace( ".", "" ); | 666 | minor.replace( ".", "" ); |
581 | project->variables()["MSVCDSP_VERSION"].append( "/VERSION:" + major + "." + minor ); | 667 | project->variables()["MSVCDSP_VERSION"].append( "/VERSION:" + major + "." + minor ); |
582 | } | 668 | } |
583 | 669 | ||
670 | if ( project->isActiveConfig("qtopiainc") ) | ||
671 | project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_QTOPIA"]; | ||
672 | if ( project->isActiveConfig("qtopialib") ) { | ||
673 | if(!project->isEmpty("QMAKE_LIBDIR_QTOPIA")) | ||
674 | project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QTOPIA"]; | ||
675 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QTOPIA"]; | ||
676 | } | ||
677 | |||
584 | if ( project->isActiveConfig("qt") ) { | 678 | if ( project->isActiveConfig("qt") ) { |
585 | project->variables()["CONFIG"].append("moc"); | 679 | project->variables()["CONFIG"].append("moc"); |
586 | project->variables()["INCLUDEPATH"] +=project->variables()["QMAKE_INCDIR_QT"]; | 680 | project->variables()["INCLUDEPATH"] +=project->variables()["QMAKE_INCDIR_QT"]; |
587 | project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QT"]; | 681 | project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QT"]; |
588 | 682 | ||
589 | if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) { | 683 | if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) { |
590 | if ( !project->variables()["QMAKE_QT_DLL"].isEmpty() ) { | 684 | if ( !project->variables()["QMAKE_QT_DLL"].isEmpty() ) { |
591 | project->variables()["DEFINES"].append("QT_MAKEDLL"); | 685 | project->variables()["DEFINES"].append("QT_MAKEDLL"); |
@@ -629,16 +723,18 @@ DspMakefileGenerator::init() | |||
629 | if ( !project->first("DESTDIR").isEmpty() ) | 723 | if ( !project->first("DESTDIR").isEmpty() ) |
630 | project->variables()["MSVCDSP_TARGETDIRDEB"] = project->first("DESTDIR"); | 724 | project->variables()["MSVCDSP_TARGETDIRDEB"] = project->first("DESTDIR"); |
631 | else | 725 | else |
632 | project->variables()["MSVCDSP_TARGETDIRDEB"] = "Debug"; | 726 | project->variables()["MSVCDSP_TARGETDIRDEB"] = "Debug"; |
633 | project->variables()["MSVCDSP_TARGETDIRREL"] = "Release"; | 727 | project->variables()["MSVCDSP_TARGETDIRREL"] = "Release"; |
634 | } else { | 728 | } else { |
635 | if ( !project->first("OBJECTS_DIR").isEmpty() ) | 729 | if ( !project->first("OBJECTS_DIR").isEmpty() ) |
636 | project->variables()["MSVCDSP_OBJECTSDIRREL"] = project->first("OBJECTS_DIR"); | 730 | project->variables()["MSVCDSP_OBJECTSDIRREL"] = project->first("OBJECTS_DIR"); |
731 | else | ||
732 | project->variables()["MSVCDSP_OBJECTSDIRREL"] = "Release"; | ||
637 | project->variables()["MSVCDSP_OBJECTSDIRDEB"] = "Debug"; | 733 | project->variables()["MSVCDSP_OBJECTSDIRDEB"] = "Debug"; |
638 | if ( !project->first("DESTDIR").isEmpty() ) | 734 | if ( !project->first("DESTDIR").isEmpty() ) |
639 | project->variables()["MSVCDSP_TARGETDIRREL"] = project->first("DESTDIR"); | 735 | project->variables()["MSVCDSP_TARGETDIRREL"] = project->first("DESTDIR"); |
640 | else | 736 | else |
641 | project->variables()["MSVCDSP_TARGETDIRREL"] = "Release"; | 737 | project->variables()["MSVCDSP_TARGETDIRREL"] = "Release"; |
642 | project->variables()["MSVCDSP_TARGETDIRDEB"] = "Debug"; | 738 | project->variables()["MSVCDSP_TARGETDIRDEB"] = "Debug"; |
643 | } | 739 | } |
644 | 740 | ||
@@ -665,30 +761,55 @@ DspMakefileGenerator::init() | |||
665 | 761 | ||
666 | if(project->isActiveConfig("qt")) { | 762 | if(project->isActiveConfig("qt")) { |
667 | if ( project->isActiveConfig("accessibility" ) ) | 763 | if ( project->isActiveConfig("accessibility" ) ) |
668 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_ACCESSIBILITY_SUPPORT"); | 764 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_ACCESSIBILITY_SUPPORT"); |
669 | if ( project->isActiveConfig("tablet") ) | 765 | if ( project->isActiveConfig("tablet") ) |
670 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_TABLET_SUPPORT"); | 766 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_TABLET_SUPPORT"); |
671 | } | 767 | } |
672 | if ( project->isActiveConfig("dll") ) { | 768 | if ( project->isActiveConfig("dll") ) { |
769 | project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CFLAGS_CONSOLE_DLL"]; | ||
770 | project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CXXFLAGS_CONSOLE_DLL"]; | ||
771 | project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_LFLAGS_CONSOLE_DLL"]; | ||
772 | project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"] = project->variables()["QMAKE_LFLAGS_WINDOWS_DLL"]; | ||
673 | if ( !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) { | 773 | if ( !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) { |
674 | QString ver_xyz(project->first("VERSION")); | 774 | QString ver_xyz(project->first("VERSION")); |
675 | ver_xyz.replace(".", ""); | 775 | ver_xyz.replace(".", ""); |
676 | project->variables()["TARGET_EXT"].append(ver_xyz + ".dll"); | 776 | project->variables()["TARGET_EXT"].append(ver_xyz + ".dll"); |
677 | } else { | 777 | } else { |
678 | project->variables()["TARGET_EXT"].append(".dll"); | 778 | project->variables()["TARGET_EXT"].append(".dll"); |
679 | } | 779 | } |
680 | } else { | 780 | } else { |
781 | project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CFLAGS_CONSOLE"]; | ||
782 | project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CXXFLAGS_CONSOLE"]; | ||
783 | project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_LFLAGS_CONSOLE"]; | ||
784 | project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"] = project->variables()["QMAKE_LFLAGS_WINDOWS"]; | ||
681 | if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty() ) | 785 | if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty() ) |
682 | project->variables()["TARGET_EXT"].append(".exe"); | 786 | project->variables()["TARGET_EXT"].append(".exe"); |
683 | else | 787 | else |
684 | project->variables()["TARGET_EXT"].append(".lib"); | 788 | project->variables()["TARGET_EXT"].append(".lib"); |
685 | } | 789 | } |
686 | 790 | ||
791 | if ( project->isActiveConfig("windows") ) { | ||
792 | if ( project->isActiveConfig("console") ) { | ||
793 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"]; | ||
794 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"]; | ||
795 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"]; | ||
796 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"]; | ||
797 | } else { | ||
798 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"]; | ||
799 | } | ||
800 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_WINDOWS"]; | ||
801 | } else { | ||
802 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"]; | ||
803 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"]; | ||
804 | project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"]; | ||
805 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"]; | ||
806 | } | ||
807 | |||
687 | project->variables()["MSVCDSP_VER"] = "6.00"; | 808 | project->variables()["MSVCDSP_VER"] = "6.00"; |
688 | project->variables()["MSVCDSP_DEBUG_OPT"] = "/GZ /ZI"; | 809 | project->variables()["MSVCDSP_DEBUG_OPT"] = "/GZ /ZI"; |
689 | 810 | ||
690 | if(!project->isActiveConfig("incremental")) { | 811 | if(!project->isActiveConfig("incremental")) { |
691 | project->variables()["QMAKE_LFLAGS"].append(QString("/incremental:no")); | 812 | project->variables()["QMAKE_LFLAGS"].append(QString("/incremental:no")); |
692 | if ( is_qt ) | 813 | if ( is_qt ) |
693 | project->variables()["MSVCDSP_DEBUG_OPT"] = "/GZ /Zi"; | 814 | project->variables()["MSVCDSP_DEBUG_OPT"] = "/GZ /Zi"; |
694 | } | 815 | } |
@@ -727,52 +848,67 @@ DspMakefileGenerator::init() | |||
727 | (*it).replace(QRegExp("\\.[a-zA-Z0-9_]*$"), ""); | 848 | (*it).replace(QRegExp("\\.[a-zA-Z0-9_]*$"), ""); |
728 | 849 | ||
729 | if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty() ) { | 850 | if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty() ) { |
730 | project->variables()["MSVCDSP_TEMPLATE"].append("win32app" + project->first( "DSP_EXTENSION" ) ); | 851 | project->variables()["MSVCDSP_TEMPLATE"].append("win32app" + project->first( "DSP_EXTENSION" ) ); |
731 | if ( project->isActiveConfig("console") ) { | 852 | if ( project->isActiveConfig("console") ) { |
732 | project->variables()["MSVCDSP_CONSOLE"].append("Console"); | 853 | project->variables()["MSVCDSP_CONSOLE"].append("Console"); |
733 | project->variables()["MSVCDSP_WINCONDEF"].append("_CONSOLE"); | 854 | project->variables()["MSVCDSP_WINCONDEF"].append("_CONSOLE"); |
734 | project->variables()["MSVCDSP_DSPTYPE"].append("0x0103"); | 855 | project->variables()["MSVCDSP_DSPTYPE"].append("0x0103"); |
735 | project->variables()["MSVCDSP_SUBSYSTEM"].append("console"); | ||
736 | } else { | 856 | } else { |
737 | project->variables()["MSVCDSP_CONSOLE"].clear(); | 857 | project->variables()["MSVCDSP_CONSOLE"].clear(); |
738 | project->variables()["MSVCDSP_WINCONDEF"].append("_WINDOWS"); | 858 | project->variables()["MSVCDSP_WINCONDEF"].append("_WINDOWS"); |
739 | project->variables()["MSVCDSP_DSPTYPE"].append("0x0101"); | 859 | project->variables()["MSVCDSP_DSPTYPE"].append("0x0101"); |
740 | project->variables()["MSVCDSP_SUBSYSTEM"].append("windows"); | ||
741 | } | 860 | } |
742 | } else { | 861 | } else { |
743 | if ( project->isActiveConfig("dll") ) { | 862 | if ( project->isActiveConfig("dll") ) { |
744 | project->variables()["MSVCDSP_TEMPLATE"].append("win32dll" + project->first( "DSP_EXTENSION" ) ); | 863 | project->variables()["MSVCDSP_TEMPLATE"].append("win32dll" + project->first( "DSP_EXTENSION" ) ); |
745 | } else { | 864 | } else { |
746 | project->variables()["MSVCDSP_TEMPLATE"].append("win32lib" + project->first( "DSP_EXTENSION" ) ); | 865 | project->variables()["MSVCDSP_TEMPLATE"].append("win32lib" + project->first( "DSP_EXTENSION" ) ); |
747 | } | 866 | } |
748 | } | 867 | } |
749 | 868 | ||
750 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_WINDOWS"]; | 869 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_WINDOWS"]; |
870 | |||
871 | processPrlFiles(); | ||
751 | 872 | ||
873 | // Update -lname to name.lib, | ||
874 | QStringList &libs2 = project->variables()["QMAKE_LIBS"]; | ||
875 | for ( QStringList::Iterator libit2 = libs2.begin(); libit2 != libs2.end(); ++libit2 ) { | ||
876 | if ( (*libit2).startsWith( "-l" ) ) { | ||
877 | (*libit2) = (*libit2).mid( 2 ) + ".lib"; | ||
878 | } else if ( (*libit2).startsWith( "-L" ) ) { | ||
879 | project->variables()["QMAKE_LIBDIR"] += (*libit2).mid(2); | ||
880 | libit2 = libs2.remove( libit2 ); | ||
881 | } | ||
882 | } | ||
883 | |||
752 | project->variables()["MSVCDSP_LFLAGS" ] += project->variables()["QMAKE_LFLAGS"]; | 884 | project->variables()["MSVCDSP_LFLAGS" ] += project->variables()["QMAKE_LFLAGS"]; |
753 | if ( !project->variables()["QMAKE_LIBDIR"].isEmpty() ) | 885 | if ( !project->variables()["QMAKE_LIBDIR"].isEmpty() ) |
754 | project->variables()["MSVCDSP_LFLAGS" ].append(varGlue("QMAKE_LIBDIR","/LIBPATH:\"","\" /LIBPATH:\"","\"")); | 886 | project->variables()["MSVCDSP_LFLAGS" ].append(varGlue("QMAKE_LIBDIR","/LIBPATH:\"","\" /LIBPATH:\"","\"")); |
755 | project->variables()["MSVCDSP_CXXFLAGS" ] += project->variables()["QMAKE_CXXFLAGS"]; | 887 | project->variables()["MSVCDSP_CXXFLAGS" ] += project->variables()["QMAKE_CXXFLAGS"]; |
756 | project->variables()["MSVCDSP_DEFINES"].append(varGlue("DEFINES","/D ","" " /D ","")); | 888 | project->variables()["MSVCDSP_DEFINES"].append(varGlue("DEFINES","/D ","" " /D ","")); |
757 | project->variables()["MSVCDSP_DEFINES"].append(varGlue("PRL_EXPORT_DEFINES","/D ","" " /D ","")); | 889 | project->variables()["MSVCDSP_DEFINES"].append(varGlue("PRL_EXPORT_DEFINES","/D ","" " /D ","")); |
758 | 890 | ||
759 | processPrlFiles(); | 891 | if (!project->variables()["RES_FILE"].isEmpty()) |
892 | project->variables()["QMAKE_LIBS"] += project->variables()["RES_FILE"]; | ||
893 | |||
760 | QStringList &libs = project->variables()["QMAKE_LIBS"]; | 894 | QStringList &libs = project->variables()["QMAKE_LIBS"]; |
761 | for(QStringList::Iterator libit = libs.begin(); libit != libs.end(); ++libit) { | 895 | for(QStringList::Iterator libit = libs.begin(); libit != libs.end(); ++libit) { |
762 | QString lib = (*libit); | 896 | QString lib = (*libit); |
763 | lib.replace(QRegExp("\""), ""); | 897 | lib.replace(QRegExp("\""), ""); |
764 | project->variables()["MSVCDSP_LIBS"].append(" \"" + lib + "\""); | 898 | project->variables()["MSVCDSP_LIBS"].append(" \"" + lib + "\""); |
765 | } | 899 | } |
766 | 900 | ||
767 | QStringList &incs = project->variables()["INCLUDEPATH"]; | 901 | QStringList &incs = project->variables()["INCLUDEPATH"]; |
768 | for(QStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) { | 902 | for(QStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) { |
769 | QString inc = (*incit); | 903 | QString inc = (*incit); |
770 | inc.replace("\"", ""); | 904 | inc.replace("\"", ""); |
905 | if(inc.endsWith("\\")) // Remove trailing \'s from paths | ||
906 | inc.truncate(inc.length()-1); | ||
771 | project->variables()["MSVCDSP_INCPATH"].append("/I \"" + inc + "\""); | 907 | project->variables()["MSVCDSP_INCPATH"].append("/I \"" + inc + "\""); |
772 | } | 908 | } |
773 | 909 | ||
774 | project->variables()["MSVCDSP_INCPATH"].append("/I \"" + specdir() + "\""); | 910 | project->variables()["MSVCDSP_INCPATH"].append("/I \"" + specdir() + "\""); |
775 | if ( project->isActiveConfig("qt") ) { | 911 | if ( project->isActiveConfig("qt") ) { |
776 | project->variables()["MSVCDSP_RELDEFS"].append("/D \"QT_NO_DEBUG\""); | 912 | project->variables()["MSVCDSP_RELDEFS"].append("/D \"QT_NO_DEBUG\""); |
777 | } else { | 913 | } else { |
778 | project->variables()["MSVCDSP_RELDEFS"].clear(); | 914 | project->variables()["MSVCDSP_RELDEFS"].clear(); |
@@ -815,40 +951,37 @@ DspMakefileGenerator::init() | |||
815 | } | 951 | } |
816 | 952 | ||
817 | if ( project->isActiveConfig("activeqt") ) { | 953 | if ( project->isActiveConfig("activeqt") ) { |
818 | QString idl = project->variables()["QMAKE_IDL"].first(); | 954 | QString idl = project->variables()["QMAKE_IDL"].first(); |
819 | QString idc = project->variables()["QMAKE_IDC"].first(); | 955 | QString idc = project->variables()["QMAKE_IDC"].first(); |
820 | QString version = project->variables()["VERSION"].first(); | 956 | QString version = project->variables()["VERSION"].first(); |
821 | if ( version.isEmpty() ) | 957 | if ( version.isEmpty() ) |
822 | version = "1.0"; | 958 | version = "1.0"; |
823 | 959 | project->variables()["MSVCDSP_IDLSOURCES"].append( var("OBJECTS_DIR") + targetfilename + ".idl" ); | |
824 | project->variables()["MSVCDSP_IDLSOURCES"].append( "tmp\\" + targetfilename + ".idl" ); | ||
825 | project->variables()["MSVCDSP_IDLSOURCES"].append( "tmp\\" + targetfilename + ".tlb" ); | ||
826 | project->variables()["MSVCDSP_IDLSOURCES"].append( "tmp\\" + targetfilename + ".midl" ); | ||
827 | if ( project->isActiveConfig( "dll" ) ) { | 960 | if ( project->isActiveConfig( "dll" ) ) { |
828 | activeQtStepPreCopyDll += | 961 | activeQtStepPreCopyDll += |
829 | "\t" + idc + " %1 -idl tmp\\" + targetfilename + ".idl -version " + version + | 962 | "\t" + idc + " %1 -idl " + var("OBJECTS_DIR") + targetfilename + ".idl -version " + version + |
830 | "\t" + idl + " tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl" | 963 | "\t" + idl + " /nologo " + var("OBJECTS_DIR") + targetfilename + ".idl /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb" + |
831 | "\t" + idc + " %1 /tlb tmp\\" + targetfilename + ".tlb"; | 964 | "\t" + idc + " %2 /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"; |
832 | activeQtStepPostCopyDll += | 965 | activeQtStepPostCopyDll += |
833 | "\t" + idc + " %1 /regserver\n"; | 966 | "\t" + idc + " %1 /regserver\n"; |
834 | 967 | ||
835 | QString executable = project->variables()["MSVCDSP_TARGETDIRREL"].first() + "\\" + targetfilename + ".dll"; | 968 | QString executable = project->variables()["MSVCDSP_TARGETDIRREL"].first() + "\\" + targetfilename + ".dll"; |
836 | activeQtStepPreCopyDllRelease = activeQtStepPreCopyDll.arg(executable).arg(executable); | 969 | activeQtStepPreCopyDllRelease = activeQtStepPreCopyDll.arg(executable).arg(executable); |
837 | activeQtStepPostCopyDllRelease = activeQtStepPostCopyDll.arg(executable); | 970 | activeQtStepPostCopyDllRelease = activeQtStepPostCopyDll.arg(executable); |
838 | 971 | ||
839 | executable = project->variables()["MSVCDSP_TARGETDIRDEB"].first() + "\\" + targetfilename + ".dll"; | 972 | executable = project->variables()["MSVCDSP_TARGETDIRDEB"].first() + "\\" + targetfilename + ".dll"; |
840 | activeQtStepPreCopyDllDebug = activeQtStepPreCopyDll.arg(executable).arg(executable); | 973 | activeQtStepPreCopyDllDebug = activeQtStepPreCopyDll.arg(executable).arg(executable); |
841 | activeQtStepPostCopyDllDebug = activeQtStepPostCopyDll.arg(executable); | 974 | activeQtStepPostCopyDllDebug = activeQtStepPostCopyDll.arg(executable); |
842 | } else { | 975 | } else { |
843 | activeQtStepPreCopyDll += | 976 | activeQtStepPreCopyDll += |
844 | "\t%1 -dumpidl tmp\\" + targetfilename + ".idl -version " + version + | 977 | "\t%1 -dumpidl " + var("OBJECTS_DIR") + targetfilename + ".idl -version " + version + |
845 | "\t" + idl + " tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl" | 978 | "\t" + idl + " /nologo " + var("OBJECTS_DIR") + targetfilename + ".idl /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb" + |
846 | "\t" + idc + " %1 /tlb tmp\\" + targetfilename + ".tlb"; | 979 | "\t" + idc + " %2 /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"; |
847 | activeQtStepPostCopyDll += | 980 | activeQtStepPostCopyDll += |
848 | "\t%1 -regserver\n"; | 981 | "\t%1 -regserver\n"; |
849 | QString executable = project->variables()["MSVCDSP_TARGETDIRREL"].first() + "\\" + targetfilename + ".exe"; | 982 | QString executable = project->variables()["MSVCDSP_TARGETDIRREL"].first() + "\\" + targetfilename + ".exe"; |
850 | activeQtStepPreCopyDllRelease = activeQtStepPreCopyDll.arg(executable).arg(executable); | 983 | activeQtStepPreCopyDllRelease = activeQtStepPreCopyDll.arg(executable).arg(executable); |
851 | activeQtStepPostCopyDllRelease = activeQtStepPostCopyDll.arg(executable); | 984 | activeQtStepPostCopyDllRelease = activeQtStepPostCopyDll.arg(executable); |
852 | 985 | ||
853 | executable = project->variables()["MSVCDSP_TARGETDIRDEB"].first() + "\\" + targetfilename + ".exe"; | 986 | executable = project->variables()["MSVCDSP_TARGETDIRDEB"].first() + "\\" + targetfilename + ".exe"; |
854 | activeQtStepPreCopyDllDebug = activeQtStepPreCopyDll.arg(executable).arg(executable); | 987 | activeQtStepPreCopyDllDebug = activeQtStepPreCopyDll.arg(executable).arg(executable); |
@@ -876,17 +1009,17 @@ DspMakefileGenerator::init() | |||
876 | if ( !project->variables()["SOURCES"].isEmpty() || !project->variables()["RC_FILE"].isEmpty() ) { | 1009 | if ( !project->variables()["SOURCES"].isEmpty() || !project->variables()["RC_FILE"].isEmpty() ) { |
877 | project->variables()["SOURCES"] += project->variables()["RC_FILE"]; | 1010 | project->variables()["SOURCES"] += project->variables()["RC_FILE"]; |
878 | } | 1011 | } |
879 | QStringList &list = project->variables()["FORMS"]; | 1012 | QStringList &list = project->variables()["FORMS"]; |
880 | for( it = list.begin(); it != list.end(); ++it ) { | 1013 | for( it = list.begin(); it != list.end(); ++it ) { |
881 | if ( QFile::exists( *it + ".h" ) ) | 1014 | if ( QFile::exists( *it + ".h" ) ) |
882 | project->variables()["SOURCES"].append( *it + ".h" ); | 1015 | project->variables()["SOURCES"].append( *it + ".h" ); |
883 | } | 1016 | } |
884 | project->variables()["QMAKE_INTERNAL_PRL_LIBS"] << "MSVCDSP_LIBS"; | 1017 | project->variables()["QMAKE_INTERNAL_PRL_LIBS"] << "MSVCDSP_LIBS"; |
885 | } | 1018 | } |
886 | 1019 | ||
887 | 1020 | ||
888 | QString | 1021 | QString |
889 | DspMakefileGenerator::findTemplate(const QString &file) | 1022 | DspMakefileGenerator::findTemplate(const QString &file) |
890 | { | 1023 | { |
891 | QString ret; | 1024 | QString ret; |
892 | if(!QFile::exists((ret = file)) && | 1025 | if(!QFile::exists((ret = file)) && |
@@ -914,41 +1047,44 @@ DspMakefileGenerator::processPrlVariable(const QString &var, const QStringList & | |||
914 | 1047 | ||
915 | 1048 | ||
916 | void | 1049 | void |
917 | DspMakefileGenerator::beginGroupForFile(QString file, QTextStream &t, | 1050 | DspMakefileGenerator::beginGroupForFile(QString file, QTextStream &t, |
918 | const QString& filter) | 1051 | const QString& filter) |
919 | { | 1052 | { |
920 | if(project->isActiveConfig("flat")) | 1053 | if(project->isActiveConfig("flat")) |
921 | return; | 1054 | return; |
922 | |||
923 | fileFixify(file, QDir::currentDirPath(), QDir::currentDirPath(), TRUE); | 1055 | fileFixify(file, QDir::currentDirPath(), QDir::currentDirPath(), TRUE); |
924 | file = file.section(Option::dir_sep, 0, -2); | 1056 | file = file.section(Option::dir_sep, 0, -2); |
925 | if(file.right(Option::dir_sep.length()) != Option::dir_sep) | 1057 | if(file.right(Option::dir_sep.length()) != Option::dir_sep) |
926 | file += Option::dir_sep; | 1058 | file += Option::dir_sep; |
927 | if(file == currentGroup) | 1059 | if(file == currentGroup) |
928 | return; | 1060 | return; |
929 | 1061 | ||
930 | if(file.isEmpty() || !QDir::isRelativePath(file)) { | 1062 | if(file.isEmpty() || !QDir::isRelativePath(file)) { |
931 | endGroups(t); | 1063 | endGroups(t); |
932 | return; | 1064 | return; |
933 | } | 1065 | } |
934 | if(file.startsWith(currentGroup)) | 1066 | |
935 | file = file.mid(currentGroup.length()); | 1067 | QString tempFile = file; |
1068 | if(tempFile.startsWith(currentGroup)) | ||
1069 | tempFile = tempFile.mid(currentGroup.length()); | ||
936 | int dirSep = currentGroup.findRev( Option::dir_sep ); | 1070 | int dirSep = currentGroup.findRev( Option::dir_sep ); |
937 | while( !file.startsWith( currentGroup ) && dirSep != -1 ) { | 1071 | |
1072 | while( !tempFile.startsWith( currentGroup ) && dirSep != -1 ) { | ||
938 | currentGroup.truncate( dirSep ); | 1073 | currentGroup.truncate( dirSep ); |
939 | dirSep = currentGroup.findRev( Option::dir_sep ); | 1074 | dirSep = currentGroup.findRev( Option::dir_sep ); |
940 | if ( !file.startsWith( currentGroup ) && dirSep != -1 ) | 1075 | if ( !tempFile.startsWith( currentGroup ) && dirSep != -1 ) |
941 | t << "\n# End Group\n"; | 1076 | t << "\n# End Group\n"; |
942 | } | 1077 | } |
943 | if ( !file.startsWith( currentGroup ) ) { | 1078 | if ( !file.startsWith( currentGroup ) ) { |
944 | t << "\n# End Group\n"; | 1079 | t << "\n# End Group\n"; |
945 | currentGroup = ""; | 1080 | currentGroup = ""; |
946 | } | 1081 | } |
1082 | |||
947 | QStringList dirs = QStringList::split(Option::dir_sep, file.right( file.length() - currentGroup.length() ) ); | 1083 | QStringList dirs = QStringList::split(Option::dir_sep, file.right( file.length() - currentGroup.length() ) ); |
948 | for(QStringList::Iterator dir_it = dirs.begin(); dir_it != dirs.end(); ++dir_it) { | 1084 | for(QStringList::Iterator dir_it = dirs.begin(); dir_it != dirs.end(); ++dir_it) { |
949 | t << "# Begin Group \"" << (*dir_it) << "\"\n" | 1085 | t << "# Begin Group \"" << (*dir_it) << "\"\n" |
950 | << "# Prop Default_Filter \"" << filter << "\"\n"; | 1086 | << "# Prop Default_Filter \"" << filter << "\"\n"; |
951 | } | 1087 | } |
952 | currentGroup = file; | 1088 | currentGroup = file; |
953 | } | 1089 | } |
954 | 1090 | ||
@@ -968,16 +1104,18 @@ DspMakefileGenerator::endGroups(QTextStream &t) | |||
968 | currentGroup = ""; | 1104 | currentGroup = ""; |
969 | } | 1105 | } |
970 | 1106 | ||
971 | bool | 1107 | bool |
972 | DspMakefileGenerator::openOutput(QFile &file) const | 1108 | DspMakefileGenerator::openOutput(QFile &file) const |
973 | { | 1109 | { |
974 | QString outdir; | 1110 | QString outdir; |
975 | if(!file.name().isEmpty()) { | 1111 | if(!file.name().isEmpty()) { |
1112 | if(QDir::isRelativePath(file.name())) | ||
1113 | file.setName(Option::output_dir + file.name()); //pwd when qmake was run | ||
976 | QFileInfo fi(file); | 1114 | QFileInfo fi(file); |
977 | if(fi.isDir()) | 1115 | if(fi.isDir()) |
978 | outdir = file.name() + QDir::separator(); | 1116 | outdir = file.name() + QDir::separator(); |
979 | } | 1117 | } |
980 | if(!outdir.isEmpty() || file.name().isEmpty()) | 1118 | if(!outdir.isEmpty() || file.name().isEmpty()) |
981 | file.setName(outdir + project->first("TARGET") + project->first("DSP_EXTENSION")); | 1119 | file.setName(outdir + project->first("TARGET") + project->first("DSP_EXTENSION")); |
982 | if(QDir::isRelativePath(file.name())) { | 1120 | if(QDir::isRelativePath(file.name())) { |
983 | QString ofile; | 1121 | QString ofile; |
diff --git a/qmake/generators/win32/msvc_dsp.h b/qmake/generators/win32/msvc_dsp.h index 3a7d18e..0e86539 100644 --- a/qmake/generators/win32/msvc_dsp.h +++ b/qmake/generators/win32/msvc_dsp.h | |||
@@ -1,18 +1,16 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** |
3 | ** | 3 | ** |
4 | ** Definition of ________ class. | 4 | ** Definition of DspMakefileGenerator class. |
5 | ** | 5 | ** |
6 | ** Created : 970521 | 6 | ** Copyright (C) 1992-2003 Trolltech AS. All rights reserved. |
7 | ** | 7 | ** |
8 | ** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. | 8 | ** This file is part of qmake. |
9 | ** | ||
10 | ** This file is part of the network module of the Qt GUI Toolkit. | ||
11 | ** | 9 | ** |
12 | ** This file may be distributed under the terms of the Q Public License | 10 | ** This file may be distributed under the terms of the Q Public License |
13 | ** as defined by Trolltech AS of Norway and appearing in the file | 11 | ** as defined by Trolltech AS of Norway and appearing in the file |
14 | ** LICENSE.QPL included in the packaging of this file. | 12 | ** LICENSE.QPL included in the packaging of this file. |
15 | ** | 13 | ** |
16 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This file may be distributed and/or modified under the terms of the |
17 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** GNU General Public License version 2 as published by the Free Software |
18 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** Foundation and appearing in the file LICENSE.GPL included in the |
@@ -29,16 +27,17 @@ | |||
29 | ** information about Qt Commercial License Agreements. | 27 | ** information about Qt Commercial License Agreements. |
30 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. | 28 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. |
31 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
32 | ** | 30 | ** |
33 | ** Contact info@trolltech.com if any conditions of this licensing are | 31 | ** Contact info@trolltech.com if any conditions of this licensing are |
34 | ** not clear to you. | 32 | ** not clear to you. |
35 | ** | 33 | ** |
36 | **********************************************************************/ | 34 | **********************************************************************/ |
35 | |||
37 | #ifndef __MSVC_DSP_H__ | 36 | #ifndef __MSVC_DSP_H__ |
38 | #define __MSVC_DSP_H__ | 37 | #define __MSVC_DSP_H__ |
39 | 38 | ||
40 | #include "winmakefile.h" | 39 | #include "winmakefile.h" |
41 | #include <qvaluestack.h> | 40 | #include <qvaluestack.h> |
42 | 41 | ||
43 | class DspMakefileGenerator : public Win32MakefileGenerator | 42 | class DspMakefileGenerator : public Win32MakefileGenerator |
44 | { | 43 | { |
@@ -57,16 +56,20 @@ public: | |||
57 | DspMakefileGenerator(QMakeProject *p); | 56 | DspMakefileGenerator(QMakeProject *p); |
58 | ~DspMakefileGenerator(); | 57 | ~DspMakefileGenerator(); |
59 | 58 | ||
60 | bool openOutput(QFile &file) const; | 59 | bool openOutput(QFile &file) const; |
61 | 60 | ||
62 | protected: | 61 | protected: |
63 | virtual void processPrlVariable(const QString &, const QStringList &); | 62 | virtual void processPrlVariable(const QString &, const QStringList &); |
64 | virtual bool findLibraries(); | 63 | virtual bool findLibraries(); |
64 | |||
65 | QString precompH, | ||
66 | precompObj, precompPch; | ||
67 | bool usePCH; | ||
65 | }; | 68 | }; |
66 | 69 | ||
67 | inline DspMakefileGenerator::~DspMakefileGenerator() | 70 | inline DspMakefileGenerator::~DspMakefileGenerator() |
68 | { } | 71 | { } |
69 | 72 | ||
70 | inline bool DspMakefileGenerator::findLibraries() | 73 | inline bool DspMakefileGenerator::findLibraries() |
71 | { return Win32MakefileGenerator::findLibraries("MSVCDSP_LIBS"); } | 74 | { return Win32MakefileGenerator::findLibraries("MSVCDSP_LIBS"); } |
72 | 75 | ||
diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp index ecef34d..528cb19 100644 --- a/qmake/generators/win32/msvc_nmake.cpp +++ b/qmake/generators/win32/msvc_nmake.cpp | |||
@@ -1,18 +1,16 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** |
3 | ** | 3 | ** |
4 | ** Definition of ________ class. | 4 | ** Implementation of NmakeMakefileGenerator class. |
5 | ** | 5 | ** |
6 | ** Created : 970521 | 6 | ** Copyright (C) 1992-2003 Trolltech AS. All rights reserved. |
7 | ** | 7 | ** |
8 | ** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. | 8 | ** This file is part of qmake. |
9 | ** | ||
10 | ** This file is part of the network module of the Qt GUI Toolkit. | ||
11 | ** | 9 | ** |
12 | ** This file may be distributed under the terms of the Q Public License | 10 | ** This file may be distributed under the terms of the Q Public License |
13 | ** as defined by Trolltech AS of Norway and appearing in the file | 11 | ** as defined by Trolltech AS of Norway and appearing in the file |
14 | ** LICENSE.QPL included in the packaging of this file. | 12 | ** LICENSE.QPL included in the packaging of this file. |
15 | ** | 13 | ** |
16 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This file may be distributed and/or modified under the terms of the |
17 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** GNU General Public License version 2 as published by the Free Software |
18 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** Foundation and appearing in the file LICENSE.GPL included in the |
@@ -38,27 +36,31 @@ | |||
38 | #include "msvc_nmake.h" | 36 | #include "msvc_nmake.h" |
39 | #include "option.h" | 37 | #include "option.h" |
40 | #include <qregexp.h> | 38 | #include <qregexp.h> |
41 | #include <qdict.h> | 39 | #include <qdict.h> |
42 | #include <qdir.h> | 40 | #include <qdir.h> |
43 | #include <stdlib.h> | 41 | #include <stdlib.h> |
44 | #include <time.h> | 42 | #include <time.h> |
45 | 43 | ||
46 | |||
47 | NmakeMakefileGenerator::NmakeMakefileGenerator(QMakeProject *p) : Win32MakefileGenerator(p), init_flag(FALSE) | 44 | NmakeMakefileGenerator::NmakeMakefileGenerator(QMakeProject *p) : Win32MakefileGenerator(p), init_flag(FALSE) |
48 | { | 45 | { |
49 | 46 | ||
50 | } | 47 | } |
51 | 48 | ||
52 | bool | 49 | bool |
53 | NmakeMakefileGenerator::writeMakefile(QTextStream &t) | 50 | NmakeMakefileGenerator::writeMakefile(QTextStream &t) |
54 | { | 51 | { |
55 | writeHeader(t); | 52 | writeHeader(t); |
56 | if(!project->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) { | 53 | if(!project->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) { |
54 | { //write the extra unix targets.. | ||
55 | QStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"]; | ||
56 | for(QStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it) | ||
57 | t << *it << " "; | ||
58 | } | ||
57 | t << "all clean:" << "\n\t" | 59 | t << "all clean:" << "\n\t" |
58 | << "@echo \"Some of the required modules (" | 60 | << "@echo \"Some of the required modules (" |
59 | << var("QMAKE_FAILED_REQUIREMENTS") << ") are not available.\"" << "\n\t" | 61 | << var("QMAKE_FAILED_REQUIREMENTS") << ") are not available.\"" << "\n\t" |
60 | << "@echo \"Skipped.\"" << endl << endl; | 62 | << "@echo \"Skipped.\"" << endl << endl; |
61 | writeMakeQmake(t); | 63 | writeMakeQmake(t); |
62 | return TRUE; | 64 | return TRUE; |
63 | } | 65 | } |
64 | 66 | ||
@@ -69,16 +71,34 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t) | |||
69 | } | 71 | } |
70 | else if(project->first("TEMPLATE") == "subdirs") { | 72 | else if(project->first("TEMPLATE") == "subdirs") { |
71 | writeSubDirs(t); | 73 | writeSubDirs(t); |
72 | return TRUE; | 74 | return TRUE; |
73 | } | 75 | } |
74 | return FALSE; | 76 | return FALSE; |
75 | } | 77 | } |
76 | 78 | ||
79 | QStringList | ||
80 | &NmakeMakefileGenerator::findDependencies(const QString &file) | ||
81 | { | ||
82 | QStringList &aList = MakefileGenerator::findDependencies(file); | ||
83 | // Note: The QMAKE_IMAGE_COLLECTION file have all images | ||
84 | // as dependency, so don't add precompiled header then | ||
85 | if (file == project->first("QMAKE_IMAGE_COLLECTION")) | ||
86 | return aList; | ||
87 | for(QStringList::Iterator it = Option::cpp_ext.begin(); it != Option::cpp_ext.end(); ++it) { | ||
88 | if(file.endsWith(*it)) { | ||
89 | if(!aList.contains(precompH)) | ||
90 | aList += precompH; | ||
91 | break; | ||
92 | } | ||
93 | } | ||
94 | return aList; | ||
95 | } | ||
96 | |||
77 | void | 97 | void |
78 | NmakeMakefileGenerator::writeNmakeParts(QTextStream &t) | 98 | NmakeMakefileGenerator::writeNmakeParts(QTextStream &t) |
79 | { | 99 | { |
80 | t << "####### Compiler, tools and options" << endl << endl; | 100 | t << "####### Compiler, tools and options" << endl << endl; |
81 | t << "CC =" << var("QMAKE_CC") << endl; | 101 | t << "CC =" << var("QMAKE_CC") << endl; |
82 | t << "CXX =" << var("QMAKE_CXX") << endl; | 102 | t << "CXX =" << var("QMAKE_CXX") << endl; |
83 | t << "LEX = " << var("QMAKE_LEX") << endl; | 103 | t << "LEX = " << var("QMAKE_LEX") << endl; |
84 | t << "YACC = " << var("QMAKE_YACC") << endl; | 104 | t << "YACC = " << var("QMAKE_YACC") << endl; |
@@ -90,34 +110,34 @@ NmakeMakefileGenerator::writeNmakeParts(QTextStream &t) | |||
90 | << varGlue("DEFINES","-D"," -D","") << endl; | 110 | << varGlue("DEFINES","-D"," -D","") << endl; |
91 | t << "LEXFLAGS=" << var("QMAKE_LEXFLAGS") << endl; | 111 | t << "LEXFLAGS=" << var("QMAKE_LEXFLAGS") << endl; |
92 | t << "YACCFLAGS=" << var("QMAKE_YACCFLAGS") << endl; | 112 | t << "YACCFLAGS=" << var("QMAKE_YACCFLAGS") << endl; |
93 | 113 | ||
94 | t << "INCPATH ="; | 114 | t << "INCPATH ="; |
95 | QStringList &incs = project->variables()["INCLUDEPATH"]; | 115 | QStringList &incs = project->variables()["INCLUDEPATH"]; |
96 | for(QStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) { | 116 | for(QStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) { |
97 | QString inc = (*incit); | 117 | QString inc = (*incit); |
98 | inc.replace(QRegExp("\\\\$"), "\\\\"); | 118 | if (inc.endsWith("\\")) |
99 | inc.replace("\"", ""); | 119 | inc.truncate(inc.length()-1); |
100 | t << " -I\"" << inc << "\""; | 120 | t << " -I\"" << inc << "\""; |
101 | } | 121 | } |
102 | t << " -I\"" << specdir() << "\"" | 122 | t << " -I\"" << specdir() << "\"" |
103 | << endl; | 123 | << endl; |
104 | if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) { | 124 | if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) { |
105 | t << "LINK =" << var("QMAKE_LINK") << endl; | 125 | t << "LINK =" << var("QMAKE_LINK") << endl; |
106 | t << "LFLAGS =" << var("QMAKE_LFLAGS"); | 126 | t << "LFLAGS =" << var("QMAKE_LFLAGS"); |
107 | if ( !project->variables()["QMAKE_LIBDIR"].isEmpty() ) | 127 | if ( !project->variables()["QMAKE_LIBDIR"].isEmpty() ) |
108 | t << " " << varGlue("QMAKE_LIBDIR","/LIBPATH:\"","\" /LIBPATH:\"","\""); | 128 | t << " " << varGlue("QMAKE_LIBDIR","/LIBPATH:\"","\" /LIBPATH:\"","\""); |
109 | t << endl; | 129 | t << endl; |
110 | t << "LIBS ="; | 130 | t << "LIBS ="; |
111 | QStringList &libs = project->variables()["QMAKE_LIBS"]; | 131 | QStringList &libs = project->variables()["QMAKE_LIBS"]; |
112 | for(QStringList::Iterator libit = libs.begin(); libit != libs.end(); ++libit) { | 132 | for(QStringList::Iterator libit = libs.begin(); libit != libs.end(); ++libit) { |
113 | QString lib = (*libit); | 133 | QString lib = (*libit); |
114 | lib.replace(QRegExp("\\\\$"), "\\\\"); | 134 | if (lib.endsWith("\\")) |
115 | lib.replace(QRegExp("\""), ""); | 135 | lib.truncate(lib.length()-1); |
116 | t << " \"" << lib << "\""; | 136 | t << " \"" << lib << "\""; |
117 | } | 137 | } |
118 | t << endl; | 138 | t << endl; |
119 | } | 139 | } |
120 | else { | 140 | else { |
121 | t << "LIB =" << var("QMAKE_LIB") << endl; | 141 | t << "LIB =" << var("QMAKE_LIB") << endl; |
122 | } | 142 | } |
123 | t << "MOC =" << (project->isEmpty("QMAKE_MOC") ? QString("moc") : | 143 | t << "MOC =" << (project->isEmpty("QMAKE_MOC") ? QString("moc") : |
@@ -133,55 +153,77 @@ NmakeMakefileGenerator::writeNmakeParts(QTextStream &t) | |||
133 | t << "ZIP =" << var("QMAKE_ZIP") << endl; | 153 | t << "ZIP =" << var("QMAKE_ZIP") << endl; |
134 | t << "COPY_FILE= " << var("QMAKE_COPY") << endl; | 154 | t << "COPY_FILE= " << var("QMAKE_COPY") << endl; |
135 | t << "COPY_DIR= " << var("QMAKE_COPY") << endl; | 155 | t << "COPY_DIR= " << var("QMAKE_COPY") << endl; |
136 | t << "DEL_FILE= " << var("QMAKE_DEL_FILE") << endl; | 156 | t << "DEL_FILE= " << var("QMAKE_DEL_FILE") << endl; |
137 | t << "DEL_DIR= " << var("QMAKE_DEL_DIR") << endl; | 157 | t << "DEL_DIR= " << var("QMAKE_DEL_DIR") << endl; |
138 | t << "MOVE = " << var("QMAKE_MOVE") << endl; | 158 | t << "MOVE = " << var("QMAKE_MOVE") << endl; |
139 | t << "CHK_DIR_EXISTS =" << var("QMAKE_CHK_DIR_EXISTS") << endl; | 159 | t << "CHK_DIR_EXISTS =" << var("QMAKE_CHK_DIR_EXISTS") << endl; |
140 | t << "MKDIR =" << var("QMAKE_MKDIR") << endl; | 160 | t << "MKDIR =" << var("QMAKE_MKDIR") << endl; |
161 | t << "INSTALL_FILE= " << var("QMAKE_INSTALL_FILE") << endl; | ||
162 | t << "INSTALL_DIR = " << var("QMAKE_INSTALL_DIR") << endl; | ||
141 | t << endl; | 163 | t << endl; |
142 | 164 | ||
143 | t << "####### Files" << endl << endl; | 165 | t << "####### Files" << endl << endl; |
144 | t << "HEADERS =" << varList("HEADERS") << endl; | 166 | t << "HEADERS =" << varList("HEADERS") << endl; |
145 | t << "SOURCES =" << varList("SOURCES") << endl; | 167 | t << "SOURCES =" << varList("SOURCES") << endl; |
146 | t << "OBJECTS =" << varList("OBJECTS") << endl; | 168 | t << "OBJECTS =" << varList("OBJECTS") << endl; |
147 | t << "FORMS =" << varList("FORMS") << endl; | 169 | t << "FORMS =" << varList("FORMS") << endl; |
148 | t << "UICDECLS =" << varList("UICDECLS") << endl; | 170 | t << "UICDECLS =" << varList("UICDECLS") << endl; |
149 | t << "UICIMPLS =" << varList("UICIMPLS") << endl; | 171 | t << "UICIMPLS =" << varList("UICIMPLS") << endl; |
150 | t << "SRCMOC =" << varList("SRCMOC") << endl; | 172 | t << "SRCMOC =" << varList("SRCMOC") << endl; |
151 | t << "OBJMOC =" << varList("OBJMOC") << endl; | 173 | t << "OBJMOC =" << varList("OBJMOC") << endl; |
174 | |||
175 | QString extraCompilerDeps; | ||
176 | if(!project->isEmpty("QMAKE_EXTRA_WIN_COMPILERS")) { | ||
177 | t << "OBJCOMP = " << varList("OBJCOMP") << endl; | ||
178 | extraCompilerDeps += " $(OBJCOMP) "; | ||
179 | |||
180 | QStringList &comps = project->variables()["QMAKE_EXTRA_WIN_COMPILERS"]; | ||
181 | for(QStringList::Iterator compit = comps.begin(); compit != comps.end(); ++compit) { | ||
182 | QStringList &vars = project->variables()[(*compit) + ".variables"]; | ||
183 | for(QStringList::Iterator varit = vars.begin(); varit != vars.end(); ++varit) { | ||
184 | QStringList vals = project->variables()[(*varit)]; | ||
185 | if(!vals.isEmpty()) | ||
186 | t << "QMAKE_COMP_" << (*varit) << " = " << valList(vals) << endl; | ||
187 | } | ||
188 | } | ||
189 | } | ||
190 | |||
152 | t << "DIST =" << varList("DISTFILES") << endl; | 191 | t << "DIST =" << varList("DISTFILES") << endl; |
153 | t << "TARGET ="; | 192 | t << "TARGET ="; |
154 | if( !project->variables()[ "DESTDIR" ].isEmpty() ) | 193 | if( !project->variables()[ "DESTDIR" ].isEmpty() ) |
155 | t << varGlue("TARGET",project->first("DESTDIR"),"",project->first("TARGET_EXT")); | 194 | t << varGlue("TARGET",project->first("DESTDIR"),"",project->first("TARGET_EXT")); |
156 | else | 195 | else |
157 | t << project->variables()[ "TARGET" ].first() << project->variables()[ "TARGET_EXT" ].first(); | 196 | t << project->variables()[ "TARGET" ].first() << project->variables()[ "TARGET_EXT" ].first(); |
158 | t << endl; | 197 | t << endl; |
159 | t << endl; | 198 | t << endl; |
160 | 199 | ||
161 | t << "####### Implicit rules" << endl << endl; | 200 | t << "####### Implicit rules" << endl << endl; |
162 | t << ".SUFFIXES: .c"; | 201 | t << ".SUFFIXES: .c"; |
163 | QStringList::Iterator cppit; | 202 | QStringList::Iterator cppit; |
164 | for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) | 203 | for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) |
165 | t << " " << (*cppit); | 204 | t << " " << (*cppit); |
166 | t << endl << endl; | 205 | t << endl << endl; |
206 | |||
167 | if(!project->isActiveConfig("no_batch")) { | 207 | if(!project->isActiveConfig("no_batch")) { |
168 | // Batchmode doesn't use the non implicit rules QMAKE_RUN_CXX & QMAKE_RUN_CC | 208 | // Batchmode doesn't use the non implicit rules QMAKE_RUN_CXX & QMAKE_RUN_CC |
169 | project->variables().remove("QMAKE_RUN_CXX"); | 209 | project->variables().remove("QMAKE_RUN_CXX"); |
170 | project->variables().remove("QMAKE_RUN_CC"); | 210 | project->variables().remove("QMAKE_RUN_CC"); |
171 | 211 | ||
172 | QDict<void> source_directories; | 212 | QDict<void> source_directories; |
173 | source_directories.insert(".", (void*)1); | 213 | source_directories.insert(".", (void*)1); |
174 | if(!project->isEmpty("MOC_DIR")) | 214 | QString directories[] = { QString("MOC_DIR"), QString("UI_SOURCES_DIR"), QString("UI_DIR"), QString::null }; |
175 | source_directories.insert(project->first("MOC_DIR"), (void*)1); | 215 | for(int y = 0; !directories[y].isNull(); y++) { |
176 | if(!project->isEmpty("UI_SOURCES_DIR")) | 216 | QString dirTemp = project->first(directories[y]); |
177 | source_directories.insert(project->first("UI_SOURCES_DIR"), (void*)1); | 217 | if (dirTemp.endsWith("\\")) |
178 | else if(!project->isEmpty("UI_DIR")) | 218 | dirTemp.truncate(dirTemp.length()-1); |
179 | source_directories.insert(project->first("UI_DIR"), (void*)1); | 219 | if(!dirTemp.isEmpty()) |
220 | source_directories.insert(dirTemp, (void*)1); | ||
221 | } | ||
180 | QString srcs[] = { QString("SOURCES"), QString("UICIMPLS"), QString("SRCMOC"), QString::null }; | 222 | QString srcs[] = { QString("SOURCES"), QString("UICIMPLS"), QString("SRCMOC"), QString::null }; |
181 | for(int x = 0; !srcs[x].isNull(); x++) { | 223 | for(int x = 0; !srcs[x].isNull(); x++) { |
182 | QStringList &l = project->variables()[srcs[x]]; | 224 | QStringList &l = project->variables()[srcs[x]]; |
183 | for(QStringList::Iterator sit = l.begin(); sit != l.end(); ++sit) { | 225 | for(QStringList::Iterator sit = l.begin(); sit != l.end(); ++sit) { |
184 | QString sep = "\\"; | 226 | QString sep = "\\"; |
185 | if((*sit).find(sep) == -1) | 227 | if((*sit).find(sep) == -1) |
186 | sep = "/"; | 228 | sep = "/"; |
187 | QString dir = (*sit).section(sep, 0, -2); | 229 | QString dir = (*sit).section(sep, 0, -2); |
@@ -201,109 +243,218 @@ NmakeMakefileGenerator::writeNmakeParts(QTextStream &t) | |||
201 | } | 243 | } |
202 | } else { | 244 | } else { |
203 | for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) | 245 | for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) |
204 | t << (*cppit) << Option::obj_ext << ":\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl; | 246 | t << (*cppit) << Option::obj_ext << ":\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl; |
205 | t << ".c" << Option::obj_ext << ":\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl; | 247 | t << ".c" << Option::obj_ext << ":\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl; |
206 | } | 248 | } |
207 | 249 | ||
208 | t << "####### Build rules" << endl << endl; | 250 | t << "####### Build rules" << endl << endl; |
209 | t << "all: " << varGlue("ALL_DEPS",""," "," ") << "$(TARGET)" << endl << endl; | 251 | t << "all: " << fileFixify(Option::output.name()) << " " << varGlue("ALL_DEPS"," "," "," ") << "$(TARGET)" << endl << endl; |
210 | t << "$(TARGET): " << var("PRE_TARGETDEPS") << " $(UICDECLS) $(OBJECTS) $(OBJMOC) " | 252 | t << "$(TARGET): " << var("PRE_TARGETDEPS") << " $(UICDECLS) $(OBJECTS) $(OBJMOC) " |
211 | << var("POST_TARGETDEPS"); | 253 | << extraCompilerDeps << var("POST_TARGETDEPS"); |
212 | if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) { | 254 | if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) { |
213 | t << "\n\t" << "$(LINK) $(LFLAGS) /OUT:$(TARGET) @<< " << "\n\t " | 255 | t << "\n\t" << "$(LINK) $(LFLAGS) /OUT:$(TARGET) @<< " << "\n\t " |
214 | << "$(OBJECTS) $(OBJMOC) $(LIBS)"; | 256 | << "$(OBJECTS) $(OBJMOC) $(LIBS)"; |
215 | } else { | 257 | } else { |
216 | t << "\n\t" << "$(LIB) /OUT:$(TARGET) @<<" << "\n\t " | 258 | t << "\n\t" << "$(LIB) /OUT:$(TARGET) @<<" << "\n\t " |
217 | << "$(OBJECTS) $(OBJMOC)"; | 259 | << "$(OBJECTS) $(OBJMOC)"; |
218 | } | 260 | } |
261 | t << extraCompilerDeps; | ||
219 | t << endl << "<<" << endl; | 262 | t << endl << "<<" << endl; |
220 | if ( !project->variables()["QMAKE_POST_LINK"].isEmpty() ) | 263 | if ( !project->variables()["QMAKE_POST_LINK"].isEmpty() ) |
221 | t << "\t" << var( "QMAKE_POST_LINK" ) << endl; | 264 | t << "\t" << var( "QMAKE_POST_LINK" ) << endl; |
222 | if(project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty()) { | 265 | if(project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty()) { |
223 | QStringList dlldirs = project->variables()["DLLDESTDIR"]; | 266 | QStringList dlldirs = project->variables()["DLLDESTDIR"]; |
224 | for ( QStringList::Iterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) { | 267 | for ( QStringList::Iterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) { |
225 | t << "\n\t" << "-copy $(TARGET) " << *dlldir; | 268 | t << "\n\t" << "-$(COPY_FILE) \"$(TARGET)\" " << *dlldir; |
226 | } | 269 | } |
227 | } | 270 | } |
228 | QString targetfilename = project->variables()["TARGET"].first(); | 271 | QString targetfilename = project->variables()["TARGET"].first(); |
229 | if(project->isActiveConfig("activeqt")) { | 272 | if(project->isActiveConfig("activeqt")) { |
230 | QString version = project->variables()["VERSION"].first(); | 273 | QString version = project->variables()["VERSION"].first(); |
231 | if ( version.isEmpty() ) | 274 | if ( version.isEmpty() ) |
232 | version = "1.0"; | 275 | version = "1.0"; |
233 | 276 | ||
234 | if ( project->isActiveConfig("dll")) { | 277 | if ( project->isActiveConfig("dll")) { |
235 | t << "\n\t" << ("-$(IDC) $(TARGET) /idl tmp\\" + targetfilename + ".idl -version " + version); | 278 | t << "\n\t" << ("-$(IDC) $(TARGET) /idl " + var("OBJECTS_DIR") + targetfilename + ".idl -version " + version); |
236 | t << "\n\t" << ("-$(IDL) tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl"); | 279 | t << "\n\t" << ("-$(IDL) /nologo " + var("OBJECTS_DIR") + targetfilename + ".idl /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
237 | t << "\n\t" << ("-$(IDC) $(TARGET) /tlb tmp\\" + targetfilename + ".tlb"); | 280 | t << "\n\t" << ("-$(IDC) $(TARGET) /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
238 | t << "\n\t" << ("-$(IDC) $(TARGET) /regserver" ); | 281 | t << "\n\t" << ("-$(IDC) $(TARGET) /regserver" ); |
239 | } else { | 282 | } else { |
240 | t << "\n\t" << ("-$(TARGET) -dumpidl tmp\\" + targetfilename + ".idl -version " + version); | 283 | t << "\n\t" << ("-$(TARGET) -dumpidl " + var("OBJECTS_DIR") + targetfilename + ".idl -version " + version); |
241 | t << "\n\t" << ("-$(IDL) tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl"); | 284 | t << "\n\t" << ("-$(IDL) /nologo " + var("OBJECTS_DIR") + targetfilename + ".idl /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
242 | t << "\n\t" << ("-$(IDC) $(TARGET) /tlb tmp\\" + targetfilename + ".tlb"); | 285 | t << "\n\t" << ("-$(IDC) $(TARGET) /tlb " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
243 | t << "\n\t" << "-$(TARGET) -regserver"; | 286 | t << "\n\t" << "-$(TARGET) -regserver"; |
244 | } | 287 | } |
245 | } | 288 | } |
246 | t << endl << endl; | 289 | t << endl << endl; |
247 | 290 | ||
248 | if(!project->variables()["RC_FILE"].isEmpty()) { | 291 | if(!project->variables()["RC_FILE"].isEmpty()) { |
249 | t << var("RES_FILE") << ": " << var("RC_FILE") << "\n\t" | 292 | t << var("RES_FILE") << ": " << var("RC_FILE") << "\n\t" |
250 | << var("QMAKE_RC") << " " << var("RC_FILE") << endl << endl; | 293 | << var("QMAKE_RC") << " " << var("RC_FILE") << endl << endl; |
251 | } | 294 | } |
252 | 295 | ||
253 | t << "mocables: $(SRCMOC)" << endl << endl; | 296 | t << "mocables: $(SRCMOC)" << endl |
297 | << "uicables: $(UICIMPLS) $(UICDECLS)" << endl << endl; | ||
254 | 298 | ||
255 | writeMakeQmake(t); | 299 | writeMakeQmake(t); |
256 | 300 | ||
301 | QStringList dist_files = Option::mkfile::project_files; | ||
302 | if(!project->isEmpty("QMAKE_INTERNAL_INCLUDED_FILES")) | ||
303 | dist_files += project->variables()["QMAKE_INTERNAL_INCLUDED_FILES"]; | ||
304 | if(!project->isEmpty("TRANSLATIONS")) | ||
305 | dist_files << var("TRANSLATIONS"); | ||
306 | if(!project->isEmpty("FORMS")) { | ||
307 | QStringList &forms = project->variables()["FORMS"]; | ||
308 | for(QStringList::Iterator formit = forms.begin(); formit != forms.end(); ++formit) { | ||
309 | QString ui_h = fileFixify((*formit) + Option::h_ext.first()); | ||
310 | if(QFile::exists(ui_h) ) | ||
311 | dist_files << ui_h; | ||
312 | } | ||
313 | } | ||
257 | t << "dist:" << "\n\t" | 314 | t << "dist:" << "\n\t" |
258 | << "$(ZIP) " << var("PROJECT") << ".zip " | 315 | << "$(ZIP) " << var("QMAKE_ORIG_TARGET") << ".zip " << "$(SOURCES) $(HEADERS) $(DIST) $(FORMS) " |
259 | << var("PROJECT") << ".pro $(SOURCES) $(HEADERS) $(DIST) $(FORMS)" << endl << endl; | 316 | << dist_files.join(" ") << " " << var("TRANSLATIONS") << " " << var("IMAGES") << endl << endl; |
260 | 317 | ||
261 | t << "clean:" | 318 | t << "uiclean:" |
262 | << varGlue("OBJECTS","\n\t-del ","\n\t-del ","") | 319 | << varGlue("UICDECLS" ,"\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","") |
263 | << varGlue("SRCMOC" ,"\n\t-del ","\n\t-del ","") | 320 | << varGlue("UICIMPLS" ,"\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","") << endl; |
264 | << varGlue("OBJMOC" ,"\n\t-del ","\n\t-del ","") | 321 | |
265 | << varGlue("UICDECLS" ,"\n\t-del ","\n\t-del ","") | 322 | t << "mocclean:" |
266 | << varGlue("UICIMPLS" ,"\n\t-del ","\n\t-del ","") | 323 | << varGlue("SRCMOC" ,"\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","") |
267 | << varGlue("QMAKE_CLEAN","\n\t-del ","\n\t-del ","") | 324 | << varGlue("OBJMOC" ,"\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","") << endl; |
268 | << varGlue("CLEAN_FILES","\n\t-del ","\n\t-del ",""); | 325 | |
269 | 326 | t << "clean: uiclean mocclean" | |
327 | << varGlue("OBJECTS","\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","") | ||
328 | << varGlue("QMAKE_CLEAN","\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","\n") | ||
329 | << varGlue("CLEAN_FILES","\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ","\n"); | ||
270 | if ( project->isActiveConfig("activeqt")) { | 330 | if ( project->isActiveConfig("activeqt")) { |
271 | t << ("\n\t-del tmp\\" + targetfilename + ".*"); | 331 | t << ("\n\t-$(DEL_FILE) " + var("OBJECTS_DIR") + targetfilename + ".idl"); |
272 | t << "\n\t-del tmp\\dump.*"; | 332 | t << ("\n\t-$(DEL_FILE) " + var("OBJECTS_DIR") + targetfilename + ".tlb"); |
273 | } | 333 | } |
274 | if(!project->isEmpty("IMAGES")) | 334 | if(!project->isEmpty("IMAGES")) |
275 | t << varGlue("QMAKE_IMAGE_COLLECTION", "\n\t-del ", "\n\t-del ", ""); | 335 | t << varGlue("QMAKE_IMAGE_COLLECTION", "\n\t-$(DEL_FILE) ", "\n\t-$(DEL_FILE) ", ""); |
336 | t << endl; | ||
337 | |||
338 | // user defined targets | ||
276 | 339 | ||
277 | // blasted user defined targets | 340 | QStringList::Iterator it; |
278 | QStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"]; | 341 | QStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"]; |
279 | for(QStringList::Iterator it = qut.begin(); it != qut.end(); ++it) { | 342 | for(it = qut.begin(); it != qut.end(); ++it) { |
280 | QString targ = var((*it) + ".target"), | 343 | QString targ = var((*it) + ".target"), |
281 | cmd = var((*it) + ".commands"), deps; | 344 | cmd = var((*it) + ".commands"), deps; |
282 | if(targ.isEmpty()) | 345 | if(targ.isEmpty()) |
283 | targ = (*it); | 346 | targ = (*it); |
284 | QStringList &deplist = project->variables()[(*it) + ".depends"]; | 347 | QStringList &deplist = project->variables()[(*it) + ".depends"]; |
285 | for(QStringList::Iterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) { | 348 | for(QStringList::Iterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) { |
286 | QString dep = var((*dep_it) + ".target"); | 349 | QString dep = var((*dep_it) + ".target"); |
287 | if(dep.isEmpty()) | 350 | if(dep.isEmpty()) |
288 | dep = (*dep_it); | 351 | dep = (*dep_it); |
289 | deps += " " + dep; | 352 | deps += " " + dep; |
290 | } | 353 | } |
354 | if(!project->variables()["QMAKE_NOFORCE"].isEmpty() && | ||
355 | project->variables()[(*it) + ".CONFIG"].findIndex("phony") != -1) | ||
356 | deps += QString(" ") + "FORCE"; | ||
291 | t << "\n\n" << targ << ":" << deps << "\n\t" | 357 | t << "\n\n" << targ << ":" << deps << "\n\t" |
292 | << cmd; | 358 | << cmd; |
293 | } | 359 | } |
294 | |||
295 | t << endl << endl; | 360 | t << endl << endl; |
296 | 361 | ||
362 | QStringList &quc = project->variables()["QMAKE_EXTRA_WIN_COMPILERS"]; | ||
363 | for(it = quc.begin(); it != quc.end(); ++it) { | ||
364 | QString tmp_out = project->variables()[(*it) + ".output"].first(); | ||
365 | QString tmp_cmd = project->variables()[(*it) + ".commands"].join(" "); | ||
366 | QString tmp_dep = project->variables()[(*it) + ".depends"].join(" "); | ||
367 | QStringList &vars = project->variables()[(*it) + ".variables"]; | ||
368 | if(tmp_out.isEmpty() || tmp_cmd.isEmpty()) | ||
369 | continue; | ||
370 | QStringList &tmp = project->variables()[(*it) + ".input"]; | ||
371 | for(QStringList::Iterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) { | ||
372 | QStringList &inputs = project->variables()[(*it2)]; | ||
373 | for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) { | ||
374 | QFileInfo fi(Option::fixPathToLocalOS((*input))); | ||
375 | QString in = Option::fixPathToTargetOS((*input), FALSE), | ||
376 | out = tmp_out, cmd = tmp_cmd, deps; | ||
377 | out.replace("${QMAKE_FILE_BASE}", fi.baseName()); | ||
378 | out.replace("${QMAKE_FILE_NAME}", fi.fileName()); | ||
379 | cmd.replace("${QMAKE_FILE_BASE}", fi.baseName()); | ||
380 | cmd.replace("${QMAKE_FILE_OUT}", out); | ||
381 | cmd.replace("${QMAKE_FILE_NAME}", fi.fileName()); | ||
382 | for(QStringList::Iterator it3 = vars.begin(); it3 != vars.end(); ++it3) | ||
383 | cmd.replace("$(" + (*it3) + ")", "$(QMAKE_COMP_" + (*it3)+")"); | ||
384 | if(!tmp_dep.isEmpty()) { | ||
385 | char buff[256]; | ||
386 | QString dep_cmd = tmp_dep; | ||
387 | dep_cmd.replace("${QMAKE_FILE_NAME}", fi.fileName()); | ||
388 | if(FILE *proc = QT_POPEN(dep_cmd.latin1(), "r")) { | ||
389 | while(!feof(proc)) { | ||
390 | int read_in = int(fread(buff, 1, 255, proc)); | ||
391 | if(!read_in) | ||
392 | break; | ||
393 | int l = 0; | ||
394 | for(int i = 0; i < read_in; i++) { | ||
395 | if(buff[i] == '\n' || buff[i] == ' ') { | ||
396 | deps += " " + QCString(buff+l, (i - l) + 1); | ||
397 | l = i; | ||
398 | } | ||
399 | } | ||
400 | } | ||
401 | fclose(proc); | ||
402 | } | ||
403 | } | ||
404 | t << out << ": " << in << deps << "\n\t" | ||
405 | << cmd << endl << endl; | ||
406 | } | ||
407 | } | ||
408 | } | ||
409 | t << endl; | ||
410 | |||
411 | if(project->variables()["QMAKE_NOFORCE"].isEmpty()) | ||
412 | t << "FORCE:" << endl << endl; | ||
413 | |||
297 | t << "distclean: clean" | 414 | t << "distclean: clean" |
298 | << "\n\t-del $(TARGET)" | 415 | << "\n\t-$(DEL_FILE) $(TARGET)" |
299 | << endl << endl; | 416 | << endl << endl; |
417 | |||
418 | // precompiled header | ||
419 | if(usePCH) { | ||
420 | QString precompRule = QString("-c -Yc -Fp%1 -Fo%2").arg(precompPch).arg(precompObj); | ||
421 | t << precompObj << ": " << precompH << " " << findDependencies(precompH).join(" \\\n\t\t") | ||
422 | << "\n\t" << "$(CXX) " + precompRule +" $(CXXFLAGS) $(INCPATH) -TP " << precompH << endl << endl; | ||
423 | } | ||
300 | } | 424 | } |
301 | 425 | ||
426 | QString | ||
427 | NmakeMakefileGenerator::var(const QString &value) | ||
428 | { | ||
429 | if (usePCH) { | ||
430 | if ((value == "QMAKE_RUN_CXX_IMP_BATCH" | ||
431 | || value == "QMAKE_RUN_CXX_IMP" | ||
432 | || value == "QMAKE_RUN_CXX")) { | ||
433 | QFileInfo precompHInfo(precompH); | ||
434 | QString precompRule = QString("-c -FI%1 -Yu%2 -Fp%3") | ||
435 | .arg(precompHInfo.fileName()) | ||
436 | .arg(precompHInfo.fileName()) | ||
437 | .arg(precompPch); | ||
438 | QString p = MakefileGenerator::var(value); | ||
439 | p.replace("-c", precompRule); | ||
440 | // Cannot use -Gm with -FI & -Yu, as this gives an | ||
441 | // internal compiler error, on the newer compilers | ||
442 | p.remove("-Gm"); | ||
443 | return p; | ||
444 | } else if (value == "QMAKE_CXXFLAGS") { | ||
445 | // Remove internal compiler error option | ||
446 | return MakefileGenerator::var(value).remove("-Gm"); | ||
447 | } | ||
448 | } | ||
449 | |||
450 | // Normal val | ||
451 | return MakefileGenerator::var(value); | ||
452 | } | ||
302 | 453 | ||
303 | void | 454 | void |
304 | NmakeMakefileGenerator::init() | 455 | NmakeMakefileGenerator::init() |
305 | { | 456 | { |
306 | if(init_flag) | 457 | if(init_flag) |
307 | return; | 458 | return; |
308 | init_flag = TRUE; | 459 | init_flag = TRUE; |
309 | 460 | ||
@@ -316,25 +467,36 @@ NmakeMakefileGenerator::init() | |||
316 | MakefileGenerator::init(); | 467 | MakefileGenerator::init(); |
317 | if(project->variables()["MAKEFILE"].isEmpty()) | 468 | if(project->variables()["MAKEFILE"].isEmpty()) |
318 | project->variables()["MAKEFILE"].append("Makefile"); | 469 | project->variables()["MAKEFILE"].append("Makefile"); |
319 | if(project->variables()["QMAKE"].isEmpty()) | 470 | if(project->variables()["QMAKE"].isEmpty()) |
320 | project->variables()["QMAKE"].append("qmake"); | 471 | project->variables()["QMAKE"].append("qmake"); |
321 | return; | 472 | return; |
322 | } | 473 | } |
323 | 474 | ||
475 | if(project->isEmpty("QMAKE_INSTALL_FILE")) | ||
476 | project->variables()["QMAKE_INSTALL_FILE"].append("$(COPY_FILE)"); | ||
477 | if(project->isEmpty("QMAKE_INSTALL_DIR")) | ||
478 | project->variables()["QMAKE_INSTALL_DIR"].append("$(COPY_DIR)"); | ||
479 | |||
324 | bool is_qt = (project->first("TARGET") == "qt"QTDLL_POSTFIX || project->first("TARGET") == "qt-mt"QTDLL_POSTFIX); | 480 | bool is_qt = (project->first("TARGET") == "qt"QTDLL_POSTFIX || project->first("TARGET") == "qt-mt"QTDLL_POSTFIX); |
325 | project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"]; | 481 | project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"]; |
326 | 482 | ||
327 | QString targetfilename = project->variables()["TARGET"].first(); | 483 | QString targetfilename = project->variables()["TARGET"].first(); |
328 | QStringList &configs = project->variables()["CONFIG"]; | 484 | QStringList &configs = project->variables()["CONFIG"]; |
329 | if (project->isActiveConfig("qt") && project->isActiveConfig("shared")) | 485 | if (project->isActiveConfig("qt") && project->isActiveConfig("shared")) |
330 | project->variables()["DEFINES"].append("QT_DLL"); | 486 | project->variables()["DEFINES"].append("QT_DLL"); |
331 | if (project->isActiveConfig("qt_dll")) | 487 | if (project->isActiveConfig("qt_dll")) |
332 | if(configs.findIndex("qt") == -1) configs.append("qt"); | 488 | if(configs.findIndex("qt") == -1) configs.append("qt"); |
489 | if ( project->isActiveConfig("qtopia") ) { | ||
490 | if(configs.findIndex("qtopialib") == -1) | ||
491 | configs.append("qtopialib"); | ||
492 | if(configs.findIndex("qtopiainc") == -1) | ||
493 | configs.append("qtopiainc"); | ||
494 | } | ||
333 | if ( project->isActiveConfig("qt") ) { | 495 | if ( project->isActiveConfig("qt") ) { |
334 | if ( project->isActiveConfig( "plugin" ) ) { | 496 | if ( project->isActiveConfig( "plugin" ) ) { |
335 | project->variables()["CONFIG"].append("dll"); | 497 | project->variables()["CONFIG"].append("dll"); |
336 | if(project->isActiveConfig("qt")) | 498 | if(project->isActiveConfig("qt")) |
337 | project->variables()["DEFINES"].append("QT_PLUGIN"); | 499 | project->variables()["DEFINES"].append("QT_PLUGIN"); |
338 | } | 500 | } |
339 | if ( (project->variables()["DEFINES"].findIndex("QT_NODLL") == -1) && | 501 | if ( (project->variables()["DEFINES"].findIndex("QT_NODLL") == -1) && |
340 | ((project->variables()["DEFINES"].findIndex("QT_MAKEDLL") != -1 || | 502 | ((project->variables()["DEFINES"].findIndex("QT_MAKEDLL") != -1 || |
@@ -396,16 +558,23 @@ NmakeMakefileGenerator::init() | |||
396 | && !is_qt && project->first("TARGET") != "qtmain") { | 558 | && !is_qt && project->first("TARGET") != "qtmain") { |
397 | project->variables()["QMAKE_LFLAGS"].append("/NODEFAULTLIB:\"libc\""); | 559 | project->variables()["QMAKE_LFLAGS"].append("/NODEFAULTLIB:\"libc\""); |
398 | } | 560 | } |
399 | 561 | ||
400 | if ( !project->variables()["QMAKE_INCDIR"].isEmpty()) | 562 | if ( !project->variables()["QMAKE_INCDIR"].isEmpty()) |
401 | project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR"]; | 563 | project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR"]; |
402 | if ( project->isActiveConfig("qt") || project->isActiveConfig("opengl") ) | 564 | if ( project->isActiveConfig("qt") || project->isActiveConfig("opengl") ) |
403 | project->variables()["CONFIG"].append("windows"); | 565 | project->variables()["CONFIG"].append("windows"); |
566 | if ( project->isActiveConfig("qtopiainc") ) | ||
567 | project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_QTOPIA"]; | ||
568 | if ( project->isActiveConfig("qtopialib") ) { | ||
569 | if(!project->isEmpty("QMAKE_LIBDIR_QTOPIA")) | ||
570 | project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QTOPIA"]; | ||
571 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QTOPIA"]; | ||
572 | } | ||
404 | if ( project->isActiveConfig("qt") ) { | 573 | if ( project->isActiveConfig("qt") ) { |
405 | project->variables()["CONFIG"].append("moc"); | 574 | project->variables()["CONFIG"].append("moc"); |
406 | project->variables()["INCLUDEPATH"] +=project->variables()["QMAKE_INCDIR_QT"]; | 575 | project->variables()["INCLUDEPATH"] +=project->variables()["QMAKE_INCDIR_QT"]; |
407 | project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QT"]; | 576 | project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QT"]; |
408 | if ( !project->isActiveConfig("debug") ) | 577 | if ( !project->isActiveConfig("debug") ) |
409 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_NO_DEBUG"); | 578 | project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_NO_DEBUG"); |
410 | if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) { | 579 | if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) { |
411 | if ( !project->variables()["QMAKE_QT_DLL"].isEmpty()) { | 580 | if ( !project->variables()["QMAKE_QT_DLL"].isEmpty()) { |
@@ -503,20 +672,36 @@ NmakeMakefileGenerator::init() | |||
503 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_OFF"]; | 672 | project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_OFF"]; |
504 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_OFF"]; | 673 | project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_OFF"]; |
505 | } | 674 | } |
506 | 675 | ||
507 | 676 | ||
508 | if ( project->isActiveConfig("moc") ) | 677 | if ( project->isActiveConfig("moc") ) |
509 | setMocAware(TRUE); | 678 | setMocAware(TRUE); |
510 | project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"]; | 679 | project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"]; |
680 | |||
681 | QStringList &libList = project->variables()["QMAKE_LIBS"]; | ||
682 | for( QStringList::Iterator stIt = libList.begin(); stIt != libList.end(); ) { | ||
683 | QString s = *stIt; | ||
684 | if( s.startsWith( "-l" ) ) { | ||
685 | stIt = libList.remove( stIt ); | ||
686 | stIt = libList.insert( stIt, s.mid( 2 ) + ".lib" ); | ||
687 | } else if( s.startsWith( "-L" ) ) { | ||
688 | stIt = libList.remove( stIt ); | ||
689 | project->variables()["QMAKE_LIBDIR"].append(QDir::convertSeparators(s.mid( 2 ))); | ||
690 | } else { | ||
691 | stIt++; | ||
692 | } | ||
693 | } | ||
694 | |||
511 | project->variables()["QMAKE_FILETAGS"] += QStringList::split(' ', | 695 | project->variables()["QMAKE_FILETAGS"] += QStringList::split(' ', |
512 | "HEADERS SOURCES DEF_FILE RC_FILE TARGET QMAKE_LIBS DESTDIR DLLDESTDIR INCLUDEPATH"); | 696 | "HEADERS SOURCES DEF_FILE RC_FILE TARGET QMAKE_LIBS DESTDIR DLLDESTDIR INCLUDEPATH"); |
513 | QStringList &l = project->variables()["QMAKE_FILETAGS"]; | 697 | QStringList &l = project->variables()["QMAKE_FILETAGS"]; |
514 | for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) { | 698 | QStringList::Iterator it; |
699 | for(it = l.begin(); it != l.end(); ++it) { | ||
515 | QStringList &gdmf = project->variables()[(*it)]; | 700 | QStringList &gdmf = project->variables()[(*it)]; |
516 | for(QStringList::Iterator inner = gdmf.begin(); inner != gdmf.end(); ++inner) | 701 | for(QStringList::Iterator inner = gdmf.begin(); inner != gdmf.end(); ++inner) |
517 | (*inner) = Option::fixPathToTargetOS((*inner), FALSE); | 702 | (*inner) = Option::fixPathToTargetOS((*inner), FALSE); |
518 | } | 703 | } |
519 | 704 | ||
520 | if ( !project->variables()["DEF_FILE"].isEmpty() ) | 705 | if ( !project->variables()["DEF_FILE"].isEmpty() ) |
521 | project->variables()["QMAKE_LFLAGS"].append(QString("/DEF:") + project->first("DEF_FILE")); | 706 | project->variables()["QMAKE_LFLAGS"].append(QString("/DEF:") + project->first("DEF_FILE")); |
522 | if(!project->isActiveConfig("incremental")) | 707 | if(!project->isActiveConfig("incremental")) |
@@ -534,29 +719,69 @@ NmakeMakefileGenerator::init() | |||
534 | if ( !project->variables()["RES_FILE"].isEmpty()) { | 719 | if ( !project->variables()["RES_FILE"].isEmpty()) { |
535 | fprintf(stderr, "Both .rc and .res file specified.\n"); | 720 | fprintf(stderr, "Both .rc and .res file specified.\n"); |
536 | fprintf(stderr, "Please specify one of them, not both."); | 721 | fprintf(stderr, "Please specify one of them, not both."); |
537 | exit(666); | 722 | exit(666); |
538 | } | 723 | } |
539 | project->variables()["RES_FILE"] = project->variables()["RC_FILE"]; | 724 | project->variables()["RES_FILE"] = project->variables()["RC_FILE"]; |
540 | project->variables()["RES_FILE"].first().replace(".rc",".res"); | 725 | project->variables()["RES_FILE"].first().replace(".rc",".res"); |
541 | project->variables()["POST_TARGETDEPS"] += project->variables()["RES_FILE"]; | 726 | project->variables()["POST_TARGETDEPS"] += project->variables()["RES_FILE"]; |
727 | project->variables()["CLEAN_FILES"] += project->variables()["RES_FILE"]; | ||
542 | } | 728 | } |
543 | if ( !project->variables()["RES_FILE"].isEmpty()) | 729 | if ( !project->variables()["RES_FILE"].isEmpty()) |
544 | project->variables()["QMAKE_LIBS"] += project->variables()["RES_FILE"]; | 730 | project->variables()["QMAKE_LIBS"] += project->variables()["RES_FILE"]; |
545 | 731 | ||
732 | // Base class init! | ||
546 | MakefileGenerator::init(); | 733 | MakefileGenerator::init(); |
734 | |||
735 | // Setup PCH variables | ||
736 | precompH = project->first("PRECOMPILED_HEADER"); | ||
737 | usePCH = !precompH.isEmpty() && project->isActiveConfig("precompile_header"); | ||
738 | if (usePCH) { | ||
739 | // Created files | ||
740 | precompObj = var("OBJECTS_DIR") + project->first("TARGET") + "_pch" + Option::obj_ext; | ||
741 | precompPch = var("OBJECTS_DIR") + project->first("TARGET") + "_pch.pch"; | ||
742 | // Add linking of precompObj (required for whole precompiled classes) | ||
743 | project->variables()["OBJECTS"] += precompObj; | ||
744 | // Add pch file to cleanup | ||
745 | project->variables()["QMAKE_CLEAN"] += precompPch; | ||
746 | // Return to variable pool | ||
747 | project->variables()["PRECOMPILED_OBJECT"] = precompObj; | ||
748 | project->variables()["PRECOMPILED_PCH"] = precompPch; | ||
749 | } | ||
750 | |||
547 | if ( !project->variables()["VERSION"].isEmpty()) { | 751 | if ( !project->variables()["VERSION"].isEmpty()) { |
548 | QStringList l = QStringList::split('.', project->first("VERSION")); | 752 | QStringList l = QStringList::split('.', project->first("VERSION")); |
549 | project->variables()["VER_MAJ"].append(l[0]); | 753 | project->variables()["VER_MAJ"].append(l[0]); |
550 | project->variables()["VER_MIN"].append(l[1]); | 754 | project->variables()["VER_MIN"].append(l[1]); |
551 | } | 755 | } |
552 | 756 | ||
553 | QString version = QStringList::split('.', project->first("VERSION")).join(""); | 757 | QString version = QStringList::split('.', project->first("VERSION")).join(""); |
554 | if(project->isActiveConfig("dll")) { | 758 | if(project->isActiveConfig("dll")) { |
555 | project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") + project->first("TARGET") + version + ".exp"); | 759 | project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") + project->first("TARGET") + version + ".exp"); |
556 | } | 760 | } |
557 | if(project->isActiveConfig("debug")) { | 761 | if(project->isActiveConfig("debug")) { |
558 | project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") + project->first("TARGET") + version + ".pdb"); | 762 | project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") + project->first("TARGET") + version + ".pdb"); |
559 | project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") + project->first("TARGET") + version + ".ilk"); | 763 | project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") + project->first("TARGET") + version + ".ilk"); |
560 | project->variables()["QMAKE_CLEAN"].append("vc*.pdb"); | 764 | project->variables()["QMAKE_CLEAN"].append("vc*.pdb"); |
765 | project->variables()["QMAKE_CLEAN"].append("vc*.idb"); | ||
766 | } | ||
767 | |||
768 | QStringList &quc = project->variables()["QMAKE_EXTRA_WIN_COMPILERS"]; | ||
769 | for(it = quc.begin(); it != quc.end(); ++it) { | ||
770 | QString tmp_out = project->variables()[(*it) + ".output"].first(); | ||
771 | if(tmp_out.isEmpty()) | ||
772 | continue; | ||
773 | QStringList &tmp = project->variables()[(*it) + ".input"]; | ||
774 | for(QStringList::Iterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) { | ||
775 | QStringList &inputs = project->variables()[(*it2)]; | ||
776 | for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) { | ||
777 | QFileInfo fi(Option::fixPathToLocalOS((*input))); | ||
778 | QString in = Option::fixPathToTargetOS((*input), FALSE), | ||
779 | out = tmp_out; | ||
780 | out.replace("${QMAKE_FILE_BASE}", fi.baseName()); | ||
781 | out.replace("${QMAKE_FILE_NAME}", fi.fileName()); | ||
782 | if(project->variables()[(*it) + ".CONFIG"].findIndex("no_link") == -1) | ||
783 | project->variables()["OBJCOMP"] += out; | ||
784 | } | ||
785 | } | ||
561 | } | 786 | } |
562 | } | 787 | } |
diff --git a/qmake/generators/win32/msvc_nmake.h b/qmake/generators/win32/msvc_nmake.h index 579fc35..f2996cd 100644 --- a/qmake/generators/win32/msvc_nmake.h +++ b/qmake/generators/win32/msvc_nmake.h | |||
@@ -1,18 +1,16 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** |
3 | ** | 3 | ** |
4 | ** Definition of ________ class. | 4 | ** Definition of NmakeMakefileGenerator class. |
5 | ** | 5 | ** |
6 | ** Created : 970521 | 6 | ** Copyright (C) 1992-2003 Trolltech AS. All rights reserved. |
7 | ** | 7 | ** |
8 | ** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. | 8 | ** This file is part of qmake. |
9 | ** | ||
10 | ** This file is part of the network module of the Qt GUI Toolkit. | ||
11 | ** | 9 | ** |
12 | ** This file may be distributed under the terms of the Q Public License | 10 | ** This file may be distributed under the terms of the Q Public License |
13 | ** as defined by Trolltech AS of Norway and appearing in the file | 11 | ** as defined by Trolltech AS of Norway and appearing in the file |
14 | ** LICENSE.QPL included in the packaging of this file. | 12 | ** LICENSE.QPL included in the packaging of this file. |
15 | ** | 13 | ** |
16 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This file may be distributed and/or modified under the terms of the |
17 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** GNU General Public License version 2 as published by the Free Software |
18 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** Foundation and appearing in the file LICENSE.GPL included in the |
@@ -29,29 +27,36 @@ | |||
29 | ** information about Qt Commercial License Agreements. | 27 | ** information about Qt Commercial License Agreements. |
30 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. | 28 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. |
31 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
32 | ** | 30 | ** |
33 | ** Contact info@trolltech.com if any conditions of this licensing are | 31 | ** Contact info@trolltech.com if any conditions of this licensing are |
34 | ** not clear to you. | 32 | ** not clear to you. |
35 | ** | 33 | ** |
36 | **********************************************************************/ | 34 | **********************************************************************/ |
35 | |||
37 | #ifndef __MSVC_NMAKE_H__ | 36 | #ifndef __MSVC_NMAKE_H__ |
38 | #define __MSVC_NMAKE_H__ | 37 | #define __MSVC_NMAKE_H__ |
39 | 38 | ||
40 | #include "winmakefile.h" | 39 | #include "winmakefile.h" |
41 | 40 | ||
42 | class NmakeMakefileGenerator : public Win32MakefileGenerator | 41 | class NmakeMakefileGenerator : public Win32MakefileGenerator |
43 | { | 42 | { |
44 | bool init_flag; | 43 | bool init_flag; |
45 | void writeNmakeParts(QTextStream &); | 44 | void writeNmakeParts(QTextStream &); |
46 | 45 | ||
47 | bool writeMakefile(QTextStream &); | 46 | bool writeMakefile(QTextStream &); |
48 | void init(); | 47 | void init(); |
49 | 48 | ||
49 | protected: | ||
50 | QStringList &findDependencies(const QString &file); | ||
51 | QString var(const QString &value); | ||
52 | QString precompH, precompObj, precompPch; | ||
53 | bool usePCH; | ||
54 | |||
50 | public: | 55 | public: |
51 | NmakeMakefileGenerator(QMakeProject *p); | 56 | NmakeMakefileGenerator(QMakeProject *p); |
52 | ~NmakeMakefileGenerator(); | 57 | ~NmakeMakefileGenerator(); |
53 | 58 | ||
54 | }; | 59 | }; |
55 | 60 | ||
56 | inline NmakeMakefileGenerator::~NmakeMakefileGenerator() | 61 | inline NmakeMakefileGenerator::~NmakeMakefileGenerator() |
57 | { } | 62 | { } |
diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp index 7ffe4f7..a672c2d 100644 --- a/qmake/generators/win32/msvc_objectmodel.cpp +++ b/qmake/generators/win32/msvc_objectmodel.cpp | |||
@@ -1,16 +1,16 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** |
3 | ** | 3 | ** |
4 | ** Definition of ________ class. | 4 | ** Implementation of VCProject class. |
5 | ** | 5 | ** |
6 | ** Copyright (C) 2002 Trolltech AS. All rights reserved. | 6 | ** Copyright (C) 2002-2003 Trolltech AS. All rights reserved. |
7 | ** | 7 | ** |
8 | ** This file is part of the network module of the Qt GUI Toolkit. | 8 | ** This file is part of qmake. |
9 | ** | 9 | ** |
10 | ** This file may be distributed under the terms of the Q Public License | 10 | ** This file may be distributed under the terms of the Q Public License |
11 | ** as defined by Trolltech AS of Norway and appearing in the file | 11 | ** as defined by Trolltech AS of Norway and appearing in the file |
12 | ** LICENSE.QPL included in the packaging of this file. | 12 | ** LICENSE.QPL included in the packaging of this file. |
13 | ** | 13 | ** |
14 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This file may be distributed and/or modified under the terms of the |
15 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** GNU General Public License version 2 as published by the Free Software |
16 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** Foundation and appearing in the file LICENSE.GPL included in the |
@@ -32,31 +32,17 @@ | |||
32 | ** not clear to you. | 32 | ** not clear to you. |
33 | ** | 33 | ** |
34 | **********************************************************************/ | 34 | **********************************************************************/ |
35 | 35 | ||
36 | #include "msvc_objectmodel.h" | 36 | #include "msvc_objectmodel.h" |
37 | #include "msvc_vcproj.h" | 37 | #include "msvc_vcproj.h" |
38 | #include <qtextstream.h> | 38 | #include <qtextstream.h> |
39 | #include <qstringlist.h> | 39 | #include <qstringlist.h> |
40 | #include <quuid.h> | 40 | #include <qfileinfo.h> |
41 | |||
42 | #if defined(Q_OS_WIN32) | ||
43 | #include <objbase.h> | ||
44 | #ifndef GUID_DEFINED | ||
45 | #define GUID_DEFINED | ||
46 | typedef struct _GUID | ||
47 | { | ||
48 | ulong Data1; | ||
49 | ushort Data2; | ||
50 | ushort Data3; | ||
51 | uchar Data4[8]; | ||
52 | } GUID; | ||
53 | #endif | ||
54 | #endif | ||
55 | 41 | ||
56 | // XML Tags --------------------------------------------------------- | 42 | // XML Tags --------------------------------------------------------- |
57 | const char* _xmlInit = "<?xml version=\"1.0\" encoding = \"Windows-1252\"?>"; | 43 | const char* _xmlInit = "<?xml version=\"1.0\" encoding = \"Windows-1252\"?>"; |
58 | const char* _begConfiguration = "\n\t\t<Configuration"; | 44 | const char* _begConfiguration = "\n\t\t<Configuration"; |
59 | const char* _begConfigurations = "\n\t<Configurations>"; | 45 | const char* _begConfigurations = "\n\t<Configurations>"; |
60 | const char* _begFile = "\n\t\t\t<File"; | 46 | const char* _begFile = "\n\t\t\t<File"; |
61 | const char* _begFileConfiguration = "\n\t\t\t\t<FileConfiguration"; | 47 | const char* _begFileConfiguration = "\n\t\t\t\t<FileConfiguration"; |
62 | const char* _begFiles = "\n\t<Files>"; | 48 | const char* _begFiles = "\n\t<Files>"; |
@@ -276,17 +262,16 @@ struct XPair { | |||
276 | XPair( const char* n, const QStringList& v, const char* s = "," ) : name(n), value(v), sep(s) {}; | 262 | XPair( const char* n, const QStringList& v, const char* s = "," ) : name(n), value(v), sep(s) {}; |
277 | const char* name; | 263 | const char* name; |
278 | const QStringList& value; | 264 | const QStringList& value; |
279 | const char* sep; | 265 | const char* sep; |
280 | }; | 266 | }; |
281 | 267 | ||
282 | // void streamSPair( QTextStream &strm, const char *n, const QString &s ) | 268 | // void streamSPair( QTextStream &strm, const char *n, const QString &s ) |
283 | 269 | ||
284 | |||
285 | // Streaming operators for property Pairs --------------------------- | 270 | // Streaming operators for property Pairs --------------------------- |
286 | QTextStream &operator<<( QTextStream &strm, const TPair &prop ) | 271 | QTextStream &operator<<( QTextStream &strm, const TPair &prop ) |
287 | { | 272 | { |
288 | switch( prop.value ) { | 273 | switch( prop.value ) { |
289 | case _False: | 274 | case _False: |
290 | strm << prop.name << "FALSE\""; | 275 | strm << prop.name << "FALSE\""; |
291 | break; | 276 | break; |
292 | case _True: | 277 | case _True: |
@@ -313,70 +298,71 @@ QTextStream &operator<<( QTextStream &strm, const LPair &prop ) | |||
313 | { | 298 | { |
314 | strm << prop.name << prop.value << "\""; | 299 | strm << prop.name << prop.value << "\""; |
315 | return strm; | 300 | return strm; |
316 | } | 301 | } |
317 | 302 | ||
318 | QTextStream &operator<<( QTextStream &strm, const SPair &prop ) | 303 | QTextStream &operator<<( QTextStream &strm, const SPair &prop ) |
319 | { | 304 | { |
320 | if ( !prop.value.isEmpty() ) | 305 | if ( !prop.value.isEmpty() ) |
321 | strm << prop.name << prop.value.latin1() << "\""; | 306 | strm << prop.name << QString(prop.value).remove("\"") << "\""; |
322 | return strm; | 307 | return strm; |
323 | } | 308 | } |
324 | 309 | ||
325 | QTextStream &operator<<( QTextStream &strm, const XPair &prop ) | 310 | QTextStream &operator<<( QTextStream &strm, const XPair &prop ) |
326 | { | 311 | { |
327 | if ( !prop.value.isEmpty() ) | 312 | if ( !prop.value.isEmpty() ) |
328 | strm << prop.name << prop.value.join(prop.sep).latin1() << "\""; | 313 | strm << prop.name << prop.value.join(prop.sep).latin1() << "\""; |
329 | return strm; | 314 | return strm; |
330 | } | 315 | } |
331 | 316 | ||
332 | // VCCLCompilerTool ------------------------------------------------- | 317 | // VCCLCompilerTool ------------------------------------------------- |
333 | VCCLCompilerTool::VCCLCompilerTool() | 318 | VCCLCompilerTool::VCCLCompilerTool() |
334 | :AssemblerOutput( asmListingNone ), | 319 | :AssemblerOutput( asmListingNone ), |
335 | BasicRuntimeChecks( runtimeBasicCheckNone ), | 320 | BasicRuntimeChecks( runtimeBasicCheckNone ), |
336 | BrowseInformation( brInfoNone ), | 321 | BrowseInformation( brInfoNone ), |
337 | BufferSecurityCheck( unset ), | 322 | BufferSecurityCheck( _False ), |
338 | CallingConvention( callConventionDefault ), | 323 | CallingConvention( callConventionDefault ), |
339 | CompileAs( compileAsDefault ), | 324 | CompileAs( compileAsDefault ), |
340 | CompileAsManaged( managedDefault ), | 325 | CompileAsManaged( managedDefault ), |
341 | CompileOnly( unset ), | 326 | CompileOnly( unset ), |
342 | DebugInformationFormat( debugDisabled ), | 327 | DebugInformationFormat( debugDisabled ), |
343 | DefaultCharIsUnsigned( unset ), | 328 | DefaultCharIsUnsigned( unset ), |
344 | Detect64BitPortabilityProblems( unset ), | 329 | Detect64BitPortabilityProblems( unset ), |
345 | DisableLanguageExtensions( unset ), | 330 | DisableLanguageExtensions( unset ), |
346 | EnableFiberSafeOptimizations( unset ), | 331 | EnableFiberSafeOptimizations( unset ), |
347 | EnableFunctionLevelLinking( unset ), | 332 | EnableFunctionLevelLinking( unset ), |
348 | EnableIntrinsicFunctions( unset ), | 333 | EnableIntrinsicFunctions( unset ), |
349 | ExceptionHandling( unset ), | 334 | ExceptionHandling( _False ), |
350 | ExpandAttributedSource( unset ), | 335 | ExpandAttributedSource( unset ), |
351 | FavorSizeOrSpeed( favorNone ), | 336 | FavorSizeOrSpeed( favorNone ), |
352 | ForceConformanceInForLoopScope( unset ), | 337 | ForceConformanceInForLoopScope( unset ), |
353 | GeneratePreprocessedFile( preprocessNo ), | 338 | GeneratePreprocessedFile( preprocessNo ), |
354 | GlobalOptimizations( unset ), | 339 | GlobalOptimizations( unset ), |
355 | IgnoreStandardIncludePath( unset ), | 340 | IgnoreStandardIncludePath( unset ), |
356 | ImproveFloatingPointConsistency( unset ), | 341 | ImproveFloatingPointConsistency( unset ), |
357 | InlineFunctionExpansion( expandOnlyInline ), | 342 | InlineFunctionExpansion( expandDefault ), |
358 | KeepComments( unset ), | 343 | KeepComments( unset ), |
359 | MinimalRebuild( unset ), | 344 | MinimalRebuild( unset ), |
360 | OmitFramePointers( unset ), | 345 | OmitFramePointers( unset ), |
361 | Optimization( optimizeDisabled ), | 346 | Optimization( optimizeCustom ), |
362 | OptimizeForProcessor( procOptimizeBlended ), | 347 | OptimizeForProcessor( procOptimizeBlended ), |
363 | OptimizeForWindowsApplication( unset ), | 348 | OptimizeForWindowsApplication( unset ), |
349 | ProgramDataBaseFileName( "" ), | ||
364 | RuntimeLibrary( rtMultiThreaded ), | 350 | RuntimeLibrary( rtMultiThreaded ), |
365 | RuntimeTypeInfo( unset ), | 351 | RuntimeTypeInfo( unset ), |
366 | ShowIncludes( unset ), | 352 | ShowIncludes( unset ), |
367 | SmallerTypeCheck( unset ), | 353 | SmallerTypeCheck( unset ), |
368 | StringPooling( unset ), | 354 | StringPooling( unset ), |
369 | StructMemberAlignment( alignNotSet ), | 355 | StructMemberAlignment( alignNotSet ), |
370 | SuppressStartupBanner( unset ), | 356 | SuppressStartupBanner( unset ), |
371 | TreatWChar_tAsBuiltInType( unset ), | 357 | TreatWChar_tAsBuiltInType( unset ), |
372 | TurnOffAssemblyGeneration( unset ), | 358 | TurnOffAssemblyGeneration( unset ), |
373 | UndefineAllPreprocessorDefinitions( unset ), | 359 | UndefineAllPreprocessorDefinitions( unset ), |
374 | UsePrecompiledHeader( pchGenerateAuto ), | 360 | UsePrecompiledHeader( pchNone ), |
375 | WarnAsError( unset ), | 361 | WarnAsError( unset ), |
376 | WarningLevel( warningLevel_0 ), | 362 | WarningLevel( warningLevel_0 ), |
377 | WholeProgramOptimization( unset ) | 363 | WholeProgramOptimization( unset ) |
378 | { | 364 | { |
379 | } | 365 | } |
380 | 366 | ||
381 | QTextStream &operator<<( QTextStream &strm, const VCCLCompilerTool &tool ) | 367 | QTextStream &operator<<( QTextStream &strm, const VCCLCompilerTool &tool ) |
382 | { | 368 | { |
@@ -390,63 +376,63 @@ QTextStream &operator<<( QTextStream &strm, const VCCLCompilerTool &tool ) | |||
390 | if ( tool.BasicRuntimeChecks != runtimeBasicCheckNone ) strm << EPair( _BasicRuntimeChecks, tool.BasicRuntimeChecks ); | 376 | if ( tool.BasicRuntimeChecks != runtimeBasicCheckNone ) strm << EPair( _BasicRuntimeChecks, tool.BasicRuntimeChecks ); |
391 | if ( tool.BrowseInformation != brInfoNone ) strm << EPair( _BrowseInformation, tool.BrowseInformation ); | 377 | if ( tool.BrowseInformation != brInfoNone ) strm << EPair( _BrowseInformation, tool.BrowseInformation ); |
392 | strm << SPair( _BrowseInformationFile, tool.BrowseInformationFile ); | 378 | strm << SPair( _BrowseInformationFile, tool.BrowseInformationFile ); |
393 | strm << TPair( _BufferSecurityCheck, tool.BufferSecurityCheck ); | 379 | strm << TPair( _BufferSecurityCheck, tool.BufferSecurityCheck ); |
394 | if ( tool.CallingConvention != callConventionDefault ) strm << EPair( _CallingConvention, tool.CallingConvention ); | 380 | if ( tool.CallingConvention != callConventionDefault ) strm << EPair( _CallingConvention, tool.CallingConvention ); |
395 | if ( tool.CompileAs != compileAsDefault ) strm << EPair( _CompileAs, tool.CompileAs ); | 381 | if ( tool.CompileAs != compileAsDefault ) strm << EPair( _CompileAs, tool.CompileAs ); |
396 | if ( tool.CompileAsManaged != managedDefault ) strm << EPair( _CompileAsManaged, tool.CompileAsManaged ); | 382 | if ( tool.CompileAsManaged != managedDefault ) strm << EPair( _CompileAsManaged, tool.CompileAsManaged ); |
397 | strm << TPair( _CompileOnly, tool.CompileOnly ); | 383 | strm << TPair( _CompileOnly, tool.CompileOnly ); |
398 | strm << EPair( _DebugInformationFormat, tool.DebugInformationFormat ); | 384 | if ( tool.DebugInformationFormat != debugUnknown ) strm << EPair( _DebugInformationFormat, tool.DebugInformationFormat ); |
399 | strm << TPair( _DefaultCharIsUnsigned, tool.DefaultCharIsUnsigned ); | 385 | strm << TPair( _DefaultCharIsUnsigned, tool.DefaultCharIsUnsigned ); |
400 | strm << TPair( _Detect64BitPortabilityProblems, tool.Detect64BitPortabilityProblems ); | 386 | strm << TPair( _Detect64BitPortabilityProblems, tool.Detect64BitPortabilityProblems ); |
401 | strm << TPair( _DisableLanguageExtensions, tool.DisableLanguageExtensions ); | 387 | strm << TPair( _DisableLanguageExtensions, tool.DisableLanguageExtensions ); |
402 | strm << XPair( _DisableSpecificWarnings, tool.DisableSpecificWarnings ); | 388 | strm << XPair( _DisableSpecificWarnings, tool.DisableSpecificWarnings ); |
403 | strm << TPair( _EnableFiberSafeOptimizations, tool.EnableFiberSafeOptimizations ); | 389 | strm << TPair( _EnableFiberSafeOptimizations, tool.EnableFiberSafeOptimizations ); |
404 | strm << TPair( _EnableFunctionLevelLinking, tool.EnableFunctionLevelLinking ); | 390 | strm << TPair( _EnableFunctionLevelLinking, tool.EnableFunctionLevelLinking ); |
405 | strm << TPair( _EnableIntrinsicFunctions, tool.EnableIntrinsicFunctions ); | 391 | strm << TPair( _EnableIntrinsicFunctions, tool.EnableIntrinsicFunctions ); |
406 | strm << TPair( _ExceptionHandling, tool.ExceptionHandling ); | 392 | strm << TPair( _ExceptionHandling, tool.ExceptionHandling ); |
407 | strm << TPair( _ExpandAttributedSource, tool.ExpandAttributedSource ); | 393 | strm << TPair( _ExpandAttributedSource, tool.ExpandAttributedSource ); |
408 | if ( tool.FavorSizeOrSpeed != favorNone ) strm << EPair( _FavorSizeOrSpeed, tool.FavorSizeOrSpeed ); | 394 | if ( tool.FavorSizeOrSpeed != favorNone ) strm << EPair( _FavorSizeOrSpeed, tool.FavorSizeOrSpeed ); |
409 | strm << TPair( _ForceConformanceInForLoopScope, tool.ForceConformanceInForLoopScope ); | 395 | strm << TPair( _ForceConformanceInForLoopScope, tool.ForceConformanceInForLoopScope ); |
410 | strm << XPair( _ForcedIncludeFiles, tool.ForcedIncludeFiles ); | 396 | strm << XPair( _ForcedIncludeFiles, tool.ForcedIncludeFiles ); |
411 | strm << XPair( _ForcedUsingFiles, tool.ForcedUsingFiles ); | 397 | strm << XPair( _ForcedUsingFiles, tool.ForcedUsingFiles ); |
412 | strm << EPair( _GeneratePreprocessedFile, tool.GeneratePreprocessedFile ); | 398 | if ( tool.GeneratePreprocessedFile != preprocessUnknown)strm << EPair( _GeneratePreprocessedFile, tool.GeneratePreprocessedFile ); |
413 | strm << TPair( _GlobalOptimizations, tool.GlobalOptimizations ); | 399 | strm << TPair( _GlobalOptimizations, tool.GlobalOptimizations ); |
414 | strm << TPair( _IgnoreStandardIncludePath, tool.IgnoreStandardIncludePath ); | 400 | strm << TPair( _IgnoreStandardIncludePath, tool.IgnoreStandardIncludePath ); |
415 | strm << TPair( _ImproveFloatingPointConsistency, tool.ImproveFloatingPointConsistency ); | 401 | strm << TPair( _ImproveFloatingPointConsistency, tool.ImproveFloatingPointConsistency ); |
416 | strm << EPair( _InlineFunctionExpansion, tool.InlineFunctionExpansion ); | 402 | if ( tool.InlineFunctionExpansion != expandDefault ) strm << EPair( _InlineFunctionExpansion, tool.InlineFunctionExpansion ); |
417 | strm << TPair( _KeepComments, tool.KeepComments ); | 403 | strm << TPair( _KeepComments, tool.KeepComments ); |
418 | strm << TPair( _MinimalRebuild, tool.MinimalRebuild ); | 404 | strm << TPair( _MinimalRebuild, tool.MinimalRebuild ); |
419 | strm << SPair( _ObjectFile, tool.ObjectFile ); | 405 | strm << SPair( _ObjectFile, tool.ObjectFile ); |
420 | strm << TPair( _OmitFramePointers, tool.OmitFramePointers ); | 406 | strm << TPair( _OmitFramePointers, tool.OmitFramePointers ); |
421 | strm << EPair( _Optimization, tool.Optimization ); | 407 | if ( tool.Optimization != optimizeDefault ) strm << EPair( _Optimization, tool.Optimization ); |
422 | if ( tool.OptimizeForProcessor != procOptimizeBlended ) strm << EPair( _OptimizeForProcessor, tool.OptimizeForProcessor ); | 408 | if ( tool.OptimizeForProcessor != procOptimizeBlended ) strm << EPair( _OptimizeForProcessor, tool.OptimizeForProcessor ); |
423 | strm << TPair( _OptimizeForWindowsApplication, tool.OptimizeForWindowsApplication ); | 409 | strm << TPair( _OptimizeForWindowsApplication, tool.OptimizeForWindowsApplication ); |
424 | strm << SPair( _OutputFile, tool.OutputFile ); | 410 | strm << SPair( _OutputFile, tool.OutputFile ); |
425 | strm << SPair( _PrecompiledHeaderFile, tool.PrecompiledHeaderFile ); | 411 | strm << SPair( _PrecompiledHeaderFile, tool.PrecompiledHeaderFile ); |
426 | strm << SPair( _PrecompiledHeaderThrough, tool.PrecompiledHeaderThrough ); | 412 | strm << SPair( _PrecompiledHeaderThrough, tool.PrecompiledHeaderThrough ); |
427 | strm << XPair( _PreprocessorDefinitions, tool.PreprocessorDefinitions ); | 413 | strm << XPair( _PreprocessorDefinitions, tool.PreprocessorDefinitions ); |
428 | strm << SPair( _ProgramDataBaseFileName, tool.ProgramDataBaseFileName ); | 414 | if ( !tool.ProgramDataBaseFileName.isNull() ) strm << _ProgramDataBaseFileName << tool.ProgramDataBaseFileName.latin1() << "\""; |
429 | strm << EPair( _RuntimeLibrary, tool.RuntimeLibrary ); | 415 | if ( tool.RuntimeLibrary != rtUnknown ) strm << EPair( _RuntimeLibrary, tool.RuntimeLibrary ); |
430 | strm << TPair( _RuntimeTypeInfo, tool.RuntimeTypeInfo ); | 416 | strm << TPair( _RuntimeTypeInfo, tool.RuntimeTypeInfo ); |
431 | strm << TPair( _ShowIncludes, tool.ShowIncludes ); | 417 | strm << TPair( _ShowIncludes, tool.ShowIncludes ); |
432 | strm << TPair( _SmallerTypeCheck, tool.SmallerTypeCheck ); | 418 | strm << TPair( _SmallerTypeCheck, tool.SmallerTypeCheck ); |
433 | strm << TPair( _StringPooling, tool.StringPooling ); | 419 | strm << TPair( _StringPooling, tool.StringPooling ); |
434 | if ( tool.StructMemberAlignment != alignNotSet ) strm << EPair( _StructMemberAlignment, tool.StructMemberAlignment ); | 420 | if ( tool.StructMemberAlignment != alignNotSet ) strm << EPair( _StructMemberAlignment, tool.StructMemberAlignment ); |
435 | strm << TPair( _SuppressStartupBanner, tool.SuppressStartupBanner ); | 421 | strm << TPair( _SuppressStartupBanner, tool.SuppressStartupBanner ); |
436 | strm << TPair( _TreatWChar_tAsBuiltInType, tool.TreatWChar_tAsBuiltInType ); | 422 | strm << TPair( _TreatWChar_tAsBuiltInType, tool.TreatWChar_tAsBuiltInType ); |
437 | strm << TPair( _TurnOffAssemblyGeneration, tool.TurnOffAssemblyGeneration ); | 423 | strm << TPair( _TurnOffAssemblyGeneration, tool.TurnOffAssemblyGeneration ); |
438 | strm << TPair( _UndefineAllPreprocessorDefinitions, tool.UndefineAllPreprocessorDefinitions ); | 424 | strm << TPair( _UndefineAllPreprocessorDefinitions, tool.UndefineAllPreprocessorDefinitions ); |
439 | strm << XPair( _UndefinePreprocessorDefinitions, tool.UndefinePreprocessorDefinitions ); | 425 | strm << XPair( _UndefinePreprocessorDefinitions, tool.UndefinePreprocessorDefinitions ); |
440 | if ( !tool.PrecompiledHeaderFile.isEmpty() || | 426 | if ( !tool.PrecompiledHeaderFile.isEmpty() || |
441 | !tool.PrecompiledHeaderThrough.isEmpty() ) | 427 | !tool.PrecompiledHeaderThrough.isEmpty() ) |
442 | strm << EPair( _UsePrecompiledHeader, tool.UsePrecompiledHeader ); | 428 | strm << EPair( _UsePrecompiledHeader, tool.UsePrecompiledHeader ); |
443 | strm << TPair( _WarnAsError, tool.WarnAsError ); | 429 | strm << TPair( _WarnAsError, tool.WarnAsError ); |
444 | strm << EPair( _WarningLevel, tool.WarningLevel ); | 430 | if ( tool.WarningLevel != warningLevelUnknown ) strm << EPair( _WarningLevel, tool.WarningLevel ); |
445 | strm << TPair( _WholeProgramOptimization, tool.WholeProgramOptimization ); | 431 | strm << TPair( _WholeProgramOptimization, tool.WholeProgramOptimization ); |
446 | strm << "/>"; | 432 | strm << "/>"; |
447 | return strm; | 433 | return strm; |
448 | } | 434 | } |
449 | 435 | ||
450 | bool VCCLCompilerTool::parseOption( const char* option ) | 436 | bool VCCLCompilerTool::parseOption( const char* option ) |
451 | { | 437 | { |
452 | // skip index 0 ('/' or '-') | 438 | // skip index 0 ('/' or '-') |
@@ -469,32 +455,39 @@ bool VCCLCompilerTool::parseOption( const char* option ) | |||
469 | case 'l': | 455 | case 'l': |
470 | qWarning( "Generator: Option '/link': qmake generator does not support passing link options through the compiler tool" ); | 456 | qWarning( "Generator: Option '/link': qmake generator does not support passing link options through the compiler tool" ); |
471 | found = FALSE; | 457 | found = FALSE; |
472 | break; | 458 | break; |
473 | case 'A': | 459 | case 'A': |
474 | if ( second != 'I' ) { | 460 | if ( second != 'I' ) { |
475 | found = FALSE; break; | 461 | found = FALSE; break; |
476 | } | 462 | } |
477 | AdditionalUsingDirectories += option+2; | 463 | AdditionalUsingDirectories += option+3; |
478 | break; | 464 | break; |
479 | case 'C': | 465 | case 'C': |
480 | KeepComments = _True; | 466 | KeepComments = _True; |
481 | break; | 467 | break; |
482 | case 'D': | 468 | case 'D': |
483 | PreprocessorDefinitions += option+1; | 469 | PreprocessorDefinitions += option+2; |
484 | break; | 470 | break; |
485 | case 'E': | 471 | case 'E': |
486 | if ( second == 'H' ) { | 472 | if ( second == 'H' ) { |
487 | if ( third == 'a' || third == 'c' || third == 's' ) { | 473 | if ( third == 'a' |
474 | || (third == 'c' && fourth != 's') | ||
475 | || (third == 's' && fourth != 'c') ) { | ||
488 | // ExceptionHandling must be false, or it will override | 476 | // ExceptionHandling must be false, or it will override |
489 | // with an /EHsc option | 477 | // with an /EHsc option |
490 | ExceptionHandling = _False; | 478 | ExceptionHandling = _False; |
491 | AdditionalOptions += option; | 479 | AdditionalOptions += option; |
492 | break; | 480 | break; |
481 | } else if ( (third == 'c' && fourth == 's') | ||
482 | || (third == 's' && fourth == 'c') ) { | ||
483 | ExceptionHandling = _True; | ||
484 | AdditionalOptions += option; | ||
485 | break; | ||
493 | } | 486 | } |
494 | found = FALSE; break; | 487 | found = FALSE; break; |
495 | } | 488 | } |
496 | GeneratePreprocessedFile = preprocessYes; | 489 | GeneratePreprocessedFile = preprocessYes; |
497 | break; | 490 | break; |
498 | case 'F': | 491 | case 'F': |
499 | if ( second <= '9' && second >= '0' ) { | 492 | if ( second <= '9' && second >= '0' ) { |
500 | AdditionalOptions += option; | 493 | AdditionalOptions += option; |
@@ -586,16 +579,19 @@ bool VCCLCompilerTool::parseOption( const char* option ) | |||
586 | break; | 579 | break; |
587 | case 'S': | 580 | case 'S': |
588 | BufferSecurityCheck = _True; | 581 | BufferSecurityCheck = _True; |
589 | break; | 582 | break; |
590 | case 'T': | 583 | case 'T': |
591 | EnableFiberSafeOptimizations = _True; | 584 | EnableFiberSafeOptimizations = _True; |
592 | break; | 585 | break; |
593 | case 'X': | 586 | case 'X': |
587 | // ExceptionHandling == true will override with | ||
588 | // an /EHsc option, which is correct with /GX | ||
589 | ExceptionHandling = _True; // Fall-through | ||
594 | case 'Z': | 590 | case 'Z': |
595 | case 'e': | 591 | case 'e': |
596 | case 'h': | 592 | case 'h': |
597 | AdditionalOptions += option; | 593 | AdditionalOptions += option; |
598 | break; | 594 | break; |
599 | case 'd': | 595 | case 'd': |
600 | CallingConvention = callConventionCDecl; | 596 | CallingConvention = callConventionCDecl; |
601 | break; | 597 | break; |
@@ -949,20 +945,20 @@ bool VCCLCompilerTool::parseOption( const char* option ) | |||
949 | VCLinkerTool::VCLinkerTool() | 945 | VCLinkerTool::VCLinkerTool() |
950 | :EnableCOMDATFolding( optFoldingDefault ), | 946 | :EnableCOMDATFolding( optFoldingDefault ), |
951 | GenerateDebugInformation( unset ), | 947 | GenerateDebugInformation( unset ), |
952 | GenerateMapFile( unset ), | 948 | GenerateMapFile( unset ), |
953 | HeapCommitSize( -1 ), | 949 | HeapCommitSize( -1 ), |
954 | HeapReserveSize( -1 ), | 950 | HeapReserveSize( -1 ), |
955 | IgnoreAllDefaultLibraries( unset ), | 951 | IgnoreAllDefaultLibraries( unset ), |
956 | IgnoreEmbeddedIDL( unset ), | 952 | IgnoreEmbeddedIDL( unset ), |
957 | IgnoreImportLibrary( unset ), | 953 | IgnoreImportLibrary( _True ), |
958 | LargeAddressAware( addrAwareDefault ), | 954 | LargeAddressAware( addrAwareDefault ), |
959 | LinkDLL( unset ), | 955 | LinkDLL( unset ), |
960 | LinkIncremental( linkIncrementalYes ), | 956 | LinkIncremental( linkIncrementalDefault ), |
961 | LinkTimeCodeGeneration( unset ), | 957 | LinkTimeCodeGeneration( unset ), |
962 | MapExports( unset ), | 958 | MapExports( unset ), |
963 | MapLines( unset ), | 959 | MapLines( unset ), |
964 | OptimizeForWindows98( optWin98Default ), | 960 | OptimizeForWindows98( optWin98Default ), |
965 | OptimizeReferences( optReferencesDefault ), | 961 | OptimizeReferences( optReferencesDefault ), |
966 | RegisterOutput( unset ), | 962 | RegisterOutput( unset ), |
967 | ResourceOnlyDLL( unset ), | 963 | ResourceOnlyDLL( unset ), |
968 | SetChecksum( unset ), | 964 | SetChecksum( unset ), |
@@ -1014,17 +1010,17 @@ QTextStream &operator<<( QTextStream &strm, const VCLinkerTool &tool ) | |||
1014 | strm << TPair( _MapLines, tool.MapLines ); | 1010 | strm << TPair( _MapLines, tool.MapLines ); |
1015 | strm << SPair( _MergedIDLBaseFileName, tool.MergedIDLBaseFileName ); | 1011 | strm << SPair( _MergedIDLBaseFileName, tool.MergedIDLBaseFileName ); |
1016 | strm << SPair( _MergeSections, tool.MergeSections ); | 1012 | strm << SPair( _MergeSections, tool.MergeSections ); |
1017 | strm << SPair( _MidlCommandFile, tool.MidlCommandFile ); | 1013 | strm << SPair( _MidlCommandFile, tool.MidlCommandFile ); |
1018 | strm << SPair( _ModuleDefinitionFile, tool.ModuleDefinitionFile ); | 1014 | strm << SPair( _ModuleDefinitionFile, tool.ModuleDefinitionFile ); |
1019 | if ( tool.OptimizeForWindows98 != optWin98Default ) strm << EPair( _OptimizeForWindows98, tool.OptimizeForWindows98 ); | 1015 | if ( tool.OptimizeForWindows98 != optWin98Default ) strm << EPair( _OptimizeForWindows98, tool.OptimizeForWindows98 ); |
1020 | if ( tool.OptimizeReferences != optReferencesDefault ) strm << EPair( _OptimizeReferences, tool.OptimizeReferences ); | 1016 | if ( tool.OptimizeReferences != optReferencesDefault ) strm << EPair( _OptimizeReferences, tool.OptimizeReferences ); |
1021 | strm << SPair( _OutputFile, tool.OutputFile ); | 1017 | strm << SPair( _OutputFile, tool.OutputFile ); |
1022 | strm << SPair( _ProgramDatabaseFile, tool.ProgramDatabaseFile ); | 1018 | strm << _ProgramDatabaseFile << tool.ProgramDatabaseFile << "\""; |
1023 | strm << TPair( _RegisterOutput, tool.RegisterOutput ); | 1019 | strm << TPair( _RegisterOutput, tool.RegisterOutput ); |
1024 | strm << TPair( _ResourceOnlyDLL, tool.ResourceOnlyDLL ); | 1020 | strm << TPair( _ResourceOnlyDLL, tool.ResourceOnlyDLL ); |
1025 | strm << TPair( _SetChecksum, tool.SetChecksum ); | 1021 | strm << TPair( _SetChecksum, tool.SetChecksum ); |
1026 | if ( tool.ShowProgress != linkProgressNotSet ) strm << EPair( _ShowProgress, tool.ShowProgress ); | 1022 | if ( tool.ShowProgress != linkProgressNotSet ) strm << EPair( _ShowProgress, tool.ShowProgress ); |
1027 | if ( tool.StackCommitSize != -1 ) strm << LPair( _StackCommitSize, tool.StackCommitSize ); | 1023 | if ( tool.StackCommitSize != -1 ) strm << LPair( _StackCommitSize, tool.StackCommitSize ); |
1028 | if ( tool.StackReserveSize != -1 ) strm << LPair( _StackReserveSize, tool.StackReserveSize ); | 1024 | if ( tool.StackReserveSize != -1 ) strm << LPair( _StackReserveSize, tool.StackReserveSize ); |
1029 | strm << SPair( _StripPrivateSymbols, tool.StripPrivateSymbols ); | 1025 | strm << SPair( _StripPrivateSymbols, tool.StripPrivateSymbols ); |
1030 | strm << EPair( _SubSystem, tool.SubSystem ); | 1026 | strm << EPair( _SubSystem, tool.SubSystem ); |
@@ -1702,19 +1698,19 @@ VCCustomBuildTool::VCCustomBuildTool() | |||
1702 | ToolName = "VCCustomBuildTool"; | 1698 | ToolName = "VCCustomBuildTool"; |
1703 | } | 1699 | } |
1704 | 1700 | ||
1705 | QTextStream &operator<<( QTextStream &strm, const VCCustomBuildTool &tool ) | 1701 | QTextStream &operator<<( QTextStream &strm, const VCCustomBuildTool &tool ) |
1706 | { | 1702 | { |
1707 | strm << _begTool3; | 1703 | strm << _begTool3; |
1708 | strm << SPair( _ToolName, tool.ToolName ); | 1704 | strm << SPair( _ToolName, tool.ToolName ); |
1709 | strm << XPair( _AdditionalDependencies4, tool.AdditionalDependencies, ";" ); | 1705 | strm << XPair( _AdditionalDependencies4, tool.AdditionalDependencies, ";" ); |
1710 | strm << SPair( _CommandLine4, tool.CommandLine ); | 1706 | strm << XPair( _CommandLine4, tool.CommandLine, "\n" ); |
1711 | strm << SPair( _Description4, tool.Description ); | 1707 | strm << SPair( _Description4, tool.Description ); |
1712 | strm << SPair( _Outputs4, tool.Outputs ); | 1708 | strm << XPair( _Outputs4, tool.Outputs, ";" ); |
1713 | strm << SPair( _ToolPath, tool.ToolPath ); | 1709 | strm << SPair( _ToolPath, tool.ToolPath ); |
1714 | strm << "/>"; | 1710 | strm << "/>"; |
1715 | return strm; | 1711 | return strm; |
1716 | } | 1712 | } |
1717 | 1713 | ||
1718 | // VCResourceCompilerTool ------------------------------------------- | 1714 | // VCResourceCompilerTool ------------------------------------------- |
1719 | VCResourceCompilerTool::VCResourceCompilerTool() | 1715 | VCResourceCompilerTool::VCResourceCompilerTool() |
1720 | : Culture( rcUseDefault ), | 1716 | : Culture( rcUseDefault ), |
@@ -1821,53 +1817,49 @@ QTextStream &operator<<( QTextStream &strm, const VCConfiguration &tool ) | |||
1821 | strm << tool.resource; | 1817 | strm << tool.resource; |
1822 | strm << _endConfiguration; | 1818 | strm << _endConfiguration; |
1823 | return strm; | 1819 | return strm; |
1824 | } | 1820 | } |
1825 | // VCFilter --------------------------------------------------------- | 1821 | // VCFilter --------------------------------------------------------- |
1826 | VCFilter::VCFilter() | 1822 | VCFilter::VCFilter() |
1827 | : ParseFiles( unset ) | 1823 | : ParseFiles( unset ) |
1828 | { | 1824 | { |
1825 | useCustomBuildTool = FALSE; | ||
1826 | useCompilerTool = FALSE; | ||
1829 | } | 1827 | } |
1830 | 1828 | ||
1831 | void VCFilter::generateMOC( QTextStream &strm, QString str ) const | 1829 | void VCFilter::addMOCstage( QTextStream &strm, QString filename ) |
1832 | { | 1830 | { |
1833 | QString mocOutput = Project->findMocDestination( str ); | 1831 | QString mocOutput = Project->findMocDestination( filename ); |
1834 | QString mocApp = Project->var( "QMAKE_MOC" ); | 1832 | QString mocApp = Project->var( "QMAKE_MOC" ); |
1835 | 1833 | ||
1836 | if( mocOutput.isEmpty() ) { | 1834 | if( mocOutput.isEmpty() && filename.endsWith(".moc") ) { |
1837 | // In specialcases we DO moc .cpp files | 1835 | // In specialcases we DO moc .cpp files |
1838 | // when the result is an .moc file | 1836 | // when the result is an .moc file |
1839 | if ( !str.endsWith(".moc") ) | 1837 | mocOutput = filename; |
1840 | return; | 1838 | filename = Project->findMocSource( mocOutput ); |
1841 | mocOutput = str; | ||
1842 | str = Project->findMocSource( mocOutput ); | ||
1843 | } | 1839 | } |
1844 | 1840 | ||
1845 | strm << _begFileConfiguration; | 1841 | if (mocOutput.isEmpty()) |
1846 | strm << _Name5; | 1842 | return; |
1847 | strm << Config->Name; | 1843 | |
1848 | strm << "\">"; | 1844 | CustomBuildTool = VCCustomBuildTool(); |
1849 | strm << _begTool5; | 1845 | useCustomBuildTool = TRUE; |
1850 | strm << _VCCustomBuildTool; | 1846 | CustomBuildTool.Description = "Moc'ing " + filename + "..."; |
1851 | strm << _Description6; | 1847 | CustomBuildTool.CommandLine += (mocApp + " " |
1852 | strm << "Moc'ing " << str << "...\""; | 1848 | + filename + " -o " + mocOutput); |
1853 | strm << _CommandLine6; | 1849 | CustomBuildTool.AdditionalDependencies = mocApp; |
1854 | strm << mocApp; | 1850 | CustomBuildTool.Outputs += mocOutput; |
1855 | strm << " " << str << " -o " << mocOutput << "\""; | ||
1856 | strm << _AdditionalDependencies6; | ||
1857 | strm << mocApp << "\""; | ||
1858 | strm << _Outputs6; | ||
1859 | strm << mocOutput << "\""; | ||
1860 | strm << "/>"; | ||
1861 | strm << _endFileConfiguration; | ||
1862 | } | 1851 | } |
1863 | 1852 | ||
1864 | void VCFilter::generateUIC( QTextStream &strm, const QString& str ) const | 1853 | void VCFilter::addUICstage( QTextStream &strm, QString str ) |
1865 | { | 1854 | { |
1855 | CustomBuildTool = VCCustomBuildTool(); | ||
1856 | useCustomBuildTool = TRUE; | ||
1857 | |||
1866 | QString uicApp = Project->var("QMAKE_UIC"); | 1858 | QString uicApp = Project->var("QMAKE_UIC"); |
1867 | QString mocApp = Project->var( "QMAKE_MOC" ); | 1859 | QString mocApp = Project->var( "QMAKE_MOC" ); |
1868 | QString fname = str.section( '\\', -1 ); | 1860 | QString fname = str.section( '\\', -1 ); |
1869 | QString mocDir = Project->var( "MOC_DIR" ); | 1861 | QString mocDir = Project->var( "MOC_DIR" ); |
1870 | QString uiDir = Project->var( "UI_DIR" ); | 1862 | QString uiDir = Project->var( "UI_DIR" ); |
1871 | QString uiHeaders; | 1863 | QString uiHeaders; |
1872 | QString uiSources; | 1864 | QString uiSources; |
1873 | 1865 | ||
@@ -1890,75 +1882,203 @@ void VCFilter::generateUIC( QTextStream &strm, const QString& str ) const | |||
1890 | if( !uiSources.endsWith( "\\" ) ) | 1882 | if( !uiSources.endsWith( "\\" ) ) |
1891 | uiSources += "\\"; | 1883 | uiSources += "\\"; |
1892 | 1884 | ||
1893 | // Determine the file name. | 1885 | // Determine the file name. |
1894 | int dot = fname.findRev( '.' ); | 1886 | int dot = fname.findRev( '.' ); |
1895 | if( dot != -1 ) | 1887 | if( dot != -1 ) |
1896 | fname.truncate( dot ); | 1888 | fname.truncate( dot ); |
1897 | 1889 | ||
1898 | strm << _begFileConfiguration; | 1890 | if ( mocDir.isEmpty() ) |
1899 | strm << _Name5; | 1891 | mocDir = pname; |
1900 | strm << Config->Name; | 1892 | |
1901 | strm << "\">"; | 1893 | CustomBuildTool.Description = ("Uic'ing " + str + "...\""); |
1902 | strm << _begTool5; | 1894 | CustomBuildTool.CommandLine += // Create .h from .ui file |
1903 | strm << _VCCustomBuildTool; | 1895 | uicApp + " " + str + " -o " + uiHeaders + fname + ".h"; |
1904 | strm << _Description6; | 1896 | CustomBuildTool.CommandLine += // Create .cpp from .ui file |
1905 | strm << "Uic'ing " << str << "...\""; | 1897 | uicApp + " " + str + " -i " + fname + ".h -o " + uiSources + fname + ".cpp"; |
1906 | strm << _CommandLine6; | 1898 | CustomBuildTool.CommandLine += // Moc the headerfile |
1907 | strm << uicApp << " " << str << " -o " << uiHeaders << fname << ".h && "; // Create .h from .ui file | 1899 | mocApp + " " + uiHeaders + fname + ".h -o " + mocDir + Option::h_moc_mod + fname + Option::h_moc_ext; |
1908 | strm << uicApp << " " << str << " -i " << fname << ".h -o " << uiSources << fname << ".cpp && ";// Create .cpp from .ui file | 1900 | |
1909 | strm << mocApp << " " << uiHeaders << fname << ".h -o " << mocDir << "moc_" << fname << ".cpp\""; | 1901 | CustomBuildTool.AdditionalDependencies += mocApp; |
1910 | strm << _AdditionalDependencies6; | 1902 | CustomBuildTool.AdditionalDependencies += uicApp; |
1911 | strm << mocApp << ";" << uicApp << "\""; | 1903 | CustomBuildTool.Outputs += |
1912 | strm << _Outputs6; | 1904 | uiHeaders + fname + ".h;" + uiSources + fname + ".cpp;" + mocDir + Option::h_moc_mod + fname + Option::h_moc_ext; |
1913 | strm << uiHeaders << fname << ".h;" << uiSources << fname << ".cpp;" << mocDir << "moc_" << fname << ".cpp\""; | ||
1914 | strm << "/>"; | ||
1915 | strm << _endFileConfiguration; | ||
1916 | } | 1905 | } |
1917 | 1906 | ||
1918 | QTextStream &operator<<( QTextStream &strm, const VCFilter &tool ) | 1907 | void VCFilter::modifyPCHstage( QTextStream &strm, QString str ) |
1908 | { | ||
1909 | bool isCFile = str.endsWith(".c"); | ||
1910 | bool isHFile = (str.endsWith(".h") && str == Project->precompH); | ||
1911 | |||
1912 | if (!isCFile && !isHFile) | ||
1913 | return; | ||
1914 | |||
1915 | CompilerTool = VCCLCompilerTool(); | ||
1916 | useCompilerTool = TRUE; | ||
1917 | |||
1918 | // Unset some default options | ||
1919 | CompilerTool.BufferSecurityCheck = unset; | ||
1920 | CompilerTool.DebugInformationFormat = debugUnknown; | ||
1921 | CompilerTool.ExceptionHandling = unset; | ||
1922 | CompilerTool.GeneratePreprocessedFile = preprocessUnknown; | ||
1923 | CompilerTool.Optimization = optimizeDefault; | ||
1924 | CompilerTool.ProgramDataBaseFileName = QString::null; | ||
1925 | CompilerTool.RuntimeLibrary = rtUnknown; | ||
1926 | CompilerTool.WarningLevel = warningLevelUnknown; | ||
1927 | |||
1928 | // Setup PCH options | ||
1929 | CompilerTool.UsePrecompiledHeader = (isCFile ? pchNone : pchCreateUsingSpecific); | ||
1930 | CompilerTool.PrecompiledHeaderThrough = "$(NOINHERIT)"; | ||
1931 | CompilerTool.ForcedIncludeFiles = "$(NOINHERIT)"; | ||
1932 | } | ||
1933 | |||
1934 | bool VCFilter::addIMGstage( QTextStream &strm, QString str ) | ||
1935 | { | ||
1936 | bool isCorH = FALSE; | ||
1937 | if (str.endsWith(".c") || str.endsWith(".rc")) | ||
1938 | isCorH = TRUE; | ||
1939 | QStringList::Iterator it; | ||
1940 | for(it = Option::cpp_ext.begin(); it != Option::cpp_ext.end(); ++it) | ||
1941 | if(str.endsWith(*it)) | ||
1942 | isCorH = TRUE; | ||
1943 | for(it = Option::h_ext.begin(); it != Option::h_ext.end(); ++it) | ||
1944 | if(str.endsWith(*it)) | ||
1945 | isCorH = TRUE; | ||
1946 | |||
1947 | QString collectionName = Project->project->first("QMAKE_IMAGE_COLLECTION"); | ||
1948 | if (str.isEmpty() || isCorH || collectionName.isEmpty()) | ||
1949 | return FALSE; | ||
1950 | |||
1951 | CustomBuildTool = VCCustomBuildTool(); | ||
1952 | useCustomBuildTool = TRUE; | ||
1953 | |||
1954 | // Some projects (like designer core) may have too many images to | ||
1955 | // call uic directly. Therefor we have to create a temporary | ||
1956 | // file, with the image list, and call uic with the -f option. | ||
1957 | QString tmpFileCmd = "echo "; | ||
1958 | QString tmpImageFilename = ".imgcol"; | ||
1959 | QStringList& list = Project->project->variables()["IMAGES"]; | ||
1960 | bool firstOutput = TRUE; | ||
1961 | it = list.begin(); | ||
1962 | while( it!=list.end() ) { | ||
1963 | tmpFileCmd += (*it) + " "; | ||
1964 | ++it; | ||
1965 | if (tmpFileCmd.length()>250 || it==list.end()) { | ||
1966 | CustomBuildTool.CommandLine += tmpFileCmd | ||
1967 | + (firstOutput?"> ":">> ") | ||
1968 | + tmpImageFilename; | ||
1969 | tmpFileCmd = "echo "; | ||
1970 | firstOutput = FALSE; | ||
1971 | } | ||
1972 | } | ||
1973 | |||
1974 | QString uicApp = Project->var("QMAKE_UIC"); | ||
1975 | CustomBuildTool.Description = ("Generate imagecollection"); | ||
1976 | CustomBuildTool.CommandLine += | ||
1977 | uicApp + " -embed " + Project->project->first("QMAKE_ORIG_TARGET") | ||
1978 | + " -f .imgcol -o " + collectionName; | ||
1979 | CustomBuildTool.AdditionalDependencies += uicApp; | ||
1980 | CustomBuildTool.AdditionalDependencies += list; | ||
1981 | CustomBuildTool.Outputs = collectionName; | ||
1982 | CustomBuildTool.Outputs += tmpImageFilename; | ||
1983 | return TRUE; | ||
1984 | } | ||
1985 | |||
1986 | QTextStream &operator<<( QTextStream &strm, VCFilter &tool ) | ||
1919 | { | 1987 | { |
1920 | if ( tool.Files.count() == 0 ) | 1988 | if ( tool.Files.count() == 0 ) |
1921 | return strm; | 1989 | return strm; |
1922 | 1990 | ||
1923 | strm << _begFilter; | 1991 | strm << _begFilter; |
1924 | strm << SPair( _Name3, tool.Name ); | 1992 | strm << SPair( _Name3, tool.Name ); |
1925 | strm << TPair( _ParseFiles, tool.ParseFiles ); | 1993 | strm << TPair( _ParseFiles, tool.ParseFiles ); |
1926 | strm << SPair( _Filter, tool.Filter ); | 1994 | strm << SPair( _Filter, tool.Filter ); |
1927 | strm << ">"; | 1995 | strm << ">"; |
1996 | |||
1997 | bool resourceBuild = FALSE; | ||
1998 | int currentLevels = 0; | ||
1999 | QStringList currentDirs; | ||
1928 | for ( QStringList::ConstIterator it = tool.Files.begin(); it != tool.Files.end(); ++it ) { | 2000 | for ( QStringList::ConstIterator it = tool.Files.begin(); it != tool.Files.end(); ++it ) { |
2001 | if ( !tool.flat_files ) { | ||
2002 | QStringList newDirs = QStringList::split('\\',(*it)); | ||
2003 | newDirs.pop_back(); // Skip the filename | ||
2004 | |||
2005 | int newLevels = int(newDirs.count()); | ||
2006 | int equalLevels = 0; | ||
2007 | for (int i = 0; i<currentLevels; i++, equalLevels++ ) | ||
2008 | if (currentDirs[i] != newDirs[i]) | ||
2009 | break; | ||
2010 | int closeFilters = currentLevels - equalLevels; | ||
2011 | int openFilters = newLevels - equalLevels; | ||
2012 | |||
2013 | // close previous non-equal filter | ||
2014 | while ( closeFilters-- ) | ||
2015 | strm << _endFilter; | ||
2016 | |||
2017 | // open new non-equal filters | ||
2018 | newLevels = 0; | ||
2019 | while ( openFilters-- ) { | ||
2020 | strm << _begFilter; | ||
2021 | strm << SPair( _Name3, newDirs[equalLevels + newLevels] ); | ||
2022 | strm << _Filter << "\">"; // Blank filter | ||
2023 | ++newLevels; | ||
2024 | } | ||
2025 | currentDirs = newDirs; | ||
2026 | currentLevels = int(newDirs.count()); | ||
2027 | } | ||
2028 | |||
2029 | tool.useCustomBuildTool = FALSE; | ||
2030 | tool.useCompilerTool = FALSE; | ||
2031 | // Add UIC, MOC and PCH stages to file | ||
2032 | if ( tool.CustomBuild == moc ) | ||
2033 | tool.addMOCstage( strm, *it ); | ||
2034 | else if ( tool.CustomBuild == uic ) | ||
2035 | tool.addUICstage( strm, *it ); | ||
2036 | else if ( tool.CustomBuild == resource ) { | ||
2037 | if (!resourceBuild) | ||
2038 | resourceBuild = tool.addIMGstage(strm, *it); | ||
2039 | } | ||
2040 | if (tool.Project->usePCH) | ||
2041 | tool.modifyPCHstage( strm, *it ); | ||
2042 | |||
1929 | strm << _begFile; | 2043 | strm << _begFile; |
1930 | strm << SPair( _RelativePath, *it ); | 2044 | strm << SPair( _RelativePath, *it ); |
1931 | strm << ">"; | 2045 | strm << ">"; |
1932 | if ( tool.CustomBuild == moc ) | 2046 | // Output custom build and compiler options |
1933 | tool.generateMOC( strm, *it ); | 2047 | // for all configurations |
1934 | else if ( tool.CustomBuild == uic ) | 2048 | if (tool.useCustomBuildTool || tool.useCompilerTool) { |
1935 | tool.generateUIC( strm, *it ); | 2049 | for ( uint i = 0; i < tool.Config->count(); i++ ) { |
2050 | strm << _begFileConfiguration; | ||
2051 | strm << _Name5; | ||
2052 | strm << (*tool.Config)[i].Name; | ||
2053 | strm << "\">"; | ||
2054 | if (tool.useCustomBuildTool) | ||
2055 | strm << tool.CustomBuildTool; | ||
2056 | if (tool.useCompilerTool) | ||
2057 | strm << tool.CompilerTool; | ||
2058 | strm << _endFileConfiguration; | ||
2059 | } | ||
2060 | } | ||
1936 | strm << _endFile; | 2061 | strm << _endFile; |
1937 | } | 2062 | } |
1938 | 2063 | // close remaining open filters, in non-flat mode | |
2064 | while ( !tool.flat_files && currentLevels-- ) { | ||
2065 | strm << _endFilter; | ||
2066 | } | ||
1939 | strm << _endFilter; | 2067 | strm << _endFilter; |
1940 | return strm; | 2068 | return strm; |
1941 | } | 2069 | } |
1942 | 2070 | ||
1943 | // VCProject -------------------------------------------------------- | 2071 | // VCProject -------------------------------------------------------- |
1944 | VCProject::VCProject() | 2072 | VCProject::VCProject() |
1945 | { | 2073 | { |
1946 | #if defined(Q_WS_WIN32) | 2074 | VCConfiguration conf; |
1947 | GUID guid; | 2075 | Configuration += conf ; // Release |
1948 | QUuid uniqueId; | 2076 | //Configuration += conf ; // Debug added later, after Release init |
1949 | HRESULT h = CoCreateGuid( &guid ); | ||
1950 | if ( h == S_OK ) | ||
1951 | uniqueId = QUuid( guid ); | ||
1952 | ProjectGUID = uniqueId.toString(); | ||
1953 | #else | ||
1954 | // Qt doesn't support GUID on other platforms yet | ||
1955 | ProjectGUID = ""; | ||
1956 | #endif | ||
1957 | } | 2077 | } |
1958 | 2078 | ||
1959 | QTextStream &operator<<( QTextStream &strm, const VCProject &tool ) | 2079 | QTextStream &operator<<( QTextStream &strm, const VCProject &tool ) |
1960 | { | 2080 | { |
1961 | strm << _xmlInit; | 2081 | strm << _xmlInit; |
1962 | strm << _begVisualStudioProject; | 2082 | strm << _begVisualStudioProject; |
1963 | strm << _ProjectType; | 2083 | strm << _ProjectType; |
1964 | strm << SPair( _Version1, tool.Version ); | 2084 | strm << SPair( _Version1, tool.Version ); |
@@ -1968,25 +2088,26 @@ QTextStream &operator<<( QTextStream &strm, const VCProject &tool ) | |||
1968 | strm << SPair( _SccLocalPath, tool.SccLocalPath ); | 2088 | strm << SPair( _SccLocalPath, tool.SccLocalPath ); |
1969 | strm << ">"; | 2089 | strm << ">"; |
1970 | strm << _begPlatforms; | 2090 | strm << _begPlatforms; |
1971 | strm << _begPlatform; | 2091 | strm << _begPlatform; |
1972 | strm << SPair( _Name3, tool.PlatformName ); | 2092 | strm << SPair( _Name3, tool.PlatformName ); |
1973 | strm << "/>"; | 2093 | strm << "/>"; |
1974 | strm << _endPlatforms; | 2094 | strm << _endPlatforms; |
1975 | strm << _begConfigurations; | 2095 | strm << _begConfigurations; |
1976 | strm << tool.Configuration; | 2096 | for ( uint i = 0; i < tool.Configuration.count(); i++ ) |
2097 | strm << tool.Configuration[i]; | ||
1977 | strm << _endConfigurations; | 2098 | strm << _endConfigurations; |
1978 | strm << _begFiles; | 2099 | strm << _begFiles; |
1979 | strm << tool.SourceFiles; | 2100 | strm << (VCFilter&)tool.SourceFiles; |
1980 | strm << tool.HeaderFiles; | 2101 | strm << (VCFilter&)tool.HeaderFiles; |
1981 | strm << tool.MOCFiles; | 2102 | strm << (VCFilter&)tool.MOCFiles; |
1982 | strm << tool.UICFiles; | 2103 | strm << (VCFilter&)tool.UICFiles; |
1983 | strm << tool.FormFiles; | 2104 | strm << (VCFilter&)tool.FormFiles; |
1984 | strm << tool.TranslationFiles; | 2105 | strm << (VCFilter&)tool.TranslationFiles; |
1985 | strm << tool.LexYaccFiles; | 2106 | strm << (VCFilter&)tool.LexYaccFiles; |
1986 | strm << tool.ResourceFiles; | 2107 | strm << (VCFilter&)tool.ResourceFiles; |
1987 | strm << _endFiles; | 2108 | strm << _endFiles; |
1988 | strm << _begGlobals; | 2109 | strm << _begGlobals; |
1989 | strm << _endGlobals; | 2110 | strm << _endGlobals; |
1990 | strm << _endVisualStudioProject; | 2111 | strm << _endVisualStudioProject; |
1991 | return strm; | 2112 | return strm; |
1992 | } | 2113 | } |
diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h index 1dca68d..9ce38d2 100644 --- a/qmake/generators/win32/msvc_objectmodel.h +++ b/qmake/generators/win32/msvc_objectmodel.h | |||
@@ -1,16 +1,16 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** |
3 | ** | 3 | ** |
4 | ** Definition of ________ class. | 4 | ** Definition of VCProject class. |
5 | ** | 5 | ** |
6 | ** Copyright (C) 2002 Trolltech AS. All rights reserved. | 6 | ** Copyright (C) 2002-2003 Trolltech AS. All rights reserved. |
7 | ** | 7 | ** |
8 | ** This file is part of the network module of the Qt GUI Toolkit. | 8 | ** This file is part of qmake. |
9 | ** | 9 | ** |
10 | ** This file may be distributed under the terms of the Q Public License | 10 | ** This file may be distributed under the terms of the Q Public License |
11 | ** as defined by Trolltech AS of Norway and appearing in the file | 11 | ** as defined by Trolltech AS of Norway and appearing in the file |
12 | ** LICENSE.QPL included in the packaging of this file. | 12 | ** LICENSE.QPL included in the packaging of this file. |
13 | ** | 13 | ** |
14 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This file may be distributed and/or modified under the terms of the |
15 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** GNU General Public License version 2 as published by the Free Software |
16 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** Foundation and appearing in the file LICENSE.GPL included in the |
@@ -27,16 +27,17 @@ | |||
27 | ** information about Qt Commercial License Agreements. | 27 | ** information about Qt Commercial License Agreements. |
28 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. | 28 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. |
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
30 | ** | 30 | ** |
31 | ** Contact info@trolltech.com if any conditions of this licensing are | 31 | ** Contact info@trolltech.com if any conditions of this licensing are |
32 | ** not clear to you. | 32 | ** not clear to you. |
33 | ** | 33 | ** |
34 | **********************************************************************/ | 34 | **********************************************************************/ |
35 | |||
35 | #ifndef __MSVC_OBJECTMODEL_H__ | 36 | #ifndef __MSVC_OBJECTMODEL_H__ |
36 | #define __MSVC_OBJECTMODEL_H__ | 37 | #define __MSVC_OBJECTMODEL_H__ |
37 | 38 | ||
38 | #include "project.h" | 39 | #include "project.h" |
39 | #include <qstring.h> | 40 | #include <qstring.h> |
40 | #include <qstringlist.h> | 41 | #include <qstringlist.h> |
41 | 42 | ||
42 | /* | 43 | /* |
@@ -51,17 +52,18 @@ | |||
51 | corresponding property is not in the output, | 52 | corresponding property is not in the output, |
52 | forcing the tool to utilize default values. | 53 | forcing the tool to utilize default values. |
53 | False/True values will be in the output... | 54 | False/True values will be in the output... |
54 | */ | 55 | */ |
55 | enum customBuildCheck { | 56 | enum customBuildCheck { |
56 | none, | 57 | none, |
57 | moc, | 58 | moc, |
58 | uic, | 59 | uic, |
59 | lexyacc | 60 | lexyacc, |
61 | resource | ||
60 | }; | 62 | }; |
61 | enum triState { | 63 | enum triState { |
62 | unset = -1, | 64 | unset = -1, |
63 | _False = 0, | 65 | _False = 0, |
64 | _True = 1 | 66 | _True = 1 |
65 | }; | 67 | }; |
66 | enum addressAwarenessType { | 68 | enum addressAwarenessType { |
67 | addrAwareDefault, | 69 | addrAwareDefault, |
@@ -109,16 +111,17 @@ enum CompileAsOptions{ | |||
109 | enum ConfigurationTypes { | 111 | enum ConfigurationTypes { |
110 | typeUnknown = 0, | 112 | typeUnknown = 0, |
111 | typeApplication = 1, | 113 | typeApplication = 1, |
112 | typeDynamicLibrary = 2, | 114 | typeDynamicLibrary = 2, |
113 | typeStaticLibrary = 4, | 115 | typeStaticLibrary = 4, |
114 | typeGeneric = 10 | 116 | typeGeneric = 10 |
115 | }; | 117 | }; |
116 | enum debugOption { | 118 | enum debugOption { |
119 | debugUnknown = -1, | ||
117 | debugDisabled, | 120 | debugDisabled, |
118 | debugOldStyleInfo, | 121 | debugOldStyleInfo, |
119 | debugLineInfoOnly, | 122 | debugLineInfoOnly, |
120 | debugEnabled, | 123 | debugEnabled, |
121 | debugEditAndContinue | 124 | debugEditAndContinue |
122 | }; | 125 | }; |
123 | enum eAppProtectionOption { | 126 | enum eAppProtectionOption { |
124 | eAppProtectUnchanged, | 127 | eAppProtectUnchanged, |
@@ -235,17 +238,18 @@ enum favorSizeOrSpeedOption { | |||
235 | }; | 238 | }; |
236 | enum genProxyLanguage { | 239 | enum genProxyLanguage { |
237 | genProxyNative, | 240 | genProxyNative, |
238 | genProxyManaged | 241 | genProxyManaged |
239 | }; | 242 | }; |
240 | enum inlineExpansionOption { | 243 | enum inlineExpansionOption { |
241 | expandDisable, | 244 | expandDisable, |
242 | expandOnlyInline, | 245 | expandOnlyInline, |
243 | expandAnySuitable | 246 | expandAnySuitable, |
247 | expandDefault // Not useful number, but stops the output | ||
244 | }; | 248 | }; |
245 | enum linkIncrementalType { | 249 | enum linkIncrementalType { |
246 | linkIncrementalDefault, | 250 | linkIncrementalDefault, |
247 | linkIncrementalNo, | 251 | linkIncrementalNo, |
248 | linkIncrementalYes | 252 | linkIncrementalYes |
249 | }; | 253 | }; |
250 | enum linkProgressOption { | 254 | enum linkProgressOption { |
251 | linkProgressNotSet, | 255 | linkProgressNotSet, |
@@ -291,17 +295,18 @@ enum optFoldingType { | |||
291 | optNoFolding, | 295 | optNoFolding, |
292 | optFolding | 296 | optFolding |
293 | }; | 297 | }; |
294 | enum optimizeOption { | 298 | enum optimizeOption { |
295 | optimizeDisabled, | 299 | optimizeDisabled, |
296 | optimizeMinSpace, | 300 | optimizeMinSpace, |
297 | optimizeMaxSpeed, | 301 | optimizeMaxSpeed, |
298 | optimizeFull, | 302 | optimizeFull, |
299 | optimizeCustom | 303 | optimizeCustom, |
304 | optimizeDefault // Not useful number, but stops the output | ||
300 | }; | 305 | }; |
301 | enum optRefType { | 306 | enum optRefType { |
302 | optReferencesDefault, | 307 | optReferencesDefault, |
303 | optNoReferences, | 308 | optNoReferences, |
304 | optReferences | 309 | optReferences |
305 | }; | 310 | }; |
306 | enum optWin98Type { | 311 | enum optWin98Type { |
307 | optWin98Default, | 312 | optWin98Default, |
@@ -310,31 +315,33 @@ enum optWin98Type { | |||
310 | }; | 315 | }; |
311 | enum pchOption { | 316 | enum pchOption { |
312 | pchNone, | 317 | pchNone, |
313 | pchCreateUsingSpecific, | 318 | pchCreateUsingSpecific, |
314 | pchGenerateAuto, | 319 | pchGenerateAuto, |
315 | pchUseUsingSpecific | 320 | pchUseUsingSpecific |
316 | }; | 321 | }; |
317 | enum preprocessOption { | 322 | enum preprocessOption { |
323 | preprocessUnknown = -1, | ||
318 | preprocessNo, | 324 | preprocessNo, |
319 | preprocessYes, | 325 | preprocessYes, |
320 | preprocessNoLineNumbers | 326 | preprocessNoLineNumbers |
321 | }; | 327 | }; |
322 | enum ProcessorOptimizeOption { | 328 | enum ProcessorOptimizeOption { |
323 | procOptimizeBlended, | 329 | procOptimizeBlended, |
324 | procOptimizePentium, | 330 | procOptimizePentium, |
325 | procOptimizePentiumProAndAbove | 331 | procOptimizePentiumProAndAbove |
326 | }; | 332 | }; |
327 | enum RemoteDebuggerType { | 333 | enum RemoteDebuggerType { |
328 | DbgLocal, | 334 | DbgLocal, |
329 | DbgRemote, | 335 | DbgRemote, |
330 | DbgRemoteTCPIP | 336 | DbgRemoteTCPIP |
331 | }; | 337 | }; |
332 | enum runtimeLibraryOption { | 338 | enum runtimeLibraryOption { |
339 | rtUnknown = -1, | ||
333 | rtMultiThreaded, | 340 | rtMultiThreaded, |
334 | rtMultiThreadedDebug, | 341 | rtMultiThreadedDebug, |
335 | rtMultiThreadedDLL, | 342 | rtMultiThreadedDLL, |
336 | rtMultiThreadedDebugDLL, | 343 | rtMultiThreadedDebugDLL, |
337 | rtSingleThreaded, | 344 | rtSingleThreaded, |
338 | rtSingleThreadedDebug | 345 | rtSingleThreadedDebug |
339 | }; | 346 | }; |
340 | enum structMemberAlignOption { | 347 | enum structMemberAlignOption { |
@@ -374,16 +381,17 @@ enum useOfATL { | |||
374 | useATLDynamic | 381 | useATLDynamic |
375 | }; | 382 | }; |
376 | enum useOfMfc { | 383 | enum useOfMfc { |
377 | useMfcStdWin, | 384 | useMfcStdWin, |
378 | useMfcStatic, | 385 | useMfcStatic, |
379 | useMfcDynamic | 386 | useMfcDynamic |
380 | }; | 387 | }; |
381 | enum warningLevelOption { | 388 | enum warningLevelOption { |
389 | warningLevelUnknown = -1, | ||
382 | warningLevel_0, | 390 | warningLevel_0, |
383 | warningLevel_1, | 391 | warningLevel_1, |
384 | warningLevel_2, | 392 | warningLevel_2, |
385 | warningLevel_3, | 393 | warningLevel_3, |
386 | warningLevel_4 | 394 | warningLevel_4 |
387 | }; | 395 | }; |
388 | 396 | ||
389 | class VCToolBase { | 397 | class VCToolBase { |
@@ -606,19 +614,19 @@ class VCCustomBuildTool : public VCToolBase | |||
606 | public: | 614 | public: |
607 | // Functions | 615 | // Functions |
608 | VCCustomBuildTool(); | 616 | VCCustomBuildTool(); |
609 | virtual ~VCCustomBuildTool(){} | 617 | virtual ~VCCustomBuildTool(){} |
610 | bool parseOption( const char* ){ return FALSE; }; | 618 | bool parseOption( const char* ){ return FALSE; }; |
611 | 619 | ||
612 | // Variables | 620 | // Variables |
613 | QStringList AdditionalDependencies; | 621 | QStringList AdditionalDependencies; |
614 | QString CommandLine; | 622 | QStringList CommandLine; |
615 | QString Description; | 623 | QString Description; |
616 | QString Outputs; | 624 | QStringList Outputs; |
617 | QString ToolName; | 625 | QString ToolName; |
618 | QString ToolPath; | 626 | QString ToolPath; |
619 | }; | 627 | }; |
620 | 628 | ||
621 | class VCResourceCompilerTool : public VCToolBase | 629 | class VCResourceCompilerTool : public VCToolBase |
622 | { | 630 | { |
623 | public: | 631 | public: |
624 | // Functions | 632 | // Functions |
@@ -714,27 +722,34 @@ public: | |||
714 | 722 | ||
715 | class VcprojGenerator; | 723 | class VcprojGenerator; |
716 | class VCFilter | 724 | class VCFilter |
717 | { | 725 | { |
718 | public: | 726 | public: |
719 | // Functions | 727 | // Functions |
720 | VCFilter(); | 728 | VCFilter(); |
721 | ~VCFilter(){} | 729 | ~VCFilter(){} |
722 | void generateMOC( QTextStream &strm, QString str ) const; | 730 | void addMOCstage( QTextStream &strm, QString str ); |
723 | void generateUIC( QTextStream &strm, const QString& str ) const; | 731 | void addUICstage( QTextStream &strm, QString str ); |
732 | bool addIMGstage( QTextStream &strm, QString str ); | ||
733 | void modifyPCHstage( QTextStream &strm, QString str ); | ||
724 | 734 | ||
725 | // Variables | 735 | // Variables |
726 | QString Name; | 736 | QString Name; |
727 | QString Filter; | 737 | QString Filter; |
728 | triState ParseFiles; | 738 | triState ParseFiles; |
729 | QStringList Files; | 739 | QStringList Files; |
730 | VcprojGenerator*Project; | 740 | VcprojGenerator*Project; |
731 | VCConfiguration*Config; | 741 | QValueList<VCConfiguration> *Config; |
732 | customBuildCheckCustomBuild; | 742 | customBuildCheckCustomBuild; |
743 | bool useCustomBuildTool; | ||
744 | VCCustomBuildTool CustomBuildTool; | ||
745 | bool useCompilerTool; | ||
746 | VCCLCompilerTool CompilerTool; | ||
747 | bool flat_files; | ||
733 | }; | 748 | }; |
734 | 749 | ||
735 | class VCProject | 750 | class VCProject |
736 | { | 751 | { |
737 | public: | 752 | public: |
738 | // Functions | 753 | // Functions |
739 | VCProject(); | 754 | VCProject(); |
740 | ~VCProject(){} | 755 | ~VCProject(){} |
@@ -743,17 +758,17 @@ public: | |||
743 | QString Name; | 758 | QString Name; |
744 | QString Version; | 759 | QString Version; |
745 | QString ProjectGUID; | 760 | QString ProjectGUID; |
746 | QString SccProjectName; | 761 | QString SccProjectName; |
747 | QString SccLocalPath; | 762 | QString SccLocalPath; |
748 | QString PlatformName; | 763 | QString PlatformName; |
749 | 764 | ||
750 | // XML sub-parts | 765 | // XML sub-parts |
751 | VCConfigurationConfiguration; | 766 | QValueList<VCConfiguration> Configuration; |
752 | VCFilter SourceFiles; | 767 | VCFilter SourceFiles; |
753 | VCFilter HeaderFiles; | 768 | VCFilter HeaderFiles; |
754 | VCFilter MOCFiles; | 769 | VCFilter MOCFiles; |
755 | VCFilter UICFiles; | 770 | VCFilter UICFiles; |
756 | VCFilter FormFiles; | 771 | VCFilter FormFiles; |
757 | VCFilter TranslationFiles; | 772 | VCFilter TranslationFiles; |
758 | VCFilter LexYaccFiles; | 773 | VCFilter LexYaccFiles; |
759 | VCFilter ResourceFiles; | 774 | VCFilter ResourceFiles; |
@@ -762,12 +777,12 @@ public: | |||
762 | QTextStream &operator<<( QTextStream &, const VCCLCompilerTool & ); | 777 | QTextStream &operator<<( QTextStream &, const VCCLCompilerTool & ); |
763 | QTextStream &operator<<( QTextStream &, const VCLinkerTool & ); | 778 | QTextStream &operator<<( QTextStream &, const VCLinkerTool & ); |
764 | QTextStream &operator<<( QTextStream &, const VCMIDLTool & ); | 779 | QTextStream &operator<<( QTextStream &, const VCMIDLTool & ); |
765 | QTextStream &operator<<( QTextStream &, const VCCustomBuildTool & ); | 780 | QTextStream &operator<<( QTextStream &, const VCCustomBuildTool & ); |
766 | QTextStream &operator<<( QTextStream &, const VCLibrarianTool & ); | 781 | QTextStream &operator<<( QTextStream &, const VCLibrarianTool & ); |
767 | QTextStream &operator<<( QTextStream &, const VCResourceCompilerTool & ); | 782 | QTextStream &operator<<( QTextStream &, const VCResourceCompilerTool & ); |
768 | QTextStream &operator<<( QTextStream &, const VCEventTool & ); | 783 | QTextStream &operator<<( QTextStream &, const VCEventTool & ); |
769 | QTextStream &operator<<( QTextStream &, const VCConfiguration & ); | 784 | QTextStream &operator<<( QTextStream &, const VCConfiguration & ); |
770 | QTextStream &operator<<( QTextStream &, const VCFilter & ); | 785 | QTextStream &operator<<( QTextStream &, VCFilter & ); |
771 | QTextStream &operator<<( QTextStream &, const VCProject & ); | 786 | QTextStream &operator<<( QTextStream &, const VCProject & ); |
772 | 787 | ||
773 | #endif //__MSVC_OBJECTMODEL_H__ | 788 | #endif //__MSVC_OBJECTMODEL_H__ |
diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index d2cbc31..aa8fe16 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp | |||
@@ -1,18 +1,16 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** |
3 | ** | 3 | ** |
4 | ** Definition of VcprojGenerator class. | 4 | ** Implementation of VcprojGenerator class. |
5 | ** | 5 | ** |
6 | ** Created : 970521 | 6 | ** Copyright (C) 1992-2003 Trolltech AS. All rights reserved. |
7 | ** | 7 | ** |
8 | ** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. | 8 | ** This file is part of qmake. |
9 | ** | ||
10 | ** This file is part of the network module of the Qt GUI Toolkit. | ||
11 | ** | 9 | ** |
12 | ** This file may be distributed under the terms of the Q Public License | 10 | ** This file may be distributed under the terms of the Q Public License |
13 | ** as defined by Trolltech AS of Norway and appearing in the file | 11 | ** as defined by Trolltech AS of Norway and appearing in the file |
14 | ** LICENSE.QPL included in the packaging of this file. | 12 | ** LICENSE.QPL included in the packaging of this file. |
15 | ** | 13 | ** |
16 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This file may be distributed and/or modified under the terms of the |
17 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** GNU General Public License version 2 as published by the Free Software |
18 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** Foundation and appearing in the file LICENSE.GPL included in the |
@@ -32,61 +30,104 @@ | |||
32 | ** | 30 | ** |
33 | ** Contact info@trolltech.com if any conditions of this licensing are | 31 | ** Contact info@trolltech.com if any conditions of this licensing are |
34 | ** not clear to you. | 32 | ** not clear to you. |
35 | ** | 33 | ** |
36 | **********************************************************************/ | 34 | **********************************************************************/ |
37 | 35 | ||
38 | #include "msvc_vcproj.h" | 36 | #include "msvc_vcproj.h" |
39 | #include "option.h" | 37 | #include "option.h" |
38 | #include "qtmd5.h" // SG's MD5 addon | ||
40 | #include <qdir.h> | 39 | #include <qdir.h> |
41 | #include <qregexp.h> | 40 | #include <qregexp.h> |
42 | #include <qdict.h> | 41 | #include <qdict.h> |
43 | #include <quuid.h> | 42 | #include <quuid.h> |
44 | #include <stdlib.h> | 43 | #include <stdlib.h> |
44 | #include <qsettings.h> | ||
45 | |||
46 | //#define DEBUG_SOLUTION_GEN | ||
47 | //#define DEBUG_PROJECT_GEN | ||
48 | |||
49 | // Registry keys for .NET version detection ------------------------- | ||
50 | const char* _regNet2002 = "Microsoft\\VisualStudio\\7.0\\Setup\\VC\\ProductDir"; | ||
51 | const char* _regNet2003 = "Microsoft\\VisualStudio\\7.1\\Setup\\VC\\ProductDir"; | ||
45 | 52 | ||
46 | #if defined(Q_OS_WIN32) | 53 | bool use_net2003_version() |
47 | #include <objbase.h> | ||
48 | #ifndef GUID_DEFINED | ||
49 | #define GUID_DEFINED | ||
50 | typedef struct _GUID | ||
51 | { | 54 | { |
52 | ulong Data1; | 55 | #ifndef Q_OS_WIN32 |
53 | ushort Data2; | 56 | return FALSE; // Always generate 7.0 versions on other platforms |
54 | ushort Data3; | 57 | #else |
55 | uchar Data4[8]; | 58 | // Only search for the version once |
56 | } GUID; | 59 | static int current_version = -1; |
57 | #endif | 60 | if (current_version!=-1) |
61 | return (current_version==71); | ||
62 | |||
63 | // Fallback to .NET 2002 | ||
64 | current_version = 70; | ||
65 | |||
66 | // Get registry entries for both versions | ||
67 | bool ok = false; | ||
68 | QSettings setting; | ||
69 | QString path2002 = setting.readEntry(_regNet2002); | ||
70 | QString path2003 = setting.readEntry(_regNet2003); | ||
71 | |||
72 | if ( path2002.isNull() || path2003.isNull() ) { | ||
73 | // Only have one MSVC, so use that one | ||
74 | current_version = (path2003.isNull() ? 70 : 71); | ||
75 | } else { | ||
76 | // Have both, so figure out the current | ||
77 | QString paths = getenv("PATH"); | ||
78 | QStringList pathlist = QStringList::split(";", paths.lower()); | ||
79 | |||
80 | path2003 = path2003.lower(); | ||
81 | QStringList::iterator it; | ||
82 | for(it=pathlist.begin(); it!=pathlist.end(); ++it) { | ||
83 | if ((*it).contains(path2003)) { | ||
84 | current_version = 71; | ||
85 | } else if ((*it).contains(path2002) | ||
86 | && current_version == 71) { | ||
87 | fprintf( stderr, "Both .NET 2002 & .NET 2003 directories for VC found in you PATH variable!\nFallback to .NET 2002 project generation" ); | ||
88 | current_version = 70; | ||
89 | break; | ||
90 | } | ||
91 | } | ||
92 | } | ||
93 | return (current_version==71); | ||
58 | #endif | 94 | #endif |
95 | }; | ||
59 | 96 | ||
60 | // Flatfile Tags ---------------------------------------------------- | 97 | // Flatfile Tags ---------------------------------------------------- |
61 | const char* _snlHeader = "Microsoft Visual Studio Solution File, Format Version 7.00"; | 98 | const char* _slnHeader70= "Microsoft Visual Studio Solution File, Format Version 7.00"; |
99 | const char* _slnHeader71= "Microsoft Visual Studio Solution File, Format Version 8.00"; | ||
62 | // The following UUID _may_ change for later servicepacks... | 100 | // The following UUID _may_ change for later servicepacks... |
63 | // If so we need to search through the registry at | 101 | // If so we need to search through the registry at |
64 | // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\7.0\Projects | 102 | // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\7.0\Projects |
65 | // to find the subkey that contains a "PossibleProjectExtension" | 103 | // to find the subkey that contains a "PossibleProjectExtension" |
66 | // containing "vcproj"... | 104 | // containing "vcproj"... |
67 | // Use the hardcoded value for now so projects generated on other | 105 | // Use the hardcoded value for now so projects generated on other |
68 | // platforms are actually usable. | 106 | // platforms are actually usable. |
69 | const char* _snlMSVCvcprojGUID = "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"; | 107 | const char* _slnMSVCvcprojGUID = "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"; |
70 | const char* _snlProjectBeg= "\nProject(\""; | 108 | const char* _slnProjectBeg= "\nProject(\""; |
71 | const char* _snlProjectMid= "\") = "; | 109 | const char* _slnProjectMid= "\") = "; |
72 | const char* _snlProjectEnd= "\nEndProject"; | 110 | const char* _slnProjectEnd= "\nEndProject"; |
73 | const char* _snlGlobalBeg= "\nGlobal"; | 111 | const char* _slnGlobalBeg= "\nGlobal"; |
74 | const char* _snlGlobalEnd= "\nEndGlobal"; | 112 | const char* _slnGlobalEnd= "\nEndGlobal"; |
75 | const char* _snlSolutionConf= "\n\tGlobalSection(SolutionConfiguration) = preSolution" | 113 | const char* _slnSolutionConf= "\n\tGlobalSection(SolutionConfiguration) = preSolution" |
76 | "\n\t\tConfigName.0 = Release" | 114 | "\n\t\tConfigName.0 = Debug" |
115 | "\n\t\tConfigName.1 = Release" | ||
77 | "\n\tEndGlobalSection"; | 116 | "\n\tEndGlobalSection"; |
78 | const char* _snlProjDepBeg= "\n\tGlobalSection(ProjectDependencies) = postSolution"; | 117 | const char* _slnProjDepBeg= "\n\tGlobalSection(ProjectDependencies) = postSolution"; |
79 | const char* _snlProjDepEnd= "\n\tEndGlobalSection"; | 118 | const char* _slnProjDepEnd= "\n\tEndGlobalSection"; |
80 | const char* _snlProjConfBeg= "\n\tGlobalSection(ProjectConfiguration) = postSolution"; | 119 | const char* _slnProjConfBeg= "\n\tGlobalSection(ProjectConfiguration) = postSolution"; |
81 | const char* _snlProjConfTag1= ".Release.ActiveCfg = Release|Win32"; | 120 | const char* _slnProjRelConfTag1= ".Release.ActiveCfg = Release|Win32"; |
82 | const char* _snlProjConfTag2= ".Release.Build.0 = Release|Win32"; | 121 | const char* _slnProjRelConfTag2= ".Release.Build.0 = Release|Win32"; |
83 | const char* _snlProjConfEnd= "\n\tEndGlobalSection"; | 122 | const char* _slnProjDbgConfTag1= ".Debug.ActiveCfg = Debug|Win32"; |
84 | const char* _snlExtSections= "\n\tGlobalSection(ExtensibilityGlobals) = postSolution" | 123 | const char* _slnProjDbgConfTag2= ".Debug.Build.0 = Debug|Win32"; |
124 | const char* _slnProjConfEnd= "\n\tEndGlobalSection"; | ||
125 | const char* _slnExtSections= "\n\tGlobalSection(ExtensibilityGlobals) = postSolution" | ||
85 | "\n\tEndGlobalSection" | 126 | "\n\tEndGlobalSection" |
86 | "\n\tGlobalSection(ExtensibilityAddIns) = postSolution" | 127 | "\n\tGlobalSection(ExtensibilityAddIns) = postSolution" |
87 | "\n\tEndGlobalSection"; | 128 | "\n\tEndGlobalSection"; |
88 | // ------------------------------------------------------------------ | 129 | // ------------------------------------------------------------------ |
89 | 130 | ||
90 | VcprojGenerator::VcprojGenerator(QMakeProject *p) : Win32MakefileGenerator(p), init_flag(FALSE) | 131 | VcprojGenerator::VcprojGenerator(QMakeProject *p) : Win32MakefileGenerator(p), init_flag(FALSE) |
91 | { | 132 | { |
92 | } | 133 | } |
@@ -121,19 +162,49 @@ bool VcprojGenerator::writeMakefile(QTextStream &t) | |||
121 | return FALSE; | 162 | return FALSE; |
122 | 163 | ||
123 | } | 164 | } |
124 | 165 | ||
125 | struct VcsolutionDepend { | 166 | struct VcsolutionDepend { |
126 | QString uuid; | 167 | QString uuid; |
127 | QString vcprojFile, orig_target, target; | 168 | QString vcprojFile, orig_target, target; |
128 | ::target targetType; | 169 | ::target targetType; |
170 | bool debugBuild; | ||
129 | QStringList dependencies; | 171 | QStringList dependencies; |
130 | }; | 172 | }; |
131 | 173 | ||
174 | QUuid VcprojGenerator::getProjectUUID(const QString &filename) | ||
175 | { | ||
176 | bool validUUID = true; | ||
177 | |||
178 | // Read GUID from variable-space | ||
179 | QUuid uuid = project->first("GUID"); | ||
180 | |||
181 | // If none, create one based on the MD5 of absolute project path | ||
182 | if (uuid.isNull() || !filename.isNull()) { | ||
183 | QString abspath = filename.isNull()?project->first("QMAKE_MAKEFILE"):filename; | ||
184 | qtMD5(abspath.utf8(), (unsigned char*)(&uuid)); | ||
185 | validUUID = !uuid.isNull(); | ||
186 | uuid.data4[0] = (uuid.data4[0] & 0x3F) | 0x80; // UV_DCE variant | ||
187 | uuid.data3 = (uuid.data3 & 0x0FFF) | (QUuid::Name<<12); | ||
188 | } | ||
189 | |||
190 | // If still not valid, generate new one, and suggest adding to .pro | ||
191 | if (uuid.isNull() || !validUUID) { | ||
192 | uuid = QUuid::createUuid(); | ||
193 | fprintf(stderr, | ||
194 | "qmake couldn't create a GUID based on filepath, and we couldn't\nfind a valid GUID in the .pro file (Consider adding\n'GUID = %s' to the .pro file)\n", | ||
195 | uuid.toString().upper().latin1()); | ||
196 | } | ||
197 | |||
198 | // Store GUID in variable-space | ||
199 | project->values("GUID") = uuid.toString().upper(); | ||
200 | return uuid; | ||
201 | } | ||
202 | |||
132 | QUuid VcprojGenerator::increaseUUID( const QUuid &id ) | 203 | QUuid VcprojGenerator::increaseUUID( const QUuid &id ) |
133 | { | 204 | { |
134 | QUuid result( id ); | 205 | QUuid result( id ); |
135 | Q_LONG dataFirst = (result.data4[0] << 24) + | 206 | Q_LONG dataFirst = (result.data4[0] << 24) + |
136 | (result.data4[1] << 16) + | 207 | (result.data4[1] << 16) + |
137 | (result.data4[2] << 8) + | 208 | (result.data4[2] << 8) + |
138 | result.data4[3]; | 209 | result.data4[3]; |
139 | Q_LONG dataLast = (result.data4[4] << 24) + | 210 | Q_LONG dataLast = (result.data4[4] << 24) + |
@@ -158,34 +229,27 @@ QUuid VcprojGenerator::increaseUUID( const QUuid &id ) | |||
158 | void VcprojGenerator::writeSubDirs(QTextStream &t) | 229 | void VcprojGenerator::writeSubDirs(QTextStream &t) |
159 | { | 230 | { |
160 | if(project->first("TEMPLATE") == "subdirs") { | 231 | if(project->first("TEMPLATE") == "subdirs") { |
161 | writeHeader(t); | 232 | writeHeader(t); |
162 | Win32MakefileGenerator::writeSubDirs(t); | 233 | Win32MakefileGenerator::writeSubDirs(t); |
163 | return; | 234 | return; |
164 | } | 235 | } |
165 | 236 | ||
166 | t << _snlHeader; | 237 | t << (use_net2003_version() ? _slnHeader71 : _slnHeader70); |
167 | QUuid solutionGUID; | ||
168 | #if defined(Q_WS_WIN32) | ||
169 | GUID guid; | ||
170 | HRESULT h = CoCreateGuid( &guid ); | ||
171 | if ( h == S_OK ) | ||
172 | solutionGUID = QUuid( guid ); | ||
173 | #else | ||
174 | // Qt doesn't support GUID on other platforms yet, | ||
175 | // so we use the all-zero uuid, and increase that. | ||
176 | #endif | ||
177 | |||
178 | 238 | ||
179 | QDict<VcsolutionDepend> solution_depends; | 239 | QDict<VcsolutionDepend> solution_depends; |
240 | |||
180 | QPtrList<VcsolutionDepend> solution_cleanup; | 241 | QPtrList<VcsolutionDepend> solution_cleanup; |
181 | solution_cleanup.setAutoDelete(TRUE); | 242 | solution_cleanup.setAutoDelete(TRUE); |
243 | |||
244 | |||
182 | QStringList subdirs = project->variables()["SUBDIRS"]; | 245 | QStringList subdirs = project->variables()["SUBDIRS"]; |
183 | QString oldpwd = QDir::currentDirPath(); | 246 | QString oldpwd = QDir::currentDirPath(); |
247 | |||
184 | for(QStringList::Iterator it = subdirs.begin(); it != subdirs.end(); ++it) { | 248 | for(QStringList::Iterator it = subdirs.begin(); it != subdirs.end(); ++it) { |
185 | QFileInfo fi(Option::fixPathToLocalOS((*it), TRUE)); | 249 | QFileInfo fi(Option::fixPathToLocalOS((*it), TRUE)); |
186 | if(fi.exists()) { | 250 | if(fi.exists()) { |
187 | if(fi.isDir()) { | 251 | if(fi.isDir()) { |
188 | QString profile = (*it); | 252 | QString profile = (*it); |
189 | if(!profile.endsWith(Option::dir_sep)) | 253 | if(!profile.endsWith(Option::dir_sep)) |
190 | profile += Option::dir_sep; | 254 | profile += Option::dir_sep; |
191 | profile += fi.baseName() + ".pro"; | 255 | profile += fi.baseName() + ".pro"; |
@@ -194,18 +258,17 @@ void VcprojGenerator::writeSubDirs(QTextStream &t) | |||
194 | QMakeProject tmp_proj; | 258 | QMakeProject tmp_proj; |
195 | QString dir = fi.dirPath(), fn = fi.fileName(); | 259 | QString dir = fi.dirPath(), fn = fi.fileName(); |
196 | if(!dir.isEmpty()) { | 260 | if(!dir.isEmpty()) { |
197 | if(!QDir::setCurrent(dir)) | 261 | if(!QDir::setCurrent(dir)) |
198 | fprintf(stderr, "Cannot find directory: %s\n", dir.latin1()); | 262 | fprintf(stderr, "Cannot find directory: %s\n", dir.latin1()); |
199 | } | 263 | } |
200 | if(tmp_proj.read(fn, oldpwd)) { | 264 | if(tmp_proj.read(fn, oldpwd)) { |
201 | if(tmp_proj.first("TEMPLATE") == "vcsubdirs") { | 265 | if(tmp_proj.first("TEMPLATE") == "vcsubdirs") { |
202 | QStringList tmp_subdirs = fileFixify(tmp_proj.variables()["SUBDIRS"]); | 266 | subdirs += fileFixify(tmp_proj.variables()["SUBDIRS"]); |
203 | subdirs += tmp_subdirs; | ||
204 | } else if(tmp_proj.first("TEMPLATE") == "vcapp" || tmp_proj.first("TEMPLATE") == "vclib") { | 267 | } else if(tmp_proj.first("TEMPLATE") == "vcapp" || tmp_proj.first("TEMPLATE") == "vclib") { |
205 | // Initialize a 'fake' project to get the correct variables | 268 | // Initialize a 'fake' project to get the correct variables |
206 | // and to be able to extract all the dependencies | 269 | // and to be able to extract all the dependencies |
207 | VcprojGenerator tmp_vcproj(&tmp_proj); | 270 | VcprojGenerator tmp_vcproj(&tmp_proj); |
208 | tmp_vcproj.setNoIO(TRUE); | 271 | tmp_vcproj.setNoIO(TRUE); |
209 | tmp_vcproj.init(); | 272 | tmp_vcproj.init(); |
210 | if(Option::debug_level) { | 273 | if(Option::debug_level) { |
211 | QMap<QString, QStringList> &vars = tmp_proj.variables(); | 274 | QMap<QString, QStringList> &vars = tmp_proj.variables(); |
@@ -218,91 +281,113 @@ void VcprojGenerator::writeSubDirs(QTextStream &t) | |||
218 | } | 281 | } |
219 | 282 | ||
220 | // We assume project filename is [QMAKE_ORIG_TARGET].vcproj | 283 | // We assume project filename is [QMAKE_ORIG_TARGET].vcproj |
221 | QString vcproj = fixFilename(tmp_vcproj.project->first("QMAKE_ORIG_TARGET")) + project->first("VCPROJ_EXTENSION"); | 284 | QString vcproj = fixFilename(tmp_vcproj.project->first("QMAKE_ORIG_TARGET")) + project->first("VCPROJ_EXTENSION"); |
222 | 285 | ||
223 | // If file doesn't exsist, then maybe the users configuration | 286 | // If file doesn't exsist, then maybe the users configuration |
224 | // doesn't allow it to be created. Skip to next... | 287 | // doesn't allow it to be created. Skip to next... |
225 | if(!QFile::exists(QDir::currentDirPath() + Option::dir_sep + vcproj)) { | 288 | if(!QFile::exists(QDir::currentDirPath() + Option::dir_sep + vcproj)) { |
226 | qDebug( "Ignored (not found) '%s'", QString(QDir::currentDirPath() + Option::dir_sep + vcproj).latin1() ); | 289 | warn_msg(WarnLogic, "Ignored (not found) '%s'", QString(QDir::currentDirPath() + Option::dir_sep + vcproj).latin1() ); |
227 | goto nextfile; // # Dirty! | 290 | goto nextfile; // # Dirty! |
228 | } | 291 | } |
229 | 292 | ||
230 | VcsolutionDepend *newDep = new VcsolutionDepend; | 293 | VcsolutionDepend *newDep = new VcsolutionDepend; |
231 | newDep->vcprojFile = fileFixify(vcproj); | 294 | newDep->vcprojFile = fileFixify(vcproj); |
232 | newDep->orig_target = tmp_proj.first("QMAKE_ORIG_TARGET"); | 295 | newDep->orig_target = tmp_proj.first("QMAKE_ORIG_TARGET"); |
233 | newDep->target = tmp_proj.first("TARGET").section(Option::dir_sep, -1); | 296 | newDep->target = tmp_proj.first("MSVCPROJ_TARGET").section(Option::dir_sep, -1); |
234 | newDep->targetType = tmp_vcproj.projectTarget; | 297 | newDep->targetType = tmp_vcproj.projectTarget; |
235 | { | 298 | newDep->debugBuild = tmp_proj.isActiveConfig("debug"); |
236 | static QUuid uuid = solutionGUID; | 299 | newDep->uuid = getProjectUUID(Option::fixPathToLocalOS(QDir::currentDirPath() + QDir::separator() + vcproj)).toString().upper(); |
237 | uuid = increaseUUID( uuid ); | 300 | |
238 | newDep->uuid = uuid.toString().upper(); | 301 | // We want to store it as the .lib name. |
239 | } | ||
240 | if(newDep->target.endsWith(".dll")) | 302 | if(newDep->target.endsWith(".dll")) |
241 | newDep->target = newDep->target.left(newDep->target.length()-3) + "lib"; | 303 | newDep->target = newDep->target.left(newDep->target.length()-3) + "lib"; |
304 | |||
305 | // All projects using Forms are dependent on uic.exe | ||
242 | if(!tmp_proj.isEmpty("FORMS")) | 306 | if(!tmp_proj.isEmpty("FORMS")) |
243 | newDep->dependencies << "uic.exe"; | 307 | newDep->dependencies << "uic.exe"; |
244 | { | 308 | |
245 | QStringList where("QMAKE_LIBS"); | 309 | // Add all unknown libs to the deps |
246 | if(!tmp_proj.isEmpty("QMAKE_INTERNAL_PRL_LIBS")) | 310 | QStringList where("QMAKE_LIBS"); |
247 | where = tmp_proj.variables()["QMAKE_INTERNAL_PRL_LIBS"]; | 311 | if(!tmp_proj.isEmpty("QMAKE_INTERNAL_PRL_LIBS")) |
248 | for(QStringList::iterator wit = where.begin(); | 312 | where = tmp_proj.variables()["QMAKE_INTERNAL_PRL_LIBS"]; |
249 | wit != where.end(); ++wit) { | 313 | for(QStringList::iterator wit = where.begin(); |
250 | QStringList &l = tmp_proj.variables()[(*wit)]; | 314 | wit != where.end(); ++wit) { |
251 | for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) { | 315 | QStringList &l = tmp_proj.variables()[(*wit)]; |
252 | QString opt = (*it); | 316 | for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) { |
253 | if(!opt.startsWith("/")) //Not a switch | 317 | QString opt = (*it); |
254 | newDep->dependencies << opt.section(Option::dir_sep, -1); | 318 | if(!opt.startsWith("/") && // Not a switch |
319 | opt != newDep->target && // Not self | ||
320 | opt != "opengl32.lib" && // We don't care about these libs | ||
321 | opt != "glu32.lib" && // to make depgen alittle faster | ||
322 | opt != "kernel32.lib" && | ||
323 | opt != "user32.lib" && | ||
324 | opt != "gdi32.lib" && | ||
325 | opt != "comdlg32.lib" && | ||
326 | opt != "advapi32.lib" && | ||
327 | opt != "shell32.lib" && | ||
328 | opt != "ole32.lib" && | ||
329 | opt != "oleaut32.lib" && | ||
330 | opt != "uuid.lib" && | ||
331 | opt != "imm32.lib" && | ||
332 | opt != "winmm.lib" && | ||
333 | opt != "wsock32.lib" && | ||
334 | opt != "winspool.lib" && | ||
335 | opt != "delayimp.lib" ) | ||
336 | { | ||
337 | newDep->dependencies << opt.section(Option::dir_sep, -1); | ||
255 | } | 338 | } |
256 | } | 339 | } |
257 | } | 340 | } |
341 | #ifdef DEBUG_SOLUTION_GEN | ||
342 | qDebug( "Deps for %20s: [%s]", newDep->target.latin1(), newDep->dependencies.join(" :: " ).latin1() ); | ||
343 | #endif | ||
258 | solution_cleanup.append(newDep); | 344 | solution_cleanup.append(newDep); |
259 | solution_depends.insert(newDep->target, newDep); | 345 | solution_depends.insert(newDep->target, newDep); |
260 | { | 346 | t << _slnProjectBeg << _slnMSVCvcprojGUID << _slnProjectMid |
261 | QRegExp libVersion("[0-9]{3,3}\\.lib$"); | ||
262 | if(libVersion.search(newDep->target) != -1) | ||
263 | solution_depends.insert(newDep->target.left(newDep->target.length() - | ||
264 | libVersion.matchedLength()) + ".lib", newDep); | ||
265 | } | ||
266 | t << _snlProjectBeg << _snlMSVCvcprojGUID << _snlProjectMid | ||
267 | << "\"" << newDep->orig_target << "\", \"" << newDep->vcprojFile | 347 | << "\"" << newDep->orig_target << "\", \"" << newDep->vcprojFile |
268 | << "\", \"" << newDep->uuid << "\""; | 348 | << "\", \"" << newDep->uuid << "\""; |
269 | t << _snlProjectEnd; | 349 | t << _slnProjectEnd; |
270 | } | 350 | } |
271 | } | 351 | } |
272 | nextfile: | 352 | nextfile: |
273 | QDir::setCurrent(oldpwd); | 353 | QDir::setCurrent(oldpwd); |
274 | } | 354 | } |
275 | } | 355 | } |
276 | } | 356 | } |
277 | t << _snlGlobalBeg; | 357 | t << _slnGlobalBeg; |
278 | t << _snlSolutionConf; | 358 | t << _slnSolutionConf; |
279 | t << _snlProjDepBeg; | 359 | t << _slnProjDepBeg; |
360 | |||
361 | // Figure out dependencies | ||
280 | for(solution_cleanup.first(); solution_cleanup.current(); solution_cleanup.next()) { | 362 | for(solution_cleanup.first(); solution_cleanup.current(); solution_cleanup.next()) { |
363 | if(solution_cleanup.current()->targetType == StaticLib) | ||
364 | continue; // Shortcut, Static libs are not dep. | ||
281 | int cnt = 0; | 365 | int cnt = 0; |
282 | for(QStringList::iterator dit = solution_cleanup.current()->dependencies.begin(); | 366 | for(QStringList::iterator dit = solution_cleanup.current()->dependencies.begin(); |
283 | dit != solution_cleanup.current()->dependencies.end(); | 367 | dit != solution_cleanup.current()->dependencies.end(); |
284 | ++dit) { | 368 | ++dit) |
285 | VcsolutionDepend *vc; | 369 | { |
286 | if((vc=solution_depends[*dit])) { | 370 | VcsolutionDepend *vc = solution_depends[*dit]; |
287 | if(solution_cleanup.current()->targetType != StaticLib || vc->targetType == Application) | 371 | if(vc) |
288 | t << "\n\t\t" << solution_cleanup.current()->uuid << "." << cnt++ << " = " << vc->uuid; | 372 | t << "\n\t\t" << solution_cleanup.current()->uuid << "." << cnt++ << " = " << vc->uuid; |
289 | } | ||
290 | } | 373 | } |
291 | } | 374 | } |
292 | t << _snlProjDepEnd; | 375 | t << _slnProjDepEnd; |
293 | t << _snlProjConfBeg; | 376 | t << _slnProjConfBeg; |
294 | for(solution_cleanup.first(); solution_cleanup.current(); solution_cleanup.next()) { | 377 | for(solution_cleanup.first(); solution_cleanup.current(); solution_cleanup.next()) { |
295 | t << "\n\t\t" << solution_cleanup.current()->uuid << _snlProjConfTag1; | 378 | t << "\n\t\t" << solution_cleanup.current()->uuid << _slnProjDbgConfTag1; |
296 | t << "\n\t\t" << solution_cleanup.current()->uuid << _snlProjConfTag2; | 379 | t << "\n\t\t" << solution_cleanup.current()->uuid << _slnProjDbgConfTag2; |
380 | t << "\n\t\t" << solution_cleanup.current()->uuid << _slnProjRelConfTag1; | ||
381 | t << "\n\t\t" << solution_cleanup.current()->uuid << _slnProjRelConfTag2; | ||
297 | } | 382 | } |
298 | t << _snlProjConfEnd; | 383 | t << _slnProjConfEnd; |
299 | t << _snlExtSections; | 384 | t << _slnExtSections; |
300 | t << _snlGlobalEnd; | 385 | t << _slnGlobalEnd; |
301 | } | 386 | } |
302 | 387 | ||
303 | // ------------------------------------------------------------------------------------------------ | 388 | // ------------------------------------------------------------------------------------------------ |
304 | // ------------------------------------------------------------------------------------------------ | 389 | // ------------------------------------------------------------------------------------------------ |
305 | 390 | ||
306 | void VcprojGenerator::init() | 391 | void VcprojGenerator::init() |
307 | { | 392 | { |
308 | if( init_flag ) | 393 | if( init_flag ) |
@@ -364,16 +449,34 @@ void VcprojGenerator::init() | |||
364 | if ( project->first("TEMPLATE") == "vcapp" ) { | 449 | if ( project->first("TEMPLATE") == "vcapp" ) { |
365 | projectTarget = Application; | 450 | projectTarget = Application; |
366 | } else if ( project->first("TEMPLATE") == "vclib") { | 451 | } else if ( project->first("TEMPLATE") == "vclib") { |
367 | if ( project->isActiveConfig( "staticlib" ) ) | 452 | if ( project->isActiveConfig( "staticlib" ) ) |
368 | projectTarget = StaticLib; | 453 | projectTarget = StaticLib; |
369 | else | 454 | else |
370 | projectTarget = SharedLib; | 455 | projectTarget = SharedLib; |
371 | } | 456 | } |
457 | |||
458 | // Setup PCH variables | ||
459 | precompH = project->first("PRECOMPILED_HEADER"); | ||
460 | usePCH = !precompH.isEmpty() && project->isActiveConfig("precompile_header"); | ||
461 | if (usePCH) { | ||
462 | precompHFilename = QFileInfo(precompH).fileName(); | ||
463 | // Created files | ||
464 | QString origTarget = project->first("QMAKE_ORIG_TARGET"); | ||
465 | precompObj = origTarget + Option::obj_ext; | ||
466 | precompPch = origTarget + ".pch"; | ||
467 | // Add PRECOMPILED_HEADER to HEADERS | ||
468 | if (!project->variables()["HEADERS"].contains(precompH)) | ||
469 | project->variables()["HEADERS"] += precompH; | ||
470 | // Return to variable pool | ||
471 | project->variables()["PRECOMPILED_OBJECT"] = precompObj; | ||
472 | project->variables()["PRECOMPILED_PCH"] = precompPch; | ||
473 | } | ||
474 | |||
372 | initProject(); // Fills the whole project with proper data | 475 | initProject(); // Fills the whole project with proper data |
373 | } | 476 | } |
374 | 477 | ||
375 | void VcprojGenerator::initProject() | 478 | void VcprojGenerator::initProject() |
376 | { | 479 | { |
377 | // Initialize XML sub elements | 480 | // Initialize XML sub elements |
378 | // - Do this first since project elements may need | 481 | // - Do this first since project elements may need |
379 | // - to know of certain configuration options | 482 | // - to know of certain configuration options |
@@ -384,18 +487,19 @@ void VcprojGenerator::initProject() | |||
384 | initUICFiles(); | 487 | initUICFiles(); |
385 | initFormsFiles(); | 488 | initFormsFiles(); |
386 | initTranslationFiles(); | 489 | initTranslationFiles(); |
387 | initLexYaccFiles(); | 490 | initLexYaccFiles(); |
388 | initResourceFiles(); | 491 | initResourceFiles(); |
389 | 492 | ||
390 | // Own elements ----------------------------- | 493 | // Own elements ----------------------------- |
391 | vcProject.Name = project->first("QMAKE_ORIG_TARGET"); | 494 | vcProject.Name = project->first("QMAKE_ORIG_TARGET"); |
392 | vcProject.Version = "7.00"; | 495 | vcProject.Version = use_net2003_version() ? "7.10" : "7.00"; |
393 | vcProject.PlatformName = ( vcProject.Configuration.idl.TargetEnvironment == midlTargetWin64 ? "Win64" : "Win32" ); | 496 | vcProject.ProjectGUID = getProjectUUID().toString().upper(); |
497 | vcProject.PlatformName = ( vcProject.Configuration[0].idl.TargetEnvironment == midlTargetWin64 ? "Win64" : "Win32" ); | ||
394 | // These are not used by Qt, but may be used by customers | 498 | // These are not used by Qt, but may be used by customers |
395 | vcProject.SccProjectName = project->first("SCCPROJECTNAME"); | 499 | vcProject.SccProjectName = project->first("SCCPROJECTNAME"); |
396 | vcProject.SccLocalPath = project->first("SCCLOCALPATH"); | 500 | vcProject.SccLocalPath = project->first("SCCLOCALPATH"); |
397 | } | 501 | } |
398 | 502 | ||
399 | void VcprojGenerator::initConfiguration() | 503 | void VcprojGenerator::initConfiguration() |
400 | { | 504 | { |
401 | // Initialize XML sub elements | 505 | // Initialize XML sub elements |
@@ -407,339 +511,476 @@ void VcprojGenerator::initConfiguration() | |||
407 | else | 511 | else |
408 | initLinkerTool(); | 512 | initLinkerTool(); |
409 | initIDLTool(); | 513 | initIDLTool(); |
410 | 514 | ||
411 | // Own elements ----------------------------- | 515 | // Own elements ----------------------------- |
412 | QString temp = project->first("BuildBrowserInformation"); | 516 | QString temp = project->first("BuildBrowserInformation"); |
413 | switch ( projectTarget ) { | 517 | switch ( projectTarget ) { |
414 | case SharedLib: | 518 | case SharedLib: |
415 | vcProject.Configuration.ConfigurationType = typeDynamicLibrary; | 519 | vcProject.Configuration[0].ConfigurationType = typeDynamicLibrary; |
416 | break; | 520 | break; |
417 | case StaticLib: | 521 | case StaticLib: |
418 | vcProject.Configuration.ConfigurationType = typeStaticLibrary; | 522 | vcProject.Configuration[0].ConfigurationType = typeStaticLibrary; |
419 | break; | 523 | break; |
420 | case Application: | 524 | case Application: |
421 | default: | 525 | default: |
422 | vcProject.Configuration.ConfigurationType = typeApplication; | 526 | vcProject.Configuration[0].ConfigurationType = typeApplication; |
423 | break; | 527 | break; |
424 | } | 528 | } |
425 | vcProject.Configuration.Name = ( project->isActiveConfig( "debug" ) ? "Debug|" : "Release|" ); | 529 | |
426 | vcProject.Configuration.Name += ( vcProject.Configuration.idl.TargetEnvironment == midlTargetWin64 ? "Win64" : "Win32" ); | 530 | // Release version of the Configuration --------------- |
427 | vcProject.Configuration.ATLMinimizesCRunTimeLibraryUsage = ( project->first("ATLMinimizesCRunTimeLibraryUsage").isEmpty() ? _False : _True ); | 531 | VCConfiguration &RConf = vcProject.Configuration[0]; |
428 | vcProject.Configuration.BuildBrowserInformation = triState( temp.isEmpty() ? (short)unset : temp.toShort() ); | 532 | RConf.Name = "Release"; |
533 | RConf.Name += ( RConf.idl.TargetEnvironment == midlTargetWin64 ? "|Win64" : "|Win32" ); | ||
534 | RConf.ATLMinimizesCRunTimeLibraryUsage = ( project->first("ATLMinimizesCRunTimeLibraryUsage").isEmpty() ? _False : _True ); | ||
535 | RConf.BuildBrowserInformation = triState( temp.isEmpty() ? (short)unset : temp.toShort() ); | ||
429 | temp = project->first("CharacterSet"); | 536 | temp = project->first("CharacterSet"); |
430 | vcProject.Configuration.CharacterSet = charSet( temp.isEmpty() ? (short)charSetNotSet : temp.toShort() ); | 537 | RConf.CharacterSet = charSet( temp.isEmpty() ? (short)charSetNotSet : temp.toShort() ); |
431 | vcProject.Configuration.DeleteExtensionsOnClean = project->first("DeleteExtensionsOnClean"); | 538 | RConf.DeleteExtensionsOnClean = project->first("DeleteExtensionsOnClean"); |
432 | vcProject.Configuration.ImportLibrary = vcProject.Configuration.linker.ImportLibrary; | 539 | RConf.ImportLibrary = RConf.linker.ImportLibrary; |
433 | vcProject.Configuration.IntermediateDirectory = project->first("OBJECTS_DIR"); | 540 | RConf.IntermediateDirectory = project->first("OBJECTS_DIR"); |
434 | // temp = (projectTarget == StaticLib) ? project->first("DESTDIR"):project->first("DLLDESTDIR"); | 541 | RConf.OutputDirectory = "."; |
435 | vcProject.Configuration.OutputDirectory = "."; //( temp.isEmpty() ? QString(".") : temp ); | 542 | RConf.PrimaryOutput = project->first("PrimaryOutput"); |
436 | vcProject.Configuration.PrimaryOutput = project->first("PrimaryOutput"); | 543 | RConf.WholeProgramOptimization = RConf.compiler.WholeProgramOptimization; |
437 | vcProject.Configuration.WholeProgramOptimization = vcProject.Configuration.compiler.WholeProgramOptimization; | ||
438 | temp = project->first("UseOfATL"); | 544 | temp = project->first("UseOfATL"); |
439 | if ( !temp.isEmpty() ) | 545 | if ( !temp.isEmpty() ) |
440 | vcProject.Configuration.UseOfATL = useOfATL( temp.toShort() ); | 546 | RConf.UseOfATL = useOfATL( temp.toShort() ); |
441 | temp = project->first("UseOfMfc"); | 547 | temp = project->first("UseOfMfc"); |
442 | if ( !temp.isEmpty() ) | 548 | if ( !temp.isEmpty() ) |
443 | vcProject.Configuration.UseOfMfc = useOfMfc( temp.toShort() ); | 549 | RConf.UseOfMfc = useOfMfc( temp.toShort() ); |
444 | 550 | ||
445 | // Configuration does not need parameters from | 551 | // Configuration does not need parameters from |
446 | // these sub XML items; | 552 | // these sub XML items; |
447 | initCustomBuildTool(); | 553 | initCustomBuildTool(); |
448 | initPreBuildEventTools(); | 554 | initPreBuildEventTools(); |
449 | initPostBuildEventTools(); | 555 | initPostBuildEventTools(); |
450 | initPreLinkEventTools(); | 556 | initPreLinkEventTools(); |
557 | |||
558 | // Debug version of the Configuration ----------------- | ||
559 | VCConfiguration DConf = vcProject.Configuration[0]; // Create copy configuration for debug | ||
560 | DConf.Name = "Debug"; | ||
561 | DConf.Name += ( DConf.idl.TargetEnvironment == midlTargetWin64 ? "|Win64" : "|Win32" ); | ||
562 | |||
563 | // Set definite values in both configurations | ||
564 | DConf.compiler.PreprocessorDefinitions.remove("NDEBUG"); | ||
565 | RConf.compiler.PreprocessorDefinitions += "NDEBUG"; | ||
566 | RConf.linker.GenerateDebugInformation = _False; | ||
567 | DConf.linker.GenerateDebugInformation = _True; | ||
568 | |||
569 | // Modify configurations, based on Qt build | ||
570 | if ( project->isActiveConfig("debug") ) { | ||
571 | RConf.IntermediateDirectory = | ||
572 | RConf.compiler.AssemblerListingLocation = | ||
573 | RConf.compiler.ObjectFile = "Release\\"; | ||
574 | RConf.librarian.OutputFile = | ||
575 | RConf.linker.OutputFile = RConf.IntermediateDirectory + "\\" + project->first("MSVCPROJ_TARGET"); | ||
576 | RConf.linker.parseOptions(project->variables()["QMAKE_LFLAGS_RELEASE"]); | ||
577 | RConf.compiler.parseOptions(project->variables()["QMAKE_CFLAGS_RELEASE"]); | ||
578 | } else { | ||
579 | DConf.IntermediateDirectory = | ||
580 | DConf.compiler.AssemblerListingLocation = | ||
581 | DConf.compiler.ObjectFile = "Debug\\"; | ||
582 | DConf.librarian.OutputFile = | ||
583 | DConf.linker.OutputFile = DConf.IntermediateDirectory + "\\" + project->first("MSVCPROJ_TARGET"); | ||
584 | DConf.linker.DelayLoadDLLs.clear(); | ||
585 | DConf.compiler.parseOptions(project->variables()["QMAKE_CFLAGS_DEBUG"]); | ||
586 | } | ||
587 | |||
588 | // Add Debug configuration to project | ||
589 | vcProject.Configuration += DConf; | ||
451 | } | 590 | } |
452 | 591 | ||
453 | void VcprojGenerator::initCompilerTool() | 592 | void VcprojGenerator::initCompilerTool() |
454 | { | 593 | { |
455 | QString placement = project->first("OBJECTS_DIR"); | 594 | QString placement = project->first("OBJECTS_DIR"); |
456 | if ( placement.isEmpty() ) | 595 | if ( placement.isEmpty() ) |
457 | placement = ".\\"; | 596 | placement = ".\\"; |
458 | 597 | ||
459 | vcProject.Configuration.compiler.AssemblerListingLocation = placement ; | 598 | VCConfiguration &RConf = vcProject.Configuration[0]; |
460 | vcProject.Configuration.compiler.ProgramDataBaseFileName = placement ; | 599 | RConf.compiler.AssemblerListingLocation = placement ; |
461 | vcProject.Configuration.compiler.ObjectFile = placement ; | 600 | RConf.compiler.ProgramDataBaseFileName = ".\\" ; |
462 | vcProject.Configuration.compiler.PrecompiledHeaderFile = placement + project->first("QMAKE_ORIG_TARGET") + ".pch"; | 601 | RConf.compiler.ObjectFile = placement ; |
602 | // PCH | ||
603 | if ( usePCH ) { | ||
604 | RConf.compiler.UsePrecompiledHeader = pchUseUsingSpecific; | ||
605 | RConf.compiler.PrecompiledHeaderFile = "$(IntDir)\\" + precompPch; | ||
606 | RConf.compiler.PrecompiledHeaderThrough = precompHFilename; | ||
607 | RConf.compiler.ForcedIncludeFiles = precompHFilename; | ||
608 | // Minimal build option triggers an Internal Compiler Error | ||
609 | // when used in conjunction with /FI and /Yu, so remove it | ||
610 | project->variables()["QMAKE_CFLAGS_DEBUG"].remove("-Gm"); | ||
611 | project->variables()["QMAKE_CFLAGS_DEBUG"].remove("/Gm"); | ||
612 | project->variables()["QMAKE_CXXFLAGS_DEBUG"].remove("-Gm"); | ||
613 | project->variables()["QMAKE_CXXFLAGS_DEBUG"].remove("/Gm"); | ||
614 | } | ||
463 | 615 | ||
464 | if ( project->isActiveConfig("debug") ){ | 616 | if ( project->isActiveConfig("debug") ){ |
465 | // Debug version | 617 | // Debug version |
466 | vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS"] ); | 618 | RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS"] ); |
467 | vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_DEBUG"] ); | 619 | RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_DEBUG"] ); |
468 | if ( project->isActiveConfig("thread") ) { | 620 | if ( project->isActiveConfig("thread") ) { |
469 | if ( (projectTarget == Application) || (projectTarget == StaticLib) ) | 621 | if ( (projectTarget == Application) || (projectTarget == StaticLib) ) |
470 | vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT_DBG"] ); | 622 | RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT_DBG"] ); |
471 | else | 623 | else |
472 | vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT_DLLDBG"] ); | 624 | RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT_DLLDBG"] ); |
473 | } else { | 625 | } else { |
474 | vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_ST_DBG"] ); | 626 | RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT_DBG"] ); |
475 | } | 627 | } |
476 | } else { | 628 | } else { |
477 | // Release version | 629 | // Release version |
478 | vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS"] ); | 630 | RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS"] ); |
479 | vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_RELEASE"] ); | 631 | RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_RELEASE"] ); |
480 | vcProject.Configuration.compiler.PreprocessorDefinitions += "QT_NO_DEBUG"; | 632 | RConf.compiler.PreprocessorDefinitions += "QT_NO_DEBUG"; |
481 | vcProject.Configuration.compiler.PreprocessorDefinitions += "NDEBUG"; | 633 | RConf.compiler.PreprocessorDefinitions += "NDEBUG"; |
482 | if ( project->isActiveConfig("thread") ) { | 634 | if ( project->isActiveConfig("thread") ) { |
483 | if ( (projectTarget == Application) || (projectTarget == StaticLib) ) | 635 | if ( (projectTarget == Application) || (projectTarget == StaticLib) ) |
484 | vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT"] ); | 636 | RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT"] ); |
485 | else | 637 | else |
486 | vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT_DLL"] ); | 638 | RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT_DLL"] ); |
487 | } else { | 639 | } else { |
488 | vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_ST"] ); | 640 | RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT"] ); |
489 | } | 641 | } |
490 | } | 642 | } |
491 | 643 | ||
492 | // Common for both release and debug | 644 | // Common for both release and debug |
493 | if ( project->isActiveConfig("warn_off") ) | 645 | if ( project->isActiveConfig("warn_off") ) |
494 | vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_WARN_OFF"] ); | 646 | RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_WARN_OFF"] ); |
495 | else if ( project->isActiveConfig("warn_on") ) | 647 | else if ( project->isActiveConfig("warn_on") ) |
496 | vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_WARN_ON"] ); | 648 | RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_WARN_ON"] ); |
497 | if ( project->isActiveConfig("windows") ) | 649 | if ( project->isActiveConfig("windows") ) |
498 | vcProject.Configuration.compiler.PreprocessorDefinitions += project->variables()["MSVCPROJ_WINCONDEF"]; | 650 | RConf.compiler.PreprocessorDefinitions += project->variables()["MSVCPROJ_WINCONDEF"]; |
499 | 651 | ||
500 | // Can this be set for ALL configs? | 652 | // Can this be set for ALL configs? |
501 | // If so, use qmake.conf! | 653 | // If so, use qmake.conf! |
502 | if ( projectTarget == SharedLib ) | 654 | if ( projectTarget == SharedLib ) |
503 | vcProject.Configuration.compiler.PreprocessorDefinitions += "_WINDOWS"; | 655 | RConf.compiler.PreprocessorDefinitions += "_WINDOWS"; |
504 | 656 | ||
505 | vcProject.Configuration.compiler.PreprocessorDefinitions += project->variables()["DEFINES"]; | 657 | RConf.compiler.PreprocessorDefinitions += project->variables()["DEFINES"]; |
506 | vcProject.Configuration.compiler.PreprocessorDefinitions += project->variables()["PRL_EXPORT_DEFINES"]; | 658 | RConf.compiler.PreprocessorDefinitions += project->variables()["PRL_EXPORT_DEFINES"]; |
507 | vcProject.Configuration.compiler.parseOptions( project->variables()["MSVCPROJ_INCPATH"] ); | 659 | QStringList::iterator it; |
660 | for(it=RConf.compiler.PreprocessorDefinitions.begin(); | ||
661 | it!=RConf.compiler.PreprocessorDefinitions.end(); | ||
662 | ++it) | ||
663 | (*it).replace('\"', """); | ||
664 | |||
665 | RConf.compiler.parseOptions( project->variables()["MSVCPROJ_INCPATH"] ); | ||
508 | } | 666 | } |
509 | 667 | ||
510 | void VcprojGenerator::initLibrarianTool() | 668 | void VcprojGenerator::initLibrarianTool() |
511 | { | 669 | { |
512 | vcProject.Configuration.librarian.OutputFile = project->first( "DESTDIR" ); | 670 | VCConfiguration &RConf = vcProject.Configuration[0]; |
513 | if( vcProject.Configuration.librarian.OutputFile.isEmpty() ) | 671 | RConf.librarian.OutputFile = project->first( "DESTDIR" ); |
514 | vcProject.Configuration.librarian.OutputFile = ".\\"; | 672 | if( RConf.librarian.OutputFile.isEmpty() ) |
673 | RConf.librarian.OutputFile = ".\\"; | ||
515 | 674 | ||
516 | if( !vcProject.Configuration.librarian.OutputFile.endsWith("\\") ) | 675 | if( !RConf.librarian.OutputFile.endsWith("\\") ) |
517 | vcProject.Configuration.librarian.OutputFile += '\\'; | 676 | RConf.librarian.OutputFile += '\\'; |
518 | 677 | ||
519 | vcProject.Configuration.librarian.OutputFile += project->first("MSVCPROJ_TARGET"); | 678 | RConf.librarian.OutputFile += project->first("MSVCPROJ_TARGET"); |
520 | } | 679 | } |
521 | 680 | ||
522 | void VcprojGenerator::initLinkerTool() | 681 | void VcprojGenerator::initLinkerTool() |
523 | { | 682 | { |
524 | vcProject.Configuration.linker.parseOptions( project->variables()["MSVCPROJ_LFLAGS"] ); | 683 | VCConfiguration &RConf = vcProject.Configuration[0]; |
525 | vcProject.Configuration.linker.AdditionalDependencies += project->variables()["MSVCPROJ_LIBS"]; | 684 | RConf.linker.parseOptions( project->variables()["MSVCPROJ_LFLAGS"] ); |
685 | RConf.linker.AdditionalDependencies += project->variables()["MSVCPROJ_LIBS"]; | ||
526 | 686 | ||
527 | switch ( projectTarget ) { | 687 | switch ( projectTarget ) { |
528 | case Application: | 688 | case Application: |
529 | vcProject.Configuration.linker.OutputFile = project->first( "DESTDIR" ); | 689 | RConf.linker.OutputFile = project->first( "DESTDIR" ); |
530 | break; | 690 | break; |
531 | case SharedLib: | 691 | case SharedLib: |
532 | vcProject.Configuration.linker.parseOptions( project->variables()["MSVCPROJ_LIBOPTIONS"] ); | 692 | RConf.linker.parseOptions( project->variables()["MSVCPROJ_LIBOPTIONS"] ); |
533 | vcProject.Configuration.linker.OutputFile = project->first( "DLLDESTDIR" ); | 693 | RConf.linker.OutputFile = project->first( "DESTDIR" ); |
534 | break; | 694 | break; |
535 | case StaticLib: //unhandled - added to remove warnings.. | 695 | case StaticLib: //unhandled - added to remove warnings.. |
536 | break; | 696 | break; |
537 | } | 697 | } |
538 | 698 | ||
539 | if( vcProject.Configuration.linker.OutputFile.isEmpty() ) | 699 | if( RConf.linker.OutputFile.isEmpty() ) |
540 | vcProject.Configuration.linker.OutputFile = ".\\"; | 700 | RConf.linker.OutputFile = ".\\"; |
541 | 701 | ||
542 | if( !vcProject.Configuration.linker.OutputFile.endsWith("\\") ) | 702 | if( !RConf.linker.OutputFile.endsWith("\\") ) |
543 | vcProject.Configuration.linker.OutputFile += '\\'; | 703 | RConf.linker.OutputFile += '\\'; |
544 | 704 | ||
545 | vcProject.Configuration.linker.OutputFile += project->first("MSVCPROJ_TARGET"); | 705 | RConf.linker.OutputFile += project->first("MSVCPROJ_TARGET"); |
546 | vcProject.Configuration.linker.ProgramDatabaseFile = project->first("OBJECTS_DIR") + project->first("QMAKE_ORIG_TARGET") + ".pdb"; | ||
547 | 706 | ||
548 | if ( project->isActiveConfig("debug") ){ | 707 | if ( project->isActiveConfig("debug") ){ |
549 | vcProject.Configuration.linker.parseOptions( project->variables()["QMAKE_LFLAGS_DEBUG"] ); | 708 | RConf.linker.parseOptions( project->variables()["QMAKE_LFLAGS_DEBUG"] ); |
550 | } else { | 709 | } else { |
551 | vcProject.Configuration.linker.parseOptions( project->variables()["QMAKE_LFLAGS_RELEASE"] ); | 710 | RConf.linker.parseOptions( project->variables()["QMAKE_LFLAGS_RELEASE"] ); |
552 | } | 711 | } |
553 | 712 | ||
554 | if ( project->isActiveConfig("dll") ){ | 713 | if ( project->isActiveConfig("dll") ){ |
555 | vcProject.Configuration.linker.parseOptions( project->variables()["QMAKE_LFLAGS_QT_DLL"] ); | 714 | RConf.linker.parseOptions( project->variables()["QMAKE_LFLAGS_QT_DLL"] ); |
556 | } | 715 | } |
557 | 716 | ||
558 | if ( project->isActiveConfig("console") ){ | 717 | if ( project->isActiveConfig("console") ){ |
559 | vcProject.Configuration.linker.parseOptions( project->variables()["QMAKE_LFLAGS_CONSOLE"] ); | 718 | RConf.linker.parseOptions( project->variables()["QMAKE_LFLAGS_CONSOLE"] ); |
560 | } else { | 719 | } else { |
561 | vcProject.Configuration.linker.parseOptions( project->variables()["QMAKE_LFLAGS_WINDOWS"] ); | 720 | RConf.linker.parseOptions( project->variables()["QMAKE_LFLAGS_WINDOWS"] ); |
562 | } | 721 | } |
563 | 722 | ||
564 | } | 723 | } |
565 | 724 | ||
566 | void VcprojGenerator::initIDLTool() | 725 | void VcprojGenerator::initIDLTool() |
567 | { | 726 | { |
568 | } | 727 | } |
569 | 728 | ||
570 | void VcprojGenerator::initCustomBuildTool() | 729 | void VcprojGenerator::initCustomBuildTool() |
571 | { | 730 | { |
572 | } | 731 | } |
573 | 732 | ||
574 | void VcprojGenerator::initPreBuildEventTools() | 733 | void VcprojGenerator::initPreBuildEventTools() |
575 | { | 734 | { |
576 | QString collectionName = project->first("QMAKE_IMAGE_COLLECTION"); | ||
577 | if( !collectionName.isEmpty() ) { | ||
578 | QStringList& list = project->variables()["IMAGES"]; | ||
579 | vcProject.Configuration.preBuild.Description = "Generate imagecollection"; | ||
580 | //vcProject.Configuration.preBuild.AdditionalDependencies += list; | ||
581 | |||
582 | QFile imgs( ".imgcol" ); | ||
583 | imgs.open( IO_WriteOnly ); | ||
584 | QTextStream s( &imgs ); | ||
585 | QStringList::ConstIterator it = list.begin(); | ||
586 | while( it!=list.end() ) { | ||
587 | s << *it << " "; | ||
588 | it++; | ||
589 | } | ||
590 | |||
591 | vcProject.Configuration.preBuild.CommandLine = project->first("QMAKE_UIC") + " -embed " + project->first("QMAKE_ORIG_TARGET") + " -f .imgcol -o " + collectionName; | ||
592 | //vcProject.Configuration.preBuild.Outputs = collectionName; | ||
593 | |||
594 | } | ||
595 | } | 735 | } |
596 | 736 | ||
597 | void VcprojGenerator::initPostBuildEventTools() | 737 | void VcprojGenerator::initPostBuildEventTools() |
598 | { | 738 | { |
739 | VCConfiguration &RConf = vcProject.Configuration[0]; | ||
599 | if ( !project->variables()["QMAKE_POST_LINK"].isEmpty() ) { | 740 | if ( !project->variables()["QMAKE_POST_LINK"].isEmpty() ) { |
600 | vcProject.Configuration.postBuild.Description = var("QMAKE_POST_LINK"); | 741 | RConf.postBuild.Description = var("QMAKE_POST_LINK"); |
601 | vcProject.Configuration.postBuild.CommandLine = var("QMAKE_POST_LINK"); | 742 | RConf.postBuild.CommandLine = var("QMAKE_POST_LINK"); |
743 | RConf.postBuild.Description.replace(" && ", " && "); | ||
744 | RConf.postBuild.CommandLine.replace(" && ", " && "); | ||
745 | } | ||
746 | if ( !project->variables()["MSVCPROJ_COPY_DLL"].isEmpty() ) { | ||
747 | if ( !RConf.postBuild.CommandLine.isEmpty() ) | ||
748 | RConf.postBuild.CommandLine += " && "; | ||
749 | RConf.postBuild.Description += var("MSVCPROJ_COPY_DLL_DESC"); | ||
750 | RConf.postBuild.CommandLine += var("MSVCPROJ_COPY_DLL"); | ||
602 | } | 751 | } |
603 | if( project->isActiveConfig( "activeqt" ) ) { | 752 | if( project->isActiveConfig( "activeqt" ) ) { |
604 | QString name = project->first( "QMAKE_ORIG_TARGET" ); | 753 | QString name = project->first( "QMAKE_ORIG_TARGET" ); |
605 | QString nameext = project->first( "TARGET" ); | 754 | QString nameext = project->first( "TARGET" ); |
606 | QString objdir = project->first( "OBJECTS_DIR" ); | 755 | QString objdir = project->first( "OBJECTS_DIR" ); |
607 | QString idc = project->first( "QMAKE_IDC" ); | 756 | QString idc = project->first( "QMAKE_IDC" ); |
608 | 757 | ||
609 | vcProject.Configuration.postBuild.Description = "Finalizing ActiveQt server..."; | 758 | RConf.postBuild.Description = "Finalizing ActiveQt server..."; |
610 | if ( !vcProject.Configuration.postBuild.CommandLine.isEmpty() ) | 759 | if ( !RConf.postBuild.CommandLine.isEmpty() ) |
611 | vcProject.Configuration.postBuild.CommandLine += " && "; | 760 | RConf.postBuild.CommandLine += " && "; |
612 | 761 | ||
613 | if( project->isActiveConfig( "dll" ) ) { // In process | 762 | if( project->isActiveConfig( "dll" ) ) { // In process |
614 | vcProject.Configuration.postBuild.CommandLine += | 763 | RConf.postBuild.CommandLine += |
615 | // call idc to generate .idl file from .dll | 764 | // call idc to generate .idl file from .dll |
616 | idc + " " + vcProject.Configuration.OutputDirectory + "\\" + nameext + " -idl " + objdir + name + ".idl -version 1.0 && " + | 765 | idc + " "$(TargetPath)" -idl " + objdir + name + ".idl -version 1.0 && " + |
617 | // call midl to create implementations of the .idl file | 766 | // call midl to create implementations of the .idl file |
618 | project->first( "QMAKE_IDL" ) + " " + objdir + name + ".idl /nologo /o " + objdir + name + ".midl /tlb " + objdir + name + ".tlb /iid " + objdir + | 767 | project->first( "QMAKE_IDL" ) + " /nologo " + objdir + name + ".idl /tlb " + objdir + name + ".tlb && " + |
619 | "dump.midl /dlldata " + objdir + "dump.midl /cstub " + objdir + "dump.midl /header " + objdir + "dump.midl /proxy " + objdir + "dump.midl /sstub " + | ||
620 | objdir + "dump.midl && " + | ||
621 | // call idc to replace tlb... | 768 | // call idc to replace tlb... |
622 | idc + " " + vcProject.Configuration.OutputDirectory + "\\" + nameext + " /tlb " + objdir + name + ".tlb && " + | 769 | idc + " "$(TargetPath)" /tlb " + objdir + name + ".tlb && " + |
623 | // register server | 770 | // register server |
624 | idc + " " + vcProject.Configuration.OutputDirectory + "\\" + nameext + " /regserver"; | 771 | idc + " "$(TargetPath)" /regserver"; |
625 | } else { // out of process | 772 | } else { // out of process |
626 | vcProject.Configuration.postBuild.CommandLine = | 773 | RConf.postBuild.CommandLine = |
627 | // call application to dump idl | 774 | // call application to dump idl |
628 | vcProject.Configuration.OutputDirectory + "\\" + nameext + " -dumpidl " + objdir + name + ".idl -version 1.0 && " + | 775 | ""$(TargetPath)" -dumpidl " + objdir + name + ".idl -version 1.0 && " + |
629 | // call midl to create implementations of the .idl file | 776 | // call midl to create implementations of the .idl file |
630 | project->first( "QMAKE_IDL" ) + " " + objdir + name + ".idl /nologo /o " + objdir + name + ".midl /tlb " + objdir + name + ".tlb /iid " + objdir + | 777 | project->first( "QMAKE_IDL" ) + " /nologo " + objdir + name + ".idl /tlb " + objdir + name + ".tlb && " + |
631 | "dump.midl /dlldata " + objdir + "dump.midl /cstub " + objdir + "dump.midl /header " + objdir + "dump.midl /proxy " + objdir + "dump.midl /sstub " + | ||
632 | objdir + "dump.midl && " + | ||
633 | // call idc to replace tlb... | 778 | // call idc to replace tlb... |
634 | idc + " " + vcProject.Configuration.OutputDirectory + "\\" + nameext + " /tlb " + objdir + name + ".tlb && " + | 779 | idc + " "$(TargetPath)" /tlb " + objdir + name + ".tlb && " + |
635 | // call app to register | 780 | // call app to register |
636 | vcProject.Configuration.OutputDirectory + "\\" + nameext + " -regserver"; | 781 | ""$(TargetPath)" -regserver"; |
637 | } | 782 | } |
638 | } | 783 | } |
639 | } | 784 | } |
640 | 785 | ||
641 | void VcprojGenerator::initPreLinkEventTools() | 786 | void VcprojGenerator::initPreLinkEventTools() |
642 | { | 787 | { |
643 | } | 788 | } |
644 | 789 | ||
790 | |||
791 | // ------------------------------------------------------------------ | ||
792 | // Helper functions to do proper sorting of the | ||
793 | // qstringlists, for both flat and non-flat modes. | ||
794 | inline bool XLessThanY( QString &x, QString &y, bool flat_mode ) | ||
795 | { | ||
796 | if ( flat_mode ) { | ||
797 | QString subX = x.mid( x.findRev('\\')+1 ); | ||
798 | QString subY = y.mid( y.findRev('\\')+1 ); | ||
799 | return QString::compare(subX, subY) < 0; | ||
800 | } | ||
801 | |||
802 | int xPos = 0; | ||
803 | int yPos = 0; | ||
804 | int xSlashPos; | ||
805 | int ySlashPos; | ||
806 | for (;;) { | ||
807 | xSlashPos = x.find('\\', xPos); | ||
808 | ySlashPos = y.find('\\', yPos); | ||
809 | |||
810 | if (xSlashPos == -1 && ySlashPos != -1) { | ||
811 | return false; | ||
812 | } else if (xSlashPos != -1 && ySlashPos == -1) { | ||
813 | return true; | ||
814 | } else if (xSlashPos == -1 /* && yySlashPos == -1 */) { | ||
815 | QString subX = x.mid(xPos); | ||
816 | QString subY = y.mid(yPos); | ||
817 | return QString::compare(subX, subY) < 0; | ||
818 | } else { | ||
819 | QString subX = x.mid(xPos, xSlashPos - xPos); | ||
820 | QString subY = y.mid(yPos, ySlashPos - yPos); | ||
821 | int cmp = QString::compare(subX, subY); | ||
822 | if (cmp != 0) | ||
823 | return cmp < 0; | ||
824 | } | ||
825 | xPos = xSlashPos + 1; | ||
826 | yPos = ySlashPos + 1; | ||
827 | } | ||
828 | return false; | ||
829 | } | ||
830 | void nonflatDir_BubbleSort( QStringList& list, bool flat_mode ) | ||
831 | { | ||
832 | QStringList::Iterator b = list.begin(); | ||
833 | QStringList::Iterator e = list.end(); | ||
834 | QStringList::Iterator last = e; | ||
835 | --last; // goto last | ||
836 | if ( last == b )// shortcut | ||
837 | return; | ||
838 | while( b != last ) {// sort them | ||
839 | bool swapped = FALSE; | ||
840 | QStringList::Iterator swap_pos = b; | ||
841 | QStringList::Iterator x = e; | ||
842 | QStringList::Iterator y = x; | ||
843 | --y; | ||
844 | QString swap_str; | ||
845 | do { | ||
846 | --x; | ||
847 | --y; | ||
848 | if ( XLessThanY(*x,*y, flat_mode) ) { | ||
849 | swapped = TRUE; | ||
850 | swap_str = (*x); // Swap ------- | ||
851 | (*x) = (*y); | ||
852 | (*y) = swap_str; // ------------ | ||
853 | swap_pos = y; | ||
854 | } | ||
855 | } while( y != b ); | ||
856 | if ( !swapped ) | ||
857 | return; | ||
858 | b = swap_pos; | ||
859 | ++b; | ||
860 | } | ||
861 | } | ||
862 | // ------------------------------------------------------------------ | ||
863 | |||
645 | void VcprojGenerator::initSourceFiles() | 864 | void VcprojGenerator::initSourceFiles() |
646 | { | 865 | { |
866 | vcProject.SourceFiles.flat_files = project->isActiveConfig("flat"); | ||
647 | vcProject.SourceFiles.Name = "Source Files"; | 867 | vcProject.SourceFiles.Name = "Source Files"; |
648 | vcProject.SourceFiles.Filter = "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"; | 868 | vcProject.SourceFiles.Filter = "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"; |
649 | vcProject.SourceFiles.Files += project->variables()["SOURCES"]; | 869 | vcProject.SourceFiles.Files += project->variables()["SOURCES"]; |
650 | vcProject.SourceFiles.Files.sort(); | 870 | nonflatDir_BubbleSort( vcProject.SourceFiles.Files, |
871 | vcProject.SourceFiles.flat_files ); | ||
651 | vcProject.SourceFiles.Project = this; | 872 | vcProject.SourceFiles.Project = this; |
652 | vcProject.SourceFiles.Config = &(vcProject.Configuration); | 873 | vcProject.SourceFiles.Config = &(vcProject.Configuration); |
653 | vcProject.SourceFiles.CustomBuild = none; | 874 | vcProject.SourceFiles.CustomBuild = none; |
654 | } | 875 | } |
655 | 876 | ||
656 | void VcprojGenerator::initHeaderFiles() | 877 | void VcprojGenerator::initHeaderFiles() |
657 | { | 878 | { |
879 | vcProject.HeaderFiles.flat_files = project->isActiveConfig("flat"); | ||
658 | vcProject.HeaderFiles.Name = "Header Files"; | 880 | vcProject.HeaderFiles.Name = "Header Files"; |
659 | vcProject.HeaderFiles.Filter = "h;hpp;hxx;hm;inl"; | 881 | vcProject.HeaderFiles.Filter = "h;hpp;hxx;hm;inl"; |
660 | vcProject.HeaderFiles.Files += project->variables()["HEADERS"]; | 882 | vcProject.HeaderFiles.Files += project->variables()["HEADERS"]; |
661 | vcProject.HeaderFiles.Files.sort(); | 883 | if (usePCH) { // Generated PCH cpp file |
884 | if (!vcProject.HeaderFiles.Files.contains(precompH)) | ||
885 | vcProject.HeaderFiles.Files += precompH; | ||
886 | } | ||
887 | nonflatDir_BubbleSort( vcProject.HeaderFiles.Files, | ||
888 | vcProject.HeaderFiles.flat_files ); | ||
662 | vcProject.HeaderFiles.Project = this; | 889 | vcProject.HeaderFiles.Project = this; |
663 | vcProject.HeaderFiles.Config = &(vcProject.Configuration); | 890 | vcProject.HeaderFiles.Config = &(vcProject.Configuration); |
664 | vcProject.HeaderFiles.CustomBuild = moc; | 891 | vcProject.HeaderFiles.CustomBuild = moc; |
665 | } | 892 | } |
666 | 893 | ||
667 | void VcprojGenerator::initMOCFiles() | 894 | void VcprojGenerator::initMOCFiles() |
668 | { | 895 | { |
896 | vcProject.MOCFiles.flat_files = project->isActiveConfig("flat"); | ||
669 | vcProject.MOCFiles.Name = "Generated MOC Files"; | 897 | vcProject.MOCFiles.Name = "Generated MOC Files"; |
670 | vcProject.MOCFiles.Filter = "cpp;c;cxx;moc"; | 898 | vcProject.MOCFiles.Filter = "cpp;c;cxx;moc"; |
671 | vcProject.MOCFiles.Files += project->variables()["SRCMOC"]; | 899 | vcProject.MOCFiles.Files += project->variables()["SRCMOC"]; |
672 | vcProject.MOCFiles.Files.sort(); | 900 | nonflatDir_BubbleSort( vcProject.MOCFiles.Files, |
901 | vcProject.MOCFiles.flat_files ); | ||
673 | vcProject.MOCFiles.Project = this; | 902 | vcProject.MOCFiles.Project = this; |
674 | vcProject.MOCFiles.Config = &(vcProject.Configuration); | 903 | vcProject.MOCFiles.Config = &(vcProject.Configuration); |
675 | vcProject.MOCFiles.CustomBuild = moc; | 904 | vcProject.MOCFiles.CustomBuild = moc; |
676 | } | 905 | } |
677 | 906 | ||
678 | void VcprojGenerator::initUICFiles() | 907 | void VcprojGenerator::initUICFiles() |
679 | { | 908 | { |
680 | vcProject.UICFiles.Name = "Generated UI Files"; | 909 | vcProject.UICFiles.flat_files = project->isActiveConfig("flat"); |
910 | vcProject.UICFiles.Name = "Generated Form Files"; | ||
681 | vcProject.UICFiles.Filter = "cpp;c;cxx;h;hpp;hxx;"; | 911 | vcProject.UICFiles.Filter = "cpp;c;cxx;h;hpp;hxx;"; |
682 | vcProject.UICFiles.Project = this; | 912 | vcProject.UICFiles.Project = this; |
683 | vcProject.UICFiles.Files += project->variables()["UICDECLS"]; | 913 | vcProject.UICFiles.Files += project->variables()["UICDECLS"]; |
684 | vcProject.UICFiles.Files += project->variables()["UICIMPLS"]; | 914 | vcProject.UICFiles.Files += project->variables()["UICIMPLS"]; |
685 | vcProject.UICFiles.Files.sort(); | 915 | nonflatDir_BubbleSort( vcProject.UICFiles.Files, |
916 | vcProject.UICFiles.flat_files ); | ||
686 | vcProject.UICFiles.Config = &(vcProject.Configuration); | 917 | vcProject.UICFiles.Config = &(vcProject.Configuration); |
687 | vcProject.UICFiles.CustomBuild = none; | 918 | vcProject.UICFiles.CustomBuild = none; |
688 | } | 919 | } |
689 | 920 | ||
690 | void VcprojGenerator::initFormsFiles() | 921 | void VcprojGenerator::initFormsFiles() |
691 | { | 922 | { |
923 | vcProject.FormFiles.flat_files = project->isActiveConfig("flat"); | ||
692 | vcProject.FormFiles.Name = "Forms"; | 924 | vcProject.FormFiles.Name = "Forms"; |
693 | vcProject.FormFiles.ParseFiles = _False; | 925 | vcProject.FormFiles.ParseFiles = _False; |
694 | vcProject.FormFiles.Filter = "ui"; | 926 | vcProject.FormFiles.Filter = "ui"; |
695 | vcProject.FormFiles.Files += project->variables()["FORMS"]; | 927 | vcProject.FormFiles.Files += project->variables()["FORMS"]; |
696 | vcProject.FormFiles.Files.sort(); | 928 | nonflatDir_BubbleSort( vcProject.FormFiles.Files, |
929 | vcProject.FormFiles.flat_files ); | ||
697 | vcProject.FormFiles.Project = this; | 930 | vcProject.FormFiles.Project = this; |
698 | vcProject.FormFiles.Config = &(vcProject.Configuration); | 931 | vcProject.FormFiles.Config = &(vcProject.Configuration); |
699 | vcProject.FormFiles.CustomBuild = uic; | 932 | vcProject.FormFiles.CustomBuild = uic; |
700 | } | 933 | } |
701 | 934 | ||
702 | void VcprojGenerator::initTranslationFiles() | 935 | void VcprojGenerator::initTranslationFiles() |
703 | { | 936 | { |
937 | vcProject.TranslationFiles.flat_files = project->isActiveConfig("flat"); | ||
704 | vcProject.TranslationFiles.Name = "Translations Files"; | 938 | vcProject.TranslationFiles.Name = "Translations Files"; |
705 | vcProject.TranslationFiles.ParseFiles = _False; | 939 | vcProject.TranslationFiles.ParseFiles = _False; |
706 | vcProject.TranslationFiles.Filter = "ts"; | 940 | vcProject.TranslationFiles.Filter = "ts"; |
707 | vcProject.TranslationFiles.Files += project->variables()["TRANSLATIONS"]; | 941 | vcProject.TranslationFiles.Files += project->variables()["TRANSLATIONS"]; |
708 | vcProject.TranslationFiles.Files.sort(); | 942 | nonflatDir_BubbleSort( vcProject.TranslationFiles.Files, |
943 | vcProject.TranslationFiles.flat_files ); | ||
709 | vcProject.TranslationFiles.Project = this; | 944 | vcProject.TranslationFiles.Project = this; |
710 | vcProject.TranslationFiles.Config = &(vcProject.Configuration); | 945 | vcProject.TranslationFiles.Config = &(vcProject.Configuration); |
711 | vcProject.TranslationFiles.CustomBuild = none; | 946 | vcProject.TranslationFiles.CustomBuild = none; |
712 | } | 947 | } |
713 | 948 | ||
714 | void VcprojGenerator::initLexYaccFiles() | 949 | void VcprojGenerator::initLexYaccFiles() |
715 | { | 950 | { |
951 | vcProject.LexYaccFiles.flat_files = project->isActiveConfig("flat"); | ||
716 | vcProject.LexYaccFiles.Name = "Lex / Yacc Files"; | 952 | vcProject.LexYaccFiles.Name = "Lex / Yacc Files"; |
717 | vcProject.LexYaccFiles.ParseFiles = _False; | 953 | vcProject.LexYaccFiles.ParseFiles = _False; |
718 | vcProject.LexYaccFiles.Filter = "l;y"; | 954 | vcProject.LexYaccFiles.Filter = "l;y"; |
719 | vcProject.LexYaccFiles.Files += project->variables()["LEXSOURCES"]; | 955 | vcProject.LexYaccFiles.Files += project->variables()["LEXSOURCES"]; |
720 | vcProject.LexYaccFiles.Files += project->variables()["YACCSOURCES"]; | 956 | vcProject.LexYaccFiles.Files += project->variables()["YACCSOURCES"]; |
721 | vcProject.LexYaccFiles.Files.sort(); | 957 | nonflatDir_BubbleSort( vcProject.LexYaccFiles.Files, |
958 | vcProject.LexYaccFiles.flat_files ); | ||
722 | vcProject.LexYaccFiles.Project = this; | 959 | vcProject.LexYaccFiles.Project = this; |
960 | vcProject.LexYaccFiles.Config = &(vcProject.Configuration); | ||
723 | vcProject.LexYaccFiles.CustomBuild = lexyacc; | 961 | vcProject.LexYaccFiles.CustomBuild = lexyacc; |
724 | } | 962 | } |
725 | 963 | ||
726 | void VcprojGenerator::initResourceFiles() | 964 | void VcprojGenerator::initResourceFiles() |
727 | { | 965 | { |
966 | vcProject.ResourceFiles.flat_files = project->isActiveConfig("flat"); | ||
728 | vcProject.ResourceFiles.Name = "Resources"; | 967 | vcProject.ResourceFiles.Name = "Resources"; |
729 | vcProject.ResourceFiles.ParseFiles = _False; | 968 | vcProject.ResourceFiles.ParseFiles = _False; |
730 | vcProject.ResourceFiles.Filter = "cpp;ico;png;jpg;jpeg;gif;xpm;bmp;rc;ts"; | 969 | vcProject.ResourceFiles.Filter = "cpp;ico;png;jpg;jpeg;gif;xpm;bmp;rc;ts"; |
731 | vcProject.ResourceFiles.Files += project->variables()["RC_FILE"]; | 970 | vcProject.ResourceFiles.Files += project->variables()["RC_FILE"]; |
732 | vcProject.ResourceFiles.Files += project->variables()["QMAKE_IMAGE_COLLECTION"]; | 971 | vcProject.ResourceFiles.Files += project->variables()["QMAKE_IMAGE_COLLECTION"]; |
733 | vcProject.ResourceFiles.Files += project->variables()["IMAGES"]; | 972 | vcProject.ResourceFiles.Files += project->variables()["IMAGES"]; |
734 | vcProject.ResourceFiles.Files += project->variables()["IDLSOURCES"]; | 973 | vcProject.ResourceFiles.Files += project->variables()["IDLSOURCES"]; |
735 | vcProject.ResourceFiles.Files.sort(); | 974 | nonflatDir_BubbleSort( vcProject.ResourceFiles.Files, |
975 | vcProject.ResourceFiles.flat_files ); | ||
736 | vcProject.ResourceFiles.Project = this; | 976 | vcProject.ResourceFiles.Project = this; |
737 | vcProject.ResourceFiles.CustomBuild = none; | 977 | vcProject.ResourceFiles.Config = &(vcProject.Configuration); |
978 | vcProject.ResourceFiles.CustomBuild = resource; | ||
738 | } | 979 | } |
739 | 980 | ||
740 | /* \internal | 981 | /* \internal |
741 | Sets up all needed variables from the environment and all the different caches and .conf files | 982 | Sets up all needed variables from the environment and all the different caches and .conf files |
742 | */ | 983 | */ |
743 | 984 | ||
744 | void VcprojGenerator::initOld() | 985 | void VcprojGenerator::initOld() |
745 | { | 986 | { |
@@ -860,17 +1101,16 @@ void VcprojGenerator::initOld() | |||
860 | (*libit).replace(QRegExp("qt(-mt)?\\.lib"), ver); | 1101 | (*libit).replace(QRegExp("qt(-mt)?\\.lib"), ver); |
861 | } | 1102 | } |
862 | } | 1103 | } |
863 | if ( project->isActiveConfig( "activeqt" ) ) { | 1104 | if ( project->isActiveConfig( "activeqt" ) ) { |
864 | project->variables().remove("QMAKE_LIBS_QT_ENTRY"); | 1105 | project->variables().remove("QMAKE_LIBS_QT_ENTRY"); |
865 | project->variables()["QMAKE_LIBS_QT_ENTRY"] = "qaxserver.lib"; | 1106 | project->variables()["QMAKE_LIBS_QT_ENTRY"] = "qaxserver.lib"; |
866 | if ( project->isActiveConfig( "dll" ) ) { | 1107 | if ( project->isActiveConfig( "dll" ) ) { |
867 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_ENTRY"]; | 1108 | project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_ENTRY"]; |
868 | project->variables()["MSVCPROJ_LFLAGS"].append("/DEF:"+project->first("DEF_FILE")); | ||
869 | } | 1109 | } |
870 | } | 1110 | } |
871 | if ( !project->isActiveConfig("dll") && !project->isActiveConfig("plugin") ) { | 1111 | if ( !project->isActiveConfig("dll") && !project->isActiveConfig("plugin") ) { |
872 | project->variables()["QMAKE_LIBS"] +=project->variables()["QMAKE_LIBS_QT_ENTRY"]; | 1112 | project->variables()["QMAKE_LIBS"] +=project->variables()["QMAKE_LIBS_QT_ENTRY"]; |
873 | } | 1113 | } |
874 | } | 1114 | } |
875 | } | 1115 | } |
876 | 1116 | ||
@@ -934,26 +1174,36 @@ void VcprojGenerator::initOld() | |||
934 | if ( is_qt ) | 1174 | if ( is_qt ) |
935 | project->variables()["MSVCPROJ_DEBUG_OPT"] = "/GZ /Zi"; | 1175 | project->variables()["MSVCPROJ_DEBUG_OPT"] = "/GZ /Zi"; |
936 | } | 1176 | } |
937 | 1177 | ||
938 | // MOC ----------------------------------------------------------- | 1178 | // MOC ----------------------------------------------------------- |
939 | if ( project->isActiveConfig("moc") ) | 1179 | if ( project->isActiveConfig("moc") ) |
940 | setMocAware(TRUE); | 1180 | setMocAware(TRUE); |
941 | 1181 | ||
1182 | // /VERSION:x.yz ------------------------------------------------- | ||
1183 | if ( !project->variables()["VERSION"].isEmpty() ) { | ||
1184 | QString version = project->variables()["VERSION"][0]; | ||
1185 | int firstDot = version.find( "." ); | ||
1186 | QString major = version.left( firstDot ); | ||
1187 | QString minor = version.right( version.length() - firstDot - 1 ); | ||
1188 | minor.replace( ".", "" ); | ||
1189 | project->variables()["QMAKE_LFLAGS"].append( "/VERSION:" + major + "." + minor ); | ||
1190 | } | ||
942 | 1191 | ||
943 | project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"]; | 1192 | project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"]; |
944 | // Update -lname to name.lib, and -Ldir to | 1193 | // Update -lname to name.lib, and -Ldir to |
945 | QStringList &libList = project->variables()["QMAKE_LIBS"]; | 1194 | QStringList &libList = project->variables()["QMAKE_LIBS"]; |
946 | for( it = libList.begin(); it != libList.end(); ) { | 1195 | for( it = libList.begin(); it != libList.end(); ) { |
947 | QString s = *it; | 1196 | QString s = *it; |
948 | if( s.startsWith( "-l" ) ) { | 1197 | if( s.startsWith( "-l" ) ) { |
949 | it = libList.remove( it ); | 1198 | it = libList.remove( it ); |
950 | it = libList.insert( it, s.mid( 2 ) + ".lib" ); | 1199 | it = libList.insert( it, s.mid( 2 ) + ".lib" ); |
951 | } else if( s.startsWith( "-L" ) ) { | 1200 | } else if( s.startsWith( "-L" ) ) { |
1201 | project->variables()["QMAKE_LIBDIR"] += (*it).mid(2); | ||
952 | it = libList.remove( it ); | 1202 | it = libList.remove( it ); |
953 | } else { | 1203 | } else { |
954 | it++; | 1204 | it++; |
955 | } | 1205 | } |
956 | } | 1206 | } |
957 | 1207 | ||
958 | // Run through all variables containing filepaths, and ----------- | 1208 | // Run through all variables containing filepaths, and ----------- |
959 | // slash-slosh them correctly depending on current OS ----------- | 1209 | // slash-slosh them correctly depending on current OS ----------- |
@@ -1045,92 +1295,90 @@ void VcprojGenerator::initOld() | |||
1045 | 1295 | ||
1046 | QString dest; | 1296 | QString dest; |
1047 | project->variables()["MSVCPROJ_TARGET"] = project->first("TARGET"); | 1297 | project->variables()["MSVCPROJ_TARGET"] = project->first("TARGET"); |
1048 | Option::fixPathToTargetOS(project->first("TARGET")); | 1298 | Option::fixPathToTargetOS(project->first("TARGET")); |
1049 | dest = project->first("TARGET") + project->first( "TARGET_EXT" ); | 1299 | dest = project->first("TARGET") + project->first( "TARGET_EXT" ); |
1050 | if ( project->first("TARGET").startsWith("$(QTDIR)") ) | 1300 | if ( project->first("TARGET").startsWith("$(QTDIR)") ) |
1051 | dest.replace( QRegExp("\\$\\(QTDIR\\)"), getenv("QTDIR") ); | 1301 | dest.replace( QRegExp("\\$\\(QTDIR\\)"), getenv("QTDIR") ); |
1052 | project->variables()["MSVCPROJ_TARGET"] = dest; | 1302 | project->variables()["MSVCPROJ_TARGET"] = dest; |
1053 | if ( project->isActiveConfig("dll") ) { | ||
1054 | QString imp = project->first( "DESTDIR" ); | ||
1055 | if( !imp.isNull() && !imp.endsWith( "\\" ) ) | ||
1056 | imp += "\\"; | ||
1057 | imp += dest; | ||
1058 | imp.replace(QRegExp("\\.dll"), ".lib"); | ||
1059 | project->variables()["MSVCPROJ_LIBOPTIONS"] += QString("/IMPLIB:") + imp; | ||
1060 | } | ||
1061 | 1303 | ||
1062 | // DLL COPY ------------------------------------------------------ | 1304 | // DLL COPY ------------------------------------------------------ |
1063 | if ( project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty() ) { | 1305 | if ( project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty() ) { |
1064 | QStringList dlldirs = project->variables()["DLLDESTDIR"]; | 1306 | QStringList dlldirs = project->variables()["DLLDESTDIR"]; |
1065 | QString copydll = "# Begin Special Build Tool\n" | 1307 | QString copydll(""); |
1066 | "TargetPath=" + dest + "\n" | 1308 | QStringList::Iterator dlldir; |
1067 | "SOURCE=$(InputPath)\n" | 1309 | for ( dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) { |
1068 | "PostBuild_Desc=Copy DLL to " + project->first("DLLDESTDIR") + "\n" | 1310 | if ( !copydll.isEmpty() ) |
1069 | "PostBuild_Cmds="; | 1311 | copydll += " && "; |
1070 | 1312 | copydll += "copy "$(TargetPath)" "" + *dlldir + """; | |
1071 | for ( QStringList::Iterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) { | ||
1072 | copydll += "copy \"" + dest + "\" \"" + *dlldir + "\"\t"; | ||
1073 | } | 1313 | } |
1074 | 1314 | ||
1075 | copydll += "\n# End Special Build Tool"; | 1315 | QString deststr( "Copy " + dest + " to " ); |
1076 | project->variables()["MSVCPROJ_COPY_DLL_REL"].append( copydll ); | 1316 | for ( dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ) { |
1077 | project->variables()["MSVCPROJ_COPY_DLL_DBG"].append( copydll ); | 1317 | deststr += *dlldir; |
1318 | ++dlldir; | ||
1319 | if ( dlldir != dlldirs.end() ) | ||
1320 | deststr += ", "; | ||
1321 | } | ||
1322 | |||
1323 | project->variables()["MSVCPROJ_COPY_DLL"].append( copydll ); | ||
1324 | project->variables()["MSVCPROJ_COPY_DLL_DESC"].append( deststr ); | ||
1078 | } | 1325 | } |
1079 | 1326 | ||
1080 | // ACTIVEQT ------------------------------------------------------ | 1327 | // ACTIVEQT ------------------------------------------------------ |
1081 | if ( project->isActiveConfig("activeqt") ) { | 1328 | if ( project->isActiveConfig("activeqt") ) { |
1082 | QString idl = project->variables()["QMAKE_IDL"].first(); | 1329 | QString idl = project->variables()["QMAKE_IDL"].first(); |
1083 | QString idc = project->variables()["QMAKE_IDC"].first(); | 1330 | QString idc = project->variables()["QMAKE_IDC"].first(); |
1084 | QString version = project->variables()["VERSION"].first(); | 1331 | QString version = project->variables()["VERSION"].first(); |
1085 | if ( version.isEmpty() ) | 1332 | if ( version.isEmpty() ) |
1086 | version = "1.0"; | 1333 | version = "1.0"; |
1087 | 1334 | ||
1088 | project->variables()["MSVCPROJ_IDLSOURCES"].append( "tmp\\" + targetfilename + ".idl" ); | 1335 | QString objdir = project->first( "OBJECTS_DIR" ); |
1089 | project->variables()["MSVCPROJ_IDLSOURCES"].append( "tmp\\" + targetfilename + ".tlb" ); | 1336 | project->variables()["MSVCPROJ_IDLSOURCES"].append( objdir + targetfilename + ".idl" ); |
1090 | project->variables()["MSVCPROJ_IDLSOURCES"].append( "tmp\\" + targetfilename + ".midl" ); | ||
1091 | if ( project->isActiveConfig( "dll" ) ) { | 1337 | if ( project->isActiveConfig( "dll" ) ) { |
1092 | QString regcmd = "# Begin Special Build Tool\n" | 1338 | QString regcmd = "# Begin Special Build Tool\n" |
1093 | "TargetPath=" + targetfilename + "\n" | 1339 | "TargetPath=" + targetfilename + "\n" |
1094 | "SOURCE=$(InputPath)\n" | 1340 | "SOURCE=$(InputPath)\n" |
1095 | "PostBuild_Desc=Finalizing ActiveQt server...\n" | 1341 | "PostBuild_Desc=Finalizing ActiveQt server...\n" |
1096 | "PostBuild_Cmds=" + | 1342 | "PostBuild_Cmds=" + |
1097 | idc + " %1 -idl tmp\\" + targetfilename + ".idl -version " + version + | 1343 | idc + " %1 -idl " + objdir + targetfilename + ".idl -version " + version + |
1098 | "\t" + idl + " tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl" | 1344 | "\t" + idl + " /nologo " + objdir + targetfilename + ".idl /tlb " + objdir + targetfilename + ".tlb" + |
1099 | "\t" + idc + " %1 /tlb tmp\\" + targetfilename + ".tlb" | 1345 | "\t" + idc + " %1 /tlb " + objdir + targetfilename + ".tlb" |
1100 | "\tregsvr32 /s %1\n" | 1346 | "\tregsvr32 /s %1\n" |
1101 | "# End Special Build Tool"; | 1347 | "# End Special Build Tool"; |
1102 | 1348 | ||
1103 | QString executable = project->variables()["MSVCPROJ_TARGETDIRREL"].first() + "\\" + project->variables()["TARGET"].first(); | 1349 | QString executable = project->variables()["MSVCPROJ_TARGETDIRREL"].first() + "\\" + project->variables()["TARGET"].first(); |
1104 | project->variables()["MSVCPROJ_COPY_DLL_REL"].append( regcmd.arg(executable).arg(executable).arg(executable) ); | 1350 | project->variables()["MSVCPROJ_COPY_DLL_REL"].append( regcmd.arg(executable).arg(executable).arg(executable) ); |
1105 | 1351 | ||
1106 | executable = project->variables()["MSVCPROJ_TARGETDIRDEB"].first() + "\\" + project->variables()["TARGET"].first(); | 1352 | executable = project->variables()["MSVCPROJ_TARGETDIRDEB"].first() + "\\" + project->variables()["TARGET"].first(); |
1107 | project->variables()["MSVCPROJ_COPY_DLL_DBG"].append( regcmd.arg(executable).arg(executable).arg(executable) ); | 1353 | project->variables()["MSVCPROJ_COPY_DLL_DBG"].append( regcmd.arg(executable).arg(executable).arg(executable) ); |
1108 | } else { | 1354 | } else { |
1109 | QString regcmd = "# Begin Special Build Tool\n" | 1355 | QString regcmd = "# Begin Special Build Tool\n" |
1110 | "TargetPath=" + targetfilename + "\n" | 1356 | "TargetPath=" + targetfilename + "\n" |
1111 | "SOURCE=$(InputPath)\n" | 1357 | "SOURCE=$(InputPath)\n" |
1112 | "PostBuild_Desc=Finalizing ActiveQt server...\n" | 1358 | "PostBuild_Desc=Finalizing ActiveQt server...\n" |
1113 | "PostBuild_Cmds=" | 1359 | "PostBuild_Cmds=" |
1114 | "%1 -dumpidl tmp\\" + targetfilename + ".idl -version " + version + | 1360 | "%1 -dumpidl " + objdir + targetfilename + ".idl -version " + version + |
1115 | "\t" + idl + " tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl" | 1361 | "\t" + idl + " /nologo " + objdir + targetfilename + ".idl /tlb " + objdir + targetfilename + ".tlb" |
1116 | "\t" + idc + " %1 /tlb tmp\\" + targetfilename + ".tlb" | 1362 | "\t" + idc + " %1 /tlb " + objdir + targetfilename + ".tlb" |
1117 | "\t%1 -regserver\n" | 1363 | "\t%1 -regserver\n" |
1118 | "# End Special Build Tool"; | 1364 | "# End Special Build Tool"; |
1119 | 1365 | ||
1120 | QString executable = project->variables()["MSVCPROJ_TARGETDIRREL"].first() + "\\" + project->variables()["TARGET"].first(); | 1366 | QString executable = project->variables()["MSVCPROJ_TARGETDIRREL"].first() + "\\" + project->variables()["TARGET"].first(); |
1121 | project->variables()["MSVCPROJ_REGSVR_REL"].append( regcmd.arg(executable).arg(executable).arg(executable) ); | 1367 | project->variables()["MSVCPROJ_REGSVR_REL"].append( regcmd.arg(executable).arg(executable).arg(executable) ); |
1122 | 1368 | ||
1123 | executable = project->variables()["MSVCPROJ_TARGETDIRDEB"].first() + "\\" + project->variables()["TARGET"].first(); | 1369 | executable = project->variables()["MSVCPROJ_TARGETDIRDEB"].first() + "\\" + project->variables()["TARGET"].first(); |
1124 | project->variables()["MSVCPROJ_REGSVR_DBG"].append( regcmd.arg(executable).arg(executable).arg(executable) ); | 1370 | project->variables()["MSVCPROJ_REGSVR_DBG"].append( regcmd.arg(executable).arg(executable).arg(executable) ); |
1125 | } | 1371 | } |
1126 | |||
1127 | } | 1372 | } |
1128 | 1373 | ||
1374 | if ( !project->variables()["DEF_FILE"].isEmpty() ) | ||
1375 | project->variables()["MSVCPROJ_LFLAGS"].append("/DEF:"+project->first("DEF_FILE")); | ||
1376 | |||
1129 | // FORMS --------------------------------------------------------- | 1377 | // FORMS --------------------------------------------------------- |
1130 | QStringList &list = project->variables()["FORMS"]; | 1378 | QStringList &list = project->variables()["FORMS"]; |
1131 | for( it = list.begin(); it != list.end(); ++it ) { | 1379 | for( it = list.begin(); it != list.end(); ++it ) { |
1132 | if ( QFile::exists( *it + ".h" ) ) | 1380 | if ( QFile::exists( *it + ".h" ) ) |
1133 | project->variables()["SOURCES"].append( *it + ".h" ); | 1381 | project->variables()["SOURCES"].append( *it + ".h" ); |
1134 | } | 1382 | } |
1135 | 1383 | ||
1136 | project->variables()["QMAKE_INTERNAL_PRL_LIBS"] << "MSVCPROJ_LFLAGS" << "MSVCPROJ_LIBS"; | 1384 | project->variables()["QMAKE_INTERNAL_PRL_LIBS"] << "MSVCPROJ_LFLAGS" << "MSVCPROJ_LIBS"; |
diff --git a/qmake/generators/win32/msvc_vcproj.h b/qmake/generators/win32/msvc_vcproj.h index 69e0c02..d1ca666 100644 --- a/qmake/generators/win32/msvc_vcproj.h +++ b/qmake/generators/win32/msvc_vcproj.h | |||
@@ -1,18 +1,17 @@ | |||
1 | |||
1 | /**************************************************************************** | 2 | /**************************************************************************** |
2 | ** $Id$ | 3 | ** |
3 | ** | 4 | ** |
4 | ** Definition of VcprojGenerator class. | 5 | ** Definition of VcprojGenerator class. |
5 | ** | 6 | ** |
6 | ** Created : 970521 | 7 | ** Copyright (C) 1992-2003 Trolltech AS. All rights reserved. |
7 | ** | ||
8 | ** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. | ||
9 | ** | 8 | ** |
10 | ** This file is part of the network module of the Qt GUI Toolkit. | 9 | ** This file is part of qmake. |
11 | ** | 10 | ** |
12 | ** This file may be distributed under the terms of the Q Public License | 11 | ** This file may be distributed under the terms of the Q Public License |
13 | ** as defined by Trolltech AS of Norway and appearing in the file | 12 | ** as defined by Trolltech AS of Norway and appearing in the file |
14 | ** LICENSE.QPL included in the packaging of this file. | 13 | ** LICENSE.QPL included in the packaging of this file. |
15 | ** | 14 | ** |
16 | ** This file may be distributed and/or modified under the terms of the | 15 | ** This file may be distributed and/or modified under the terms of the |
17 | ** GNU General Public License version 2 as published by the Free Software | 16 | ** GNU General Public License version 2 as published by the Free Software |
18 | ** Foundation and appearing in the file LICENSE.GPL included in the | 17 | ** Foundation and appearing in the file LICENSE.GPL included in the |
@@ -29,16 +28,17 @@ | |||
29 | ** information about Qt Commercial License Agreements. | 28 | ** information about Qt Commercial License Agreements. |
30 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. | 29 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. |
31 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 30 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
32 | ** | 31 | ** |
33 | ** Contact info@trolltech.com if any conditions of this licensing are | 32 | ** Contact info@trolltech.com if any conditions of this licensing are |
34 | ** not clear to you. | 33 | ** not clear to you. |
35 | ** | 34 | ** |
36 | **********************************************************************/ | 35 | **********************************************************************/ |
36 | |||
37 | #ifndef __MSVC_VCPROJ_H__ | 37 | #ifndef __MSVC_VCPROJ_H__ |
38 | #define __MSVC_VCPROJ_H__ | 38 | #define __MSVC_VCPROJ_H__ |
39 | 39 | ||
40 | #include "winmakefile.h" | 40 | #include "winmakefile.h" |
41 | #include "msvc_objectmodel.h" | 41 | #include "msvc_objectmodel.h" |
42 | 42 | ||
43 | enum target { | 43 | enum target { |
44 | Application, | 44 | Application, |
@@ -58,16 +58,19 @@ class VcprojGenerator : public Win32MakefileGenerator | |||
58 | void init(); | 58 | void init(); |
59 | 59 | ||
60 | public: | 60 | public: |
61 | VcprojGenerator(QMakeProject *p); | 61 | VcprojGenerator(QMakeProject *p); |
62 | ~VcprojGenerator(); | 62 | ~VcprojGenerator(); |
63 | 63 | ||
64 | QString defaultMakefile() const; | 64 | QString defaultMakefile() const; |
65 | virtual bool doDepends() const { return FALSE; } //never necesary | 65 | virtual bool doDepends() const { return FALSE; } //never necesary |
66 | QString precompH, precompHFilename, | ||
67 | precompObj, precompPch; | ||
68 | bool usePCH; | ||
66 | 69 | ||
67 | protected: | 70 | protected: |
68 | virtual bool openOutput(QFile &file) const; | 71 | virtual bool openOutput(QFile &file) const; |
69 | virtual void processPrlVariable(const QString &, const QStringList &); | 72 | virtual void processPrlVariable(const QString &, const QStringList &); |
70 | virtual bool findLibraries(); | 73 | virtual bool findLibraries(); |
71 | virtual void outputVariables(); | 74 | virtual void outputVariables(); |
72 | QString fixFilename(QString ofile) const; | 75 | QString fixFilename(QString ofile) const; |
73 | 76 | ||
@@ -90,16 +93,17 @@ protected: | |||
90 | void initTranslationFiles(); | 93 | void initTranslationFiles(); |
91 | void initLexYaccFiles(); | 94 | void initLexYaccFiles(); |
92 | void initResourceFiles(); | 95 | void initResourceFiles(); |
93 | 96 | ||
94 | VCProject vcProject; | 97 | VCProject vcProject; |
95 | target projectTarget; | 98 | target projectTarget; |
96 | 99 | ||
97 | private: | 100 | private: |
101 | QUuid getProjectUUID(const QString &filename=QString::null); | ||
98 | QUuid increaseUUID(const QUuid &id); | 102 | QUuid increaseUUID(const QUuid &id); |
99 | friend class VCFilter; | 103 | friend class VCFilter; |
100 | }; | 104 | }; |
101 | 105 | ||
102 | inline VcprojGenerator::~VcprojGenerator() | 106 | inline VcprojGenerator::~VcprojGenerator() |
103 | { } | 107 | { } |
104 | 108 | ||
105 | inline QString VcprojGenerator::defaultMakefile() const | 109 | inline QString VcprojGenerator::defaultMakefile() const |
diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp index bc3fed9..cd733c6 100644 --- a/qmake/generators/win32/winmakefile.cpp +++ b/qmake/generators/win32/winmakefile.cpp | |||
@@ -1,18 +1,16 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** |
3 | ** | 3 | ** |
4 | ** Definition of ________ class. | 4 | ** Implementation of Win32MakefileGenerator class. |
5 | ** | 5 | ** |
6 | ** Created : 970521 | 6 | ** Copyright (C) 1992-2003 Trolltech AS. All rights reserved. |
7 | ** | 7 | ** |
8 | ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. | 8 | ** This file is part of qmake. |
9 | ** | ||
10 | ** This file is part of the network module of the Qt GUI Toolkit. | ||
11 | ** | 9 | ** |
12 | ** This file may be distributed under the terms of the Q Public License | 10 | ** This file may be distributed under the terms of the Q Public License |
13 | ** as defined by Trolltech AS of Norway and appearing in the file | 11 | ** as defined by Trolltech AS of Norway and appearing in the file |
14 | ** LICENSE.QPL included in the packaging of this file. | 12 | ** LICENSE.QPL included in the packaging of this file. |
15 | ** | 13 | ** |
16 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This file may be distributed and/or modified under the terms of the |
17 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** GNU General Public License version 2 as published by the Free Software |
18 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** Foundation and appearing in the file LICENSE.GPL included in the |
@@ -33,16 +31,17 @@ | |||
33 | ** Contact info@trolltech.com if any conditions of this licensing are | 31 | ** Contact info@trolltech.com if any conditions of this licensing are |
34 | ** not clear to you. | 32 | ** not clear to you. |
35 | ** | 33 | ** |
36 | **********************************************************************/ | 34 | **********************************************************************/ |
37 | 35 | ||
38 | #include "winmakefile.h" | 36 | #include "winmakefile.h" |
39 | #include "option.h" | 37 | #include "option.h" |
40 | #include "project.h" | 38 | #include "project.h" |
39 | #include "meta.h" | ||
41 | #include <qtextstream.h> | 40 | #include <qtextstream.h> |
42 | #include <qstring.h> | 41 | #include <qstring.h> |
43 | #include <qdict.h> | 42 | #include <qdict.h> |
44 | #include <qregexp.h> | 43 | #include <qregexp.h> |
45 | #include <qstringlist.h> | 44 | #include <qstringlist.h> |
46 | #include <qdir.h> | 45 | #include <qdir.h> |
47 | 46 | ||
48 | 47 | ||
@@ -92,35 +91,32 @@ Win32MakefileGenerator::writeSubDirs(QTextStream &t) | |||
92 | } | 91 | } |
93 | sd->target = "sub-" + (*it); | 92 | sd->target = "sub-" + (*it); |
94 | sd->target.replace('/', '-'); | 93 | sd->target.replace('/', '-'); |
95 | sd->target.replace('.', '_'); | 94 | sd->target.replace('.', '_'); |
96 | } | 95 | } |
97 | } | 96 | } |
98 | QPtrListIterator<SubDir> it(subdirs); | 97 | QPtrListIterator<SubDir> it(subdirs); |
99 | 98 | ||
100 | if(!project->isEmpty("MAKEFILE")) | 99 | t << "MAKEFILE = " << (project->isEmpty("MAKEFILE") ? QString("Makefile") : var("MAKEFILE")) << endl; |
101 | t << "MAKEFILE=" << var("MAKEFILE") << endl; | ||
102 | t << "QMAKE =" << (project->isEmpty("QMAKE_QMAKE") ? QString("qmake") : var("QMAKE_QMAKE")) << endl; | 100 | t << "QMAKE =" << (project->isEmpty("QMAKE_QMAKE") ? QString("qmake") : var("QMAKE_QMAKE")) << endl; |
103 | t << "SUBTARGETS= "; | 101 | t << "SUBTARGETS= "; |
104 | for( it.toFirst(); it.current(); ++it) | 102 | for( it.toFirst(); it.current(); ++it) |
105 | t << " \\\n\t\t" << it.current()->target; | 103 | t << " \\\n\t\t" << it.current()->target; |
106 | t << endl << endl; | 104 | t << endl << endl; |
107 | t << "all: qmake_all $(SUBTARGETS)" << endl << endl; | 105 | t << "all: $(MAKEFILE) $(SUBTARGETS)" << endl << endl; |
108 | 106 | ||
109 | for( it.toFirst(); it.current(); ++it) { | 107 | for( it.toFirst(); it.current(); ++it) { |
110 | bool have_dir = !(*it)->directory.isEmpty(); | 108 | bool have_dir = !(*it)->directory.isEmpty(); |
111 | 109 | ||
112 | //make the makefile | 110 | //make the makefile |
113 | QString mkfile = (*it)->makefile; | 111 | QString mkfile = (*it)->makefile; |
114 | if(have_dir) | 112 | if(have_dir) |
115 | mkfile.prepend((*it)->directory + Option::dir_sep); | 113 | mkfile.prepend((*it)->directory + Option::dir_sep); |
116 | t << mkfile << ":"; | 114 | t << mkfile << ":"; |
117 | if(project->variables()["QMAKE_NOFORCE"].isEmpty()) | ||
118 | t << " FORCE"; | ||
119 | if(have_dir) | 115 | if(have_dir) |
120 | t << "\n\t" << "cd " << (*it)->directory; | 116 | t << "\n\t" << "cd " << (*it)->directory; |
121 | t << "\n\t" << "$(QMAKE) " << (*it)->profile << " " << buildArgs(); | 117 | t << "\n\t" << "$(QMAKE) " << (*it)->profile << " " << buildArgs(); |
122 | t << " -o " << (*it)->makefile; | 118 | t << " -o " << (*it)->makefile; |
123 | if(have_dir) { | 119 | if(have_dir) { |
124 | int subLevels = it.current()->directory.contains(Option::dir_sep) + 1; | 120 | int subLevels = it.current()->directory.contains(Option::dir_sep) + 1; |
125 | t << "\n\t" << "@cd .."; | 121 | t << "\n\t" << "@cd .."; |
126 | for(int i = 1; i < subLevels; i++ ) | 122 | for(int i = 1; i < subLevels; i++ ) |
@@ -140,16 +136,26 @@ Win32MakefileGenerator::writeSubDirs(QTextStream &t) | |||
140 | int subLevels = it.current()->directory.contains(Option::dir_sep) + 1; | 136 | int subLevels = it.current()->directory.contains(Option::dir_sep) + 1; |
141 | t << "\n\t" << "@cd .."; | 137 | t << "\n\t" << "@cd .."; |
142 | for(int i = 1; i < subLevels; i++ ) | 138 | for(int i = 1; i < subLevels; i++ ) |
143 | t << Option::dir_sep << ".."; | 139 | t << Option::dir_sep << ".."; |
144 | } | 140 | } |
145 | t << endl << endl; | 141 | t << endl << endl; |
146 | } | 142 | } |
147 | 143 | ||
144 | if (project->isActiveConfig("ordered")) { // generate dependencies | ||
145 | for( it.toFirst(); it.current(); ) { | ||
146 | QString tar = it.current()->target; | ||
147 | ++it; | ||
148 | if (it.current()) | ||
149 | t << it.current()->target << ": " << tar << endl; | ||
150 | } | ||
151 | t << endl; | ||
152 | } | ||
153 | |||
148 | if(project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].findIndex("qmake_all") == -1) | 154 | if(project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].findIndex("qmake_all") == -1) |
149 | project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].append("qmake_all"); | 155 | project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].append("qmake_all"); |
150 | writeMakeQmake(t); | 156 | writeMakeQmake(t); |
151 | 157 | ||
152 | t << "qmake_all:"; | 158 | t << "qmake_all:"; |
153 | if ( !subdirs.isEmpty() ) { | 159 | if ( !subdirs.isEmpty() ) { |
154 | for( it.toFirst(); it.current(); ++it) { | 160 | for( it.toFirst(); it.current(); ++it) { |
155 | QString subdir = (*it)->directory; | 161 | QString subdir = (*it)->directory; |
@@ -170,43 +176,76 @@ Win32MakefileGenerator::writeSubDirs(QTextStream &t) | |||
170 | } | 176 | } |
171 | } else { | 177 | } else { |
172 | // Borland make does not like empty an empty command section, so insert | 178 | // Borland make does not like empty an empty command section, so insert |
173 | // a dummy command. | 179 | // a dummy command. |
174 | t << "\n\t" << "@cd ."; | 180 | t << "\n\t" << "@cd ."; |
175 | } | 181 | } |
176 | t << endl << endl; | 182 | t << endl << endl; |
177 | 183 | ||
178 | QString targs[] = { QString("clean"), QString("install"), QString("mocclean"), QString::null }; | 184 | QStringList targs; |
179 | for(int x = 0; targs[x] != QString::null; x++) { | 185 | targs << "clean" << "install_subdirs" << "mocables" << "uicables" << "uiclean" << "mocclean"; |
180 | t << targs[x] << ": qmake_all"; | 186 | targs += project->values("SUBDIR_TARGETS"); |
181 | if(targs[x] == "clean") | 187 | for(QStringList::Iterator targ_it = targs.begin(); targ_it != targs.end(); ++targ_it) { |
182 | t << varGlue("QMAKE_CLEAN","\n\t-del ","\n\t-del ", ""); | 188 | t << (*targ_it) << ": qmake_all"; |
189 | QString targ = (*targ_it); | ||
190 | if(targ == "install_subdirs") | ||
191 | targ = "install"; | ||
192 | else if(targ == "uninstall_subdirs") | ||
193 | targ = "uninstall"; | ||
194 | if(targ == "clean") | ||
195 | t << varGlue("QMAKE_CLEAN","\n\t-$(DEL_FILE) ","\n\t-$(DEL_FILE) ", ""); | ||
183 | if (!subdirs.isEmpty()) { | 196 | if (!subdirs.isEmpty()) { |
184 | for( it.toFirst(); it.current(); ++it) { | 197 | for( it.toFirst(); it.current(); ++it) { |
185 | int subLevels = (*it)->directory.contains(Option::dir_sep) + 1; | 198 | int subLevels = (*it)->directory.contains(Option::dir_sep) + 1; |
186 | bool have_dir = !(*it)->directory.isEmpty(); | 199 | bool have_dir = !(*it)->directory.isEmpty(); |
187 | if(have_dir) | 200 | if(have_dir) |
188 | t << "\n\t" << "cd " << (*it)->directory; | 201 | t << "\n\t" << "cd " << (*it)->directory; |
189 | QString in_file = " -f " + (*it)->makefile; | 202 | QString in_file = " -f " + (*it)->makefile; |
190 | t << "\n\t" << "$(MAKE) " << in_file << " " << targs[x]; | 203 | t << "\n\t" << "$(MAKE) " << in_file << " " << targ; |
191 | if(have_dir) { | 204 | if(have_dir) { |
192 | t << "\n\t" << "@cd .."; | 205 | t << "\n\t" << "@cd .."; |
193 | for(int i = 1; i < subLevels; i++ ) | 206 | for(int i = 1; i < subLevels; i++ ) |
194 | t << Option::dir_sep << ".."; | 207 | t << Option::dir_sep << ".."; |
195 | } | 208 | } |
196 | } | 209 | } |
197 | } else { | 210 | } else { |
198 | // Borland make does not like empty an empty command section, so | 211 | // Borland make does not like empty an empty command section, so |
199 | // insert a dummy command. | 212 | // insert a dummy command. |
200 | t << "\n\t" << "@cd ."; | 213 | t << "\n\t" << "@cd ."; |
201 | } | 214 | } |
202 | t << endl << endl; | 215 | t << endl << endl; |
203 | } | 216 | } |
204 | 217 | ||
218 | //installations | ||
219 | project->variables()["INSTALLDEPS"] += "install_subdirs"; | ||
220 | project->variables()["UNINSTALLDEPS"] += "uninstall_subdirs"; | ||
221 | writeInstalls(t, "INSTALLS"); | ||
222 | |||
223 | // user defined targets | ||
224 | QStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"]; | ||
225 | for(QStringList::Iterator sit = qut.begin(); sit != qut.end(); ++sit) { | ||
226 | QString targ = var((*sit) + ".target"), | ||
227 | cmd = var((*sit) + ".commands"), deps; | ||
228 | if(targ.isEmpty()) | ||
229 | targ = (*sit); | ||
230 | QStringList &deplist = project->variables()[(*sit) + ".depends"]; | ||
231 | for(QStringList::Iterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) { | ||
232 | QString dep = var((*dep_it) + ".target"); | ||
233 | if(dep.isEmpty()) | ||
234 | dep = (*dep_it); | ||
235 | deps += " " + dep; | ||
236 | } | ||
237 | if(!project->variables()["QMAKE_NOFORCE"].isEmpty() && | ||
238 | project->variables()[(*sit) + ".CONFIG"].findIndex("phony") != -1) | ||
239 | deps += QString(" ") + "FORCE"; | ||
240 | t << "\n\n" << targ << ":" << deps << "\n\t" | ||
241 | << cmd; | ||
242 | } | ||
243 | |||
205 | if(project->variables()["QMAKE_NOFORCE"].isEmpty()) | 244 | if(project->variables()["QMAKE_NOFORCE"].isEmpty()) |
206 | t << "FORCE:" << endl << endl; | 245 | t << "FORCE:" << endl << endl; |
207 | } | 246 | } |
208 | 247 | ||
209 | 248 | ||
210 | int | 249 | int |
211 | Win32MakefileGenerator::findHighestVersion(const QString &d, const QString &stem) | 250 | Win32MakefileGenerator::findHighestVersion(const QString &d, const QString &stem) |
212 | { | 251 | { |
@@ -221,26 +260,60 @@ Win32MakefileGenerator::findHighestVersion(const QString &d, const QString &stem | |||
221 | QStringList entries = dir.entryList(); | 260 | QStringList entries = dir.entryList(); |
222 | QString dllStem = stem + QTDLL_POSTFIX; | 261 | QString dllStem = stem + QTDLL_POSTFIX; |
223 | QRegExp regx( "(" + dllStem + "([0-9]*)).lib", FALSE ); | 262 | QRegExp regx( "(" + dllStem + "([0-9]*)).lib", FALSE ); |
224 | for(QStringList::Iterator it = entries.begin(); it != entries.end(); ++it) { | 263 | for(QStringList::Iterator it = entries.begin(); it != entries.end(); ++it) { |
225 | if(regx.exactMatch((*it))) | 264 | if(regx.exactMatch((*it))) |
226 | biggest = QMAX(biggest, (regx.cap(1) == dllStem || | 265 | biggest = QMAX(biggest, (regx.cap(1) == dllStem || |
227 | regx.cap(2).isEmpty()) ? -1 : regx.cap(2).toInt()); | 266 | regx.cap(2).isEmpty()) ? -1 : regx.cap(2).toInt()); |
228 | } | 267 | } |
229 | if(dir.exists(dllStem + Option::prl_ext)) { | 268 | QMakeMetaInfo libinfo; |
230 | QMakeProject proj; | 269 | if(libinfo.readLib(bd + dllStem)) { |
231 | if(proj.read(bd + dllStem + Option::prl_ext, QDir::currentDirPath(), TRUE)) { | 270 | if(!libinfo.isEmpty("QMAKE_PRL_VERSION")) |
232 | if(!proj.isEmpty("QMAKE_PRL_VERSION")) | 271 | biggest = QMAX(biggest, libinfo.first("QMAKE_PRL_VERSION").replace(".", "").toInt()); |
233 | biggest = QMAX(biggest, proj.first("QMAKE_PRL_VERSION").replace(".", "").toInt()); | ||
234 | } | ||
235 | } | 272 | } |
236 | return biggest; | 273 | return biggest; |
237 | } | 274 | } |
238 | 275 | ||
276 | QString | ||
277 | Win32MakefileGenerator::findDependency(const QString &dep) | ||
278 | { | ||
279 | { | ||
280 | QStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"]; | ||
281 | for(QStringList::Iterator it = qut.begin(); it != qut.end(); ++it) { | ||
282 | QString targ = var((*it) + ".target"); | ||
283 | if(targ.isEmpty()) | ||
284 | targ = (*it); | ||
285 | if(targ.endsWith(dep)) | ||
286 | return targ; | ||
287 | } | ||
288 | } | ||
289 | { | ||
290 | QStringList &quc = project->variables()["QMAKE_EXTRA_WIN_COMPILERS"]; | ||
291 | for(QStringList::Iterator it = quc.begin(); it != quc.end(); ++it) { | ||
292 | QString tmp_out = project->variables()[(*it) + ".output"].first(); | ||
293 | QString tmp_cmd = project->variables()[(*it) + ".commands"].join(" "); | ||
294 | if(tmp_out.isEmpty() || tmp_cmd.isEmpty()) | ||
295 | continue; | ||
296 | QStringList &tmp = project->variables()[(*it) + ".input"]; | ||
297 | for(QStringList::Iterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) { | ||
298 | QStringList &inputs = project->variables()[(*it2)]; | ||
299 | for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) { | ||
300 | QString out = tmp_out; | ||
301 | QFileInfo fi(Option::fixPathToLocalOS((*input))); | ||
302 | out.replace("${QMAKE_FILE_BASE}", fi.baseName()); | ||
303 | out.replace("${QMAKE_FILE_NAME}", fi.fileName()); | ||
304 | if(out.endsWith(dep)) | ||
305 | return out; | ||
306 | } | ||
307 | } | ||
308 | } | ||
309 | } | ||
310 | return MakefileGenerator::findDependency(dep); | ||
311 | } | ||
239 | 312 | ||
240 | bool | 313 | bool |
241 | Win32MakefileGenerator::findLibraries(const QString &where) | 314 | Win32MakefileGenerator::findLibraries(const QString &where) |
242 | { | 315 | { |
243 | 316 | ||
244 | QStringList &l = project->variables()[where]; | 317 | QStringList &l = project->variables()[where]; |
245 | QPtrList<MakefileDependDir> dirs; | 318 | QPtrList<MakefileDependDir> dirs; |
246 | { | 319 | { |
@@ -273,17 +346,17 @@ Win32MakefileGenerator::findLibraries(const QString &where) | |||
273 | QString lib = opt.right(opt.length() - 2), out; | 346 | QString lib = opt.right(opt.length() - 2), out; |
274 | if(!lib.isEmpty()) { | 347 | if(!lib.isEmpty()) { |
275 | for(MakefileDependDir *mdd = dirs.first(); mdd; mdd = dirs.next() ) { | 348 | for(MakefileDependDir *mdd = dirs.first(); mdd; mdd = dirs.next() ) { |
276 | QString extension; | 349 | QString extension; |
277 | int ver = findHighestVersion(mdd->local_dir, lib); | 350 | int ver = findHighestVersion(mdd->local_dir, lib); |
278 | if(ver > 0) | 351 | if(ver > 0) |
279 | extension += QString::number(ver); | 352 | extension += QString::number(ver); |
280 | extension += ".lib"; | 353 | extension += ".lib"; |
281 | if(QFile::exists(mdd->local_dir + Option::dir_sep + lib + Option::prl_ext) || | 354 | if(QMakeMetaInfo::libExists(mdd->local_dir + Option::dir_sep + lib) || |
282 | QFile::exists(mdd->local_dir + Option::dir_sep + lib + extension)) { | 355 | QFile::exists(mdd->local_dir + Option::dir_sep + lib + extension)) { |
283 | out = mdd->real_dir + Option::dir_sep + lib + extension; | 356 | out = mdd->real_dir + Option::dir_sep + lib + extension; |
284 | break; | 357 | break; |
285 | } | 358 | } |
286 | } | 359 | } |
287 | } | 360 | } |
288 | if(out.isEmpty()) { | 361 | if(out.isEmpty()) { |
289 | remove = TRUE; //just eat it since we cannot find one.. | 362 | remove = TRUE; //just eat it since we cannot find one.. |
@@ -298,36 +371,38 @@ Win32MakefileGenerator::findLibraries(const QString &where) | |||
298 | if(slsh != -1) { | 371 | if(slsh != -1) { |
299 | QString r = file.left(slsh+1), l = r; | 372 | QString r = file.left(slsh+1), l = r; |
300 | fixEnvVariables(l); | 373 | fixEnvVariables(l); |
301 | lib_dirs.append(new MakefileDependDir(r.replace("\"",""), l.replace("\"",""))); | 374 | lib_dirs.append(new MakefileDependDir(r.replace("\"",""), l.replace("\"",""))); |
302 | file = file.right(file.length() - slsh - 1); | 375 | file = file.right(file.length() - slsh - 1); |
303 | } else { | 376 | } else { |
304 | lib_dirs = dirs; | 377 | lib_dirs = dirs; |
305 | } | 378 | } |
306 | if(file.endsWith(".lib")) { | 379 | if (!project->variables()["QMAKE_QT_DLL"].isEmpty()) { |
307 | file = file.left(file.length() - 4); | 380 | if(file.endsWith(".lib")) { |
308 | if(!file.at(file.length()-1).isNumber()) { | 381 | file = file.left(file.length() - 4); |
309 | for(MakefileDependDir *mdd = lib_dirs.first(); mdd; mdd = lib_dirs.next() ) { | 382 | if(!file.at(file.length()-1).isNumber()) { |
310 | QString lib_tmpl(file + "%1" + ".lib"); | 383 | for(MakefileDependDir *mdd = lib_dirs.first(); mdd; mdd = lib_dirs.next() ) { |
311 | int ver = findHighestVersion(mdd->local_dir, file); | 384 | QString lib_tmpl(file + "%1" + ".lib"); |
312 | if(ver != -1) { | 385 | int ver = findHighestVersion(mdd->local_dir, file); |
313 | if(ver) | 386 | if(ver != -1) { |
314 | lib_tmpl = lib_tmpl.arg(ver); | 387 | if(ver) |
315 | else | 388 | lib_tmpl = lib_tmpl.arg(ver); |
316 | lib_tmpl = lib_tmpl.arg(""); | 389 | else |
317 | if(slsh != -1) { | 390 | lib_tmpl = lib_tmpl.arg(""); |
318 | QString dir = mdd->real_dir; | 391 | if(slsh != -1) { |
319 | if(!dir.endsWith(Option::dir_sep)) | 392 | QString dir = mdd->real_dir; |
320 | dir += Option::dir_sep; | 393 | if(!dir.endsWith(Option::dir_sep)) |
321 | lib_tmpl.prepend(dir); | 394 | dir += Option::dir_sep; |
395 | lib_tmpl.prepend(dir); | ||
396 | } | ||
397 | modified_opt = TRUE; | ||
398 | (*it) = lib_tmpl; | ||
399 | break; | ||
322 | } | 400 | } |
323 | modified_opt = TRUE; | ||
324 | (*it) = lib_tmpl; | ||
325 | break; | ||
326 | } | 401 | } |
327 | } | 402 | } |
328 | } | 403 | } |
329 | } | 404 | } |
330 | } | 405 | } |
331 | if(remove) { | 406 | if(remove) { |
332 | it = l.remove(it); | 407 | it = l.remove(it); |
333 | } else { | 408 | } else { |
diff --git a/qmake/generators/win32/winmakefile.h b/qmake/generators/win32/winmakefile.h index 75ba0e0..dac4a99 100644 --- a/qmake/generators/win32/winmakefile.h +++ b/qmake/generators/win32/winmakefile.h | |||
@@ -1,18 +1,16 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** |
3 | ** | 3 | ** |
4 | ** Definition of ________ class. | 4 | ** Definition of Win32MakefileGenerator class. |
5 | ** | 5 | ** |
6 | ** Created : 970521 | 6 | ** Copyright (C) 1992-2003 Trolltech AS. All rights reserved. |
7 | ** | 7 | ** |
8 | ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. | 8 | ** This file is part of qmake. |
9 | ** | ||
10 | ** This file is part of the network module of the Qt GUI Toolkit. | ||
11 | ** | 9 | ** |
12 | ** This file may be distributed under the terms of the Q Public License | 10 | ** This file may be distributed under the terms of the Q Public License |
13 | ** as defined by Trolltech AS of Norway and appearing in the file | 11 | ** as defined by Trolltech AS of Norway and appearing in the file |
14 | ** LICENSE.QPL included in the packaging of this file. | 12 | ** LICENSE.QPL included in the packaging of this file. |
15 | ** | 13 | ** |
16 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This file may be distributed and/or modified under the terms of the |
17 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** GNU General Public License version 2 as published by the Free Software |
18 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** Foundation and appearing in the file LICENSE.GPL included in the |
@@ -29,16 +27,17 @@ | |||
29 | ** information about Qt Commercial License Agreements. | 27 | ** information about Qt Commercial License Agreements. |
30 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. | 28 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. |
31 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
32 | ** | 30 | ** |
33 | ** Contact info@trolltech.com if any conditions of this licensing are | 31 | ** Contact info@trolltech.com if any conditions of this licensing are |
34 | ** not clear to you. | 32 | ** not clear to you. |
35 | ** | 33 | ** |
36 | **********************************************************************/ | 34 | **********************************************************************/ |
35 | |||
37 | #ifndef __WINMAKEFILE_H__ | 36 | #ifndef __WINMAKEFILE_H__ |
38 | #define __WINMAKEFILE_H__ | 37 | #define __WINMAKEFILE_H__ |
39 | 38 | ||
40 | #include "makefile.h" | 39 | #include "makefile.h" |
41 | 40 | ||
42 | // In the Qt evaluation and educational version, we have a postfix in the | 41 | // In the Qt evaluation and educational version, we have a postfix in the |
43 | // library name (e.g. qtmteval301.dll). QTDLL_POSTFIX is used for this. | 42 | // library name (e.g. qtmteval301.dll). QTDLL_POSTFIX is used for this. |
44 | // A script modifies these lines when building eval/edu version, so be careful | 43 | // A script modifies these lines when building eval/edu version, so be careful |
@@ -48,16 +47,17 @@ | |||
48 | #endif | 47 | #endif |
49 | 48 | ||
50 | class Win32MakefileGenerator : public MakefileGenerator | 49 | class Win32MakefileGenerator : public MakefileGenerator |
51 | { | 50 | { |
52 | protected: | 51 | protected: |
53 | virtual void writeSubDirs(QTextStream &t); | 52 | virtual void writeSubDirs(QTextStream &t); |
54 | int findHighestVersion(const QString &dir, const QString &stem); | 53 | int findHighestVersion(const QString &dir, const QString &stem); |
55 | bool findLibraries(const QString &); | 54 | bool findLibraries(const QString &); |
55 | QString findDependency(const QString &); | ||
56 | virtual bool findLibraries(); | 56 | virtual bool findLibraries(); |
57 | virtual void processPrlFiles(); | 57 | virtual void processPrlFiles(); |
58 | 58 | ||
59 | public: | 59 | public: |
60 | Win32MakefileGenerator(QMakeProject *p); | 60 | Win32MakefileGenerator(QMakeProject *p); |
61 | ~Win32MakefileGenerator(); | 61 | ~Win32MakefileGenerator(); |
62 | }; | 62 | }; |
63 | 63 | ||