flak 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/.gitignore +1 -0
  2. data/.yardoc/checksums +28 -0
  3. data/.yardoc/objects/root.dat +0 -0
  4. data/.yardoc/proxy_types +0 -0
  5. data/.yardopts +1 -0
  6. data/Architecture.md +152 -0
  7. data/Documenting.md +2 -0
  8. data/MayaModules.md +2 -0
  9. data/README.md +173 -0
  10. data/flak.gemspec +6 -3
  11. data/lib/core_ext/hash.rb +82 -0
  12. data/lib/core_ext/string.rb +41 -0
  13. data/lib/flak.rb +20 -12
  14. data/lib/flak/rake/errors.rb +28 -0
  15. data/lib/flak/rake/file_actions.rb +70 -0
  16. data/lib/flak/rake/os.rb +18 -0
  17. data/lib/flak/rake/target.rb +47 -69
  18. data/lib/flak/rake/templates/cpp.rb +211 -0
  19. data/lib/flak/rake/templates/delight.rb +168 -0
  20. data/lib/flak/rake/templates/doc.rb +106 -0
  21. data/lib/flak/rake/templates/environment.rb +189 -0
  22. data/lib/flak/rake/templates/gl.rb +20 -0
  23. data/lib/flak/rake/templates/mac.rb +29 -0
  24. data/lib/flak/rake/templates/max.rb +22 -0
  25. data/lib/flak/rake/templates/maya.rb +172 -0
  26. data/lib/flak/rake/templates/maya_app.rb +97 -0
  27. data/lib/flak/rake/templates/maya_plugin.rb +93 -0
  28. data/lib/flak/rake/templates/merge_engine.rb +45 -0
  29. data/lib/flak/rake/templates/nuke.rb +60 -0
  30. data/lib/flak/rake/templates/release.rb +101 -0
  31. data/lib/flak/rake/templates/shell.rb +54 -0
  32. data/lib/flak/thor/cli.rb +5 -0
  33. data/lib/flak/thor/generate.rb +88 -144
  34. data/lib/flak/thor/target_file.rb +36 -17
  35. data/lib/flak/thor/templates/INSTALL.tt +3 -3
  36. data/lib/flak/thor/templates/Rakefile.tt +4 -2
  37. data/lib/flak/thor/templates/{cpp.tt → config/cpp.yml.tt} +6 -8
  38. data/lib/flak/thor/templates/{delight.tt → config/delight.yml.tt} +1 -1
  39. data/lib/flak/thor/templates/{doc.tt → config/doc.yml.tt} +0 -0
  40. data/lib/flak/thor/templates/{env.tt → config/environment.yml.tt} +6 -7
  41. data/lib/flak/thor/templates/{gl.tt → config/gl.yml.tt} +0 -0
  42. data/lib/flak/thor/templates/{mac.tt → config/mac.yml.tt} +0 -0
  43. data/lib/flak/thor/templates/{max.tt → config/max.yml.tt} +0 -0
  44. data/lib/flak/thor/templates/{maya.tt → config/maya.yml.tt} +9 -1
  45. data/lib/flak/thor/templates/{maya_app.tt → config/maya_app.yml.tt} +0 -2
  46. data/lib/flak/thor/templates/{maya_plugin.tt → config/maya_plugin.yml.tt} +0 -2
  47. data/lib/flak/thor/templates/config/nuke.yml.tt +3 -0
  48. data/lib/flak/thor/templates/config/release.yml.tt +3 -0
  49. data/lib/flak/thor/templates/config/shell.yml.tt +1 -0
  50. data/lib/flak/thor/templates/doc/content/install_guide.txt.tt +71 -25
  51. data/lib/flak/thor/templates/maya_plugin_cpp.tt +37 -0
  52. data/lib/flak/thor/templates/name_cpp.tt +6 -0
  53. data/lib/flak/thor/templates/name_h.tt +34 -0
  54. data/lib/flak/thor/templates/product.sh.tt +2 -2
  55. data/lib/flak/thor/wizard.rb +28 -15
  56. data/lib/flak/version.rb +1 -1
  57. data/target.jpg +0 -0
  58. metadata +127 -94
  59. data/README.textile +0 -59
  60. data/lib/flak/rake/base.rb +0 -316
  61. data/lib/flak/rake/cpp.rb +0 -139
  62. data/lib/flak/rake/delight.rb +0 -121
  63. data/lib/flak/rake/doc.rb +0 -69
  64. data/lib/flak/rake/gl.rb +0 -10
  65. data/lib/flak/rake/mac.rb +0 -23
  66. data/lib/flak/rake/max.rb +0 -29
  67. data/lib/flak/rake/maya.rb +0 -142
  68. data/lib/flak/rake/maya_app.rb +0 -45
  69. data/lib/flak/rake/maya_plugin.rb +0 -47
  70. data/lib/flak/rake/mod.rb +0 -46
  71. data/lib/flak/rake/nuke.rb +0 -29
  72. data/lib/flak/thor/templates/mod.tt +0 -0
  73. data/lib/flak/thor/templates/nuke.tt +0 -2
