40 return objectFileName; |
40 return objectFileName; |
41 } |
41 } |
42 |
42 |
43 String libFile() { |
43 String libFile() { |
44 return libraryFileName; |
44 return libraryFileName; |
|
45 } |
|
46 |
|
47 private static String getString(InputStream stream) { |
|
48 BufferedReader br = new BufferedReader(new InputStreamReader(stream)); |
|
49 Stream<String> lines = br.lines(); |
|
50 StringBuilder sb = new StringBuilder(); |
|
51 lines.iterator().forEachRemaining(e -> sb.append(e)); |
|
52 return sb.toString(); |
45 } |
53 } |
46 |
54 |
47 Linker(Main main) throws Exception { |
55 Linker(Main main) throws Exception { |
48 this.options = main.options; |
56 this.options = main.options; |
49 String name = options.outputName; |
57 String name = options.outputName; |
104 // Check linker presence on platforms by printing its version |
112 // Check linker presence on platforms by printing its version |
105 if (linkerCheck != null) { |
113 if (linkerCheck != null) { |
106 Process p = Runtime.getRuntime().exec(linkerCheck); |
114 Process p = Runtime.getRuntime().exec(linkerCheck); |
107 final int exitCode = p.waitFor(); |
115 final int exitCode = p.waitFor(); |
108 if (exitCode != 0) { |
116 if (exitCode != 0) { |
109 InputStream stderr = p.getErrorStream(); |
117 throw new InternalError(getString(p.getErrorStream())); |
110 BufferedReader br = new BufferedReader(new InputStreamReader(stderr)); |
|
111 Stream<String> lines = br.lines(); |
|
112 StringBuilder sb = new StringBuilder(); |
|
113 lines.iterator().forEachRemaining(e -> sb.append(e)); |
|
114 throw new InternalError(sb.toString()); |
|
115 } |
118 } |
116 } |
119 } |
117 } |
120 } |
118 |
121 |
119 void link() throws Exception { |
122 void link() throws Exception { |
120 Process p = Runtime.getRuntime().exec(linkerCmd); |
123 Process p = Runtime.getRuntime().exec(linkerCmd); |
121 final int exitCode = p.waitFor(); |
124 final int exitCode = p.waitFor(); |
122 if (exitCode != 0) { |
125 if (exitCode != 0) { |
123 InputStream stderr = p.getErrorStream(); |
126 String errorMessage = getString(p.getErrorStream()); |
124 if (stderr.read() == -1) { |
127 if (errorMessage.isEmpty()) { |
125 stderr = p.getInputStream(); |
128 errorMessage = getString(p.getInputStream()); |
126 } |
129 } |
127 BufferedReader br = new BufferedReader(new InputStreamReader(stderr)); |
130 throw new InternalError(errorMessage); |
128 Stream<String> lines = br.lines(); |
|
129 StringBuilder sb = new StringBuilder(); |
|
130 lines.iterator().forEachRemaining(e -> sb.append(e)); |
|
131 throw new InternalError(sb.toString()); |
|
132 } |
131 } |
133 File objFile = new File(objectFileName); |
132 File objFile = new File(objectFileName); |
134 if (objFile.exists()) { |
133 if (objFile.exists()) { |
135 if (!objFile.delete()) { |
134 if (!objFile.delete()) { |
136 throw new InternalError("Failed to delete " + objectFileName + " file"); |
135 throw new InternalError("Failed to delete " + objectFileName + " file"); |