magica 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e2da1bed863df770f3cda733a7fd15f2ebbd2e14
4
- data.tar.gz: b5753f85c89bedf34cc8f277f8adc9445e3389e6
3
+ metadata.gz: 75b6c620691aaf5e3ae2ed6322042efdbac359d8
4
+ data.tar.gz: 3f3b4950ec4ace3c13794d018337f7a1d26df8c6
5
5
  SHA512:
6
- metadata.gz: c0c39a627e37f94cf9c0c321967964f836ad3d3e4add99df62bd2ab245752453a7cbf123f0deb2547b2c89beceb52d631a7de3966a2440a71e6deb5790b4f84d
7
- data.tar.gz: f710c1b786149e677b4c2440d96c2003f797ce1808d4e94b9e197472dd8576bb02ec0e1d74f0c08162f0c0ed5d5abf5c8be21add03b9d861d0137461ac54c214
6
+ metadata.gz: 41ccaa64898ac96fd5fb769afe53187db32afa579aaedd572fd243d13dd379f49f6ca82d5115af15313a485433ddf463a37752a6a20f21c3f273167fab5512a1
7
+ data.tar.gz: 9b3a47b548bb0ba211fa7851837954fba5cf95856d5aee8f82cd7b4a30bed136a48171022447f17c2fb14648b60d6f47f82969f1edaa3302b6a9b0714ee96195
data/lib/magica/all.rb CHANGED
@@ -6,10 +6,12 @@ require "magica/extension"
6
6
  require "magica/i18n"
7
7
  require "magica/dsl"
8
8
  require "magica/toolchain"
9
+ require "magica/dependency"
9
10
  require "magica/application"
10
11
 
11
12
  require "magica/command"
12
13
  require "magica/commands/compiler"
13
14
  require "magica/commands/linker"
15
+ require "magica/commands/git"
14
16
 
15
17
  require "magica/magica"
@@ -44,7 +44,7 @@ module Magica
44
44
  switch =~ /--#{Regexp.union(not_applicable_to_capistrano)}/
45
45
  end
46
46
 
47
- super.push(version, clean)
47
+ super.push(version, clean, clean_all)
48
48
  end
49
49
 
50
50
  def top_level_tasks
@@ -80,11 +80,20 @@ module Magica
80
80
  end
81
81
 
82
82
  def clean
