From b94afc9d3884899caf08d66c286e566288d760cc Mon Sep 17 00:00:00 2001 From: Mark Villacampa Date: Wed, 27 Aug 2014 03:52:57 +0200 Subject: [PATCH] Added support for loading target frameworks in extensions --- lib/motion/project/builder.rb | 2 +- lib/motion/project/target/framework_target.rb | 5 +++++ .../project/template/ios-extension-builder.rb | 17 +++++++++++++++++ lib/motion/project/xcode_config.rb | 1 + 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/motion/project/builder.rb b/lib/motion/project/builder.rb index 25589f29..272929f8 100644 --- a/lib/motion/project/builder.rb +++ b/lib/motion/project/builder.rb @@ -96,7 +96,7 @@ module Motion; module Project; # Prepare target frameworks target_frameworks = [] - config.targets.select { |t| t.type == :framework }.each do |target| + config.targets.select { |t| t.type == :framework && t.load? }.each do |target| target_frameworks << target.framework_name end end diff --git a/lib/motion/project/target/framework_target.rb b/lib/motion/project/target/framework_target.rb index 97c2bda1..721d7179 100644 --- a/lib/motion/project/target/framework_target.rb +++ b/lib/motion/project/target/framework_target.rb @@ -136,5 +136,10 @@ PLIST File.basename(framework_path) end + # Indicates wether to load the framework at runtime or not + def load? + @opts[:load] + end + end end;end \ No newline at end of file diff --git a/lib/motion/project/template/ios-extension-builder.rb b/lib/motion/project/template/ios-extension-builder.rb index 6718cefd..f9acf3d7 100644 --- a/lib/motion/project/template/ios-extension-builder.rb +++ b/lib/motion/project/template/ios-extension-builder.rb @@ -171,6 +171,13 @@ PLIST embedded_frameworks = external_frameworks = [] end + # Prepare target frameworks + target_frameworks = [] + config.targets.select { |t| t.type == :framework && t.load? }.each do |target| + target.build(platform) + target_frameworks << target.framework_name + end + # Build object files. objs_build_dir = File.join(build_dir, 'objs') FileUtils.mkdir_p(objs_build_dir) @@ -264,6 +271,8 @@ PLIST # Generate init file. init_txt = < + extern "C" { void ruby_sysinit(int *, char ***); void ruby_init(void); @@ -302,6 +311,14 @@ RubyMotionInit(int argc, char **argv) void *self = rb_vm_top_self(); EOS init_txt << config.define_global_env_txt + + unless target_frameworks.empty? + init_txt << "NSString *frameworks_path = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent: @\"../../Frameworks\"];\n" + target_frameworks.each do |framework| + init_txt << "[[NSBundle bundleWithPath: [frameworks_path stringByAppendingPathComponent: @\"#{framework}\"]] load];\n" + end + end + app_objs.each do |_, init_func| init_txt << "#{init_func}(self, 0);\n" end diff --git a/lib/motion/project/xcode_config.rb b/lib/motion/project/xcode_config.rb index a4b28b14..0b271ac9 100644 --- a/lib/motion/project/xcode_config.rb +++ b/lib/motion/project/xcode_config.rb @@ -463,6 +463,7 @@ EOS def target(path, type, opts={}) case type when :framework + opts[:load] = true unless opts[:load] == false @targets << Motion::Project::FrameworkTarget.new(path, type, self, opts) when :extension @targets << Motion::Project::ExtensionTarget.new(path, type, self, opts)