/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /* * Master Gradle initialization script * * Depends on bnd_* values from gradle.properties. */ import aQute.bnd.build.Workspace import aQute.bnd.osgi.Constants /* Add bnd gradle plugin as a script dependency */ buildscript { repositories { jcenter() } dependencies { classpath bnd_plugin } /* Pass bnd gradle plugin classpath to rootProject once created */ def bndPlugin = files(configurations.classpath.files) gradle.rootProject { rootProject -> rootProject.ext.bndPlugin = bndPlugin } } /* Initialize the bnd workspace */ Workspace.setDriver(Constants.BNDDRIVER_GRADLE) Workspace.addGestalt(Constants.GESTALT_BATCH, null) def workspace = new Workspace(rootDir, bnd_cnf) if (workspace == null) { throw new GradleException("Unable to load workspace ${rootDir}/${bnd_cnf}") } /* Add cnf project to the graph */ include bnd_cnf /* Start with the declared build project name */ def defaultProjectName = bnd_build /* If in a subproject, use the subproject name */ for (def currentDir = startParameter.currentDir; currentDir != rootDir; currentDir = currentDir.parentFile) { defaultProjectName = currentDir.name } /* Build a set of project names we need to include from the specified tasks */ def projectNames = startParameter.taskNames.collect { taskName -> def elements = taskName.split(':') switch (elements.length) { case 1: return defaultProjectName case 2: return elements[0].empty ? bnd_build : elements[0] default: return elements[0].empty ? elements[1] : elements[0] } }.toSet() /* Include the default project name if in a subproject or no tasks specified */ if ((startParameter.currentDir != rootDir) || projectNames.empty) { projectNames += defaultProjectName } /* If bnd_build used but declared empty, add all non-private folders of rootDir */ if (projectNames.remove('')) { rootDir.eachDir { def projectName = it.name if (!projectName.startsWith('.')) { projectNames += projectName } } } /* Add each project and its dependencies to the graph */ projectNames.each { projectName -> // Don't build the org.apache.felix.dependencymanager.benchmark, which requires java8 (build the benchmark bundle only makes sense within eclipse if (! projectName.equals("org.apache.felix.dependencymanager.benchmark")) { include projectName def project = getBndProject(workspace, projectName) project?.getDependson()*.getName().each { include it } } } /* Get the bnd project for the specified project name */ def getBndProject(Workspace workspace, String projectName) { def project = workspace.getProject(projectName) if (project == null) { return null } project.prepare() if (project.isValid()) { return project } project.getInfo(workspace, "${rootDir} :") def errorCount = 0 project.getWarnings().each { println "Warning: ${it}" } project.getErrors().each { println "Error : ${it}" errorCount++ } if (!project.isOk()) { def str = 'even though no errors were reported' if (errorCount == 1) { str = 'one error was reported' } else if (errorCount > 1) { str = "${errorCount} errors were reported" } throw new GradleException("Project ${rootDir}/${projectName} is invalid, ${str}") } throw new GradleException("Project ${rootDir}/${projectName} is not a valid bnd project") }