magica 0.2.0 → 0.3.0
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/magica/all.rb +2 -1
- data/lib/magica/application.rb +42 -0
- data/lib/magica/build.rb +145 -0
- data/lib/magica/commands/compiler.rb +1 -1
- data/lib/magica/commands/linker.rb +4 -2
- data/lib/magica/dsl.rb +4 -7
- data/lib/magica/magica.rb +6 -2
- data/lib/magica/package_config.rb +38 -0
- data/lib/magica/tasks/framework.rake +1 -1
- data/lib/magica/templates/Magicafile +8 -6
- data/lib/magica/version.rb +1 -1
- metadata +3 -3
- data/lib/magica/builder.rb +0 -90
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e2da1bed863df770f3cda733a7fd15f2ebbd2e14
|
4
|
+
data.tar.gz: b5753f85c89bedf34cc8f277f8adc9445e3389e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0c39a627e37f94cf9c0c321967964f836ad3d3e4add99df62bd2ab245752453a7cbf123f0deb2547b2c89beceb52d631a7de3966a2440a71e6deb5790b4f84d
|
7
|
+
data.tar.gz: f710c1b786149e677b4c2440d96c2003f797ce1808d4e94b9e197472dd8576bb02ec0e1d74f0c08162f0c0ed5d5abf5c8be21add03b9d861d0137461ac54c214
|
data/lib/magica/all.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
require "rake"
|
2
2
|
|
3
|
+
require "magica/version"
|
4
|
+
require "magica/package_config"
|
3
5
|
require "magica/extension"
|
4
6
|
require "magica/i18n"
|
5
7
|
require "magica/dsl"
|
6
8
|
require "magica/toolchain"
|
7
|
-
require "magica/builder"
|
8
9
|
require "magica/application"
|
9
10
|
|
10
11
|
require "magica/command"
|
data/lib/magica/application.rb
CHANGED
@@ -22,6 +22,31 @@ module Magica
|
|
22
22
|
super
|
23
23
|
end
|
24
24
|
|
25
|
+
def handle_options
|
26
|
+
options.rakelib = ["rakelib"]
|
27
|
+
options.trace_output = $stderr
|
28
|
+
|
29
|
+
OptionParser.new do |opts|
|
30
|
+
opts.on_tail("-h", "--help", "-H", "Display this help message.") do
|
31
|
+
puts opts
|
32
|
+
exit
|
33
|
+
end
|
34
|
+
|
35
|
+
standard_rake_options.each { |args| opts.on(*args) }
|
36
|
+
opts.environment("RAKEOPT")
|
37
|
+
end.parse!
|
38
|
+
end
|
39
|
+
|
40
|
+
def sort_options(options)
|
41
|
+
not_applicable_to_capistrano = %w(verbose execute execute-continue libdir no-search rakefile rakelibdir require system no-system where no-deprecation-warnings)
|
42
|
+
|
43
|
+
options.reject! do |(switch, *)|
|
44
|
+
switch =~ /--#{Regexp.union(not_applicable_to_capistrano)}/
|
45
|
+
end
|
46
|
+
|
47
|
+
super.push(version, clean)
|
48
|
+
end
|
49
|
+
|
25
50
|
def top_level_tasks
|
26
51
|
unless File.exists?("Magicafile")
|
27
52
|
@top_level_tasks.unshift(warning_not_init.to_s) unless default_tasks.include?(@top_level_tasks.first)
|
@@ -44,5 +69,22 @@ module Magica
|
|
44
69
|
def default_tasks
|
45
70
|
%{init}
|
46
71
|
end
|
72
|
+
|
73
|
+
def version
|
74
|
+
["--version", "-V",
|
75
|
+
"Display the program version.",
|
76
|
+
lambda do |_value|
|
77
|
+
puts "Magica Version: #{Magica::VERSION} (Rake Version: #{Rake::VERSION})"
|
78
|
+
exit
|
79
|
+
end]
|
80
|
+
end
|
81
|
+
|
82
|
+
def clean
|
83
|
+
["--clean", nil,
|
84
|
+
"Clean all files before build",
|
85
|
+
lambda do |_value|
|
86
|
+
options.clean = true
|
87
|
+
end]
|
88
|
+
end
|
47
89
|
end
|
48
90
|
end
|
data/lib/magica/build.rb
CHANGED
@@ -4,3 +4,148 @@ require "magica/framework"
|
|
4
4
|
|
5
5
|
load File.expand_path("../tasks/build.rake", __FILE__)
|
6
6
|
|
7
|
+
module Magica
|
8
|
+
class Build
|
9
|
+
class << self
|
10
|
+
attr_accessor :current
|
11
|
+
end
|
12
|
+
|
13
|
+
include Rake::DSL
|
14
|
+
|
15
|
+
COMPILERS = %w(cxx)
|
16
|
+
COMMANDS = COMPILERS + %w(linker)
|
17
|
+
|
18
|
+
attr_block COMMANDS
|
19
|
+
|
20
|
+
def initialize(name = 'host', options = {dest: 'build'}, &block)
|
21
|
+
@name = name.to_s
|
22
|
+
@dest = (options[:dest] || 'build').to_s
|
23
|
+
@sources = FileList["src/**/*.cpp"]
|
24
|
+
@options = OpenStruct.new(options.merge(Rake.application.options.to_h))
|
25
|
+
|
26
|
+
@exe_name = @name
|
27
|
+
@exe_path = "bin"
|
28
|
+
|
29
|
+
@cxx = Command::Compiler.new(self, %w(.cpp))
|
30
|
+
@linker = Command::Linker.new(self)
|
31
|
+
|
32
|
+
@defines = %w()
|
33
|
+
@include_paths = %w()
|
34
|
+
@libaries = %w()
|
35
|
+
@libary_paths = %w()
|
36
|
+
@flags = %w()
|
37
|
+
|
38
|
+
Magica.targets[@name] = self
|
39
|
+
Magica.targets[@name].instance_eval(&block) unless block.nil?
|
40
|
+
Magica.targets[@name].instance_exec(@options, &Magica.default_compile_task)
|
41
|
+
|
42
|
+
Magica.default_toolchain.setup(self, Magica.toolchain_params) if Magica.default_toolchain
|
43
|
+
end
|
44
|
+
|
45
|
+
def define(name)
|
46
|
+
@defines << name.to_s.upcase
|
47
|
+
end
|
48
|
+
|
49
|
+
def include_path(path)
|
50
|
+
@include_paths << path.to_s
|
51
|
+
end
|
52
|
+
|
53
|
+
def flag(flag)
|
54
|
+
@flags << flag.to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
def library(name, path)
|
58
|
+
@libaries << name.to_s
|
59
|
+
@libary_paths << path.to_s
|
60
|
+
end
|
61
|
+
|
62
|
+
def dynamic_library(name)
|
63
|
+
config = PackageConfig[name]
|
64
|
+
@libaries.push(*config.libaries)
|
65
|
+
@libary_paths.push(*config.libary_paths)
|
66
|
+
@include_paths.push(*config.include_paths)
|
67
|
+
@defines.push(*config.defines)
|
68
|
+
@flags.push(*config.flags)
|
69
|
+
end
|
70
|
+
|
71
|
+
def source(path)
|
72
|
+
@sources = FileList[path]
|
73
|
+
end
|
74
|
+
|
75
|
+
def dest(path)
|
76
|
+
@dest = path.to_s
|
77
|
+
end
|
78
|
+
|
79
|
+
def filename(name)
|
80
|
+
'"%s"' % name
|
81
|
+
end
|
82
|
+
|
83
|
+
def exe_path(path)
|
84
|
+
@exe_path = path.to_s
|
85
|
+
end
|
86
|
+
|
87
|
+
def exe_name(name)
|
88
|
+
@exe_name = name.to_s
|
89
|
+
end
|
90
|
+
|
91
|
+
def exefile(name = nil)
|
92
|
+
return exefile(@exe_name) if name.nil?
|
93
|
+
if name.is_a?(Array)
|
94
|
+
name.flatten.map { |n| exefile(n) }
|
95
|
+
else
|
96
|
+
File.join(*[Magica.root, @exe_path, "#{name}"].flatten.reject(&:empty?))
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def libfile
|
101
|
+
end
|
102
|
+
|
103
|
+
def objfile(name)
|
104
|
+
if name.is_a?(Array)
|
105
|
+
name.flatten.map { |n| objfile(n) }
|
106
|
+
else
|
107
|
+
File.join(*[Magica.root, @dest, "#{name}.o"].flatten.reject(&:empty?))
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def clear_dest
|
112
|
+
path = File.join(*[Magica.root, @dest].flatten.reject(&:empty?))
|
113
|
+
FileUtils.rm_r(path, force: true)
|
114
|
+
end
|
115
|
+
|
116
|
+
def clear_exe
|
117
|
+
path = File.join(*[Magica.root, @exe_path].flatten.reject(&:empty?))
|
118
|
+
FileUtils.rm_r(path, force: true)
|
119
|
+
end
|
120
|
+
|
121
|
+
def clean
|
122
|
+
clear_dest
|
123
|
+
clear_exe
|
124
|
+
end
|
125
|
+
|
126
|
+
def toolchain(name, params = {})
|
127
|
+
toolchain = Toolchain.toolchains[name]
|
128
|
+
fail I18n.t("magica.unknow_toolchain", toolchain: name) unless toolchain
|
129
|
+
toolchain.setup(self, params)
|
130
|
+
end
|
131
|
+
|
132
|
+
def compile(source)
|
133
|
+
file objfile(source) => source do |t|
|
134
|
+
Build.current = Magica.targets[@name]
|
135
|
+
@cxx.run t.name, t.prerequisites.first, @defines, @include_paths, @flags
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def link(exec, objects)
|
140
|
+
desc "Build target #{@name}'s executable file"
|
141
|
+
task "build:#{@name}" => objects do
|
142
|
+
Build.current = Magica.targets[@name]
|
143
|
+
@linker.run "#{exec}", objects, @libaries, @libary_paths, @flags
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def build_task(&block)
|
148
|
+
Magica.targets[@name].instance_eval(@options, &block)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
@@ -19,7 +19,7 @@ module Magica
|
|
19
19
|
def combine_flags(_defines = [], _include_paths = [], _flags = [])
|
20
20
|
define_flags = [@defines, _defines].flatten.map { |define| @option_defines % define }
|
21
21
|
include_path_flags = [@include_paths, _include_paths].flatten.map { |include_path| @option_include_path % filename(include_path) }
|
22
|
-
[define_flags, include_path_flags, _flags].flatten.join(' ')
|
22
|
+
[define_flags, include_path_flags, _flags].flatten.uniq.join(' ')
|
23
23
|
end
|
24
24
|
|
25
25
|
def run(outfile, infile, _defines = [], _include_paths = [], _flags = [])
|
@@ -17,16 +17,18 @@ module Magica
|
|
17
17
|
|
18
18
|
def combine_flags(_library_paths = [], _flags = [])
|
19
19
|
libary_paths = [@libary_paths, _library_paths].flatten.map { |path| @option_libary_path % filename(path) }
|
20
|
-
[flags, libary_paths, _flags].flatten.join(" ")
|
20
|
+
[flags, libary_paths, _flags].flatten.uniq.join(" ")
|
21
21
|
end
|
22
22
|
|
23
23
|
def run(outfile, objects, _libaries = [], _library_paths = [], _flags = [])
|
24
|
+
FileUtils.mkdir_p File.dirname(outfile)
|
25
|
+
|
24
26
|
libary_flags = [@libaries, _libaries].flatten.map { |library| @option_libary % library }
|
25
27
|
|
26
28
|
_run @link_options, {
|
27
29
|
outfile: outfile,
|
28
30
|
objects: objects.join(" "),
|
29
|
-
libs: libary_flags.join(" "),
|
31
|
+
libs: libary_flags.uniq.join(" "),
|
30
32
|
flags: combine_flags(_library_paths, _flags)
|
31
33
|
}
|
32
34
|
end
|
data/lib/magica/dsl.rb
CHANGED
@@ -7,15 +7,12 @@ module Magica
|
|
7
7
|
Magica.toolchain_params = params
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
|
10
|
+
def build(name = 'host', options = {dest: 'build'}, &block)
|
11
|
+
Build.new(name, options, &block)
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
|
16
|
-
fail I18n.t("magica.unknow_build", build: name) unless builder
|
17
|
-
block = Magica.default_compile_task if block.nil?
|
18
|
-
builder.instance_exec(options, &block)
|
14
|
+
def exefile(name = nil)
|
15
|
+
Build.current.exefile(name)
|
19
16
|
end
|
20
17
|
end
|
21
18
|
end
|
data/lib/magica/magica.rb
CHANGED
@@ -13,14 +13,18 @@ module Magica
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
def root
|
17
|
+
Dir.pwd
|
18
|
+
end
|
19
|
+
|
16
20
|
def default_compile_task
|
17
21
|
proc { |options|
|
18
|
-
|
22
|
+
clean if options[:clean]
|
19
23
|
|
20
24
|
objects = objfile(@sources)
|
21
25
|
@sources.each { |source| compile source }
|
22
26
|
|
23
|
-
link exefile
|
27
|
+
link exefile, objects
|
24
28
|
}
|
25
29
|
end
|
26
30
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Magica
|
2
|
+
class PackageConfig
|
3
|
+
class << self
|
4
|
+
def [](name)
|
5
|
+
@packages ||= {}
|
6
|
+
config = @packages[name.to_s]
|
7
|
+
config = @packages[name.to_s] = PackageConfig.new(name) if config.nil?
|
8
|
+
config
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
LIBARY_PATH_RULE = /-L([^\s]+)/
|
13
|
+
LIBARY_RULE = /-l([^\s]+)/
|
14
|
+
LIBARY_FLAG_RULE = /-[^lL][^\s]+/
|
15
|
+
INCLUDE_RULE = /-I([^\s]+)/
|
16
|
+
DEFINE_RULE = /-D([^\s]+)/
|
17
|
+
FLAG_RULE = /-[^ID][^\s]+/
|
18
|
+
|
19
|
+
attr_reader :libary_paths, :libaries, :libary_flags, :include_paths, :defines, :flags
|
20
|
+
|
21
|
+
def initialize(name)
|
22
|
+
fail "Cannot found library #{name}" unless system "pkg-config --exists #{name}"
|
23
|
+
|
24
|
+
@package_libaries = `pkg-config --libs #{name}`.strip
|
25
|
+
|
26
|
+
@libary_paths = @package_libaries.scan(LIBARY_PATH_RULE).flatten
|
27
|
+
@libaries = @package_libaries.scan(LIBARY_RULE).flatten
|
28
|
+
@libary_flags = @package_libaries.scan(LIBARY_FLAG_RULE).flatten
|
29
|
+
|
30
|
+
@package_cflags = `pkg-config --cflags #{name}`.strip
|
31
|
+
@include_paths = @package_cflags.scan(INCLUDE_RULE).flatten
|
32
|
+
@defines = @package_cflags.scan(DEFINE_RULE).flatten
|
33
|
+
@flags = @package_cflags.scan(FLAG_RULE).flatten
|
34
|
+
|
35
|
+
@version = `pkg-config --modversion #{name}`.strip
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -3,13 +3,15 @@ require "magica/build"
|
|
3
3
|
# Define default toolchain
|
4
4
|
# toolchain :gcc
|
5
5
|
|
6
|
-
# Define
|
7
|
-
|
8
|
-
|
9
|
-
#
|
10
|
-
|
6
|
+
# Define Build Task
|
7
|
+
# build :main, {clean: true}
|
8
|
+
build :main, {clean: true} do
|
9
|
+
# define :debug
|
10
|
+
# dynamic_library "sdl2"
|
11
|
+
end
|
11
12
|
|
12
13
|
task :run => "build:main" do
|
13
|
-
|
14
|
+
# Execute last build file
|
15
|
+
sh exefile
|
14
16
|
end
|
15
17
|
|
data/lib/magica/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: magica
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 蒼時弦也
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -86,7 +86,6 @@ files:
|
|
86
86
|
- lib/magica/all.rb
|
87
87
|
- lib/magica/application.rb
|
88
88
|
- lib/magica/build.rb
|
89
|
-
- lib/magica/builder.rb
|
90
89
|
- lib/magica/command.rb
|
91
90
|
- lib/magica/commands/compiler.rb
|
92
91
|
- lib/magica/commands/linker.rb
|
@@ -96,6 +95,7 @@ files:
|
|
96
95
|
- lib/magica/i18n.rb
|
97
96
|
- lib/magica/initialize.rb
|
98
97
|
- lib/magica/magica.rb
|
98
|
+
- lib/magica/package_config.rb
|
99
99
|
- lib/magica/tasks/build.rake
|
100
100
|
- lib/magica/tasks/framework.rake
|
101
101
|
- lib/magica/tasks/initialize.rake
|
data/lib/magica/builder.rb
DELETED
@@ -1,90 +0,0 @@
|
|
1
|
-
module Magica
|
2
|
-
class Builder
|
3
|
-
include Rake::DSL
|
4
|
-
|
5
|
-
COMPILERS = %w(cxx)
|
6
|
-
COMMANDS = COMPILERS + %w(linker)
|
7
|
-
|
8
|
-
attr_block COMMANDS
|
9
|
-
|
10
|
-
def initialize(name = 'host', dest = 'build', &block)
|
11
|
-
@name = name.to_s
|
12
|
-
@dest = dest.to_s
|
13
|
-
@sources = FileList["src/**/*.cpp"]
|
14
|
-
@cxx = Command::Compiler.new(self, %w(.cpp))
|
15
|
-
@linker = Command::Linker.new(self)
|
16
|
-
@defines = %w()
|
17
|
-
@include_paths = %w()
|
18
|
-
@libaries = %w()
|
19
|
-
@libary_paths = %w()
|
20
|
-
@flags = %w()
|
21
|
-
|
22
|
-
Magica.targets[@name] = self
|
23
|
-
Magica.targets[@name].instance_eval(&block) unless block.nil?
|
24
|
-
|
25
|
-
Magica.default_toolchain.setup(self, Magica.toolchain_params) if Magica.default_toolchain
|
26
|
-
end
|
27
|
-
|
28
|
-
def define(name)
|
29
|
-
@defines << name.to_s.upcase
|
30
|
-
end
|
31
|
-
|
32
|
-
def include_path(path)
|
33
|
-
@include_paths << path.to_s
|
34
|
-
end
|
35
|
-
|
36
|
-
def flag(flag)
|
37
|
-
@flags << flag.to_s
|
38
|
-
end
|
39
|
-
|
40
|
-
def library(name, path)
|
41
|
-
@libaries << name.to_s
|
42
|
-
@libary_paths << path.to_s
|
43
|
-
end
|
44
|
-
|
45
|
-
def source(path)
|
46
|
-
@sources = FileList[path]
|
47
|
-
end
|
48
|
-
|
49
|
-
def filename(name)
|
50
|
-
'"%s"' % name
|
51
|
-
end
|
52
|
-
|
53
|
-
def exefile(name)
|
54
|
-
if name.is_a?(Array)
|
55
|
-
name.flatten.map { |n| exefile(n) }
|
56
|
-
else
|
57
|
-
"#{name}"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def libfile
|
62
|
-
end
|
63
|
-
|
64
|
-
def objfile(name)
|
65
|
-
if name.is_a?(Array)
|
66
|
-
name.flatten.map { |n| objfile(n) }
|
67
|
-
else
|
68
|
-
"#{@dest}/#{name}.o"
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def toolchain(name, params = {})
|
73
|
-
toolchain = Toolchain.toolchains[name]
|
74
|
-
fail I18n.t("magica.unknow_toolchain", toolchain: name) unless toolchain
|
75
|
-
toolchain.setup(self, params)
|
76
|
-
end
|
77
|
-
|
78
|
-
def compile(source)
|
79
|
-
file objfile(source) => source do |t|
|
80
|
-
@cxx.run t.name, t.prerequisites.first, @defines, @include_paths, @flags
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def link(exec, objects)
|
85
|
-
task "build:#{@name}" => objects do
|
86
|
-
@linker.run "#{exec}", objects, @libaries, @libary_paths, @flags
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|