Mxx_ru 1.1.0 → 1.2.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 (33) hide show
  1. data/NEWS +17 -0
  2. data/Rakefile +3 -3
  3. data/THANKS +1 -0
  4. data/lib/mxx_ru/abstract_target.rb +34 -4
  5. data/lib/mxx_ru/cpp/composite.rb +2 -1
  6. data/lib/mxx_ru/cpp/qt.rb +8 -4
  7. data/lib/mxx_ru/cpp/rucodegen.rb +8 -2
  8. data/lib/mxx_ru/cpp/target.rb +39 -2
  9. data/lib/mxx_ru/cpp/toolset.rb +20 -5
  10. data/lib/mxx_ru/cpp/toolsets/bcc_win32_family.rb +3 -1
  11. data/lib/mxx_ru/cpp/toolsets/gcc_family.rb +21 -2
  12. data/lib/mxx_ru/cpp/toolsets/gcc_mingw.rb +4 -0
  13. data/lib/mxx_ru/makestyle_generator.rb +4 -1
  14. data/lib/mxx_ru/util.rb +58 -8
  15. data/tests/cpp/cpp_sources_glob/build.rb +7 -0
  16. data/tests/cpp/cpp_sources_glob/some/module/1/f1.cpp +8 -0
  17. data/tests/cpp/cpp_sources_glob/some/module/2/f2.cpp +8 -0
  18. data/tests/cpp/cpp_sources_glob/some/module/3/f3.cpp +8 -0
  19. data/tests/cpp/cpp_sources_glob/some/module/4/f4.cpp +8 -0
  20. data/tests/cpp/cpp_sources_glob/some/module/funcs.hpp +9 -0
  21. data/tests/cpp/cpp_sources_glob/some/module/main.cpp +11 -0
  22. data/tests/cpp/cpp_sources_glob/some/module/prj.rb +10 -0
  23. data/tests/cpp/rucodegen/prj.rb +1 -1
  24. data/tests/cpp/vc_cleanup/prj_dll_no_implib.rb +1 -1
  25. data/tests/cpp/vc_cleanup/prj_dll_no_implib_simple_target_root.rb +1 -1
  26. data/tests/cpp/vc_cleanup/prj_dll_with_implib.rb +1 -1
  27. data/tests/cpp/vc_cleanup/prj_dll_with_implib_simple_target_root.rb +1 -1
  28. data/tests/cpp/vc_cleanup/prj_exe_no_implib.rb +1 -1
  29. data/tests/cpp/vc_cleanup/prj_exe_no_implib_simple_target_root.rb +1 -1
  30. data/tests/cpp/vc_cleanup/prj_lib.rb +1 -1
  31. data/tests/cpp/vc_cleanup/prj_lib_with_simple_target_root.rb +1 -1
  32. data/tests/mxx_ru/plural_form_methods/tc.rb +72 -0
  33. metadata +27 -2
data/NEWS CHANGED
@@ -1,5 +1,22 @@
1
1
  Changes in Mxx_ru
2
2
 
3
+ 1.2.0 version (2006.04.15)
4
+
5
+ Added command-line arguments --mxx-brief-show, --mxx-brief-hide and
6
+ method Mxx_ru.enable_show_brief for controlling brief description of
7
+ executed commands.
8
+
9
+ Argument prj_alias for composite_target, exe_target, lib_target and
10
+ dll_target now optional. If it omitted than Mxx_ru try detect prj_alias form
11
+ Kernel#caller result (assume what call to *_target method was made directly
12
+ in project file).
13
+
14
+ Added methods Abstract_target#required_prjs, Cpp::Target#c_sources,
15
+ Cpp::Target#cpp_sources those accept Enumerable (plural form for
16
+ corresponding singular analogs). New methods can accept result of Dir.glob().
17
+
18
+ Some fixes for MinGW C++, Borland C++ compilers.
19
+
3
20
  1.1.0 version (2006.02..2006.04)
4
21
 
5
22
  Documentation and commentaries are translated to english.
data/Rakefile CHANGED
@@ -4,18 +4,18 @@ Gem::manage_gems
4
4
  require 'rake/gempackagetask'
5
5
 
6
6
  PKG_NAME =
7
- RKG_VERSION = '1.1.0'
7
+ RKG_VERSION = '1.2.0'
8
8
 
9
9
  spec = Gem::Specification.new do |s|
10
10
  s.name = "Mxx_ru"
11
- s.version = "1.1.0"
11
+ s.version = "1.2.0"
12
12
  s.author = "The Mxx_ru Project"
13
13
  s.email = "eao197@yahoo.com"
14
14
  s.homepage = "http://www.rubyforge.com/projects/mxx-ru"
15
15
  s.platform = Gem::Platform::RUBY
16
16
  s.summary = "Mxx_ru (Make++ on Ruby) is a cross-platform build tool"
17
17
  s.files = FileList[ "{bin,tests,lib,docs,examples}/**/*" ].
18
- exclude( "rdoc" ).to_a
18
+ exclude( "rdoc" ).to_a + [ "THANKS" ]
19
19
  s.require_path = "lib"
