flak 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+