canoe 0.3.3.3 → 0.3.3.6
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.
- checksums.yaml +4 -4
- data/lib/coloring.rb +1 -1
- data/lib/dependence.rb +14 -17
- data/lib/workspace/make.rb +16 -11
- data/lib/workspace/test.rb +49 -17
- data/lib/workspace/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e50f9ba8d96948ef0cf070c3cf105641b3abc7e6c6b83823b989fb5b83f51cc5
|
|
4
|
+
data.tar.gz: '02916721983f2bd1fc18837f7db4a73dd77c42bebbe4c36d498e0a8e4b73fe2f'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ad38fa76f5190af9de7579ee5f8e11da9f42b35ec57b833f19e63a01ded4255f9dca913959c6fa5306b2a136b45228b0f8c5e3522bae64b7fcb99c9df29168f1
|
|
7
|
+
data.tar.gz: 5877024cb80c0bd1bd767982c28ea3ceea82aa883f5ae27d0c45d28f2b73339df917dbc50cfecf5fd5c09bbc7f8cfb538ef963e9c6b0b865c5c41dd4bb1f33a1
|
data/lib/coloring.rb
CHANGED
data/lib/dependence.rb
CHANGED
|
@@ -17,6 +17,7 @@ module Canoe
|
|
|
17
17
|
include SystemCommand
|
|
18
18
|
|
|
19
19
|
class << self
|
|
20
|
+
include Err
|
|
20
21
|
include WorkSpaceUtil
|
|
21
22
|
def read_from(filename)
|
|
22
23
|
File.open(filename, 'r') do |f|
|
|
@@ -32,29 +33,28 @@ module Canoe
|
|
|
32
33
|
|
|
33
34
|
def compiling_filter(deps, build_time, src_sfx = 'cpp', hdr_sfx = 'hpp')
|
|
34
35
|
files = []
|
|
35
|
-
@processed = {}
|
|
36
36
|
@recompiles = {}
|
|
37
37
|
deps.each_key do |k|
|
|
38
|
-
@processed[k] = false
|
|
39
38
|
@recompiles[k] = false
|
|
40
39
|
end
|
|
41
40
|
deps.each do |k, v|
|
|
42
41
|
next if k.end_with? ".#{hdr_sfx}"
|
|
43
42
|
|
|
44
|
-
|
|
45
|
-
files << k
|
|
46
|
-
@processed[k] = true
|
|
47
|
-
@recompiles[k] = true
|
|
48
|
-
next
|
|
49
|
-
end
|
|
43
|
+
# first analyze dependency to discover circular includes
|
|
50
44
|
v.each do |f|
|
|
51
45
|
next unless mark(f, build_time, deps) || mark(f.sub(".#{hdr_sfx}", ".#{src_sfx}"), build_time, deps)
|
|
52
46
|
|
|
53
47
|
files << k
|
|
54
|
-
@processed[k] = true
|
|
55
48
|
@recompiles[k] = true
|
|
56
49
|
break
|
|
57
50
|
end
|
|
51
|
+
|
|
52
|
+
next if @recompiles[k]
|
|
53
|
+
|
|
54
|
+
if should_recompile?(k, build_time)
|
|
55
|
+
files << k
|
|
56
|
+
@recompiles[k] = true
|
|
57
|
+
end
|
|
58
58
|
end
|
|
59
59
|
files
|
|
60
60
|
end
|
|
@@ -62,22 +62,19 @@ module Canoe
|
|
|
62
62
|
private
|
|
63
63
|
|
|
64
64
|
def mark(file, build_time, deps)
|
|
65
|
-
ret = false
|
|
66
65
|
return false unless File.exist? file
|
|
67
|
-
return true if should_recompile?(file, build_time)
|
|
68
66
|
|
|
67
|
+
# first analyze dependency to discover circular includes
|
|
69
68
|
deps[file].each do |f|
|
|
70
|
-
if @processed[f]
|
|
71
|
-
ret |= @recompiles[f]
|
|
72
|
-
next
|
|
73
|
-
end
|
|
74
|
-
@processed[f] = true
|
|
75
69
|
if mark(f, build_time, deps)
|
|
76
70
|
@recompiles[f] = true
|
|
77
71
|
return true
|
|
78
72
|
end
|
|
73
|
+
rescue SystemStackError
|
|
74
|
+
puts "#{"Fatal: ".red}file #{file} is circularly included"
|
|
75
|
+
exit false
|
|
79
76
|
end
|
|
80
|
-
|
|
77
|
+
true if should_recompile?(file, build_time)
|
|
81
78
|
end
|
|
82
79
|
|
|
83
80
|
def should_recompile?(file, build_time)
|
data/lib/workspace/make.rb
CHANGED
|
@@ -84,7 +84,7 @@ module Canoe
|
|
|
84
84
|
def define_variables(makefile, deps)
|
|
85
85
|
define_dirs(makefile)
|
|
86
86
|
src_files = deps.keys.select { |f| f.end_with? get_source_suffix }
|
|
87
|
-
|
|
87
|
+
|
|
88
88
|
generate_all_names(src_files)
|
|
89
89
|
define_srcs(makefile, src_files)
|
|
90
90
|
makefile.puts ''
|
|
@@ -163,15 +163,20 @@ module Canoe
|
|
|
163
163
|
end
|
|
164
164
|
|
|
165
165
|
def get_all_dep_name(file_name, deps)
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
166
|
+
begin
|
|
167
|
+
dep = deps[file_name]
|
|
168
|
+
if dep.empty?
|
|
169
|
+
[]
|
|
170
|
+
else
|
|
171
|
+
tmp = dep.map { |n| extract_name(n, @workspace.components_prefix).upcase }
|
|
172
|
+
dep.each do |d|
|
|
173
|
+
tmp += get_all_dep_name(d, deps)
|
|
174
|
+
end
|
|
175
|
+
tmp
|
|
173
176
|
end
|
|
174
|
-
|
|
177
|
+
rescue SystemStackError
|
|
178
|
+
puts "#{"Fatal: ".red}file #{file_name} is circularly included"
|
|
179
|
+
exit false
|
|
175
180
|
end
|
|
176
181
|
end
|
|
177
182
|
|
|
@@ -237,7 +242,6 @@ module Canoe
|
|
|
237
242
|
objs = ["$(OBJ_#{n})"] + extract_one_file_obj(filename, deps).map do |o|
|
|
238
243
|
"$(OBJ_#{File.basename(o, '.*').upcase})"
|
|
239
244
|
end
|
|
240
|
-
|
|
241
245
|
makefile.puts("$(#{n}): #{objs.join ' '}\n\t$(#{cmplr}) $(#{cmplr}FLAGS) -o $@ $^ $(LDFLAGS) $(LDLIBS)")
|
|
242
246
|
makefile.puts ''
|
|
243
247
|
end
|
|
@@ -246,7 +250,7 @@ module Canoe
|
|
|
246
250
|
def make_clean(makefile)
|
|
247
251
|
clean = <<~DOC
|
|
248
252
|
.PHONY: clean
|
|
249
|
-
clean:
|
|
253
|
+
clean:
|
|
250
254
|
\trm ./target/*
|
|
251
255
|
\trm ./obj/*.o
|
|
252
256
|
DOC
|
|
@@ -259,6 +263,7 @@ module Canoe
|
|
|
259
263
|
make_out_rules makefile, deps
|
|
260
264
|
makefile.puts ''
|
|
261
265
|
make_obj_rules makefile, deps
|
|
266
|
+
makefile.puts ''
|
|
262
267
|
make_tests_rules makefile, deps
|
|
263
268
|
makefile.puts ''
|
|
264
269
|
make_clean makefile
|
data/lib/workspace/test.rb
CHANGED
|
@@ -9,27 +9,53 @@ module Canoe
|
|
|
9
9
|
test_single(args[0], args[1..].join(" "))
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
# extract
|
|
12
|
+
# extract all files the file depends on, including headers
|
|
13
13
|
def extract_one_file(file, deps)
|
|
14
|
-
ret =
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
dep.each do |d|
|
|
19
|
-
ret << d unless ret.include?(d)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
ret.map { |f| f.gsub(".#{@header_suffix}", ".#{@source_suffix}") }
|
|
14
|
+
ret = []
|
|
15
|
+
holder = deps[file] + deps[file].map { |f| f.gsub(".#{@header_suffix}", ".#{@source_suffix}") }
|
|
16
|
+
extract_one_file_helper(file, deps, holder, ret)
|
|
17
|
+
ret.uniq
|
|
23
18
|
end
|
|
24
19
|
|
|
25
20
|
def extract_one_file_obj(file, deps)
|
|
26
|
-
extract_one_file(file, deps).map do |f|
|
|
21
|
+
ret = extract_one_file(file, deps).map do |f|
|
|
27
22
|
file_to_obj(f)
|
|
28
23
|
end
|
|
24
|
+
ret.uniq
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def extract_one_file_header(file, deps)
|
|
28
|
+
ret = extract_one_file(file, deps).map do |f|
|
|
29
|
+
f.gsub(".#{@source_suffix}", ".#{@header_suffix}")
|
|
30
|
+
end
|
|
31
|
+
ret.uniq
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def extract_one_file_source(file, deps)
|
|
35
|
+
ret = extract_one_file(file, deps).map do |f|
|
|
36
|
+
f.gsub(".#{@header_suffix}", ".#{@source_suffix}")
|
|
37
|
+
end
|
|
38
|
+
ret.uniq
|
|
29
39
|
end
|
|
30
40
|
|
|
31
41
|
private
|
|
32
42
|
|
|
43
|
+
# extract one test file's dependency
|
|
44
|
+
def extract_one_file_helper(file, deps, ref, ret)
|
|
45
|
+
begin
|
|
46
|
+
ref.each do |f|
|
|
47
|
+
ret << f unless ret.include?(f)
|
|
48
|
+
dep = extract_one_file_helper(f, deps, deps[f], ret)
|
|
49
|
+
dep.each do |d|
|
|
50
|
+
ret << d unless ret.include?(d)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
rescue SystemStackError
|
|
54
|
+
puts "#{"Fatal: ".red}file #{file} is circularly included"
|
|
55
|
+
exit false
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
33
59
|
def test_all
|
|
34
60
|
build_test
|
|
35
61
|
fetch_all_test_files.each do |f|
|
|
@@ -80,20 +106,26 @@ module Canoe
|
|
|
80
106
|
|
|
81
107
|
def link_one_test(test_file, deps)
|
|
82
108
|
target = "#{@target_short}/#{File.basename(test_file, '.*')}"
|
|
83
|
-
@compiler.link_executable target,
|
|
109
|
+
@compiler.link_executable target, [file_to_obj(test_file)] + extract_one_file_obj(test_file, deps)
|
|
84
110
|
end
|
|
85
111
|
|
|
86
|
-
def build_one_test(test_file, deps)
|
|
112
|
+
def build_one_test(test_file, deps, indent = "")
|
|
87
113
|
files = DepAnalyzer.compiling_filter(target_deps, Time.new(0), @source_suffix, @header_suffix)
|
|
114
|
+
.intersection(extract_one_file_source(test_file, deps)) << test_file
|
|
88
115
|
flag = true
|
|
89
|
-
|
|
116
|
+
|
|
117
|
+
stepper = Stepper.new(files.size, files.size)
|
|
90
118
|
|
|
91
119
|
files.each do |f|
|
|
92
120
|
o = file_to_obj(f)
|
|
121
|
+
printf "#{indent}#{stepper.progress_as_str.green} compiling #{f.yellow}: "
|
|
93
122
|
flag &= compile f, o
|
|
123
|
+
stepper.step
|
|
94
124
|
end
|
|
95
|
-
|
|
96
125
|
abort_on_err("Compiling errors encountered") unless flag;
|
|
126
|
+
|
|
127
|
+
printf "#{indent}#{stepper.progress_as_str.green} compiling finished\n"
|
|
128
|
+
puts "#{indent}[100%]".green + " linking"
|
|
97
129
|
link_one_test(test_file, deps)
|
|
98
130
|
end
|
|
99
131
|
|
|
@@ -105,8 +137,8 @@ module Canoe
|
|
|
105
137
|
stepper = Stepper.new fetch_all_test_files.size, files.size
|
|
106
138
|
|
|
107
139
|
files.each do |f|
|
|
108
|
-
printf "#{stepper.progress_as_str.green}
|
|
109
|
-
build_one_test(f, deps)
|
|
140
|
+
printf "#{stepper.progress_as_str.green} building #{File.basename(f, "." + @source_suffix).yellow}:\n"
|
|
141
|
+
build_one_test(f, deps, " ")
|
|
110
142
|
stepper.step
|
|
111
143
|
end
|
|
112
144
|
end
|
data/lib/workspace/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: canoe
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.3.
|
|
4
|
+
version: 0.3.3.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- XIONG Ziwei
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-02-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: |+
|
|
14
14
|
Canoe offers project management and building facilities to C/C++ projects.
|