Mxx_ru 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. data/COPYING +26 -0
  2. data/NEWS +52 -0
  3. data/README +21 -0
  4. data/Rakefile +32 -0
  5. data/examples/exe_and_lib/main.cpp +15 -0
  6. data/examples/exe_and_lib/prj.rb +11 -0
  7. data/examples/exe_and_lib/say.cpp +13 -0
  8. data/examples/exe_and_lib/say.hpp +11 -0
  9. data/examples/exe_and_lib/say.rb +7 -0
  10. data/examples/exe_dll_lib/inout.cpp +15 -0
  11. data/examples/exe_dll_lib/inout.hpp +26 -0
  12. data/examples/exe_dll_lib/inout.rb +18 -0
  13. data/examples/exe_dll_lib/main.cpp +23 -0
  14. data/examples/exe_dll_lib/prj.rb +11 -0
  15. data/examples/exe_dll_lib/say.cpp +13 -0
  16. data/examples/exe_dll_lib/say.hpp +12 -0
  17. data/examples/exe_dll_lib/say.rb +9 -0
  18. data/examples/exe_dll_lib_2/build.rb +7 -0
  19. data/examples/exe_dll_lib_2/inout/inout.cpp +15 -0
  20. data/examples/exe_dll_lib_2/inout/inout.hpp +26 -0
  21. data/examples/exe_dll_lib_2/inout/prj.rb +16 -0
  22. data/examples/exe_dll_lib_2/main/main.cpp +23 -0
  23. data/examples/exe_dll_lib_2/main/prj.rb +9 -0
  24. data/examples/exe_dll_lib_2/say/prj.rb +8 -0
  25. data/examples/exe_dll_lib_2/say/say.cpp +13 -0
  26. data/examples/exe_dll_lib_2/say/say.hpp +12 -0
  27. data/examples/simple_exe/main.cpp +26 -0
  28. data/examples/simple_exe/prj.rb +7 -0
  29. data/lib/mxx_ru/abstract_target.rb +283 -0
  30. data/lib/mxx_ru/binary_target.rb +89 -0
  31. data/lib/mxx_ru/binary_unittest.rb +130 -0
  32. data/lib/mxx_ru/cpp/analyzer.rb +230 -0
  33. data/lib/mxx_ru/cpp/composite.rb +106 -0
  34. data/lib/mxx_ru/cpp/detect_toolset.rb +122 -0
  35. data/lib/mxx_ru/cpp/mode.rb +85 -0
  36. data/lib/mxx_ru/cpp/obj_placement.rb +321 -0
  37. data/lib/mxx_ru/cpp/qt.rb +333 -0
  38. data/lib/mxx_ru/cpp/rucodegen.rb +114 -0
  39. data/lib/mxx_ru/cpp/source_file.rb +71 -0
  40. data/lib/mxx_ru/cpp/target.rb +1371 -0
  41. data/lib/mxx_ru/cpp/toolset.rb +1029 -0
  42. data/lib/mxx_ru/cpp/toolsets/bcc_win32_5.rb +52 -0
  43. data/lib/mxx_ru/cpp/toolsets/bcc_win32_family.rb +451 -0
  44. data/lib/mxx_ru/cpp/toolsets/c89_etk_nsk.rb +56 -0
  45. data/lib/mxx_ru/cpp/toolsets/c89_nsk.rb +56 -0
  46. data/lib/mxx_ru/cpp/toolsets/c89_nsk_family.rb +273 -0
  47. data/lib/mxx_ru/cpp/toolsets/gcc_cygwin.rb +54 -0
  48. data/lib/mxx_ru/cpp/toolsets/gcc_family.rb +382 -0
  49. data/lib/mxx_ru/cpp/toolsets/gcc_linux.rb +60 -0
  50. data/lib/mxx_ru/cpp/toolsets/gcc_mingw.rb +144 -0
  51. data/lib/mxx_ru/cpp/toolsets/gcc_sparc_solaris.rb +87 -0
  52. data/lib/mxx_ru/cpp/toolsets/vc7.rb +62 -0
  53. data/lib/mxx_ru/cpp/toolsets/vc8.rb +452 -0
  54. data/lib/mxx_ru/cpp/toolsets/vc_family.rb +428 -0
  55. data/lib/mxx_ru/cpp.rb +36 -0
  56. data/lib/mxx_ru/ex.rb +134 -0
  57. data/lib/mxx_ru/makestyle_generator.rb +138 -0
  58. data/lib/mxx_ru/textfile_unittest.rb +284 -0
  59. data/lib/mxx_ru/util.rb +258 -0
  60. data/tests/c/pcre/chartables.c +183 -0
  61. data/tests/c/pcre/config.h +99 -0
  62. data/tests/c/pcre/dftables.c +167 -0
  63. data/tests/c/pcre/get.c +349 -0
  64. data/tests/c/pcre/internal.h +677 -0
  65. data/tests/c/pcre/maketables.c +140 -0
  66. data/tests/c/pcre/pcre.c +8304 -0
  67. data/tests/c/pcre/pcre.h +193 -0
  68. data/tests/c/pcre/pcre.rb +14 -0
  69. data/tests/c/pcre/pcredemo.c +316 -0
  70. data/tests/c/pcre/pcregrep.c +642 -0
  71. data/tests/c/pcre/pcreposix.c +305 -0
  72. data/tests/c/pcre/pcreposix.h +88 -0
  73. data/tests/c/pcre/pcretest.c +1483 -0
  74. data/tests/c/pcre/perltest +211 -0
  75. data/tests/c/pcre/printint.c +360 -0
  76. data/tests/c/pcre/study.c +472 -0
  77. data/tests/cpp/mswin_res_dll/build.rb +14 -0
  78. data/tests/cpp/mswin_res_dll/dll.cpp +17 -0
  79. data/tests/cpp/mswin_res_dll/dll.rb +30 -0
  80. data/tests/cpp/mswin_res_dll/dll.rc +48 -0
  81. data/tests/cpp/mswin_res_dll/h/dll.hpp +8 -0
  82. data/tests/cpp/mswin_res_dll/h/res.h +3 -0
  83. data/tests/cpp/mswin_res_dll/main.cpp +13 -0
  84. data/tests/cpp/mswin_res_dll/main.rb +20 -0
  85. data/tests/cpp/mswin_res_dll/res/tree_fol.bmp +0 -0
  86. data/tests/cpp/mswin_res_dll/res/tree_state_1.bmp +0 -0
  87. data/tests/cpp/mswin_res_dll/res/tree_state_2.bmp +0 -0
  88. data/tests/cpp/mswin_res_exe/build.rb +23 -0
  89. data/tests/cpp/mswin_res_exe/h/res.h +3 -0
  90. data/tests/cpp/mswin_res_exe/main.cpp +17 -0
  91. data/tests/cpp/mswin_res_exe/main.rc +48 -0
  92. data/tests/cpp/mswin_res_exe/res/tree_fol.bmp +0 -0
  93. data/tests/cpp/mswin_res_exe/res/tree_state_1.bmp +0 -0
  94. data/tests/cpp/mswin_res_exe/res/tree_state_2.bmp +0 -0
  95. data/tests/cpp/rucodegen/host_config.cpp +20 -0
  96. data/tests/cpp/rucodegen/host_config.rb +14 -0
  97. data/tests/cpp/rucodegen/impl/conn_params.cpp +7 -0
  98. data/tests/cpp/rucodegen/impl/conn_params.rb +14 -0
  99. data/tests/cpp/rucodegen/impl/h/conn_params.hpp +10 -0
  100. data/tests/cpp/rucodegen/prj.rb +17 -0
  101. data/tests/cpp/textfile_unittest/build.rb +8 -0
  102. data/tests/cpp/textfile_unittest/etalons/out_0.txt +0 -0
  103. data/tests/cpp/textfile_unittest/etalons/out_1.txt +1 -0
  104. data/tests/cpp/textfile_unittest/etalons/out_128.txt +128 -0
  105. data/tests/cpp/textfile_unittest/main.cpp +89 -0
  106. data/tests/cpp/textfile_unittest/prj.rb +8 -0
  107. data/tests/cpp/textfile_unittest/prj.ut.rb +18 -0
  108. data/tests/cpp/toolset_name.rb +6 -0
  109. data/tests/cpp/vc_cleanup/cout.log +72 -0
  110. data/tests/cpp/vc_cleanup/dll_hi.cpp +5 -0
  111. data/tests/cpp/vc_cleanup/exe_hi.cpp +10 -0
  112. data/tests/cpp/vc_cleanup/lib_hi.cpp +5 -0
  113. data/tests/cpp/vc_cleanup/prj_dll_no_implib.rb +10 -0
  114. data/tests/cpp/vc_cleanup/prj_dll_no_implib_simple_target_root.rb +11 -0
  115. data/tests/cpp/vc_cleanup/prj_dll_with_implib.rb +11 -0
  116. data/tests/cpp/vc_cleanup/prj_dll_with_implib_simple_target_root.rb +14 -0
  117. data/tests/cpp/vc_cleanup/prj_exe_no_implib.rb +10 -0
  118. data/tests/cpp/vc_cleanup/prj_exe_no_implib_simple_target_root.rb +11 -0
  119. data/tests/cpp/vc_cleanup/prj_lib.rb +10 -0
  120. data/tests/cpp/vc_cleanup/prj_lib_with_simple_target_root.rb +11 -0
  121. data/tests/cpp/vc_cleanup/tc_vc_cleanup.rb +60 -0
  122. data/tests/mxx_ru/change_default_value/ignoring_by_build_root/build.rb +8 -0
  123. data/tests/mxx_ru/change_default_value/ignoring_by_build_root/child_1.rb +5 -0
  124. data/tests/mxx_ru/change_default_value/ignoring_by_child_1/build.rb +7 -0
  125. data/tests/mxx_ru/change_default_value/ignoring_by_child_1/child_1.rb +5 -0
  126. data/tests/mxx_ru/change_default_value/ignoring_by_child_1/child_2.rb +5 -0
  127. data/tests/mxx_ru/change_default_value/ok/build.rb +8 -0
  128. data/tests/mxx_ru/change_default_value/ok/child_1.rb +8 -0
  129. data/tests/mxx_ru/tc_makestyle_generator.rb +117 -0
  130. data/tests/mxx_ru/vc8/tc_actual_manifest.rb +230 -0
  131. data/tests/mxx_ru/vc8/tc_append_mt_commands.rb +104 -0
  132. data/tests/mxx_ru/vc8/tc_default_manifest.rb +17 -0
  133. data/tests/mxx_ru/vc8/tc_define_manifest.rb +173 -0
  134. data/tests/mxx_ru/vc8/tc_drop_default_manifest.rb +16 -0
  135. data/tests/mxx_ru/vc8/tc_invalid_params.rb +81 -0
  136. data/tests/mxx_ru/vc8/ts_vc8.rb +10 -0
  137. data/tests/qt/aclock/aclock.cpp +148 -0
  138. data/tests/qt/aclock/aclock.h +45 -0
  139. data/tests/qt/aclock/main.cpp +28 -0
  140. data/tests/qt/aclock/prj.rb +21 -0
  141. data/tests/qt/iconview/main.cpp +76 -0
  142. data/tests/qt/iconview/prj.rb +21 -0
  143. data/tests/qt/toplevel/main.cpp +9 -0
  144. data/tests/qt/toplevel/options.ui +587 -0
  145. data/tests/qt/toplevel/options.ui.h +98 -0
  146. data/tests/qt/toplevel/prj.rb +21 -0
  147. metadata +241 -0