83
- ["--clean", nil,
83
+ ["--clean", "-c",
84
84
  "Clean all files before build",
85
85
  lambda do |_value|
86
86
  options.clean = true
87
87
  end]
88
88
  end
89
+
90
+ def clean_all
91
+ ["--clean-all", '-C',
92
+ "Clean all files before build include dependency",
93
+ lambda do |_value|
94
+ options.clean = true
95
+ options.clean_all = true
96
+ end]
97
+ end
89
98
  end
90
99
  end
data/lib/magica/build.rb CHANGED
@@ -12,11 +12,14 @@ module Magica
12
12
 
13
13
  include Rake::DSL
14
14
 
15
- COMPILERS = %w(cxx)
16
- COMMANDS = COMPILERS + %w(linker)
15
+ COMPILERS = %w(cc cxx)
16
+ COMMANDS = COMPILERS + %w(linker git)
17
17
 
18
+ attr_reader :options
18
19
  attr_block COMMANDS
19
20
 
21
+ Exts = Struct.new(:object, :executable, :library)
22
+
20
23
  def initialize(name = 'host', options = {dest: 'build'}, &block)
21
24
  @name = name.to_s
22
25
  @dest = (options[:dest] || 'build').to_s
@@ -26,15 +29,25 @@ module Magica
26
29
  @exe_name = @name
27
30
  @exe_path = "bin"
28
31
 
32
+ @exts = Exts.new('.o', '', '.a')
33
+
34
+ @cc = Command::Compiler.new(self, %w(.c))
29
35
  @cxx = Command::Compiler.new(self, %w(.cpp))
30
36
  @linker = Command::Linker.new(self)
31
37
 
38
+ @compiler = @cc
39
+
40
+ @git = Command::Git.new(self)
41
+
32
42
  @defines = %w()
33
43
  @include_paths = %w()
34
44
  @libaries = %w()
35
45
  @libary_paths = %w()
36
46
  @flags = %w()
37
47
 
48
+ @dependencies = []
49
+ @static_libraries = []
50
+
38
51
  Magica.targets[@name] = self
39
52
  Magica.targets[@name].instance_eval(&block) unless block.nil?
40
53
  Magica.targets[@name].instance_exec(@options, &Magica.default_compile_task)
@@ -43,15 +56,30 @@ module Magica
43
56
  end
44
57
 
45
58
  def define(name)
46
- @defines << name.to_s.upcase
59
+ if name.is_a?(Array)
60
+ name.flatten.map { |n| define(n) }
61
+ else
62
+ @defines<< name.to_s.upcase
63
+ end
64
+ @defines
47
65
  end
48
66
 
49
67
  def include_path(path)
50
- @include_paths << path.to_s
68
+ if path.is_a?(Array)
69
+ path.flatten.map { |p| include_path(p) }
70
+ else
71
+ @include_paths << path.to_s
72
+ end
73
+ @include_paths
51
74
  end
52
75
 
53
76
  def flag(flag)
54
- @flags << flag.to_s
77
+ if flag.is_a?(Array)
78
+ flag.flatten.map { |f| flag(f) }
79
+ else
80
+ @flags << flag.to_s
81
+ end
82
+ @flags
55
83
  end
56
84
 
57
85
  def library(name, path)
@@ -63,9 +91,10 @@ module Magica
63
91
  config = PackageConfig[name]
64
92
  @libaries.push(*config.libaries)
65
93
  @libary_paths.push(*config.libary_paths)
66
- @include_paths.push(*config.include_paths)
67
- @defines.push(*config.defines)
68
- @flags.push(*config.flags)
94
+
95
+ include_path(config.include_paths)
96
+ define(config.defines)
97
+ flag(config.flags)
69
98
  end
70
99
 
71
100
  def source(path)
@@ -76,6 +105,21 @@ module Magica
76
105
  @dest = path.to_s
77
106
  end
78
107
 
108
+ def dependency(name, options = {}, &block)
109
+ Dependency.new(name, options, &block)
110
+ desc "The targets #{@name}'s dependency project : #{name}"
111
+ task "#{@name}:dependency:#{name}" do |t|
112
+ Dependency[name].build(self)
113
+ end
114
+ @dependencies << "#{@name}:dependency:#{name}"
115
+ @static_libraries.push(*Dependency[name].static_libraries)
116
+ end
117
+
118
+ def use(compiler)
119
+ return @compiler = self.send(compiler.to_s) if COMPILERS.include?(compiler.to_s)
120
+ @compiler = @cc
121
+ end
122
+
79
123
  def filename(name)
80
124
  '"%s"' % name
81
125
  end
@@ -89,11 +133,11 @@ module Magica
89
133
  end
90
134
 
91
135
  def exefile(name = nil)
92
- return exefile(@exe_name) if name.nil?
136
+ return exefile("#{@exe_name}#{@exts.executable}") if name.nil?
93
137
  if name.is_a?(Array)
94
138
  name.flatten.map { |n| exefile(n) }
95
139
  else
96
- File.join(*[Magica.root, @exe_path, "#{name}"].flatten.reject(&:empty?))
140
+ File.join(*[Magica.root, @exe_path, "#{name}#{@exts.executable}"].flatten.reject(&:empty?))
97
141
  end
98
142
  end
99
143
 
@@ -104,7 +148,7 @@ module Magica
104
148
  if name.is_a?(Array)
105
149
  name.flatten.map { |n| objfile(n) }
106
150
  else
107
- File.join(*[Magica.root, @dest, "#{name}.o"].flatten.reject(&:empty?))
151
+ File.join(*[Magica.root, @dest, "#{name}#{@exts.object}"].flatten.reject(&:empty?))
108
152
  end
109
153
  end
110
154
 
@@ -123,6 +167,10 @@ module Magica
123
167
  clear_exe
124
168
  end
125
169
 
170
+ def add(source)
171
+ FileUtils.cp(source, File.join(*[Magica.root, @dest].flatten.reject(&:empty?)))
172
+ end
173
+
126
174
  def toolchain(name, params = {})
127
175
  toolchain = Toolchain.toolchains[name]
128
176
  fail I18n.t("magica.unknow_toolchain", toolchain: name) unless toolchain
@@ -132,15 +180,15 @@ module Magica
132
180
  def compile(source)
133
181
  file objfile(source) => source do |t|
134
182
  Build.current = Magica.targets[@name]
135
- @cxx.run t.name, t.prerequisites.first, @defines, @include_paths, @flags
183
+ @compiler.run t.name, t.prerequisites.first, @defines, @include_paths, @flags
136
184
  end
137
185
  end
138
186
 
139
187
  def link(exec, objects)
140
188
  desc "Build target #{@name}'s executable file"
141
- task "build:#{@name}" => objects do
189
+ task "build:#{@name}" => @dependencies + objects do
142
190
  Build.current = Magica.targets[@name]
143
- @linker.run "#{exec}", objects, @libaries, @libary_paths, @flags
191
+ @linker.run "#{exec}", objects + @static_libraries, @libaries, @libary_paths, @flags
144
192
  end
145
193
  end
146
194
 
@@ -14,7 +14,7 @@ module Magica
14
14
 
15
15
  private
16
16
  def _run(options, params = {})
17
- sh command + ' ' + (options % params)
17
+ sh command + ' ' + (options % params), verbose: false
18
18
  end
19
19
 
20
20
  end
@@ -24,6 +24,7 @@ module Magica
24
24
 
25
25
  def run(outfile, infile, _defines = [], _include_paths = [], _flags = [])
26
26
  FileUtils.mkdir_p File.dirname(outfile)
27
+ puts "COMPILE\t#{outfile}"
27
28
  _run @compile_options, { outfile: outfile, infile: infile, flags: combine_flags(_defines, _include_paths, _flags) }
28
29
  end
29
30
  end
@@ -0,0 +1,45 @@
1
+ module Magica
2
+ class Command::Git < Command
3
+ attr_accessor :flags
4
+ attr_accessor :clone_options, :pull_options, :checkout_options
5
+
6
+ def initialize(build)
7
+ super
8
+
9
+ @command = "git"
10
+ @flags = %w[]
11
+ @clone_options = "clone %{flags} %{url} %{dir}"
12
+ @pull_options = "pull %{flags} %{remote} %{branch}"
13
+ @checkout_options = "checkout %{flags} %{checksum_hash}"
14
+ end
15
+
16
+ def clone(dir, url, _flags = [])
17
+ _run @clone_options % {
18
+ flags: [@flags, _flags].flatten.join(" "),
19
+ dir: filename(dir),
20
+ url: url
21
+ }
22
+ end
23
+
24
+ def pull(dir, remote = 'origin', branch = 'master')
25
+ workin dir do
26
+ _run @pull_options % {remote: remote, branch: branch, flags: @flags.join(" ")}
27
+ end
28
+ end
29
+
30
+ def checkout(dir, checksum_hash)
31
+ workin dir do
32
+ _run @checkout_options % {checksum_hash: checksum_hash, flags: @flags.join(" ")}
33
+ end
34
+ end
35
+
36
+ private
37
+ def workin(dir)
38
+ root = Dir.pwd
39
+ Dir.chdir dir
40
+ yield if block_given?
41
+ Dir.chdir root
42
+ end
43
+
44
+ end
45
+ end
@@ -25,6 +25,7 @@ module Magica
25
25
 
26
26
  libary_flags = [@libaries, _libaries].flatten.map { |library| @option_libary % library }
27
27
 
28
+ puts "LINK\t#{outfile}"
28
29
  _run @link_options, {
29
30
  outfile: outfile,
30
31
  objects: objects.join(" "),
@@ -0,0 +1,128 @@
1
+ module Magica
2
+ class Dependency
3
+ class << self
4
+ def [](name)
5
+ @dependencies ||= {}
6
+ @dependencies[name.to_s]
7
+ end
8
+
9
+ def []=(name, value)
10
+ @dependencies ||= {}
11
+ @dependencies[name.to_s] = value
12
+ end
13
+ end
14
+
15
+ include Rake::DSL
16
+
17
+ def initialize(name, options = {}, &block)
18
+
19
+ @name = name.to_s
20
+ @vcs = nil
21
+ @command = :git
22
+ @source = ""
23
+ @version = nil
24
+ @dir = "lib/#{@name}"
25
+ @install_dir = "#{@dir}/build"
26
+ @build_command = "make"
27
+ @environments = {}
28
+
29
+ @static_libraries = []
30
+
31
+ Dependency[name] = self
32
+ Dependency[name].instance_eval(&block)
33
+ end
34
+
35
+ def use(name)
36
+ @vcs = name.to_sym
37
+ end
38
+
39
+ def env(name, value)
40
+ @environments[name.to_s] = value
41
+ end
42
+
43
+ def source(_source)
44
+ @source = _source.to_s
45
+ end
46
+
47
+ def dir(_dir)
48
+ @dir = _dir.to_s
49
+ end
50
+
51
+ def install_dir(_dir)
52
+ @install_dir = _dir.to_s
53
+ end
54
+
55
+ def version(_version)
56
+ @version = _version.to_s
57
+ end
58
+
59
+ def command(_command)
60
+ @build_command = _command.to_s
61
+ end
62
+
63
+ def static_library(*name)
64
+ @static_libraries.push(*name.flatten)
65
+ end
66
+
67
+ def build(builder)
68
+ root = Dir.pwd
69
+
70
+ options = builder.send(:options)
71
+ clean if options[:clean_all]
72
+
73
+ return if !options[:clean_all] & File.exists?(@install_dir)
74
+
75
+ setup_environment
76
+
77
+ @vcs = builder.send(@command)
78
+ @vcs.flags = %w(--quiet)
79
+ clone
80
+
81
+ Dir.chdir source_dir
82
+ sh @build_command, verbose: false
83
+ Dir.chdir root
84
+ end
85
+
86
+ def static_libraries
87
+ @static_libraries.map do |library|
88
+ File.join(*[Magica.root, @install_dir, library].flatten.reject(&:empty?))
89
+ end
90
+ end
91
+
92
+ private
93
+ def clone
94
+ if Dir.exists?(source_dir)
95
+ puts "UPDATE DEPENDENCY\t#{@name}-#{@version}"
96
+ checkout if @version
97
+ pull
98
+ else
99
+ puts "DOWNLOAD DEPENDENCY\t#{@name}-#{@version}"
100
+ @vcs.clone(source_dir, @source)
101
+ checkout if @version
102
+ end
103
+ end
104
+
105
+ def checkout
106
+ @vcs.checkout(source_dir, @version)
107
+ end
108
+
109
+ def pull
110
+ @vcs.pull(source_dir, 'origin', @version)
111
+ end
112
+
113
+ def source_dir
114
+ File.join(Magica.root, @dir)
115
+ end
116
+
117
+ def setup_environment
118
+ @environments.each do |name, value|
119
+ ENV[name] = value
120
+ end
121
+ end
122
+
123
+ def clean
124
+ FileUtils.rm_r(@install_dir, force: true)
125
+ end
126
+
127
+ end
128
+ end
@@ -1,4 +1,16 @@
1
1
  Magica::Toolchain.new :gcc do |config, params|
2
- config.cxx.command = "g++"
3
- config.linker.command = "g++"
2
+ config.cc do |cc|
3
+ cc.command = ENV['CC'] || "gcc"
4
+ cc.flags = [ENV['CFLAGS'] || %w(-g -std=gnu99 -O3 -Wall -Werror-implicit-function-declaration -Wdeclaration-after-statement -Wwrite-strings)]
5
+ end
6
+
7
+ config.cxx do |cxx|
8
+ cxx.command = [ENV['CXX'] || "g++"]
9
+ cxx.flags = [ENV['CXXFLAGS'] || %w(-g -O3 -Wall -Werror-implicit-function-declaration)]
10
+ end
11
+
12
+ config.linker do |linker|
13
+ linker.command = ENV['LD'] || "gcc"
14
+ linker.flags = [ENV['LDFLAGS'] || %w()]
15
+ end
4
16
  end
@@ -1,3 +1,3 @@
1
1
  module Magica
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
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.3.0
4
+ version: 0.4.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-18 00:00:00.000000000 Z
11
+ date: 2016-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -88,7 +88,9 @@ files:
88
88
  - lib/magica/build.rb
89
89
  - lib/magica/command.rb
90
90
  - lib/magica/commands/compiler.rb
91
+ - lib/magica/commands/git.rb
91
92
  - lib/magica/commands/linker.rb
93
+ - lib/magica/dependency.rb
92
94
  - lib/magica/dsl.rb
93
95
  - lib/magica/extension.rb
94
96
  - lib/magica/framework.rb