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;
21  
22  import java.io.File;
23  import java.util.ArrayList;
24  import java.util.Enumeration;
25  import java.util.LinkedHashSet;
26  import java.util.List;
27  import java.util.Set;
28  import java.util.Vector;
29  
30  import org.apache.tools.ant.BuildException;
31  import org.apache.tools.ant.Project;
32  import org.apache.tools.ant.types.FlexInteger;
33  
34  import com.github.maven_nar.cpptasks.compiler.CommandLineLinker;
35  import com.github.maven_nar.cpptasks.compiler.LinkType;
36  import com.github.maven_nar.cpptasks.compiler.Linker;
37  import com.github.maven_nar.cpptasks.compiler.Processor;
38  import com.github.maven_nar.cpptasks.gcc.GccLinker;
39  import com.github.maven_nar.cpptasks.types.FlexLong;
40  import com.github.maven_nar.cpptasks.types.LibrarySet;
41  import com.github.maven_nar.cpptasks.types.LinkerArgument;
42  import com.github.maven_nar.cpptasks.types.SystemLibrarySet;
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  public class LinkerDef extends ProcessorDef {
53    private long base;
54    private String entry;
55    private Boolean fixed;
56    private Boolean incremental;
57    private final Vector librarySets = new Vector();
58    private Boolean map;
59    private int stack;
60    private final Vector sysLibrarySets = new Vector();
61    private String toolPath;
62    private String linkerPrefix;
63    private Boolean skipDepLink;
64  
65    private final Set<File> libraryDirectories = new LinkedHashSet<>();
66  
67    
68  
69  
70  
71  
72    public LinkerDef() {
73      this.base = -1;
74      this.stack = -1;
75    }
76  
77    private void addActiveLibrarySet(final Project project, final Vector libsets, final Vector srcSets) {
78      final Enumeration srcenum = srcSets.elements();
79      while (srcenum.hasMoreElements()) {
80        final LibrarySet set = (LibrarySet) srcenum.nextElement();
81        if (set.isActive(project)) {
82          libsets.addElement(set);
83        }
84      }
85    }
86  
87    private void addActiveSystemLibrarySets(final Project project, final Vector libsets) {
88      addActiveLibrarySet(project, libsets, this.sysLibrarySets);
89    }
90  
91    private void addActiveUserLibrarySets(final Project project, final Vector libsets) {
92      addActiveLibrarySet(project, libsets, this.librarySets);
93    }
94  
95    
96  
97  
98    public void addConfiguredLinkerArg(final LinkerArgument arg) {
99      addConfiguredProcessorArg(arg);
100   }
101 
102   
103 
104 
105   public void addConfiguredLinkerParam(final LinkerParam param) {
106     if (isReference()) {
107       throw noChildrenAllowed();
108     }
109     addConfiguredProcessorParam(param);
110   }
111 
112   public boolean addLibraryDirectory(final File directory) {
113     if (directory == null || !directory.exists()) {
114       return false;
115     } else {
116       return this.libraryDirectories.add(directory);
117     }
118   }
119 
120   public boolean addLibraryDirectory(final File parent, final String path) {
121     if (parent == null) {
122       return false;
123     } else {
124       final File directory = new File(parent, path);
125       return addLibraryDirectory(directory);
126     }
127   }
128 
129   public void addLibraryDirectory(final String path) {
130     final File directory = new File(path);
131     addLibraryDirectory(directory);
132   }
133 
134   
135 
136 
137   public void addLibset(final LibrarySet libset) {
138     if (isReference()) {
139       throw super.noChildrenAllowed();
140     }
141     if (libset == null) {
142       throw new NullPointerException("libset");
143     }
144     this.librarySets.addElement(libset);
145   }
146 
147   
148 
149 
150   public void addSyslibset(final SystemLibrarySet libset) {
151     if (isReference()) {
152       throw super.noChildrenAllowed();
153     }
154     if (libset == null) {
155       throw new NullPointerException("libset");
156     }
157     this.sysLibrarySets.addElement(libset);
158   }
159 
160   public void execute() throws org.apache.tools.ant.BuildException {
161     throw new org.apache.tools.ant.BuildException("Not an actual task, but looks like one for documentation purposes");
162   }
163 
164   
165 
166 
167   public LibrarySet[] getActiveLibrarySets(final LinkerDef[] defaultProviders, final int index) {
168     if (isReference()) {
169       return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))
170           .getActiveUserLibrarySets(defaultProviders, index);
171     }
172     final Project p = getProject();
173     final Vector libsets = new Vector();
174     for (int i = index; i < defaultProviders.length; i++) {
175       defaultProviders[i].addActiveUserLibrarySets(p, libsets);
176     }
177     addActiveUserLibrarySets(p, libsets);
178     for (int i = index; i < defaultProviders.length; i++) {
179       defaultProviders[i].addActiveSystemLibrarySets(p, libsets);
180     }
181     addActiveSystemLibrarySets(p, libsets);
182     final LibrarySet[] sets = new LibrarySet[libsets.size()];
183     libsets.copyInto(sets);
184     return sets;
185   }
186 
187   
188 
189 
190   public LibrarySet[] getActiveSystemLibrarySets(final LinkerDef[] defaultProviders, final int index) {
191     if (isReference()) {
192       return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))
193           .getActiveUserLibrarySets(defaultProviders, index);
194     }
195     final Project p = getProject();
196     final Vector libsets = new Vector();
197     for (int i = index; i < defaultProviders.length; i++) {
198       defaultProviders[i].addActiveSystemLibrarySets(p, libsets);
199     }
200     addActiveSystemLibrarySets(p, libsets);
201     final LibrarySet[] sets = new LibrarySet[libsets.size()];
202     libsets.copyInto(sets);
203     return sets;
204   }
205 
206   
207 
208 
209   public LibrarySet[] getActiveUserLibrarySets(final LinkerDef[] defaultProviders, final int index) {
210     if (isReference()) {
211       return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))
212           .getActiveUserLibrarySets(defaultProviders, index);
213     }
214     final Project p = getProject();
215     final Vector libsets = new Vector();
216     for (int i = index; i < defaultProviders.length; i++) {
217       defaultProviders[i].addActiveUserLibrarySets(p, libsets);
218     }
219     addActiveUserLibrarySets(p, libsets);
220     final LibrarySet[] sets = new LibrarySet[libsets.size()];
221     libsets.copyInto(sets);
222     return sets;
223   }
224 
225   public long getBase(final LinkerDef[] defaultProviders, final int index) {
226     if (isReference()) {
227       return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef")).getBase(defaultProviders, index);
228     }
229     if (this.base <= 0) {
230       if (defaultProviders != null && index < defaultProviders.length) {
231         return defaultProviders[index].getBase(defaultProviders, index + 1);
232       }
233     }
234     return this.base;
235   }
236 
237   public String getEntry(final LinkerDef[] defaultProviders, final int index) {
238     if (isReference()) {
239       return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef")).getEntry(defaultProviders, index);
240     }
241     if (this.entry != null) {
242       return this.entry;
243     }
244     if (defaultProviders != null && index < defaultProviders.length) {
245       return defaultProviders[index].getEntry(defaultProviders, index + 1);
246     }
247     return null;
248   }
249 
250   public Boolean getFixed(final LinkerDef[] defaultProviders, final int index) {
251     if (isReference()) {
252       return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef")).getFixed(defaultProviders, index);
253     }
254     if (this.fixed == null) {
255       if (defaultProviders != null && index < defaultProviders.length) {
256         return defaultProviders[index].getFixed(defaultProviders, index + 1);
257       }
258     }
259     return this.fixed;
260   }
261 
262   public boolean getIncremental(final LinkerDef[] defaultProviders, final int index) {
263     if (isReference()) {
264       return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef")).getIncremental(defaultProviders, index);
265     }
266     if (this.incremental != null) {
267       return this.incremental.booleanValue();
268     }
269     if (defaultProviders != null && index < defaultProviders.length) {
270       return defaultProviders[index].getIncremental(defaultProviders, index + 1);
271     }
272     return false;
273   }
274 
275   public List<File> getLibraryDirectories() {
276     return new ArrayList<>(this.libraryDirectories);
277   }
278 
279   public boolean getMap(final LinkerDef[] defaultProviders, final int index) {
280     if (isReference()) {
281       return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef")).getMap(defaultProviders, index);
282     }
283     if (this.map != null) {
284       return this.map.booleanValue();
285     }
286     if (defaultProviders != null && index < defaultProviders.length) {
287       return defaultProviders[index].getMap(defaultProviders, index + 1);
288     }
289     return false;
290   }
291 
292   @Override
293   public Processor getProcessor() {
294     Linker linker = (Linker) super.getProcessor();
295     if (linker == null) {
296       linker = GccLinker.getInstance();
297     }
298     if (getLibtool() && linker instanceof CommandLineLinker) {
299       final CommandLineLinker cmdLineLinker = (CommandLineLinker) linker;
300       linker = cmdLineLinker.getLibtoolLinker();
301     }
302     return linker;
303   }
304 
305   @Override
306   public Processor getProcessor(final LinkType linkType) {
307     final Processor proc = getProcessor();
308     return proc.getLinker(linkType);
309   }
310 
311   public int getStack(final LinkerDef[] defaultProviders, final int index) {
312     if (isReference()) {
313       return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef")).getStack(defaultProviders, index);
314     }
315     if (this.stack < 0) {
316       if (defaultProviders != null && index < defaultProviders.length) {
317         return defaultProviders[index].getStack(defaultProviders, index + 1);
318       }
319     }
320     return this.stack;
321   }
322 
323   public String getToolPath() {
324     return this.toolPath;
325   }
326 
327   public String getLinkerPrefix() {
328     return this.linkerPrefix;
329   }
330   
331  public boolean isSkipDepLink() {
332     return this.skipDepLink.booleanValue();
333   }
334   
335   
336 
337 
338 
339 
340 
341 
342   public void setBase(final FlexLong base) {
343     if (isReference()) {
344       throw tooManyAttributes();
345     }
346     this.base = base.longValue();
347   }
348 
349   
350 
351 
352 
353 
354 
355   public void setEntry(final String entry) {
356     if (isReference()) {
357       throw tooManyAttributes();
358     }
359     this.entry = entry;
360   }
361 
362   
363 
364 
365   public void setFixed(final boolean fixed) {
366     if (isReference()) {
367       throw tooManyAttributes();
368     }
369     this.fixed = booleanValueOf(fixed);
370   }
371 
372   
373 
374 
375 
376   public void setIncremental(final boolean incremental) {
377     if (isReference()) {
378       throw tooManyAttributes();
379     }
380     this.incremental = booleanValueOf(incremental);
381   }
382 
383   
384 
385 
386   public void setMap(final boolean map) {
387     if (isReference()) {
388       throw tooManyAttributes();
389     }
390     this.map = booleanValueOf(map);
391   }
392 
393   
394 
395 
396 
397 
398 
399 
400 
401 
402 
403 
404 
405 
406 
407 
408 
409 
410 
411 
412 
413 
414 
415 
416 
417 
418 
419 
420 
421 
422 
423 
424 
425 
426 
427 
428 
429 
430 
431 
432 
433 
434 
435 
436 
437 
438 
439 
440 
441 
442 
443 
444 
445 
446 
447 
448 
449 
450 
451 
452 
453 
454 
455 
456 
457 
458 
459 
460 
461 
462 
463 
464 
465 
466 
467 
468 
469 
470 
471 
472 
473 
474 
475 
476 
477 
478 
479 
480 
481 
482   public void setName(final LinkerEnum name) throws BuildException {
483     if (isReference()) {
484       throw tooManyAttributes();
485     }
486     final Linker linker = name.getLinker();
487     super.setProcessor(linker);
488   }
489 
490   @Override
491   protected void setProcessor(final Processor proc) throws BuildException {
492     Linker linker = null;
493     if (proc instanceof Linker) {
494       linker = (Linker) proc;
495     } else {
496       final LinkType linkType = new LinkType();
497       linker = proc.getLinker(linkType);
498     }
499     super.setProcessor(linker);
500   }
501 
502   
503 
504 
505   public void setStack(final FlexInteger stack) {
506     if (isReference()) {
507       throw tooManyAttributes();
508     }
509     this.stack = stack.intValue();
510   }
511 
512   public void setToolPath(final String path) {
513     this.toolPath = path;
514   }
515 
516   public void setLinkerPrefix(final String prefix) {
517     this.linkerPrefix = prefix;
518   }
519   
520   public void setSkipDepLink(final boolean skipDepLink) {
521     this.skipDepLink = booleanValueOf(skipDepLink);
522   }
523 
524   public void visitSystemLibraries(final Linker linker, final FileVisitor libraryVisitor) {
525     final Project p = getProject();
526     if (p == null) {
527       throw new java.lang.IllegalStateException("project must be set");
528     }
529     if (isReference()) {
530       final LinkerDef master = (LinkerDef) getCheckedRef(LinkerDef.class, "Linker");
531       master.visitSystemLibraries(linker, libraryVisitor);
532     } else {
533       
534       
535       
536       
537       final LinkerDef extendsDef = (LinkerDef) getExtends();
538       if (extendsDef != null) {
539         extendsDef.visitSystemLibraries(linker, libraryVisitor);
540       }
541       if (this.sysLibrarySets.size() > 0) {
542         final File[] libpath = linker.getLibraryPath();
543         for (int i = 0; i < this.sysLibrarySets.size(); i++) {
544           final LibrarySet set = (LibrarySet) this.sysLibrarySets.elementAt(i);
545           if (set.isActive(p)) {
546             set.visitLibraries(p, linker, libpath, libraryVisitor);
547           }
548         }
549       }
550     }
551   }
552 
553   public void visitUserLibraries(final Linker linker, final FileVisitor libraryVisitor) {
554     final Project p = getProject();
555     if (p == null) {
556       throw new java.lang.IllegalStateException("project must be set");
557     }
558     if (isReference()) {
559       final LinkerDef master = (LinkerDef) getCheckedRef(LinkerDef.class, "Linker");
560       master.visitUserLibraries(linker, libraryVisitor);
561     } else {
562       
563       
564       
565       
566       final LinkerDef extendsDef = (LinkerDef) getExtends();
567       if (extendsDef != null) {
568         extendsDef.visitUserLibraries(linker, libraryVisitor);
569       }
570       
571       
572       
573       if (this.librarySets.size() > 0) {
574         final File[] libpath = linker.getLibraryPath();
575         for (int i = 0; i < this.librarySets.size(); i++) {
576           final LibrarySet set = (LibrarySet) this.librarySets.elementAt(i);
577           if (set.isActive(p)) {
578             set.visitLibraries(p, linker, libpath, libraryVisitor);
579           }
580         }
581       }
582     }
583   }
584 }