Mxx_ru 1.3.2 → 1.4.0

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 (67) hide show
  1. data/Rakefile +4 -3
  2. data/bin/mxxrugen +197 -0
  3. data/lib/mxx_ru/cmd_line_option_processor.rb +126 -0
  4. data/lib/mxx_ru/cpp.rb +1 -0
  5. data/lib/mxx_ru/cpp/composite.rb +2 -12
  6. data/lib/mxx_ru/cpp/lib_collection.rb +96 -0
  7. data/lib/mxx_ru/cpp/mode.rb +72 -10
  8. data/lib/mxx_ru/cpp/target.rb +85 -136
  9. data/lib/mxx_ru/cpp/toolset.rb +96 -9
  10. data/lib/mxx_ru/cpp/toolsets/bcc_win32_family.rb +5 -5
  11. data/lib/mxx_ru/cpp/toolsets/c89_nsk_family.rb +5 -5
  12. data/lib/mxx_ru/cpp/toolsets/gcc_family.rb +5 -5
  13. data/lib/mxx_ru/cpp/toolsets/gcc_mingw.rb +2 -2
  14. data/lib/mxx_ru/cpp/toolsets/vc8.rb +6 -1
  15. data/lib/mxx_ru/cpp/toolsets/vc_family.rb +4 -4
  16. data/lib/mxx_ru/generators/bin-unittest/g.rb +200 -0
  17. data/lib/mxx_ru/generators/bin-unittest/template.erb +16 -0
  18. data/lib/mxx_ru/generators/cpp-composite/g.rb +37 -0
  19. data/lib/mxx_ru/generators/cpp-dll/g.rb +37 -0
  20. data/lib/mxx_ru/generators/cpp-exe/g.rb +37 -0
  21. data/lib/mxx_ru/generators/cpp-lib-collection/g.rb +37 -0
  22. data/lib/mxx_ru/generators/cpp-lib/g.rb +37 -0
  23. data/lib/mxx_ru/generators/impl/cpp/generation.rb +291 -0
  24. data/lib/mxx_ru/generators/impl/cpp/template.erb +27 -0
  25. data/lib/mxx_ru/generators/impl/std_receiver.rb +80 -0
  26. data/lib/mxx_ru/util.rb +110 -22
  27. data/lib/mxx_ru/version.rb +38 -0
  28. data/tests/mxx_ru/generators/cpp/tc_generator.rb +34 -0
  29. data/tests/mxx_ru/generators/cpp/tc_options.rb +79 -0
  30. data/tests/mxx_ru/generators/cpp/tc_template_params.rb +45 -0
  31. data/tests/mxx_ru/lib_collection/a.cpp +8 -0
  32. data/tests/mxx_ru/lib_collection/a.hpp +8 -0
  33. data/tests/mxx_ru/lib_collection/a.rb +8 -0
  34. data/tests/mxx_ru/lib_collection/b.cpp +8 -0
  35. data/tests/mxx_ru/lib_collection/b.hpp +8 -0
  36. data/tests/mxx_ru/lib_collection/b.rb +8 -0
  37. data/tests/mxx_ru/lib_collection/c.cpp +8 -0
  38. data/tests/mxx_ru/lib_collection/c.hpp +8 -0
  39. data/tests/mxx_ru/lib_collection/c.rb +8 -0
  40. data/tests/mxx_ru/lib_collection/collection_a_b.rb +7 -0
  41. data/tests/mxx_ru/lib_collection/collection_c_d.rb +7 -0
  42. data/tests/mxx_ru/lib_collection/collection_c_d_e.rb +7 -0
  43. data/tests/mxx_ru/lib_collection/collection_f.rb +6 -0
  44. data/tests/mxx_ru/lib_collection/collection_i.rb +6 -0
  45. data/tests/mxx_ru/lib_collection/d.cpp +8 -0
  46. data/tests/mxx_ru/lib_collection/d.hpp +8 -0
  47. data/tests/mxx_ru/lib_collection/d.rb +8 -0
  48. data/tests/mxx_ru/lib_collection/e.cpp +8 -0
  49. data/tests/mxx_ru/lib_collection/e.hpp +8 -0
  50. data/tests/mxx_ru/lib_collection/e.rb +8 -0
  51. data/tests/mxx_ru/lib_collection/f.cpp +8 -0
  52. data/tests/mxx_ru/lib_collection/f.hpp +8 -0
  53. data/tests/mxx_ru/lib_collection/f.rb +7 -0
  54. data/tests/mxx_ru/lib_collection/g.cpp +8 -0
  55. data/tests/mxx_ru/lib_collection/g.hpp +8 -0
  56. data/tests/mxx_ru/lib_collection/g.rb +7 -0
  57. data/tests/mxx_ru/lib_collection/i.cpp +10 -0
  58. data/tests/mxx_ru/lib_collection/i.hpp +16 -0
  59. data/tests/mxx_ru/lib_collection/i.rb +17 -0
  60. data/tests/mxx_ru/lib_collection/main.cpp +18 -0
  61. data/tests/mxx_ru/lib_collection/main.rb +12 -0
  62. data/tests/mxx_ru/lib_collection/tc_lib_collection.rb +17 -0
  63. data/tests/mxx_ru/toolset/tc_tag_search.rb +68 -0
  64. data/tests/test_with_compilation.rb +1 -1
  65. metadata +67 -14
  66. data/tests/cpp/mswin_res_dll/o/dll.o +0 -0
  67. data/tests/cpp/mswin_res_exe/o/main.o +0 -0
