/******************************************************************************* | |
* Copyright 2011 See AUTHORS file. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
******************************************************************************/ | |
package com.badlogic.gdx.jnigen; | |
import java.io.BufferedReader; | |
import java.io.File; | |
import java.io.IOException; | |
import java.io.InputStreamReader; | |
import java.util.regex.Matcher; | |
import java.util.regex.Pattern; | |
/** Executes an ant script and its targets or an Android NDK build. See {@link AntScriptGenerator}. | |
* @author mzechner */ | |
public class BuildExecutor { | |
/** Execute the Ant script file with the given parameters. | |
* @param buildFile | |
* @param params | |
* @return whether the Ant succeeded */ | |
public static boolean executeAnt (String buildFile, String params) { | |
FileDescriptor build = new FileDescriptor(buildFile); | |
String ant = System.getProperty("os.name").contains("Windows") ? "ant.bat" : "ant"; | |
String command = ant + " -f \"" + build.file().getAbsolutePath() + "\" " + params; | |
System.out.println("Executing '" + command + "'"); | |
return startProcess(command, build.parent().file()); | |
} | |
/** Execute ndk-build in the given directory | |
* @param directory */ | |
public static void executeNdk (String directory) { | |
FileDescriptor build = new FileDescriptor(directory); | |
String command = "ndk-build"; | |
startProcess(command, build.file()); | |
} | |
private static boolean startProcess (String command, File directory) { | |
try { | |
final Process process = new ProcessBuilder(command.split(" ")).redirectErrorStream(true).start(); | |
Thread t = new Thread(new Runnable() { | |
@Override | |
public void run () { | |
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); | |
String line = null; | |
try { | |
while ((line = reader.readLine()) != null) { | |
// augment output with java file line references :D | |
printFileLineNumber(line); | |
} | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
private void printFileLineNumber (String line) { | |
if (line.contains("warning") || line.contains("error")) { | |
try { | |
String fileName = getFileName(line); | |
String error = getError(line); | |
int lineNumber = getLineNumber(line) - 1; | |
if (fileName != null && lineNumber >= 0) { | |
FileDescriptor file = new FileDescriptor(fileName); | |
if (file.exists()) { | |
String[] content = file.readString().split("\n"); | |
if (lineNumber < content.length) { | |
for (int i = lineNumber; i >= 0; i--) { | |
String contentLine = content[i]; | |
if (contentLine.startsWith("//@line:")) { | |
int javaLineNumber = Integer.parseInt(contentLine.split(":")[1].trim()); | |
System.out.flush(); | |
if (line.contains("warning")) { | |
System.out.println("(" + file.nameWithoutExtension() + ".java:" | |
+ (javaLineNumber + (lineNumber - i) - 1) + "): " + error + ", original: " + line); | |
System.out.flush(); | |
} else { | |
System.err.println("(" + file.nameWithoutExtension() + ".java:" | |
+ (javaLineNumber + (lineNumber - i) - 1) + "): " + error + ", original: " + line); | |
System.err.flush(); | |
} | |
return; | |
} | |
} | |
} | |
} else { | |
System.out.println(line); | |
} | |
} | |
} catch (Throwable t) { | |
System.out.println(line); | |
// silent death... | |
} | |
} else { | |
System.out.println(line); | |
} | |
} | |
private String getFileName (String line) { | |
Pattern pattern = Pattern.compile("(.*):([0-9])+:[0-9]+:"); | |
Matcher matcher = pattern.matcher(line); | |
matcher.find(); | |
String fileName = matcher.groupCount() >= 2 ? matcher.group(1).trim() : null; | |
if (fileName == null) return null; | |
int index = fileName.indexOf(" "); | |
if (index != -1) | |
return fileName.substring(index).trim(); | |
else | |
return fileName; | |
} | |
private String getError (String line) { | |
Pattern pattern = Pattern.compile(":[0-9]+:[0-9]+:(.+)"); | |
Matcher matcher = pattern.matcher(line); | |
matcher.find(); | |
return matcher.groupCount() >= 1 ? matcher.group(1).trim() : null; | |
} | |
private int getLineNumber (String line) { | |
Pattern pattern = Pattern.compile(":([0-9]+):[0-9]+:"); | |
Matcher matcher = pattern.matcher(line); | |
matcher.find(); | |
return matcher.groupCount() >= 1 ? Integer.parseInt(matcher.group(1)) : -1; | |
} | |
}); | |
t.setDaemon(true); | |
t.start(); | |
process.waitFor(); | |
return process.exitValue() == 0; | |
} catch (Exception e) { | |
e.printStackTrace(); | |
return false; | |
} | |
} | |
} |