cxxproject 0.6.30 → 0.6.31

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.
@@ -74,7 +74,7 @@ module Cxxproject
74
74
  def executeCmd(cmd)
75
75
  Dir.chdir(@project_dir) do
76
76
  check_config_file
77
- puts cmd + (RakeFileUtils.verbose ? " (executed in '#{@project_dir}')" : "")
77
+ puts cmd + ((RakeFileUtils.verbose == true) ? " (executed in '#{@project_dir}')" : "")
78
78
  cmd_result = false
79
79
  begin
80
80
  cmd_result = ProcessHelper.spawnProcess(cmd + " 2>&1")
@@ -93,7 +93,7 @@ module Cxxproject
93
93
  end
94
94
  Rake.application.idei.set_errors([err_res])
95
95
  end
96
- Printer.printError "Error: command \"#{cmd}\" failed" + (RakeFileUtils.verbose ? "" : " (executed in '#{@project_dir}')")
96
+ Printer.printError "Error: command \"#{cmd}\" failed" + ((RakeFileUtils.verbose == true) ? "" : " (executed in '#{@project_dir}')")
97
97
  raise SystemCommandFailed.new
98
98
  end
99
99
  end
@@ -0,0 +1,93 @@
1
+ module Cxxproject
2
+ class SharedLibsHelper
3
+ def symlink_lib_to(link, bb)
4
+ file = File.basename(bb.executable_name)
5
+ if file != link
6
+ cd "#{bb.output_dir}/libs" do
7
+ symlink(file, link)
8
+ end
9
+ end
10
+ end
11
+ end
12
+
13
+ class OsxSharedLibs < SharedLibsHelper
14
+ def calc(linker, bb)
15
+ flags = ['-install_name', bb.get_output_name(linker)]
16
+ if bb.compatibility != nil
17
+ flags << '-compatibility_version'
18
+ flags << bb.compatibility
19
+ end
20
+ if bb.minor != nil
21
+ flags << '-current_version'
22
+ flags << bb.minor
23
+ end
24
+ flags
25
+ end
26
+
27
+ # For :major=>A, minor=>1.0.1, compatibility=>1.0.0 basic is 'libfoo.A.so'
28
+ def get_basic_name(linker, bb)
29
+ prefix = bb.get_output_prefix(linker)
30
+ name = bb.name
31
+ dylib = bb.shared_suffix linker
32
+ return "#{prefix}#{name}#{dylib}"
33
+ end
34
+
35
+
36
+ # Some symbolic links
37
+ # ln -s foo.dylib foo.A.dylib
38
+ def post_link_hook(linker, bb)
39
+ basic_name = get_basic_name(linker, bb)
40
+ symlink_lib_to(basic_name, bb)
41
+ end
42
+
43
+ def get_version_suffix(linker, bb)
44
+ bb.major ? ".#{bb.major}" : ''
45
+ end
46
+ end
47
+
48
+ class UnixSharedLibs < SharedLibsHelper
49
+
50
+ def initialize()
51
+ end
52
+
53
+ # For :major=>1, minor=>2 fullname is '1.2.so'
54
+ def get_version_suffix(linker, bb)
55
+ "#{major_suffix bb}#{[bb.major, bb.minor].compact.join('.')}"
56
+ end
57
+
58
+ def major_suffix(bb)
59
+ bb.major ? ".#{bb.major}" : ''
60
+ end
61
+
62
+ # For :major=>1, minor=>2 soname is 'libfoo.1.so'
63
+ #def get_major(linker)
64
+ # prefix = get_output_prefix(linker)
65
+ # return "#{prefix}#{name}#{major_suffix}#{shared_suffix linker}"
66
+ #end
67
+
68
+ def get_soname(linker, bb)
69
+ prefix = bb.get_output_prefix(linker)
70
+ "#{prefix}#{bb.name}#{major_suffix bb}#{bb.shared_suffix linker}"
71
+ end
72
+
73
+ def calc(linker, bb)
74
+ return ["-Wl,-soname,#{get_soname(linker, bb)}"]
75
+ end
76
+
77
+ # For :major=>1, minor=>2 fullname is 'libfoo.so'
78
+ def get_basic_name(linker, bb)
79
+ prefix = bb.get_output_prefix(linker)
80
+ return "#{prefix}#{bb.name}#{bb.shared_suffix(linker)}"
81
+ end
82
+
83
+ # Some symbolic links
84
+ # ln -s libfoo.so libfoo.1.2.so
85
+ # ln -s libfoo.1.so libfoo.1.2.so
86
+ def post_link_hook(linker, bb)
87
+ basic_name = get_basic_name(linker, bb)
88
+ soname = get_soname(linker, bb)
89
+ symlink_lib_to(basic_name, bb)
90
+ symlink_lib_to(soname, bb)
91
+ end
92
+ end
93
+ end
@@ -6,7 +6,7 @@ require 'cxxproject/utils/process'
6
6
  require 'cxxproject/utils/utils'