@@ -0,0 +1,230 @@
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 'singleton'
30
+
31
+ module Mxx_ru
32
+ module Cpp
33
+
34
+ module Analyzer
35
+ # Class, describing one source file.
36
+ class Source_file
37
+ # Already processed file sign.
38
+ attr_reader :is_processed
39
+ # A set of files-dependecies.
40
+ # Hash, key is a String, no value.
41
+ attr_reader :depends
42
+
43
+ def initialize
44
+ @is_processed = false
45
+ @depends = Hash.new
46
+ end
47
+
48
+ # Set processed file sign.
49
+ def processed
50
+ @is_processed = true
51
+ end
52
+
53
+ # Add a dependency.
54
+ def <<( a_name )
55
+ @depends[ a_name ]= nil
56
+ end
57
+
58
+ end # class Source_file
59
+
60
+ class Cpp_analyzer
61
+ include Singleton
62
+
63
+ @@include_regex = Regexp.new(
64
+ '^[ \t]*#[ \t]*include[ \t]*(<|")([^>"]+)(>|")' )
65
+
66
+ def initialize
67
+ # Key is a string, value - Source_file.
68
+ @sources = Hash.new
69
+ # A list of folders to look header files in.
70
+ @include_paths = Array.new
71
+ end
72
+
73
+ # Add files to view.
74
+ # [_a_sources_] Should be Array of Strings.
75
+ def add_sources( a_sources )
76
+
77
+ a_sources.each { |s|
78
+ if !@sources.key?( s )
79
+ @sources[ s ] = Source_file.new
80
+ end
81
+ }
82
+ end
83
+
84
+ # Add paths to header files.
85
+ # [_a_paths_] Should be Array of Strings.
86
+ def add_include_paths( a_paths )
87
+
88
+ a_paths.each { |p|
89
+ if !@include_paths.include?( p )
90
+ @include_paths << p
91
+ end
92
+ }
93
+ end
94
+
95
+ # Perform file analisys.
96
+ def analyze
97
+ # Current list of keys should be taken to avoid
98
+ # dynamic growth of file list.
99
+ # Repeat iterations until source file list changes stop
100
+ old_size = 0
101
+ files = @sources.keys
102
+ while old_size != files.size
103
+ files.each { |file_name|
104
+ current = @sources[ file_name ]
105
+ if !current.is_processed
106
+ process_file( file_name, current )
107
+ end
108
+ }
109
+
110
+ old_size = files.size
111
+ files = @sources.keys
112
+ end
113
+ end
114
+
115
+ # Get full dependencies list for a file.
116
+ # Returns Array of Strings.
117
+ def get_depends_for( a_file_name )
118
+ result_hash = Hash.new
119
+ file_obj = @sources[ a_file_name ]
120
+ if nil != file_obj
121
+ to_review = file_obj.depends
122
+ to_review_next = Hash.new
123
+
124
+ while to_review.size != to_review_next.size
125
+ to_review.each_key { |f|
126
+ if !result_hash.key?( f )
127
+ result_hash[ f ] = nil
128
+ to_review_next_obj = @sources[ f ]
129
+ to_review_next_obj.depends.each_key { |k|
130
+ to_review_next[ k ] = nil }
131
+ end
132
+ }
133
+
134
+ to_review = to_review_next
135
+ to_review_next = Hash.new
136
+ end
137
+ end
138
+
139
+ return result_hash.keys
140
+ end
141
+
142
+ protected
143
+ # Process next file.
144
+ # [_a_file_name_] File name.
145
+ # [_a_file_obj_] Corresponding object.
146
+ def process_file( a_file_name, a_file_obj )
147
+
148
+ # Gather file names list from include directives.
149
+ std_path_included = Array.new
150
+ local_path_included = Array.new
151
+ IO.foreach( a_file_name ) { |line|
152
+ r = @@include_regex.match( line )
153
+ if nil != r
154
+ if "<" == r[ 1 ]
155
+ std_path_included << r[ 2 ]
156
+ else
157
+ local_path_included << r[ 2 ]
158
+ end
159
+ end
160
+ }
161
+
162
+ # All files, loaded through include <>
163
+ # should be searched in standard search paths only.
164
+ std_path_included.each { |f|
165
+ process_std_include_path_file( f, a_file_obj )
166
+ }
167
+
168
+ if local_path_included.size
169
+ # Files loaded through include ""
170
+ # should be searched in folder with the source file first.
171
+ local_path = File.dirname( a_file_name )
172
+ local_path_included.each { |f|
173
+ process_local_include_path_file( f, local_path, a_file_obj )
174
+ }
175
+ end
176
+
177
+ a_file_obj.processed
178
+ end
179
+
180
+ # Processing file loaded through include <>
181
+ # [_a_file_name_] File name.
182
+ # [_a_owner_obj_] File object contained include directive.
183
+ def process_std_include_path_file( a_file_name, a_owner_obj )
184
+
185
+ @include_paths.find { |path|
186
+ test_name = File.join( [ path, a_file_name ] )
187
+ if File.exists?( test_name )
188
+ add_depend_to( a_owner_obj, test_name )
189
+ true
190
+ else
191
+ false
192
+ end
193
+ }
194
+ end
195
+
196
+ # Processing file loaded through include ""
197
+ # [_a_file_name_] File name.
198
+ # [_a_local_path_] Folder with owner_obj.
199
+ # [_a_owner_obj_] File object contained include directive.
200
+ def process_local_include_path_file(
201
+ a_file_name,
202
+ a_local_path,
203
+ a_owner_obj )
204
+
205
+ test_name = File.join( [ a_local_path, a_file_name ] )
206
+ if File.exists?( test_name )
207
+ add_depend_to( a_owner_obj, test_name )
208
+ else
209
+ process_std_include_path_file( a_file_name, a_owner_obj )
210
+ end
211
+ end
212
+
213
+ # Add dependency to a file.
214
+ # [_a_owner_obj_] Dependency owner.
215
+ # [_a_depend_name_] Dependency file name.
216
+ def add_depend_to( a_owner_obj, a_depend_name )
217
+
218
+ a_owner_obj << a_depend_name
219
+
220
+ if !@sources.key?( a_depend_name )
221
+ # This file wasn't viewed yet.
222
+ @sources[ a_depend_name ] = Source_file.new
223
+ end
224
+ end
225
+ end # class Cpp_analyzer
226
+
227
+ end # module Analyzer
228
+ end # module cpp
229
+ end # module Mxx_ru
230
+
@@ -0,0 +1,106 @@
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/target'
30
+
31
+ module Mxx_ru
32
+
33
+ module Cpp
34
+
35
+ # Target type is a composition of subprojects
36
+ class Composite_target_type < Target_type
37
+ TYPE = "composite"
38
+
39
+ def name
40
+ return TYPE
41
+ end
42
+ end
43
+
44
+ # Composition of subprojects target
45
+ class Composite_target < Target
46
+ def initialize( a_alias, &block )
47
+ super( a_alias )
48
+
49
+ instance_eval( &block ) if block
50
+ end
51
+
52
+ def target_type
53
+ return Composite_target_type.new
54
+ end
55
+
56
+ def build
57
+ if nil == @mxx_last_build_result
58
+
59
+ if !@mxx_all_options_defined
60
+ # It's required for toolset to define all required options
61
+ # taking all current modes into account.
62
+ Mxx_ru::Cpp::toolset.setup_mandatory_options( self )
63
+ @mxx_all_options_defined = true
64
+ end
65
+
66
+ @mxx_last_build_result = build_required_projects
67
+ end
68
+
69
+ return @mxx_last_build_result
70
+
71
+ end
72
+
73
+ def clean
74
+ if nil == @mxx_last_build_result
75
+
76
+ if !@mxx_all_options_defined
77
+ # It's required for toolset to define all required options
78
+ # taking all current modes into account.
79
+ Mxx_ru::Cpp::toolset.setup_mandatory_options( self )
80
+ @mxx_all_options_defined = true
81
+ end
82
+
83
+ clean_required_prjs
84
+
85
+ @mxx_last_build_result = Mxx_ru::Target_state.new(
86
+ Mxx_ru::Target_state::ABSENT )
87
+ end
88
+ end
89
+
90
+ end # class Composite_target
91
+
92
+ # Simple method to define composite target.
93
+ #
94
+ # Example:
95
+ # Mxx_ru::Cpp::composite_target( Mxx_ru::BUILD_ROOT ) {
96
+ # required_prj 'some_project.rb'
97
+ # required_prj 'some_another_project.rb'
98
+ # }
99
+ def Cpp.composite_target( prj_alias, &block )
100
+ Mxx_ru::setup_target Composite_target.new( prj_alias, &block )
101
+ end
102
+
103
+ end # module Cpp
104
+
105
+ end # module Mxx_ru
106
+
@@ -0,0 +1,122 @@
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/toolset'
30
+
31
+ module Mxx_ru
32
+ module Cpp
33
+
34
+ # Detect current toolset based on values of environment variables
35
+ #
36
+ # Following algorithm is used:
37
+ # Getting the value of MXX_RU_CPP_TOOLSET envonment variable.
38
+ # It should be in a following format:
39
+ # <file> [tag=value [tag=value [...]]
40
+ # <file> value is used in require directive.
41
+ #
42
+ # After loading of file defined, toolset method should return
43
+ # a pointer to toolset object.
44
+ #
45
+ # If toolset object was created, pairs of tag=value are parsed and
46
+ # saved to the toolset created using a setup_tag method.
47
+ def Cpp.detect_toolset
48
+ begin
49
+ env_var = "MXX_RU_CPP_TOOLSET"
50
+
51
+ env = ENV[ env_var ]
52
+ if nil == env
53
+ raise Mxx_ru::Invalid_value_ex.new(
54
+ "Environment variable '#{env_var}' not found (not set " +
55
+ "or empty" )
56
+ end
57
+
58
+ # Exctracting file name, responsible for toolset object creation.
59
+ toolset_file_name_regexp = /^(\S+)(.*)$/
60
+ file_name_match = toolset_file_name_regexp.match( env )
61
+ if nil == file_name_match
62
+ raise Mxx_ru::Invalid_value_ex.new(
63
+ "Invalid format of environment variable '#{env_var}'. " +
64
+ "Expected format: #{env_var}=<file>[ <tag>=<value>[ " +
65
+ "<tag>=<value>[ ...]]]" )
66
+ end
67
+
68
+ file_name = file_name_match[ 1 ]
69
+ unparsed_tags = file_name_match[ 2 ]
70
+
71
+ # Loading the file
72
+ # Try to loading specified file first, if it fails try to
73
+ # loading file with 'mxx_ru/cpp/toolsets' added...
74
+ try_load_toolset_file file_name
75
+
76
+ if nil == toolset()
77
+ raise Mxx_ru::Invalid_value_ex.new(
78
+ "C/C++ Toolset is not set by file '#{file_name}'" )
79
+ end
80
+
81
+ # Setting up toolset tags
82
+ setup_toolset_tags( toolset(), unparsed_tags )
83
+
84
+ rescue Mxx_ru::Ex => ex
85
+ $stderr.print "<<<[#{ex.class.name}]\t#{ex}>>>\n"
86
+ exit( -1 )
87
+ end
88
+ end
89
+
90
+ # [_a_toolset_] Toolset, tags are set for
91
+ # [_a_unparsed_tags_] A string, formatted that way:
92
+ # <tag>=<value>[ <tag>=<value> [<tag>=<value> ...]]
93
+ def Cpp.setup_toolset_tags( a_toolset,
94
+ a_unparsed_tags )
95
+
96
+ a_unparsed_tags.scan( /(\S+)=(\S+)/ ) { |t, v|
97
+ a_toolset.setup_tag( t, v )
98
+ }
99
+
100
+ end
101
+
102
+ # Try load toolset file (without and with 'mxx_ru/cpp/toolsets' prefix).
103
+ #
104
+ # Raises LoadError if loading failed
105
+ def Cpp.try_load_toolset_file( file_name )
106
+ files_to_load = [ file_name,
107
+ File.join( 'mxx_ru/cpp/toolsets', file_name ) ]
108
+ load_result = files_to_load.detect { |file_to_load|
109
+ begin
110
+ require file_to_load
111
+ rescue LoadError
112
+ false
113
+ end
114
+ }
115
+ raise Mxx_ru::Invalid_value_ex.new(
116
+ "Unable to load Toolset from files: " +
117
+ "'#{files_to_load.join('; ')}'" ) unless load_result
118
+ end
119
+
120
+ end # module Cpp
121
+ end # module Mxx_ru
122
+
@@ -0,0 +1,85 @@
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 'singleton'
30
+
31
+ module Mxx_ru
32
+ module Cpp
33
+
34
+ # Arguments passed into Ruby interpreter, intended to control Mxx_ru::Cpp.
35
+ MXXCPPARG_RELEASE = "--mxx-cpp-release"
36
+ MXXCPPARG_DEBUG = "--mxx-cpp-debug"
37
+ MXXCPPARG_ONLY_ONE = "--mxx-cpp-1"
38
+ MXXCPPARG_NO_DEPENDS_ANALYZER = "--mxx-cpp-no-depends-analyzer"
39
+
40
+ # Class, detecting a mode of Mxx_ru::Cpp is running
41
+ class Mode
42
+ include Singleton
43
+
44
+ attr_reader :is_release
45
+ attr_reader :is_debug
46
+ attr_reader :is_only_one
47
+ attr_reader :is_no_depends_analyzer
48
+
49
+ # Constructor checks for a special arguments in a command line
50
+ def initialize
51
+ @is_release = ARGV.include?( MXXCPPARG_RELEASE )
52
+ @is_debug = ARGV.include?( MXXCPPARG_DEBUG )
53
+ @is_only_one = ARGV.include?( MXXCPPARG_ONLY_ONE )
54
+ @is_no_depends_analyzer = ARGV.include?( MXXCPPARG_NO_DEPENDS_ANALYZER )
55
+ @manual_dry_run_counter = 0
56
+ end
57
+
58
+ # It should be executed before build/clean of subprojects.
59
+ # If is_only_one option is set and manual_dry_run_counter is equal to 0,
60
+ # manual dry_run mode is activated.
61
+ def before_subprj_processing
62
+ if is_only_one
63
+ if 0 == @manual_dry_run_counter
64
+ Mxx_ru::Util::Mode.instance.manual_dry_run( true )
65
+ end
66
+ @manual_dry_run_counter += 1
67
+ end
68
+ end
69
+
70
+ # It should be executed after build/clean of subprojects.
71
+ # If is_only_one option is set and manual_dry_run_counter is equal to 0,
72
+ # manual dry_run mode is activated.
73
+ def after_subprj_processing
74
+ if is_only_one
75
+ @manual_dry_run_counter -= 1
76
+ if 0 == @manual_dry_run_counter
77
+ Mxx_ru::Util::Mode.instance.manual_dry_run( false )
78
+ end
79
+ end
80
+ end
81
+
82
+ end
83
+
84
+ end # module Cpp
85
+ end # module Mxx_ru