cxxproject 0.6.26 → 0.6.27
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.
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/lib/cxxproject/buildingblocks/executable.rb +33 -34
- data/lib/cxxproject/buildingblocks/has_dependencies_mixin.rb +27 -1
- data/lib/cxxproject/buildingblocks/has_sources_mixin.rb +12 -5
- data/lib/cxxproject/buildingblocks/source_library.rb +4 -1
- data/lib/cxxproject/toolchain/provider.rb +3 -1
- data/lib/cxxproject/version.rb +1 -1
- data/spec/building_block_spec.rb +35 -10
- metadata +3 -3
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -66,7 +66,7 @@ module Cxxproject
|
|
66
66
|
ret
|
67
67
|
end
|
68
68
|
|
69
|
-
def
|
69
|
+
def adapt_path(v, d, prefix)
|
70
70
|
tmp = nil
|
71
71
|
if File.is_absolute?(v)
|
72
72
|
tmp = v
|
@@ -77,48 +77,47 @@ module Cxxproject
|
|
77
77
|
[tmp, prefix]
|
78
78
|
end
|
79
79
|
|
80
|
-
def linker_lib_string()
|
81
|
-
|
82
|
-
|
83
|
-
calc_linker_lib_string_recursive(self)
|
84
|
-
end
|
85
|
-
|
86
|
-
def calc_linker_lib_string_recursive(d)
|
80
|
+
def linker_lib_string(linker)
|
81
|
+
lib_path_set = Set.new
|
82
|
+
deps = collect_dependencies
|
87
83
|
res = []
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
linker = @tcs[:LINKER]
|
94
|
-
|
95
|
-
d.lib_elements.each do |elem|
|
96
|
-
case elem[0]
|
84
|
+
deps.each do |d|
|
85
|
+
handle_whole_archive(d, res, linker, :START_OF_WHOLE_ARCHIVE)
|
86
|
+
if HasLibraries === d
|
87
|
+
d.lib_elements.each do |elem|
|
88
|
+
case elem[0]
|
97
89
|
when HasLibraries::LIB
|
98
|
-
res
|
90
|
+
res.push("#{linker[:LIB_FLAG]}#{elem[1]}")
|
99
91
|
when HasLibraries::USERLIB
|
100
|
-
res
|
92
|
+
res.push("#{linker[:USER_LIB_FLAG]}#{elem[1]}")
|
101
93
|
when HasLibraries::LIB_WITH_PATH
|
102
|
-
tmp, prefix =
|
103
|
-
res
|
94
|
+
tmp, prefix = adapt_path(elem[1], d, prefix)
|
95
|
+
res.push(tmp)
|
104
96
|
when HasLibraries::SEARCH_PATH
|
105
|
-
tmp, prefix =
|
106
|
-
if not
|
107
|
-
|
108
|
-
res
|
109
|
-
end
|
110
|
-
when HasLibraries::DEPENDENCY
|
111
|
-
if ALL_BUILDING_BLOCKS.include?(elem[1])
|
112
|
-
bb = ALL_BUILDING_BLOCKS[elem[1]]
|
113
|
-
res += calc_linker_lib_string_recursive(bb)
|
97
|
+
tmp, prefix = adapt_path(elem[1], d, prefix)
|
98
|
+
if not lib_path_set.include?(tmp)
|
99
|
+
lib_path_set << tmp
|
100
|
+
res.push("#{linker[:LIB_PATH_FLAG]}#{tmp}")
|
114
101
|
end
|
102
|
+
end
|
115
103
|
end
|
116
104
|
end
|
105
|
+
handle_whole_archive(d, res, linker, :END_OF_WHOLE_ARCHIVE)
|
117
106
|
end
|
118
|
-
|
119
107
|
res
|
120
108
|
end
|
121
109
|
|
110
|
+
# res the array with command line arguments that is used as result
|
111
|
+
# linker the linker hash
|
112
|
+
# sym the symbol that is used to fish out a value from the linker
|
113
|
+
def handle_whole_archive(building_block, res, linker, sym)
|
114
|
+
if building_block.instance_of?(SourceLibrary)
|
115
|
+
if building_block.whole_archive
|
116
|
+
res.push(linker[sym]) if linker[sym]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
122
121
|
# create a task that will link an executable from a set of object files
|
123
122
|
#
|
124
123
|
def convert_to_rake()
|
@@ -138,9 +137,9 @@ module Cxxproject
|
|
138
137
|
cmd << linker[:SCRIPT] if @linker_script # -T
|
139
138
|
cmd << @linker_script if @linker_script # xy/xy.dld
|
140
139
|
cmd << linker[:MAP_FILE_FLAG] if @mapfile # -Wl,-m6
|
141
|
-
cmd += linker[:LIB_PREFIX_FLAGS].split(" ") #
|
142
|
-
cmd += linker_lib_string
|
143
|
-
cmd += linker[:LIB_POSTFIX_FLAGS].split(" ") #
|
140
|
+
cmd += linker[:LIB_PREFIX_FLAGS].split(" ") # TODO ... is this still needed e.g. for diab
|
141
|
+
cmd += linker_lib_string(@tcs[:LINKER])
|
142
|
+
cmd += linker[:LIB_POSTFIX_FLAGS].split(" ") # TODO ... is this still needed e.g. for diab
|
144
143
|
|
145
144
|
mapfileStr = @mapfile ? " >#{@mapfile}" : ""
|
146
145
|
if Cxxproject::Utils.old_ruby?
|
@@ -9,7 +9,7 @@ module Cxxproject
|
|
9
9
|
@helper_dependencies ||= []
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
def set_dependencies(deps)
|
13
13
|
@dependencies = deps.map { |dep| dep.instance_of?(String) ? dep : dep.name }
|
14
14
|
self
|
15
15
|
end
|
@@ -53,6 +53,32 @@ module Cxxproject
|
|
53
53
|
@direct_deps
|
54
54
|
end
|
55
55
|
|
56
|
+
def collect_dependencies()
|
57
|
+
# puts "collect for #{name}"
|
58
|
+
res = []
|
59
|
+
res << self
|
60
|
+
todo = dependencies
|
61
|
+
while not todo.empty?
|
62
|
+
# p todo
|
63
|
+
bb = resolve_by_name(todo.pop)
|
64
|
+
add_unique(res, bb)
|
65
|
+
todo += bb.dependencies
|
66
|
+
end
|
67
|
+
# puts "result of collect for #{name} -> #{res}"
|
68
|
+
res
|
69
|
+
end
|
70
|
+
|
71
|
+
def add_unique(res, bb)
|
72
|
+
res.delete(bb)
|
73
|
+
res.push(bb)
|
74
|
+
end
|
75
|
+
|
76
|
+
def resolve_by_name(name)
|
77
|
+
res = ALL_BUILDING_BLOCKS[name]
|
78
|
+
raise "BuildingBlock #{name} not defined" unless res
|
79
|
+
res
|
80
|
+
end
|
81
|
+
|
56
82
|
def all_dependencies()
|
57
83
|
return @all_dependencies if @all_deps_calculated
|
58
84
|
|
@@ -76,9 +76,13 @@ module Cxxproject
|
|
76
76
|
all_dependencies.each_with_index do |d,i|
|
77
77
|
next if not HasIncludes === d
|
78
78
|
next if i == 0
|
79
|
-
|
80
|
-
|
81
|
-
|
79
|
+
if BinaryLibrary === d
|
80
|
+
@incArray.concat(d.includes)
|
81
|
+
else
|
82
|
+
prefix = File.rel_from_to_project(@project_dir,d.project_dir)
|
83
|
+
next if not prefix
|
84
|
+
@incArray.concat(d.includes.map {|inc| File.add_prefix(prefix,inc)})
|
85
|
+
end
|
82
86
|
end
|
83
87
|
@incArray.uniq!
|
84
88
|
end
|
@@ -94,7 +98,11 @@ module Cxxproject
|
|
94
98
|
end
|
95
99
|
|
96
100
|
def get_define_string(tcs, type)
|
97
|
-
|
101
|
+
if (has_tcs?)
|
102
|
+
return tcs[:COMPILER][type][:DEFINES].map {|k| "#{tcs[:COMPILER][type][:DEFINE_FLAG]}#{k}"}
|
103
|
+
else
|
104
|
+
return 'only needed for spec'
|
105
|
+
end
|
98
106
|
end
|
99
107
|
|
100
108
|
def get_object_file(sourceRel)
|
@@ -167,7 +175,6 @@ module Cxxproject
|
|
167
175
|
end
|
168
176
|
|
169
177
|
def create_object_file_tasks()
|
170
|
-
|
171
178
|
sources_to_build = {}
|
172
179
|
|
173
180
|
exclude_files = Set.new
|
data/lib/cxxproject/version.rb
CHANGED
data/spec/building_block_spec.rb
CHANGED
@@ -10,26 +10,35 @@ describe Cxxproject::BuildingBlock do
|
|
10
10
|
before(:each) do
|
11
11
|
Cxxproject::Utils.cleanup_rake
|
12
12
|
end
|
13
|
+
|
13
14
|
after(:each) do
|
14
15
|
Cxxproject::Utils.cleanup_rake
|
15
16
|
end
|
16
17
|
|
17
|
-
it 'should
|
18
|
+
it 'should collect the dependencies for a single lib' do
|
19
|
+
lib1 = Cxxproject::SourceLibrary.new('1')
|
20
|
+
lib1.collect_dependencies().should == [lib1]
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should collect the dependencies for a single lib with one dep' do
|
18
24
|
lib1 = Cxxproject::SourceLibrary.new('1')
|
19
25
|
lib2 = Cxxproject::SourceLibrary.new('2').set_dependencies(['1'])
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
26
|
+
lib2.collect_dependencies().should == [lib2, lib1]
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should build the right dependency-chain' do
|
30
|
+
lib1 = Cxxproject::SourceLibrary.new('1').set_dependencies(['2'])
|
31
|
+
lib2 = Cxxproject::SourceLibrary.new('2')
|
32
|
+
lib3 = Cxxproject::SourceLibrary.new('3').set_dependencies(['2', '1'])
|
33
|
+
lib3.collect_dependencies().should == [lib3, lib1, lib2]
|
24
34
|
end
|
25
35
|
|
26
36
|
it 'should build the right dependency-chain for custom blocks' do
|
27
37
|
lib1 = Cxxproject::SourceLibrary.new('1')
|
28
|
-
lib2 = Cxxproject::
|
29
|
-
lib3 = Cxxproject::SourceLibrary.new('3').set_dependencies(['1'])
|
30
|
-
lib4 = Cxxproject::
|
31
|
-
|
32
|
-
deps.should == ['4', '2', '3', '1']
|
38
|
+
lib2 = Cxxproject::SourceLibrary.new('2').set_dependencies(['1'])
|
39
|
+
lib3 = Cxxproject::SourceLibrary.new('3').set_dependencies(['1', '2'])
|
40
|
+
lib4 = Cxxproject::SourceLibrary.new('4').set_dependencies(['1', '2', '3'])
|
41
|
+
lib4.collect_dependencies().should == [lib4, lib3, lib2, lib1]
|
33
42
|
end
|
34
43
|
|
35
44
|
it 'should generate an error if building block names conflict' do
|
@@ -51,6 +60,22 @@ describe Cxxproject::BuildingBlock do
|
|
51
60
|
}.should raise_exception
|
52
61
|
end
|
53
62
|
|
63
|
+
it 'should handle whole archive' do
|
64
|
+
# TODO ... clean up api and also this test
|
65
|
+
l1 = Cxxproject::SourceLibrary.new('1', true)
|
66
|
+
l1.output_dir = 'out'
|
67
|
+
l1.complete_init
|
68
|
+
l2 = Cxxproject::SourceLibrary.new('2', true)
|
69
|
+
l2.output_dir = 'out'
|
70
|
+
l2.complete_init
|
71
|
+
exe = Cxxproject::Executable.new('test')
|
72
|
+
deps = ['1', '2']
|
73
|
+
exe.set_dependencies(deps)
|
74
|
+
exe.complete_init
|
75
|
+
exe.linker_lib_string({:START_OF_WHOLE_ARCHIVE => 'start', :END_OF_WHOLE_ARCHIVE => 'end'}).should == ['start', 'out/lib2.a', 'end', 'start', 'out/lib1.a', 'end']
|
76
|
+
# TODO add a test for recursive whole archive libs a lib that should be whole and that has dependencies to whole libs
|
77
|
+
end
|
78
|
+
|
54
79
|
=begin
|
55
80
|
it 'should have the right output-directory' do
|
56
81
|
lib1 = Cxxproject::SourceLibrary.new('lib1').set_sources(['test.cc'])
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cxxproject
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.27
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: colored
|
@@ -220,7 +220,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
220
220
|
version: '0'
|
221
221
|
segments:
|
222
222
|
- 0
|
223
|
-
hash: -
|
223
|
+
hash: -319442458633377301
|
224
224
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
225
225
|
none: false
|
226
226
|
requirements:
|