diff --git a/src/flow/cmd/build/build.cpp.js b/src/flow/cmd/build/build.cpp.js index 8eb4e90..cb8775f 100644 --- a/src/flow/cmd/build/build.cpp.js +++ b/src/flow/cmd/build/build.cpp.js @@ -44,7 +44,9 @@ exports.ios_combine_archs = function(flow, done) { '-create']; var input_list = archs.map(function(a){ - return flow.project.get_path_binary_dest_full(flow, flow.project.prepared, a); + var binary_source = flow.project.get_path_binary_name_source(flow, flow.project.prepared, a); + var source_path = util.normalize(path.join(flow.project.paths.build, 'cpp/' + binary_source)); + return source_path; }); args = args.concat(input_list); @@ -82,12 +84,14 @@ internal.post_build_mobile = function(flow, done) { //runs ant, and such internal.build_android = function(flow, done) { + done(); +} - - flow.log(2, 'android specifics', flow.project.prepared.source.project.app.mobile.android); +internal.build_androidold = function(flow, done) { //handle ability to compile store build, vs debug test build - var build_type = flow.project.prepared.source.project.app.mobile.android.build_type; + // var build_type = flow.project.prepared.source.project.app.mobile.android.build_type; + var build_type = flow.flags['android-build-type'] || 'debug'; //where to build from var project_root = path.join(flow.project.paths.build, flow.config.build.android.project); @@ -192,11 +196,13 @@ internal.post_build_desktop = function(flow, done) { internal.move_binary = function(flow, target_arch) { + if(flow.target == 'ios') return; + target_arch = target_arch || flow.target_arch; var binary_source = flow.project.get_path_binary_name_source(flow, flow.project.prepared, target_arch); - var binary_dest_full = flow.project.get_path_binary_dest_full(flow, flow.project.prepared, target_arch); var source_path = util.normalize(path.join(flow.project.paths.build, 'cpp/' + binary_source)); + var binary_dest_full = flow.project.get_path_binary_dest_full(flow, flow.project.prepared, target_arch); flow.log(3,'build - moving binary for %s from %s to %s', target_arch, source_path, binary_dest_full); @@ -377,6 +383,7 @@ exports.build_hxcpp = function(flow, target_arch, run_path, hxcpp_file, done) { } args.push('-D' + flow.target); + args.push('-DHAXE_OUTPUT_PART=' + flow.project.prepared.source.project.app.name); switch(target_arch) { case '32': @@ -419,10 +426,6 @@ exports.build_hxcpp = function(flow, target_arch, run_path, hxcpp_file, done) { args.push('-DHXCPP_CLANG'); } - if(flow.target == 'android') { - args.push('-Dandroid-' + flow.project.parsed.project.app.mobile.android.sdk_target); - } - //append command line + project based flags args = util.array_union(args, flow.project.prepared.hxcpp.flags); diff --git a/src/flow/cmd/files/files.js b/src/flow/cmd/files/files.js index 8909798..a62b41d 100644 --- a/src/flow/cmd/files/files.js +++ b/src/flow/cmd/files/files.js @@ -211,6 +211,18 @@ internal.copy_files = function(flow, files, output, no_copy) { } //copy_project_files +exports.template_path = function(flow, template, source, dest) { + + if(fs.statSync(source).isDirectory()) { + var _node = {source:source, template:template, source_name:'ext'}; + return internal.template_folder_recursively(flow, _node, dest); + } else { + internal.template_file(flow, template, source, dest); + return [ dest ]; + } + +} //template_path + internal.template_path = function(flow, node, dest) { if(fs.statSync(node.source).isDirectory()) { @@ -251,6 +263,9 @@ internal.template_folder_recursively = function(flow, node, _dest, _overwrite) { if(allow) { _source_file_list.push(_source_list[i]); } + } else { + var _dest_dir = path.join( _dest, _source_list[i] ); + wrench.mkdirSyncRecursive(_dest_dir, 0755); } } @@ -310,10 +325,19 @@ internal.template_file = function(flow, _template, _source, _dest) { flow.log(6, 'context for file node : ', _source, file_context); var template = bars.compile(raw_file); - var templated = template( file_context ); + var templated = false; - fse.ensureFileSync(_dest); - fs.writeFileSync(_dest, templated, 'utf8'); + try { + templated = template( file_context ); + } catch(err) { + flow.log(3, ' - NOTE cannot template file (binary?), copying as is', _source); + util.copy_path(flow, _source, _dest); + } + + if(templated !== false) { + fse.ensureFileSync(_dest); + fs.writeFileSync(_dest, templated, 'utf8'); + } } //template_file diff --git a/src/flow/cmd/hooks/hooks.js b/src/flow/cmd/hooks/hooks.js index 9182c72..50d96a3 100644 --- a/src/flow/cmd/hooks/hooks.js +++ b/src/flow/cmd/hooks/hooks.js @@ -14,6 +14,7 @@ var cmd = require('../../util/process') , util = require('../../util/util') + , files = require('../files/files') var internal = {}; @@ -127,8 +128,18 @@ internal.get_hook_flow = function(flow, stage, _name, hook) { target_js : Boolean(flow.target_js), target_desktop : Boolean(flow.target_desktop), target_mobile : Boolean(flow.target_mobile), - project : util.deep_copy(flow.project.prepared.source), log_level : Number(flow.log_level), + util : util, + files : { + template_path: function(template, source, dest){ + files.template_path(flow, template, source, dest) + } + }, + project : { + source: util.deep_copy(flow.project.prepared.source), + paths: util.deep_copy(flow.project.paths), + root: String(flow.project.root) + }, log : function(){ var args = Array.prototype.slice.call(arguments,0); flow.log.apply(flow,args); @@ -141,11 +152,12 @@ internal.run_hook = function(flow, stage, _name, hook, done) { var hook_file = path.join(hook.__path, hook.script); - flow.log(2, 'hooks - running hook from %s in %s', _name, hook.__path); - flow.log(2, 'hooks - running %s hook named `%s` from %s', stage, hook.name, hook.script); + flow.log(3, 'hooks - running hook from %s in %s', _name, hook.__path); + flow.log(3, 'hooks - running %s hook `%s` from %s', stage, hook.name, hook.script); flow.log(3, 'hooks - desc : %s', hook.desc || 'no description'); var fail = function(e) { + if(hook.require_success) { flow.project.failed = true; } @@ -155,6 +167,7 @@ internal.run_hook = function(flow, stage, _name, hook, done) { if(done) { done(e); } + } //fail var hook_script; @@ -170,18 +183,28 @@ internal.run_hook = function(flow, stage, _name, hook, done) { var hook_flow = internal.get_hook_flow(flow, stage, _name, hook); var s = hook_script.hook.toString(); - if(s.indexOf('done()') == -1) { + if(s.indexOf('done(') == -1) { return fail('hook script is missing a done(); call. This will stall! fix this before trying again.'); } try { - hook_script.hook(hook_flow, function(err){ + hook_script.hook(hook_flow, function(err,skip_build) { + if(err) return fail(err); + if(skip_build) { + flow.log(3, 'hooks - build skip requested'); + flow.project.skip_build = true; + } done(err); }); } catch(e) { - return fail(e); + + var _stack = e.stack.split('\n'); + _stack.splice(_stack.length-9,_stack.length); + + return fail('hook exception:\n\n' + _stack.join('\n')); + } //try } else { //hook_script diff --git a/src/flow/cmd/icons/default/android/drawable-hdpi/flow.png b/src/flow/cmd/icons/default/android/drawable-hdpi/flow.png deleted file mode 100644 index 1161047..0000000 Binary files a/src/flow/cmd/icons/default/android/drawable-hdpi/flow.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/android/drawable-mdpi/flow.png b/src/flow/cmd/icons/default/android/drawable-mdpi/flow.png deleted file mode 100644 index 4f49110..0000000 Binary files a/src/flow/cmd/icons/default/android/drawable-mdpi/flow.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/android/drawable-xhdpi/flow.png b/src/flow/cmd/icons/default/android/drawable-xhdpi/flow.png deleted file mode 100644 index 7e94eb0..0000000 Binary files a/src/flow/cmd/icons/default/android/drawable-xhdpi/flow.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/android/drawable-xxhdpi/flow.png b/src/flow/cmd/icons/default/android/drawable-xxhdpi/flow.png deleted file mode 100644 index 376e43d..0000000 Binary files a/src/flow/cmd/icons/default/android/drawable-xxhdpi/flow.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/android/drawable-xxxhdpi/flow.png b/src/flow/cmd/icons/default/android/drawable-xxxhdpi/flow.png deleted file mode 100644 index 895d914..0000000 Binary files a/src/flow/cmd/icons/default/android/drawable-xxxhdpi/flow.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/icon/29.png b/src/flow/cmd/icons/default/ios/icon/29.png deleted file mode 100644 index d3702b9..0000000 Binary files a/src/flow/cmd/icons/default/ios/icon/29.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/icon/29@2x.png b/src/flow/cmd/icons/default/ios/icon/29@2x.png deleted file mode 100644 index 61c6efd..0000000 Binary files a/src/flow/cmd/icons/default/ios/icon/29@2x.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/icon/40.png b/src/flow/cmd/icons/default/ios/icon/40.png deleted file mode 100644 index b11f729..0000000 Binary files a/src/flow/cmd/icons/default/ios/icon/40.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/icon/40@2x.png b/src/flow/cmd/icons/default/ios/icon/40@2x.png deleted file mode 100644 index 1f042c3..0000000 Binary files a/src/flow/cmd/icons/default/ios/icon/40@2x.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/icon/60@2x.png b/src/flow/cmd/icons/default/ios/icon/60@2x.png deleted file mode 100644 index 0ee7ab2..0000000 Binary files a/src/flow/cmd/icons/default/ios/icon/60@2x.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/icon/76.png b/src/flow/cmd/icons/default/ios/icon/76.png deleted file mode 100644 index 24f0705..0000000 Binary files a/src/flow/cmd/icons/default/ios/icon/76.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/icon/76@2x.png b/src/flow/cmd/icons/default/ios/icon/76@2x.png deleted file mode 100644 index 6df436d..0000000 Binary files a/src/flow/cmd/icons/default/ios/icon/76@2x.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/icon/Contents.json b/src/flow/cmd/icons/default/ios/icon/Contents.json deleted file mode 100644 index 9b83539..0000000 --- a/src/flow/cmd/icons/default/ios/icon/Contents.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "images" : [ - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "40@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "60@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "29.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "40.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "76.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "76@2x.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "pre-rendered" : true - } -} \ No newline at end of file diff --git a/src/flow/cmd/icons/default/ios/launch/1024x768.png b/src/flow/cmd/icons/default/ios/launch/1024x768.png deleted file mode 100644 index 1910d21..0000000 Binary files a/src/flow/cmd/icons/default/ios/launch/1024x768.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/launch/1024x768@2x.png b/src/flow/cmd/icons/default/ios/launch/1024x768@2x.png deleted file mode 100644 index 22a296e..0000000 Binary files a/src/flow/cmd/icons/default/ios/launch/1024x768@2x.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/launch/320x480@2x.png b/src/flow/cmd/icons/default/ios/launch/320x480@2x.png deleted file mode 100644 index d295af3..0000000 Binary files a/src/flow/cmd/icons/default/ios/launch/320x480@2x.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/launch/640x1136.png b/src/flow/cmd/icons/default/ios/launch/640x1136.png deleted file mode 100644 index 8a20a7c..0000000 Binary files a/src/flow/cmd/icons/default/ios/launch/640x1136.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/launch/768x1024.png b/src/flow/cmd/icons/default/ios/launch/768x1024.png deleted file mode 100644 index 8fa1429..0000000 Binary files a/src/flow/cmd/icons/default/ios/launch/768x1024.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/launch/768x1024@2x.png b/src/flow/cmd/icons/default/ios/launch/768x1024@2x.png deleted file mode 100644 index c9de05e..0000000 Binary files a/src/flow/cmd/icons/default/ios/launch/768x1024@2x.png and /dev/null differ diff --git a/src/flow/cmd/icons/default/ios/launch/Contents.json b/src/flow/cmd/icons/default/ios/launch/Contents.json deleted file mode 100644 index c956ae0..0000000 --- a/src/flow/cmd/icons/default/ios/launch/Contents.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "images" : [ - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "filename" : "320x480@2x.png", - "scale" : "2x" - }, - { - "extent" : "full-screen", - "idiom" : "iphone", - "subtype" : "retina4", - "filename" : "640x1136.png", - "minimum-system-version" : "7.0", - "orientation" : "portrait", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "filename" : "768x1024.png", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "filename" : "1024x768.png", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "filename" : "768x1024@2x.png", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "filename" : "1024x768@2x.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/src/flow/cmd/icons/icons.android.js b/src/flow/cmd/icons/icons.android.js deleted file mode 100644 index c8767d9..0000000 --- a/src/flow/cmd/icons/icons.android.js +++ /dev/null @@ -1,41 +0,0 @@ - -/* -drawable-mdpi/ 160 dpi (48x48px) -drawable-hdpi/ 240 dpi (72x72px) -drawable-xhdpi/ 320 dpi (96x96px) -drawable-xxhdpi/ 480 dpi (144x144px) -drawable-xxxhdpi/ 640 dpi (192x192px) -*/ - - -var util = require('../../util/util') - , cmd = require('../../util/process') - , path = require('path') - , fs = require('fs-extra') - -exports.convert = function(flow, icon, done) { - - var project = flow.project.prepared.source.project; - - var icon_folder = path.join(icon.source, 'android'); - var icon_output = path.join(flow.project.paths.build, flow.project.paths.android.project, 'res'); - - if(fs.existsSync(icon_folder)) { - - flow.log(3, 'icons / copy %s to %s', icon_folder, icon_output); - - flow.log(3,'icons - ok - copying to output folder'); - - util.copy_path(flow, icon_folder, icon_output); - - } else { - - flow.log(2,'icons - warning - icons node specified but no source file for android at %s', icon_folder); - - } - - if(done) { - done(); - } - -} //convert \ No newline at end of file diff --git a/src/flow/cmd/icons/icons.ios.js b/src/flow/cmd/icons/icons.ios.js deleted file mode 100644 index 3aa3391..0000000 --- a/src/flow/cmd/icons/icons.ios.js +++ /dev/null @@ -1,39 +0,0 @@ - -var util = require('../../util/util') - , cmd = require('../../util/process') - , path = require('path') - , fs = require('graceful-fs') - -exports.convert = function(flow, icon, done) { - - var project = flow.project.prepared.source.project; - - var project_folder = path.join(flow.project.root, flow.project.paths.ios.project, 'project'); - var icon_folder = path.join(icon.source, 'ios', 'icon'); - var launch_folder = path.join(icon.source, 'ios', 'launch'); - - var xcasset_folder = path.join(project_folder, 'Images.xcassets'); - var icon_output = path.join(xcasset_folder, 'AppIcon.appiconset/' ); - var launch_output = path.join(xcasset_folder, 'LaunchImage.launchimage/'); - - flow.log(3, 'icons / copy %s and %s to Images.xcassets in the build folder', icon_folder, launch_folder, icon_output); - - if(fs.existsSync(icon_folder)) { - util.copy_path(flow, icon_folder, icon_output); - flow.log(3,'icons - ok - copied icons to output folder'); - } else { - flow.log(2,'icons - cannot find the source icons at %s', icon_folder ); - } - - if(fs.existsSync(launch_folder)) { - util.copy_path(flow, launch_folder, launch_output); - flow.log(3,'icons - ok - copied launch to output folder'); - } else { - flow.log(2,'icons - cannot find the source launch images at %s', launch_folder ); - } - - if(done) { - done(); - } - -} //convert \ No newline at end of file diff --git a/src/flow/cmd/icons/icons.js b/src/flow/cmd/icons/icons.js index e31a259..80ec93a 100644 --- a/src/flow/cmd/icons/icons.js +++ b/src/flow/cmd/icons/icons.js @@ -2,8 +2,6 @@ var mac = require('./icons.mac') , web = require('./icons.web') - , ios = require('./icons.ios') - , android = require('./icons.android') , windows = require('./icons.windows') var internal = {}; @@ -39,17 +37,11 @@ exports.run = function run(flow, data, done) { case 'web': web.convert(flow, icon, done); break; - case 'ios': - ios.convert(flow, icon, done); - break; - case 'android': - android.convert(flow, icon, done); - break; case 'windows': windows.convert(flow, icon, done); break; default:{ - flow.log(2, 'no icon convert just yet for', flow.target); + flow.log(3, 'no icon step for', flow.target); if(done) { done(); } diff --git a/src/flow/cmd/launch/launch.native.js b/src/flow/cmd/launch/launch.native.js index 7cefd5f..ea5e23d 100644 --- a/src/flow/cmd/launch/launch.native.js +++ b/src/flow/cmd/launch/launch.native.js @@ -49,13 +49,13 @@ internal.launch = function(flow) { internal.android_launch_init(flow); - internal.install_android(flow, function(code) { - if(!code) { - internal.launch_android(flow); - } else { - flow.log(1, 'launch - stopping due to failure in install step'); - } - }); + // internal.install_android(flow, function(code) { + // if(!code) { + // internal.launch_android(flow); + // } else { + // flow.log(1, 'launch - stopping due to failure in install step'); + // } + // }); break; @@ -81,7 +81,7 @@ internal.android_launch_init = function(flow) { //work out where adb should be internal.adb_path = path.join(flow.config.build.android.sdk,'platform-tools/adb'); //find out if this is a signed or unsigned store build - internal.build_type = project.app.mobile.android.build_type; + internal.build_type = flow.flags['android-build-type'] || 'debug'; //work out the name of the apk internal.apk_name = project.app.name + '-' + internal.build_type + '.apk'; //work out the apk location diff --git a/src/flow/config.json b/src/flow/config.json index 7136f84..2204b5d 100644 --- a/src/flow/config.json +++ b/src/flow/config.json @@ -15,7 +15,7 @@ "command_line" : false, "icons_disable_default" : false, - "binary_source_name" : "{{packageClass app.boot}}{{app.debugtag}}", + "binary_source_name" : "{{app.name}}{{app.debugtag}}", "binary_dest_name" : "{{app.name}}", "binary_dest_path" : "{{paths.output}}", "files_dest_path" : "{{paths.output}}", @@ -27,18 +27,19 @@ "launch_wait" : 0.3 }, "windows" : { - "binary_source_name" : "{{packageClass app.boot}}{{app.debugtag}}.exe", + "binary_source_name" : "{{app.name}}{{app.debugtag}}.exe", "binary_dest_name" : "{{app.name}}.exe" }, "mac" : { + "project" : "mac.project", "binary_dest_path" : "{{paths.output}}/{{app.name}}.app/Contents/MacOS", "files_dest_path" : "{{paths.output}}/{{app.name}}.app/Contents/Resources" }, "ios" : { "project" : "ios.project", - "binary_source_name" : "lib{{packageClass app.boot}}{{app.debugtag}}.iphone{{app.iostag}}{{app.archtag}}.a", + "binary_source_name" : "lib{{app.name}}{{app.debugtag}}.iphone{{app.iostag}}{{app.archtag}}.a", "binary_dest_name" : "lib{{app.name}}.a", - "binary_dest_path" : "{{paths.ios.project}}/project/libs/{{app.arch}}", + "binary_dest_path" : "bin/ios.build/cpp/", "files_dest_path" : "{{paths.ios.project}}/project/assets" }, "android" : { @@ -49,12 +50,12 @@ "am":"ActivityManager", "ar":"AndroidRuntime", "exception":"Exception", "loader":"loader", "libc":"libc" }, - "project" : "project", - "activity_name" : "MainActivity", - "binary_source_name" : "lib{{packageClass app.boot}}{{app.debugtag}}{{app.archtag}}.so", + "project" : "android.project", + "activity_name" : "AppActivity", + "binary_source_name" : "lib{{app.name}}{{app.debugtag}}{{app.archtag}}.so", "binary_dest_name" : "lib{{app.name}}.so", - "binary_dest_path" : "{{paths.build}}/{{paths.android.project}}/libs/{{paths.android.libabi}}", - "files_dest_path" : "{{paths.build}}/{{paths.android.project}}/assets" + "binary_dest_path" : "{{paths.android.project}}/app/src/main/jniLibs/{{app.libabi}}", + "files_dest_path" : "{{paths.android.project}}/app/src/main/assets" }, "files_output_list" : false, diff --git a/src/flow/package.json b/src/flow/package.json index deb575c..ef9d19f 100644 --- a/src/flow/package.json +++ b/src/flow/package.json @@ -3,7 +3,7 @@ "name": "flow", "description": "flow is a haxe project build tool chain", "license": "MIT", - "version": "1.0.0-alpha.1", + "version": "1.0.0-alpha.2", "repository": "http://github.com/underscorediscovery/flow", "scripts": { "start": "flow.js" diff --git a/src/flow/project.defaults.json b/src/flow/project.defaults.json index 5834e98..394dbd8 100644 --- a/src/flow/project.defaults.json +++ b/src/flow/project.defaults.json @@ -14,30 +14,6 @@ "source_map_content" : true, "libs" : { } - }, - "mobile" : { - "fullscreen" : true, - "orientation" : "landscape", - "ios" : { - "devices" : "Universal", - "cpp" : "libc++", - "deployment_target" : "6.0", - "libs":{ - "native":{} - } - }, - "android" : { - "build_type" : "debug", - "install_location" : "preferExternal", - "libs":{ - "native":{} - }, - "sdk_min" : 12, - "sdk_target" : 19, - "permissions" : [], - "keystore_path" : "", - "keystore_alias" : "" - } } } } diff --git a/src/flow/project/prepare.js b/src/flow/project/prepare.js index 2f584b4..7f03a32 100644 --- a/src/flow/project/prepare.js +++ b/src/flow/project/prepare.js @@ -100,10 +100,12 @@ internal.prepare_config_paths = function(flow, prepared) { flow.project.paths = { android : { project : flow.config.build.android.project, libabi:'armeabi' }, ios : { project : flow.config.build.ios.project }, + mac : { project : flow.config.build.mac.project }, output : flow.project.get_path_output(flow, prepared), build : flow.project.get_path_build(flow, prepared) } + //:todo: this is the default, but the path context has its own libabi if(flow.target == 'android') { switch(flow.target_arch) { case 'x86': @@ -357,25 +359,6 @@ internal.prepare_conditionals = function(flow, prepared) { var node = prepared.source.if[condition]; - if(node.build && node.build.number) { - prepared.source.project.build.number = node.build.number; - } - - if(node.app && node.app.mobile) { - - if(node.app.mobile.ios) { - prepared.source.project.app.mobile.ios.libs = util.merge_unique(node.app.mobile.ios.libs, prepared.source.project.app.mobile.ios.libs); - } - if(node.app.mobile.android) { - prepared.source.project.app.mobile.android.libs = util.merge_unique(node.app.mobile.android.libs, prepared.source.project.app.mobile.android.libs); - - prepared.source.project.app.mobile.android.build_type = node.app.mobile.android.build_type; - prepared.source.project.app.mobile.android.keystore_path = node.app.mobile.android.keystore_path; - prepared.source.project.app.mobile.android.keystore_alias = node.app.mobile.android.keystore_alias; - } - - } //if app and app.mobile - } //if satisfied } //each condition } //if conditional node @@ -507,116 +490,6 @@ internal.prepare_web = function(flow, prepared) { internal.prepare_mobile = function(flow, prepared) { - //:todo: this might be better a general rule, but since it is for sure - // a problem on android it's better to short term notify users - - var _app_name = prepared.source.project.app.name; - if(_app_name) { - if(_app_name.indexOf(' ') != -1) { - return internal.fail(flow, prepared, 'project.app.name', 'project.app.name(`'+_app_name+'`) contains a space, which can easily cause problems especially on mobile platforms.'); - } - } - - //now we also handle any platform specifics that might need to be resolved to different values - //like orientations or device targets etc - - if(flow.target == 'ios') { - - //handle project lib as ldflag - var lib_ldflags = [prepared.source.project.app.name]; - //handle native libs as lib_ldflags - var libs = prepared.source.project.app.mobile.ios.libs; - if(libs) { - if(libs.native) { - for(name in libs.native) { - //generate a unique ID for this file reference - lib_ldflags.push(name); - } - } - } - - //add the -l parts - lib_ldflags = lib_ldflags.map(function(a) { return '-l \\"' + a +'\\"'; }); - //join with spaces - var _lib_ldflags = lib_ldflags.join(' '); - flow.log(3, 'prepare - ios ldflags set to `%s`', _lib_ldflags); - - prepared.source.project.app.mobile.ios.ldflags = _lib_ldflags; - - //handle conversion from named device target to enum for project file - switch(prepared.source.project.app.mobile.ios.devices) { - case 'Universal': - prepared.source.project.app.mobile.ios._devices = "1,2"; - break; - case 'iPhone': - prepared.source.project.app.mobile.ios._devices = 1; - break; - case 'iPad': - prepared.source.project.app.mobile.ios._devices = 2; - break; - } - - prepared.source.project.app.mobile._orientation = []; - switch(prepared.source.project.app.mobile.orientation) { - case 'landscape': - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationLandscapeRight'); - break; - case 'landscape left': - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationLandscapeLeft'); - break; - case 'landscape both': - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationLandscapeLeft'); - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationLandscapeRight'); - break; - case 'portrait': - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationPortrait'); - break; - case 'portrait upside down': - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationPortraitUpsideDown'); - break; - case 'portrait both': - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationPortrait'); - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationPortraitUpsideDown'); - break; - case 'both': - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationPortrait'); - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationLandscapeRight'); - break; - case 'all': - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationPortrait'); - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationPortraitUpsideDown'); - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationLandscapeRight'); - prepared.source.project.app.mobile._orientation.push('UIInterfaceOrientationLandscapeLeft'); - break; - } - - - } else if(flow.target == 'android') { //ios - - prepared.source.project.app.mobile._orientation = prepared.source.project.app.mobile.orientation; - - switch(prepared.source.project.app.mobile.orientation) { - case 'landscape left': - prepared.source.project.app.mobile._orientation = 'reverseLandscape'; - break; - case 'landscape both': - prepared.source.project.app.mobile._orientation = 'sensorLandscape'; - break; - case 'portrait upside down': - prepared.source.project.app.mobile._orientation = 'reversePortrait'; - break; - case 'portrait both': - prepared.source.project.app.mobile._orientation = 'sensorPortrait'; - break; - case 'both': - prepared.source.project.app.mobile._orientation = 'sensor'; - break; - case 'all': - prepared.source.project.app.mobile._orientation = 'fullSensor'; - break; - } - - } //android } //prepare_mobile @@ -654,29 +527,6 @@ internal.prepare_defines = function(flow, prepared) { var arch = 'arch-' + flow.target_arch; prepared.defines_all[arch] = { name:arch, met:true }; - if(flow.target == 'ios') { - - //ios has a special flag to handle the project folder generation, - //if this flag is give the framework can use it to write the project - var ios_project_path = path.resolve( flow.project.root, flow.config.build.ios.project ); - var ios_project_exists = fs.existsSync( ios_project_path ); - - if(flow.flags['xcode-project'] || !ios_project_exists) { - flow.log(2, 'project - ios xcode project will be generated at', ios_project_path); - prepared.defines_all['ios-xcode-project'] = { name:'ios-xcode-project', met:true }; - flow.project.skip_build = true; - } - - var allow_build = flow.flags['ios-allow-cli-build']; - - //if not running from xcode, and the project existed - if((!process.env['XCODE_VERSION_ACTUAL'] && ios_project_exists) && !allow_build) { - flow.project.skip_build = true; - flow.log(2, 'project - use xcode ios project at', ios_project_path); - } - - } //ios - if(flow.target == 'web') { if(prepared.source.project.app && prepared.source.project.app.web) { var embed_source_map = prepared.source.project.app.web.source_map_content; @@ -700,6 +550,12 @@ internal.prepare_defines = function(flow, prepared) { prepared.defines_all['debug'] = { name:'debug', met:true }; } + if(flow.target == 'mac' || flow.target == 'ios') { + if(process.env['XCODE_VERSION_ACTUAL']) { + prepared.defines_all['xcode-build'] = { name:'xcode-build', met:true }; + } + } + //look for command line defines, this must happen before parse, so they are met if(flow.flags.d) { @@ -936,6 +792,13 @@ internal.prepare_hooks = function(flow, prepared) { //prepare the app nodes that make sense internal.prepare_app = function(flow, prepared) { + var _app_name = prepared.source.project.app.name; + if(_app_name) { + if(_app_name.indexOf(' ') != -1) { + return internal.fail(flow, prepared, 'project.app.name', 'project.app.name(`'+_app_name+'`) contains a space, which is invalid. This is used for the binary name, and more on mobile.'); + } + } + //:todo:wip: //this may have side effects, will //do when can focus on it @@ -1019,23 +882,7 @@ internal.prepare_icons = function(flow, prepared) { internal.prepare_files = function(flow, prepared) { internal.log(flow, 3, 'prepare - files ...'); - - var projconf = flow.project.parsed.flow; - if(projconf) { - if(projconf.build && projconf.build.files_allow_unsafe_paths) { - internal.log(flow, 1, '>>>> prepare - files - IMPORTANT - project is explicitly allowing unsafe paths'); - - // if(flow.flags['files-allow-unsafe-paths']) { - prepared.files_unsafe = true; - // internal.log(flow, 1, '>>>> prepare - files - given both --files-allow-unsafe-paths and files_allow_unsafe_paths in config. unsafe paths are now enabled!'); - internal.log(flow, 1, '>>>> prepare - files - given files_allow_unsafe_paths in config. unsafe paths are now enabled!'); - // } else { - // return internal.fail(flow, prepared, 'files', 'prepare - files - unsafe paths requires the --files-allow-unsafe-paths flag as well as files_allow_unsafe_paths in the flow build config from the root project.'); - // } - - } - } - + var result = { build_files:[], project_files:[] } //some local helper functions diff --git a/src/flow/project/prepare/files.js b/src/flow/project/prepare/files.js index f58d864..49d0f87 100644 --- a/src/flow/project/prepare/files.js +++ b/src/flow/project/prepare/files.js @@ -35,20 +35,12 @@ exports.parse = function parse(flow, prepared, source, srcpath) { project_file_list = internal.append_source(flow, project_file_list, srcpath); build_file_list = internal.append_source(flow, build_file_list, srcpath); - //then filter unsafe/non-relative paths - project_file_list = internal.filter_unsafe(flow, prepared, project_file_list, srcpath, project_out, project_root); - build_file_list = internal.filter_unsafe(flow, prepared, build_file_list, srcpath, project_out, project_root); - } else { //first map it to the flow project root project_file_list = internal.append_source(flow, project_file_list, flow.project.root); build_file_list = internal.append_source(flow, build_file_list, flow.project.root); - //then filter unsafe/non-relative paths - project_file_list = internal.filter_unsafe(flow, prepared, project_file_list, project_root, project_out, project_root); - build_file_list = internal.filter_unsafe(flow, prepared, build_file_list, project_root, project_out, project_root); - } return { @@ -94,38 +86,6 @@ internal.append_source = function(flow, list, srcpath) { } //append_source -internal.filter_unsafe = function(flow, prepared, list, srcpath, dstpath, rootpath) { - - return list.filter(function(file){ - - var is_source_safe = true; - var is_dest_safe = true; - - var local_dest = path.join(dstpath, file.dest); - var abs_dest = path.resolve(rootpath, local_dest); - - var rel_src = path.relative(srcpath, file.source); - var rel_dst = path.relative(rootpath, local_dest); - - if(rel_src.indexOf('..') != -1) { - is_source_safe = false; - flow.log(2, '> - files - source file with unsafe path. %s not inside %s (becomes %s)', - file.source_name ? file.source_name : file.source, srcpath, file.source); - } - - if(rel_dst.indexOf('..') != -1) { - is_dest_safe = false; - flow.log(2, '> - files - dest file with unsafe path. %s not inside %s (becomes %s)', - file.dest, rootpath, abs_dest); - } - - var is_safe = (is_source_safe && is_dest_safe); - - return (is_safe || prepared.files_unsafe); - - }); - -} //filter_unsafe internal.parse_conditional_files = function(flow, prepared, source, file_list, build_file_list) { diff --git a/src/flow/project/project.js b/src/flow/project/project.js index fb174aa..ef04682 100644 --- a/src/flow/project/project.js +++ b/src/flow/project/project.js @@ -274,6 +274,20 @@ exports.get_path_context = function(flow, prepared, target_arch) { path_context.app.iostag = 'sim'; } + if(flow.target == 'android') { + switch(target_arch) { + case 'x86': + path_context.app.libabi = 'x86'; + break; + case 'armv7': + path_context.app.libabi = 'armeabi-v7a'; + break; + default: + path_context.app.libabi = 'armeabi'; + break; + } + } + switch(target_arch) { case 'arm64': case 'sim64': @@ -307,15 +321,6 @@ exports.get_path_root = function(flow, prepared, target_arch) { target_arch = exports.adjust_arch(flow, target_arch); var outpath = prepared.source.project.app.output; - var cli_outpath = flow.flags['output-path']; - if(cli_outpath) { - if(cli_outpath !== true) { - outpath = cli_outpath; - } else { - flow.log(2, 'project - warning - cli specified output-path without a value. ignoring!'); - } - } - return util.normalize(outpath, true); } //get_path_root @@ -331,6 +336,24 @@ exports.get_path_output = function(flow, prepared, target_arch) { dest_folder += '64'; } + if(flow.target == 'mac') { + var from_xcode = process.env['XCODE_VERSION_ACTUAL']; + if(from_xcode) { + dest_folder = process.env['TARGET_BUILD_DIR']; + flow.log(2, 'project - set build output path to Xcode build directory'); + flow.log(2, 'project - - `%s`', dest_folder); + } + } + + var cli_outpath = flow.flags['output-path']; + if(cli_outpath) { + if(cli_outpath !== true) { + dest_folder = cli_outpath; + } else { + flow.log(2, 'project - warning - cli specified output-path without a value. ignoring!'); + } + } + return util.normalize(dest_folder, true); } //get_path_output @@ -338,12 +361,17 @@ exports.get_path_output = function(flow, prepared, target_arch) { exports.get_path_build = function(flow, prepared, target_arch) { target_arch = exports.adjust_arch(flow, target_arch); - var dest_folder = exports.get_path_output(flow, prepared); + var dest_folder = exports.get_path_root(flow, prepared); - //remove trailing slash - dest_folder = dest_folder.slice(0, -1); + dest_folder = path.join(dest_folder, flow.target); + + if(flow.target_arch == '64') { + dest_folder += '64'; + } + + dest_folder += '.build'; - return util.normalize(dest_folder + '.build', true); + return util.normalize(dest_folder, true); } //get_path_build @@ -426,6 +454,7 @@ exports.get_path_binary_dest_full = function(flow, prepared, target_arch) { } //get_path_binary_full + exports.adjust_arch = function(flow, target_arch) { target_arch = target_arch || flow.target_arch; diff --git a/tests/flow.json b/tests/flow.json deleted file mode 100644 index fc3c934..0000000 --- a/tests/flow.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - name : 'test_flow', - version : '1.0.0', - author : 'snowkit', - - - build : { - - main : 'Main', - output : 'bin', - app : 'flow_test', - package : 'org.snowkit.flow', - certificates : ..., - flags : ..., - - sourcepaths : [ 'src' ], - - dependencies : { - snow : '*', - }, - - defines : ['test_def=2'], - if: { - "linux || windows || mac" : { - defines : ['threeos'] - }, - "mac && ios" : { - defines : ['impossible'] - }, - "one && two" : { - defines : ['has_one_and_two'] - }, - threeos : { - defines:['has_threeos'], - }, - mac : { - defines : ['is_mac', 'one=1'] - }, - is_mac : { - defines : ['has_is_mac', 'two=2'] - }, - derp : { - defines : ['has_is_mac'] - } - }, - - }, - - snow : { - window : { - - width : 960, - height : 640, - orientation : 'landscape', - fps : 60, - vsync : true, - resizable : true, - - if:{ - mobile : { fps:30 }, - android : { vsync:false }, - ios : { resizable:false } - }, - - unless:{ - windows : { } - } - - }, - - assets : { - path : 'config.json', - path : 'assets/sounds/ => sounds', - if:{ - android : { - path:'assets/sounds/android/ = > sounds' - } - } - } - - } - -} \ No newline at end of file