@@ -1,5 +1,46 @@
1
1
  class String
2
+
3
+ # Find words, capitalize and join
4
+ # @return [String] camel cased string
2
5
  def camelize
3
6
  self.split(/[^a-z0-9]/i).map{|w| w.capitalize}.join
4
7
  end
8
+
9
+
10
+
11
+ # Find words breaks and insert underscores
12
+ # @return [String] underscorized string
13
+ def underscoreize
14
+ self.gsub(/::/, '/').
15
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
16
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
17
+ tr("-", "_").
18
+ downcase
19
+ end
20
+
21
+
22
+
23
+
24
+ # Remove the erb extension if there is one
25
+ # @return [String] string with no erb extension
26
+ def no_erb
27
+ self.sub(/\.erb$/,'')
28
+ end
29
+
30
+
31
+ # Replace dollar-curly braces, with
32
+ # the value of environment variable
33
+ # @return [String] string with all environment variables replaced
34
+ def substitute_env_vars
35
+ str = String.new(self)
36
+ str.scan(/\$\{([A-Z][A-Z,0-9,_]*)\}/).uniq.each do |m|
37
+ begin
38
+ str.gsub!("${#{m[0]}}", ENV[m[0]])
39
+ rescue
40
+ $stderr.puts "problem with enviroment variable #{m[0]}."
41
+ end
42
+ end
43
+ str
44
+ end
45
+
5
46
  end
data/lib/flak.rb CHANGED
@@ -10,20 +10,28 @@ require "thor/group"
10
10
  require "ap"
11
11
  require 'nanoc'
12
12
  require 'core_ext/string'
13
+ require 'core_ext/hash'
13
14
 
14
- require 'flak/rake/cpp'
15
- require 'flak/rake/delight'
16
- require 'flak/rake/doc'
17
- require 'flak/rake/gl'
18
- require 'flak/rake/mac'
19
- require 'flak/rake/max'
20
- require 'flak/rake/maya'
21
- require 'flak/rake/maya_app'
22
- require 'flak/rake/maya_plugin'
23
- require 'flak/rake/nuke'
15
+
16
+ require 'flak/rake/file_actions'
17
+ require 'flak/rake/os'
18
+ require 'flak/rake/errors'
24
19
  require 'flak/rake/target'
25
- require 'flak/rake/base'
26
- require 'flak/rake/mod'
20
+
21
+ require 'flak/rake/templates/merge_engine'
22
+
23
+ require 'flak/rake/templates/environment'
24
+ require 'flak/rake/templates/maya'
25
+ require 'flak/rake/templates/nuke'
26
+ require 'flak/rake/templates/release'
27
+ require 'flak/rake/templates/doc'
28
+ require 'flak/rake/templates/maya_plugin'
29
+ require 'flak/rake/templates/maya_app'
30
+ require 'flak/rake/templates/shell'
31
+ require 'flak/rake/templates/gl'
32
+ require 'flak/rake/templates/delight'
33
+ require 'flak/rake/templates/cpp'
34
+
27
35
 
28
36
  require 'flak/version'
