[macruby-changes] [417] MacRuby/trunk/lib/hotcocoa/application_builder.rb

source_changes at macosforge.org source_changes at macosforge.org
Sun Aug 10 23:57:55 PDT 2008


Revision: 417
          http://trac.macosforge.org/projects/ruby/changeset/417
Author:   rich at infoether.com
Date:     2008-08-10 23:57:55 -0700 (Sun, 10 Aug 2008)
Log Message:
-----------
add app manager code

Added Paths:
-----------
    MacRuby/trunk/lib/hotcocoa/application_builder.rb

Added: MacRuby/trunk/lib/hotcocoa/application_builder.rb
===================================================================
--- MacRuby/trunk/lib/hotcocoa/application_builder.rb	                        (rev 0)
+++ MacRuby/trunk/lib/hotcocoa/application_builder.rb	2008-08-11 06:57:55 UTC (rev 417)
@@ -0,0 +1,150 @@
+module HotCocoa
+  
+  class ApplicationBuilder
+    
+    ApplicationBundlePackage = "APPL????"
+    
+    attr_accessor :name, :require_file, :sources
+    
+    def self.build(build_options)
+      if build_options[:file]
+        require 'yaml'
+        build_options = YAML.load(File.read(build_options[:file]))
+      end
+      ab = new
+      ab.name = build_options[:name]
+      ab.require_file = build_options[:require]
+      build_options[:sources].each do |source|
+        ab << source
+      end
+      ab.build
+    end
+    
+    def initialize
+      @sources = []
+    end
+      
+    def build
+      build_bundle_structure
+      write_bundle_files
+      copy_sources
+    end
+    
+    def <<(source_file)
+      sources << source_file
+    end
+    
+    private
+    
+      def build_bundle_structure
+        Dir.mkdir(bundle_root)
+        Dir.mkdir(contents_root)
+        Dir.mkdir(macos_root)
+        Dir.mkdir(resources_root)
+      end
+      
+      def write_bundle_files
+        write_pkg_info_file
+        write_info_plist_file
+        build_executable
+        write_ruby_main
+      end
+      
+      def copy_sources
+        require 'fileutils'
+        FileUtils.cp_r sources, resources_root
+      end
+      
+      def write_pkg_info_file
+        File.open(pkg_info_file, "wb") {|f| f.write ApplicationBundlePackage}
+      end
+
+      def write_info_plist_file
+        File.open(info_plist_file, "w") do |f|
+          f.puts %{<?xml version="1.0" encoding="UTF-8"?>}
+          f.puts %{<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">}
+          f.puts %{<plist version="1.0">}
+          f.puts %{<dict>}
+          f.puts %{	<key>CFBundleDevelopmentRegion</key>}
+          f.puts %{	<string>English</string>}
+          f.puts %{	<key>CFBundleExecutable</key>}
+          f.puts %{	<string>#{name}</string>}
+          f.puts %{	<key>CFBundleIdentifier</key>}
+          f.puts %{	<string>com.yourcompany.#{name}</string>}
+          f.puts %{	<key>CFBundleInfoDictionaryVersion</key>}
+          f.puts %{	<string>6.0</string>}
+          f.puts %{	<key>CFBundleName</key>}
+          f.puts %{	<string>#{name}</string>}
+          f.puts %{	<key>CFBundlePackageType</key>}
+          f.puts %{	<string>APPL</string>}
+          f.puts %{	<key>CFBundleSignature</key>}
+          f.puts %{	<string>????</string>}
+          f.puts %{	<key>CFBundleVersion</key>}
+          f.puts %{	<string>1.0</string>}
+          f.puts %{	<key>NSPrincipalClass</key>}
+          f.puts %{	<string>NSApplication</string>}
+          f.puts %{</dict>}
+          f.puts %{</plist>}
+        end
+      end
+      
+      def build_executable
+        File.open(objective_c_source_file, "wb") do |f| 
+          f.puts %{
+            
+            #import <MacRuby/MacRuby.h>
+
+            int main(int argc, char *argv[])
+            {
+                return macruby_main("rb_main.rb", argc, argv);
+            }
+          }
+        end
+        `cd #{macos_root} && gcc main.m -o #{name} -arch ppc -arch i386 -framework MacRuby -framework Foundation -fobjc-gc-only`
+        File.unlink(objective_c_source_file)
+      end
+      
+      def write_ruby_main
+        File.open(main_ruby_source_file, "wb") do |f|
+          f.puts %{
+            $:.unshift NSBundle.mainBundle.resourcePath.fileSystemRepresentation
+            require '#{require_file}'
+          }
+        end
+      end
+      
+      def bundle_root
+        "#{name}.app"
+      end
+      
+      def contents_root
+        File.join(bundle_root, "Contents")
+      end
+      
+      def macos_root
+        File.join(contents_root, "MacOS")
+      end
+      
+      def resources_root
+        File.join(contents_root, "Resources")
+      end
+      
+      def info_plist_file
+        File.join(contents_root, "Info.plist")
+      end
+      
+      def pkg_info_file
+        File.join(contents_root, "PkgInfo")
+      end
+      
+      def objective_c_source_file
+        File.join(macos_root, "main.m")
+      end
+      
+      def main_ruby_source_file
+        File.join(resources_root, "rb_main.rb")
+      end
+
+  end
+  
+end
\ No newline at end of file
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080810/a6a4ca0d/attachment.html 


More information about the macruby-changes mailing list