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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e7002afc65c5738fb7929e1b81cc491b9d7a7196b2ada01f3b6f580ccfe25133
4
- data.tar.gz: 48632ed95d610599712de7f84fbfb8108c1195d9460cf1a96b8b22cccb59891c
3
+ metadata.gz: e50f9ba8d96948ef0cf070c3cf105641b3abc7e6c6b83823b989fb5b83f51cc5
4
+ data.tar.gz: '02916721983f2bd1fc18837f7db4a73dd77c42bebbe4c36d498e0a8e4b73fe2f'
5
5
  SHA512:
6
- metadata.gz: fa9c3ccf050acd66acd89bdc4b7f4fc280c68e926be7d027cfbb44cecf9f89b51aa7b61b44269f6f7d4a2c2524f4b67e65ba507a074824bba7018940dfb19d82
7
- data.tar.gz: 23f4cd1c8e5bb9e57d8bda28974366d7486efca3a5d7c275c1042a27a7c039dd80e699d792330417647a72b3615ba164aba502c7e16097a549fd16b41fc45135
6
+ metadata.gz: ad38fa76f5190af9de7579ee5f8e11da9f42b35ec57b833f19e63a01ded4255f9dca913959c6fa5306b2a136b45228b0f8c5e3522bae64b7fcb99c9df29168f1
7
+ data.tar.gz: 5877024cb80c0bd1bd767982c28ea3ceea82aa883f5ae27d0c45d28f2b73339df917dbc50cfecf5fd5c09bbc7f8cfb538ef963e9c6b0b865c5c41dd4bb1f33a1
data/lib/coloring.rb CHANGED
@@ -10,7 +10,7 @@ class String
10
10
  34 => :blue,
11
11
  35 => :magenta,
12
12
  36 => :cyan,
13
- 37 => :white,
13
+ 37 => :white
14
14
  }
15
15
  colors.each do |k, v|
16
16
  define_method v do
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
- if should_recompile?(k, build_time)
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
- ret
77
+ true if should_recompile?(file, build_time)
81
78
  end
82
79
 
83
80
  def should_recompile?(file, build_time)
@@ -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
- dep = deps[file_name]
167
- if dep.empty?
168
- []
169
- else
170
- tmp = dep.map { |n| extract_name(n, @workspace.components_prefix).upcase }
171
- dep.each do |d|
172
- tmp += get_all_dep_name(d, deps)
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
- tmp
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
@@ -9,27 +9,53 @@ module Canoe
9
9
  test_single(args[0], args[1..].join(" "))
10
10
  end
11
11
 
12
- # extract one test file's dependency
12
+ # extract all files the file depends on, including headers
13
13
  def extract_one_file(file, deps)
14
- ret = deps[file].map { |f| f.gsub(".#{@header_suffix}", ".#{@source_suffix}") }
15
-
16
- deps[file].each do |f|
17
- dep = extract_one_file(f, deps)
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, extract_one_file_obj(test_file, deps) + [file_to_obj(test_file)]
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
- files << test_file
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} compiling #{f} "
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
@@ -2,7 +2,7 @@ module Canoe
2
2
  class WorkSpace
3
3
  def self.version
4
4
  puts <<~VER
5
- canoe v0.3.3.3
5
+ canoe v0.3.3.6
6
6
  For features in this version, please visit https://github.com/Dicridon/canoe
7
7
  Currently, canoe can do below:
8
8
  - project creation
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.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: 2021-12-13 00:00:00.000000000 Z
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.