data/Rakefile CHANGED
@@ -4,9 +4,11 @@ Gem::manage_gems
4
4
  require 'rake/gempackagetask'
5
5
  require 'rake/testtask'
6
6
 
7
+ require 'lib/mxx_ru/version'
8
+
7
9
  spec = Gem::Specification.new do |s|
8
10
  s.name = "Mxx_ru"
9
- s.version = '1.3.2'
11
+ s.version = MXX_RU_VERSION
10
12
  s.author = "The Mxx_ru Project"
11
13
  s.email = "eao197@yahoo.com"
12
14
  s.homepage = "http://www.rubyforge.com/projects/mxx-ru"
@@ -14,9 +16,8 @@ spec = Gem::Specification.new do |s|
14
16
  s.summary = "Mxx_ru (Make++ on Ruby) is a cross-platform build tool"
15
17
  s.files = FileList[ "{bin,tests,lib,docs,examples}/**/*" ].
16
18
  exclude( "rdoc" ).to_a + [ "THANKS" ]
19
+ s.executables = 'mxxrugen'
17
20
  s.require_path = "lib"
18
- # s.autorequire = "rucodegen"
19
- # s.test_file = "tests/ts_rucodegen.rb"
20
21
  s.has_rdoc = true
21
22
  s.rdoc_options = [ '-S', '--main', 'README' ]
22
23
  s.extra_rdoc_files = [ "README", "Rakefile", "COPYING", "NEWS" ] + FileList[ "docs/**/*" ].to_a
