]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerDef.java
Changed spelling to manifest
[mirror_edk2.git] / Tools / Source / Cpptasks / net / sf / antcontrib / cpptasks / LinkerDef.java
CommitLineData
878ddf1f 1/*\r
2 * \r
3 * Copyright 2002-2004 The Ant-Contrib project\r
4 *\r
5 * Licensed under the Apache License, Version 2.0 (the "License");\r
6 * you may not use this file except in compliance with the License.\r
7 * You may obtain a copy of the License at\r
8 *\r
9 * http://www.apache.org/licenses/LICENSE-2.0\r
10 *\r
11 * Unless required by applicable law or agreed to in writing, software\r
12 * distributed under the License is distributed on an "AS IS" BASIS,\r
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14 * See the License for the specific language governing permissions and\r
15 * limitations under the License.\r
16 */\r
17package net.sf.antcontrib.cpptasks;\r
18import java.io.File;\r
19import java.util.Enumeration;\r
20import java.util.Vector;\r
21\r
22import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;\r
23import net.sf.antcontrib.cpptasks.compiler.LinkType;\r
24import net.sf.antcontrib.cpptasks.compiler.Linker;\r
25import net.sf.antcontrib.cpptasks.compiler.Processor;\r
26import net.sf.antcontrib.cpptasks.compiler.ProcessorConfiguration;\r
27import net.sf.antcontrib.cpptasks.gcc.GccLinker;\r
28import net.sf.antcontrib.cpptasks.types.FlexLong;\r
29import net.sf.antcontrib.cpptasks.types.LibrarySet;\r
30import net.sf.antcontrib.cpptasks.types.LinkerArgument;\r
31import net.sf.antcontrib.cpptasks.types.SystemLibrarySet;\r
32\r
33import org.apache.tools.ant.BuildException;\r
34import org.apache.tools.ant.Project;\r
35import org.apache.tools.ant.types.FlexInteger;\r
36/**\r
37 * A linker definition. linker elements may be placed either as children of a\r
38 * cc element or the project element. A linker element with an id attribute may\r
39 * be referenced by linker elements with refid or extends attributes.\r
40 * \r
41 * @author Adam Murdoch\r
42 * @author Curt Arnold\r
43 */\r
44public class LinkerDef extends ProcessorDef {\r
45 private long base;\r
46 private String entry;\r
47 private Boolean fixed;\r
48 private Boolean incremental;\r
49 private final Vector librarySets = new Vector();\r
50 private Boolean map;\r
51 private int stack;\r
52 private final Vector sysLibrarySets = new Vector();\r
53 private final Vector versionInfos = new Vector();\r
54 private Boolean defaultflag = new Boolean(true);\r
55 /**\r
56 * Default constructor\r
57 * \r
58 * @see java.lang.Object#Object()\r
59 */\r
60 public LinkerDef() {\r
61 base = -1;\r
62 stack = -1;\r
63 }\r
64 private void addActiveLibrarySet(Project project, Vector libsets,\r
65 Vector srcSets) {\r
66 Enumeration srcenum = srcSets.elements();\r
67 while (srcenum.hasMoreElements()) {\r
68 LibrarySet set = (LibrarySet) srcenum.nextElement();\r
69 if (set.isActive(project)) {\r
70 libsets.addElement(set);\r
71 }\r
72 }\r
73 }\r
74 private void addActiveSystemLibrarySets(Project project, Vector libsets) {\r
75 addActiveLibrarySet(project, libsets, sysLibrarySets);\r
76 }\r
77 private void addActiveUserLibrarySets(Project project, Vector libsets) {\r
78 addActiveLibrarySet(project, libsets, librarySets);\r
79 }\r
80 /**\r
81 * Adds a linker command-line arg.\r
82 */\r
83 public void addConfiguredLinkerArg(LinkerArgument arg) {\r
84 addConfiguredProcessorArg(arg);\r
85 }\r
86 /**\r
87 * Adds a compiler command-line arg.\r
88 */\r
89 public void addConfiguredLinkerParam(LinkerParam param) {\r
90 if (isReference()) {\r
91 throw noChildrenAllowed();\r
92 }\r
93 addConfiguredProcessorParam(param);\r
94 }\r
95 /**\r
96 * Adds a system library set.\r
97 */\r
98 public void addLibset(LibrarySet libset) {\r
99 if (isReference()) {\r
100 throw super.noChildrenAllowed();\r
101 }\r
102 if (libset == null) {\r
103 throw new NullPointerException("libset");\r
104 }\r
105 librarySets.addElement(libset);\r
106 }\r
107 /**\r
108 * Adds a system library set.\r
109 */\r
110 public void addSyslibset(SystemLibrarySet libset) {\r
111 if (isReference()) {\r
112 throw super.noChildrenAllowed();\r
113 }\r
114 if (libset == null) {\r
115 throw new NullPointerException("libset");\r
116 }\r
117 sysLibrarySets.addElement(libset);\r
118 }\r
119 \r
120 /**\r
121 * Adds desriptive version information to be included in the\r
122 * generated file. The first active version info block will\r
123 * be used.\r
124 */\r
125 public void addConfiguredVersioninfo(VersionInfo newVersionInfo) {\r
126 if (isReference()) {\r
127 throw noChildrenAllowed();\r
128 }\r
129 newVersionInfo.setProject(this.getProject());\r
130 versionInfos.addElement(newVersionInfo);\r
131 }\r
132 \r
133 public ProcessorConfiguration createConfiguration(CCTask task,\r
134 LinkType linkType, ProcessorDef baseDef, TargetDef targetPlatform) {\r
135 //\r
136 // must combine some local context (the linkType)\r
137 // with the referenced element\r
138 //\r
139 // get a pointer to the definition (either local or referenced)\r
140 ProcessorDef thisDef = this;\r
141 if (isReference()) {\r
142 thisDef = ((ProcessorDef) getCheckedRef(ProcessorDef.class,\r
143 "ProcessorDef"));\r
144 }\r
145 //\r
146 // find the appropriate processor (combines local linkType\r
147 // with possibly remote linker name)\r
148 Processor proc = getProcessor();\r
149 proc = proc.getLinker(linkType);\r
150 ProcessorDef[] defaultProviders = getDefaultProviders(baseDef);\r
151 return proc.createConfiguration(task, linkType, defaultProviders,\r
152 thisDef, targetPlatform);\r
153 }\r
154 public void execute() throws org.apache.tools.ant.BuildException {\r
155 throw new org.apache.tools.ant.BuildException(\r
156 "Not an actual task, but looks like one for documentation purposes");\r
157 }\r
158 /**\r
159 * Returns an array of active library sets for this linker definition.\r
160 */\r
161 public LibrarySet[] getActiveLibrarySets(LinkerDef[] defaultProviders,\r
162 int index) { \r
163 if (isReference()) {\r
164 return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))\r
165 .getActiveUserLibrarySets(defaultProviders, index);\r
166 }\r
167 Project p = getProject();\r
168 Vector libsets = new Vector();\r
169 for (int i = index; i < defaultProviders.length; i++) {\r
170 defaultProviders[i].addActiveUserLibrarySets(p, libsets);\r
171 defaultProviders[i].addActiveSystemLibrarySets(p, libsets);\r
172 }\r
173 addActiveUserLibrarySets(p, libsets);\r
174 addActiveSystemLibrarySets(p, libsets);\r
175 LibrarySet[] sets = new LibrarySet[libsets.size()];\r
176 libsets.copyInto(sets);\r
177 return sets;\r
178 }\r
179 /**\r
180 * Returns an array of active library sets for this linker definition.\r
181 */\r
182 public LibrarySet[] getActiveSystemLibrarySets(\r
183 LinkerDef[] defaultProviders, int index) {\r
184 if (isReference()) {\r
185 return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))\r
186 .getActiveUserLibrarySets(defaultProviders, index);\r
187 }\r
188 Project p = getProject();\r
189 Vector libsets = new Vector();\r
190 for (int i = index; i < defaultProviders.length; i++) {\r
191 defaultProviders[i].addActiveSystemLibrarySets(p, libsets);\r
192 }\r
193 addActiveSystemLibrarySets(p, libsets);\r
194 LibrarySet[] sets = new LibrarySet[libsets.size()];\r
195 libsets.copyInto(sets);\r
196 return sets;\r
197 }\r
198 /**\r
199 * Returns an array of active library sets for this linker definition.\r
200 */\r
201 public LibrarySet[] getActiveUserLibrarySets(LinkerDef[] defaultProviders,\r
202 int index) {\r
203 if (isReference()) {\r
204 return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))\r
205 .getActiveUserLibrarySets(defaultProviders, index);\r
206 }\r
207 Project p = getProject();\r
208 Vector libsets = new Vector();\r
209 for (int i = index; i < defaultProviders.length; i++) {\r
210 defaultProviders[i].addActiveUserLibrarySets(p, libsets);\r
211 }\r
212 addActiveUserLibrarySets(p, libsets);\r
213 LibrarySet[] sets = new LibrarySet[libsets.size()];\r
214 libsets.copyInto(sets);\r
215 return sets;\r
216 }\r
217 public long getBase(LinkerDef[] defaultProviders, int index) {\r
218 if (isReference()) {\r
219 return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))\r
220 .getBase(defaultProviders, index);\r
221 }\r
222 if (base <= 0) {\r
223 if (defaultProviders != null && index < defaultProviders.length) {\r
224 return defaultProviders[index].getBase(defaultProviders,\r
225 index + 1);\r
226 }\r
227 }\r
228 return base;\r
229 }\r
230 public Boolean getFixed(LinkerDef[] defaultProviders, int index) {\r
231 if (isReference()) {\r
232 return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))\r
233 .getFixed(defaultProviders, index);\r
234 }\r
235 if (fixed == null) {\r
236 if (defaultProviders != null && index < defaultProviders.length) {\r
237 return defaultProviders[index].getFixed(defaultProviders,\r
238 index + 1);\r
239 }\r
240 }\r
241 return fixed;\r
242 }\r
243 public boolean getIncremental(LinkerDef[] defaultProviders, int index) {\r
244 if (isReference()) {\r
245 return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))\r
246 .getIncremental(defaultProviders, index);\r
247 }\r
248 if (incremental != null) {\r
249 return incremental.booleanValue();\r
250 }\r
251 if (defaultProviders != null && index < defaultProviders.length) {\r
252 return defaultProviders[index].getIncremental(defaultProviders, index + 1);\r
253 }\r
254 return false;\r
255 }\r
256 public boolean getMap(LinkerDef[] defaultProviders, int index) {\r
257 if (isReference()) {\r
258 return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))\r
259 .getMap(defaultProviders, index);\r
260 }\r
261 if (map != null) {\r
262 return map.booleanValue();\r
263 }\r
264 if (defaultProviders != null && index < defaultProviders.length) {\r
265 return defaultProviders[index].getMap(defaultProviders, index + 1);\r
266 }\r
267 return false;\r
268 }\r
269 public final Boolean getDefaultflag(LinkerDef[] defaultProviders, int index) {\r
270 if (isReference()) {\r
271 return ((LinkerDef) getCheckedRef(LinkerDef.class,\r
272 "LinkerDef")).getDefaultflag(defaultProviders, index);\r
273 }\r
274 return defaultflag;\r
275 }\r
276 public String getEntry(LinkerDef[] defaultProviders, int index) {\r
277 if (isReference()) {\r
278 return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))\r
279 .getEntry(defaultProviders, index);\r
280 }\r
281 if (entry != null) {\r
282 return entry;\r
283 }\r
284 if (defaultProviders != null && index < defaultProviders.length) {\r
285 return defaultProviders[index].getEntry(defaultProviders, index + 1);\r
286 }\r
287 return null;\r
288 }\r
289\r
290 public Processor getProcessor() {\r
291 Linker linker = (Linker) super.getProcessor();\r
292 if (linker == null) {\r
293 linker = GccLinker.getInstance();\r
294 }\r
295 if (getLibtool() && linker instanceof CommandLineLinker) {\r
296 CommandLineLinker cmdLineLinker = (CommandLineLinker) linker;\r
297 linker = cmdLineLinker.getLibtoolLinker();\r
298 }\r
299 return linker;\r
300 }\r
301 public int getStack(LinkerDef[] defaultProviders, int index) {\r
302 if (isReference()) {\r
303 return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))\r
304 .getStack(defaultProviders, index);\r
305 }\r
306 if (stack < 0) {\r
307 if (defaultProviders != null && index < defaultProviders.length) {\r
308 return defaultProviders[index].getStack(defaultProviders,\r
309 index + 1);\r
310 }\r
311 }\r
312 return stack;\r
313 }\r
314 /**\r
315 * Sets the base address. May be specified in either decimal or hex.\r
316 * \r
317 * @param base\r
318 * base address\r
319 * \r
320 */\r
321 public void setBase(FlexLong base) {\r
322 if (isReference()) {\r
323 throw tooManyAttributes();\r
324 }\r
325 this.base = base.longValue();\r
326 }\r
327 /**\r
328 * Sets the starting address.\r
329 * \r
330 * @param name\r
331 * function name\r
332 */\r
333 public void setEntry(String entry) {\r
334 if (isReference()) {\r
335 throw tooManyAttributes();\r
336 }\r
337 this.entry = entry;\r
338 }\r
339 /**\r
340 * If true, marks the file to be loaded only at its preferred address.\r
341 */\r
342 public void setFixed(boolean fixed) {\r
343 if (isReference()) {\r
344 throw tooManyAttributes();\r
345 }\r
346 this.fixed = booleanValueOf(fixed);\r
347 }\r
348 /**\r
349 * If true, allows incremental linking.\r
350 * \r
351 */\r
352 public void setIncremental(boolean incremental) {\r
353 if (isReference()) {\r
354 throw tooManyAttributes();\r
355 }\r
356 this.incremental = booleanValueOf(incremental);\r
357 }\r
358 /**\r
359 * If set to true, a map file will be produced.\r
360 */\r
361 public void setMap(boolean map) {\r
362 if (isReference()) {\r
363 throw tooManyAttributes();\r
364 }\r
365 this.map = booleanValueOf(map);\r
366 }\r
367 /**\r
368 * Sets linker type.\r
369 * \r
370 * \r
371 * <table width="100%" border="1"> <thead>Supported linkers </thead>\r
372 * <tr>\r
373 * <td>gcc</td>\r
374 * <td>Gcc Linker</td>\r
375 * </tr>\r
376 * <tr>\r
377 * <td>g++</td>\r
378 * <td>G++ Linker</td>\r
379 * </tr>\r
380 * <tr>\r
381 * <td>ld</td>\r
382 * <td>Ld Linker</td>\r
383 * </tr>\r
384 * <tr>\r
385 * <td>ar</td>\r
386 * <td>Gcc Librarian</td>\r
387 * </tr>\r
388 * <tr>\r
389 * <td>msvc</td>\r
390 * <td>Microsoft Linker</td>\r
391 * </tr>\r
392 * <tr>\r
393 * <td>bcc</td>\r
394 * <td>Borland Linker</td>\r
395 * </tr>\r
396 * <tr>\r
397 * <td>df</td>\r
398 * <td>Compaq Visual Fortran Linker</td>\r
399 * </tr>\r
400 * <tr>\r
401 * <td>icl</td>\r
402 * <td>Intel Linker for Windows (IA-32)</td>\r
403 * </tr>\r
404 * <tr>\r
405 * <td>ecl</td>\r
406 * <td>Intel Linker for Windows (IA-64)</td>\r
407 * </tr>\r
408 * <tr>\r
409 * <td>icc</td>\r
410 * <td>Intel Linker for Linux (IA-32)</td>\r
411 * </tr>\r
412 * <tr>\r
413 * <td>ecc</td>\r
414 * <td>Intel Linker for Linux (IA-64)</td>\r
415 * </tr>\r
416 * <tr>\r
417 * <td>CC</td>\r
418 * <td>Sun ONE Linker</td>\r
419 * </tr>\r
420 * <tr>\r
421 * <td>aCC</td>\r
422 * <td>HP aC++ Linker</td>\r
423 * </tr>\r
424 * <tr>\r
425 * <td>os390</td>\r
426 * <td>OS390 Linker</td>\r
427 * </tr>\r
428 * <tr>\r
429 * <td>os390batch</td>\r
430 * <td>OS390 Linker</td>\r
431 * </tr>\r
432 * <tr>\r
433 * <td>os400</td>\r
434 * <td>IccLinker</td>\r
435 * </tr>\r
436 * <tr>\r
437 * <td>sunc89</td>\r
438 * <td>C89 Linker</td>\r
439 * </tr>\r
440 * <tr>\r
441 * <td>xlC</td>\r
442 * <td>VisualAge Linker</td>\r
443 * </tr>\r
444 * </table>\r
445 * \r
446 */\r
447 public void setName(LinkerEnum name) throws BuildException {\r
448 if (isReference()) {\r
449 throw tooManyAttributes();\r
450 }\r
451 Linker linker = name.getLinker();\r
452 super.setProcessor(linker);\r
453 }\r
454 protected void setProcessor(Processor proc) throws BuildException {\r
455 Linker linker = null;\r
456 if (proc instanceof Linker) {\r
457 linker = (Linker) proc;\r
458 } else {\r
459 LinkType linkType = new LinkType();\r
460 linker = proc.getLinker(linkType);\r
461 }\r
462 super.setProcessor(linker);\r
463 }\r
464 /**\r
465 * Sets stack size in bytes.\r
466 */\r
467 public void setStack(FlexInteger stack) {\r
468 if (isReference()) {\r
469 throw tooManyAttributes();\r
470 }\r
471 this.stack = stack.intValue();\r
472 }\r
473 public void visitSystemLibraries(Linker linker, FileVisitor libraryVisitor) {\r
474 Project p = getProject();\r
475 if (p == null) {\r
476 throw new java.lang.IllegalStateException("project must be set");\r
477 }\r
478 if (isReference()) {\r
479 LinkerDef master = ((LinkerDef) getCheckedRef(LinkerDef.class,\r
480 "Linker"));\r
481 master.visitSystemLibraries(linker, libraryVisitor);\r
482 } else {\r
483 //\r
484 // if this linker extends another,\r
485 // visit its libraries first\r
486 //\r
487 LinkerDef extendsDef = (LinkerDef) getExtends();\r
488 if (extendsDef != null) {\r
489 extendsDef.visitSystemLibraries(linker, libraryVisitor);\r
490 }\r
491 if (sysLibrarySets.size() > 0) {\r
492 File[] libpath = linker.getLibraryPath();\r
493 for (int i = 0; i < sysLibrarySets.size(); i++) {\r
494 LibrarySet set = (LibrarySet) sysLibrarySets.elementAt(i);\r
495 if (set.isActive(p)) {\r
496 set.visitLibraries(p, linker, libpath,\r
497 libraryVisitor);\r
498 }\r
499 }\r
500 }\r
501 }\r
502 }\r
503 public void visitUserLibraries(Linker linker, FileVisitor libraryVisitor) {\r
504 Project p = getProject();\r
505 if (p == null) {\r
506 throw new java.lang.IllegalStateException("project must be set");\r
507 }\r
508 if (isReference()) {\r
509 LinkerDef master = ((LinkerDef) getCheckedRef(LinkerDef.class,\r
510 "Linker"));\r
511 master.visitUserLibraries(linker, libraryVisitor);\r
512 } else {\r
513 //\r
514 // if this linker extends another,\r
515 // visit its libraries first\r
516 //\r
517 LinkerDef extendsDef = (LinkerDef) getExtends();\r
518 if (extendsDef != null) {\r
519 extendsDef.visitUserLibraries(linker, libraryVisitor);\r
520 }\r
521 //\r
522 // visit the user libraries\r
523 //\r
524 if (librarySets.size() > 0) {\r
525 File[] libpath = linker.getLibraryPath();\r
526 for (int i = 0; i < librarySets.size(); i++) {\r
527 LibrarySet set = (LibrarySet) librarySets.elementAt(i);\r
528 if (set.isActive(p)) {\r
529 set.visitLibraries(p, linker, libpath,\r
530 libraryVisitor);\r
531 }\r
532 }\r
533 }\r
534 }\r
535 }\r
536 /**\r
537 * Enables or disables default flags.\r
538 * \r
539 * @param defaultflag\r
540 * if true, default flags will add to command line.\r
541 * \r
542 */\r
543 public void setDefaultflag(boolean defaultflag) {\r
544 if (isReference()) {\r
545 throw tooManyAttributes();\r
546 }\r
547 this.defaultflag = booleanValueOf(defaultflag);\r
548 }\r
549}\r