1 // Script used to build ADT plugins, IDE and monitor 2 // There are 2 major tasks done by this plugin: 3 // copydeps: copies tools/base, tools/swt and prebuilt jars into plugins' libs folder 4 // buildEclipse: builds Eclipse by running Tycho from the commandline 5 // 6 // Usage: $ ANDROID_SRC/tools/gradlew -i -b /path/to/this/build.gradle copydeps|buildEclipse 7 8 // get tools/base version 9 apply from: "../../tools/buildSrc/base/version.gradle" 10 11 repositories { 12 maven { url '../../prebuilts/tools/common/m2/repository' } 13 maven { url '../../out/repo' } 14 } 15 16 ext { 17 // list of plugins whose manifest should be examined to identify dependencies 18 adtPlugins = new File(projectDir, 'plugins').listFiles().findAll { it.name.startsWith("com.android") } 19 20 // 21 def eclipseBuildDeps = new File(projectDir, "../../prebuilts/eclipse-build-deps").getCanonicalFile() 22 targetComponents = [ 23 "platform": new File(eclipseBuildDeps, "platform/org.eclipse.platform-4.2.2.zip"), 24 "cdt" : new File(eclipseBuildDeps, "cdt/cdt-master-8.0.2.zip"), 25 "emf" : new File(eclipseBuildDeps, "emf/emf-xsd-Update-2.9.1.zip"), 26 "jdt" : new File(eclipseBuildDeps, "jdt/org.eclipse.jdt.source-4.2.2.zip"), 27 "wtp" : new File(eclipseBuildDeps, "wtp/wtp-repo-R-3.3.2-20120210195245.zip"), 28 "gef" : new File(eclipseBuildDeps, "gef/GEF-Update-3.9.1.zip"), 29 "pde" : new File(eclipseBuildDeps, "pde/org.eclipse.pde-3.8.zip"), 30 "egit" : new File(eclipseBuildDeps, "egit/org.eclipse.egit.repository-2.2.0.201212191850-r.zip"), 31 ] 32 33 buildNumber = System.getenv("BUILD_NUMBER") 34 if (buildNumber == null) { 35 buildNumber = "SNAPSHOT" 36 } 37 } 38 39 // a mapping from the library names as used inside the plugin's MANIFEST.MF to the Maven artifact id 40 def artifacts = [ 41 // tools/base and tools/swt dependencies 42 'manifest-merger' : "com.android.tools.build:manifest-merger:$ext.baseVersion", 43 'ddmlib' : "com.android.tools.ddms:ddmlib:$ext.baseVersion", 44 'ddmuilib' : "com.android.tools.ddms:ddmuilib:$ext.baseVersion", 45 'layoutlib-api' : "com.android.tools.layoutlib:layoutlib-api:$ext.baseVersion", 46 'lint-api' : "com.android.tools.lint:lint-api:$ext.baseVersion", 47 'lint-checks' : "com.android.tools.lint:lint-checks:$ext.baseVersion", 48 'asset-studio' : "com.android.tools:asset-studio:$ext.baseVersion", 49 'common' : "com.android.tools:common:$ext.baseVersion", 50 'dvlib' : "com.android.tools:dvlib:$ext.baseVersion", 51 'hierarchyviewer2lib' : "com.android.tools:hierarchyviewer2lib:$ext.baseVersion", 52 'ninepatch' : "com.android.tools:ninepatch:$ext.baseVersion", 53 'rule-api' : "com.android.tools:rule-api:$ext.baseVersion", 54 'sdk-common' : "com.android.tools:sdk-common:$ext.baseVersion", 55 'sdklib' : "com.android.tools:sdklib:$ext.baseVersion", 56 'sdkstats' : "com.android.tools:sdkstats:$ext.baseVersion", 57 'sdkuilib' : "com.android.tools:sdkuilib:$ext.baseVersion", 58 'swtmenubar' : "com.android.tools:swtmenubar:$ext.baseVersion", 59 'testutils' : "com.android.tools:testutils:$ext.baseVersion", 60 'traceview' : "com.android.tools:traceview:$ext.baseVersion", 61 'uiautomatorviewer' : "com.android.tools:uiautomatorviewer:$ext.baseVersion", 62 63 // prebuilts 64 'ant-glob' : 'com.android.tools.external:ant-glob:1.0', 65 'asm-4.0' : 'org.ow2.asm:asm:4.0', 66 'asm-analysis-4.0' : 'org.ow2.asm:asm-analysis:4.0', 67 'asm-tree-4.0' : 'org.ow2.asm:asm-tree:4.0', 68 'commons-codec-1.4' : 'commons-codec:commons-codec:1.4', 69 'commons-compress-1.0' : 'org.apache.commons:commons-compress:1.8.1', 70 'commons-logging-1.1.1' : 'commons-logging:commons-logging:1.1.1', 71 'easymock' : 'org.easymock:easymock:2.4', 72 'freemarker-2.3.20' : 'org.freemarker:freemarker:2.3.20', 73 'guava-15.0' : 'com.google.guava:guava:15.0', 74 'host-libprotobuf-java-2.3.0-lite' : 'com.android.tools.external:libprotobuf-java-lite:2.3.0', 75 'httpclient-4.1.1' : 'org.apache.httpcomponents:httpclient:4.1.1', 76 'httpcore-4.1' : 'org.apache.httpcomponents:httpcore:4.1', 77 'httpmime-4.1' : 'org.apache.httpcomponents:httpmime:4.1', 78 'jcommon-1.0.12' : 'jfree:jcommon:1.0.12', 79 'jfreechart-1.0.9' : 'jfree:jfreechart:1.0.9', 80 'jfreechart-swt-1.0.9' : 'jfree:jfreechart-swt:1.0.9', 81 'kxml2-2.3.0' : 'net.sf.kxml:kxml2:2.3.0', 82 'liblzf-1.0' : 'com.android.tools.external:liblzf:1.0', 83 'lombok-ast-0.2.2' : 'com.android.tools.external.lombok:lombok-ast:0.2.2', 84 'propertysheet' : 'com.android.tools.external:propertysheet:1.0', 85 ] 86 87 configurations { 88 compile 89 } 90 91 dependencies { 92 compile artifacts.values() 93 } 94 95 task copydeps << { 96 // get the resolved dependencies from the compile configuration 97 def resolvedDependencies = configurations.compile.resolvedConfiguration.firstLevelModuleDependencies 98 99 // generate a map from "xy.jar" -> "/path/to/xy-1.0.jar" 100 def artifactMap = [:] 101 resolvedDependencies.each { dependency -> 102 def dependencyId = dependency.getName() 103 def artifactName = artifacts.find{ it.value == dependencyId}?.key 104 105 // get the jar file corresponding to the dependency 106 def artifact = getArtifact(dependency) 107 artifactMap.put(artifactName + ".jar", artifact) 108 } 109 110 project.adtPlugins.each { File pluginFile -> 111 def manifestDeps = getManifestDependencies(new File(pluginFile, "META-INF/MANIFEST.MF")) 112 logger.info("Dependencies for " + pluginFile.toString() + ": " + manifestDeps.join(",")) 113 114 File dest = new File(pluginFile, "libs") 115 if (!manifestDeps.isEmpty() && !dest.isDirectory()) { 116 dest.mkdirs() 117 } 118 119 manifestDeps.each { 120 if (!artifactMap.containsKey(it)) { 121 throw new RuntimeException("No resolved artifact for: " + it + ", required for: " 122 + pluginFile.getPath()) 123 } 124 125 String destName = artifactMap.get(it) 126 logger.info("\tCopying " + destName + " to " + dest) 127 ant.copy(file: destName, tofile: new File(dest, it)) 128 } 129 } 130 } 131 132 // unzip eclipse prebuilts into the out folder to create a target platform for the build 133 task unzipTargetPlatform << { 134 File targetDir = new File(projectDir, "../../out/host/maven/target").getCanonicalFile() 135 targetDir.mkdirs() 136 137 project.targetComponents.each { String k, File v -> 138 File d = new File(targetDir, k) 139 logger.info("Unzipping " + v.getPath() + " into: " + d.getPath()) 140 ant.unzip(src: v, dest: d) 141 } 142 } 143 144 task buildEclipse(type: Exec, dependsOn: unzipTargetPlatform) { 145 def maven = new File(projectDir, "../../prebuilts/eclipse/maven/apache-maven-3.2.1/bin/mvn").getCanonicalFile() 146 def androidOut = new File(projectDir, "../../out").getCanonicalPath() 147 environment("M2_HOME", maven.getParentFile().getParentFile().getCanonicalPath()) 148 workingDir projectDir 149 commandLine maven.getCanonicalPath(), "-s", "settings.xml", "-DforceContextQualifier=$project.buildNumber", "-DANDROID_OUT=$androidOut", "package" 150 } 151 152 private File getArtifact(ResolvedDependency dependency) { 153 if (dependency.moduleArtifacts.size() != 1) { 154 String msg = String.format("Each dependency is expected to map to a single jar file, " + 155 "but %s maps to the following artifacts: %s", 156 dependency, 157 dependency.moduleArtifacts.collect { it.file }) 158 throw new RuntimeException(msg); 159 } 160 161 return dependency.moduleArtifacts.iterator().next().file 162 } 163 164 // parse a plugin's manifest file and return the list of jar dependencies expected to be 165 // bundled inside 166 private List<String> getManifestDependencies(File manifest) { 167 if (manifest == null || !manifest.exists()) { 168 return [] 169 } 170 171 def entries = [] 172 173 def fis = new FileInputStream(manifest) 174 try { 175 java.util.jar.Manifest m = new java.util.jar.Manifest(fis) 176 def classPath = m.getMainAttributes().getValue("Bundle-ClassPath") 177 if (classPath == null) { 178 return [] 179 } 180 181 classPath.split(',').each { 182 if (!it.equals(".")) { 183 if (!it.startsWith("libs/") || !it.endsWith(".jar")) { 184 throw new RuntimeException( 185 "Unexpected classpath entry: " + it + " in file: " + manifest) 186 } 187 188 entries.add(it.substring("libs/".length())) 189 } 190 } 191 } finally { 192 fis.close() 193 } 194 195 return entries 196 } 197