From c18d0bf3607c6c2adb47480ee4fba5d68c832155 Mon Sep 17 00:00:00 2001 From: Norman Walsh Date: Sun, 9 May 2021 16:04:08 +0100 Subject: [PATCH] Refactor build to use (my hacked) SaxonXsltTask --- build.gradle | 640 ++++++++++--------- buildSrc/build.gradle | 1 + libs/com.nwalsh.saxon-gradle-0.9.1-beta3.jar | Bin 0 -> 70508 bytes properties.gradle | 28 +- settings.gradle | 13 + 5 files changed, 371 insertions(+), 311 deletions(-) create mode 100644 libs/com.nwalsh.saxon-gradle-0.9.1-beta3.jar create mode 100644 settings.gradle diff --git a/build.gradle b/build.gradle index 8b19ac3b5..2c31866b1 100644 --- a/build.gradle +++ b/build.gradle @@ -28,20 +28,22 @@ plugins { id "groovy" id "maven-publish" id "signing" - id 'com.github.eerohele.saxon-gradle' version '0.9.0-beta3' + //id 'com.github.eerohele.saxon-gradle' version '0.9.0-beta3' + //id 'com.nwalsh.saxon-gradle' version '0.9.1-beta2' + id 'com.nwalsh.saxon-gradle' id "de.undercouch.download" version "4.0.4" } sourceSets { main { java { - srcDirs = ['src', 'buildSrc/src', 'buildSrc/build/generated/sources/buildconfig'] + srcDirs = ['src/main/java'] } } } -import com.github.eerohele.SaxonXsltTask -//import com.nwalsh.SaxonXsltTask +//import com.github.eerohele.SaxonXsltTask +import com.nwalsh.SaxonXsltTask import de.undercouch.gradle.tasks.download.Download @@ -70,21 +72,38 @@ configurations { dependencies { implementation ( - //gradleApi(), - //[group: "org.codehaus.groovy", name: "groovy", version: "3.0.8"], [group: saxonGroup, name: saxonEdition, version: saxonVersion], - [group: 'com.drewnoakes', name: 'metadata-extractor', - version: metadataExtractorVersion], + [group: 'com.drewnoakes', name: 'metadata-extractor', version: metadataExtractorVersion], [group: 'org.relaxng', name: 'jing', version: jingVersion ], [group: 'org.xmlresolver', name: 'xmlresolver', version: xmlresolverVersion], [group: 'com.nwalsh', name: 'sinclude', version: sincludeVersion ], - [group: 'junit', name: 'junit', version: '4.13'], - [group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion ] + [group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion ], + files("${projectDir}/buildSrc/build/classes/java/main") + ) + testImplementation ( + [group: 'junit', name: 'junit', version: '4.13'] ) } defaultTasks 'report' +saxon.configure { + classpath configurations.validateRuntime + entityResolverClass "org.xmlresolver.Resolver" + uriResolverClass "org.xmlresolver.Resolver" + sourceSaxParser "org.xmlresolver.tools.ResolvingXMLReader" + stylesheetSaxParser "org.xmlresolver.tools.ResolvingXMLReader" +} + +saxon.configure("docbook") { + classpath configurations.validateRuntime + entityResolverClass "org.xmlresolver.Resolver" + uriResolverClass "org.xmlresolver.Resolver" + sourceSaxParser "org.xmlresolver.tools.ResolvingXMLReader" + stylesheetSaxParser "org.xmlresolver.tools.ResolvingXMLReader" + initializer 'org.docbook.xsltng.extensions.Register' +} + // If this is running on the CI infrastructure and it's not // a tagged build, add -SNAPSHOT to the version. if (System.getenv()["CIRCLECI"] == "true" @@ -134,16 +153,32 @@ class CheckTextFile extends DefaultTask { } def gitRef() { - def ref = "" - def proc = "git rev-parse --short --verify HEAD".execute() - proc.in.eachLine { line -> - ref = line + def command = ['git', 'rev-parse', '--short', '--verify', 'HEAD'] + ProcessBuilder pb = new ProcessBuilder().command(command) + pb.directory(projectDir) + Process proc = pb.start() + + def reader = new BufferedReader(new InputStreamReader(proc.getInputStream())); + String ref = null + String line = null + while ((line = reader.readLine()) != null) { + if (ref == null) { + ref = line + } } - proc.err.eachLine { line -> + + reader = new BufferedReader(new InputStreamReader(proc.getErrorStream())); + while ((line = reader.readLine()) != null) { println(line) } + proc.waitFor() - ref + + if (ref == null) { + throw new GradleException("Failed to get git hash.") + } + + return ref } import static groovy.io.FileType.DIRECTORIES @@ -208,14 +243,14 @@ task setupXSpec(type: Download) { } doLast { copy { - from "src/test/resources/xspec" + from "${projectDir}/src/test/resources/xspec" into "${buildDir}/xspec-${xspecVersion}/bin" include "xspec.sh" } } doLast { copy { - from "src/test/resources/xspec" + from "${projectDir}/src/test/resources/xspec" into "${buildDir}/xspec-${xspecVersion}/src/compiler" include "generate-tests-utils.xsl" } @@ -264,7 +299,7 @@ task setup_publishers(dependsOn: "setupPublishers") { } task setupXsltExplorer(type: Download) { - outputs.file "build/xsltexplorer-${xsltExplorerVersion}/xslt/explorer.xsl" + outputs.file "${buildDir}/xsltexplorer-${xsltExplorerVersion}/xslt/explorer.xsl" src "https://github.com/ndw/xsltexplorer/releases/download/${xsltExplorerVersion}/xsltexplorer-${xsltExplorerVersion}.zip" dest file("${buildDir}/xsltexplorer-${xsltExplorerVersion}.zip") @@ -284,7 +319,7 @@ task setupXsltExplorer(type: Download) { task copyResources(type: Copy, dependsOn: ['copyTestMedia', 'makePrintCSS', 'zipStageResources', 'zipStageMisc']) { - from "build/stage/zip/resources" + from "${buildDir}/stage/zip/resources" into "${buildDir}/actual" } @@ -304,7 +339,7 @@ task copyBin(type: Copy) { packages = packages + "\"${pkg}\"" } - from "src/bin" + from "${projectDir}/src/bin" into "${buildDir}/bin" rename("docbook.py", "docbook") filter { String line -> @@ -324,7 +359,7 @@ task copyDocker(type: Copy) { commands += " -Dartifact=${pkg}\n" } - from "src/docker" + from "${projectDir}/src/docker" into "${buildDir}/docker" filter { String line -> if (line.indexOf("@@") >= 0) { @@ -337,15 +372,15 @@ task copyDocker(type: Copy) { } task makePrintCSS(type: Exec, dependsOn: ['copyTestMedia']) { - inputs.file("src/main/web/css/docbook.css") - inputs.file("src/main/web/css/docbook-paged.css") - inputs.file("tools/flattencss.py") - outputs.file("build/actual/css/print.css") - commandLine "python3", "tools/flattencss.py", + inputs.file("${projectDir}/src/main/web/css/docbook.css") + inputs.file("${projectDir}/src/main/web/css/docbook-paged.css") + inputs.file("${projectDir}/tools/flattencss.py") + outputs.file("${buildDir}/actual/css/print.css") + commandLine "python3", "${projectDir}/tools/flattencss.py", "--version", xslTNGversion, "--title", xslTNGtitle, - "--source", "src/main/web/css/docbook.css", - "--source", "src/main/web/css/docbook-paged.css", - "--output", "build/actual/css/print.css" + "--source", "${projectDir}/src/main/web/css/docbook.css", + "--source", "${projectDir}/src/main/web/css/docbook-paged.css", + "--output", "${buildDir}/actual/css/print.css" doFirst { mkdir "${buildDir}/actual/css" } @@ -356,7 +391,7 @@ task copyReportResources(type: Copy, 'copyExpectedResources', 'copyReportImages', 'copyExpectedGeneratedResources']) { - from "src/test/resources" + from "${projectDir}/src/test/resources" include "css/**" include "js/**" into "${buildDir}/report" @@ -371,7 +406,7 @@ task copyReportResources(type: Copy, } task copyReportImages(type: Copy) { - from "src/website/resources" + from "${projectDir}/src/website/resources" include "img/**" include "media/**" exclude "olinkdb/**" @@ -379,7 +414,7 @@ task copyReportImages(type: Copy) { } task copyReportSources(type: Copy) { - from "src/test/resources" + from "${projectDir}/src/test/resources" include "xml/**" include "expected/**" filter { String line -> @@ -395,23 +430,23 @@ task copyReportSources(type: Copy) { task copyExpectedResources(type: Copy, dependsOn: ['copyExpectedMedia', 'zipStageResources', 'zipStageMisc']) { - from "build/stage/zip/resources" + from "${buildDir}/stage/zip/resources" into "${buildDir}/report/expected" } task copyExpectedGeneratedResources(type: Copy, dependsOn: ['generateXSpecSources']) { - from "build/generated-xml" + from "${buildDir}/generated-xml" into "${buildDir}/report/xml" } task copyTestMedia(type: Copy) { - from "src/test/resources" + from "${projectDir}/src/test/resources" into "${buildDir}/actual" include "media/**" } task copyExpectedMedia(type: Copy) { - from "src/test/resources" + from "${projectDir}/src/test/resources" into "${buildDir}/report/expected" include "media/**" } @@ -443,7 +478,7 @@ task generateLocales(dependsOn: ['generateXslTNGLocales']) { // Generate tasks to run each set of XSpec tests def elementTests = [:] def copiedXSpecTasks = [] -fileTree(dir: "src/test/xspec").each { xspec -> +fileTree(dir: "${projectDir}/src/test/xspec").each { xspec -> // Work out the base filename of the test def base = xspec.toString() def pos = base.indexOf("/test/xspec/") @@ -459,11 +494,10 @@ fileTree(dir: "src/test/xspec").each { xspec -> } else { def copytaskname = "copy_" + base.replace("-", "_") + ".xspec" Task t = task "${copytaskname}"(type: SaxonXsltTask, dependsOn: ['makeXslt']) { - inputs.file(xspec) - inputs.file("tools/copy-xspec.xsl") - outputs.file("${buildDir}/xspec/${base}.xspec") + inputs.file("${projectDir}/tools/copy-xspec.xsl") + pluginConfiguration "docbook" input xspec - stylesheet "tools/copy-xspec.xsl" + stylesheet "${projectDir}/tools/copy-xspec.xsl" output "${buildDir}/xspec/${base}.xspec" } copiedXSpecTasks << t @@ -471,9 +505,9 @@ fileTree(dir: "src/test/xspec").each { xspec -> taskname = base.replace("-", "_") + ".xspec" t = task "${taskname}"(type: Exec, dependsOn: ['setupXSpec', 'makeXslt', copytaskname]) { - inputs.files fileTree(dir: "src/main/xslt") - inputs.files fileTree(dir: "src/test/xspec") - inputs.files fileTree(dir: "src/test/resources") + inputs.files fileTree(dir: "${projectDir}/src/main/xslt") + inputs.files fileTree(dir: "${projectDir}/src/test/xspec") + inputs.files fileTree(dir: "${projectDir}/src/test/resources") inputs.files "${buildDir}/xspec/${base}.xspec" outputs.file file("${buildDir}/${base}-compiled.xsl") outputs.file file("${buildDir}/${base}-result.html") @@ -534,19 +568,19 @@ elementTests.keySet().each { tag -> def xspecTask = task "${tag}Test"(type: Exec, dependsOn: ['setupXSpec', 'copyResources']) { - inputs.files fileTree(dir: "src/main/xslt") - inputs.files fileTree(dir: "src/test/xspec") - inputs.files fileTree(dir: "src/test/resources") + inputs.files fileTree(dir: "${projectDir}/src/main/xslt") + inputs.files fileTree(dir: "${projectDir}/src/test/xspec") + inputs.files fileTree(dir: "${projectDir}/src/test/resources") outputs.files(fileTree(buildDir) { include tag + "Test-result.xml" }) commandLine "${buildDir}/xspec-${xspecVersion}/bin/xspec.sh", - "build/elemtest/${tag}.xspec" + "${buildDir}/elemtest/${tag}.xspec" } } // Generate tasks to construct the generated tests -fileTree(dir: "src/test/generators").each { xsl -> +fileTree(dir: "${projectDir}/src/test/generators").each { xsl -> def xspec = xsl.toString() .replace("/generators/", "/xspec/generated-") .replace(".xsl", ".xspec") @@ -573,18 +607,16 @@ fileTree(dir: "src/test/generators").each { xsl -> def taskname = name + "XSpec" Task g = task "${generator}"(type: SaxonXsltTask, dependsOn: ['makeXslt']) { - inputs.files xsl.toString() - outputs.file(xspec) - input xsl.toString() + input xsl stylesheet xsl.toString() output "${buildDir}/xspec/${base}.xspec" } Task t = task "${taskname}"(type: Exec, dependsOn: ['setupXSpec', 'makeXslt']) { - inputs.files fileTree(dir: "src/main/xslt") - inputs.files fileTree(dir: "src/test/xspec") - inputs.files fileTree(dir: "src/test/resources") + inputs.files fileTree(dir: "${projectDir}/src/main/xslt") + inputs.files fileTree(dir: "${projectDir}/src/test/xspec") + inputs.files fileTree(dir: "${projectDir}/src/test/resources") outputs.files(fileTree(buildDir) { include base + "-result.xml" }) @@ -599,7 +631,7 @@ fileTree(dir: "src/test/generators").each { xsl -> } // Generate tasks to format each resource/xml document -fileTree(dir: "src/test/resources/xml", include: "*.xml").each { xml -> +fileTree(dir: "${projectDir}/src/test/resources/xml", include: "*.xml").each { xml -> // Work out the base filename of the test def base = xml.toString() def pos = base.indexOf("/resources/xml/") @@ -672,7 +704,7 @@ fileTree(dir: "src/test/resources/xml", include: "*.xml").each { xml -> t = task "validate_${base}"(type: JavaExec) { classpath = configurations.validateRuntime main = "com.thaiopensource.relaxng.util.Driver" - args "-i", "build/${schemaPath}-${schemaVersion}/rng/${schema}.rng", xml.toString() + args "-i", "${buildDir}/${schemaPath}-${schemaVersion}/rng/${schema}.rng", xml.toString() } t.dependsOn tasks.findByName("setup_${schemaPath}") validateAll.dependsOn t @@ -680,10 +712,11 @@ fileTree(dir: "src/test/resources/xml", include: "*.xml").each { xml -> } t = task "${base}.html"(type: SaxonXsltTask, dependsOn: htmlDependsOn) { - inputs.files fileTree(dir: "src/main/xslt") - inputs.files fileTree(dir: "src/test/resources") + inputs.files fileTree(dir: "${projectDir}/src/main/xslt") + inputs.files fileTree(dir: "${projectDir}/src/test/resources") inputs.file file("${buildDir}/xslt/docbook.xsl") - outputs.file("${buildDir}/actual/${base}.html") + + pluginConfiguration "docbook" stylesheetParams['mediaobject-input-base-uri'] = "file:${projectDir}/src/test/resources/media/" stylesheetParams['mediaobject-output-base-uri'] = "media/" @@ -703,11 +736,11 @@ fileTree(dir: "src/test/resources/xml", include: "*.xml").each { xml -> } t = task "${base}.expected"(type: SaxonXsltTask, dependsOn: htmlDependsOn) { - inputs.files fileTree(dir: "src/main/xslt") - inputs.files fileTree(dir: "src/test/resources") + inputs.files fileTree(dir: "${projectDir}/src/main/xslt") + inputs.files fileTree(dir: "${projectDir}/src/test/resources") inputs.file file("${buildDir}/xslt/xspec-driver.xsl") - outputs.file("src/test/resources/expected/${base}.html") + pluginConfiguration "docbook" stylesheetParams['mediaobject-input-base-uri'] = "file:${projectDir}/src/test/resources/media/" stylesheetParams['mediaobject-output-base-uri'] = "media/" @@ -729,10 +762,11 @@ fileTree(dir: "src/test/resources/xml", include: "*.xml").each { xml -> } t = task "${base}.olinkdb"(type: SaxonXsltTask, dependsOn: htmlDependsOn) { - inputs.files fileTree(dir: "src/main/xslt") - inputs.files fileTree(dir: "src/test/resources") + inputs.files fileTree(dir: "${projectDir}/src/main/xslt") + inputs.files fileTree(dir: "${projectDir}/src/test/resources") inputs.file file("${buildDir}/xslt/olinkdb.xsl") - outputs.file("${buildDir}/actual/${base}.olinkdb") + + pluginConfiguration "docbook" stylesheetParams['mediaobject-input-base-uri'] = "file:${projectDir}/src/test/resources/media/" stylesheetParams['mediaobject-output-base-uri'] = "media/" @@ -763,10 +797,11 @@ fileTree(dir: "src/test/resources/xml", include: "*.xml").each { xml -> t = task "${base}.chunk"(type: SaxonXsltTask, dependsOn: ['makeXslt', "validate_${base}"]) { - inputs.files fileTree(dir: "src/main/xslt") - inputs.files fileTree(dir: "src/test/resources") + inputs.files fileTree(dir: "${projectDir}/src/main/xslt") + inputs.files fileTree(dir: "${projectDir}/src/test/resources") inputs.file file("${buildDir}/xslt/docbook.xsl") - outputs.file("${buildDir}/actual/index.html") + + pluginConfiguration "docbook" stylesheetParams['mediaobject-input-base-uri'] = "file:${projectDir}/src/test/resources/media/" stylesheetParams['mediaobject-output-base-uri'] = "media/" @@ -791,10 +826,11 @@ fileTree(dir: "src/test/resources/xml", include: "*.xml").each { xml -> t = task "${base}.pdf.html"(type: SaxonXsltTask, dependsOn: ['makeXslt', "validate_${base}"]) { - inputs.files fileTree(dir: "src/main/xslt") - inputs.files fileTree(dir: "src/test/resources") + inputs.files fileTree(dir: "${projectDir}/src/main/xslt") + inputs.files fileTree(dir: "${projectDir}/src/test/resources") inputs.file "${buildDir}/xslt/print.xsl" - outputs.file("${buildDir}/actual/${base}.pdf.html") + + pluginConfiguration "docbook" stylesheetParams['mediaobject-input-base-uri'] = "file:${projectDir}/src/test/resources/media/" stylesheetParams['mediaobject-output-base-uri'] = "media/" @@ -823,10 +859,10 @@ fileTree(dir: "src/test/resources/xml", include: "*.xml").each { xml -> dependsOn: ["${base}.pdf.html"]) { inputs.files fileTree(dir: "${buildDir}/actual/css") inputs.file("${buildDir}/actual/${base}.pdf.html") - outputs.file("src/test/resources/expectedpdf/${pdftool}/${base}.pdf") + outputs.file("${projectDir}/src/test/resources/expectedpdf/${pdftool}/${base}.pdf") commandLine "${prince}", "${buildDir}/actual/${base}.pdf.html", - "-o", "src/test/resources/expectedpdf/${pdftool}/${base}.pdf" + "-o", "${projectDir}/src/test/resources/expectedpdf/${pdftool}/${base}.pdf" } } else { t = task "${base}.pdf"(type: Exec, @@ -842,10 +878,10 @@ fileTree(dir: "src/test/resources/xml", include: "*.xml").each { xml -> dependsOn: ["${base}.pdf.html"]) { inputs.files fileTree(dir: "${buildDir}/actual/css") inputs.file("${buildDir}/actual/${base}.pdf.html") - outputs.file("src/test/resources/expectedpdf/${pdftool}/${base}.pdf") + outputs.file("${projectDir}/src/test/resources/expectedpdf/${pdftool}/${base}.pdf") commandLine "${antennahouse}", "-d", "${buildDir}/actual/${base}.pdf.html", - "-o", "src/test/resources/expectedpdf/${pdftool}/${base}.pdf" + "-o", "${projectDir}/src/test/resources/expectedpdf/${pdftool}/${base}.pdf" } } } @@ -854,7 +890,7 @@ fileTree(dir: "src/test/resources/xml", include: "*.xml").each { xml -> tasks.findByName("docbook.xspec").dependsOn "fit.001.olinkdb" tasks.findByName("docbook.xspec").dependsOn "guide.olinkdb" -fileTree(dir: "src/test/resources/xml", include: "*.xml").each { xml -> +fileTree(dir: "${projectDir}/src/test/resources/xml", include: "*.xml").each { xml -> // Work out the base filename of the test def base = xml.toString() def pos = base.indexOf("/resources/xml/") @@ -922,12 +958,11 @@ testDrivers.each { driver -> def basename = "${source}_${S}${N}${H}" Task g = task "generate_${basename}.xml"(type: SaxonXsltTask) { - inputs.file("src/test/resources/xml/${source}.xml") - inputs.file("tools/generate-co.xsl") - outputs.file("${buildDir}/generated-xml/${basename}.xml") + inputs.file("${projectDir}/src/test/resources/xml/${source}.xml") + inputs.file("${projectDir}/tools/generate-co.xsl") - input "src/test/resources/xml/${source}.xml" - stylesheet "tools/generate-co.xsl" + input "${projectDir}/src/test/resources/xml/${source}.xml" + stylesheet "${projectDir}/tools/generate-co.xsl" output "${buildDir}/generated-xml/${basename}.xml" parameters ( @@ -942,9 +977,9 @@ testDrivers.each { driver -> generateXSpecSources.dependsOn g Task t = task "${basename}.html"(type: SaxonXsltTask, dependsOn: ['makeXslt']) { - inputs.file("${buildDir}/generated-xml/${basename}.xml") inputs.file "${buildDir}/xslt/docbook.xsl" - outputs.file("${buildDir}/actual/${basename}.html") + + pluginConfiguration "docbook" input "${buildDir}/generated-xml/${basename}.xml" stylesheet "${buildDir}/xslt/docbook.xsl" @@ -958,9 +993,9 @@ testDrivers.each { driver -> tasks.findByName("${source}.html").dependsOn t t = task "${basename}.expected"(type: SaxonXsltTask, dependsOn: ['makeXslt']) { - inputs.file("${buildDir}/generated-xml/${basename}.xml") inputs.file "${buildDir}/xslt/xspec-driver.xsl" - outputs.file("src/test/resources/expected/${basename}.html") + + pluginConfiguration "docbook" input "${buildDir}/generated-xml/${basename}.xml" stylesheet "${buildDir}/xslt/xspec-driver.xsl" @@ -981,7 +1016,7 @@ testDrivers.each { driver -> // ============================================================ // Generate tasks to generate the locale files -fileTree(dir: "src/main/locales/locale-10", include: "*.xml").each { xml -> +fileTree(dir: "${projectDir}/src/main/locales/locale-10", include: "*.xml").each { xml -> // Work out the base filename of the test def base = xml.toString() def pos = base.indexOf("/locales/locale-10/") @@ -992,24 +1027,19 @@ fileTree(dir: "src/main/locales/locale-10", include: "*.xml").each { xml -> // The following is only needed while we're generating // from the 1.0 files. def localetng = xml.toString().replace("/locale-10/", "/locale/") - // I'd like these to be SaxonXsltTask tasks, but they run in - // parallel and get a "Metaspace" exception, whatever that is. Task t = task "locale10_${base}"(type: SaxonXsltTask) { - inputs.files xml.toString() - inputs.files "tools/xform-10-tng.xsl" - outputs.file(localetng) - input xml.toString() - stylesheet "tools/xform-10-tng.xsl" + inputs.file "${projectDir}/tools/xform-10-tng.xsl" + + input xml + stylesheet "${projectDir}/tools/xform-10-tng.xsl" output localetng } generateXslTNGLocales.dependsOn t Task u = task "locale_${base}"(type: SaxonXsltTask) { - inputs.files localetng - inputs.files "tools/xform-locale.xsl" - outputs.file("${buildDir}/xslt/locale/${base}") + inputs.files "${projectDir}/tools/xform-locale.xsl" input localetng - stylesheet "tools/xform-locale.xsl" + stylesheet "${projectDir}/tools/xform-locale.xsl" output "${buildDir}/xslt/locale/${base}" } u.dependsOn t @@ -1017,11 +1047,8 @@ fileTree(dir: "src/main/locales/locale-10", include: "*.xml").each { xml -> } task makeVersion(type: SaxonXsltTask) { - inputs.file("tools/version.xsl") - outputs.file("build/xslt/VERSION.xsl") - - input 'tools/version.xsl' - stylesheet 'tools/version.xsl' + input "${projectDir}/tools/version.xsl" + stylesheet "${projectDir}/tools/version.xsl" output "${buildDir}/xslt/VERSION.xsl" parameters( 'version': xslTNGversion, @@ -1030,35 +1057,60 @@ task makeVersion(type: SaxonXsltTask) { } task makeParameterMaps(type: SaxonXsltTask) { - inputs.file("tools/parameter-maps.xsl") - inputs.file("src/main/xslt/param.xsl") - outputs.file("build/xslt/parameter-maps.xsl") - - input 'src/main/xslt/param.xsl' - stylesheet 'tools/parameter-maps.xsl' + input "${projectDir}/src/main/xslt/param.xsl" + stylesheet "${projectDir}/tools/parameter-maps.xsl" output "${buildDir}/xslt/parameter-maps.xsl" } task makeXslt(type: Copy, dependsOn: ['copyResources', 'makeVersion', 'makeParameterMaps', 'generateLocales', 'compileJava']) { - from "src/main/xslt" + from "${projectDir}/src/main/xslt" into "${buildDir}/xslt" } +task makeUriList(dependsOn: ["makeXslt","zipStageResources","zipStagePrintCSS","zipStageDocker", + "zipStageXslt", "zipStageBin"]) { + inputs.files fileTree("${buildDir}/xslt") + inputs.files fileTree("${buildDir}/stage/zip") + outputs.file "${buildDir}/resources/main/org/docbook/xsltng/etc/uris.xml" + + doFirst { + mkdir "${buildDir}/resources/main/org/docbook/xsltng/etc" + } + + doLast { + def prefix = '/org/docbook/xsltng' + new File("${buildDir}/resources/main/org/docbook/xsltng/etc/uris.xml").withWriter("utf-8") { writer -> + writer.writeLine("") + + def pos = "${buildDir}".length() + fileTree("${buildDir}/xslt").each { file -> + writer.writeLine(" ") + } + + pos = "${buildDir}/stage/zip".length() + fileTree("${buildDir}/stage/zip/resources").each { file -> + writer.writeLine(" ") + } + writer.writeLine("") + } + } +} + // ============================================================ task testJarMain(type: Exec, dependsOn: jar) { commandLine "java", - "-jar", "build/libs/docbook-xslTNG-${xslTNGversion}.jar", - "src/test/resources/xml/article.001.xml", + "-jar", "${buildDir}/libs/docbook-xslTNG-${xslTNGversion}.jar", + "${projectDir}/src/test/resources/xml/article.001.xml", "-o:/dev/null" } test.dependsOn testJarMain task testDocBookPy(type: Exec, dependsOn: ["jar", "copyBin", "copyDocker"]) { - commandLine "build/bin/docbook", - "src/test/resources/xml/article.001.xml", + commandLine "${buildDir}/bin/docbook", + "${projectDir}/src/test/resources/xml/article.001.xml", "-xsl:build/xslt/docbook.xsl", "-o:/dev/null" } @@ -1069,12 +1121,8 @@ task testConsoleSummary(type: SummarizeTestResults, dependsOn: testDrivers) { } task testSummary(type: SaxonXsltTask, dependsOn: testDrivers) { - inputs.file file("${buildDir}/docbook-result.xml") - inputs.file file("tools/test-results.xsl") - outputs.file file("${buildDir}/test-results.txt") - input file("${buildDir}/docbook-result.xml") - stylesheet file('tools/test-results.xsl') + stylesheet file("${projectDir}/tools/test-results.xsl") output "${buildDir}/test-results.txt" parameters ( "test-drivers": testDrivers.join(" ") @@ -1094,12 +1142,8 @@ task reportResults(type: Copy, dependsOn: ['testSummary']) { task coverageReport(type: SaxonXsltTask, dependsOn: ['testSummary', 'copyReportResources']) { - inputs.file("${buildDir}/docbook-result.xml") - inputs.file("tools/coverage-report.xsl") - outputs.file("${buildDir}/report/coverage-report.html") - input "${buildDir}/docbook-result.xml" - stylesheet 'tools/coverage-report.xsl' + stylesheet "${projectDir}/tools/coverage-report.xsl" output "${buildDir}/report/coverage-report.html" parameters ( "test-drivers": testDrivers.join(" ") @@ -1114,7 +1158,7 @@ task report(type: Exec, 'reportExpectedHTML', 'coverageReport', 'reportResults']) { inputs.file("${buildDir}/docbook-result.xml") - inputs.file("tools/report.xsl") + inputs.file("${projectDir}/tools/report.xsl") outputs.file("${buildDir}/report/index.html") commandLine "java", "-Dorg.docbook.xsltng.extensions.verbose=${verbose}", @@ -1145,16 +1189,16 @@ clean.dependsOn cleanXSpec // ============================================================ task zipStagePygments(type: Exec) { - commandLine "python3", "tools/generate-pygments.py", + commandLine "python3", "${projectDir}/tools/generate-pygments.py", "--version", xslTNGversion, "--title", xslTNGtitle, - "--output", "build/stage/zip/resources/css/pygments.css" + "--output", "${buildDir}/stage/zip/resources/css/pygments.css" doFirst { mkdir "${buildDir}/stage/zip/resources/css" } } task zipStageResources(type: Copy, dependsOn: ["zipStagePygments"]) { - from "src/main/web" + from "${projectDir}/src/main/web" include "css/**" include "js/**" into "${buildDir}/stage/zip/resources" @@ -1169,7 +1213,7 @@ task zipStageResources(type: Copy, dependsOn: ["zipStagePygments"]) { } task zipStagePrintCSS(type: Copy, dependsOn: ['makePrintCSS']) { - from "build/actual" + from "${buildDir}/actual" include "css/print.css" into "${buildDir}/stage/zip/resources" filter { String line -> @@ -1182,15 +1226,20 @@ task zipStagePrintCSS(type: Copy, dependsOn: ['makePrintCSS']) { } } -task zipStageSampleResources(type: Copy, - dependsOn: ["zipStageResources", "zipStagePrintCSS"]) { - from "${buildDir}/stage/zip/resources" - into "${buildDir}/stage/zip/samples" -} +task zipStageSamples(dependsOn: ["zipStageResources", "zipStagePrintCSS"]) { + doLast { + copy { + from "${buildDir}/stage/zip/resources" + into "${buildDir}/stage/zip/samples" + } + } -task zipStageSamples(type: Copy, dependsOn: ["zipStageSampleResources"]) { - from "src/main/samples" - into "${buildDir}/stage/zip/samples" + doLast { + copy { + from "${projectDir}/src/main/samples" + into "${buildDir}/stage/zip/samples" + } + } } task zipStageXslt(type: Copy, dependsOn: ['makeXslt']) { @@ -1205,14 +1254,20 @@ task zipStageMisc(type: Copy, dependsOn: ["zipStageSamples"]) { include "LICENSE" } -task zipStageJar(type: Copy, dependsOn: ['jar']) { - from "${buildDir}/libs/docbook-xslTNG-${xslTNGversion}.jar" - into "${buildDir}/stage/zip/libs" -} - -task zipStageLib(type: Copy, dependsOn: ['zipStageJar', 'copyLib']) { - from "${buildDir}/libs/lib" - into "${buildDir}/stage/zip/libs/lib" +task zipStageLib(dependsOn: ['jar', 'copyLib']) { + doLast { + copy { + from "${buildDir}/libs" + into "${buildDir}/stage/zip/libs" + include "docbook-xslTNG-${xslTNGversion}.jar" + } + } + doLast { + copy { + from "${buildDir}/libs/lib" + into "${buildDir}/stage/zip/libs/lib" + } + } } task zipStageBin(type: Copy, dependsOn: ['copyBin']) { @@ -1225,13 +1280,10 @@ task zipStageDocker(type: Copy, dependsOn: ['copyDocker']) { into "${buildDir}/stage/zip/docker" } -task zipStageCatalog(type: SaxonXsltTask, dependsOn: ['makeUris', 'zipStageXslt', "stageJarEtc"]) { - inputs.file("build/stage/jar/etc/uris.xml") - inputs.file("tools/make-catalog.xsl") - outputs.file("${buildDir}/stage/zip/xslt/catalog.xml") - - input 'build/stage/jar/etc/uris.xml' - stylesheet 'tools/make-catalog.xsl' +task zipStageCatalog(type: SaxonXsltTask, dependsOn: ['makeUriList', 'zipStageXslt', "stageJar", + "processResources"]) { + input makeUriList.outputs.files.getSingleFile() + stylesheet "${projectDir}/src/main/resources/org/docbook/xsltng/etc/make-catalog.xsl" output "${buildDir}/stage/zip/xslt/catalog.xml" parameters( 'version': xslTNGversion @@ -1261,14 +1313,12 @@ task dist(dependsOn: ['requirePassingTests', 'zipDist', 'website']) { task explorer(type: SaxonXsltTask, dependsOn: ['makeXslt', 'setupXsltExplorer', 'explorerResources']) { - inputs.files fileTree(dir: "build/xslt") - inputs.file "build/xsltexplorer-${xsltExplorerVersion}/xslt/explorer.xsl" - outputs.file("build/explorer/index.html") - outputs.file("build/docbook-xslTNG.xml") - - input 'build/xslt/docbook.xsl' - stylesheet "build/xsltexplorer-${xsltExplorerVersion}/xslt/explorer.xsl" - output 'build/explorer/index.html' + inputs.files fileTree(dir: "${buildDir}/xslt") + outputs.file("${buildDir}/docbook-xslTNG.xml") + + input "${buildDir}/xslt/docbook.xsl" + stylesheet "${buildDir}/xsltexplorer-${xsltExplorerVersion}/xslt/explorer.xsl" + output "${buildDir}/explorer/index.html" lineNumbers true parameters( 'debug-analyze': "${buildDir}/docbook-xslTNG.xml" @@ -1276,8 +1326,8 @@ task explorer(type: SaxonXsltTask, } task explorerResources(type: Copy, dependsOn: ['setupXsltExplorer']) { - into "build/explorer" - from "build/xsltexplorer-${xsltExplorerVersion}" + into "${buildDir}/explorer" + from "${buildDir}/xsltexplorer-${xsltExplorerVersion}" include "css/**" include "js/**" } @@ -1287,93 +1337,86 @@ task guideResources(dependsOn: ['guideDocBookResources','guideCustomResources']) } task guideDocBookResources(type: Copy, dependsOn: ['copyResources', 'explorer']) { - from "build/actual" + from "${buildDir}/actual" include "css/**" include "js/**" exclude "css/print.css" - into "build/guide/" + into "${buildDir}/guide/" } task guideCustomResources(type: Copy) { - from "src/guide/resources" + from "${projectDir}/src/guide/resources" include "css/**" include "js/**" include "media/**" - into "build/guide/" + into "${buildDir}/guide/" } task guidePrintCSS(type: Exec, dependsOn: ['guideDocBookResources']) { - inputs.file("src/main/web/css/docbook.css") - inputs.file("src/main/web/css/docbook-paged.css") - inputs.file("src/guide/resources/css/guide.css") - inputs.file("src/guide/resources/css/guide-paged.css") - inputs.file("tools/flattencss.py") - outputs.file("build/guide/css/print.css") - commandLine "python3", "tools/flattencss.py", + inputs.file("${projectDir}/src/main/web/css/docbook.css") + inputs.file("${projectDir}/src/main/web/css/docbook-paged.css") + inputs.file("${projectDir}/src/guide/resources/css/guide.css") + inputs.file("${projectDir}/src/guide/resources/css/guide-paged.css") + inputs.file("${projectDir}/tools/flattencss.py") + outputs.file("${buildDir}/guide/css/print.css") + commandLine "python3", "${projectDir}/tools/flattencss.py", "--version", xslTNGversion, "--title", xslTNGtitle, - "--source", "src/main/web/css/docbook.css", - "--source", "src/main/web/css/docbook-paged.css", - "--source", "src/guide/resources/css/guide.css", - "--source", "src/guide/resources/css/guide-paged.css", - "--output", "build/guide/css/print.css" + "--source", "${projectDir}/src/main/web/css/docbook.css", + "--source", "${projectDir}/src/main/web/css/docbook-paged.css", + "--source", "${projectDir}/src/guide/resources/css/guide.css", + "--source", "${projectDir}/src/guide/resources/css/guide-paged.css", + "--output", "${buildDir}/guide/css/print.css" doFirst { mkdir "${buildDir}/guide/css" } } task xincludeGuide(type: SaxonXsltTask, dependsOn: ['guideResources']) { - inputs.files fileTree(dir: "src/guide/xml") - inputs.file("tools/xinclude.xsl") - outputs.file("build/guide.xml") + inputs.files fileTree(dir: "${projectDir}/src/guide/xml") + inputs.file "${projectDir}/tools/xinclude.xsl" - initializer "org.docbook.xsltng.extensions.Register" - input 'src/guide/xml/guide.xml' - stylesheet 'tools/xinclude.xsl' - output 'build/guide.xml' + pluginConfiguration "docbook" + + input "${projectDir}/src/guide/xml/guide.xml" + stylesheet "${projectDir}/tools/xinclude.xsl" + output "${buildDir}/guide.xml" } task copyGuide(type: SaxonXsltTask, dependsOn: ['xincludeGuide']) { - inputs.file("build/guide.xml") - inputs.file("tools/guide-pis.xsl") - outputs.file("build/guide/guide.xml") - - input 'build/guide.xml' - stylesheet 'tools/guide-pis.xsl' - output 'build/guide/guide.xml' + input "${buildDir}/guide.xml" + stylesheet "${projectDir}/tools/guide-pis.xsl" + output "${buildDir}/guide/guide.xml" } task validateGuide(dependsOn: ['copyGuide', 'setupDocBook']) { - inputs.file "build/guide/guide.xml" - outputs.file "build/guide/validated" + inputs.file "${buildDir}/guide/guide.xml" + outputs.file "${buildDir}/guide/validated" doLast { javaexec { classpath = configurations.validateRuntime main = "com.thaiopensource.relaxng.util.Driver" - args "-i", "build/docbook-${docbookVersion}/rng/docbook.rng", - "build/guide/guide.xml" + args "-i", "${buildDir}/docbook-${docbookVersion}/rng/docbook.rng", + "${buildDir}/guide/guide.xml" } } doLast { - new File("build/guide/validated").withWriter("utf-8") { writer -> + new File("${buildDir}/guide/validated").withWriter("utf-8") { writer -> writer.writeLine("validated") } } } task guide(type: SaxonXsltTask, dependsOn: ['makeXslt', 'validateGuide', 'explorer']) { - inputs.files fileTree(dir: "src/guide/xml") - inputs.files fileTree(dir: "build/xslt") - inputs.files fileTree(dir: "src/guide/xsl") - inputs.file("build/docbook-xslTNG.xml") - inputs.file("build/guide/guide.xml") - outputs.file("build/guide/index.html") - - initializer "org.docbook.xsltng.extensions.Register" - input 'build/guide/guide.xml' - stylesheet 'src/guide/xsl/guide.xsl' - output 'build/guide/out.html' + inputs.files fileTree(dir: "${buildDir}/xslt") + inputs.file("${buildDir}/docbook-xslTNG.xml") + outputs.file("${buildDir}/guide/index.html") + + pluginConfiguration "docbook" + input "${buildDir}/guide/guide.xml" + stylesheet "${projectDir}/src/guide/xsl/guide.xsl" + output "${buildDir}/guide/out.html" parameters( 'explorer.xml': "${buildDir}/docbook-xslTNG.xml", 'bookVersion': guideVersion, @@ -1387,16 +1430,13 @@ task guide(type: SaxonXsltTask, dependsOn: ['makeXslt', 'validateGuide', 'explor } task "guide.pdf.html"(type: SaxonXsltTask, dependsOn: ['makeXslt', 'validateGuide', 'explorer']) { - inputs.files fileTree(dir: "src/guide/xml") - inputs.files fileTree(dir: "build/xslt") - inputs.file("build/docbook-xslTNG.xml") - inputs.file("build/guide/guide.xml") - inputs.files fileTree(dir: "src/guide/xsl") - outputs.file("build/guide/guide.pdf.html") - - input 'build/guide/guide.xml' - stylesheet 'src/guide/xsl/print.xsl' - output 'build/guide/guide.pdf.html' + inputs.files fileTree(dir: "${buildDir}/xslt") + inputs.file "${buildDir}/docbook-xslTNG.xml" + inputs.files fileTree(dir: "${projectDir}/src/guide/xsl") + + input "${buildDir}/guide/guide.xml" + stylesheet "${projectDir}/src/guide/xsl/print.xsl" + output "${buildDir}/guide/guide.pdf.html" parameters( 'explorer.xml': "${buildDir}/docbook-xslTNG.xml", 'bookVersion': guideVersion, @@ -1429,18 +1469,14 @@ if (pdftool == "prince") { } task "guide.olinkdb"(type: SaxonXsltTask, dependsOn: ['guide']) { - inputs.files fileTree(dir: "src/guide/xml") - inputs.files fileTree(dir: "build/xslt") - inputs.files fileTree(dir: "src/guide/xsl") - inputs.file file('build/guide/guide.xml') - inputs.file("build/docbook-xslTNG.xml") - inputs.file("build/guide/guide.xml") - outputs.file("build/guide/index.html") - - initializer "org.docbook.xsltng.extensions.Register" - input 'build/guide/guide.xml' - stylesheet 'build/xslt/olinkdb.xsl' - output 'build/actual/guide.olinkdb' + inputs.files fileTree(dir: "${buildDir}/xslt") + inputs.files fileTree(dir: "${projectDir}/src/guide/xsl") + inputs.file("${buildDir}/docbook-xslTNG.xml") + + pluginConfiguration "docbook" + input "${buildDir}/guide/guide.xml" + stylesheet "${buildDir}/xslt/olinkdb.xsl" + output "${buildDir}/actual/guide.olinkdb" parameters( 'explorer.xml': "${buildDir}/docbook-xslTNG.xml", 'bookVersion': guideVersion, @@ -1462,31 +1498,31 @@ task website(type: Copy, dependsOn: ['webGuide', 'webReport', 'webExplorer', } task webGuide(type: Copy, dependsOn: ['guide', 'guide.olinkdb']) { - from "build/guide" + from "${buildDir}/guide" exclude "guide.xml" - into "build/website/guide" + into "${buildDir}/website/guide" } task webExplorer(type: Copy, dependsOn: ['explorer']) { - from "build/explorer" - into "build/website/explorer" + from "${buildDir}/explorer" + into "${buildDir}/website/explorer" } task webReport(type: Copy, dependsOn: ['report']) { - from "build/report" - into "build/website/report" + from "${buildDir}/report" + into "${buildDir}/website/report" } task webResources(type: Copy, dependsOn: ['report']) { - from "src/website/resources/" - into "build/website" + from "${projectDir}/src/website/resources/" + into "${buildDir}/website" exclude "images/**" exclude "olinkdb/**" } task webHtml(type: Copy, dependsOn: ['report', 'webHomepage']) { - from "src/website/html" - into "build/website" + from "${projectDir}/src/website/html" + into "${buildDir}/website" exclude "homepage.html" } @@ -1495,12 +1531,9 @@ if (buildTag == null) { buildTag = "" } task webHomepage(type: SaxonXsltTask, dependsOn: ['testSummary']) { - inputs.file("src/website/html/homepage.html") - inputs.file("tools/homepage.xsl") - outputs.file("build/website/index.html") - input "src/website/html/homepage.html" - stylesheet "tools/homepage.xsl" - output "build/website/index.html" + input "${projectDir}/src/website/html/homepage.html" + stylesheet "${projectDir}/tools/homepage.xsl" + output "${buildDir}/website/index.html" parameters( "build-tag": buildTag ) @@ -1508,65 +1541,71 @@ task webHomepage(type: SaxonXsltTask, dependsOn: ['testSummary']) { // ============================================================ -task stageJarXslt(type: Copy, dependsOn: ["makeXslt", "makeVersionProperties", - "makeUris"]) { - from "build/xslt" - into "build/stage/jar/xslt" -} - -task stageJarEtc(type: Copy) { - from "tools/make-catalog.xsl" - into "build/stage/jar/etc" -} - -task stageJar(type: Copy, dependsOn: ["stageJarXslt", "stageJarEtc"]) { - // nop -} -processResources.dependsOn stageJar - -task copyLib(type: Copy) { - FileCollection runtimeOnly = configurations.projectRuntimeClasspath - FileCollection implementation = configurations.projectImplementationClasspath - FileCollection localLib = fileTree(dir: 'lib').include("*.jar") - FileCollection lib = implementation + runtimeOnly - localLib +task copyLib() { String path = "" - lib.each { - File file -> path += " lib/" + file.name + configurations.projectImplementationClasspath.each { file -> + path += " lib/" + file.name + if (file.name.endsWith(".jar")) { + doLast { + copy { + from file + into "${buildDir}/libs/lib" + } + } + } } project.ext.runtimeClasspath = path.trim() - - from lib - into { "build/libs/lib" } } jar.dependsOn copyLib task makeVersionProperties() { + outputs.file "${buildDir}/resources/main/org/docbook/xsltng/etc/version.properties" + doFirst { - mkdir("build/stage/jar/etc") + mkdir("${buildDir}/resources/main/org/docbook/xsltng/etc") } doLast { - new File("build/stage/jar/etc/version.properties").withWriter("utf-8") { writer -> + new File("${buildDir}/resources/main/org/docbook/xsltng/etc/version.properties").withWriter("utf-8") { writer -> writer.writeLine("version=${xslTNGversion}") } } } -task makeUris(dependsOn: [ "makeXslt" ]) { - inputs.files fileTree(dir: "build/xslt/") - outputs.file "build/stage/jar/etc/uris.xml" +task jarStageCatalog(type: SaxonXsltTask, dependsOn: ['makeUriList']) { + input makeUriList.outputs.files.getSingleFile() + stylesheet "${projectDir}/src/main/resources/org/docbook/xsltng/etc/make-catalog.xsl" + output "${buildDir}/resources/main/org/docbook/xsltng/catalog.xml" + parameters( + 'version': xslTNGversion, + 'jarloc': 'classpath:org/docbook/xsltng/' + ) +} + +task stageJar( + dependsOn: ["makeXslt", "makeVersionProperties", "makeUriList", "jarStageCatalog"] +) { doLast { - mkdir ("build/stage/jar/etc") - def uris = new PrintStream(new File(buildDir.toString() + "/stage/jar/etc/uris.xml")) - uris.println("") - fileTree(dir: "build/xslt").each { fn -> - def name = fn.getAbsolutePath() - name = name.substring(buildDir.toString().length()) - uris.println(" ") + copy { + into "${buildDir}/resources/main" + from "${projectDir}/buildSrc/build/classes/java/main" + } + copy { + into "${buildDir}/resources/main" + from "${projectDir}/buildSrc/build/classes/java/groovy" + } + // Not ${buildDir}/classes/java/main because the jar task + // picks those up automatically and we don't want duplicates + copy { + into "${buildDir}/resources/main/org/docbook/xsltng/xslt" + from "${buildDir}/xslt" + } + copy { + into "${buildDir}/resources/main/org/docbook/xsltng/resources" + from "${projectDir}/src/main/web" } - uris.println("") - uris.close() } } +processResources.dependsOn stageJar jar { archiveBaseName = "docbook-xslTNG-${xslTNGversion}" @@ -1588,6 +1627,7 @@ jar { attributes "Class-Path": project.ext.runtimeClasspath \ + " lib/XfoJavaCtl.jar lib/xep.jar lib/prince.jar" } + from "${buildDir}/stage/jar" } task javadocJar(type: Jar, dependsOn: javadoc) { @@ -1659,18 +1699,24 @@ publishing { // ============================================================ -/* -task xsltest(type: SaxonXsltTask) { - inputs.files fileTree(dir: "scratch") - - input 'scratch/test.xml' - stylesheet 'scratch/test.xsl' -} -*/ - task helloWorld() { doLast { println('Hello, world: ' + xslTNGversion) - println("Tag: " + System.getenv()["CIRCLE_TAG"]) + project.objects.fileCollection().each { path -> + println("CP: ${path}") + } + +/* + configurations.projectRuntimeClasspath.each { path -> + println("R: ${path}") + } + configurations.projectImplementationClasspath.each { path -> + println("I: ${path}") + } + configurations.compileClasspath.each { cp -> + println("CCP: ${cp}") + } + println("${EXCP}") +*/ } } diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index e10e6e6c5..f12bf1466 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -3,6 +3,7 @@ plugins { } repositories { + mavenLocal() mavenCentral() } diff --git a/libs/com.nwalsh.saxon-gradle-0.9.1-beta3.jar b/libs/com.nwalsh.saxon-gradle-0.9.1-beta3.jar new file mode 100644 index 0000000000000000000000000000000000000000..9d5c57c2b468b9f3b2b7c9a58d8bb21b8e1c1b90 GIT binary patch literal 70508 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 literal 0 HcmV?d00001 diff --git a/properties.gradle b/properties.gradle index 5365ec033..2c32231c8 100644 --- a/properties.gradle +++ b/properties.gradle @@ -1,19 +1,19 @@ // These are properties shared by the project and buildSrc ext { - xslTNGtitle = "DocBook xslTNG" - xslTNGbaseName = "docbook-xslTNG" - xslTNGversion = "1.4.0" - guideVersion = "1.4.0" + xslTNGtitle = 'DocBook xslTNG' + xslTNGbaseName = 'docbook-xslTNG' + xslTNGversion = '1.4.1' + guideVersion = '1.4.1' - saxonVersion = "10.5" - saxonGroup = "net.sf.saxon" - saxonEdition = "Saxon-HE" - //saxonGroup = "com.saxonica" - //saxonEdition = "Saxon-EE" + saxonVersion = '10.5' + saxonGroup = 'net.sf.saxon' + saxonEdition = 'Saxon-HE' + //saxonGroup = 'com.saxonica' + //saxonEdition = 'Saxon-EE' - metadataExtractorVersion = "2.14.0" - jingVersion = "20181222" - xmlresolverVersion = "1.1.0" - sincludeVersion = "0.9.2" - slf4jVersion = "1.7.25" + metadataExtractorVersion = '2.15.0' + jingVersion = '20181222' + xmlresolverVersion = '2.1.0' + sincludeVersion = '1.1.0' + slf4jVersion = '1.7.30' } diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 000000000..10e333105 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,13 @@ +pluginManagement { + // includeBuild "/Users/ndw/Projects/xml/saxon-gradle/" + buildscript { + repositories { + mavenCentral() + flatDir { dirs "libs" } + } + dependencies { + classpath "net.sf.saxon:Saxon-HE:10.5" + classpath ':com.nwalsh.saxon-gradle:0.9.1-beta3' + } + } +}