1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package com.github.maven_nar.cpptasks.mozilla;
21
22 import java.io.File;
23 import java.util.Vector;
24
25 import org.apache.tools.ant.BuildException;
26 import org.apache.tools.ant.types.Environment;
27
28 import com.github.maven_nar.cpptasks.CCTask;
29 import com.github.maven_nar.cpptasks.CUtil;
30 import com.github.maven_nar.cpptasks.OptimizationEnum;
31 import com.github.maven_nar.cpptasks.VersionInfo;
32 import com.github.maven_nar.cpptasks.compiler.CommandLineCompiler;
33 import com.github.maven_nar.cpptasks.compiler.CommandLineCompilerConfiguration;
34 import com.github.maven_nar.cpptasks.compiler.LinkType;
35 import com.github.maven_nar.cpptasks.compiler.Linker;
36 import com.github.maven_nar.cpptasks.compiler.Processor;
37 import com.github.maven_nar.cpptasks.compiler.ProgressMonitor;
38 import com.github.maven_nar.cpptasks.gcc.LdLinker;
39 import com.github.maven_nar.cpptasks.parser.CParser;
40 import com.github.maven_nar.cpptasks.parser.Parser;
41
42
43
44
45
46
47 public final class XpidlCompiler extends CommandLineCompiler {
48
49
50
51 private static final XpidlCompiler INSTANCE = new XpidlCompiler(false, null);
52
53
54
55
56
57
58 public static XpidlCompiler getInstance() {
59 return INSTANCE;
60 }
61
62
63
64
65
66
67
68
69
70 private XpidlCompiler(final boolean newEnvironment, final Environment env) {
71 super("xpidl", null, new String[] {
72 ".idl", ".xpidl"
73 }, new String[0], ".xpt", false, null, newEnvironment, env);
74 }
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 @Override
95 protected void addImpliedArgs(final Vector<String> args, final boolean debug, final boolean multithreaded,
96 final boolean exceptions, final LinkType linkType, final Boolean rtti, final OptimizationEnum optimization) {
97 }
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 protected void addIncludes(final String baseDirPath, final File[] includeDirs, final Vector<String> args,
114 final Vector<String> relativeArgs, final StringBuffer includePathId) {
115
116
117
118 for (final File includeDir : includeDirs) {
119 args.addElement("-I");
120 args.addElement(includeDir.getAbsolutePath());
121 if (relativeArgs != null) {
122 final String relative = CUtil.getRelativePath(baseDirPath, includeDir);
123 relativeArgs.addElement("-I");
124 relativeArgs.addElement(relative);
125 if (includePathId != null) {
126 if (includePathId.length() == 0) {
127 includePathId.append("-I ");
128 } else {
129 includePathId.append(" -I ");
130 }
131 includePathId.append(relative);
132 }
133 }
134 }
135 }
136
137
138
139
140
141
142
143
144
145 @Override
146 protected void addWarningSwitch(final Vector<String> args, final int level) {
147 }
148
149
150
151
152
153
154
155
156
157
158 @Override
159 public Processor changeEnvironment(final boolean newEnvironment, final Environment env) {
160 return this;
161 }
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183 @Override
184 public void compile(final CCTask task, final File outputDir, final String[] sourceFiles, final String[] args,
185 final String[] endArgs, final boolean relentless, final CommandLineCompilerConfiguration config,
186 final ProgressMonitor monitor) {
187
188 BuildException exc = null;
189 final String[] thisSource = new String[1];
190 final String[] tlbCommand = new String[args.length + endArgs.length + 6];
191 tlbCommand[0] = "xpidl";
192 tlbCommand[1] = "-m";
193 tlbCommand[2] = "typelib";
194 final String[] headerCommand = new String[args.length + endArgs.length + 6];
195 headerCommand[0] = "xpidl";
196 headerCommand[1] = "-m";
197 headerCommand[2] = "header";
198 for (int i = 0; i < args.length; i++) {
199 tlbCommand[i + 3] = args[i];
200 headerCommand[i + 3] = args[i];
201 }
202 tlbCommand[args.length + 3] = "-e";
203 headerCommand[args.length + 3] = "-e";
204
205 int tlbIndex = args.length + 6;
206 int headerIndex = args.length + 6;
207 for (final String endArg : endArgs) {
208 tlbCommand[tlbIndex++] = endArg;
209 headerCommand[headerIndex++] = endArg;
210 }
211 for (final String sourceFile : sourceFiles) {
212 tlbIndex = args.length + 4;
213 headerIndex = args.length + 4;
214 final String[] outputFileNames = getOutputFileNames(sourceFile, null);
215
216 tlbCommand[tlbIndex++] = outputFileNames[0];
217 tlbCommand[tlbIndex++] = sourceFile;
218
219 headerCommand[headerIndex++] = outputFileNames[1];
220 headerCommand[headerIndex++] = sourceFile;
221
222 int retval = runCommand(task, outputDir, tlbCommand);
223 if (retval == 0) {
224 retval = runCommand(task, outputDir, headerCommand);
225 }
226 if (monitor != null) {
227 thisSource[0] = sourceFile;
228 monitor.progress(thisSource);
229 }
230
231
232
233
234 if (retval != 0 && exc == null) {
235
236
237
238 exc = new BuildException(this.getCommand() + " failed with return code " + retval, task.getLocation());
239
240
241
242 if (!relentless) {
243 throw exc;
244 }
245 }
246 }
247
248
249
250 if (exc != null) {
251 throw exc;
252 }
253 }
254
255
256
257
258
259
260
261
262 @Override
263 protected Parser createParser(final File source) {
264 return new CParser();
265 }
266
267
268
269
270
271
272 @Override
273 protected int getArgumentCountPerInputFile() {
274 return 3;
275 }
276
277
278
279
280
281
282
283
284
285
286
287 @Override
288 protected void getDefineSwitch(final StringBuffer buffer, final String define, final String value) {
289 }
290
291
292
293
294
295
296 @Override
297 protected File[] getEnvironmentIncludePath() {
298 return new File[0];
299 }
300
301
302
303
304
305
306 @Override
307 public String getIdentifier() {
308 return "Mozilla xpidl";
309 }
310
311
312
313
314
315
316
317
318 @Override
319 protected String getIncludeDirSwitch(final String includeDir) {
320 return "-I" + includeDir;
321 }
322
323
324
325
326
327
328
329
330
331
332
333
334
335 @Override
336 protected String getInputFileArgument(final File outputDir, final String filename, final int index) {
337 return "";
338 }
339
340
341
342
343
344
345
346
347 @Override
348 public Linker getLinker(final LinkType type) {
349 return LdLinker.getInstance();
350 }
351
352
353
354
355
356
357 @Override
358 public int getMaximumCommandLength() {
359 return 1024;
360 }
361
362
363
364
365
366
367 @Override
368 protected int getMaximumInputFilesPerCommand() {
369 return 1;
370 }
371
372
373
374
375
376
377
378
379
380
381 @Override
382 public String[] getOutputFileNames(final String inputFile, final VersionInfo versionInfo) {
383
384
385
386 final String baseName = getBaseOutputName(inputFile);
387 return new String[] {
388 baseName + ".xpt", baseName + ".h"
389 };
390 }
391
392
393
394
395
396
397
398
399
400
401 @Override
402 protected int getTotalArgumentLengthForInputFile(final File outputDir, final String inputFile) {
403 return 0;
404 }
405
406
407
408
409
410
411
412
413
414 @Override
415 protected void getUndefineSwitch(final StringBuffer buffer, final String define) {
416 }
417
418 }