data/bin/mxxrugen ADDED
@@ -0,0 +1,197 @@
1
+ #--
2
+ # Copyright (c) 1996-2004, Yauheni Akhotnikau
3
+ # Copyright (c) 2004-2006, JSC Intervale
4
+ # Copyright (c) 2006, The Mxx_ru Project
5
+ # All rights reserved.
6
+ #
7
+ # Redistribution and use in source and binary forms, with or without modification,
8
+ # are permitted provided that the following conditions are met:
9
+ #
10
+ # 1. Redistributions of source code must retain the above copyright notice,
11
+ # this list of conditions and the following disclaimer.
12
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ # 3. The name of the author may not be used to endorse or promote products derived
16
+ # from this software without specific prior written permission.
17
+ #
18
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
19
+ # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
20
+ # AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
21
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26
+ # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+ #++
28
+ # This code is based on the code from RuCodeGen
29
+ # (http://www.rubyforge.org/projects/rucodegen) project.
30
+ # RuCodeGen is distributed under the following license:
31
+ #--
32
+ #
33
+ # Copyright (c) 2005-2006, Yauheni Akhotnikau
34
+ # All rights reserved.
35
+ #
36
+ # Redistribution and use in source and binary forms, with or without modification,
37
+ # are permitted provided that the following conditions are met:
38
+ #
39
+ # 1. Redistributions of source code must retain the above copyright notice,
40
+ # this list of conditions and the following disclaimer.
41
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
42
+ # this list of conditions and the following disclaimer in the documentation
43
+ # and/or other materials provided with the distribution.
44
+ # 3. The name of the author may not be used to endorse or promote products derived
45
+ # from this software without specific prior written permission.
46
+ #
47
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
48
+ # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
49
+ # AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
50
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
51
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
52
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
53
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
54
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
55
+ # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
56
+ #
57
+ #++
58
+
59
+
60
+ # Since v.1.4.0
61
+ #
62
+ # Template generation scripts runner.
63
+
64
+ require 'optparse'
65
+ require 'ostruct'
66
+
67
+ module MxxRuGen
68
+
69
+ module Impl
70
+
71
+ # Standard name of generation script inside template.
72
+ STD_CODEGEN_SCRIPT_NAME = 'g.rb'
73
+
74
+ # Command-line argument parsing.
75
+ #
76
+ # Returns object with the following methods:
77
+ # template_name:: Name of template chosen.
78
+ # list:: Contains _true_ if list of templates must be shown.
79
+ # include_paths:: Contains list of addition path for templates.
80
+ #
81
+ # Finishes script work is --help specified.
82
+ #
83
+ def Impl.parse_args
84
+ result = OpenStruct.new(
85
+ :template_name => nil,
86
+ :list => false,
87
+ :include_paths => [] )
88
+
89
+ parser = OptionParser.new
90
+
91
+ parser.banner = <<BANNER
92
+ Mxx_ru Ad-Hoc generation runner
93
+
94
+ Usage:
95
+
96
+ mxxrugen [<options>] template-name [<template-options>]
97
+
98
+ BANNER
99
+
100
+ parser.on_head( '-l', '--list', 'Show list of available templates' ) do
101
+ result.list = true
102
+ end
103
+
104
+ parser.on_head( '-I', '--include-path PATH',
105
+ 'Additional path to looking for templates' ) do |p|
106
+ result.include_paths << p
107
+ end
108
+
109
+ parser.on_head( '-h', '--help', 'Show this message' ) do
110
+ puts parser
111
+ exit( 1 )
112
+ end
113
+
114
+ parser.order!( ARGV ) do |nonarg|
115
+ # First non-option is a template name.
116
+ result.template_name = nonarg
117
+ parser.terminate
118
+ end
119
+
120
+ if !result.template_name && !result.list
121
+ $stderr.puts "template_name must be specified"
122
+ exit( 2 )
123
+ end
124
+
125
+ result
126
+ end
127
+
128
+ # Prints list of available templates.
129
+ def Impl.show_templates_list( include_paths )
130
+ include_paths.each do |path|
131
+ templates_found = []
132
+ Dir.glob( File.join( path, '*' ), File::FNM_PATHNAME ) do |dir|
133
+ probe_name = File.join( dir, STD_CODEGEN_SCRIPT_NAME )
134
+ if File.readable?( probe_name )
135
+ templates_found << File.basename( dir )
136
+ end
137
+ end
138
+
139
+ templates_found.sort.each do |template|
140
+ puts template + " (#{path})"
141
+ end
142
+ end
143
+ end
144
+
145
+ # Searches full path to a template by the template name.
146
+ #
147
+ # Returns nil if searching fails.
148
+ #
149
+ def Impl.find_full_template_path( template_name, include_paths )
150
+ include_paths.each do |path|
151
+ probe_name = File.join( path, template_name, STD_CODEGEN_SCRIPT_NAME )
152
+ if File.readable?( probe_name )
153
+ return probe_name
154
+ end
155
+ end
156
+
157
+ nil
158
+ end
159
+
160
+ # Searches and runs the template specified with option list is given.
161
+ def Impl.find_and_run_template( template_name, include_paths )
162
+ full_path = find_full_template_path( template_name, include_paths )
163
+ if full_path
164
+ require full_path
165
+ else
166
+ $stderr.puts "#{template_name}: template not found in:\n\t" +
167
+ include_paths.join( "\n\t" )
168
+ exit( 3 )
169
+ end
170
+ end
171
+
172
+ end # Impl
173
+
174
+ # Performs main work.
175
+ def MxxRuGen.run_ad_hoc_generation
176
+ options = Impl.parse_args
177
+
178
+ # Standard path to templates must be added.
179
+ options.include_paths << File.expand_path( File.join(
180
+ File.dirname( __FILE__ ),
181
+ '../lib/mxx_ru/generators' ) )
182
+
183
+ if options.list
184
+ Impl.show_templates_list( options.include_paths )
185
+ else
186
+ Impl.find_and_run_template(
187
+ options.template_name,
188
+ options.include_paths )
189
+ end
190
+ end
191
+
192
+ end # MxxRuGen
193
+
194
+ MxxRuGen.run_ad_hoc_generation
195
+
196
+ # vim:ft=ruby:
197
+
@@ -0,0 +1,126 @@
1
+ #--
2
+ # Copyright (c) 1996-2004, Yauheni Akhotnikau
3
+ # Copyright (c) 2004-2006, JSC Intervale
4
+ # Copyright (c) 2006, The Mxx_ru Project
5
+ # All rights reserved.
6
+ #
7
+ # Redistribution and use in source and binary forms, with or without modification,
8
+ # are permitted provided that the following conditions are met:
9
+ #
10
+ # 1. Redistributions of source code must retain the above copyright notice,
11
+ # this list of conditions and the following disclaimer.
12
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ # 3. The name of the author may not be used to endorse or promote products derived
16
+ # from this software without specific prior written permission.
17
+ #
18
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
19
+ # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
20
+ # AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
21
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26
+ # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+ #++
28
+
29
+ require 'optparse'
30
+ require 'singleton'
31
+
32
+ require 'mxx_ru/version'
33
+
34
+ module MxxRu
35
+
36
+ # Singleton for centralized mechanizm of command line options parsing.
37
+ #
38
+ # Since v.1.4.0
39
+ #
40
+ # Each part of Mxx_ru which need some command line option must provider
41
+ # special option processor for CmdLineOptionProcessor singleton:
42
+ #
43
+ # module MxxRu
44
+ # module SomeLangSupport
45
+ # class OptionParser
46
+ # include Singleton
47
+ # ...
48
+ # def prepare( parser ) # Instance of OptionParser from stdlib.
49
+ # parser.separator ''
50
+ # parser.separator 'Some Language Support options:'
51
+ #
52
+ # parser.on( '-i', '--include PATH', 'Set up include path' ) do
53
+ # |path|
54
+ # ... some processig ...
55
+ # end
56
+ # ... setting another option handlers ...
57
+ # end
58
+ # end
59
+ # end
60
+ # end
61
+ #
62
+ # # OptionParser must be added to CmdLineOptionProcessor.
63
+ # MxxRu::CmdLineOptionProcessor.add_processor(
64
+ # MxxRu::SomeLangSupport::OptionParser.instance )
65
+ #
66
+ # See examples of using this technique in MxxRu::Util::Mode and
67
+ # MxxRu::Cpp::Mode classes.
68
+ #
69
+ class CmdLineOptionProcessor
70
+ include Singleton
71
+
72
+ def initialize
73
+ @processors = []
74
+ @parsed = false
75
+ end
76
+
77
+ # Add yet another option processor for processors list.
78
+ def add_processor( processor )
79
+ @processors << processor
80
+ @parsed = false
81
+ end
82
+
83
+ # Performs parsing of ARGV content by current processors.
84
+ #
85
+ # Finishes work of script if --help or --version found in ARGV.
86
+ def parse
87
+ unless @parsed
88
+ parser = OptionParser.new do |p|
89
+ prepare_option_parser( p )
90
+ end
91
+
92
+ begin
93
+ parser.parse( ARGV )
94
+ rescue => x
95
+ $stderr.puts "command line parsing error '#{x.message}'"
96
+ exit( 2 )
97
+ end
98
+
99
+ @parsed = true
100
+ end
101
+ end
102
+
103
+ protected
104
+ # Calls preparse() method for each processor. And then add common
105
+ # command line options to the parser.
106
+ def prepare_option_parser( parser )
107
+ @processors.each do |p| p.prepare( parser ) end
108
+
109
+ parser.separator ''
110
+ parser.separator 'Auxilary options:'
111
+
112
+ parser.on_tail( '-h', '--help', 'Show usage help and options summary' ) do
113
+ puts parser
114
+ exit
115
+ end
116
+
117
+ parser.on_tail( '--version', 'Show version' ) do
118
+ puts 'Mxx_ru v.' + MXX_RU_VERSION
119
+ exit
120
+ end
121
+ end
122
+
123
+ end
124
+
125
+ end
126
+
data/lib/mxx_ru/cpp.rb CHANGED
@@ -31,6 +31,7 @@ require 'mxx_ru/binary_target'
31
31
  require 'mxx_ru/cpp/detect_toolset'
