diff options
Diffstat (limited to 'StoneIsland/platforms/ios/cordova/lib/build.js')
| -rwxr-xr-x | StoneIsland/platforms/ios/cordova/lib/build.js | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/StoneIsland/platforms/ios/cordova/lib/build.js b/StoneIsland/platforms/ios/cordova/lib/build.js new file mode 100755 index 00000000..153a4ec3 --- /dev/null +++ b/StoneIsland/platforms/ios/cordova/lib/build.js @@ -0,0 +1,148 @@ +/** + * 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. + */ + +/*jshint node: true*/ + +var Q = require('q'), + nopt = require('nopt'), + path = require('path'), + shell = require('shelljs'), + spawn = require('./spawn'), + check_reqs = require('./check_reqs'); + +var projectPath = path.join(__dirname, '..', '..'); + +module.exports.run = function (argv) { + + var args = nopt({ + // "archs": String, // TODO: add support for building different archs + 'debug': Boolean, + 'release': Boolean, + 'device': Boolean, + 'emulator': Boolean, + }, {'-r': '--release'}, argv); + + if (args.debug && args.release) { + return Q.reject('Only one of "debug"/"release" options should be specified'); + } + + if (args.device && args.emulator) { + return Q.reject('Only one of "device"/"emulator" options should be specified'); + } + + return check_reqs.run().then(function () { + return findXCodeProjectIn(projectPath); + }).then(function (projectName) { + var configuration = args.release ? 'Release' : 'Debug'; + + console.log('Building project : ' + path.join(projectPath, projectName + '.xcodeproj')); + console.log('\tConfiguration : ' + configuration); + console.log('\tPlatform : ' + (args.device ? 'device' : 'emulator')); + + var xcodebuildArgs = getXcodeArgs(projectName, projectPath, configuration, args.device); + return spawn('xcodebuild', xcodebuildArgs, projectPath); + }); +}; + +/** + * Searches for first XCode project in specified folder + * @param {String} projectPath Path where to search project + * @return {Promise} Promise either fulfilled with project name or rejected + */ +function findXCodeProjectIn(projectPath) { + // 'Searching for Xcode project in ' + projectPath); + var xcodeProjFiles = shell.ls(projectPath).filter(function (name) { + return path.extname(name) === '.xcodeproj'; + }); + + if (xcodeProjFiles.length === 0) { + return Q.reject('No Xcode project found in ' + projectPath); + } + if (xcodeProjFiles.length > 1) { + console.warn('Found multiple .xcodeproj directories in \n' + + projectPath + '\nUsing first one'); + } + + var projectName = path.basename(xcodeProjFiles[0], '.xcodeproj'); + return Q.resolve(projectName); +} + +module.exports.findXCodeProjectIn = findXCodeProjectIn; + +/** + * Returns array of arguments for xcodebuild + * @param {String} projectName Name of xcode project + * @param {String} projectPath Path to project file. Will be used to set CWD for xcodebuild + * @param {String} configuration Configuration name: debug|release + * @param {Boolean} isDevice Flag that specify target for package (device/emulator) + * @return {Array} Array of arguments that could be passed directly to spawn method + */ +function getXcodeArgs(projectName, projectPath, configuration, isDevice) { + var xcodebuildArgs; + if (isDevice) { + xcodebuildArgs = [ + '-xcconfig', path.join(__dirname, '..', 'build-' + configuration.toLowerCase() + '.xcconfig'), + '-project', projectName + '.xcodeproj', + 'ARCHS=armv7 armv7s arm64', + '-target', projectName, + '-configuration', configuration, + '-sdk', 'iphoneos', + 'build', + 'VALID_ARCHS=armv7 armv7s arm64', + 'CONFIGURATION_BUILD_DIR=' + path.join(projectPath, 'build', 'device'), + 'SHARED_PRECOMPS_DIR=' + path.join(projectPath, 'build', 'sharedpch') + ]; + } else { // emulator + xcodebuildArgs = [ + '-xcconfig', path.join(__dirname, '..', 'build-' + configuration.toLowerCase() + '.xcconfig'), + '-project', projectName + '.xcodeproj', + 'ARCHS=i386', + '-target', projectName , + '-configuration', configuration, + '-sdk', 'iphonesimulator', + 'build', + 'VALID_ARCHS=i386', + 'CONFIGURATION_BUILD_DIR=' + path.join(projectPath, 'build', 'emulator'), + 'SHARED_PRECOMPS_DIR=' + path.join(projectPath, 'build', 'sharedpch') + ]; + } + return xcodebuildArgs; +} + +// help/usage function +module.exports.help = function help() { + console.log(''); + console.log('Usage: build [ --debug | --release ] [--archs=\"<list of architectures...>\"] [--device | --simulator]'); + console.log(' --help : Displays this dialog.'); + console.log(' --debug : Builds project in debug mode. (Default)'); + console.log(' --release : Builds project in release mode.'); + console.log(' -r : Shortcut :: builds project in release mode.'); + // TODO: add support for building different archs + // console.log(" --archs : Builds project binaries for specific chip architectures (`anycpu`, `arm`, `x86`, `x64`)."); + console.log(' --device, --simulator'); + console.log(' : Specifies, what type of project to build'); + console.log('examples:'); + console.log(' build '); + console.log(' build --debug'); + console.log(' build --release'); + // TODO: add support for building different archs + // console.log(" build --release --archs=\"armv7\""); + console.log(''); + process.exit(0); +}; |
