diff --git a/cdtool/cdgradle/build.gradle b/cdtool/cdgradle/build.gradle index 58e3c8b95..f8d4e963d 100644 --- a/cdtool/cdgradle/build.gradle +++ b/cdtool/cdgradle/build.gradle @@ -1,20 +1,18 @@ /* (c) https://github.com/MontiCore/monticore */ +buildscript { + dependencies { + classpath "de.se_rwth.commons:se-commons-gradle:$mc_version" + } +} plugins { id 'java-library' id 'java-gradle-plugin' id 'maven-publish' } - -configurations { - cdTool -} - - dependencies { implementation "de.se_rwth.commons:se-commons-gradle:$mc_version" - cdTool "de.monticore.lang:cd4analysis:$mc_version" - compileOnly(project(":cdlang")) // As the main/cdtool dependency does not have an api dependency to cdlang +// compileOnly(project(":cdlang")) // As the main/cdtool dependency does not have an api dependency to cdlang testImplementation "org.junit.jupiter:junit-jupiter-api:$junit_version" testImplementation "org.junit.jupiter:junit-jupiter-params:$junit_version" @@ -25,12 +23,6 @@ dependencies { } -sourceSets { - main.compileClasspath += configurations.cdTool - test.compileClasspath += configurations.cdTool -} - - gradlePlugin { plugins { cdplugin { @@ -55,29 +47,20 @@ test.dependsOn(project(":cdlang").tasks.jar) test.inputs.files(project(":cdlang").tasks.jar) // Write the version to the jar -def buildInfoVersion = project.version.toString() - -tasks.register('generateResources') { - ext { - propFile = layout.buildDirectory.file("generated/buildInfo.properties") - } - outputs.file propFile - doLast { - File f = propFile.get().asFile - f.parentFile.mkdirs() - f.text = "version=$buildInfoVersion" - } +import de.monticore.gradle.common.MCBuildInfoTask; +tasks.register("writeMCBuildInfo", MCBuildInfoTask.class){ + getVersion().set(project.provider(() -> project.getVersion().toString())); } + processResources { - from files(generateResources) - dependsOn generateResources + dependsOn tasks.named("writeMCBuildInfo") } tasks.withType(Test).configureEach { useJUnitPlatform() dependsOn project.tasks.getByPath(":cdlang:jar") dependsOn project.tasks.getByPath(":cd-runtime:jar") - dependsOn generateResources + dependsOn tasks.named("writeMCBuildInfo") // For the MontiVerse systemProperty "maven.repo.local", System.getProperty("maven.repo.local") diff --git a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenAction.java b/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenAction.java deleted file mode 100644 index 58fce1129..000000000 --- a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenAction.java +++ /dev/null @@ -1,19 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cdgen.gradleplugin; - -import de.monticore.gradle.common.AToolAction; -import de.monticore.gradle.internal.isolation.CachedIsolation; - -public abstract class CDGenAction extends AToolAction { - - protected static final CachedIsolation.WithClassPath isolator = - new CachedIsolation.WithClassPath(); - - @Override - protected void doRun(String[] args) { - final String prefix = "[" + getParameters().getProgressName().get() + "] "; - isolator.executeInClassloader(CDGenToolInvoker.class.getName(), "run", args, prefix, - getParameters().getExtraClasspathElements()); - } - -} diff --git a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenGradleDependenciesPlugin.java b/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenGradleDependenciesPlugin.java new file mode 100644 index 000000000..16ededb51 --- /dev/null +++ b/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenGradleDependenciesPlugin.java @@ -0,0 +1,71 @@ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.cdgen.gradleplugin; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.plugins.JavaLibraryPlugin; + +import java.io.IOException; +import java.util.Properties; + +@SuppressWarnings("unused") +public class CDGenGradleDependenciesPlugin implements Plugin { + + /** + * Configuration containing the classpath of the generator tool. + */ + public static final String CONFIG_TOOL = "cdTool"; + + /** + * Configuration containing the classpath of the target. + * it will be added to the api configuration & passed as a symbol path for class2mc + */ + public static final String CONFIG_TARGET_RUNTIME = "cdToolTargetRuntime"; + + @Override + public void apply(Project project) { + project.getPluginManager().apply(JavaLibraryPlugin.class); + + // Setup cdTool dependency + var properties = loadProperties(); + String version = properties.getProperty("version"); + + Configuration toolConfig = project.getConfigurations().maybeCreate(CONFIG_TOOL); + toolConfig.setCanBeResolved(true); + Configuration toolRuntimeConfig = project.getConfigurations().maybeCreate( + CONFIG_TARGET_RUNTIME); + toolRuntimeConfig.setCanBeResolved(true); + + toolConfig.defaultDependencies(dependencies -> { + dependencies.add(project.getDependencies().create("de.monticore.lang:cd4analysis:" + + version)); + }); + + toolRuntimeConfig.defaultDependencies(dependencies -> { + dependencies.add(project.getDependencies().create("de.monticore.lang:cd-runtime:" + version + + ":cd-runtime")); + }); + + project.getTasks().withType(CDGenTask.class).configureEach(t -> t.getExtraClasspathElements() + .from(toolConfig)); + + project.getTasks().withType(CDGenTask.class).configureEach(t -> t.getTargetSymbolPath().from( + toolRuntimeConfig)); + + project.getConfigurations().named("api").configure(api -> api.extendsFrom(toolRuntimeConfig)); + + } + + public Properties loadProperties() { + Properties properties = new Properties(); + try { + properties.load(this.getClass().getClassLoader().getResourceAsStream("buildInfo.properties")); + } + catch (IOException e) { + throw new RuntimeException(e); + } + return properties; + } + +} diff --git a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenGradlePlugin.java b/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenGradlePlugin.java index 3b92307e5..a034859f0 100644 --- a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenGradlePlugin.java +++ b/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenGradlePlugin.java @@ -1,18 +1,16 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.cdgen.gradleplugin; -import java.io.IOException; -import java.util.Properties; import java.util.stream.Collectors; + +import de.monticore.gradle.queue.CachedQueueServicePlugin; import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.artifacts.Configuration; import org.gradle.api.file.Directory; import org.gradle.api.file.FileCollection; import org.gradle.api.file.SourceDirectorySet; import org.gradle.api.internal.lambdas.SerializableLambdas; import org.gradle.api.model.ObjectFactory; -import org.gradle.api.plugins.JavaLibraryPlugin; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.SourceSet; @@ -22,11 +20,6 @@ @SuppressWarnings("unused") public class CDGenGradlePlugin implements Plugin { - /** - * Configuration containing the classpath of the generator tool. - */ - public static final String CONFIG_TOOL = "cdTool"; - private final ObjectFactory objectFactory; @Inject @@ -34,45 +27,16 @@ public CDGenGradlePlugin(ObjectFactory objectFactory) { this.objectFactory = objectFactory; } - /** - * Configuration containing the classpath of the target. - * it will be added to the api configuration & passed as a symbol path for class2mc - */ - public static final String CONFIG_TARGET_RUNTIME = "cdToolTargetRuntime"; - @Override public void apply(Project project) { - project.getPluginManager().apply(JavaLibraryPlugin.class); - - // Setup cdTool dependency - var properties = loadProperties(); - String version = properties.getProperty("version"); + // Set up the improved work-queue + project.getPluginManager().apply(CachedQueueServicePlugin.class); - Configuration toolConfig = project.getConfigurations().maybeCreate(CONFIG_TOOL); - toolConfig.setCanBeResolved(true); - Configuration toolRuntimeConfig = project.getConfigurations().maybeCreate( - CONFIG_TARGET_RUNTIME); - toolRuntimeConfig.setCanBeResolved(true); + // Populate the "cdTool" configuration with the generator itself and + // Populate the "cdToolTargetRuntime" configuration with the runtime + project.getPluginManager().apply(CDGenGradleDependenciesPlugin.class); - toolConfig.defaultDependencies(dependencies -> { - dependencies.add(project.getDependencies().create("de.monticore.lang:cd4analysis:" - + version)); - }); - - toolRuntimeConfig.defaultDependencies(dependencies -> { - dependencies.add(project.getDependencies().create("de.monticore.lang:cd-runtime:" + version - + ":cd-runtime")); - }); - - project.getTasks().withType(CDGenTask.class).configureEach(t -> t.getExtraClasspathElements() - .from(toolConfig)); - - project.getTasks().withType(CDGenTask.class).configureEach(t -> t.getTargetSymbolPath().from( - toolRuntimeConfig)); - - project.getConfigurations().named("api").configure(api -> api.extendsFrom(toolRuntimeConfig)); - - // Set up source-Sets + // Set up source-(directory)-Sets project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets().all(sourceSet -> { var cdSrcDirSet = addSourceSetExtension(sourceSet, project); @@ -100,17 +64,6 @@ public void apply(Project project) { }); } - public Properties loadProperties() { - Properties properties = new Properties(); - try { - properties.load(this.getClass().getClassLoader().getResourceAsStream("buildInfo.properties")); - } - catch (IOException e) { - throw new RuntimeException(e); - } - return properties; - } - /** Adds the "cd" extension to every source set */ protected CDSourceDirectorySet addSourceSetExtension(SourceSet sourceSet, Project project) { SourceDirectorySet vanillaSrcDirSet = project.getObjects().sourceDirectorySet( @@ -136,8 +89,7 @@ protected CDSourceDirectorySet addSourceSetExtension(SourceSet sourceSet, Projec cdSrcDirSet.getFilter().include("**/*.cd"); // Casting the SrcDirSet to a FileCollection seems to be necessary due to compatibility reasons - // with the - // configuration cache. + // with the configuration cache. // See // https://github.com/gradle/gradle/blob/d36380f26658d5cf0bf1bfb3180b9eee6d1b65a5/subprojects/scala/src/main/java/org/gradle/api/plugins/scala/ScalaBasePlugin.java#L194 FileCollection mcSrcSetCast = cdSrcDirSet; diff --git a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenTask.java b/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenTask.java index f0ecd7493..39d8d4b34 100644 --- a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenTask.java +++ b/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenTask.java @@ -1,14 +1,13 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.cdgen.gradleplugin; -import de.monticore.gradle.common.AToolAction; import de.monticore.gradle.common.MCAllFilesTask; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import java.util.function.Consumer; import java.util.function.Function; +import de.monticore.gradle.queue.ICachedQueueTask; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.DirectoryProperty; import org.gradle.api.provider.ListProperty; @@ -21,10 +20,11 @@ * B.cd is allowed */ @CacheableTask -public abstract class CDGenTask extends MCAllFilesTask { +public abstract class CDGenTask extends MCAllFilesTask implements ICachedQueueTask { public CDGenTask() { super("CDGenTask", null); + getMainClass().convention("de.monticore.cdgen.CDGenTool"); } @Optional @@ -113,9 +113,10 @@ public void startGeneration(List args, String progressName) { } @Override - protected Class getToolAction() { return CDGenAction.class; } - - @Override - protected Consumer getRunMethod() { return CDGenToolInvoker::run; } + protected void prepareWorkQueue() { + // Use the improved shared-isolated-work-queue of se-commons + this.workQueue = doGetSharedQueueService().newWorkQueue(getWorkerExecutor(), + getExtraClasspathElements()); + } } diff --git a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenToolInvoker.java b/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenToolInvoker.java deleted file mode 100644 index ef9fc77e2..000000000 --- a/cdtool/cdgradle/src/main/java/de/monticore/cdgen/gradleplugin/CDGenToolInvoker.java +++ /dev/null @@ -1,17 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cdgen.gradleplugin; - -import de.monticore.gradle.common.GradleLog; -import de.se_rwth.commons.logging.Log; -import java.util.Arrays; - -public class CDGenToolInvoker { - - public static void run(String[] args) { - GradleLog.init(); - Log.info("Starting CDGenTool: \n" + "\t java -jar CDGenTool.jar " + Arrays.toString(args), - CDGenToolInvoker.class.getName()); - de.monticore.cdgen.CDGenTool.gradleMain(args); - } - -}