Mxx_ru 1.1.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 (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,283 @@
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/ex'
30
+
31
+ require 'mxx_ru/util'
32
+
33
+ module Mxx_ru
34
+
35
+ # File name of root project file.
36
+ BUILD_ROOT = "build.rb"
37
+
38
+ # Target status description.
39
+ class Target_state
40
+ # Target is absent or rebuild is required.
41
+ ABSENT = 0
42
+ # Target was rebuilt.
43
+ REBUILT = 1
44
+ # Target exists and up-to-date.
45
+ EXISTS = 2
46
+
47
+ attr_reader :state
48
+
49
+ def initialize( a_state = ABSENT )
50
+ @state = a_state
51
+ end
52
+
53
+ # Detect target status.
54
+ # Target_state object returned.
55
+ #
56
+ # [_name_] Target name.
57
+ # [_depends_] Dependencies list. Array of String.
58
+ def Target_state.detect( name, depends )
59
+
60
+ state = ABSENT
61
+
62
+ # In dry-run mode we always return that target is absent.
63
+ if !Mxx_ru::Util::Mode.instance.is_dry_run
64
+ if FileTest.exists?( name )
65
+ # It's necessary to detect time of target and it's dependencies.
66
+ target_mtime = File.mtime( name )
67
+ if nil != depends.find { |d|
68
+ if !FileTest.exists?( d )
69
+ raise Mxx_ru::Missing_depend_file_ex.new( d, name )
70
+ end
71
+ depend_mtime = File.mtime( d )
72
+ target_mtime < depend_mtime
73
+ }
74
+ # More young dependency found.
75
+ state = REBUILT
76
+ else
77
+ # Target is up-to-date.
78
+ state = EXISTS
79
+ end
80
+ end
81
+ end
82
+
83
+ return Target_state.new( state )
84
+ end
85
+
86
+ end # Class Target_state
87
+
88
+ # Map of targets loaded.
89
+ # Key is target alias -- file name with definition of a target.
90
+ @@defined_targets = Hash.new
91
+
92
+ # Root target alias.
93
+ # This target will be used in setup_target function to start building process.
94
+ @@first_target_alias = nil
95
+
96
+ def Mxx_ru.try_set_first_target_alias( a_alias )
97
+ if nil == @@first_target_alias
98
+ @@first_target_alias = a_alias.clone
99
+ end
100
+ end
101
+
102
+ def Mxx_ru.setup_target( target, build_enabled = true )
103
+ begin
104
+ if !( target_defined_for?( target.prj_alias ) )
105
+ @@defined_targets[ target.prj_alias ] = target;
106
+ end
107
+
108
+ if build_enabled && nil != @@first_target_alias &&
109
+ @@first_target_alias == target.prj_alias
110
+ # It is a root project, required to build.
111
+
112
+ # If this project is not root project file and root project file exists,
113
+ # then we will load root project file and start build process after that.
114
+ if BUILD_ROOT != target.prj_alias
115
+ if FileTest.exists?( BUILD_ROOT )
116
+ require BUILD_ROOT
117
+ end
118
+ end
119
+
120
+ if Mxx_ru::Util::Mode.instance.is_clean
121
+ target.clean
122
+ else
123
+ Mxx_ru::Util::build_call_wrapper( target )
124
+ end
125
+ end
126
+
127
+ return target
128
+ rescue Mxx_ru::Ex => ex
129
+ $stderr.print "<<<[#{ex.class.name}]\t#{ex}>>>\n"
130
+ exit( -2 )
131
+ end
132
+ end
133
+
134
+ def Mxx_ru.query_target( prj_alias, mandatory )
135
+ target = @@defined_targets[ prj_alias ]
136
+
137
+ # If target was required, we already should found it.
138
+ # Build should be stopper otherwise.
139
+ if target.nil? && mandatory
140
+ raise Target_unknown_ex.new( prj_alias )
141
+ end
142
+
143
+ return target
144
+ end
145
+
146
+ def Mxx_ru.target_defined_for?(prj_alias)
147
+ return true if @@defined_targets.has_key?( prj_alias )
148
+ return false
149
+ end
150
+
151
+ # Base class for all source code generators.
152
+ class Abstract_generator
153
+ # This method is called to generate source code required.
154
+ # Should be redefined in a child class.
155
+ #
156
+ # [_target_] Target, generator belongs to.
157
+ def build( target )
158
+ raise Abstract_method_ex.new( "Mxx_ru::Abstract_generator::build" )
159
+ end
160
+
161
+ # This method is called to cleanup of generated source code files.
162
+ #
163
+ # [_target_] Target, generator belongs to.
164
+ def clean( target )
165
+ raise Abstract_method_ex.new( "Mxx_ru::Abstract_generator::clean" )
166
+ end
167
+ end
168
+
169
+ # Base class for all targets.
170
+ class Abstract_target
171
+ # List of full file names, created during a build of the target.
172
+ # It may be an empty array if target doesn't create any files.
173
+ # For example, if target is a composite or unittest.
174
+ attr_reader :mxx_full_targets_names
175
+
176
+ # Vector of subordinated projects.
177
+ attr_reader :mxx_required_prjs
178
+
179
+ # Vector of source code generators.
180
+ attr_reader :mxx_generators
181
+
182
+ def initialize( a_prj_alias )
183
+ @mxx_full_targets_names = Array.new
184
+ @mxx_prj_alias = a_prj_alias
185
+ @mxx_required_prjs = Array.new
186
+ @mxx_generators = Array.new
187
+
188
+ Mxx_ru.try_set_first_target_alias( a_prj_alias )
189
+ end
190
+
191
+ # Add one more file, created during a target build.
192
+ def mxx_add_full_target_name( a_full_name )
193
+ @mxx_full_targets_names << a_full_name
194
+ end
195
+
196
+ def prj_alias
197
+ return @mxx_prj_alias
198
+ end
199
+
200
+ # Add one more project in a list of subordinated projects.
201
+ #
202
+ # Returns target object, which is defined in subordinated project.
203
+ def required_prj( a_prj )
204
+ # If project is not loaded yet, loding it.
205
+ # Then adding created target object to the list ofd subordinated projects.
206
+ # If no target will be created, exception would be thrown.
207
+ if !Mxx_ru::target_defined_for?( a_prj )
208
+ require a_prj
209
+ end
210
+
211
+ target = Mxx_ru::query_target( a_prj, true )
212
+ @mxx_required_prjs << target
213
+
214
+ return target
215
+ end
216
+
217
+ # Add one more generator to the target.
218
+ # Reference to the target is returned.
219
+ def generator( a_generator )
220
+ @mxx_generators << a_generator
221
+ return a_generator
222
+ end
223
+
224
+ # Child classes should redefine this method.
225
+ # Target_state object is returned.
226
+ def build
227
+ raise Abstract_method_ex.new( "Abstract_target::build" )
228
+ end
229
+
230
+ # Child classes should redefine this method.
231
+ def clean
232
+ raise Abstract_method_ex.new( "Abstract_target::clean" )
233
+ end
234
+
235
+ # Executing command line given.
236
+ #
237
+ # [a_cmd_lines] Array of String
238
+ # [a_to_destroy_on_fail] Files required to be cleaned up if any of given command fail.
239
+ def Abstract_target.run( a_cmd_lines, a_to_destroy_on_fail )
240
+
241
+ a_cmd_lines.each { |c|
242
+ if Mxx_ru::Util::Mode.instance.is_show_cmd
243
+ puts "<<< #{c} >>>"
244
+ end
245
+
246
+ # Do not actually execute in dry-run mode.
247
+ if !Mxx_ru::Util::Mode.instance.is_dry_run
248
+ if !system( c )
249
+ a_to_destroy_on_fail.each { |d|
250
+ Mxx_ru::Util::delete_file( d ) }
251
+ raise Build_ex.new( c, $? )
252
+ end
253
+ end
254
+ }
255
+ end
256
+
257
+ protected
258
+ # Build of all projects required for the target.
259
+ # Returns Mxx_ru::Target_state.
260
+ def build_required_projects
261
+ state = Mxx_ru::Target_state::EXISTS
262
+ @mxx_required_prjs.each { |p|
263
+ prj_state = Mxx_ru::Util::build_call_wrapper( p )
264
+ if Mxx_ru::Target_state::EXISTS != prj_state.state
265
+ state = prj_state.state
266
+ end
267
+ }
268
+
269
+ return Mxx_ru::Target_state.new( state )
270
+ end
271
+
272
+ # Cleanup of all projects required for the target.
273
+ # Executed only if dry-run mode is disabled.
274
+ def clean_required_prjs
275
+ if !Mxx_ru::Util::Mode.instance.is_dry_run
276
+ @mxx_required_prjs.each { |p| p.clean }
277
+ end
278
+ end
279
+
280
+ end
281
+
282
+ end
283
+
@@ -0,0 +1,89 @@
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/abstract_target'
30
+ require 'mxx_ru/ex'
31
+
32
+ # Base class for all targets, which are binary executables, binary shared libraries or
33
+ # binary static libraries.
34
+ module Mxx_ru
35
+
36
+ class Binary_target < Mxx_ru::Abstract_target
37
+ def initialize( a_prj_alias )
38
+ super( a_prj_alias )
39
+
40
+ # Libraries list, which would be required to the user of current target.
41
+ @mxx_required_libs = Array.new
42
+ # Attribute showing that before return from mxx_required_libs
43
+ # dublicates should be removed.
44
+ @mxx_required_libs_changed = true
45
+ # Folder list, where libraries, encountered in mxx_required_libs,
46
+ # should be searched for
47
+ @mxx_required_lib_paths = Array.new
48
+ # Attribute showing that before return from mxx_required_lib_paths
49
+ # dublicates should be removed.
50
+ @mxx_required_lib_paths_changed = true
51
+ end
52
+
53
+ # Get all libraries list, which are required to be linked to for
54
+ # correct usage of given target.
55
+ # Returns array of strings.
56
+ def mxx_required_libs
57
+ if @mxx_required_libs_changed
58
+ @mxx_required_libs.flatten!
59
+ @mxx_required_libs_changed = false
60
+ end
61
+ return @mxx_required_libs
62
+ end
63
+
64
+ # Add library to list of requirements.
65
+ def mxx_add_required_lib( a_lib )
66
+ @mxx_required_libs << a_lib
67
+ @mxx_required_libs_changed = true
68
+ end
69
+
70
+ # Get list of all paths to libraries, which should be used to search libraries,
71
+ # returned by mxx_required_libs method.
72
+ # Returns array of strings.
73
+ def mxx_required_lib_paths
74
+ if @mxx_required_lib_paths_changed
75
+ @mxx_required_lib_paths.flatten!
76
+ @mxx_required_lib_paths_changed = false
77
+ end
78
+ return @mxx_required_lib_paths
79
+ end
80
+
81
+ # Add folder to search folders list.
82
+ def mxx_add_required_lib_path( a_path )
83
+ @mxx_required_lib_paths << a_path
84
+ @mxx_required_lib_paths_changed = true
85
+ end
86
+
87
+ end
88
+
89
+ end
@@ -0,0 +1,130 @@
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/ex'
30
+ require 'mxx_ru/abstract_target'
31
+
32
+ module Mxx_ru
33
+
34
+ # Class describing a target, which is unit-test binary application.
35
+ #
36
+ # The idea is, that there is project file, which controls the build process
37
+ # of unit-test application. In that project file target object is created,
38
+ # inherited from Mxx_ru::Binary_target.
39
+ # To initialize unit-test it's required to create one more file, where
40
+ # target object of Mxx_ru::Binary_unittest_target class is created.
41
+ # For example:
42
+ #
43
+ # File to compile unit-test.
44
+ # Mxx_ru::setup_target(
45
+ # Mxx_ru::Cpp::Exe_target.new( "test/pack/prj.rb" ) {
46
+ # ...
47
+ # }
48
+ # )
49
+ #
50
+ # File to run unit-test.
51
+ # Mxx_ru::setup_target(
52
+ # Mxx_ru::Binary_unittest_target.new(
53
+ # "test/pack/ut.rb",
54
+ # "test/pack/prj.rb ) )
55
+ #
56
+ # File to use unit-test.
57
+ # Mxx_ru::setup_target(
58
+ # Mxx_ru::Cpp::Composite_target( Mxx_ru::BUILD_ROOT ) {
59
+ # required_prj( "some/project/prj.rb" )
60
+ # required_prj( "test/pack/ut.rb" )
61
+ # }
62
+ # )
63
+ #
64
+ class Binary_unittest_target < Abstract_target
65
+
66
+ # Exception, thrown if subordinated project created more then one result name.
67
+ class Must_be_one_target_name_ex < Ex
68
+ # [_a_names_] Generated result names.
69
+ def initialize( a_names )
70
+ super( "Only one name expected in [#{a_names.join(';')}]" )
71
+ end
72
+ end
73
+
74
+ # Target, responsible for build of unit-test application.
75
+ attr_reader :mxx_target_project
76
+ # Attribute, showing that build method was already executed.
77
+ attr_reader :mxx_build_state
78
+
79
+ # Constructor.
80
+ #
81
+ # [_a_alias_] Self alias.
82
+ # [_a_target_project_] Project, responsible for build of unit-test
83
+ # application.
84
+ def initialize( a_alias, a_target_project )
85
+ super( a_alias )
86
+
87
+ @mxx_build_state = nil
88
+
89
+ @mxx_target_project = required_prj( a_target_project )
90
+ end
91
+
92
+ # Build subordinated project and run it.
93
+ #
94
+ # If unit-test application returns result, other then 0,
95
+ # exception is thrown.
96
+ def build
97
+ if !@mxx_build_state
98
+ @mxx_target_project.build
99
+
100
+ # Determining application name.
101
+ full_names = @mxx_target_project.mxx_full_targets_names
102
+ if 1 != full_names.size
103
+ raise Must_be_one_target_name_ex.new( full_names )
104
+ end
105
+
106
+ # In dry-run do not actually execute anything.
107
+ if !Mxx_ru::Util::Mode.instance.is_dry_run
108
+ puts "running unit test: #{full_names[0]}..."
109
+ if !system( full_names[ 0 ] )
110
+ puts "\n\nunit test '#{full_names[0]}' FAILED! #{$?}"
111
+ raise Build_ex.new( full_names[ 0 ], $? )
112
+ end
113
+ end
114
+
115
+ @mxx_build_state = Target_state.new( Target_state::REBUILT )
116
+ end
117
+
118
+ return @mxx_build_state
119
+ end
120
+
121
+ # Project cleanup.
122
+ #
123
+ # Just execute clean method from subordinated project.
124
+ def clean
125
+ @mxx_target_project.clean
126
+ end
127
+ end
128
+
129
+ end
130
+