7
7
 
8
8
  module Cxxproject
9
- class SourceLibrary < BuildingBlock
9
+ class StaticLibrary < BuildingBlock
10
10
  include HasLibraries
11
11
  include HasSources
12
12
  include HasIncludes
@@ -28,13 +28,17 @@ module Cxxproject
28
28
  super
29
29
  end
30
30
 
31
+ def additional_path_components
32
+ ['libs']
33
+ end
34
+
31
35
  def get_archive_name() # relative path
32
36
  return @archive_name if @archive_name
33
37
  parts = [@output_dir]
34
38
 
35
39
  if @output_dir_abs
36
40
  parts = [@output_dir_relPath] if @output_dir_relPath
37
- parts << 'libs'
41
+ parts += additional_path_components()
38
42
  end
39
43
 
40
44
  parts << "lib#{@name}.a"
@@ -54,6 +58,29 @@ module Cxxproject
54
58
  @task_name
55
59
  end
56
60
 
61
+ def calc_command_line
62
+ objs = @objects
63
+ if @output_dir_abs
64
+ prefix = File.rel_from_to_project(@project_dir, @output_dir)
65
+ # objs.map! { |m| m[prefix.length..-1] }
66
+ end
67
+ archiver = @tcs[:ARCHIVER]
68
+ cmd = [archiver[:COMMAND]] # ar
69
+ cmd += archiver[:ARCHIVE_FLAGS].split(" ")
70
+ cmd += archiver[:FLAGS]
71
+ cmd << calc_archive_name # -o debug/x.exe
72
+ cmd += objs
73
+ end
74
+
75
+ def calc_archive_name
76
+ aname = get_archive_name
77
+ # if @output_dir_abs
78
+ # prefix = File.rel_from_to_project(@project_dir, @output_dir)
79
+ # aname = aname[prefix.length..-1]
80
+ # end
81
+ return aname
82
+ end
83
+
57
84
  # task that will link the given object files to a static lib
58
85
  #
59
86
  def convert_to_rake()
@@ -61,26 +88,11 @@ module Cxxproject
61
88
  archiver = @tcs[:ARCHIVER]
62
89
 
63
90
  res = typed_file_task Rake::Task::LIBRARY, get_task_name => object_multitask do
64
- dir = @project_dir
65
- objs = @objects
66
- aname = get_archive_name
67
-
68
- if @output_dir_abs
69
- dir = @output_dir
70
- prefix = File.rel_from_to_project(@project_dir, @output_dir)
71
- objs.map! { |m| m[prefix.length..-1] }
72
- aname = aname[prefix.length..-1]
73
- end
74
-
75
- Dir.chdir(dir) do
91
+ cmd = calc_command_line
92
+ aname = calc_archive_name
93
+ Dir.chdir(@project_dir) do
76
94
  FileUtils.rm(aname) if File.exists?(aname)
77
- cmd = [archiver[:COMMAND]] # ar
78
- cmd += archiver[:ARCHIVE_FLAGS].split(" ")
79
- cmd += archiver[:FLAGS]
80
- cmd << aname # -o debug/x.exe
81
- cmd += objs
82
-
83
- cmd.map! {|c| c.include?(' ') ? "\"#{c}\"" : c }
95
+ # cmd.map! {|c| c.include?(' ') ? "\"#{c}\"" : c }
84
96
  rd, wr = IO.pipe