20
20
  # s.autorequire = "rucodegen"
21
21
  # s.test_file = "tests/ts_rucodegen.rb"
data/THANKS ADDED
@@ -0,0 +1 @@
1
+ Konstantine Nazarov (rut at user dot sourceforge dot net)
@@ -179,6 +179,25 @@ module Mxx_ru
179
179
  # Vector of source code generators.
180
180
  attr_reader :mxx_generators
181
181
 
182
+ # Metacode for generating 'plural' version of singular method.
183
+ # Plural version accept Enumerable-type argument and call
184
+ # singular version for each member of Enumerable argument.
185
+ #
186
+ # For example:
187
+ # define_plural_form_method :required_prj
188
+ # define_plural_form_method :cpp_source
189
+ # produces methods
190
+ # required_prjs( items )
191
+ # cpp_sources( items )
192
+ #
193
+ def Abstract_target.define_plural_form_method( singular_method )
194
+ class_eval %Q{
195
+ def #{singular_method}s(a)
196
+ a.each { |e| #{singular_method}( e ) }
197
+ end
198
+ }
199
+ end
200
+
182
201
  def initialize( a_prj_alias )
183
202
  @mxx_full_targets_names = Array.new
184
203
  @mxx_prj_alias = a_prj_alias
@@ -214,6 +233,13 @@ module Mxx_ru
214
233
  return target
215
234
  end
216
235
 
236
+ # Plural form of required_prj.
237
+ #
238
+ # For example:
239
+ # required_prjs [ 'module1/prj.rb', 'module2/prj.rb' ]
240
+ # required_prjs Dir.glob( 'modules/**/prj.rb' )
241
+ define_plural_form_method :required_prj
242
+
217
243
  # Add one more generator to the target.
218
244
  # Reference to the target is returned.
219
245
  def generator( a_generator )
@@ -236,12 +262,16 @@ module Mxx_ru
236
262
  #
237
263
  # [a_cmd_lines] Array of String
238
264
  # [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 )
265
+ # [brief_desc] Brief description of command (will be shown if --mxx-brief-desc
266
+ # specified in command line)
267
+ def Abstract_target.run( a_cmd_lines, a_to_destroy_on_fail, brief_desc = nil )
268
+
269
+ puts "#{brief_desc.capitalize} ..." \
270
+ if Mxx_ru::Util::Mode.instance.is_brief_desc and nil != brief_desc
240
271
 
241
272
  a_cmd_lines.each { |c|
242
- if Mxx_ru::Util::Mode.instance.is_show_cmd
243
- puts "<<< #{c} >>>"
244
- end
273
+ puts "<<< #{c} >>>" \
274
+ if Mxx_ru::Util::Mode.instance.is_show_cmd
245
275
 
246
276
  # Do not actually execute in dry-run mode.
247
277
  if !Mxx_ru::Util::Mode.instance.is_dry_run
@@ -96,7 +96,8 @@ module Mxx_ru
96
96
  # required_prj 'some_project.rb'
97
97
  # required_prj 'some_another_project.rb'
98
98
  # }
99
- def Cpp.composite_target( prj_alias, &block )
99
+ def Cpp.composite_target( prj_alias = nil, &block )
100
+ prj_alias = Mxx_ru::Util::prj_alias_form_caller( caller ) unless prj_alias
100
101
  Mxx_ru::setup_target Composite_target.new( prj_alias, &block )
101
102
  end
102
103
 
data/lib/mxx_ru/cpp/qt.rb CHANGED
@@ -173,14 +173,16 @@ module Cpp
173
173
  header_file, [ ui ] ).state
174
174
  Mxx_ru::Abstract_target::run(
175
175
  [ "#{@uic_name} -o #{header_file} #{ui}" ],
176
- [ header_file ] )
176
+ [ header_file ],
177
+ "building header file #{header_file}" )
177
178
  end
178
179
  if Target_state::EXISTS != Target_state.detect(
179
180
  cpp_file, [ ui, header_file ] ).state
180
181
  Mxx_ru::Abstract_target::run(
181
182
  [ "#{@uic_name} -i #{header_file} " +
182
183
  "-o #{cpp_file} #{ui}" ],
183
- [ cpp_file ] )
184
+ [ cpp_file ],
185
+ "building source file #{cpp_file}" )
184
186
  end
185
187
  }
186
188
  end
@@ -225,7 +227,8 @@ module Cpp
225
227
  Mxx_ru::Abstract_target::run(
226
228
  [ "#{moc_name} -o #{moc_full} " +
227
229
  "#{header_full}" ],
228
- [ moc_full ] )
230
+ [ moc_full ],
231
+ "building moc file #{moc_full}" )
229
232
  end
230
233
 
231
234
  add_cpp_source( a_target, moc )
@@ -282,7 +285,8 @@ module Cpp
282
285
  Mxx_ru::Abstract_target::run(
283
286
  [ "#{moc_name} -o #{moc_full} " +
284
287
  "#{cpp_full}" ],
285
- [ moc_full ] )
288
+ [ moc_full ],
289
+ "building moc file #{moc_full}" )
286
290
  end
287
291
  }
