canoe 0.3.3.3 → 0.3.3.4

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: 28de761c23336af9df9ed1117d47f85c22f77abd3030195462d0e43ccba5091c
4
+ data.tar.gz: f0734ecf77c58d6d86a72835fff2e56e1ff49504be3f2ad7cc3e182e550b5623
5
5
  SHA512:
6
- metadata.gz: fa9c3ccf050acd66acd89bdc4b7f4fc280c68e926be7d027cfbb44cecf9f89b51aa7b61b44269f6f7d4a2c2524f4b67e65ba507a074824bba7018940dfb19d82
7
- data.tar.gz: 23f4cd1c8e5bb9e57d8bda28974366d7486efca3a5d7c275c1042a27a7c039dd80e699d792330417647a72b3615ba164aba502c7e16097a549fd16b41fc45135
6
+ metadata.gz: ff0167eca4be655a4cc33258b5dddfa07e7cbad53d6745b38d75eb301c032403d5338e6249f7704dee460dbaa87a3a4141b8f1ca023abcff5af4a660691b4f2c
7
+ data.tar.gz: f5c494d7cefeefca5e2fd14353f9645479c29f4bb338330ebb9075d103fce73ea678bbb62823053bafdbe3bad497d7b5ecc8a3ca369ff078b937d1e7296e5fbd
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
 
@@ -246,7 +251,7 @@ module Canoe
246
251
  def make_clean(makefile)
247
252
  clean = <<~DOC
248
253
  .PHONY: clean
249
- clean:
254
+ clean:
250
255
  \trm ./target/*
251
256
  \trm ./obj/*.o
252
257
  DOC
@@ -12,13 +12,17 @@ module Canoe
12
12
  # extract one test file's dependency
13
13
  def extract_one_file(file, deps)
14
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)
15
+ begin
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
20
21
  end
21
- end
22
+ rescue SystemStackError
23
+ puts "#{"Fatal: ".red}file #{file} is circularly included"
24
+ exit false
25
+ end
22
26
  ret.map { |f| f.gsub(".#{@header_suffix}", ".#{@source_suffix}") }
23
27
  end
24
28
 
@@ -83,17 +87,23 @@ module Canoe
83
87
  @compiler.link_executable target, extract_one_file_obj(test_file, deps) + [file_to_obj(test_file)]
84
88
  end
85
89
 
86
- def build_one_test(test_file, deps)
90
+ def build_one_test(test_file, deps, indent = "")
87
91
  files = DepAnalyzer.compiling_filter(target_deps, Time.new(0), @source_suffix, @header_suffix)
88
92
  flag = true
89
93
  files << test_file
90
94
 
95
+ stepper = Stepper.new(files.size, files.size)
96
+
91
97
  files.each do |f|
92
98
  o = file_to_obj(f)
99
+ printf "#{indent}#{stepper.progress_as_str.green} compiling #{f.yellow}: "
93
100
  flag &= compile f, o
101
+ stepper.step
94
102
  end
95
-
96
103
  abort_on_err("Compiling errors encountered") unless flag;
104
+
105
+ printf "#{indent}#{stepper.progress_as_str.green} compiling finished\n"
106
+ puts "#{indent}[100%]".green + " linking"
97
107
  link_one_test(test_file, deps)
98
108
  end
99
109
 
@@ -105,8 +115,8 @@ module Canoe
105
115
  stepper = Stepper.new fetch_all_test_files.size, files.size
106
116
 
107
117
  files.each do |f|
108
- printf "#{stepper.progress_as_str.green} compiling #{f} "
109
- build_one_test(f, deps)
118
+ printf "#{stepper.progress_as_str.green} building #{File.basename(f, "." + @source_suffix).yellow}:\n"
119
+ build_one_test(f, deps, " ")
110
120
  stepper.step
111
121
  end
112
122
  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.4
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.4
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: 2021-12-19 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |+
14
14
  Canoe offers project management and building facilities to C/C++ projects.