mirror of
https://github.com/apache/cordova-android.git
synced 2025-01-19 23:42:53 +08:00
b57317bdc2
This eliminates the use of shelljs.exec's sync mode, which is the source of the filehandle leaks that can cause EMFILE on OSX, and are CPU-intensive everywhere. Tested locally, needs poking before it gets released.
92 lines
3.9 KiB
JavaScript
92 lines
3.9 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/*
|
|
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.
|
|
*/
|
|
|
|
var shell = require('shelljs'),
|
|
child_process = require('child_process'),
|
|
Q = require('q'),
|
|
path = require('path'),
|
|
fs = require('fs'),
|
|
ROOT = path.join(__dirname, '..', '..');
|
|
|
|
// Get valid target from framework/project.properties
|
|
module.exports.get_target = function() {
|
|
if(fs.existsSync(path.join(ROOT, 'framework', 'project.properties'))) {
|
|
var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'framework', 'project.properties'));
|
|
return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', '');
|
|
} else if (fs.existsSync(path.join(ROOT, 'project.properties'))) {
|
|
// if no target found, we're probably in a project and project.properties is in ROOT.
|
|
var target = shell.grep(/target=android-[\d+]/, path.join(ROOT, 'project.properties'));
|
|
return target.split('=')[1].replace('\n', '').replace('\r', '').replace(' ', '');
|
|
}
|
|
}
|
|
|
|
// Returns a promise.
|
|
module.exports.check_ant = function() {
|
|
var d = Q.defer();
|
|
child_process.exec('ant -version', function(err, stdout, stderr) {
|
|
if (err) d.reject(new Error('ERROR : executing command \'ant\', make sure you have ant installed and added to your path.'));
|
|
else d.resolve();
|
|
});
|
|
return d.promise;
|
|
}
|
|
|
|
// Returns a promise.
|
|
module.exports.check_java = function() {
|
|
if(process.env.JAVA_HOME) {
|
|
var d = Q.defer();
|
|
child_process.exec('java', function(err, stdout, stderr) {
|
|
if(err) d.reject(new Error('ERROR : executing command \'java\', make sure you java environment is set up. Including your JDK and JRE.'));
|
|
else d.resolve();
|
|
});
|
|
return d.promise;
|
|
} else {
|
|
return Q.reject(new Error('ERROR : Make sure JAVA_HOME is set, as well as paths to your JDK and JRE for java.'));
|
|
}
|
|
}
|
|
|
|
// Returns a promise.
|
|
module.exports.check_android = function() {
|
|
var valid_target = this.get_target();
|
|
var d = Q.defer();
|
|
child_process.exec('android list targets', function(err, stdout, stderr) {
|
|
if (err) d.reject(stderr);
|
|
else d.resolve(stdout);
|
|
});
|
|
|
|
return d.promise.then(function(output) {
|
|
if (!output.match(valid_target)) {
|
|
return Q.reject(new Error('Please install Android target ' + valid_target.split('-')[1] + ' (the Android newest SDK). Make sure you have the latest Android tools installed as well. Run \"android\" from your command-line to install/update any missing SDKs or tools.'));
|
|
}
|
|
return Q();
|
|
}, function(stderr) {
|
|
if (stderr.match(/command\snot\sfound/)) {
|
|
return Q.reject(new Error('The command \"android\" failed. Make sure you have the latest Android SDK installed, and the \"android\" command (inside the tools/ folder) is added to your path.'));
|
|
} else {
|
|
return Q.reject(new Error('An error occurred while listing Android targets'));
|
|
}
|
|
});
|
|
}
|
|
|
|
// Returns a promise.
|
|
module.exports.run = function() {
|
|
return Q.all([this.check_ant(), this.check_java, this.check_android()]);
|
|
}
|