288
292
  end
@@ -88,14 +88,20 @@ class RuCodeGen < Abstract_generator
88
88
  # Perform code generation.
89
89
  def build( target )
90
90
  @scripts.each do |s|
91
- Abstract_target.run( make_build_cmd( s, :build ), [] )
91
+ Abstract_target.run(
92
+ make_build_cmd( s, :build ),
93
+ [],
94
+ "running code generation script #{s} (build mode)" )
92
95
  end
93
96
  end
94
97
 
95
98
  # Perform cleanup of generated files.
96
99
  def clean( target )
97
100
  @scripts.each do |s|
98
- Abstract_target.run( make_build_cmd( s, :clean ), [] )
101
+ Abstract_target.run(
102
+ make_build_cmd( s, :clean ),
103
+ [],
104
+ "running code generation script #{s} (clean mode)" )
99
105
  end
100
106
  end
101
107
 
@@ -788,6 +788,18 @@ module Mxx_ru
788
788
 
789
789
  # Add one C-file to the target.
790
790
  #
791
+ # Note: if a_file_name contains prefix equal to current sources_root
792
+ # than mxx_ru does not add sources_root to name of file. For example:
793
+ # Mxx_ru::Cpp::exe_target( 'some/module/prj.rb' ) {
794
+ # ...
795
+ # c_source 'f1.c' # become 'some/module/f1.c'
796
+ # c_source 'some/module/impl/f2.c' # remains 'some/module/impl/f2.c
797
+ # This approach will be useful with Dir.glob:
798
+ # Mxx_ru::Cpp::exe_target( 'some/module/prj.rb' ) {
799
+ # ...
800
+ # c_sources Dir.glob( 'some/module/**/*.c' )
801
+ # }
802
+ #
791
803
  # [_a_file_name_] The name of a file added.
792
804
  # [_a_options_] Optional list of a compiler options for that file.
793
805
  # When command line would be created, this options would
@@ -799,6 +811,18 @@ module Mxx_ru
799
811
 
800
812
  # Add one C++-file to the target.
801
813
  #
814
+ # Note: if a_file_name contains prefix equal to current sources_root
815
+ # than mxx_ru does not add sources_root to name of file. For example:
816
+ # Mxx_ru::Cpp::exe_target( 'some/module/prj.rb' ) {
817
+ # ...
818
+ # cpp_source 'f1.cpp' # become 'some/module/f1.cpp'
819
+ # cpp_source 'some/module/impl/f2.cpp' # remains 'some/module/impl/f2.cpp
820
+ # This approach will be useful with Dir.glob:
821
+ # Mxx_ru::Cpp::exe_target( 'some/module/prj.rb' ) {
822
+ # ...
823
+ # cpp_sources Dir.glob( 'some/module/**/*.cpp' )
824
+ # }
825
+ #
802
826
  # [_a_file_name_] The name of a file added.
803
827
  # [_a_options_] Optional list of a compiler options for that file.
804
828
  # When command line would be created, this options would
@@ -808,6 +832,11 @@ module Mxx_ru
808
832
  create_full_src_file_name( a_file_name ), a_options ) )
809
833
  end
810
834
 
835
+ # Plural form for c_source and cpp_source. Does not allow specify options
836
+ # for source files.
837
+ define_plural_form_method :c_source
838
+ define_plural_form_method :cpp_source
839
+
811
840
  # Set mswin resource file name.
812
841
  #
813
842
  # [_a_rc_file_] The name of rc-file.
@@ -936,11 +965,18 @@ module Mxx_ru
936
965
 
937
966
  # Creation of a complete name of a source file
938
967
  # taking the value of mxx_sources_root into account
968
+ #
969
+ # If a_file_name starts with current value of mxx_sources_root
970
+ # than a_file_name remains unchanged.
939
971
  def create_full_src_file_name( a_file_name )
940
972
  if "" == mxx_sources_root
941
973
  return a_file_name
942
974
  else
943
- return File.join( [ mxx_sources_root, a_file_name ] )
975
+ if a_file_name[ 0..mxx_sources_root.size ] == mxx_sources_root + '/'
976
+ return a_file_name
977
+ else
978
+ return File.join( [ mxx_sources_root, a_file_name ] )
979
+ end
944
980
  end
945
981
  end
946
982
 
@@ -1356,7 +1392,8 @@ module Mxx_ru
1356
1392
  def Cpp.generate_simple_target_method( target_type )
1357
1393
  target_class_name = target_type.to_s.capitalize
1358
1394
  class_eval %Q{
1359
- def Cpp.#{target_type}( prj_alias, &block )
1395
+ def Cpp.#{target_type}( prj_alias = nil, &block )
1396
+ prj_alias = Mxx_ru::Util::prj_alias_form_caller( caller ) unless prj_alias
1360
1397
  Mxx_ru::setup_target #{target_class_name}.new( prj_alias, &block )
1361
1398
  end
1362
1399
  }
@@ -353,7 +353,10 @@ module Mxx_ru
353
353
  full_name, target.mxx_mswin_rc_file.name,
354
354
  target.mxx_all_mswin_rc_options, target )
355
355
 
356
- Mxx_ru::Abstract_target::run( cmd_lines, [ full_name ] )
356
+ Mxx_ru::Abstract_target::run(
357
+ cmd_lines,
358
+ [ full_name ],
359
+ "compilling #{full_name}" )
357
360
 
358
361
  state = Mxx_ru::Target_state.new( Mxx_ru::Target_state::REBUILT )
359
362
  end
@@ -406,7 +409,10 @@ module Mxx_ru
406
409
  lib_file, target.mxx_obj_files,
407
410
  target.mxx_all_librarian_options, target )
408
411
 
409
- Mxx_ru::Abstract_target::run( cmd_lines, [ lib_file ] )
412
+ Mxx_ru::Abstract_target::run(
413
+ cmd_lines,
414
+ [ lib_file ],
415
+ "building #{lib_file}" )
410
416
 
411
417
  lib_state = Mxx_ru::Target_state.new( Mxx_ru::Target_state::REBUILT )
412
418
  end
@@ -486,7 +492,10 @@ module Mxx_ru
486
492
  cmd_lines = make_dll_command_lines(
487
493
  dll_file, dll_info, link_lists, target )
488
494
 
489
- Mxx_ru::Abstract_target::run( cmd_lines, [ dll_file ] )
495
+ Mxx_ru::Abstract_target::run(
496
+ cmd_lines,
497
+ [ dll_file ],
498
+ "building #{dll_file}" )
490
499
 
491
500
  dll_state = Mxx_ru::Target_state.new( Mxx_ru::Target_state::REBUILT )
492
501
  end
@@ -555,7 +564,10 @@ module Mxx_ru
555
564
  cmd_lines = make_exe_command_lines(
556
565
  exe_file, exe_info, link_lists, target )
557
566
 
558
- Mxx_ru::Abstract_target::run( cmd_lines, [ exe_file ] )
567
+ Mxx_ru::Abstract_target::run(
568
+ cmd_lines,
569
+ [ exe_file ],
570
+ "building #{exe_file}" )
559
571
 
560
572
  exe_state = Mxx_ru::Target_state.new( Mxx_ru::Target_state::REBUILT )
561
573
  end
@@ -893,7 +905,10 @@ module Mxx_ru
893
905
  target )
894
906
 
895
907
  # Executing.
896
- Mxx_ru::Abstract_target::run( cmd_lines, [ o.name ] )
908
+ Mxx_ru::Abstract_target::run(
909
+ cmd_lines,
910
+ [ o.name ],
911
+ "compiling #{o.source.name}" )
897
912
  }
898
913
 
899
914
  end
@@ -428,7 +428,9 @@ module Mxx_ru
428
428
 
429
429
  if 0 != a_linker_lists.lib_paths.size
430
430
  result << "/L;"
431
- a_linker_lists.lib_paths.each { |p| result << "#{p};" }
431
+ unix2win_mass( a_linker_lists.lib_paths ).each { |p|
432
+ result << "#{p};"
433
+ }
432
434
  result << " "
433
435
  end
434
436
 
@@ -206,7 +206,9 @@ module Mxx_ru
206
206
  a_linker_lists.lib_paths.each { |p| result << "-L#{p} " }
207
207
 
208
208
  result << "#{a_linker_lists.objs.join(' ')} "
209
- a_linker_lists.libs.each { |l| result << "-l#{l} " }
209
+ a_linker_lists.libs.each { |l|
210
+ result << "-l#{port_specific_lib_name_checker(l)} "
211
+ }
210
212
 
211
213
  result << port_specific_dll_link_options(
212
214
  a_dll_name, a_dll_info, a_linker_lists, a_target )
@@ -258,7 +260,9 @@ module Mxx_ru
258
260
  a_linker_lists.lib_paths.each { |p| result << "-L#{p} " }
259
261
 
260
262
  result << "#{a_linker_lists.objs.join(' ')} "
261
- a_linker_lists.libs.each { |l| result << "-l#{l} " }
263
+ a_linker_lists.libs.each { |l|
264
+ result << "-l#{port_specific_lib_name_checker(l)} "
265
+ }
262
266
 
263
267
  result << port_specific_exe_link_options(
264
268
  a_exe_name, a_exe_info, a_linker_lists, a_target )
@@ -286,6 +290,11 @@ module Mxx_ru
286
290
  return ""
287
291
  end
288
292
 
293
+ # Return correct name of library to be given for linker.
294
+ def port_specific_lib_name_checker(library_name)
295
+ library_name
296
+ end
297
+
289
298
  end # class Gcc_family
290
299
 
291
300
  # Toolset implemetation for GCC compiler for Win32.
@@ -373,6 +382,16 @@ module Mxx_ru
373
382
  return ""
374
383
  end
375
384
 
385
+ # Checks library name for suffix '.lib' and return name without
386
+ # that suffix.
387
+ def port_specific_lib_name_checker(library_name)
388
+ if /\.lib$/i =~ library_name
389
+ Mxx_ru::Util::remove_file_ext(library_name)
390
+ else
391
+ library_name
392
+ end
393
+ end
394
+
376
395
  end # class Gcc_mswin_family
