org.gosulang.gradle.tasks.compile.CommandLineGosuCompiler Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of gradle-gosu-plugin Show documentation
Show all versions of gradle-gosu-plugin Show documentation
Gosu language compiler for Gradle. Built with Gradle 5.1.1.
This has also been tested extensively with Gradle version(s): 5.1.1
** Gradle versions below 2.12 are no longer supported **
Projects applying this plugin require a compile-time dependency on the gosu-core-api library.
This version requires Gosu 1.13.9 or greater, or 1.14.2 or greater.
Please include this in the depencencies closure:
dependencies {
compile group: 'org.gosu-lang.gosu', name: 'gosu-core-api', version: '1.14.12'
}
package org.gosulang.gradle.tasks.compile;
import org.apache.tools.ant.taskdefs.condition.Os;
import org.gosulang.gradle.tasks.Util;
import org.gradle.api.Project;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;
import org.gradle.api.tasks.WorkResult;
import org.gradle.api.tasks.compile.ForkOptions;
import org.gradle.process.ExecResult;
import org.gradle.process.JavaExecSpec;
import org.gradle.util.GUtil;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
public class CommandLineGosuCompiler implements GosuCompiler {
private static final Logger LOGGER = Logging.getLogger(CommandLineGosuCompiler.class);
private final Project _project;
private final GosuCompileSpec _spec;
private final String _projectName;
public CommandLineGosuCompiler(Project project, GosuCompileSpec spec, String projectName ) {
_project = project;
_spec = spec;
_projectName = projectName;
}
@Override
public WorkResult execute( GosuCompileSpec spec ) {
String startupMsg = "Initializing gosuc compiler";
if(_projectName.isEmpty()) {
startupMsg += " for " + _projectName;
}
LOGGER.info(startupMsg);
List gosucArgs = new ArrayList<>();
File argFile;
try {
argFile = createArgFile(_spec);
gosucArgs.add("@" + argFile.getCanonicalPath().replace(File.separatorChar, '/'));
} catch (IOException e) {
LOGGER.error("Error creating argfile with gosuc arguments");
throw new GosuCompilationFailedException(e);
}
ByteArrayOutputStream stdout = new ByteArrayOutputStream();
ByteArrayOutputStream stderr = new ByteArrayOutputStream();
ExecResult result = _project.javaexec(javaExecSpec -> {
javaExecSpec.setWorkingDir((Object) _project.getProjectDir()); // Gradle 4.0 overloads ProcessForkOptions#setWorkingDir; must upcast to Object for backwards compatibility
setJvmArgs(javaExecSpec, _spec.getGosuCompileOptions().getForkOptions());
javaExecSpec.setMain("gw.lang.gosuc.cli.CommandLineCompiler")
.setClasspath(spec.getGosuClasspath().call()
.plus(_project.files(Util.findToolsJar())))
.setArgs((Iterable>) gosucArgs); // Gradle 4.0 overloads JavaExecSpec#setArgs; must upcast to Iterable> for backwards compatibility
javaExecSpec.setStandardOutput(stdout);
javaExecSpec.setErrorOutput(stderr);
javaExecSpec.setIgnoreExitValue(true); //otherwise fails immediately before displaying output
});
int exitCode = result.getExitValue();
if(exitCode != 0 ) {
LOGGER.quiet(stdout.toString());
LOGGER.quiet(stderr.toString());
if(!_spec.getGosuCompileOptions().isFailOnError()) {
LOGGER.quiet(String.format("%s completed with errors, but ignoring as 'gosuOptions.failOnError = false' was specified.", _projectName.isEmpty() ? "gosuc" : _projectName));
} else {
throw new GosuCompilationFailedException(exitCode);
}
} else {
LOGGER.info(stdout.toString());
LOGGER.info(stderr.toString());
LOGGER.info(String.format("%s completed successfully.", _projectName.isEmpty() ? "gosuc" : _projectName));
}
return () -> true;
}
private void setJvmArgs(JavaExecSpec spec, ForkOptions forkOptions) {
if(forkOptions.getMemoryInitialSize() != null && !forkOptions.getMemoryInitialSize().isEmpty()) {
spec.setMinHeapSize(forkOptions.getMemoryInitialSize());
}
if(forkOptions.getMemoryMaximumSize() != null && !forkOptions.getMemoryMaximumSize().isEmpty()) {
spec.setMaxHeapSize(forkOptions.getMemoryMaximumSize());
}
List args = new ArrayList<>();
//respect JAVA_OPTS, if it exists
String JAVA_OPTS = System.getenv("JAVA_OPTS");
if(JAVA_OPTS != null && !JAVA_OPTS.isEmpty()) {
args.add(JAVA_OPTS);
}
args.addAll(forkOptions.getJvmArgs());
if(Os.isFamily(Os.FAMILY_MAC)) {
args.add("-Xdock:name=gosuc");
}
spec.setJvmArgs((Iterable>) args); // Gradle 4.0 overloads JavaForkOptions#setJvmArgs; must upcast to Iterable> for backwards compatibility
}
private File createArgFile(GosuCompileSpec spec) throws IOException {
File tempFile = File.createTempFile(CommandLineGosuCompiler.class.getName(), "arguments", spec.getTempDir());
List fileOutput = new ArrayList<>();
if(spec.getGosuCompileOptions().isCheckedArithmetic()) {
fileOutput.add("-checkedArithmetic");
}
// The classpath used to initialize Gosu; CommandLineCompiler will supplement this with the JRE jars
fileOutput.add("-classpath");
fileOutput.add(String.join(File.pathSeparator, GUtil.asPath(spec.getClasspath())));
fileOutput.add("-d");
fileOutput.add(spec.getDestinationDir().getAbsolutePath());
fileOutput.add("-sourcepath");
fileOutput.add(String.join(File.pathSeparator, GUtil.asPath(spec.getSourceRoots())));
if(!spec.getCompileOptions().isWarnings()) {
fileOutput.add("-nowarn");
}
if(spec.getGosuCompileOptions().isVerbose()) {
fileOutput.add("-verbose");
}
if(spec.getGosuCompileOptions().getMaxWarns() != null) {
fileOutput.add("-maxwarns");
fileOutput.add(spec.getGosuCompileOptions().getMaxWarns().toString());
}
if(spec.getGosuCompileOptions().getMaxErrs() != null) {
fileOutput.add("-maxerrs");
fileOutput.add(spec.getGosuCompileOptions().getMaxErrs().toString());
}
for(File sourceFile : spec.getSource()) {
fileOutput.add(sourceFile.getPath());
}
Files.write(tempFile.toPath(), fileOutput, StandardCharsets.UTF_8);
return tempFile;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy