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,428 @@
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
+ module Toolsets
34
+
35
+ # Toolset implemetation for Visual C++
36
+ class Vc_family < Mxx_ru::Cpp::Toolset
37
+ public
38
+ def initialize( a_name )
39
+ super( a_name )
40
+
41
+ setup_tag( "host_os", "mswin" )
42
+ setup_tag( "target_os", "mswin" )
43
+ end
44
+
45
+ # Returns compiler name.
46
+ def compiler_name
47
+ return "cl"
48
+ end
49
+
50
+ # Returns linker name.
51
+ def linker_name
52
+ return "link"
53
+ end
54
+
55
+ # Returns librarian name.
56
+ def librarian_name
57
+ return "lib"
58
+ end
59
+
60
+ # Returns resource compiler name.
61
+ def rc_name
62
+ return "rc"
63
+ end
64
+
65
+ # See description at Mxx_ru::Cpp::Toolset#setup_mandatory_options.
66
+ def setup_mandatory_options( target )
67
+
68
+ target.compiler_option( "-nologo" )
69
+ target.linker_option( "/NOLOGO" )
70
+ target.librarian_option( "/NOLOGO" )
71
+ target.cpp_compiler_option( "-EHsc" )
72
+
73
+ if RUNTIME_DEBUG == target.mxx_runtime_mode
74
+ target.compiler_option( "-Zi" )
75
+ target.linker_option( "/DEBUG" )
76
+ setup_vc_specific_debug_options( target )
77
+ elsif RUNTIME_RELEASE == target.mxx_runtime_mode
78
+ target.define( "NDEBUG" )
79
+ if OPTIM_SIZE == target.mxx_optimization
80
+ target.compiler_option( "-O1" )
81
+ else
82
+ target.compiler_option( "-O2" )
83
+ end
84
+ end
85
+
86
+ if RTTI_ENABLED == target.mxx_rtti_mode
87
+ target.cpp_compiler_option( "-GR" )
88
+ end
89
+
90
+ if RTL_SHARED == target.mxx_rtl_mode
91
+ if THREADING_SINGLE == target.mxx_threading_mode
92
+ raise Mxx_ru::Unsupported_mode_ex.new(
93
+ "Visual C++ not support single-threaded shared RTL" )
94
+ else
95
+ if RUNTIME_DEBUG == target.mxx_runtime_mode
96
+ target.compiler_option( "-MDd" )
97
+ else
98
+ target.compiler_option( "-MD" )
99
+ end
100
+ end
101
+ else
102
+ if THREADING_MULTI == target.mxx_threading_mode
103
+ if RUNTIME_DEBUG == target.mxx_runtime_mode
104
+ target.compiler_option( "-MTd" )
105
+ else
106
+ target.compiler_option( "-MT" )
107
+ end
108
+ else
109
+ if RUNTIME_DEBUG == target.mxx_runtime_mode
110
+ target.compiler_option( "-MLd" )
111
+ else
112
+ target.compiler_option( "-ML" )
113
+ end
114
+ end
115
+ end
116
+
117
+ if target.target_type.name == Dll_target_type::TYPE
118
+ target.compiler_option( "-LD" )
119
+ end
120
+
121
+ if SCREEN_WINDOW == target.mxx_screen_mode
122
+ target.linker_option( "/SUBSYSTEM:WINDOWS" )
123
+ else
124
+ target.linker_option( "/SUBSYSTEM:CONSOLE" )
125
+ end
126
+
127
+ # All defines and all include_path should be applied
128
+ # to resource compiler too.
129
+ target.mxx_all_defines.each { |d|
130
+ target.compiler_option( "-D" + d )
131
+ target.mswin_rc_option( "/d" + d )
132
+ }
133
+
134
+ target.mxx_all_include_paths.each { |p|
135
+ target.compiler_option( "-I" + p )
136
+ target.mswin_rc_option( "/i" + p )
137
+ }
138
+
139
+ # Resource compiler specific options.
140
+ target.mxx_all_mswin_rc_defines.each { |d|
141
+ target.mswin_rc_option( "/d" + d )
142
+ }
143
+ target.mxx_all_mswin_rc_include_paths.each { |p|
144
+ target.mswin_rc_option( "/i" + p )
145
+ }
146
+
147
+ end
148
+
149
+ # Common description see Mxx_ru::Cpp::Toolset#clean_lib_specific_files.
150
+ #
151
+ # Removes VC specific garbage files.
152
+ def clean_lib_specific_files(
153
+ a_lib_file,
154
+ a_lib_info,
155
+ a_target )
156
+
157
+ clean_vc_specific_garbage( a_lib_file )
158
+ end
159
+
160
+ # See description at Mxx_ru::Cpp::Toolset#clean_dll_specific_files.
161
+ #
162
+ # Removes import library if exists.
163
+ #
164
+ # Removes *.ilk, *.pdb files.
165
+ def clean_dll_specific_files(
166
+ a_dll_file,
167
+ a_dll_info,
168
+ a_target )
169
+
170
+ # Remove import library if exists.
171
+ if nil != a_dll_info.link_name
172
+ implib_name = File.join( [ a_dll_info.link_path, a_dll_info.link_name ] )
173
+ Mxx_ru::Util::delete_file( implib_name )
174
+
175
+ # *.exp files are also created by Visual C++.
176
+ explib_name =
177
+ Mxx_ru::Util::change_file_ext( implib_name, ".exp" )
178
+ Mxx_ru::Util::delete_file( explib_name )
179
+ end
180
+
181
+ clean_vc_specific_garbage( a_dll_file )
182
+ end
183
+
184
+ # See description at Mxx_ru::Cpp::Toolset#clean_exe_specific_files.
185
+ #
186
+ # Removing *.ilk, *.pdb files.
187
+ def clean_exe_specific_files(
188
+ a_exe_file,
189
+ a_exe_info,
190
+ a_target )
191
+
192
+ clean_vc_specific_garbage( a_exe_file )
193
+ end
194
+
195
+ # See description at Mxx_ru::Cpp::Toolset#obj_file_ext.
196
+ def obj_file_ext
197
+ return ".obj"
198
+ end
199
+
200
+ # See description at Mxx_ru::Cpp::Toolset#make_c_obj_command_lines.
201
+ def make_c_obj_command_lines(
202
+ obj_name,
203
+ source_name,
204
+ compiler_options,
205
+ target )
206
+
207
+ tmpfile = Mxx_ru::Util::Tmp_files.instance.create(
208
+ "-c -TC -Fo#{obj_name} " +
209
+ "#{compiler_options.join(' ')} #{source_name}" )
210
+
211
+ return [ "#{compiler_name} @#{tmpfile}" ]
212
+ end
213
+
214
+ # See description at Mxx_ru::Cpp::Toolset#make_c_obj_command_lines.
215
+ def make_cpp_obj_command_lines(
216
+ obj_name,
217
+ source_name,
218
+ compiler_options,
219
+ target )
220
+
221
+ tmpfile = Mxx_ru::Util::Tmp_files.instance.create(
222
+ "-c -TP -Fo#{obj_name} " +
223
+ "#{compiler_options.join(' ')} #{source_name}" )
224
+
225
+ return [ "#{compiler_name} @#{tmpfile}" ]
226
+ end
227
+
228
+ # See description at Mxx_ru::Cpp::Toolset#mswin_res_file_name.
229
+ def mswin_res_file_name( source_name )
230
+ return source_name + ".res"
231
+ end
232
+
233
+ # See description at Mxx_ru::Cpp::Toolset#make_mswin_res_command_lines.
234
+ def make_mswin_res_command_lines(
235
+ res_name,
236
+ rc_file,
237
+ rc_options,
238
+ target )
239
+
240
+ return [ "#{rc_name} " +
241
+ "#{rc_options.join(' ')} /r " +
242
+ "/fo#{res_name} #{rc_file}" ]
243
+ end
244
+
245
+ # See description at Mxx_ru::Cpp::Toolset#lib_file_name.
246
+ def lib_file_name( source_name )
247
+ return source_name + ".lib"
248
+ end
249
+
250
+ # See description at Mxx_ru::Cpp::Toolset#lib_link_name.
251
+ def lib_link_name( source_name )
252
+ return lib_file_name( source_name )
253
+ end
254
+
255
+ # See description at Mxx_ru::Cpp::Toolset#make_lib_command_lines.
256
+ def make_lib_command_lines(
257
+ lib_name,
258
+ obj_files,
259
+ librarian_options,
260
+ target )
261
+
262
+ tmpfile = Mxx_ru::Util::Tmp_files.instance.create(
263
+ "#{librarian_options.join(' ')} " +
264
+ "/OUT:#{lib_name} #{obj_files.join(' ')}" )
265
+
266
+ return [ "#{librarian_name} @#{tmpfile}" ]
267
+ end
268
+
269
+ # See description at Mxx_ru::Cpp::Toolset#dll_file_name.
270
+ def dll_file_name( source_name )
271
+ return source_name + ".dll"
272
+ end
273
+
274
+ # See description at Mxx_ru::Cpp::Toolset#implib_link_name.
275
+ def implib_link_name(
276
+ dll_real_name,
277
+ target )
278
+
279
+ # Import library should be defined explicitly for Visual C++.
280
+ if nil != target.mxx_implib_path
281
+ return lib_file_name( target.mxx_target_name )
282
+ end
283
+
284
+ return nil
285
+ end
286
+
287
+ # See description at Mxx_ru::Cpp::Toolset#implib_link_path.
288
+ #
289
+ # Returns a value, based on
290
+ # Mxx_ru::Cpp::Target#mxx_implib_path.
291
+ def implib_link_path(
292
+ dll_real_name,
293
+ dll_real_path,
294
+ target )
295
+ return target.mxx_obj_placement.get_lib(
296
+ target.mxx_implib_path, self, target )
297
+ end
298
+
299
+ # See description at Mxx_ru::Cpp::Toolset#make_dll_command_lines.
300
+ def make_dll_command_lines(
301
+ a_dll_name,
302
+ a_dll_info,
303
+ a_linker_lists,
304
+ a_target )
305
+
306
+ result = "/DLL " +
307
+ "#{a_linker_lists.linker_options.join(' ')} " +
308
+ "/OUT:#{a_dll_name} "
309
+
310
+ if a_linker_lists.resources.size
311
+ result << "#{a_target.mxx_all_mswin_rlink_options.join(' ')} "
312
+ end
313
+
314
+ if nil != a_dll_info.link_name
315
+ implib_name = File.join( [ a_dll_info.link_path,
316
+ a_dll_info.link_name ] )
317
+ result << "/IMPLIB:#{implib_name} "
318
+ end
319
+
320
+ a_linker_lists.lib_paths.each { |p| result << "/LIBPATH:#{p} " }
321
+
322
+ result << "#{a_linker_lists.objs.join(' ')} "
323
+ result << "#{a_linker_lists.libs.join(' ')} "
324
+ result << "#{a_linker_lists.resources.join(' ')} "
325
+
326
+ tmpfile = Mxx_ru::Util::Tmp_files.instance.create( result )
327
+
328
+ return [ "#{linker_name} @#{tmpfile}" ]
329
+ end
330
+
331
+ # See description at Mxx_ru::Cpp::Toolset#make_dll_requirements.
332
+ def make_dll_requirements(
333
+ a_dll_name,
334
+ a_dll_info,
335
+ a_linker_lists,
336
+ a_target )
337
+
338
+ result = Dll_requirements.new
339
+
340
+ # Dependencies are exists only if import library is present.
341
+ if nil != a_dll_info.link_name
342
+ result.add_libs( [ a_dll_info.link_name ] )
343
+ result.add_lib_paths( [ a_dll_info.link_path ] )
344
+ end
345
+
346
+ return result
347
+ end
348
+
349
+ # See description at Mxx_ru::Cpp::Toolset#exe_file_name.
350
+ def exe_file_name( source_name )
351
+ return source_name + ".exe"
352
+ end
353
+
354
+ # See description at Mxx_ru::Cpp::Toolset#make_exe_command_lines.
355
+ def make_exe_command_lines(
356
+ a_exe_name,
357
+ a_exe_info,
358
+ a_linker_lists,
359
+ a_target )
360
+
361
+ result = "#{a_linker_lists.linker_options.join(' ')} " +
362
+ "/OUT:#{a_exe_name} "
363
+
364
+ if a_linker_lists.resources.size
365
+ result << "#{a_target.mxx_all_mswin_rlink_options.join(' ')} "
366
+ end
367
+
368
+ a_linker_lists.lib_paths.each { |p| result << "/LIBPATH:#{p} " }
369
+
370
+ result << "#{a_linker_lists.objs.join(' ')} "
371
+ result << "#{a_linker_lists.libs.join(' ')} "
372
+ result << "#{a_linker_lists.resources.join(' ')} "
373
+
374
+ tmpfile = Mxx_ru::Util::Tmp_files.instance.create( result )
375
+
376
+ return [ "#{linker_name} @#{tmpfile}" ]
377
+ end
378
+
379
+ # Setting up VC specific options for managing PDB files.
380
+ #
381
+ # Adding '/Fd<full-target-name>.pdb' option for compiler.
382
+ # Adding '/PDB:<full-target-name>.pdb' option for linker (in case
383
+ # of EXE or DLL).
384
+ def setup_vc_specific_debug_options( target )
385
+ full_name =
386
+ case target.target_type.name
387
+ when Exe_target_type::TYPE:
388
+ make_exe_name( target.mxx_target_name, target ).full_name
389
+ when Dll_target_type::TYPE:
390
+ make_dll_name( target.mxx_target_name, target ).full_name
391
+ when Lib_target_type::TYPE:
392
+ make_lib_name( target.mxx_target_name, target ).full_name
393
+ else nil
394
+ end
395
+ if full_name
396
+ pdb_file = Mxx_ru::Util::change_file_ext( full_name, ".pdb" )
397
+ target.compiler_option( "/Fd#{pdb_file}" )
398
+ target.linker_option( "/PDB:#{pdb_file}" )
399
+ end
400
+ end
401
+
402
+ # Remove VC specific garbage.
403
+ #
404
+ # In DEBUG mode: *.ilk, *.pdb files.
405
+ # If something exported from executable: *.exp, *.lib (only if
406
+ # *.exp file exists).
407
+ def clean_vc_specific_garbage( full_name )
408
+ Mxx_ru::Util::delete_file(
409
+ Mxx_ru::Util::change_file_ext( full_name, ".ilk" ) )
410
+ Mxx_ru::Util::delete_file(
411
+ Mxx_ru::Util::change_file_ext( full_name, ".pdb" ) )
412
+
413
+ exp_file_name = Mxx_ru::Util::change_file_ext( full_name, ".exp" )
414
+ if File.exists?( exp_file_name )
415
+ Mxx_ru::Util::delete_file( exp_file_name )
416
+ # Import library for this export-file must be removed too.
417
+ Mxx_ru::Util::delete_file(
418
+ Mxx_ru::Util::change_file_ext( full_name, ".lib" ) )
419
+ end
420
+ end
421
+
422
+ end # class Vc_family
423
+
424
+ end # module Toolsets
425
+
426
+ end # module Cpp
427
+
428
+ end # module Mxx_ru
data/lib/mxx_ru/cpp.rb ADDED
@@ -0,0 +1,36 @@
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/binary_target'
31
+ require 'mxx_ru/cpp/detect_toolset'
32
+ require 'mxx_ru/cpp/target'
33
+ require 'mxx_ru/cpp/composite'
34
+
35
+ # Determining which toolset should be used.
36
+ Mxx_ru::Cpp::detect_toolset
data/lib/mxx_ru/ex.rb ADDED
@@ -0,0 +1,134 @@
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
+ module Mxx_ru
30
+
31
+ # Base class for all exceptions.
32
+ class Ex < Exception
33
+ end
34
+
35
+ # Exception, thrown on execution of 'pure abstract method'.
36
+ class Abstract_method_ex < Ex
37
+ def initialize( method_name )
38
+ super( "Pure virtual method call: " + method_name )
39
+ end
40
+ end
41
+
42
+ # Exception, thrown if returned object type is not expected.
43
+ class Invalid_cast_ex < Ex
44
+ def initialize( msg )
45
+ super( msg )
46
+ end
47
+ end
48
+
49
+ # Exception, thrown if build commands fail.
50
+ class Build_ex < Ex
51
+ def initialize( cmd_line, desc )
52
+ super( "Build error: '#{cmd_line}' returns '#{desc}'" )
53
+ end
54
+ end
55
+
56
+ # Exception, thrown if unknown target type is detected.
57
+ class Unsupported_target_type_ex < Ex
58
+ def initialize( target_class, target_type )
59
+ super( "Unsupported target type '#{target_type}'" +
60
+ " in '#{target_class}'" )
61
+ end
62
+ end
63
+
64
+ # Exception, thrown if no target object is found for given alias.
65
+ class Target_unknown_ex < Ex
66
+ def initialize( target_name )
67
+ super( "Target unknown for: " + target_name )
68
+ end
69
+ end
70
+
71
+ # Exception, thrown if value conflict for global options such as
72
+ # runtime_mode, rtl_mode, etc is detected
73
+ class Global_option_conflict_ex < Ex
74
+ # [_a_name_] Option name.
75
+ # [_a_current_] Current option value.
76
+ # [_a_current_owner_] Who was set current value.
77
+ # [_a_new_] New option value.
78
+ # [_a_new_owner_] Who tries to set current value.
79
+ def initialize(
80
+ a_name,
81
+ a_current,
82
+ a_current_owner,
83
+ a_new,
84
+ a_new_owner )
85
+
86
+ super( "Global option '#{a_name}' conflict detected! " +
87
+ "Current value '#{a_current}' set by '#{a_current_owner}'. " +
88
+ "New value '#{a_new}' required by '#{a_new_owner}'" )
89
+ end
90
+ end
91
+
92
+ # Exception, thrown if anyone tries to set invalid value to global options such as
93
+ # runtime_mode, rtl_mode, etc.
94
+ class Global_option_disallowed_value_ex < Ex
95
+ # [_a_name_] Option name.
96
+ # [_a_available_values_] Available values list. Should be Array of String.
97
+ # [_a_new_] New option value.
98
+ # [_a_new_owner_] Who tries to set new value.
99
+ def initialize(
100
+ a_name,
101
+ a_available_values,
102
+ a_new,
103
+ a_new_owner )
104
+
105
+ super( "Value '#{new}' required by '#{a_new_owner}' " +
106
+ "disallowed for global option '#{a_name}'! " +
107
+ "Allowed values are: #{a_available_values.join(' ')}" )
108
+ end
109
+ end
110
+
111
+ # Exception, thrown if some mode is not supported by the toolset.
112
+ class Unsupported_mode_ex < Ex
113
+ def initialize( msg )
114
+ super( msg )
115
+ end
116
+ end
117
+
118
+ # Exception, thrown if some dependency file is missing.
119
+ class Missing_depend_file_ex < Ex
120
+ def initialize( missing_file, depend_for )
121
+ super( "File '#{missing_file}' required by '#{depend_for}' " +
122
+ "missing" )
123
+ end
124
+ end
125
+
126
+ # Exception, thrown if some value is invalid in current context.
127
+ class Invalid_value_ex < Ex
128
+ def initialize( msg )
129
+ super( msg )
130
+ end
131
+ end
132
+
133
+ end
134
+