Skip to content

Commit

Permalink
Merge pull request #136 from tudortimi/publish-metadata-for-systemver…
Browse files Browse the repository at this point in the history
…ilog-compilation-together-with-sources

Publish metadata for SystemVerilog compilation together with sources
  • Loading branch information
tudortimi committed Apr 1, 2024
2 parents 9047bba + 35ca608 commit 6598b4c
Show file tree
Hide file tree
Showing 4 changed files with 146 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -867,6 +867,43 @@ class SystemVerilogPluginSpec extends Specification {
}
}

def "can write sv source to compile spec file"() {
File mainSv = testProjectDir.newFolder('src', 'main', 'sv')
new File(mainSv, "main.sv").createNewFile()

when:
def result = GradleRunner.create()
.withProjectDir(testProjectDir.root)
.withPluginClasspath()
.withArguments(':writeCompileSpecFile')
.build()

then:
def compileSpecFile = new File(testProjectDir.root, 'build/compile-spec.xml')
compileSpecFile.exists()
compileSpecFile.text.contains 'src/main/sv/main.sv'
!(compileSpecFile.text.contains '/src/main/sv/main.sv')
}

def "archive with source file contains compile spec"() {
File mainSv = testProjectDir.newFolder('src', 'main', 'sv')
new File(mainSv, "main.sv").createNewFile()

when:
def result = GradleRunner.create()
.withProjectDir(testProjectDir.root)
.withPluginClasspath()
.withArguments(':hdvlSourcesArchive')
.build()

then:
new File(testProjectDir.root, 'build/hdvl-sources.zip').exists()
def zipFile = new ZipFile(new File(testProjectDir.root, 'build/hdvl-sources.zip'))
def entries = zipFile.entries().findAll { !it.directory }
entries.size() == 2
entries[0].name == '.gradle-hdvl/compile-spec.xml'
}

def "can produce archive with source file"() {
File mainSv = testProjectDir.newFolder('src', 'main', 'sv')
new File(mainSv, "main.sv").createNewFile()
Expand All @@ -882,8 +919,8 @@ class SystemVerilogPluginSpec extends Specification {
new File(testProjectDir.root, 'build/hdvl-sources.zip').exists()
def zipFile = new ZipFile(new File(testProjectDir.root, 'build/hdvl-sources.zip'))
def entries = zipFile.entries().findAll { !it.directory }
entries.size() == 1
entries[0].name == 'src/main/sv/main.sv'
entries.size() == 2
entries[1].name == 'src/main/sv/main.sv'
}

def "can publishing metadata for archive"() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,7 @@
*/
package com.verificationgentleman.gradle.hdvl;

import com.verificationgentleman.gradle.hdvl.internal.DefaultHDVLPluginExtension;
import com.verificationgentleman.gradle.hdvl.internal.Names;
import com.verificationgentleman.gradle.hdvl.internal.Unzip;
import com.verificationgentleman.gradle.hdvl.internal.WriteXrunArgsFile;
import com.verificationgentleman.gradle.hdvl.internal.*;
import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
Expand Down Expand Up @@ -78,6 +75,7 @@ public void execute(SourceSet sourceSet) {

configureDependenciesAttributes(project);

configureWriteCompileSpecFileTask(project);
configureHdvlSourceArchiveTask(project);
configureHdvlSourcesArchiveArtifact(project, mainSourceSet);
}
Expand Down Expand Up @@ -173,10 +171,21 @@ public void execute(TransformSpec<TransformParameters.None> transformSpec) {
});
}

private void configureWriteCompileSpecFileTask(Project project) {
project.getTasks().register("writeCompileSpecFile", WriteCompileSpecFile.class, writeCompileSpecFile -> {
writeCompileSpecFile.getDestination().set(project.getLayout().getBuildDirectory().file("compile-spec.xml"));
});
}

private void configureHdvlSourceArchiveTask(Project project) {
WriteCompileSpecFile writeCompileSpecFile = (WriteCompileSpecFile) project.getTasks().getByName("writeCompileSpecFile");

project.getTasks().register("hdvlSourcesArchive", Zip.class, zip -> {
zip.getDestinationDirectory().convention(project.getLayout().getBuildDirectory());
zip.getArchiveFileName().convention("hdvl-sources.zip");
zip.from(writeCompileSpecFile.getDestination(), it -> {
it.into(".gradle-hdvl");
});
});
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package com.verificationgentleman.gradle.hdvl.internal;

import org.gradle.api.DefaultTask;
import org.gradle.api.file.ConfigurableFileCollection;
import org.gradle.api.file.RegularFileProperty;
import org.gradle.api.tasks.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;

public class WriteCompileSpecFile extends DefaultTask {
private final RegularFileProperty destination;

private ConfigurableFileCollection svSourceFiles;

public WriteCompileSpecFile() {
destination = getProject().getObjects().fileProperty();
svSourceFiles = getProject().getObjects().fileCollection();
}

@OutputFile
public RegularFileProperty getDestination() {
return destination;
}

@InputFiles
@SkipWhenEmpty
@PathSensitive(PathSensitivity.ABSOLUTE)
public ConfigurableFileCollection getSvSource() {
return svSourceFiles;
}

@TaskAction
protected void generate() {
Document document = getDocument();
writeFile(document);
}

private Document getDocument() {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();

Element rootElement = document.createElement("compileSpec");
document.appendChild(rootElement);

Element svSourceFilesElement = document.createElement("svSourceFiles");
rootElement.appendChild(svSourceFilesElement);

for (File svSource : getSvSource().getFiles()) {
Element svSourceFileElement = document.createElement("svSourceFile");
svSourceFileElement.appendChild(document.createTextNode(getProject().relativePath(svSource)));
svSourceFilesElement.appendChild(svSourceFileElement);
}

return document;
} catch (ParserConfigurationException e) {
throw new RuntimeException(e);
}
}

private void writeFile(Document document) {
try {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(destination.get().getAsFile());
transformer.transform(source, result);
} catch (TransformerException e) {
throw new RuntimeException(e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package com.verificationgentleman.gradle.hdvl.systemverilog;

import com.verificationgentleman.gradle.hdvl.*;
import com.verificationgentleman.gradle.hdvl.internal.WriteCompileSpecFile;
import com.verificationgentleman.gradle.hdvl.systemverilog.internal.DefaultSystemVerilogSourceSet;
import org.gradle.api.Action;
import org.gradle.api.NamedDomainObjectContainer;
Expand Down Expand Up @@ -48,10 +49,14 @@ public void execute(SourceSet sourceSet) {
}

if (sourceSet.getName() == "main") {
project.getTasks().withType(WriteCompileSpecFile.class, task -> {
task.getSvSource().from(svSourceSet.getSv());
});
project.getTasks().getByName("hdvlSourcesArchive", task -> {
Zip hdvlSourcesArchive = (Zip) task;
hdvlSourcesArchive.from(svSourceSet.getSv());
hdvlSourcesArchive.into("src/main/sv"); // FIXME Assumes source in conventional location
hdvlSourcesArchive.from(svSourceSet.getSv(), it -> {
it.into("src/main/sv"); // FIXME Assumes source in conventional location
});
});
}
}
Expand Down

0 comments on commit 6598b4c

Please sign in to comment.