asrake 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,74 @@
1
+ require 'rake/tasklib'
2
+
3
+ require 'asrake/base_compiler_args'
4
+
5
+ module ASRake
6
+ class BaseCompilerTask < Rake::TaskLib
7
+ include BaseCompilerArguments_Module
8
+
9
+ def initialize(name, args)
10
+ super()
11
+
12
+ self.merge_in args if args != nil
13
+
14
+ yield self if block_given?
15
+
16
+ @name = name
17
+
18
+ # create named task first so it gets the desc if one is added
19
+ Rake::Task.define_task @name
20
+
21
+ # if the task name is a hash (ie, has dependencies defined) make sure we pull out the task name from it
22
+ @name, _ = name.first if name.is_a? Hash
23
+
24
+ end
25
+
26
+ protected
27
+
28
+ def build
29
+ fail "build must be defined in subclass"
30
+ end
31
+
32
+ private
33
+
34
+ # Try to include helpful information about specific errors
35
+ def generate_error_message_tips(line)
36
+ advice = []
37
+ if((target_player == nil || Float(target_player) < 11) && line.include?("Error: Access of undefined property JSON"))
38
+ advice << "Be sure you are compiling with 'target_player' set to 11.0 or higher"
39
+ advice << "to have access to the native JSON parser. It is currently set to #{target_player}"
40
+ elsif line.include?("Error: The definition of base class Object was not found")
41
+ advice << "If you have removed the default flex-config by setting 'load_config' to"
42
+ advice << "an empty or alternate value (i.e., not appended to it) you must be sure to"
43
+ advice << "still reference the necessary core Flash files, especially playerglobal.swc"
44
+ end
45
+
46
+ if !advice.empty?
47
+ puts "*********************************"
48
+ puts "ASRake Note: " + advice.join("\n")
49
+ puts "*********************************"
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+
56
+ ##fill config with the default flex_config options
57
+ #if use_default_flex_config
58
+ # #initialize with default values from flex-config
59
+ # flex_config = Nokogiri::XML(File.read(FlexSDK::flex_config))
60
+ #
61
+ # target_player = flex_config.css('target-player').children.to_s
62
+ # swf_version = flex_config.css('swf-version').children.to_s
63
+ #
64
+ # flex_config.css('compiler external-library-path path-element').each { |ext|
65
+ # puts ext.children
66
+ # }
67
+ #end
68
+
69
+ #http://fpdownload.macromedia.com/get/flashplayer/updaters/11/playerglobal11_2.swc
70
+ #frameworks\libs\player
71
+
72
+ #-dump-config compiler_config.xml
73
+ #-link-report compiler_linkreport.xml
74
+ #-size-report compiler_sizereport.xml
@@ -0,0 +1,34 @@
1
+ require 'rake/tasklib'
2
+
3
+ module ASRake
4
+ class CleanTask < Rake::TaskLib
5
+
6
+ attr_accessor :clean_list
7
+ attr_accessor :clobber_list
8
+
9
+ def initialize(*args)
10
+
11
+ self.clean_list = FileList.new
12
+ self.clobber_list = FileList.new
13
+
14
+ args.each do |configArgs|
15
+ clean_list.include(File.join(configArgs.output_dir, "*"))
16
+ clean_list.exclude(configArgs.output)
17
+
18
+ clobber_list.include(File.join(configArgs.output_dir, "*"))
19
+ end
20
+
21
+ desc "Remove package results & build artifacts"
22
+ task :clean do
23
+ clean_list.each { |f| rm_r f rescue nil }
24
+ end
25
+
26
+ desc "Remove all build & package results"
27
+ # adding clean as a dependency in case anything is added to the clean task later
28
+ task :clobber => [:clean] do
29
+ clobber_list.each { |f| rm_r f rescue nil }
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,38 @@
1
+ require 'asrake/flexsdk'
2
+ require 'asrake/base_compiler_args'
3
+
4
+ module ASRake
5
+
6
+ module CompcArguments_Module
7
+ include BaseCompilerArguments_Module
8
+
9
+ def generate_args
10
+ compc = super
11
+
12
+ #compc << " -include-sources=#{cf source_path.join(',')}" if !source_path.empty?
13
+ self.source_path.each do |path|
14
+ compc << " -include-classes #{get_classes(path).join(' ')}"
15
+ end
16
+
17
+ return compc
18
+ end
19
+
20
+ def get_classes(path)
21
+ arr = []
22
+ Dir.chdir(path) do
23
+ FileList["**/*.as"].pathmap('%X').each do |file|
24
+ name = file.gsub(/^\.[\/\\]/, "").gsub(/[\/\\]/, ".")
25
+ yield name if block_given?
26
+ arr << name
27
+ end
28
+ end
29
+ return arr
30
+ end
31
+
32
+ end
33
+
34
+ class CompcArguments
35
+ include CompcArguments_Module
36
+ end
37
+
38
+ end
@@ -0,0 +1,52 @@
1
+ require 'rake/tasklib'
2
+
3
+ require 'asrake/host'
4
+ require 'asrake/base_compiler_task'
5
+ require 'asrake/compc_args'
6
+
7
+ module ASRake
8
+ class CompcTask < BaseCompilerTask
9
+ include CompcArguments_Module
10
+
11
+ # Create a swc compilation task with the given name.
12
+ def initialize(name = :build, args = nil)
13
+ super
14
+
15
+ # create directory task for output
16
+ directory self.output_dir
17
+
18
+ # create file task for output
19
+ file self.output => self.output_dir do
20
+ self.build
21
+ end
22
+
23
+ # set dependencies on all .as and .mxml files in the source paths
24
+ dependencies = FileList.new
25
+ source_path.each do |path|
26
+ path = cf path
27
+ dependencies.include(File.join(path, "*.as"))
28
+ dependencies.include(File.join(path, "*.mxml"))
29
+ dependencies.include(File.join(path, "**", "*.as"))
30
+ dependencies.include(File.join(path, "**", "*.mxml"))
31
+ end
32
+ file(self.output => dependencies) if !dependencies.empty?
33
+
34
+ # add output file task as a dependency to the named task created
35
+ task @name => self.output do
36
+ result = c self.output
37
+ result << " (#{File.size(output)} bytes)" unless self.output_is_dir?
38
+ puts result
39
+ end
40
+
41
+ end
42
+
43
+ protected
44
+
45
+ def build
46
+ run "#{FlexSDK::compc}#{generate_args}" do |line|
47
+ generate_error_message_tips(line)
48
+ end
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,87 @@
1
+ require 'rake/tasklib'
2
+
3
+ module ASRake
4
+ class CopyTask < Rake::TaskLib
5
+
6
+ attr_accessor :copy_list
7
+
8
+ def initialize(name = :copy)
9
+ self.copy_list = Hash.new
10
+
11
+ yield self if block_given?
12
+
13
+ #define named task first so if desc was called it will be attached to it instead of the file task
14
+ Rake::Task.define_task name do
15
+ # use longest source path to space the output. yup, seriously that OCD
16
+ len = self.copy_list.keys.group_by(&:size).max.last[0].length
17
+ self.copy_list.each do |from, to|
18
+ copy_files from, to
19
+ puts "Files copied. %#{len}s => %s" % [from, to]
20
+ end
21
+ end
22
+ end
23
+
24
+ def copy(from_path, to_path=nil)
25
+ if from_path == nil
26
+ fail puts "Cannot copy files. No source provided."
27
+ end
28
+
29
+ # special case getting a hash as an argument
30
+ if from_path.is_a? Hash
31
+ from_path.each {|from, to| copy from, to}
32
+ return
33
+ end
34
+
35
+ if to_path == nil
36
+ fail puts "Cannot copy files from #{from_path}. No destination provided."
37
+ end
38
+
39
+ self.copy_list[from_path] = to_path
40
+ end
41
+ alias_method :add, :copy
42
+
43
+ private
44
+
45
+ def copy_files(from_path, to_path, times=0)
46
+ from = FileList[from_path]
47
+ unless from.length == 0
48
+ from.each do |from|
49
+ if File.directory?(from)
50
+ #recurse the "from" dir tree, appending the path to to_path
51
+ Dir.foreach(from) do |fr|
52
+ if fr != ".." && fr != "."
53
+ #puts fr + "|" + File.join(from, fr) + "|" + File.join(to_path, fr)
54
+ copy_files(File.join(from, fr), File.join(to_path, fr), times+1)
55
+ end
56
+ end
57
+ else
58
+ # if this is the first iteration, we haven't gotten to join the "to" path in the directory loop above, so
59
+ # append it to the file here if either the to or from path are a directory
60
+ if times == 0 && (File.directory?(to_path) || File.directory?(from_path) || from_path =~ /\*/)
61
+ to = File.join(to_path, File.basename(from))
62
+ else
63
+ to = to_path
64
+ end
65
+
66
+ if !File.exists?(to) || (File.mtime(to.to_s) < File.mtime(from.to_s))
67
+ begin
68
+ dir = File.dirname(to)
69
+ mkdir_p(dir, :verbose => false) if !File.exist?(dir)
70
+ rescue
71
+ fail "Error copying #{from} to #{to}. Cannot create directory. #{$!}"
72
+ end
73
+ begin
74
+ cp_r from, to#, :verbose => false
75
+ rescue
76
+ fail "Error copying #{from} to #{to}. #{$!}"
77
+ end
78
+ end
79
+ end
80
+ end
81
+ else
82
+ puts "Error copying to #{to_path}. No files exist at source #{from_path}."
83
+ end
84
+ end
85
+
86
+ end
87
+ end
@@ -0,0 +1,81 @@
1
+ require 'asrake/host'
2
+
3
+ class FlexSDK
4
+ SDK_PATHS = []
5
+
6
+ class << self
7
+
8
+ @@initialized = false
9
+
10
+ @@executables = %w[adt adl asdoc mxmlc compc]
11
+ @@configs = %w[flex-config air-config]
12
+
13
+ def root
14
+ init()
15
+ return @root
16
+ end
17
+
18
+ @@configs.each do |name|
19
+ method = name.gsub('-','_')
20
+ define_method method do
21
+ init()
22
+ instance_variable_get "@#{method}"
23
+ end
24
+ end
25
+
26
+ @@executables.each do |name|
27
+ define_method name do
28
+ init()
29
+ instance_variable_get "@#{name}"
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def init()
36
+ if !@@initialized
37
+ @@root = nil
38
+
39
+ # Find where the flex sdk is installed
40
+ SDK_PATHS.each do |path|
41
+ #remove /bin/ fom the end of the path if it exists
42
+ path.sub!(/[\/\\]bin[\/\\]?$/,'')
43
+ if File.exists?(path)
44
+ allValid = true
45
+
46
+ @@configs.each do |name|
47
+ config = c File.join(path, 'frameworks', "#{name}.xml")
48
+ allValid = false if !File.exists?(config)
49
+ instance_variable_set "@#{name.gsub('-','_')}", config
50
+ end
51
+
52
+ @@executables.each do |name|
53
+ exec = c File.join(path, 'bin', name)
54
+ allValid = false if !File.exists?(exec)
55
+ instance_variable_set "@#{name}", exec
56
+ end
57
+
58
+ if allValid
59
+ @@root = path
60
+ break
61
+ end
62
+ end
63
+ end
64
+
65
+ if @@root == nil
66
+ str = ""
67
+ if !SDK_PATHS.empty?
68
+ str << "Could not find a valid Flex SDK at any of the paths in FlexSDK::SDK_PATHS\n=> "
69
+ str << SDK_PATHS.join("\n=> ")
70
+ str << "\n"
71
+ end
72
+ str << "Append a valid SDK path in your rakefile, e.g.:\nFlexSDK::SDK_PATHS << 'C:\\develop\\sdk\\flex_sdk_4.6.0.23201'"
73
+ str << "\nFor more information, see: http://adobe.com/go/flex_sdk/"
74
+ fail str
75
+ end
76
+ end
77
+ @@initialized = true
78
+ end
79
+ end
80
+
81
+ end
@@ -0,0 +1,46 @@
1
+ module OS
2
+ def OS.is_mac?
3
+ RUBY_PLATFORM.downcase.include?("darwin")
4
+ end
5
+
6
+ def OS.is_windows?
7
+ require 'rbconfig'
8
+ RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
9
+ end
10
+
11
+ def OS.is_linux?
12
+ RUBY_PLATFORM.downcase.include?("linux")
13
+ end
14
+ end
15
+
16
+ def run(command, abort_on_failure = true)
17
+ command.strip!
18
+
19
+ puts "> #{command}"
20
+ IO.popen("#{command} 2>&1") do |proc|
21
+ while !proc.closed? && (line = proc.gets)
22
+ puts "> #{line}"
23
+ yield line if block_given?
24
+ end
25
+ end
26
+
27
+ if $?.exitstatus != 0
28
+ msg = "Operation exited with status #{$?.exitstatus}"
29
+ fail msg if abort_on_failure
30
+ puts msg
31
+ end
32
+
33
+ return $?
34
+ end
35
+
36
+ def c(str)
37
+ OS::is_windows? ? cb(str) : cf(str)
38
+ end
39
+
40
+ def cb(str)
41
+ str.gsub("/", "\\")
42
+ end
43
+
44
+ def cf(str)
45
+ str.gsub("\\", "/")
46
+ end
@@ -0,0 +1,14 @@
1
+ require 'asrake/flexsdk'
2
+ require 'asrake/base_compiler_args'
3
+
4
+ module ASRake
5
+
6
+ module MxmlcArguments_Module
7
+ include BaseCompilerArguments_Module
8
+ end
9
+
10
+ class MxmlcArguments
11
+ include MxmlcArguments_Module
12
+ end
13
+
14
+ end
@@ -0,0 +1,37 @@
1
+ require 'rake/tasklib'
2
+
3
+ require 'asrake/host'
4
+ require 'asrake/base_compiler_task'
5
+ require 'asrake/mxmlc_args'
6
+
7
+ module ASRake
8
+ class MxmlcTask < BaseCompilerTask
9
+ include MxmlcArguments_Module
10
+
11
+ # Create a swc compilation task with the given name.
12
+ def initialize(name = :build, args = nil)
13
+ super
14
+
15
+ # create directory task for output
16
+ directory self.output_dir
17
+
18
+ # always build until we can properly grab dependencies
19
+ task @name => self.output_dir do
20
+ self.build
21
+ result = c self.output
22
+ result << " (#{File.size(output)} bytes)" unless self.output_is_dir?
23
+ puts result
24
+ end
25
+
26
+ end
27
+
28
+ protected
29
+
30
+ def build
31
+ run "#{FlexSDK::mxmlc}#{generate_args}" do |line|
32
+ generate_error_message_tips(line)
33
+ end
34
+ end
35
+
36
+ end
37
+ end