32
32
  require 'mxx_ru/cpp/target'
33
33
  require 'mxx_ru/cpp/composite'
34
+ require 'mxx_ru/cpp/lib_collection'
34
35
 
35
36
  require 'mxx_ru/cpp/obj_placements/custom_subdir'
36
37
 
@@ -59,12 +59,7 @@ module MxxRu
59
59
  def build
60
60
  if nil == @mxx_last_build_result
61
61
 
62
- if !@mxx_all_options_defined
63
- # It's required for toolset to define all required options
64
- # taking all current modes into account.
65
- MxxRu::Cpp::toolset.setup_mandatory_options( self )
66
- @mxx_all_options_defined = true
67
- end
62
+ check_all_options_definition
68
63
 
69
64
  @mxx_last_build_result = build_required_projects
70
65
  end
@@ -76,12 +71,7 @@ module MxxRu
76
71
  def clean
77
72
  if nil == @mxx_last_build_result
78
73
 
79
- if !@mxx_all_options_defined
80
- # It's required for toolset to define all required options
81
- # taking all current modes into account.
82
- MxxRu::Cpp::toolset.setup_mandatory_options( self )
83
- @mxx_all_options_defined = true
84
- end
74
+ check_all_options_definition
85
75
 
86
76
  clean_required_prjs