85
97
  cmd << {
86
98
  :err => wr,
@@ -91,11 +103,12 @@ module Cxxproject
91
103
 
92
104
  consoleOutput = ProcessHelper.readOutput(sp, rd, wr)
93
105
 
94
- process_result(cmd, consoleOutput, archiver[:ERROR_PARSER], "Creating #{aname}")
106
+ process_result(cmd, consoleOutput, @tcs[:ARCHIVER][:ERROR_PARSER], "Creating #{aname}")
95
107
 
96
108
  check_config_file()
97
109
  end
98
110
  end
111
+ res.tags = tags
99
112
  enhance_with_additional_files(res)
100
113
  add_output_dir_dependency(get_task_name, res, true)
101
114
 
@@ -5,7 +5,7 @@ module Cxxproject
5
5
  hash.keys.map do |k|
6
6
  error_string = ["error while evaluating \"#{@current_working_dir}/#{@current_project_file}\"",
7
7
  "\"#{k}\" is not a valid specifier!",
8
- "allowd specifiers: #{allowed}"].join($/)
8
+ "allowed specifiers: #{allowed}"].join($/)
9
9
  raise error_string unless allowed.include?(k)
10
10
  end
11
11
  end
@@ -17,12 +17,17 @@ end
17
17
  module Rake
18
18
 
19
19
  class Application
20
+ attr_writer :raise_exceptions
20
21
  attr_writer :max_parallel_tasks
21
22
  attr_writer :check_unnecessary_includes
22
23
  attr_writer :deriveIncludes
23
24
  attr_writer :preproFlags
24
25
  attr_writer :consoleOutput_fullnames
25
26
  attr_writer :addEmptyLine
27
+ def raise_exceptions
28
+ @raise_exceptions ||= false
29
+ end
30
+
26
31
  def max_parallel_tasks
27
32
  @max_parallel_tasks ||= 8
28
33
  end
@@ -226,11 +231,15 @@ module Rake
226
231
  attr_accessor :deps # used to store deps by depfile task for the apply task (no re-read of depsfile)
227
232
  attr_accessor :type
228
233
  attr_accessor :transparent_timestamp
229
- attr_accessor :progress_count
230
234
  attr_accessor :output_string
231
235
  attr_accessor :output_after_execute
232
236
  attr_accessor :immediate_output
233
237
  attr_accessor :prerequisites
238
+ attr_writer :tags
239
+ def tags
240
+ @tags = Set.new unless @tags
241
+ return @tags
242
+ end
234
243
 
235
244
  UNKNOWN = 0x0000 #
236
245
  OBJECT = 0x0001 #
@@ -247,6 +256,7 @@ module Rake
247
256
  RUN = 0x0800 #
248
257
  CUSTOM = 0x1000 # x
249
258
  COMMANDLINE = 0x2000 # x
259
+ SHARED_LIBRARY = 0x4000 # x
250
260
 
251
261
  STANDARD = 0x371A # x above means included in STANDARD
252
262
  attr_reader :ignore
@@ -261,7 +271,6 @@ module Rake
261
271
  @type = UNKNOWN
262
272
  @deps = nil
263
273
  @transparent_timestamp = false
264
- @progress_count = 0
265
274
  @ignore = false
266
275
  @failure = false
267
276
  @output_after_execute = true
@@ -297,21 +306,25 @@ module Rake
297
306
  rescue Cxxproject::ExitHelperException
298
307
  raise
299
308
  rescue Exception => e