29
37
  require 'flak/thor/wizard'
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+
3
+ module Flak
4
+
5
+ # Module that contains flak error functions
6
+ module Errors
7
+
8
+
9
+
10
+ # Assert that a variable exists and has the correct type.
11
+ # Prints a bright red informative message if not.
12
+ # @param var [String] the variable's name
13
+ # @param type [String] the variable's type
14
+ # @param bind [Binding] the binding for the calling object so that the variable can be evaluated.
15
+ # @param file [String] the filename where the call for this assertion came from.
16
+ # @return [String] formatted error message.
17
+ def self.assert(var, type, bind, file)
18
+ param = eval(var,bind)
19
+ ap "#{var} is not a #{type}. It is a #{param.class}. (#{File.basename(file)})" , :color => {:string => :red} unless param.class == Kernel.const_get(type)
20
+ end
21
+
22
+
23
+
24
+
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,70 @@
1
+ module Flak
2
+
3
+ module FileActions
4
+
5
+
6
+
7
+
8
+ # in order to make a symlink, we need to remove it
9
+ # if it already exists
10
+
11
+
12
+ # Create a symlink.
13
+ # Remove it if it already exists.
14
+ # @param target_file [String] the file to point the new file at.
15
+ # @param new_file [String] the new file.
16
+ def rebuild_symlink(target_file,new_file)
17
+ if File.symlink?(new_file)
18
+ File.unlink(new_file)
19
+ end
20
+ File.symlink(target_file, new_file)
21
+ end
22
+
23
+
24
+
25
+
26
+ # Remove a file and copy a new file over.
27
+ # If we just copy source to destination and destination exists and is a directory,
28
+ # then the src is put in the destination, as opposed to overwriting it. For
29
+ # this reason, we delete destination first.
30
+ # @param source [String] the source file.
31
+ # @param destination [String] the destination file.
32
+ def remove_and_copy(source,destination)
33
+ remove_file(destination, true)
34
+ cp_r source, destination
35
+ end
36
+
37
+
38
+
39
+
40
+ # Make a directory to contain a file.
41
+ # Create directories recursively if necessary.
42
+ # @param file [String] the file that needs a directory.
43
+ def make_directory_for(file)
44
+ FileUtils.mkdir_p file.pathmap('%d')
45
+ end
46
+
47
+
48
+
49
+ # Create a destination file by filtering a source file through ERB.
50
+ # @param erb_file [String] the file to be filtered.
51
+ # @param released_file [String] the result filename.
52
+ # @param opts [Hash] the options.
53
+ # @option opts :chmod [String] The file mode.
54
+ def write_erb_template(erb_file,released_file, opts={})
55
+ if (!(opts[:no_force] && File.exists?(released_file) ))
56
+ template = ERB.new( File.read(erb_file) , 0, "%<>")
57
+ File.open(released_file, 'w') do |f|
58
+ puts "template #{erb_file} #{released_file}"
59
+ f.puts(template.result(binding))
60
+ f.chmod(opts[:chmod].to_i) if opts[:chmod]
61
+ end
62
+ end
63
+ end
64
+
65
+
66
+ end
67
+
68
+
69
+
70
+ end
@@ -0,0 +1,18 @@
1
+ module Flak
2
+ # Provide a slightly nicer OS string than the
3
+ # RUBY_PLATFORM variable
4
+ # @return [String] Either 'linux_64', 'linux_32', 'darwin', or 'win_64'
5
+ def self.os
6
+ case RUBY_PLATFORM
7
+ when /64-linux/
8
+ 'linux_64'
9
+ when /i686_linux/
10
+ 'linux_32'
11
+ when /darwin/
12
+ 'darwin'
13
+ when /i386-cygwin/
14
+ 'win_64'
15
+ end
16
+ end
17
+
18
+ end
@@ -1,110 +1,88 @@
1
1
  # This is where we prepare a target.
2
- # The target will "inherit" settings and instance methods from modules specified in the target.yml file
2
+ # The target will "get" settings and methods from modules specified in the target.yml file
3
+
3
4
  module Flak
4
5
 
5
6
  class Target
6
7
 
8
+ include Flak::FileActions
9
+
7
10
  attr_accessor :settings
8
11
 
9
- def initialize(root, target_file=nil)
12
+ # Constructs a target object.
13
+ #
14
+ # @param root [String] the directory containing the Rakefile.
15
+ # @param target_file [String] the root-relative file that specifies how to build this target. Either project.yml or tool.yml
16
+ def initialize(root, target_file)
10
17
 
11
- @settings = Hash.new
12
- # start building the settings hash
13
- # need the config settings to bootstrap the process
14
- self.extend( Flak::Base )
18
+ tmp_env = YAML::load_file( root + '/config/environment.yml' )
19
+ tmp_goal = YAML::load_file( target_file )
20
+
21
+ @settings = Hash.new
22
+ @settings[:configuration] = tmp_env['configuration']
23
+ @settings[:templates] = tmp_goal['templates']
24
+ @settings[:os] = Flak.os
15
25
  @settings[:root] = root
26
+ @settings[:target_file] = target_file
27
+ @settings[:full_target_file] = File.join(@settings[:root], target_file )
28
+ @settings[:relative_goal_root] = File.dirname(target_file)
29
+ @settings[:goal_root] = File.dirname( @settings[:full_target_file] )
30
+ @settings[:templates] = (["environment"] | @settings[:templates])
16
31
 