87
77
 
@@ -0,0 +1,96 @@
1
+ #--
2
+ # Copyright (c) 1996-2004, Yauheni Akhotnikau
3
+ # Copyright (c) 2004-2006, JSC Intervale
4
+ # Copyright (c) 2006, The Mxx_ru Project
5
+ # All rights reserved.
6
+ #
7
+ # Redistribution and use in source and binary forms, with or without modification,
8
+ # are permitted provided that the following conditions are met:
9
+ #
10
+ # 1. Redistributions of source code must retain the above copyright notice,
11
+ # this list of conditions and the following disclaimer.
12
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ # 3. The name of the author may not be used to endorse or promote products derived
16
+ # from this software without specific prior written permission.
17
+ #
18
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
19
+ # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
20
+ # AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
21
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26
+ # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+ #++
28
+
29
+ require 'mxx_ru/cpp/composite'
30
+ require 'mxx_ru/cpp/toolset'
31
+
32
+ module MxxRu
33
+ module Cpp
34
+
35
+ # Target type is a collection of all required libraries from subprojects.
36
+ #
37
+ # Since v.1.4.0
38
+ class LibCollectionTargetType < TargetType
39
+ TYPE = "lib_collection"
40
+
41
+ def name
42
+ return TYPE
43
+ end
44
+ end
45
+
46
+ # Collection of all required libraries form subprojects.
47
+ #
48
+ # Since v.1.4.0
49
+ class LibCollectionTarget < CompositeTarget
50
+ def initialize( a_alias, &block )
51
+ super( a_alias )
52
+
53
+ instance_eval( &block ) if block
54
+ end
55
+
56
+ def target_type
57
+ return LibCollectionTargetType.new
58
+ end
59
+
60
+ def build
61
+ if nil == @mxx_last_build_result
62
+ # Let base class makes all necessary building actions.
63
+ super
64
+
65
+ # We must collect names of all required libraries from
66
+ # all subprojects.
67
+ mxx_required_prjs.each do |d|
68
+ if Toolset::has_linkable_dependecies?( d )
69
+ mxx_add_required_libs( d.mxx_required_libs )
70
+ mxx_add_required_lib_paths( d.mxx_required_lib_paths )
71
+ end
72
+ end
73
+ end
74
+
75
+ @mxx_last_build_result
76
+ end
77
+
78
+ end # class LibCollectionTarget
79
+
80
+ # Simple method to define libraries collection target.
81
+ #
82
+ # Example:
83
+ # MxxRu::Cpp::lib_collection_target {
84
+ # required_prj 'some_project.rb'
85
+ # required_prj 'some_another_project.rb'
86
+ # }
87
+ #
88
+ # Since v.1.4.0
89
+ def Cpp.lib_collection_target( prj_alias = nil, &block )
90
+ prj_alias = MxxRu::Util::prj_alias_form_caller( caller ) unless prj_alias
91
+ MxxRu::setup_target LibCollectionTarget.new( prj_alias, &block )
92
+ end
93
+
94
+ end # module Cpp
95
+ end # module MxxRu
96
+