300
- if prereq and Rake::Task[n].ignore
301
- @prerequisites.delete(n)
302
- def self.needed?
303
- true
304
- end
305
- return
306
- end
307
- Cxxproject::Printer.printError "Error #{name}: #{e.message}"
308
- if RakeFileUtils.verbose
309
- puts e.backtrace
310
- end
311
- set_failed
312
- if e.message.include?('Circular dependency detected')
313
- Rake.application.idei.set_abort(true)
314
- end
309
+ if not application.raise_exceptions
310
+ if prereq and Rake::Task[n].ignore
311
+ @prerequisites.delete(n)
312
+ def self.needed?
313
+ true
314
+ end
315
+ return
316
+ end
317
+ Cxxproject::Printer.printError "Error #{name}: #{e.message}"
318
+ if RakeFileUtils.verbose == true
319
+ puts e.backtrace
320
+ end
321
+ set_failed
322
+ if e.message.include?('Circular dependency detected')
323
+ Rake.application.idei.set_abort(true)
324
+ end
325
+ else
326
+ raise e
327
+ end
315
328
  end
316
329
 
317
330
  end
@@ -365,18 +378,27 @@ module Rake
365
378
  end
366
379
  end
367
380
 
368
- def handle_error(ex1, isSysCmd)
369
- if not Rake.application.idei.get_abort()
370
- if not isSysCmd
371
- Cxxproject::Printer.printError "Error for task #{@name}: #{ex1.message}"
372
- end
373
- end
374
- begin
375
- FileUtils.rm(@name) if File.exists?(@name)
376
- rescue Exception => ex2
377
- Cxxproject::Printer.printError "Error: Could not delete #{@name}: #{ex2.message}"
378
- end
379
- set_failed
381
+ def handle_error(exception, isSysCmd)
382
+ if not application.raise_exceptions
383
+ if not Rake.application.idei.get_abort()
384
+ if not isSysCmd
385
+ Cxxproject::Printer.printError "Error for task #{@name}: #{exception.message}"
386
+ if Rake.application.options.trace
387
+ exception.backtrace.each do |t|
388
+ Cxxproject::Printer.printError t
389
+ end
390
+ end
391
+ end
392
+ end
393
+ begin
394
+ FileUtils.rm(@name) if File.exists?(@name)
395
+ rescue Exception => follow_up_exception
396
+ Cxxproject::Printer.printError "Error: Could not delete #{@name}: #{follow_up_exception.message}"
397
+ end
398
+ set_failed
399
+ else
400
+ raise exception
401
+ end
380
402
  end
381
403
 
382
404
  def output(name, to_output)
@@ -15,10 +15,19 @@ module Cxxproject
15
15
  class PluginContext
16
16
  include Context
17
17
 
18
- def initialize(cxxproject2rake, building_blocks, log)
18
+ def self.create_no_args_context
19
+ return PluginContext.new(nil, nil, nil, 0)
20
+ end
21
+
22
+ def self.create_three_args_context(cxx, building_blocks, log)
23
+ return PluginContext.new(cxx, building_blocks, log, 3)
24
+ end
25
+
26
+ def initialize(cxxproject2rake, building_blocks, log, expected_arity)
19
27
  @cxxproject2rake = cxxproject2rake
20
28
  @building_blocks = building_blocks
21
29
  @log = log
30
+ @expected_arity = expected_arity
22
31
  end
23
32
 
24
33
  # method for plugins to get the
@@ -26,7 +35,16 @@ module Cxxproject
26
35
  # building_blocks
27
36
  # log
28
37
  def cxx_plugin(&blk)
29
- blk.call(@cxxproject2rake, @building_blocks, @log)
38
+ if blk.arity != @expected_arity
39
+ return
40
+ end
41
+
42
+ case blk.arity
43
+ when 0
44
+ blk.call()
45
+ when 3
46
+ blk.call(@cxxproject2rake, @building_blocks, @log)
47
+ end
30
48
  end
31
49
 
32
50
  # specify a toolchain
@@ -1,4 +1,5 @@
1
1
  require 'cxxproject/toolchain/colorizing_formatter'
2
+ require 'cxxproject/utils/utils'
2
3
 
3
4
  module Cxxproject
4
5
  module Toolchain
@@ -6,6 +7,7 @@ module Cxxproject
6
7
  class Provider
7
8
  @@settings = {}
