canoe 0.3.2.2 → 0.3.3.1
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/config_reader.rb +9 -3
- data/lib/source_files.rb +2 -1
- data/lib/util.rb +11 -2
- data/lib/workspace/build.rb +9 -7
- data/lib/workspace/help.rb +2 -1
- data/lib/workspace/make.rb +1 -1
- data/lib/workspace/new.rb +15 -3
- data/lib/workspace/run.rb +1 -1
- data/lib/workspace/test.rb +22 -15
- 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: f306cd1daca6a05e5ed98b6bac0d638ee6c8b3deb8f033573254b40e0e111f04
|
|
4
|
+
data.tar.gz: 20025070fa9b8880e7702fa1560458c6c02f3bd6ef544f0c105c04c4eabbb08b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 57d280fbde673916e1abc93a027cb9be3eda421a9bf9e65ece2c5415d9c0be19236070575b464b09d934aad7729343afcbd9e105424105417e1ea14db50e300c
|
|
7
|
+
data.tar.gz: b0724750762fe724958ec732e7f701d13f8b0d7c2cfaf80f8e32c01e959b982e682594cc543cc45115e0aef0a70bfd93c0ca53cd48aa8278b905d87904f52ad7
|
data/lib/config_reader.rb
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
require 'json'
|
|
2
|
+
require_relative 'util'
|
|
2
3
|
|
|
3
4
|
##
|
|
4
5
|
# class ConfigReader
|
|
5
6
|
# Just read a json file
|
|
6
7
|
class ConfigReader
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
include Canoe::Err
|
|
9
|
+
def initialize(file)
|
|
10
|
+
@config_file = file
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def extract_flags
|
|
14
|
+
abort_on_err("config file #{@config_file} does not exsit") unless File.exist? @config_file
|
|
15
|
+
JSON.parse(File.read(@config_file))
|
|
10
16
|
end
|
|
11
17
|
end
|
data/lib/source_files.rb
CHANGED
|
@@ -30,13 +30,14 @@ class SourceFiles
|
|
|
30
30
|
def get_all_helper(dir, &block)
|
|
31
31
|
Dir.each_child(dir) do |f|
|
|
32
32
|
file = "#{dir}/#{f}"
|
|
33
|
+
# we don't handle symlinks
|
|
33
34
|
if File.file? file
|
|
34
35
|
if block_given?
|
|
35
36
|
@files << "#{file}" if yield(f)
|
|
36
37
|
else
|
|
37
38
|
@files << "#{file}"
|
|
38
39
|
end
|
|
39
|
-
|
|
40
|
+
elsif File.directory? file
|
|
40
41
|
get_all_helper("#{file}", &block)
|
|
41
42
|
end
|
|
42
43
|
end
|
data/lib/util.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
require_relative 'coloring'
|
|
2
2
|
|
|
3
|
+
require 'English'
|
|
4
|
+
|
|
3
5
|
module Canoe
|
|
4
6
|
##
|
|
5
7
|
# Stepper record the progress of a task
|
|
@@ -25,7 +27,7 @@ module Canoe
|
|
|
25
27
|
module WorkSpaceUtil
|
|
26
28
|
def current_workspace
|
|
27
29
|
abort_on_err 'not in a canoe workspace' unless File.exist? '.canoe'
|
|
28
|
-
config = ConfigReader.
|
|
30
|
+
config = ConfigReader.new('config.json').extract_flags
|
|
29
31
|
|
|
30
32
|
src_sfx = config['source-suffix'] || 'cpp'
|
|
31
33
|
hdr_sfx = config['header-suffix'] || 'hpp'
|
|
@@ -60,7 +62,14 @@ module Canoe
|
|
|
60
62
|
module SystemCommand
|
|
61
63
|
def issue_command(cmd_str)
|
|
62
64
|
puts cmd_str
|
|
63
|
-
system
|
|
65
|
+
system(cmd_str)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def run_command(cmd_str)
|
|
69
|
+
puts cmd_str
|
|
70
|
+
status = system(cmd_str)
|
|
71
|
+
puts $CHILD_STATUS unless status
|
|
72
|
+
status
|
|
64
73
|
end
|
|
65
74
|
end
|
|
66
75
|
|
data/lib/workspace/build.rb
CHANGED
|
@@ -18,9 +18,14 @@ module Canoe
|
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
+
def hdr_of_src(file)
|
|
22
|
+
file.gsub(".#{@source_suffix}", ".#{@header_suffix}")
|
|
23
|
+
end
|
|
24
|
+
|
|
21
25
|
# args are commandline parameters passed to `canoe build`,
|
|
22
26
|
# could be 'all', 'test', 'target', 'base' or empty
|
|
23
27
|
def build(arg = 'target')
|
|
28
|
+
build_compiler_from_config
|
|
24
29
|
send "build_#{arg}"
|
|
25
30
|
end
|
|
26
31
|
|
|
@@ -42,14 +47,14 @@ module Canoe
|
|
|
42
47
|
end
|
|
43
48
|
|
|
44
49
|
def build_compiler_from_config
|
|
45
|
-
flags = ConfigReader.
|
|
46
|
-
compiler_name = flags[
|
|
50
|
+
flags = ConfigReader.new('config.json').extract_flags
|
|
51
|
+
compiler_name = flags['compiler'] ? flags['compiler'] : 'clang++'
|
|
47
52
|
|
|
48
53
|
abort_on_err "compiler #{compiler_name} not found" unless system "which #{compiler_name} > /dev/null"
|
|
49
|
-
compiler_flags = [
|
|
54
|
+
compiler_flags = ['-Isrc/components']
|
|
50
55
|
linker_flags = []
|
|
51
56
|
|
|
52
|
-
c_flags, l_flags = flags[
|
|
57
|
+
c_flags, l_flags = flags['flags']['compile'], flags['flags']['link']
|
|
53
58
|
build_flags(compiler_flags, c_flags)
|
|
54
59
|
build_flags(linker_flags, l_flags)
|
|
55
60
|
|
|
@@ -132,8 +137,6 @@ module Canoe
|
|
|
132
137
|
build_time = File.exist?(target) ? File.mtime(target) : Time.new(0)
|
|
133
138
|
files = DepAnalyzer.compiling_filter target_deps, build_time, @source_suffix, @header_suffix
|
|
134
139
|
|
|
135
|
-
build_compiler_from_config
|
|
136
|
-
|
|
137
140
|
if files.empty? && File.exist?(target)
|
|
138
141
|
puts "nothing to do, all up to date"
|
|
139
142
|
return true
|
|
@@ -145,7 +148,6 @@ module Canoe
|
|
|
145
148
|
# generate a compile_commands.json file
|
|
146
149
|
def build_base
|
|
147
150
|
deps = target_deps.merge tests_deps
|
|
148
|
-
build_compiler_from_config
|
|
149
151
|
database = CompilationDatabase.new
|
|
150
152
|
deps.each_key do |k|
|
|
151
153
|
next if k.end_with? @header_suffix
|
data/lib/workspace/help.rb
CHANGED
|
@@ -53,9 +53,10 @@ module Canoe
|
|
|
53
53
|
build [all|test]:
|
|
54
54
|
build current project, 'all' builds both target and tests, 'test' builds tests only
|
|
55
55
|
|
|
56
|
-
test [tests]:
|
|
56
|
+
test [tests] [args]:
|
|
57
57
|
build and run tests
|
|
58
58
|
[tests]: 'all' for all tests, or a name of a test for a single test
|
|
59
|
+
[args]: args are passed to the single test
|
|
59
60
|
|
|
60
61
|
run [options]:
|
|
61
62
|
build current project with no specific compilation flags, and run this project, passing [options] as command line arguments to the binary
|
data/lib/workspace/make.rb
CHANGED
data/lib/workspace/new.rb
CHANGED
|
@@ -8,7 +8,8 @@ module Canoe
|
|
|
8
8
|
end
|
|
9
9
|
Dir.mkdir(@src)
|
|
10
10
|
Dir.mkdir(@components)
|
|
11
|
-
Dir.mkdir(
|
|
11
|
+
Dir.mkdir(@obj)
|
|
12
|
+
add_gitignore @obj
|
|
12
13
|
if @mode == :bin
|
|
13
14
|
DefaultFiles.create_main(@src, @source_suffix)
|
|
14
15
|
else
|
|
@@ -20,12 +21,23 @@ module Canoe
|
|
|
20
21
|
|
|
21
22
|
Dir.mkdir(@third)
|
|
22
23
|
Dir.mkdir(@target)
|
|
24
|
+
add_gitignore @target
|
|
23
25
|
Dir.mkdir(@tests)
|
|
24
26
|
Dir.chdir(@workspace) do
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
issue_command 'git init'
|
|
28
|
+
issue_command 'canoe add tests'
|
|
27
29
|
end
|
|
28
30
|
puts "workspace #{@workspace.blue} is created"
|
|
29
31
|
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def add_gitignore(dir)
|
|
36
|
+
Dir.chdir(dir) do
|
|
37
|
+
File.open('.gitignore', 'w') do |f|
|
|
38
|
+
f.write "*\n!.gitignore\n"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
30
42
|
end
|
|
31
43
|
end
|
data/lib/workspace/run.rb
CHANGED
data/lib/workspace/test.rb
CHANGED
|
@@ -5,20 +5,13 @@ module Canoe
|
|
|
5
5
|
test_all
|
|
6
6
|
return
|
|
7
7
|
end
|
|
8
|
-
|
|
9
|
-
args.
|
|
10
|
-
case arg
|
|
11
|
-
when 'all'
|
|
12
|
-
test_all
|
|
13
|
-
else
|
|
14
|
-
test_single arg
|
|
15
|
-
end
|
|
16
|
-
end
|
|
8
|
+
# we don't handle spaces
|
|
9
|
+
test_single(args[0], args[1..].join(" "))
|
|
17
10
|
end
|
|
18
11
|
|
|
19
12
|
# extract one test file's dependency
|
|
20
13
|
def extract_one_file(file, deps)
|
|
21
|
-
ret = deps[file]
|
|
14
|
+
ret = deps[file].map { |f| f.gsub(".#{@header_suffix}", ".#{@source_suffix}") }
|
|
22
15
|
|
|
23
16
|
deps[file].each do |f|
|
|
24
17
|
dep = extract_one_file(f, deps)
|
|
@@ -44,13 +37,27 @@ module Canoe
|
|
|
44
37
|
end
|
|
45
38
|
end
|
|
46
39
|
|
|
47
|
-
def test_single(name)
|
|
40
|
+
def test_single(name, args = "")
|
|
41
|
+
rebuild = false;
|
|
48
42
|
bin = "#{@target_short}/test_#{name}"
|
|
43
|
+
|
|
44
|
+
rebuild ||= !File.exist?(bin)
|
|
45
|
+
|
|
49
46
|
file = "#{@tests_short}/test_#{name}.#{@source_suffix}"
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
rebuild ||= File.mtime(bin) < File.mtime(file)
|
|
48
|
+
|
|
49
|
+
deps = fetch_all_deps
|
|
50
|
+
extract_one_file(file, deps).each do |f|
|
|
51
|
+
rebuild ||= File.mtime(bin) < File.mtime(f) || File.mtime(bin) < File.mtime(hdr_of_src(f))
|
|
52
|
+
end
|
|
52
53
|
|
|
53
|
-
|
|
54
|
+
cmd = "#{bin} #{args}"
|
|
55
|
+
if rebuild
|
|
56
|
+
build_compiler_from_config
|
|
57
|
+
run_command cmd if build_one_test(file, deps)
|
|
58
|
+
else
|
|
59
|
+
run_command cmd
|
|
60
|
+
end
|
|
54
61
|
end
|
|
55
62
|
|
|
56
63
|
def fetch_all_test_files
|
|
@@ -76,7 +83,7 @@ module Canoe
|
|
|
76
83
|
def compile_one_test(test_file, deps)
|
|
77
84
|
extract_one_file(test_file, deps).each do |f|
|
|
78
85
|
o = file_to_obj(f)
|
|
79
|
-
next if File.exist?(o) && File.mtime(o) > File.mtime(f)
|
|
86
|
+
next if File.exist?(o) && File.mtime(o) > File.mtime(f) && File.mtime(o) > File.mtime(hdr_of_src(f))
|
|
80
87
|
|
|
81
88
|
compile(f, o)
|
|
82
89
|
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.
|
|
4
|
+
version: 0.3.3.1
|
|
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-
|
|
11
|
+
date: 2021-08-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: |+
|
|
14
14
|
Canoe offers project management and building facilities to C/C++ projects.
|