17
- tmp = YAML::load_file( @settings[:root] + '/config/env.yml' )
18
- @settings[:configuration] = tmp['configuration']
19
- @settings[:os] = Flak::Base.os
20
-
21
- # settings goes in as config and os, and comes back fully resolved
22
-
23
- h = Hash.new
24
-
25
- @settings = Flak::Base.resolve_settings(@settings)
32
+ end
26
33
 
27
34
 
28
- if File.exists?(target_file)
29
- @settings[:target_file] = target_file
30
- @settings[:target_dir] = File.dirname(target_file)
35
+ # After the Target has been constructed, generate settings and tasks.
36
+ def build
37
+ generate_settings
38
+ generate_tasks
39
+ end
31
40
 
32
- @settings[:target_root] = File.join(@settings[:root], @settings[:target_dir] )
33
41
 
34
- # to find out what templates to use, we need to look in the target.yml
35
- h = YAML::load_file( target_file )
36
- template_array = h['templates'] || []
42
+ # Extend this Target with settings and methods from templates declared in the target file
43
+ def generate_settings
37
44
 
38
- # after integrate templates is done, all the settings in those
39
- # templates will be flattened and merged into the settings hash
40
- integrate_templates template_array
45
+ @settings[:templates].each do |template_name|
46
+ mod = Flak::Template.const_get("#{template_name.camelize}")
47
+ mod = mod.const_get("Settings")
48
+ raise TypeError, "#{mod.inspect} must be a Module" unless mod.kind_of? Module
49
+ self.extend( mod )
41
50
  end
42
51
 
43
- # now merge the settings from this target
44
- @settings = Flak::Base.merge_settings(@settings, Target.resolve_settings(@settings))
45
-
52
+ yml = Flak::Template::MergeEngine.flatten_yaml_file(@settings, @settings[:target_file])
53
+ @settings = @settings.flak_merge(yml)
46
54
  expand_filelists
47
- instance_tasks
48
- end
49
-
50
-
51
- def self.resolve_settings(existing_settings)
52
- Flak::Base.flatten_settings(existing_settings[:target_file], existing_settings[:configuration],existing_settings[:os] )
55
+
53
56
  end
54
57
 
55
58
 
59
+ # Extend this Target with tasks from templates declared in the target file
60
+ def generate_tasks
56
61
 
57
- # Integrate the templates into the target,
58
- # The templates are modules and by "integrating templates", we are:
59
- # 1. extending (picking up the module's instance methods)
60
- # 2. then we build our own @settings instance data by merging in the settings from the modules
61
- # See the merge settings method in base for details of the merging strategy
62
- def integrate_templates(template_array)
63
- template_array.each do |template_name|
64
- mod = Flak.const_get(template_name.split('_').collect {|w| w.capitalize}.join())
65
- unless mod.kind_of? Module
66
- raise TypeError, "#{mod.inspect} must be a Module"
67
- end
62
+ @settings[:templates].each do |template_name|
63
+ mod = Flak::Template.const_get("#{template_name.camelize}")
64
+ mod = mod.const_get("Tasks")
65
+ raise TypeError, "#{mod.inspect} must be a Module" unless mod.kind_of? Module
68
66
  self.extend( mod )
69
- @settings = Flak::Base.merge_settings(@settings, mod.resolve_settings(@settings))
70
67
  end
71
- end
72
68
 
73
-
74
-
75
- # run all task synthesis methods that have been mixed in to this instance
76
- # the convention is to name these tasks <filename>_instance_tasks in the module files
77
- # in which they are defined.
78
- # only make tasks if the target has a name - a target with no has probably been limited
79
- # to only generate tasks for a specific OS (or configuration)
80
- def instance_tasks
81
- unless (@settings[:name].nil?)
82
- self.public_methods.grep(/_instance_tasks/).each do |t|
83
- self.send t
84
- end
85
- end
86
69
  end
87
70
 
88
71
 
89
72
 
90
73
  private
91
74
 
92
- # resolve filename globs and prepend target_dir to file globs
93
- # and path arrays. Its important that when specifying files in
94
- #the yaml, the user sets the key names to be "<something>_files"
95
- # or "<something>_paths".
96
- # If the path given is relative, we prepend the path to
97
- # the target file (target_dir) so that Rake has somewhere to work from
75
+ # Expand FileList objects into arrays so that calling inspect on a target gives a more readable output.
98
76
  def expand_filelists
99
77
  @settings.each do |k,v|
