| // ASM: a very small and fast Java bytecode manipulation framework |
| // Copyright (c) 2000-2011 INRIA, France Telecom |
| // All rights reserved. |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions |
| // are met: |
| // 1. Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // 2. Redistributions in binary form must reproduce the above copyright |
| // notice, this list of conditions and the following disclaimer in the |
| // documentation and/or other materials provided with the distribution. |
| // 3. Neither the name of the copyright holders nor the names of its |
| // contributors may be used to endorse or promote products derived from |
| // this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
| // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| // THE POSSIBILITY OF SUCH DAMAGE. |
| |
| buildscript { |
| repositories { mavenCentral() } |
| dependencies { classpath 'org.netbeans.tools:sigtest-maven-plugin:1.5' } |
| } |
| |
| plugins { id 'com.github.sherter.google-java-format' version '0.9' apply false } |
| plugins { id 'me.champeau.jmh' version '0.6.8' apply false } |
| plugins { id 'org.sonarqube' version '4.3.1.3277' apply false } |
| |
| description = 'ASM, a very small and fast Java bytecode manipulation framework' |
| |
| apply plugin: 'java-platform' |
| dependencies { |
| constraints { |
| api project(':asm'), project(':asm-tree'), project(':asm-analysis') |
| api project(':asm-util'), project(':asm-commons') |
| } |
| } |
| |
| allprojects { |
| group = 'org.ow2.asm' |
| version = '9.6' + (rootProject.hasProperty('release') ? '' : '-SNAPSHOT') |
| } |
| |
| subprojects { |
| repositories { mavenCentral() } |
| apply plugin: 'java-library' |
| apply plugin: 'jacoco' |
| sourceCompatibility = '1.8' |
| targetCompatibility = '1.8' |
| test { useJUnitPlatform() } |
| ext.provides = [] // The provided java packages, e.g. ['org.objectweb.asm'] |
| ext.requires = [] // The required Gradle projects, e.g. [':asm-test'] |
| ext.transitiveRequires = { -> |
| return requires.collect{project(it)} |
| .collect{it.transitiveRequires().plus(it.provides[0])}.flatten() as Set |
| } |
| ext.transitiveImports = { -> |
| return requires.collect{project(it)} |
| .collect{it.transitiveImports().plus(it.provides)}.flatten() as Set |
| } |
| ext.depends = [] // The external dependencies, e.g. ['junit:junit:4.12'] |
| // Some external dependencies (such as Jacoco) depend transitively on ASM, and |
| // without this rule Gradle can mix ASM jars of different versions (e.g. |
| // asm-6.0.jar with the asm-tree.jar built locally). |
| configurations.all { resolutionStrategy { preferProjectModules() } } |
| } |
| |
| // ----------------------------------------------------------------------------- |
| // Project descriptions |
| // ----------------------------------------------------------------------------- |
| |
| project(':asm') { |
| description = parent.description |
| provides = ['org.objectweb.asm', 'org.objectweb.asm.signature'] |
| } |
| |
| project(':asm-analysis') { |
| description = "Static code analysis API of ${parent.description}" |
| provides = ['org.objectweb.asm.tree.analysis'] |
| requires = [':asm-tree'] |
| } |
| |
| project(':asm-commons') { |
| description = "Usefull class adapters based on ${parent.description}" |
| provides = ['org.objectweb.asm.commons'] |
| requires = [':asm', ':asm-tree'] |
| dependencies { testImplementation project(':asm-util') } |
| } |
| |
| project(':asm-test') { |
| description = "Utilities for testing ${parent.description}" |
| provides = ['org.objectweb.asm.test'] |
| depends = ['org.junit.jupiter:junit-jupiter-api:5.9.1', |
| 'org.junit.jupiter:junit-jupiter-params:5.9.1'] |
| } |
| |
| project(':asm-tree') { |
| description = "Tree API of ${parent.description}" |
| provides = ['org.objectweb.asm.tree'] |
| requires = [':asm'] |
| } |
| |
| project(':asm-util') { |
| description = "Utilities for ${parent.description}" |
| provides = ['org.objectweb.asm.util'] |
| requires = [':asm', ':asm-tree', ':asm-analysis'] |
| dependencies { testImplementation 'org.codehaus.janino:janino:3.1.9' } |
| } |
| |
| // Use "gradle benchmarks:jmh [-PjmhInclude='<regex>']" to run the benchmarks. |
| project(':benchmarks') { |
| description = "Benchmarks for ${rootProject.description}" |
| apply plugin: 'me.champeau.jmh' |
| dependencies { |
| implementation files('libs/csg-bytecode-1.0.0.jar', 'libs/jclasslib.jar') |
| jmh project(':asm'), project(':asm-tree') |
| } |
| depends = [ |
| 'kawa:kawa:1.7', |
| 'net.sf.jiapi:jiapi-reflect:0.5.2', |
| 'net.sourceforge.serp:serp:1.15.1', |
| 'org.apache.bcel:bcel:6.0', |
| 'org.aspectj:aspectjweaver:1.8.10', |
| 'org.cojen:cojen:2.2.5', |
| 'org.javassist:javassist:3.21.0-GA', |
| 'org.mozilla:rhino:1.7.7.1' |
| ] |
| ['4.0', '5.0.1', '6.0', '7.0', '8.0.1', '9.0'].each { version -> |
| configurations.create("asm${version}") |
| dependencies.add("asm${version}", "org.ow2.asm:asm:${version}@jar") |
| dependencies.add("asm${version}", "org.ow2.asm:asm-tree:${version}@jar") |
| task "asm${version}"(type: Copy) { |
| from configurations."asm${version}".collect{zipTree(it)} |
| into "${buildDir}/asm${version}" |
| duplicatesStrategy = DuplicatesStrategy.INCLUDE // module-info.class |
| } |
| classes.dependsOn "asm${version}" |
| } |
| configurations.create('input-classes-java8') |
| dependencies.add('input-classes-java8', 'io.vavr:vavr:0.10.0@jar') |
| task copyInputClasses(type: Copy) { |
| from configurations.'input-classes-java8'.collect{zipTree(it)} |
| into "${buildDir}/input-classes-java8" |
| } |
| classes.dependsOn copyInputClasses |
| jmh { |
| jvmArgsAppend = ["-Duser.dir=${rootDir}"] |
| resultFormat = 'CSV' |
| profilers = ['org.objectweb.asm.benchmarks.MemoryProfiler'] |
| if (rootProject.hasProperty('jmhInclude')) { |
| includes = [jmhInclude] |
| } |
| } |
| } |
| |
| project(':tools') { |
| description = "Tools used to build ${parent.description}" |
| } |
| |
| project(':tools:retrofitter') { |
| description = "JDK 1.5 class retrofitter based on ${rootProject.description}" |
| sourceCompatibility = '1.9' |
| targetCompatibility = '1.9' |
| // TODO: this compiles asm twice (here and in :asm). |
| sourceSets.main.java.srcDirs += project(':asm').sourceSets.main.java.srcDirs |
| } |
| |
| // ----------------------------------------------------------------------------- |
| // Project tasks creation and configuration |
| // ----------------------------------------------------------------------------- |
| |
| // All projects are checked with googleJavaFormat, Checkstyle and PMD, |
| // and tested with :asm-test and JUnit. |
| subprojects { |
| apply plugin: 'com.github.sherter.google-java-format' |
| googleJavaFormat.toolVersion = '1.15.0' |
| googleJavaFormat.exclude 'src/resources/java/**/*' |
| |
| // Check the coding style with Checkstyle. Fail in case of error or warning. |
| apply plugin: 'checkstyle' |
| checkstyle.configFile = file("${rootDir}/tools/checkstyle.xml") |
| checkstyle.maxErrors = 0 |
| checkstyle.maxWarnings = 0 |
| |
| // Check the code with PMD. |
| apply plugin: 'pmd' |
| pmd.ruleSets = [] |
| pmd.ruleSetFiles = files("${rootDir}/tools/pmd.xml") |
| pmd.consoleOutput = true |
| pmdMain.dependsOn ':asm:jar' |
| pmdTest.dependsOn ':asm:jar' |
| |
| dependencies { |
| requires.each { projectName -> api project(projectName) } |
| depends.each { artifactName -> api artifactName } |
| testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.1', |
| 'org.junit.jupiter:junit-jupiter-params:5.9.1' |
| testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.1' |
| testImplementation project(':asm-test') |
| } |
| |
| // Produce byte-for-byte reproducible archives. |
| tasks.withType(AbstractArchiveTask).configureEach { |
| preserveFileTimestamps = false |
| reproducibleFileOrder = true |
| dirMode = 0775 |
| fileMode = 0664 |
| } |
| } |
| |
| // Configure the projects with a non-empty 'provides' property. They must be |
| // checked for code coverage and backward compatibility, retrofited to Java 1.5, |
| // and packaged with generated module-info classes. |
| configure(subprojects.findAll{it.provides}) { |
| // Code coverage configuration. |
| jacoco.toolVersion = '0.8.10' |
| jacocoTestReport { |
| reports { xml.required = true } |
| classDirectories.setFrom(sourceSets.main.output.classesDirs) |
| } |
| jacocoTestCoverageVerification { |
| classDirectories.setFrom(sourceSets.main.output.classesDirs) |
| violationRules.rule { limit { minimum = 0.95; counter = 'INSTRUCTION' } } |
| dependsOn ':asm:jar' |
| dependsOn ':asm-tree:jar' |
| dependsOn ':asm-commons:jar' |
| } |
| check.dependsOn jacocoTestCoverageVerification |
| |
| // Retrofit the code in-place to Java 1.5 and generate a module-info class |
| // from the code content, in compileJava.doLast. |
| if (name != 'asm-test') { |
| compileJava.dependsOn ':tools:retrofitter:classes' |
| compileJava.doLast { |
| def path = project(':tools:retrofitter').sourceSets.main.runtimeClasspath |
| def loader = new URLClassLoader(path.collect {f -> f.toURL()} as URL[]) |
| def retrofitter = |
| loader.loadClass('org.objectweb.asm.tools.Retrofitter').newInstance() |
| def classes = sourceSets.main.output.classesDirs.singleFile |
| def requires = transitiveRequires() as List |
| retrofitter.retrofit(classes, "${version}") |
| retrofitter.verify(classes, "${version}", provides, requires) |
| } |
| } |
| |
| // Create one backward compatibility checking task for each 'sigtest-*' file |
| // in test/resources, and make the 'check' task depend on all these tasks. |
| if (file('src/test/resources/').exists()) { |
| file('src/test/resources/').eachFileMatch(~/sigtest-.*/) { f -> |
| task "${f.name}"(dependsOn: 'classes') { |
| inputs.files(f, sourceSets.main.java) |
| outputs.file("${buildDir}/${f.name}") |
| doLast { |
| def sigtest = new com.sun.tdk.signaturetest.SignatureTest() |
| def args = ['-ApiVersion', version, '-Backward', '-Static', |
| '-Mode', 'bin', '-FileName', f, '-Classpath', |
| project(':tools').file('jdk8-api.jar').path + File.pathSeparator + |
| sourceSets.main.output.classesDirs.asPath, '-Package'] + provides |
| outputs.getFiles()[0].withPrintWriter { printWriter -> |
| sigtest.run(args as String[], printWriter, null) |
| } |
| if (!sigtest.isPassed()) throw new GradleException() |
| } |
| } |
| check.dependsOn f.name |
| } |
| // Define a task to create a sigtest file for the current version. |
| task "buildSigtest"(dependsOn: 'classes') { |
| inputs.files(sourceSets.main.java) |
| outputs.file("src/test/resources/sigtest-${version}.txt") |
| doLast { |
| def setup = new com.sun.tdk.signaturetest.Setup() |
| def args = ['-ApiVersion', version, '-FileName', outputs.getFiles()[0], |
| '-Classpath', project(':tools').file('jdk8-api.jar').path + |
| File.pathSeparator + sourceSets.main.output.classesDirs.asPath + |
| File.pathSeparator + sourceSets.main.compileClasspath.asPath, |
| '-Package'] + provides |
| setup.run(args as String[], new PrintWriter(System.err, true), null) |
| if (!setup.isPassed()) throw new GradleException() |
| } |
| } |
| } |
| |
| jar.manifest.attributes( |
| 'Implementation-Title': project.description, |
| 'Implementation-Version': "${version}") |
| // Package the project as an OSGi bundle. Exclude the asm-test project (the |
| // DefaultPackage class prevents it from being a proper bundle). |
| if (name != 'asm-test') { |
| def imports = transitiveImports() |
| jar.manifest.attributes( |
| 'Bundle-DocURL': 'http://asm.ow2.org', |
| 'Bundle-License': 'BSD-3-Clause;link=https://asm.ow2.io/LICENSE.txt', |
| 'Bundle-ManifestVersion': 2, |
| 'Bundle-Name': provides[0], |
| 'Bundle-RequiredExecutionEnvironment': 'J2SE-1.5', |
| 'Bundle-SymbolicName': provides[0], |
| 'Bundle-Version': "${version}", |
| 'Export-Package': |
| provides.collect{"${it};version=\"${version}\""}.join(',') + |
| (imports ? ";uses:=\"${imports.join(',')}\"" : "")) |
| if (imports) { |
| jar.manifest.attributes( |
| 'Import-Package': |
| imports.collect{"${it};version=\"${version}\""}.join(','), |
| 'Module-Requires': |
| transitiveRequires().collect{"${it};transitive=true"}.join(',')) |
| } |
| } |
| |
| // Apply the SonarQube plugin to monitor the code quality of the project. |
| // Use with 'gradlew sonar -Dsonar.host.url=https://sonarqube.ow2.org'. |
| apply plugin: 'org.sonarqube' |
| sonar { |
| properties { property 'sonar.projectKey', "ASM:${project.name}" } |
| } |
| |
| // Add a task to generate a private javadoc and add it as a dependency of the |
| // 'check' task. |
| task privateJavadoc(type: Javadoc) { |
| source = sourceSets.main.allJava |
| classpath = configurations.compileClasspath |
| destinationDir = file("${javadoc.destinationDir}-private") |
| options.memberLevel = JavadocMemberLevel.PRIVATE |
| options.addBooleanOption('Xdoclint:all,-missing', true) |
| } |
| check.dependsOn privateJavadoc |
| |
| // Add tasks to generate the Javadoc and a source jar, to be uploaded to Maven |
| // together with the main jar (containing the compiled code). |
| task javadocJar(type: Jar, dependsOn: 'javadoc') { |
| from javadoc.destinationDir |
| archiveClassifier = 'javadoc' |
| } |
| task sourcesJar(type: Jar, dependsOn: 'classes') { |
| from sourceSets.main.allSource |
| archiveClassifier = 'sources' |
| } |
| java { |
| withJavadocJar() |
| withSourcesJar() |
| } |
| } |
| |
| // Configure the root project, and those with a non-empty 'provides' property, |
| // to be published in Maven with a POM. |
| configure([rootProject] + subprojects.findAll { it.provides }) { |
| apply plugin: 'maven-publish' |
| apply plugin: 'signing' |
| publishing { |
| repositories { |
| maven { |
| def baseUrl = 'https://repository.ow2.org/nexus/' |
| def releasesUrl = baseUrl + 'service/local/staging/deploy/maven2' |
| def snapshotsUrl = baseUrl + 'content/repositories/snapshots' |
| name = 'nexus' |
| url = rootProject.hasProperty('release') ? releasesUrl : snapshotsUrl |
| credentials { |
| username System.env.NEXUS_USER_NAME |
| password System.env.NEXUS_PASSWORD |
| } |
| } |
| } |
| publications { |
| maven(MavenPublication) { |
| def isRoot = project == rootProject |
| artifactId (isRoot ? 'asm-bom' : project.name) |
| from (isRoot ? components.javaPlatform : components.java) |
| pom.withXml { |
| def parent = asNode().appendNode('parent') |
| parent.appendNode('groupId', 'org.ow2') |
| parent.appendNode('artifactId', 'ow2') |
| parent.appendNode('version', '1.5.1') |
| } |
| pom { |
| name = artifactId |
| description = project.description |
| packaging 'jar' |
| inceptionYear = '2000' |
| licenses { |
| license { |
| name = 'BSD-3-Clause' |
| url = 'https://asm.ow2.io/license.html' |
| } |
| } |
| url = 'http://asm.ow2.io/' |
| mailingLists { |
| mailingList { |
| name = 'ASM Users List' |
| subscribe = 'https://mail.ow2.org/wws/subscribe/asm' |
| post = '[email protected]' |
| archive = 'https://mail.ow2.org/wws/arc/asm/' |
| } |
| mailingList { |
| name = 'ASM Team List' |
| subscribe = 'https://mail.ow2.org/wws/subscribe/asm-team' |
| post = '[email protected]' |
| archive = 'https://mail.ow2.org/wws/arc/asm-team/' |
| } |
| } |
| issueManagement { |
| url = 'https://gitlab.ow2.org/asm/asm/issues' |
| } |
| scm { |
| connection = 'scm:git:https://gitlab.ow2.org/asm/asm/' |
| developerConnection = 'scm:git:https://gitlab.ow2.org/asm/asm/' |
| url = 'https://gitlab.ow2.org/asm/asm/' |
| } |
| developers { |
| developer { |
| name = 'Eric Bruneton' |
| id = 'ebruneton' |
| email = '[email protected]' |
| roles = ['Creator', 'Java Developer'] |
| } |
| developer { |
| name = 'Eugene Kuleshov' |
| id = 'eu' |
| email = '[email protected]' |
| roles = ['Java Developer'] |
| } |
| developer { |
| name = 'Remi Forax' |
| id = 'forax' |
| email = '[email protected]' |
| roles = ['Java Developer'] |
| } |
| } |
| organization { |
| name = 'OW2' |
| url = 'http://www.ow2.org/' |
| } |
| } |
| } |
| } |
| } |
| signing { |
| required rootProject.hasProperty('release') |
| sign publishing.publications.maven |
| } |
| tasks.withType(GenerateModuleMetadata) { enabled = false } |
| } |