CB-8390 Add Gradle support for Play Services and Support libraries

This commit is contained in:
Andrew Grieve 2015-02-02 23:26:53 -05:00
parent 26ee1c4547
commit ce351f5c38

View File

@ -97,23 +97,21 @@ function extractProjectNameFromManifest(projectPath) {
return m[1];
}
function extractSubProjectPaths() {
var data = fs.readFileSync(path.join(ROOT, 'project.properties'), 'utf8');
var libsSet = {};
var r = /^\s*android\.library\.reference\.\d+=(.*)(?:\s|$)/mg
function findAllUniq(data, r) {
var s = {};
var m;
while (m = r.exec(data)) {
libsSet[m[1]] = 1;
}
var gradleSet = {};
r = /^\s*cordova\.gradle\.include\.\d+=(.*)(?:\s|$)/mg
m;
while (m = r.exec(data)) {
gradleSet[m[1]] = 1;
s[m[1]] = 1;
}
return Object.keys(s);
}
function readProjectProperties() {
var data = fs.readFileSync(path.join(ROOT, 'project.properties'), 'utf8');
return {
libs: Object.keys(libsSet),
gradleIncludes: Object.keys(gradleSet)
libs: findAllUniq(data, /^\s*android\.library\.reference\.\d+=(.*)(?:\s|$)/mg),
gradleIncludes: findAllUniq(data, /^\s*cordova\.gradle\.include\.\d+=(.*)(?:\s|$)/mg),
systemLibs: findAllUniq(data, /^\s*cordova\.system\.library\.\d+=(.*)(?:\s|$)/mg)
};
}
@ -143,11 +141,15 @@ var builders = {
fs.writeFileSync(path.join(projectPath, 'local.properties'), LOCAL_PROPERTIES_TEMPLATE);
}
}
var subProjects = extractSubProjectPaths().libs;
writeBuildXml(ROOT);
var propertiesObj = readProjectProperties();
var subProjects = propertiesObj.libs;
for (var i = 0; i < subProjects.length; ++i) {
writeBuildXml(path.join(ROOT, subProjects[i]));
}
if (propertiesObj.systemLibs.length > 0) {
throw new Error('Project contains at least one plugin that requires a system library. This is not supported with ANT. Please build using gradle.');
}
});
},
@ -233,7 +235,7 @@ var builders = {
// Update the version of build.gradle in each dependent library.
var pluginBuildGradle = path.join(projectPath, 'cordova', 'lib', 'plugin-build.gradle');
var propertiesObj = extractSubProjectPaths();
var propertiesObj = readProjectProperties();
var subProjects = propertiesObj.libs;
for (var i = 0; i < subProjects.length; ++i) {
if (subProjects[i] !== 'CordovaLib') {
@ -254,6 +256,30 @@ var builders = {
depsList += ' debugCompile project(path: "' + p + '", configuration: "debug")\n';
depsList += ' releaseCompile project(path: "' + p + '", configuration: "release")\n';
});
// For why we do this mapping: https://issues.apache.org/jira/browse/CB-8390
var SYSTEM_LIBRARY_MAPPINGS = [
[/^\/?extras\/android\/support\/(.*)$/, 'com.android.support:support-$1:+'],
[/^\/?google\/google_play_services\/libproject\/google-play-services_lib\/?$/, 'com.google.android.gms:play-services:+']
];
propertiesObj.systemLibs.forEach(function(p) {
var mavenRef;
// It's already in gradle form if it has two ':'s
if (/:.*:/.exec(p)) {
mavenRef = p;
} else {
for (var i = 0; i < SYSTEM_LIBRARY_MAPPINGS.length; ++i) {
var pair = SYSTEM_LIBRARY_MAPPINGS[i];
if (pair[0].exec(p)) {
mavenRef = p.replace(pair[0], pair[1]);
break;
}
}
if (!mavenRef) {
throw new Error('Unsupported system library (does not work with gradle): ' + p);
}
}
depsList += ' compile "' + mavenRef + '"\n';
});
buildGradle = buildGradle.replace(/(SUB-PROJECT DEPENDENCIES START)[\s\S]*(\/\/ SUB-PROJECT DEPENDENCIES END)/, '$1\n' + depsList + ' $2');
var includeList = '';
propertiesObj.gradleIncludes.forEach(function(includePath) {