@@ -99,7 +99,7 @@ static void stop()
99
99
connectSocket ();
100
100
}
101
101
102
- static int findFirstFreePort (Utils::PortList range)
102
+ static int findFirstFreePort (Utils::PortList & range)
103
103
{
104
104
QTcpServer s;
105
105
@@ -156,8 +156,10 @@ int main(int argc, char **argv)
156
156
157
157
QCoreApplication app (argc, argv);
158
158
QStringList defaultArgs;
159
- QString binary;
160
- bool debug = false ;
159
+ quint16 gdbDebugPort = 0 ;
160
+ bool useGDB = false ;
161
+ bool useQML = false ;
162
+ Utils::PortList range;
161
163
162
164
if (args.size () == 0 ) {
163
165
qWarning (" No arguments given." );
@@ -167,45 +169,23 @@ int main(int argc, char **argv)
167
169
Config config = parseConfigFile ();
168
170
169
171
while (!args.isEmpty ()) {
170
- if (args[0 ] == " --start " ) {
172
+ if (args[0 ] == " --port-range " ) {
171
173
if (args.size () < 2 ) {
172
- qWarning (" --start requires an argument " );
174
+ qWarning (" --port-range requires a range specification " );
173
175
return 1 ;
174
176
}
175
- binary = args[1 ];
177
+ range = Utils::PortList::fromString ( args[1 ]) ;
176
178
args.removeFirst ();
177
- if (binary. isEmpty ()) {
178
- qWarning (" App path is empty " );
179
+ if (!range. hasMore ()) {
180
+ qWarning (" Invalid port range " );
179
181
return 1 ;
180
182
}
181
- defaultArgs.append (args);
182
- break ;
183
- } else if (args[0 ] == " --debug" ) {
184
- debug = true ;
185
- if (args.size () < 3 ) {
186
- qWarning (" --debug requires arguments: port-range and executable" );
187
- return 1 ;
188
- }
189
- Utils::PortList range = Utils::PortList::fromString (args[1 ]);
190
- binary = args[2 ];
191
- args.removeFirst ();
192
- args.removeFirst ();
193
- if (binary.isEmpty ()) {
194
- qWarning (" App path is empty" );
195
- return 1 ;
196
- }
197
-
198
- int port = findFirstFreePort (range);
199
- if (port < 0 ) {
200
- qWarning (" Could not find an unused port in range" );
201
- return 1 ;
202
- }
203
- defaultArgs.push_front (" localhost:" + QString::number (port));
204
- defaultArgs.push_front (" gdbserver" );
205
- defaultArgs.append (args);
183
+ } else if (args[0 ] == " --debug-gdb" ) {
184
+ useGDB = true ;
206
185
setpgid (0 ,0 ); // must be called before setsid()
207
186
setsid ();
208
- break ;
187
+ } else if (args[0 ] == " --debug-qml" ) {
188
+ useQML = true ;
209
189
} else if (args[0 ] == " --stop" ) {
210
190
stop ();
211
191
return 0 ;
@@ -215,20 +195,55 @@ int main(int argc, char **argv)
215
195
config.platform .toLocal8Bit ().constData ());
216
196
return 0 ;
217
197
} else {
218
- qWarning (" unknown argument: %s" , args.first ().toLocal8Bit ().constData ());
219
- return 1 ;
198
+ break ;
220
199
}
221
200
args.removeFirst ();
222
201
}
223
202
203
+ if (args.isEmpty ()) {
204
+ qWarning (" No binary to execute." );
205
+ return 1 ;
206
+ }
207
+
208
+ if ((useGDB || useQML) && !range.hasMore ()) {
209
+ qWarning (" --port-range is mandatory" );
210
+ return 1 ;
211
+ }
212
+
213
+ if (useGDB) {
214
+ int port = findFirstFreePort (range);
215
+ if (port < 0 ) {
216
+ qWarning (" Could not find an unused port in range" );
217
+ return 1 ;
218
+ }
219
+ gdbDebugPort = port;
220
+ }
221
+ if (useQML) {
222
+ int port = findFirstFreePort (range);
223
+ if (port < 0 ) {
224
+ qWarning (" Could not find an unused port in range" );
225
+ return 1 ;
226
+ }
227
+ defaultArgs.push_front (" -qmljsdebugger=port:" + QString::number (port) + " ,block" );
228
+ printf (" QML Debugger: Going to wait for connection on port %d...\n " , port);
229
+ }
230
+
231
+ defaultArgs.push_front (args.takeFirst ());
232
+ defaultArgs.append (args);
233
+
234
+ if (useGDB) {
235
+ defaultArgs.push_front (" localhost:" + QString::number (gdbDebugPort));
236
+ defaultArgs.push_front (" gdbserver" );
237
+ }
238
+
224
239
if (createServerSocket () != 0 ) {
225
240
fprintf (stderr, " Could not create serversocket\n " );
226
241
return 1 ;
227
242
}
228
243
229
244
Process process;
230
245
process.setConfig (config);
231
- if (debug )
246
+ if (gdbDebugPort )
232
247
process.setDebug ();
233
248
process.setSocketNotifier (new QSocketNotifier (serverSocket, QSocketNotifier::Read, &process));
234
249
process.start (defaultArgs);
0 commit comments