diff options
Diffstat (limited to 'src/main/groovy/frege/gradle/CompileTask.groovy')
-rw-r--r-- | src/main/groovy/frege/gradle/CompileTask.groovy | 273 |
1 files changed, 0 insertions, 273 deletions
diff --git a/src/main/groovy/frege/gradle/CompileTask.groovy b/src/main/groovy/frege/gradle/CompileTask.groovy deleted file mode 100644 index d297d3d..0000000 --- a/src/main/groovy/frege/gradle/CompileTask.groovy +++ /dev/null @@ -1,273 +0,0 @@ -package frege.gradle - -import frege.compiler.Main -import frege.prelude.PreludeBase -import frege.runtime.Lambda -import groovy.transform.TypeChecked -import groovy.transform.TypeCheckingMode -import org.gradle.api.DefaultTask -import org.gradle.api.Project -import org.gradle.api.artifacts.Configuration -import org.gradle.api.file.FileCollection -import org.gradle.api.tasks.* -import org.gradle.process.internal.DefaultJavaExecAction -import org.gradle.process.internal.JavaExecAction -import org.gradle.api.internal.file.FileResolver - -@TypeChecked -class CompileTask extends DefaultTask { - - // see help at https://github.com/Frege/frege/wiki/Compiler-Manpage - - static String DEFAULT_CLASSES_SUBDIR = "classes/main" // TODO: should this come from a convention? - static String DEFAULT_SRC_DIR = "src/main/frege" // TODO: should this come from a source set? - - static String DEFAULT_TEST_CLASSES_DIR = "classes/test" - static String DEFAULT_TEST_SRC_DIR = "src/test/frege" - - static Boolean USE_EXTERNAl = true - - @Optional @Input - boolean enabled = true - - @Optional @Input - Boolean help = false - - @Optional @Input - String stackSize = "4m" - - @Optional @Input - boolean hints = false - - @Optional @Input - boolean optimize = false - - @Optional @Input - boolean verbose = false - - @Optional @Input - boolean inline = true - - @Optional @Input - boolean make = true - - @Optional @Input - boolean compileGeneratedJava = true - - @Optional @Input - String target = "" - - @Optional @Input - boolean comments = false - - @Optional @Input - boolean suppressWarnings = false - - @Optional @Input - String explain = "" - - @Optional @Input - boolean skipCompile = false - - @Optional @Input - String extraArgs = "" - - @Optional @Input - String allArgs = "" // this is an option to overrule all other settings - - @Optional @Input - String module = "" - - @Optional @Input - List<File> fregePaths = [] - - @InputFiles - List<File> sourcePaths = [deduceSourceDir(project)] - - @Optional @OutputDirectory - File outputDir = deduceClassesDir(project) - - @Optional @Input - String mainClass = "frege.compiler.Main" - - @Optional @Input - List<String> allJvmArgs = [] - - @Optional @Input - String encoding = "" - - @Optional @Input - String prefix = "" - - // TODO: Missing presentation of types (ascii, symbols, latin, greek, faktur) - - static File deduceSourceDir(File projectDir, String subdir) { - new File(projectDir, subdir) - } - - static File deduceSourceDir(Project project) { - deduceSourceDir(project.projectDir, DEFAULT_SRC_DIR) - } - - static File deduceClassesDir(File projectDir, String subdir) { - new File(projectDir, subdir) - } - - static File deduceClassesDir(Project project) { - deduceClassesDir(project.buildDir, DEFAULT_CLASSES_SUBDIR) - } - - static File deduceTestClassesDir(Project project) { - deduceClassesDir(project.buildDir, DEFAULT_TEST_CLASSES_DIR) - } - - static File deduceTestSourceDir(Project project) { - deduceSourceDir(project.projectDir, DEFAULT_TEST_SRC_DIR) - } - - @TaskAction - void executeCompile() { - - if (!enabled) { - logger.info("Frege compiler disabled.") - return; - } - - if (!outputDir.exists() ) { - logger.info "Creating output directory '${outputDir.absolutePath}'." - outputDir.mkdirs() - } - // access extension configuration values as ${project.frege.key1} - - FileResolver fileResolver = getServices().get(FileResolver.class) - JavaExecAction action = new DefaultJavaExecAction(fileResolver) - action.setMain(mainClass) - - logConfigurationInfo() - - action.setClasspath(actionClasspath(project)) - - def args = [] - if (help) { - args << "-help" - } else { - def jvmArgs = allJvmArgs - if (jvmArgs.isEmpty()) { - jvmArgs << "-Xss$stackSize".toString() - } - action.setJvmArgs(jvmArgs) - args = allArgs ? allArgs.split().toList() : assembleArguments() - } - - logger.info("Calling Frege compiler with args: '$args'") - action.args(args) - - if (USE_EXTERNAl) { - action.execute() - } else { - compile(args as String[]) - } - } - - void logConfigurationInfo() { - def path = project.files(compileConfig()).getAsPath() - logger.info("Compile configuation as path: $path") - - } - - FileCollection actionClasspath(Project p) { - p.files(compileConfig()) + p.files(deduceClassesDir(p)) - } - - // TODO: This should be removed or integrated so an external Java process does not need to be started. - // The Java generated uses System.exit() which does not work well with Gradle - // This was taken from the frege fork /compiler1/build/classes/main/afrege/compiler/Main.java:main() - void compile(String[] paramArrayOfString) { - long l1 = System.nanoTime(); - Integer localInteger = frege.runtime.Runtime.runMain( - PreludeBase.TST.performUnsafe( - (Lambda)Main.IJ._mainƒd0fa0028.inst.apply(PreludeBase._toList(paramArrayOfString)).forced() - ) - ); - long l2 = System.nanoTime(); - ((PrintWriter)frege.runtime.Runtime.stderr.get()).println("runtime " + (l2 - l1 + 500000L) / 1000000L / 1000.0D + " wallclock seconds."); - if (localInteger != null) { -// System.exit(localInteger.intValue()); - } - } - - List<File> totalFregeClasspath(List<File> fp) { - def result = [] - result.addAll(project.files(compileConfig()).getFiles().toList()) - result.addAll(fp) - result - } - - @TypeChecked(TypeCheckingMode.SKIP) - Configuration compileConfig() { - project.configurations.compile - } - - protected List<String> assembleArguments() { - List args = [] - if (hints) - args << "-hints" - if (optimize) { - args << "-O" - args << "-inline" - } - if (inline & !optimize) - args << "-inline" - if (make) - args << "-make" - if (!compileGeneratedJava) args << "-j" - if (target != "") { - args << "-target" - args << target - } - if (comments) args << "-comments" - if (suppressWarnings) args << "-nowarn" - if (explain != "") { - args << "-explain" - args << explain - } - if (verbose) - args << "-v" - if (skipCompile) - args << "-j" - - def fp = USE_EXTERNAl ? fregePaths : totalFregeClasspath(fregePaths) - if (!fp.isEmpty()) { - args << "-fp" - args << fp.collect{f -> f.absolutePath}.join(File.pathSeparator) - } - - if (sourcePaths != null && !sourcePaths.isEmpty()) { - args << "-sp" - args << sourcePaths.collect{d -> d.absolutePath}.join(File.pathSeparator) - } - - if (encoding != "") { - args << "-enc" - args << encoding - } - - if (prefix != "") { - args << "-prefix" - args << prefix - } - - args << "-d" - args << outputDir - - if (!module.isEmpty()) { - logger.info "compiling module '$module'" - args << module - } else { - args = (args + extraArgs.split().toList()).toList() - } - - args - } - -} |