377
396
 
378
397
  end # module Toolsets
@@ -64,6 +64,10 @@ module Mxx_ru
64
64
  target.linker_option( "-mconsole" )
65
65
  end
66
66
 
67
+ if THREADING_MULTI == target.mxx_threading_mode
68
+ target.compiler_option( "-mthreads" )
69
+ end
70
+
67
71
  # ��� defines � ��� include_path ������ ���������������� � ��
68
72
  # ���������� ��������.
69
73
  target.mxx_all_defines.each { |d|
@@ -100,7 +100,10 @@ class Makestyle_generator < Abstract_generator
100
100
 
101
101
  if need_build
102
102
  # It's required to run all commands to build target.
103
- Abstract_target.run( @build_cmds, [] )
103
+ Abstract_target.run(
104
+ @build_cmds,
105
+ [],
106
+ "building #{@target_files.join(', ')}" )
104
107
  end
105
108
  end
106
109
 
data/lib/mxx_ru/util.rb CHANGED
@@ -41,10 +41,15 @@ module Mxx_ru
41
41
  MXXARG_KEEP_TMPS = "--mxx-keep-tmps"
42
42
  MXXARG_SHOW_TMPS = "--mxx-show-tmps"
43
43
  MXXARG_DRY_RUN = "--mxx-dry-run"
44
+ MXXARG_BRIEF_DESC = '--mxx-brief-show'
45
+ MXXARG_BRIEF_DESC_DISABLED = '--mxx-brief-hide'
44
46
 
45
47
  # OS name, script is run on.
46
48
  @@host_os = nil
47
49
 
50
+ # Regular expression to parse entries in Kernel#caller result.
51
+ CALLER_ENTRY_REGEX = /^(.+):\d+(:in\s.+){0,1}$/
52
+
48
53
  # Class, which detects Mxx_ru current mode.
49
54
  class Mode
50
55
  include Singleton
@@ -53,6 +58,7 @@ module Mxx_ru
53
58
  attr_reader :is_show_cmd
54
59
  attr_reader :is_keep_tmps
55
60
  attr_reader :is_show_tmps
61
+ attr_reader :is_brief_desc
56
62
 
57
63
  # Constructor checks for special arguments in command line.
58
64
  def initialize
@@ -61,6 +67,11 @@ module Mxx_ru
61
67
  @is_keep_tmps = ARGV.include?( MXXARG_KEEP_TMPS )
62
68
  @is_show_tmps = ARGV.include?( MXXARG_SHOW_TMPS )
63
69
  @is_dry_run = ARGV.include?( MXXARG_DRY_RUN )
70
+ @is_brief_desc = ARGV.include?( MXXARG_BRIEF_DESC )
71
+ @is_brief_desc_disabled = ARGV.include?( MXXARG_BRIEF_DESC_DISABLED )
72
+
73
+ @is_brief_desc = false if @is_brief_desc_disabled
74
+
64
75
  @is_manual_dry_run = false
65
76
  end
66
77
 
@@ -73,11 +84,18 @@ module Mxx_ru
73
84
 
74
85
  # On/Off manual dry-run mode.
75
86
  # In some cases it's efficient to turn it on for some time.
76
- # For example, it's used to handle subprojects with --mxx-cpp-1 option set.
87
+ # For example, it's used to handle subprojects with --mxx-cpp-1 option
88
+ # set.
77
89
  def manual_dry_run( a_is_manual_dry_run )
78
90
  @is_manual_dry_run = a_is_manual_dry_run
79
91
  end
80
92
 
93
+ # Try to manually enable 'show-brief' mode. Attempt ignored if
94
+ # '--mxx-show-brief-disabled' was specified.
95
+ def try_enable_show_brief
96
+ @is_brief_desc = true unless @is_brief_desc_disabled
97
+ end
98
+
81
99
  end
82
100
 
83
101
  # Returns file name without last extension.
@@ -177,10 +195,10 @@ module Mxx_ru
177
195
 
178
196
  end # class Tmp_files
179
197
 
180
- # Auxiliary function for correct execution of build method of target object.
181
- # Before execution Tmp_files.push is executed, and after execution of build method
182
- # Tmp_files.pop is called. This way we are removing temporary files
183
- # created during a compilation of given target.
198
+ # Auxiliary function for correct execution of build method of target
199
+ # object. Before execution Tmp_files.push is executed, and after execution
200
+ # of build method Tmp_files.pop is called. This way we are removing
201
+ # temporary files created during a compilation of given target.
184
202
  def Util.build_call_wrapper( a_target )
185
203
  begin
186
204
  Tmp_files.instance.push
@@ -194,8 +212,8 @@ module Mxx_ru
194
212
  # Create folder if it isn't exist.
195
213
  #
196
214
  # All chain of names is tracked. For example, if we trying to create
197
- # output/release/lib folder, and only output is exists, then release/lib folders
198
- # are created.
215
+ # output/release/lib folder, and only output is exists, then release/lib
216
+ # folders are created.
199
217
  def Util.create_dir( a_name )
200
218
  # Dividing the chain.
201
219
  chain = Array.new
@@ -219,7 +237,8 @@ module Mxx_ru
219
237
  # If dry-run mode wasn't set, checking for existance.
220
238
  # If it isn't exists, trying to create it.
221
239
  #
222
- # In a dry-run mode Mxx_ru always assumes folder is exists, even if it isn't.
240
+ # In a dry-run mode Mxx_ru always assumes folder is exists, even if it
241
+ # isn't.
223
242
  def Util.ensure_path_exists( a_path_name )
224
243
  if !Mxx_ru::Util::Mode.instance.is_dry_run
225
244
  if !FileTest.exists?( a_path_name )
@@ -252,7 +271,38 @@ module Mxx_ru
252
271
  return a_pathname
253
272
  end
254
273
 
274
+ # Extract file name from 'Kernel#caller' result for using this
275
+ # name as project alias.
276
+ def Util.prj_alias_form_caller( caller_result )
277
+ r = CALLER_ENTRY_REGEX.match( caller_result[ 0 ] )[ 1 ]
278
+ # Name can starts with './' ('./some/module/prj.rb'). That name
279
+ # must be transformed to 'some/module/prj.rb'.
280
+ if r[ 0..1 ] == './'
281
+ r[ 2...r.size ]
282
+ else
283
+ r
284
+ end
285
+ end
286
+
255
287
  end # module Util
256
288
 
289
+ # Manually enable 'show-brief' mode.
290
+ #
291
+ # Intended to use in project files:
292
+ # Mxx_ru::Cpp::exe_target( 'some.prj' ) {
293
+ # ...
294
+ # Mxx_ru::enable_show_brief
295
+ # ...
296
+ # }
297
+ # 'show-brief' is global mode. Once enabled it cannot be disabled
298
+ # form inside another project file.
299
+ #
300
+ # Call to Mxx_ru::enable_show_brief ignored if '--mxx-show-brief-disabled'
301
+ # specified in command-line.
302
+ #
303
+ def Mxx_ru.enable_show_brief
304
+ Util::Mode.instance.try_enable_show_brief
305
+ end
306
+
257
307
  end # module Mxx_ru
258
308
 
@@ -0,0 +1,7 @@
1
+ require 'mxx_ru/cpp'
2
+
3
+ Mxx_ru::Cpp::composite_target( Mxx_ru::BUILD_ROOT ) {
4
+ global_include_path '.'
5
+
6
+ required_prjs Dir.glob( '**/prj.rb' )
7
+ }
@@ -0,0 +1,8 @@
1
+ #include <iostream>
2
+
3
+ #include "some/module/funcs.hpp"
4
+
5
+ void f1()
6
+ {
7
+ std::cout << "f1()" << std::endl;
8
+ }
@@ -0,0 +1,8 @@
1
+ #include <iostream>
2
+
3
+ #include "some/module/funcs.hpp"
4
+
5
+ void f2()
6
+ {
7
+ std::cout << "f2()" << std::endl;
8
+ }
@@ -0,0 +1,8 @@
1
+ #include <iostream>
2
+
3
+ #include "some/module/funcs.hpp"
4
+
5
+ void f3()
6
+ {
7
+ std::cout << "f3()" << std::endl;
8
+ }
@@ -0,0 +1,8 @@
1
+ #include <iostream>
2
+
3
+ #include "some/module/funcs.hpp"
4
+
5
+ void f4()
6
+ {
7
+ std::cout << "f4()" << std::endl;
8
+ }
@@ -0,0 +1,9 @@
1
+ #if !defined( SOME_MODULE_FUNCS_HPP )
2
+ #define SOME_MODULE_FUNCS_HPP
3
+
4
+ void f1();
5
+ void f2();
6
+ void f3();
7
+ void f4();
8
+
9
+ #endif
@@ -0,0 +1,11 @@
1
+ #include <iostream>
2
+
3
+ #include "some/module/funcs.hpp"
4
+
5
+ int main()
6
+ {
7
+ f1();
8
+ f2();
9
+ f3();
10
+ f4();
11
+ }
@@ -0,0 +1,10 @@
1
+ require 'mxx_ru/cpp'
2
+
3
+ Mxx_ru::Cpp::exe_target {
4
+
5
+ Mxx_ru::enable_show_brief
6
+
7
+ target( 'test' )
8
+
9
+ cpp_sources Dir.glob( 'some/module/**/*.cpp' )
10
+ }
@@ -1,7 +1,7 @@
1
1
  require 'mxx_ru/cpp'
2
2
  require 'mxx_ru/cpp/rucodegen'
3
3
 
4
- Mxx_ru::setup_target Mxx_ru::Cpp::Exe_target.new( "test/cpp/rucodegen/prj.rb" ) {
4
+ Mxx_ru::setup_target Mxx_ru::Cpp::Exe_target.new( "tests/cpp/rucodegen/prj.rb" ) {
5
5
  target "host_config"
6
6
 
7
7
  rucodegen = generator Mxx_ru::Cpp::RuCodeGen.new( self )
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'mxx_ru/cpp'
4
4
 
5
- Mxx_ru::Cpp::dll_target( "prj_dll_no_implib.rb" ) {
5
+ Mxx_ru::Cpp::dll_target {
6
6
  target( "dll_no_implib" )
7
7
 
8
8
  cpp_source( "dll_hi.cpp" )
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'mxx_ru/cpp'
4
4
 
5
- Mxx_ru::Cpp::dll_target( "prj_dll_no_implib_simple_target_root.rb" ) {
5
+ Mxx_ru::Cpp::dll_target {
6
6
  target_root( "simple_target_root" )
7
7
  target( "dll_no_implib_simple_target_root" )
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'mxx_ru/cpp'
4
4
 
5
- Mxx_ru::Cpp::dll_target( "prj_dll_with_implib.rb" ) {
5
+ Mxx_ru::Cpp::dll_target {
6
6
  target( "dll_with_implib" )
7
7
 
8
8
  implib_path( "lib" )
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'mxx_ru/cpp'
4
4
 
5
- Mxx_ru::Cpp::dll_target( "prj_dll_with_implib_simple_target_root.rb" ) {
5
+ Mxx_ru::Cpp::dll_target {
6
6
 
7
7
  target_root( "simple_target_root" )
8
8
  target( "dll_with_implib_simple_target_root" )
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'mxx_ru/cpp'
4
4
 
5
- Mxx_ru::Cpp::exe_target( "prj_exe_no_implib.rb" ) {
5
+ Mxx_ru::Cpp::exe_target {
6
6
  target( "exe_no_implib" )
7
7
 
8
8
  cpp_source( "exe_hi.cpp" )
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'mxx_ru/cpp'
4
4
 
5
- Mxx_ru::Cpp::exe_target( "prj_exe_no_implib_simple_target_root.rb" ) {
5
+ Mxx_ru::Cpp::exe_target {
6
6
  target_root( "simple_target_root" )
7
7
  target( "exe_no_implib_simple_target_root" )
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'mxx_ru/cpp'
4
4
 
5
- Mxx_ru::Cpp::lib_target( "prj_lib.rb" ) {
5
+ Mxx_ru::Cpp::lib_target {
6
6
  target( "lib/lib_hi.1.0.0" )
7
7
 
8
8
  cpp_source( "lib_hi.cpp" )
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'mxx_ru/cpp'
4
4
 
5
- Mxx_ru::Cpp::lib_target( "prj_lib_with_simple_target_root.rb" ) {
5
+ Mxx_ru::Cpp::lib_target {
6
6
  target_root( "simple_target_root" )
7
7
  target( "lib_hi" )
8
8
 
@@ -0,0 +1,72 @@
1
+ require 'test/unit'
2
+
3
+ require 'mxx_ru/cpp'
4
+
5
+ class TC_PluralFormMethods < Test::Unit::TestCase
6
+ def test_required_prj
7
+ test_value = [ 'test_required_prj_sub1', 'test_required_prj_sub2' ]
8
+
9
+ test_value.each { |p| Mxx_ru::Cpp::composite_target( p ) {} }
10
+
11
+ t = Mxx_ru::Cpp::composite_target( 'test_required_prj' ) {
12
+ required_prjs test_value
13
+ }
14
+
15
+ assert_equal( test_value.size, t.mxx_required_prjs.size )
16
+ t.mxx_required_prjs.each { |p|
17
+ assert( test_value.member?( p.prj_alias ) )
18
+ }
19
+ end
20
+
21
+ def test_c_sources
22
+ test_files = [ 'hello.c', 'greeting.c' ]
23
+
24
+ t = Mxx_ru::setup_target(
25
+ Mxx_ru::Cpp::Exe_target.new( 'test_c_sources' ) {
26
+ target 'test_c_sources'
27
+
28
+ c_sources test_files
29
+ },
30
+ false )
31
+
32
+ defined_sources = t.mxx_c_files.inject( [] ) { |r, f| r << File.basename( f.name ) }
33
+
34
+ assert_equal( test_files, defined_sources )
35
+ end
36
+
37
+ def test_cpp_sources
38
+ test_files = [ 'hello.cpp', 'greeting.cpp' ]
39
+
40
+ path = 'some/test'
41
+ t = Mxx_ru::setup_target(
42
+ Mxx_ru::Cpp::Exe_target.new( "#{path}/test_cpp_sources" ) {
43
+ target 'test_cpp_sources'
44
+
45
+ cpp_sources test_files
46
+ },
47
+ false )
48
+
49
+ expected_sources = test_files.inject( [] ) { |r, f| r << "#{path}/#{f}" }
50
+ defined_sources = t.mxx_cpp_files.inject( [] ) { |r, f| r << f.name }
51
+
52
+ assert_equal( expected_sources, defined_sources )
53
+ end
54
+
55
+ def test_cpp_sources_with_special_prefix
56
+ path = 'some/test'
57
+ test_files = [ "#{path}/hello.cpp", "#{path}/greeting.cpp" ]
58
+
59
+ t = Mxx_ru::setup_target(
60
+ Mxx_ru::Cpp::Exe_target.new( "#{path}/test_cpp_sources" ) {
61
+ target 'test_cpp_sources'
62
+
63
+ cpp_sources test_files
64
+ },
65
+ false )
66
+
67
+ defined_sources = t.mxx_cpp_files.inject( [] ) { |r, f| r << f.name }
68
+
69
+ assert_equal( test_files, defined_sources )
70
+ end
71
+ end
72
+
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
3
3
  specification_version: 1
4
4
  name: Mxx_ru
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.1.0
7
- date: 2006-04-09
6
+ version: 1.2.0
7
+ date: 2006-04-16
8
8
  summary: Mxx_ru (Make++ on Ruby) is a cross-platform build tool
9
9
  require_paths:
10
10
  - lib
@@ -51,6 +51,7 @@ files:
51
51
  - tests/c/pcre/perltest
52
52
  - tests/c/pcre/printint.c
53
53
  - tests/c/pcre/study.c
54
+ - tests/cpp/cpp_sources_glob
54
55
  - tests/cpp/mswin_res_dll
55
56
  - tests/cpp/mswin_res_exe
56
57
  - tests/cpp/o
@@ -58,6 +59,25 @@ files:
58
59
  - tests/cpp/textfile_unittest
59
60
  - tests/cpp/toolset_name.rb
60
61
  - tests/cpp/vc_cleanup
62
+ - tests/cpp/cpp_sources_glob/build.rb
63
+ - tests/cpp/cpp_sources_glob/some
64
+ - tests/cpp/cpp_sources_glob/some/module
65
+ - tests/cpp/cpp_sources_glob/some/module/1
66
+ - tests/cpp/cpp_sources_glob/some/module/2
67
+ - tests/cpp/cpp_sources_glob/some/module/3
68
+ - tests/cpp/cpp_sources_glob/some/module/4
69
+ - tests/cpp/cpp_sources_glob/some/module/funcs.hpp
70
+ - tests/cpp/cpp_sources_glob/some/module/main.cpp
71
+ - tests/cpp/cpp_sources_glob/some/module/o
72
+ - tests/cpp/cpp_sources_glob/some/module/prj.rb
73
+ - tests/cpp/cpp_sources_glob/some/module/1/f1.cpp
74
+ - tests/cpp/cpp_sources_glob/some/module/1/o
75
+ - tests/cpp/cpp_sources_glob/some/module/2/f2.cpp
76
+ - tests/cpp/cpp_sources_glob/some/module/2/o
77
+ - tests/cpp/cpp_sources_glob/some/module/3/f3.cpp
78
+ - tests/cpp/cpp_sources_glob/some/module/3/o
79
+ - tests/cpp/cpp_sources_glob/some/module/4/f4.cpp
80
+ - tests/cpp/cpp_sources_glob/some/module/4/o
61
81
  - tests/cpp/mswin_res_dll/build.rb
62
82
  - tests/cpp/mswin_res_dll/dll.cpp
63
83
  - tests/cpp/mswin_res_dll/dll.rb
@@ -120,6 +140,7 @@ files:
120
140
  - tests/cpp/vc_cleanup/tc_vc_cleanup.rb
121
141
  - tests/cpp/vc_cleanup/lib/simple_target_root
122
142
  - tests/mxx_ru/change_default_value
143
+ - tests/mxx_ru/plural_form_methods
123
144
  - tests/mxx_ru/tc_makestyle_generator.rb
124
145
  - tests/mxx_ru/vc8
125
146
  - tests/mxx_ru/change_default_value/ignoring_by_build_root
@@ -132,6 +153,7 @@ files:
132
153
  - tests/mxx_ru/change_default_value/ignoring_by_child_1/child_2.rb
133
154
  - tests/mxx_ru/change_default_value/ok/build.rb
134
155
  - tests/mxx_ru/change_default_value/ok/child_1.rb
156
+ - tests/mxx_ru/plural_form_methods/tc.rb
135
157
  - tests/mxx_ru/vc8/tc_actual_manifest.rb
136
158
  - tests/mxx_ru/vc8/tc_append_mt_commands.rb
137
159
  - tests/mxx_ru/vc8/tc_default_manifest.rb
@@ -145,10 +167,12 @@ files:
145
167
  - tests/qt/aclock/aclock.cpp
146
168
  - tests/qt/aclock/aclock.h
147
169
  - tests/qt/aclock/main.cpp
170
+ - tests/qt/aclock/o
148
171
  - tests/qt/aclock/prj.rb
149
172
  - tests/qt/iconview/main.cpp
150
173
  - tests/qt/iconview/prj.rb
151
174
  - tests/qt/toplevel/main.cpp
175
+ - tests/qt/toplevel/o
152
176
  - tests/qt/toplevel/options.ui
153
177
  - tests/qt/toplevel/options.ui.h
154
178
  - tests/qt/toplevel/prj.rb
@@ -221,6 +245,7 @@ files:
221
245
  - examples/exe_dll_lib_2/say/say.hpp
222
246
  - examples/simple_exe/main.cpp
223
247
  - examples/simple_exe/prj.rb
248
+ - THANKS
224
249
  - README
225
250
  - Rakefile
226
251
  - COPYING