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.gcc.cross;
21
22 import java.io.File;
23
24 import org.apache.tools.ant.BuildException;
25
26 import com.github.maven_nar.cpptasks.CCTask;
27 import com.github.maven_nar.cpptasks.LinkerParam;
28 import com.github.maven_nar.cpptasks.compiler.CommandLineLinkerConfiguration;
29 import com.github.maven_nar.cpptasks.compiler.LinkType;
30 import com.github.maven_nar.cpptasks.compiler.Linker;
31 import com.github.maven_nar.cpptasks.gcc.AbstractLdLinker;
32
33
34
35
36
37
38 public final class LdLinker extends AbstractLdLinker {
39 private static final String[] libtoolObjFiles = new String[] {
40 ".fo", ".a", ".lib", ".dll", ".so", ".sl"
41 };
42 private static final String[] objFiles = new String[] {
43 ".o", ".a", ".lib", ".dll", ".so", ".sl"
44 };
45 private static final String[] discardFiles = new String[0];
46 private static final LdLinker dllLinker = new LdLinker("ld", objFiles, discardFiles, "lib", ".so", false,
47 new LdLinker("ld", objFiles, discardFiles, "lib", ".so", true, null));
48 private static final LdLinker instance = new LdLinker("ld", objFiles, discardFiles, "", "", false, null);
49
50 public static LdLinker getInstance() {
51 return instance;
52 }
53
54 private File[] libDirs;
55
56 private LdLinker(final String command, final String[] extensions, final String[] ignoredExtensions,
57 final String outputPrefix, final String outputSuffix, final boolean isLibtool, final LdLinker libtoolLinker) {
58 super(command, "-version", extensions, ignoredExtensions, outputPrefix, outputSuffix, isLibtool, libtoolLinker);
59 }
60
61 @Override
62 protected Object clone() throws CloneNotSupportedException {
63 final LdLinker clone = (LdLinker) super.clone();
64 return clone;
65 }
66
67 @Override
68 public Linker getLinker(final LinkType type) {
69 if (type.isStaticLibrary()) {
70 return GccLibrarian.getInstance();
71 }
72 if (type.isSharedLibrary()) {
73 return dllLinker;
74 }
75 return instance;
76 }
77
78 @Override
79 public void link(final CCTask task, final File outputFile, final String[] sourceFiles,
80 final CommandLineLinkerConfiguration config) throws BuildException {
81 try {
82 final LdLinker clone = (LdLinker) this.clone();
83 final LinkerParam param = config.getParam("target");
84 if (param != null) {
85 clone.setCommand(param.getValue() + "-" + this.getCommand());
86 }
87 clone.superlink(task, outputFile, sourceFiles, config);
88 } catch (final CloneNotSupportedException e) {
89 superlink(task, outputFile, sourceFiles, config);
90 }
91 }
92
93 private void superlink(final CCTask task, final File outputFile, final String[] sourceFiles,
94 final CommandLineLinkerConfiguration config) throws BuildException {
95 super.link(task, outputFile, sourceFiles, config);
96 }
97 }