8
9
  @@default = {
10
+ :TARGET_OS => Utils::OS.os(),
9
11
  :COMPILER =>
10
12
  {
11
13
  :CPP => {
@@ -65,17 +67,33 @@ module Cxxproject
65
67
  :MUST_FLAGS => "",
66
68
  :SCRIPT => "",
67
69
  :USER_LIB_FLAG => "",
68
- :EXE_FLAG => "",
70
+ :OUTPUT_FLAG => 'output_flag_default',
71
+ :SHARED_FLAG => 'shared_flag_default',
72
+ :SONAME_FLAG => 'soname_flag_default',
69
73
  :LIB_FLAG => "",
70
74
  :LIB_PATH_FLAG => "",
71
75
  :LIB_PREFIX_FLAGS => "", # "-Wl,--whole-archive",
72
76
  :LIB_POSTFIX_FLAGS => "", # "-Wl,--no-whole-archive",
73
77
  :FLAGS => [],
74
78
  :MAP_FILE_FLAG => "",
75
- :OUTPUT_ENDING => ".exe", # or .elf
79
+ :OUTPUT_PREFIX => {:EXECUTABLE => '', :SHARED_LIBRARY => {:UNIX => 'lib', :OSX => 'lib'} },
80
+ :OUTPUT_SUFFIX => {
81
+ :EXECUTABLE => {
82
+ :UNIX => '.exe',
83
+ :OSX => '.exe',
84
+ :WINDOWS => '.exe'
85
+ },
86
+ :SHARED_LIBRARY => {
87
+ :UNIX => '.so',
88
+ :OSX => '.dylib',
89
+ :WINDOWS => '.dll'
90
+ }
91
+ },
76
92
  :ERROR_PARSER => nil,
77
- :START_OF_WHOLE_ARCHIVE => '',
78
- :END_OF_WHOLE_ARCHIVE => ''
93
+ :START_OF_WHOLE_ARCHIVE => {:UNIX => '', :OSX => '', :WINDOWS => ''},
94
+ :END_OF_WHOLE_ARCHIVE => {:UNIX => '', :OSX => '', :WINDOWS => ''},
95
+ :ADDITIONAL_COMMANDS => {:OSX => '', :UNIX => ''},
96
+ :ADDITIONAL_OBJECT_FILE_FLAGS => {:OSX => [], :UNIX => []}
79
97
  },
80
98
 
81
99
  :MAKE =>
@@ -87,6 +105,10 @@ module Cxxproject
87
105
  :CLEAN => "clean"
88
106
  },
89
107
 
108
+ :ENV =>
109
+ {
110
+ :LIB_VAR=> {:UNIX => 'LD_LIBRARY_PATH', :OSX => 'DYLD_LIBRARY_PATH', :WINDOWS => 'PATH'},
111
+ },
90
112
  :CONSOLE_HIGHLIGHTER => ColorizingFormatter.new
91
113
  }
92
114
 
@@ -121,22 +143,25 @@ module Cxxproject
121
143
  @@default
122
144
  end
123
145
 
124
- def self.modify_cpp_compiler(based_on, h)
146
+ def self.modify_linker(based_on, h)
125
147
  chain = @@settings[based_on]
126
148
  raise "unknown toolchain: #{based_on}" unless chain
127
- chain[:COMPILER][:CPP].update(h)
149
+ chain[:LINKER].update(h)
128
150
  chain
129
151
  end
130
152
 
131
- def self.[](name)
153
+ def self.modify_compiler(based_on, compiler_type, h)
154
+ chain = @@settings[based_on]
155
+ raise "unknown toolchain: #{based_on}" unless chain
156
+ chain[:COMPILER][compiler_type].update(h)
157
+ chain
158
+ end
132
159
 
133
- if name == "TI"
134
- if not ENV['TI_HOME']
135
- Printer.printError "Error: Please set TI_HOME"
136
- ExitHelper.exit(1)
137
- end
138
- end
160
+ def self.modify_cpp_compiler(based_on, h)
161
+ modify_compiler(based_on, :CPP, h)
162
+ end
139
163
 
164
+ def self.[](name)
140
165
  return @@settings[name] if @@settings.include? name
141
166
  nil
142
167
  end