From 99aa2e640da065bda59381c03cbf67c4fbc55ece Mon Sep 17 00:00:00 2001 From: Laurent Sansonetti Date: Tue, 3 Jan 2012 19:17:36 +0100 Subject: [PATCH] introduce deployment_target project variable, misc fixes --- lib/motion/project.rb | 6 +-- lib/motion/project/builder.rb | 10 ++--- lib/motion/project/config.rb | 71 ++++++++++++++++++++++------------- 3 files changed, 52 insertions(+), 35 deletions(-) diff --git a/lib/motion/project.rb b/lib/motion/project.rb index 135ca005..b21d5ba7 100644 --- a/lib/motion/project.rb +++ b/lib/motion/project.rb @@ -27,11 +27,11 @@ end desc "Run the simulator" task :simulator => ['build:simulator'] do app = App.config.app_bundle('iPhoneSimulator') - sdk_version = App.config.sdk_version + target = App.config.deployment_target # Cleanup the simulator application sandbox, to avoid having old resource files there. if ENV['clean'] - sim_apps = File.expand_path("~/Library/Application Support/iPhone Simulator/#{sdk_version}/Applications") + sim_apps = File.expand_path("~/Library/Application Support/iPhone Simulator/#{target}/Applications") Dir.glob("#{sim_apps}/**/*.app").each do |app_bundle| if File.basename(app_bundle) == File.basename(app) rm_rf File.dirname(app_bundle) @@ -52,7 +52,7 @@ task :simulator => ['build:simulator'] do sim = File.join(App.config.bindir, 'sim') debug = (ENV['debug'] || '0') == '1' ? 1 : 0 App.info 'Simulate', app - sh "#{sim} #{debug} #{family_int} #{sdk_version} \"#{app}\"" + sh "#{sim} #{debug} #{family_int} #{target} \"#{app}\"" end desc "Create an .ipa archive" diff --git a/lib/motion/project/builder.rb b/lib/motion/project/builder.rb index 6f81dd71..c46c54c5 100644 --- a/lib/motion/project/builder.rb +++ b/lib/motion/project/builder.rb @@ -23,7 +23,7 @@ module Motion; module Project; cc = File.join(config.platform_dir(platform), 'Developer/usr/bin/gcc') cxx = File.join(config.platform_dir(platform), 'Developer/usr/bin/g++') - build_dir = File.join(config.build_dir, platform) + build_dir = File.join(config.versionized_build_dir, platform) # Prepare the list of BridgeSupport files needed. bs_files = config.bridgesupport_files @@ -37,7 +37,7 @@ module Motion; module Project; end # Build object files. - objs_build_dir = File.join(build_dir, config.sdk_version + '-sdk-objs') + objs_build_dir = File.join(build_dir, 'objs') FileUtils.mkdir_p(objs_build_dir) project_file_changed = File.mtime(config.project_file) > File.mtime(objs_build_dir) build_file = Proc.new do |path| @@ -232,7 +232,7 @@ EOS main_o = File.join(objs_build_dir, 'main.o') if !(File.exist?(main) and File.exist?(main_o) and File.read(main) == main_txt) File.open(main, 'w') { |io| io.write(main_txt) } - sh "#{cxx} \"#{main}\" #{arch_flags} -fexceptions -fblocks -isysroot \"#{sdk}\" -miphoneos-version-min=#{config.sdk_version} -fobjc-legacy-dispatch -fobjc-abi-version=2 -c -o \"#{main_o}\"" + sh "#{cxx} \"#{main}\" #{arch_flags} -fexceptions -fblocks -isysroot \"#{sdk}\" -miphoneos-version-min=#{config.deployment_target} -fobjc-legacy-dispatch -fobjc-abi-version=2 -c -o \"#{main_o}\"" end # Prepare bundle. @@ -256,7 +256,7 @@ EOS stubs_obj = File.join(datadir, platform, "#{framework}_stubs.o") framework_stubs_objs << "\"#{stubs_obj}\"" if File.exist?(stubs_obj) end - sh "#{cxx} -o \"#{main_exec}\" #{objs_list} #{arch_flags} #{framework_stubs_objs.join(' ')} -isysroot \"#{sdk}\" -miphoneos-version-min=#{config.sdk_version} -L#{File.join(datadir, platform)} -lmacruby-static -lobjc -licucore #{frameworks} #{config.libs.join(' ')} #{vendor_libs.map { |x| '-force_load ' + x }.join(' ')}" + sh "#{cxx} -o \"#{main_exec}\" #{objs_list} #{arch_flags} #{framework_stubs_objs.join(' ')} -isysroot \"#{sdk}\" -miphoneos-version-min=#{config.deployment_target} -L#{File.join(datadir, platform)} -lmacruby-static -lobjc -licucore #{frameworks} #{config.libs.join(' ')} #{vendor_libs.map { |x| '-force_load ' + x }.join(' ')}" end # Create bundle/Info.plist. @@ -369,7 +369,7 @@ PLIST if File.mtime(config.project_file) > File.mtime(bundle_path) \ or !system("#{codesign_cmd} --verify \"#{bundle_path}\" >& /dev/null") App.info 'Codesign', bundle_path - entitlements = File.join(config.build_dir, platform, "Entitlements.plist") + entitlements = File.join(config.versionized_build_dir, platform, "Entitlements.plist") File.open(entitlements, 'w') { |io| io.write(config.entitlements_data) } sh "#{codesign_cmd} -f -s \"#{config.codesign_certificate}\" --resource-rules=\"#{resource_rules_plist}\" --entitlements #{entitlements} \"#{bundle_path}\"" end diff --git a/lib/motion/project/config.rb b/lib/motion/project/config.rb index 02fed47a..3164a114 100644 --- a/lib/motion/project/config.rb +++ b/lib/motion/project/config.rb @@ -24,11 +24,11 @@ module Motion; module Project end end - variable :files, :platforms_dir, :sdk_version, :frameworks, :libs, - :delegate_class, :name, :build_dir, :resources_dir, :specs_dir, - :identifier, :codesign_certificate, :provisioning_profile, :device_family, - :interface_orientations, :version, :icons, :prerendered_icon, :seed_id, - :entitlements + variable :files, :platforms_dir, :sdk_version, :deployment_target, + :frameworks, :libs, :delegate_class, :name, :build_dir, :resources_dir, + :specs_dir, :identifier, :codesign_certificate, :provisioning_profile, + :device_family, :interface_orientations, :version, :icons, + :prerendered_icon, :seed_id, :entitlements def initialize(project_dir) @project_dir = project_dir @@ -74,28 +74,39 @@ module Motion; module Project App.fail "Can't locate #{platform} SDK #{sdk_version} at `#{sdk_path}'" end end + + # deployment_target + if deployment_target > sdk_version + App.fail "Deployment target `#{deployment_target}' must be equal or lesser than SDK version `#{sdk_version}'" + end unless File.exist?(datadir) - App.fail "iOS SDK #{sdk_version} is not supported by this version of RubyMotion" + App.fail "iOS deployment target #{deployment_target} is not supported by this version of RubyMotion" end end def build_dir - tried = false - begin - FileUtils.mkdir_p(@build_dir) - rescue Errno::EACCES - raise if tried - require 'digest/sha1' - hash = Digest::SHA1.hexdigest(File.expand_path(project_dir)) - tmp = File.join(ENV['TMPDIR'], hash) - App.warn "Cannot create build_dir `#{@build_dir}'. Check the permissions. Using a temporary build directory instead: `#{tmp}'" - @build_dir = tmp - tried = true - retry + unless File.directory?(@build_dir) + tried = false + begin + FileUtils.mkdir_p(@build_dir) + rescue Errno::EACCES + raise if tried + require 'digest/sha1' + hash = Digest::SHA1.hexdigest(File.expand_path(project_dir)) + tmp = File.join(ENV['TMPDIR'], hash) + App.warn "Cannot create build_dir `#{@build_dir}'. Check the permissions. Using a temporary build directory instead: `#{tmp}'" + @build_dir = tmp + tried = true + retry + end end @build_dir end + def versionized_build_dir + File.join(build_dir, deployment_target) + end + attr_reader :project_dir def project_file @@ -190,8 +201,8 @@ module Motion; module Project File.join(motiondir, 'bin') end - def datadir - File.join(motiondir, 'data', sdk_version) + def datadir(target=deployment_target) + File.join(motiondir, 'data', target) end def platform_dir(platform) @@ -205,28 +216,34 @@ module Motion; module Project end if versions.size == 0 App.fail "Can't find an iOS SDK in `#{platforms_dir}'" - #elsif versions.size > 1 - # $stderr.puts "found #{versions.size} SDKs, will use the latest one" end - versions.max + supported_vers = versions.reverse.find { |vers| File.exist?(datadir(vers)) } + unless supported_vers + App.fail "RubyMotion doesn't support any of these SDK versions: #{versions.join(', ')}" + end + supported_vers end end + def deployment_target + @deployment_target ||= @sdk_version + end + def sdk(platform) File.join(platform_dir(platform), 'Developer/SDKs', platform + sdk_version + '.sdk') end def app_bundle(platform) - File.join(@build_dir, platform, @name + '.app') + File.join(versionized_build_dir, platform, @name + '.app') end def app_bundle_dsym(platform) - File.join(@build_dir, platform, @name + '.dSYM') + File.join(versionized_build_dir, platform, @name + '.dSYM') end def archive - File.join(@build_dir, @name + '.ipa') + File.join(versionized_build_dir, @name + '.ipa') end def identifier @@ -263,7 +280,7 @@ module Motion; module Project def info_plist @info_plist ||= { 'BuildMachineOSBuild' => `sw_vers -buildVersion`.strip, - 'MinimumOSVersion' => sdk_version, + 'MinimumOSVersion' => deployment_target, 'CFBundleDevelopmentRegion' => 'en', 'CFBundleName' => @name, 'CFBundleDisplayName' => @name,