/* * Licensed to the Apache Software Foundation (ASF) under the terms of ASLv2 (http://www.apache.org/licenses/LICENSE-2.0). * * 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 { dependencies { classpath files(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 -> 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") }