100
78
  if k.to_s =~ /_files$|_paths$/
101
79
  unless v.nil?
102
- v = v.collect { |el| (el[0] == '/') || (el[1] ==":") ? el : File.join(@settings[:target_dir],el) }
103
- @settings[(k.to_sym)] = k.to_s =~ /_files$/ ? FileList[v] : v
80
+ v = v.collect { |el| (el[0] == '/') || (el[1] ==":") ? el : File.join(@settings[:relative_goal_root],el) }
81
+ @settings[(k.to_sym)] = k.to_s =~ /_files$/ ? FileList[v].to_a : v
104
82
  end
105
83
  end
106
84
  end
107
85
  end
108
-
86
+
109
87
  end
110
88
  end
@@ -0,0 +1,211 @@
1
+ module Flak::Template
2
+ module Cpp
3
+
4
+ module Settings
5
+
6
+ extend Flak::Template::MergeEngine
7
+
8
+ def self.extended target
9
+ infuse target
10
+ end
11
+
12
+
13
+
14
+
15
+ # these methods will become instance methods of the target
16
+ # and as such will have access to te @settings instance variable
17
+ ###################################################
18
+ def build_filename
19
+ bind = binding()
20
+ Flak::Errors.assert("@settings[:build_directory]", "String", bind,__FILE__)
21
+ Flak::Errors.assert("@settings[:name]", "String", bind,__FILE__)
22
+ Flak::Errors.assert("@settings[:target_extension]", "String", bind,__FILE__)
23
+ File.join(@settings[:build_directory],'products',@settings[:name].ext(@settings[:target_extension]))
24
+ end
25
+
26
+ def release_filename
27
+ bind = binding()
28
+ Flak::Errors.assert("@settings[:path_to_revision]", "String", bind,__FILE__)
29
+ File.join( @settings[:path_to_revision], 'bin', build_filename.pathmap('%f'))
30
+ end
31
+
32
+ # generate path to object file from source: e.g. /hq/dev/jtools/build/2009.3/darwin/debug/animal/sensor.o"
33
+ def object_file(source)
34
+ bind = binding()
35
+ Flak::Errors.assert("@settings[:build_directory]", "String", bind,__FILE__)
36
+ Flak::Errors.assert("@settings[:object_extension]", "String", bind,__FILE__)
37
+ File.join(@settings[:build_directory], source.gsub("/src/","/").ext( @settings[:object_extension] ))
38
+ end
39
+
40
+ # collect all object files for this target
41
+ def object_files
42
+ @settings[:source_files].collect { |s| object_file(s) }
43
+ end
44
+
45
+ def c_compile_cmd(source)
46
+ bind = binding()
47
+ Flak::Errors.assert("@settings[:compiler]", "String", bind,__FILE__)
48
+ Flak::Errors.assert("@settings[:object_flag]", "String", bind,__FILE__)
49
+ Flak::Errors.assert("@settings[:include_flag]", "String", bind,__FILE__)
50
+
51
+ compiler = "\"#{@settings[:compiler]}\""
52
+ object = "#{@settings[:object_flag]}\"#{object_file(source)}\""
53
+ source = "\"#{source}\""
54
+ inc_path = (@settings[:source_files].collect {|f| f.pathmap('%d')}.uniq | ( @settings[:include_paths] || [] )).collect { |el| "#{@settings[:include_flag]}\"#{el.to_s}\"" }.join(" ")
55
+ includes = ( @settings[:includes] || [] ).collect { |el| "-include \"#{el.to_s}\"" }.join(" ")
56
+ compiler_options = (@settings[:compiler_options] || [] ).collect { |el| el.to_s }.join(" ")
57
+ # puts "*" * 80
58
+ # puts @settings[:compiler_options]
59
+ # puts "*" * 80
60
+ "#{compiler} #{compiler_options} #{source} #{object} #{inc_path} #{includes}"
61
+ end
62
+
63
+
64
+ def c_link_cmd
65
+ bind = binding()
66
+ Flak::Errors.assert("@settings[:linker]", "String", bind,__FILE__)
67
+ Flak::Errors.assert("@settings[:lib_flag]", "String", bind,__FILE__)
68
+ Flak::Errors.assert("@settings[:lib_ext]", "String", bind,__FILE__)
69
+ Flak::Errors.assert("@settings[:libpath_flag]", "String", bind,__FILE__)
70
+ Flak::Errors.assert("@settings[:framework_flag]", "String", bind,__FILE__)
71
+ Flak::Errors.assert("@settings[:outputfile_flag]", "String", bind,__FILE__)
72
+
73
+
74
+ linker = "\"#{@settings[:linker]}\""
75
+ objects = object_files.collect { |el| "\"#{el.to_s}\"" }.join(" ")
76
+ # libstr = ((@settings[:libs] || []).collect { |el| "-l#{el.to_s}" } | (@settings[:static_libs] || []).collect { |el| "#{@settings[:static_prefix_flag]} -l#{el.to_s}" }).join(" ")
77
+ libstr = (@settings[:libs] || []).collect { |el| "#{@settings[:lib_flag]}#{el.to_s}#{@settings[:lib_ext]}" }.join(" ")
78
+ libpathstr = (@settings[:lib_paths] || []).collect { |el| "#{@settings[:libpath_flag]}\"#{el.to_s}\"" }.join(" ")
79
+ linkflagstr = ( @settings[:linker_options] || [] ).collect { |el| el.to_s }.join(" ")
80
+ dso_flagstr = (@settings[:dso_options] || [] ).collect { |el| el.to_s }.join(" ")
81
+ fwrk = (@settings[:frameworks] || [] ).collect { |el| "#{@settings[:framework_flag]} #{el.to_s}" }.join(" ")
82
+ "#{linker} #{dso_flagstr} #{linkflagstr} #{libpathstr} #{libstr} #{fwrk} #{@settings[:outputfile_flag]}\"#{build_filename}\" #{objects}"
83
+ end
84
+
85
+
86
+ def c_clean_cmd
87
+ objects = object_files.collect { |el| "\"#{el.to_s}\"" }
88
+ "rm -f \"#{build_filename}\" #{objects}"
89
+ end
90
+ ###################################################
91
+
92
+
93
+
94
+
95
+ end
96
+
97
+
98
+
99
+
100
+
101
+ module Tasks
102
+ def self.extended target
103
+ task_factory target
104
+ end
105
+
106
+
107
+ def self.task_factory target
108
+ settings = target.settings
109
+
110
+
111
+ files = settings[:source_files]
112
+ unless files.nil?
113
+
114
+
115
+
116
+
117
+ # file tasks to compile objects from sources
118
+ # make sure the object file depends on the
119
+ # source and header if it exists
120
+ ######################################################
121
+ files.each do |f|
122
+ object = target.object_file(f)
123
+ file object => f do |t|
124
+ target.make_directory_for(object)
125
+ sh target.c_compile_cmd(f)
126
+ end
127
+ header = f.ext('h')
128
+ file object => header if File.exists?(header)
129
+ end
130
+ ######################################################
131
+
132
+
133
+
134
+
135
+
136
+ # file tasks to link targets
137
+ ######################################################
138
+ objects = target.object_files
139
+ build_file = target.build_filename
140
+ file build_file => objects do
141
+ target.make_directory_for(build_file)
142
+ sh target.c_link_cmd
143
+ end
144
+
145
+ namespace settings[:name].to_sym do
146
+ desc "build the #{settings[:name].to_sym} binary"
147
+ task :build => build_file # add named target
148
+ end
149
+ task :build => "#{settings[:name].to_sym}:build"
150
+ ######################################################
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+ # tasks to clean the build
159
+ ######################################################
160
+ namespace settings[:name].to_sym do
161
+ desc "clean the #{settings[:name].to_sym} build files"
162
+ task :clean do
163
+ sh target.c_clean_cmd
164
+ end
165
+ end
166
+ task :clean => "#{settings[:name].to_sym}:clean"
167
+ ######################################################
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+ # plugins and executables release tasks
176
+ ######################################################
177
+ release_binary = target.release_filename
178
+ build_file = target.build_filename
179
+ file release_binary => build_file do
180
+ target.make_directory_for(release_binary)
181
+ rm_r release_binary if File.exists?(release_binary)
182
+ cp build_file, release_binary
183
+ File.chmod 0755, release_binary
184
+ end
185
+ ######################################################
186
+
187
+
188
+
189
+
190
+
191
+ # add the release_binary file task to the tool's release task
192
+ # and add the tool's release task to the release task
193
+ # in the global namespace
194
+ ######################################################
195
+ namespace settings[:name].to_sym do
196
+ task :release => release_binary
197
+ end
198
+
199
+ task :release => "#{settings[:name].to_sym}:release"
200
+ ######################################################
201
+
202
+ end
203
+
204
+
205
+
206
+ end
207
+
208
+ end
209
+ end
210
+ end
211
+