magica 0.7.2 → 0.8.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: eb7b82405cd742dc627d9f13a6d6d06320ef3444
4
- data.tar.gz: be7f31fc4323449921753243b9540e773dbfa014
3
+ metadata.gz: 9648f787f745dd428414d6a0df22c41c5cc5c230
4
+ data.tar.gz: 5942123320392e91dca6b4dddef6cae2ac19b1f5
5
5
  SHA512:
6
- metadata.gz: bb478c78a41dc0153535736dc3996c24ac217df35937488a12fae4c142c4198e45bc5ff9a409ce5e5133c6ebd503f5e2e4a56a2fca0abe265244ddeed14753ff
7
- data.tar.gz: 7a0546aadf8c8852845f61bae792a9ce7ea7da7a78e2772bb8d936284f6645aa4ea84c3f2b395a46e93d3e347bbc496f712afed8ff12c1e7f654d97a9d8a902d
6
+ metadata.gz: 110f0160763ae847e2cad0c6a10c191d00bf456fc2a9a265160fe4d44e876bf1670c74827902813766e4b2e60bfb605d90d0745d64d3ab9daf87617928667981
7
+ data.tar.gz: e9e0031a46b037893bd71ef1e722af4e7c9f1a5119c337af99ed596b6105554ffc2190c9689598ae7c31eb7e987d8bcf45942b4f0a441c23ecef5323a7aba65b
data/bin/magica CHANGED
@@ -1,3 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- require "magica/all"
2
+ #
3
+ require 'magica'
4
+
3
5
  Magica::Application.new.run
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env magica
2
2
  include Magica::DSL
3
- require "magica/initialize"
3
+ require 'magica/initialize'
@@ -1,5 +1,37 @@
1
- require "magica/version"
1
+ require 'magica/version'
2
+ require 'magica/all'
2
3
 
4
+ # Magica
3
5
  module Magica
4
- # Your code goes here...
6
+ class << self
7
+ attr_accessor :default_toolchain, :toolchain_params
8
+
9
+ def builds
10
+ @builds ||= {}
11
+ end
12
+
13
+ def each_build(&block)
14
+ return to_enum(:each_build) if block.nil?
15
+ @builds.each do |_, build|
16
+ build.instance_eval(&block)
17
+ end
18
+ end
19
+
20
+ def root
21
+ Dir.pwd
22
+ end
23
+
24
+ def default_compile_task
25
+ proc { |options|
26
+ clean if options[:clean]
27
+
28
+ do_target(options[:target])
29
+
30
+ objects = objfile(@sources)
31
+ @sources.each { |source| compile source }
32
+
33
+ link exefile, objects
34
+ }
35
+ end
36
+ end
5
37
  end
@@ -1,17 +1,15 @@
1
- require "rake"
1
+ require 'rake'
2
2
 
3
- require "magica/version"
4
- require "magica/package_config"
5
- require "magica/extension"
6
- require "magica/i18n"
7
- require "magica/dsl"
8
- require "magica/toolchain"
9
- require "magica/dependency"
10
- require "magica/application"
3
+ require 'magica/version'
4
+ require 'magica/package_config'
5
+ require 'magica/extension'
6
+ require 'magica/i18n'
7
+ require 'magica/dsl'
8
+ require 'magica/toolchain'
9
+ require 'magica/dependency'
10
+ require 'magica/application'
11
11
 
12
- require "magica/command"
13
- require "magica/commands/compiler"
14
- require "magica/commands/linker"
15
- require "magica/commands/git"
16
-
17
- require "magica/magica"
12
+ require 'magica/command'
13
+ require 'magica/commands/compiler'
14
+ require 'magica/commands/linker'
15
+ require 'magica/commands/git'
@@ -1,11 +1,11 @@
1
1
  module Magica
2
+ # :nodoc:
2
3
  class Application < Rake::Application
3
-
4
4
  DEFAULT_MAGICAFILES = [
5
- "magicafile",
6
- "Magicafile",
7
- "magicafile.rb",
8
- "Magicafile.rb"
5
+ 'magicafile',
6
+ 'Magicafile',
7
+ 'magicafile.rb',
8
+ 'Magicafile.rb'
9
9
  ].freeze
10
10
 
11
11
  def initialize
@@ -14,7 +14,7 @@ module Magica
14
14
  end
15
15
 
16
16
  def name
17
- "magica"
17
+ 'magica'
18
18
  end
19
19
 
20
20
  def run
@@ -23,22 +23,24 @@ module Magica
23
23
  end
24
24
 
25
25
  def handle_options
26
- options.rakelib = ["rakelib"]
26
+ options.rakelib = ['rakelib']
27
27
  options.trace_output = $stderr
28
28
 
29
29
  OptionParser.new do |opts|
30
- opts.on_tail("-h", "--help", "-H", "Display this help message.") do
30
+ opts.on_tail('-h', '--help', '-H', 'Display this help message.') do
31
31
  puts opts
32
32
  exit
33
33
  end
34
34
 
35
35
  standard_rake_options.each { |args| opts.on(*args) }
36
- opts.environment("RAKEOPT")
36
+ opts.environment('RAKEOPT')
37
37
  end.parse!
38
38
  end
39
39
 
40
40
  def sort_options(options)
41
- not_applicable_to_magica = %w(verbose execute execute-continue libdir no-search rakefile rakelibdir require system no-system where no-deprecation-warnings)
41
+ # rubocop:disable Metrics/LineLength
42
+ not_applicable_to_magica = %w[verbose execute execute-continue libdir no-search rakefile rakelibdir require system no-system where no-deprecation-warnings]
43
+ # rubocop:enable Metrics/LineLEngth
42
44
 
43
45
  options.reject! do |(switch, *)|
44
46
  switch =~ /--#{Regexp.union(not_applicable_to_magica)}/
@@ -48,31 +50,32 @@ module Magica
48
50
  end
49
51
 
50
52
  def top_level_tasks
51
- unless File.exists?("Magicafile")
53
+ unless File.exist?('Magicafile')
52
54
  @top_level_tasks.unshift(warning_not_init.to_s) unless default_tasks.include?(@top_level_tasks.first)
53
55
  end
54
56
  @top_level_tasks
55
57
  end
56
58
 
57
59
  private
60
+
58
61
  def magicafile
59
- File.expand_path("../../Magicafile", __FILE__)
62
+ File.expand_path('../../Magicafile', __FILE__)
60
63
  end
61
64
 
62
65
  def warning_not_init
63
66
  Rake::Task.define_task(:warning_not_init) do
64
- puts I18n.t("not_init_project", scope: :magica)
67
+ puts I18n.t('not_init_project', scope: :magica)
65
68
  exit 1
66
69
  end
67
70
  end
68
71
 
69
72
  def default_tasks
70
- %{init}
73
+ %(init)
71
74
  end
72
75
 
73
76
  def version
74
- ["--version", "-V",
75
- "Display the program version.",
77
+ ['--version', '-V',
78
+ 'Display the program version.',
76
79
  lambda do |_value|
77
80
  puts "Magica Version: #{Magica::VERSION} (Rake Version: #{Rake::VERSION})"
78
81
  exit
@@ -80,16 +83,16 @@ module Magica
80
83
  end
81
84
 
82
85
  def clean
83
- ["--clean", "-c",
84
- "Clean all files before build",
86
+ ['--clean', '-c',
87
+ 'Clean all files before build',
85
88
  lambda do |_value|
86
89
  options.clean = true
87
90
  end]
88
91
  end
89
92
 
90
93
  def clean_all
91
- ["--clean-all", '-C',
92
- "Clean all files before build include dependency",
94
+ ['--clean-all', '-C',
95
+ 'Clean all files before build include dependency',
93
96
  lambda do |_value|
94
97
  options.clean = true
95
98
  options.clean_all = true
@@ -97,10 +100,10 @@ module Magica
97
100
  end
98
101
 
99
102
  def target
100
- ["--target", '-t TARGET',
101
- "Specify the build to use",
102
- lambda do |_value|
103
- options.target = _value
103
+ ['--target', '-t TARGET',
104
+ 'Specify the build to use',
105
+ lambda do |value|
106
+ options.target = value
104
107
  end]
105
108
  end
106
109
  end
@@ -1,10 +1,12 @@
1
1
  include Magica::DSL
2
2
 
3
- require "magica/framework"
4
-
5
- load File.expand_path("../tasks/build.rake", __FILE__)
3
+ require 'magica/framework'
6
4
 
5
+ # rubocop:disable Metrics/ClassLength
6
+ # rubocop:disable Metrics/LineLength
7
+ # rubocop:disable Metrics/MethodLength
7
8
  module Magica
9
+ # :nodoc:
8
10
  class Build
9
11
  class << self
10
12
  attr_accessor :current
@@ -12,41 +14,42 @@ module Magica
12
14
 
13
15
  include Rake::DSL
14
16
 
15
- COMPILERS = %w(cc cxx)
16
- COMMANDS = COMPILERS + %w(linker git)
17
+ COMPILERS = %w[cc cxx].freeze
18
+ COMMANDS = COMPILERS + %w[linker git]
17
19
 
18
- attr_reader :options, :defines, :include_paths, :flags
20
+ attr_reader :sources, :options, :defines, :include_paths, :flags
19
21
  attr_block COMMANDS
20
22
 
21
23
  Exts = Struct.new(:object, :executable, :library)
22
24
 
23
- def initialize(name = 'host', options = {dest: 'build'}, &block)
25
+ # rubocop:disable Metrics/AbcSize
26
+ def initialize(name = 'host', options = { dest: 'build' }, &block)
24
27
  @name = name.to_s
25
28
  @dest = (options[:dest] || 'build').to_s
26
- @sources = FileList["src/**/*.cpp"]
29
+ @sources = FileList['src/**/*.cpp']
27
30
  @options = OpenStruct.new(options.merge(Rake.application.options.to_h))
28
31
  @default_target = nil
29
32
  @config_block = block
30
33
  @targets = {}
31
34
 
32
35
  @exe_name = @name
33
- @exe_path = "bin"
36
+ @exe_path = 'bin'
34
37
 
35
38
  @exts = Exts.new('.o', '', '.a')
36
39
 
37
- @cc = Command::Compiler.new(self, %w(.c))
38
- @cxx = Command::Compiler.new(self, %w(.cpp))
40
+ @cc = Command::Compiler.new(self, %w[.c])
41
+ @cxx = Command::Compiler.new(self, %w[.cpp])
39
42
  @linker = Command::Linker.new(self)
40
43
 
41
44
  @compiler = @cc
42
45
 
43
46
  @git = Command::Git.new(self)
44
47
 
45
- @defines = %w()
46
- @include_paths = %w()
47
- @libraries = %w()
48
- @library_paths = %w()
49
- @flags = %w()
48
+ @defines = %w[]
49
+ @include_paths = %w[]
50
+ @libraries = %w[]
51
+ @library_paths = %w[]
52
+ @flags = %w[]
50
53
 
51
54
  @dependencies = []
52
55
  @static_libraries = []
@@ -57,32 +60,35 @@ module Magica
57
60
 
58
61
  Magica.default_toolchain.setup(self, Magica.toolchain_params) if Magica.default_toolchain
59
62
  end
63
+ # rubocop:enable Metrics/AbcSize
60
64
 
61
65
  def target(name, **options, &block)
62
66
  return if block.nil?
63
67
  name = name.to_sym
64
68
  @targets[name] = block
65
69
  @default_target = name if options[:default]
66
- Target.new("#{@name}:#{name}", @options.to_h.merge({target: name}), &@config_block) if Magica.const_defined?("Target")
70
+ Target.new("#{@name}:#{name}", @options.to_h.merge(target: name), &@config_block) if Magica.const_defined?('Target')
67
71
  end
68
72
 
69
73
  def define(name, value = nil)
70
74
  if name.is_a?(Array)
71
75
  name.flatten.map { |n| define(n, value) }
72
76
  else
73
- _define = name.to_s.upcase
74
- value = '\"%{value}\"' % {value: value} unless value.is_a?(Numeric)
75
- _define << "=#{value}" unless value.nil?
76
- @defines << _define
77
+ define_name = name.to_s.upcase
78
+ unless value.nil? || value.is_a?(Numeric)
79
+ value = format('\"%s\"', value)
80
+ end
81
+ define_name << "=#{value}" unless value.nil?
82
+ @defines.push(define_name)
77
83
  end
78
- @defines
84
+ @defines.uniq!
79
85
  end
80
86
 
81
87
  def include_path(path)
82
88
  if path.is_a?(Array)
83
- path.flatten.map { |p| include_path(p) }
89
+ path.flatten.map { |p| include_path(p) }
84
90
  else
85
- @include_paths << path.to_s
91
+ @include_paths.push(path.to_s)
86
92
  end
87
93
  @include_paths
88
94
  end
@@ -91,24 +97,24 @@ module Magica
91
97
  if flag.is_a?(Array)
92
98
  flag.flatten.map { |f| flag(f) }
93
99
  else
94
- @flags << flag.to_s
100
+ @flags.push(flag.to_s)
95
101
  end
96
102
  @flags
97
103
  end
98
104
 
99
105
  def library(name, path = nil)
100
- @libraries << name.to_s
101
- @library_paths << path.to_s if path
106
+ @libraries.push(name.to_s).uniq!
107
+ @library_paths.push(path.to_s).uniq! if path
102
108
  end
103
109
 
104
110
  def library_path(path)
105
- @library_path << path.to_s
111
+ @library_paths.push(path.to_s).uniq!
106
112
  end
107
113
 
108
114
  def dynamic_library(name)
109
115
  config = PackageConfig[name]
110
- @libraries.push(*config.libraries)
111
- @library_paths.push(*config.library_paths)
116
+ @libraries.push(*config.libraries).uniq!
117
+ @library_paths.push(*config.library_paths).uniq!
112
118
 
113
119
  include_path(config.include_paths)
114
120
  define(config.defines)
@@ -133,9 +139,9 @@ module Magica
133
139
  end
134
140
 
135
141
  def dependency(name, options = {}, &block)
136
- Dependency.new(name, options, &block)
142
+ Dependency.new(self, name, options, &block)
137
143
  desc "The targets #{@name}'s dependency project : #{name}"
138
- task "#{@name}:dependency:#{name}" do |t|
144
+ task "#{@name}:dependency:#{name}" do
139
145
  Dependency[name].build(self)
140
146
  end
141
147
  @dependencies << "#{@name}:dependency:#{name}"
@@ -143,12 +149,12 @@ module Magica
143
149
  end
144
150
 
145
151
  def use(compiler)
146
- return @compiler = self.send(compiler.to_s) if COMPILERS.include?(compiler.to_s)
152
+ return @compiler = send(compiler.to_s) if COMPILERS.include?(compiler.to_s)
147
153
  @compiler = @cc
148
154
  end
149
155
 
150
156
  def filename(name)
151
- '"%s"' % name
157
+ format('"%s"', name)
152
158
  end
153
159
 
154
160
  def exe_path(path)
@@ -164,18 +170,21 @@ module Magica
164
170
  if name.is_a?(Array)
165
171
  name.flatten.map { |n| exefile(n) }
166
172
  else
167
- File.join(*[Magica.root, @exe_path, "#{name}#{@exts.executable}"].flatten.reject(&:empty?))
173
+ File.join(
174
+ *[Magica.root, @exe_path, "#{name}#{@exts.executable}"]
175
+ .flatten.reject(&:empty?)
176
+ )
168
177
  end
169
178
  end
170
179
 
171
- def libfile
172
- end
173
-
174
180
  def objfile(name)
175
181
  if name.is_a?(Array)
176
182
  name.flatten.map { |n| objfile(n) }
177
183
  else
178
- File.join(*[Magica.root, @dest, "#{name}#{@exts.object}"].flatten.reject(&:empty?))
184
+ File.join(
185
+ *[Magica.root, @dest, "#{name}#{@exts.object}"]
186
+ .flatten.reject(&:empty?)
187
+ )
179
188
  end
180
189
  end
181
190
 
@@ -195,28 +204,43 @@ module Magica
195
204
  end
196
205
 
197
206
  def add(source)
198
- FileUtils.cp(source, File.join(*[Magica.root, @dest].flatten.reject(&:empty?)))
207
+ FileUtils.cp(
208
+ source,
209
+ File.join(*[Magica.root, @dest].flatten.reject(&:empty?))
210
+ )
199
211
  end
200
212
 
201
213
  def toolchain(name, params = {})
202
214
  toolchain = Toolchain.toolchains[name]
203
- fail I18n.t("magica.unknow_toolchain", toolchain: name) unless toolchain
215
+ raise I18n.t('magica.unknow_toolchain', toolchain: name) unless toolchain
204
216
  toolchain.setup(self, params)
205
217
  end
206
218
 
207
219
  def compile(source)
208
220
  return if Rake::Task.task_defined?(objfile(source))
209
221
  file objfile(source) => source do |t|
210
- @compiler.run t.name, t.prerequisites.first, Build.current.defines, Build.current.include_paths, Build.current.flags
222
+ @compiler.run(
223
+ t.name,
224
+ t.prerequisites.first,
225
+ Build.current.defines,
226
+ Build.current.include_paths,
227
+ Build.current.flags
228
+ )
211
229
  end
212
230
  end
213
231
 
214
232
  def link(exec, objects)
215
233
  desc "Build #{@name}'s executable file"
216
- task "#{@name}" do
234
+ task @name.to_s do
217
235
  Build.current = Magica.builds[@name]
218
236
  task "#{@name}:build" => @dependencies + objects do
219
- @linker.run "#{exec}", objects + @static_libraries, @libraries, @library_paths, @flags
237
+ @linker.run(
238
+ exec.to_s,
239
+ objects + @static_libraries,
240
+ @libraries,
241
+ @library_paths,
242
+ @flags
243
+ )
220
244
  end.invoke
221
245
  end
222
246
  end
@@ -1,6 +1,7 @@
1
1
  require 'forwardable'
2
2
 
3
3
  module Magica
4
+ # :nodoc:
4
5
  class Command
5
6
  include Rake::DSL
6
7
  extend Forwardable
@@ -13,9 +14,9 @@ module Magica
13
14
  end
14
15
 
15
16
  private
17
+
16
18
  def _run(options, params = {})
17
19
  sh command + ' ' + (options % params), verbose: false
18
20
  end
19
-
20
21
  end
21
22
  end
@@ -1,31 +1,44 @@
1
1
  module Magica
2
- class Command::Compiler < Command
3
- attr_accessor :flags
2
+ # rubocop:disable Style/FormatStringToken
3
+ class Command
4
+ # :nodoc:
5
+ class Compiler < Command
6
+ attr_accessor :flags
4
7
 
5
- def initialize(build, source_exts = [])
6
- super(build)
8
+ def initialize(build, source_exts = [])
9
+ super(build)
7
10
 
8
- @command = ENV['CC'] || 'cc'
9
- @flags = [ENV['CFLAGS'] || []]
10
- @source_exts = source_exts
11
- @compile_options = "%{flags} -o %{outfile} -c %{infile}"
12
- @include_paths = ["include"]
13
- @defines = %w()
11
+ @command = ENV['CC'] || 'cc'
12
+ @flags = [ENV['CFLAGS'] || []]
13
+ @source_exts = source_exts
14
+ @compile_options = '%{flags} -o %{outfile} -c %{infile}'
15
+ @include_paths = ['include']
16
+ @defines = %w[]
14
17
 
15
- @option_include_path = "-I%s"
16
- @option_defines = "-D%s"
17
- end
18
+ @option_include_path = '-I%s'
19
+ @option_defines = '-D%s'
20
+ end
18
21
 
19
- def combine_flags(_defines = [], _include_paths = [], _flags = [])
20
- define_flags = [@defines, _defines].flatten.map { |define| @option_defines % define }
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.uniq.join(' ')
23
- end
22
+ def combine_flags(defines = [], include_paths = [], flags = [])
23
+ define_flags = [
24
+ @defines, defines
25
+ ].flatten.map { |define| @option_defines % define }
26
+ include_path_flags = [
27
+ @include_paths, include_paths
28
+ ].flatten.map do |include_path|
29
+ @option_include_path % filename(include_path)
30
+ end
31
+ [define_flags, include_path_flags, flags].flatten.uniq.join(' ')
32
+ end
24
33
 
25
- def run(outfile, infile, _defines = [], _include_paths = [], _flags = [])
26
- FileUtils.mkdir_p File.dirname(outfile)
27
- puts "COMPILE\t#{outfile}"
28
- _run @compile_options, { outfile: outfile, infile: infile, flags: combine_flags(_defines, _include_paths, _flags) }
34
+ def run(outfile, infile, defines = [], include_paths = [], flags = [])
35
+ FileUtils.mkdir_p File.dirname(outfile)
36
+ puts "COMPILE\t#{outfile}"
37
+ _run(@compile_options,
38
+ outfile: outfile,
39
+ infile: infile,
40
+ flags: combine_flags(defines, include_paths, flags))
41
+ end
29
42
  end
30
43
  end
31
44
  end
@@ -1,45 +1,53 @@
1
1
  module Magica
2
- class Command::Git < Command
3
- attr_accessor :flags
4
- attr_accessor :clone_options, :pull_options, :checkout_options
2
+ # rubocop:disable Style/FormatStringToken
3
+ class Command
4
+ # :nodoc:
5
+ class Git < Command
6
+ attr_accessor :flags
7
+ attr_accessor :clone_options, :pull_options, :checkout_options
5
8
 
6
- def initialize(build)
7
- super
9
+ def initialize(build)
10
+ super
8
11
 
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
12
+ @command = 'git'
13
+ @flags = %w[]
14
+ @clone_options = 'clone %{flags} %{url} %{dir}'
15
+ @pull_options = 'pull %{flags} %{remote} %{branch}'
16
+ @checkout_options = 'checkout %{flags} %{checksum_hash}'
17
+ end
15
18
 
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
19
+ def clone(dir, url, flags = [])
20
+ _run format(@clone_options,
21
+ flags: [@flags, flags].flatten.join(' '),
22
+ dir: filename(dir),
23
+ url: url)
24
+ end
23
25
 
24
- def pull(dir, remote = 'origin', branch = 'master')
25
- workin dir do
26
- _run @pull_options % {remote: remote, branch: branch, flags: @flags.join(" ")}
26
+ def pull(dir, remote = 'origin', branch = 'master')
27
+ workin dir do
28
+ _run format(@pull_options,
29
+ remote: remote,
30
+ branch: branch,
31
+ flags: @flags.join(' '))
32
+ end
27
33
  end
28
- end
29
34
 
30
- def checkout(dir, checksum_hash)
31
- workin dir do
32
- _run @checkout_options % {checksum_hash: checksum_hash, flags: @flags.join(" ")}
35
+ def checkout(dir, checksum_hash)
36
+ workin dir do
37
+ _run format(@checkout_options,
38
+ checksum_hash: checksum_hash,
39
+ flags: @flags.join(' '))
40
+ end
33
41
  end
34
- end
35
42
 
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
+ private
43
44
 
45
+ def workin(dir)
46
+ root = Dir.pwd
47
+ Dir.chdir dir
48
+ yield if block_given?
49
+ Dir.chdir root
50
+ end
51
+ end
44
52
  end
45
53
  end
@@ -1,37 +1,44 @@
1
1
  module Magica
2
- class Command::Linker < Command
3
- attr_accessor :flags
2
+ # rubocop:disable Style/FormatStringToken
3
+ class Command
4
+ # :nodoc:
5
+ class Linker < Command
6
+ attr_accessor :flags
4
7
 
5
- def initialize(build)
6
- super
8
+ def initialize(build)
9
+ super
7
10
 
8
- @command = ENV['LD'] || 'ld'
9
- @flags = (ENV['LDFLAGS'] || [])
10
- @link_options = "%{flags} -o %{outfile} %{objects} %{libs}"
11
- @libraries = []
12
- @library_paths = []
11
+ @command = ENV['LD'] || 'ld'
12
+ @flags = (ENV['LDFLAGS'] || [])
13
+ @link_options = '%{flags} -o %{outfile} %{objects} %{libs}'
14
+ @libraries = []
15
+ @library_paths = []
13
16
 
14
- @option_library = "-l%s"
15
- @option_library_path = "-L%s"
16
- end
17
+ @option_library = '-l%s'
18
+ @option_library_path = '-L%s'
19
+ end
17
20
 
18
- def combine_flags(_library_paths = [], _flags = [])
19
- library_paths = [@library_paths, _library_paths].flatten.map { |path| @option_library_path % filename(path) }
20
- [flags, library_paths, _flags].flatten.uniq.join(" ")
21
- end
21
+ def combine_flags(library_paths = [], flags = [])
22
+ library_paths = [
23
+ @library_paths, library_paths
24
+ ].flatten.map { |path| @option_library_path % filename(path) }
25
+ [flags, library_paths, flags].flatten.uniq.join(' ')
26
+ end
22
27
 
23
- def run(outfile, objects, _libraries = [], _library_paths = [], _flags = [])
24
- FileUtils.mkdir_p File.dirname(outfile)
28
+ def run(outfile, objects, libraries = [], library_paths = [], flags = [])
29
+ FileUtils.mkdir_p File.dirname(outfile)
25
30
 
26
- library_flags = [@libraries, _libraries].flatten.map { |library| @option_library % library }
31
+ library_flags = [
32
+ @libraries, libraries
33
+ ].flatten.map { |library| @option_library % library }
27
34
 
28
- puts "LINK\t#{outfile}"
29
- _run @link_options, {
30
- outfile: outfile,
31
- objects: objects.join(" "),
32
- libs: library_flags.uniq.join(" "),
33
- flags: combine_flags(_library_paths, _flags)
34
- }
35
+ puts "LINK\t#{outfile}"
36
+ _run(@link_options,
37
+ outfile: outfile,
38
+ objects: objects.join(' '),
39
+ libs: library_flags.uniq.join(' '),
40
+ flags: combine_flags(library_paths, flags))
41
+ end
35
42
  end
36
43
  end
37
44
  end
@@ -1,4 +1,6 @@
1
1
  module Magica
2
+ # :nodoc:
3
+ # rubocop:disable Metrics/ClassLength
2
4
  class Dependency
3
5
  class << self
4
6
  def [](name)
@@ -14,23 +16,27 @@ module Magica
14
16
 
15
17
  include Rake::DSL
16
18
 
17
- def initialize(name, options = {}, &block)
18
-
19
+ # rubocop:disable Metrics/MethodLength
20
+ def initialize(builder, name, _options = {}, &block)
21
+ @builder = builder
19
22
  @name = name.to_s
20
23
  @vcs = nil
21
24
  @command = :git
22
- @source = ""
25
+ @source = ''
23
26
  @version = nil
24
27
  @dir = "lib/#{@name}"
25
28
  @install_dir = "#{@dir}/build"
26
- @build_command = "make"
29
+ @build_command = 'make'
27
30
  @environments = {}
28
31
 
29
32
  @static_libraries = []
30
33
 
31
34
  Dependency[name] = self
32
35
  Dependency[name].instance_eval(&block)
36
+
37
+ add_header "#{@dir}/include" if Dir.exist?("#{@dir}/include")
33
38
  end
39
+ # rubocop:enable Metrics/MethodLength
34
40
 
35
41
  def use(name)
36
42
  @vcs = name.to_sym
@@ -40,24 +46,24 @@ module Magica
40
46
  @environments[name.to_s] = value
41
47
  end
42
48
 
43
- def source(_source)
44
- @source = _source.to_s
49
+ def source(source)
50
+ @source = source.to_s
45
51
  end
46
52
 
47
- def dir(_dir)
48
- @dir = _dir.to_s
53
+ def dir(dir)
54
+ @dir = dir.to_s
49
55
  end
50
56
 
51
- def install_dir(_dir)
52
- @install_dir = _dir.to_s
57
+ def install_dir(dir)
58
+ @install_dir = dir.to_s
53
59
  end
54
60
 
55
- def version(_version)
56
- @version = _version.to_s
61
+ def version(version)
62
+ @version = version.to_s
57
63
  end
58
64
 
59
- def command(_command)
60
- @build_command = _command.to_s
65
+ def command(command)
66
+ @build_command = command.to_s
61
67
  end
62
68
 
63
69
  def static_library(*name)
@@ -65,38 +71,57 @@ module Magica
65
71
  end
66
72
 
67
73
  def build(builder)
68
- root = Dir.pwd
74
+ clean if @builder.options[:clean_all]
69
75
 
70
- options = builder.send(:options)
71
- clean if options[:clean_all]
72
-
73
- return if !options[:clean_all] & File.exists?(@install_dir)
76
+ return unless exec?
74
77
 
75
78
  setup_environment
79
+ clone(builder)
80
+ exec
81
+ end
76
82
 
77
- @vcs = builder.send(@command)
78
- @vcs.flags = %w(--quiet)
79
- clone
83
+ def add_src(*paths)
84
+ @builder.source(@builder.sources + paths)
85
+ end
80
86
 
81
- Dir.chdir source_dir
82
- sh @build_command, verbose: false
83
- Dir.chdir root
87
+ def add_header(*paths)
88
+ @builder.include_path(paths)
84
89
  end
85
90
 
86
91
  def static_libraries
87
92
  @static_libraries.map do |library|
88
- File.join(*[Magica.root, @install_dir, library].flatten.reject(&:empty?))
93
+ File.join(*[
94
+ Magica.root, @install_dir, library
95
+ ].flatten.reject(&:empty?))
89
96
  end
90
97
  end
91
98
 
92
99
  private
93
- def clone
94
- if Dir.exists?(source_dir)
95
- puts "UPDATE DEPENDENCY\t#{@name}-#{@version}"
100
+
101
+ def exec?
102
+ clean_all = @builder.options[:clean_all]
103
+ return false if !clean_all & File.exist?(@install_dir)
104
+ return false if !clean_all & @build_command.empty? & File.exist?(@dir)
105
+ true
106
+ end
107
+
108
+ def exec
109
+ root = Dir.pwd
110
+ Dir.chdir source_dir
111
+ sh @build_command, verbose: false unless @build_command.empty?
112
+ Dir.chdir root
113
+ end
114
+
115
+ def clone(builder)
116
+ @vcs = builder.send(@command)
117
+ @vcs.flags = %w[--quiet]
118
+
119
+ puts "UPDATE DEPENDENCY\t #{[@name, @version].join(' ')}"
120
+
121
+ if Dir.exist?(source_dir)
96
122
  checkout if @version
97
123
  pull
98
124
  else
99
- puts "DOWNLOAD DEPENDENCY\t#{@name}-#{@version}"
100
125
  @vcs.clone(source_dir, @source)
101
126
  checkout if @version
102
127
  end
@@ -123,6 +148,5 @@ module Magica
123
148
  def clean
124
149
  FileUtils.rm_r(@install_dir, force: true)
125
150
  end
126
-
127
151
  end
128
152
  end
@@ -1,13 +1,14 @@
1
1
  module Magica
2
+ # :nodoc:
2
3
  module DSL
3
4
  def toolchain(name, params = {})
4
5
  toolchain = Toolchain.toolchains[name.to_s]
5
- fail I18n.t("magica.unknow_toolchain", toolchain: name) if toolchain.nil?
6
+ raise I18n.t('magica.unknow_toolchain', toolchain: name) if toolchain.nil?
6
7
  Magica.default_toolchain = toolchain
7
8
  Magica.toolchain_params = params
8
9
  end
9
10
 
10
- def build(name = 'host', options = {dest: 'build'}, &block)
11
+ def build(name = 'host', options = { dest: 'build' }, &block)
11
12
  Build.new(name, options, &block)
12
13
  end
13
14
 
@@ -1,5 +1,7 @@
1
+ # :nodoc:
1
2
  class Object
2
3
  class << self
4
+ # rubocop:disable Metrics/LineLength
3
5
  def attr_block(*syms)
4
6
  syms.flatten.each do |sym|
5
7
  class_eval "def #{sym}(&block); block.call(#{sym}) if block_given?; @#{sym}; end"
@@ -1,2 +1,2 @@
1
- load File.expand_path("../tasks/framework.rake", __FILE__)
2
- require "magica/initialize"
1
+ load File.expand_path('../tasks/framework.rake', __FILE__)
2
+ require 'magica/initialize'
@@ -1,10 +1,13 @@
1
1
  require 'i18n'
2
2
 
3
+ # rubocop:disable Metrics/LineLength
4
+ # rubocop:disable Style/FormatStringToken
3
5
  en = {
4
6
  not_init_project: 'The project is not initialize, please run "magica init" before start use it',
5
7
  unknow_toolchain: 'Unknow %{toolchain} toolchain',
6
8
  unknow_build: 'Unknow %{build} build'
7
9
  }
10
+ # rubocop:enable Metrics/LineLength
8
11
 
9
12
  I18n.backend.store_translations(:en, magica: en)
10
13
 
@@ -1 +1 @@
1
- load File.expand_path("../tasks/initialize.rake", __FILE__)
1
+ load File.expand_path('../tasks/initialize.rake', __FILE__)
@@ -1,4 +1,5 @@
1
1
  module Magica
2
+ # :nodoc:
2
3
  class PackageConfig
3
4
  class << self
4
5
  def [](name)
@@ -16,23 +17,45 @@ module Magica
16
17
  DEFINE_RULE = /-D([^\s]+)/
17
18
  FLAG_RULE = /-[^ID][^\s]+/
18
19
 
19
- attr_reader :library_paths, :libraries, :library_flags, :include_paths, :defines, :flags
20
+ attr_reader :library_paths, :libraries, :library_flags,
21
+ :include_paths, :defines, :flags, :version
20
22
 
21
23
  def initialize(name)
22
- fail "Cannot found library #{name}" unless system "pkg-config --exists #{name}"
24
+ raise "Cannot found library #{name}" unless package_exist?(name)
25
+ @name = name
23
26
 
24
- @package_libraries = `pkg-config --libs #{name}`.strip
27
+ @package_libraries = `pkg-config --libs #{@name}`.strip
28
+ @package_cflags = `pkg-config --cflags #{@name}`.strip
25
29
 
26
- @library_paths = @package_libraries.scan(LIBRARY_PATH_RULE).flatten
27
- @libraries = @package_libraries.scan(LIBRARY_RULE).flatten
28
- @library_flags = @package_libraries.scan(LIBRARY_FLAG_RULE).flatten
30
+ @version = `pkg-config --modversion #{@name}`.strip
31
+ end
32
+
33
+ def package_exist?(name)
34
+ system "pkg-config --exists #{name}"
35
+ end
36
+
37
+ def libraries
38
+ @libraries ||= @package_libraries.scan(LIBRARY_RULE).flatten
39
+ end
40
+
41
+ def library_flags
42
+ @library_flags ||= @package_libraries.scan(LIBRARY_FLAG_RULE).flatten
43
+ end
44
+
45
+ def library_paths
46
+ @library_paths ||= @package_libraries.scan(LIBRARY_PATH_RULE).flatten
47
+ end
29
48
 
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
49
+ def flags
50
+ @flags ||= @package_cflags.scan(FLAG_RULE).flatten
51
+ end
52
+
53
+ def defines
54
+ @defines ||= @package_cflags.scan(DEFINE_RULE).flatten
55
+ end
34
56
 
35
- @version = `pkg-config --modversion #{name}`.strip
57
+ def include_paths
58
+ @include_paths ||= @package_cflags.scan(INCLUDE_RULE).flatten
36
59
  end
37
60
  end
38
61
  end
@@ -1,8 +1,9 @@
1
1
  include Magica::DSL
2
2
 
3
- require "magica/framework"
3
+ require 'magica/framework'
4
4
 
5
5
  module Magica
6
+ # :nodoc:
6
7
  class Target < Build
7
8
  def target(name, **options, &block)
8
9
  return if block.nil?
@@ -13,7 +14,7 @@ module Magica
13
14
 
14
15
  def dependency(name, options = {}, &block)
15
16
  Dependency.new(name, options, &block)
16
- task "#{@name}:dependency:#{name}" do |t|
17
+ task "#{@name}:dependency:#{name}" do
17
18
  Dependency[name].build(self)
18
19
  end
19
20
  @dependencies << "#{@name}:dependency:#{name}"
@@ -1,17 +1,11 @@
1
1
  task default: :_all
2
2
 
3
- task :_all do |t|
3
+ task :_all do
4
4
  if Rake::Task.task_defined?(:all)
5
5
  Rake::Task[:all].invoke
6
6
  else
7
7
  Magica.each_build do
8
- Rake::Task["#{@name}"].invoke
8
+ Rake::Task[@name.to_s].invoke
9
9
  end
10
10
  end
11
11
  end
12
-
13
- task :environment do |t|
14
- p "ENV ===>"
15
- p Magica::Build.current
16
- t.reenable
17
- end
@@ -1,11 +1,11 @@
1
1
  task :init do
2
- magicafile = File.expand_path("../../templates/Magicafile", __FILE__)
2
+ magicafile = File.expand_path('../../templates/Magicafile', __FILE__)
3
3
 
4
- if File.exist?("Magicafile")
5
- warn "[Skip] Magica is already exists"
4
+ if File.exist?('Magicafile')
5
+ warn '[Skip] Magica is already exists'
6
6
  else
7
- FileUtils.cp(magicafile, "Magicafile")
7
+ FileUtils.cp(magicafile, 'Magicafile')
8
8
  puts "create\tMagicafile"
9
- puts "Magica Initialized"
9
+ puts "Magica\tInitialized"
10
10
  end
11
11
  end
@@ -5,7 +5,6 @@ require "magica/target"
5
5
  toolchain :gcc
6
6
 
7
7
  # Define Build Task
8
- # build :main, {clean: true}
9
8
  build :main, {clean: true} do
10
9
  # define :debug
11
10
  # dynamic_library "sdl2"
@@ -13,8 +12,9 @@ build :main, {clean: true} do
13
12
  # dependency :mruby do
14
13
  # source "git@github.com:mruby/mruby.git"
15
14
  # version "1.2.0"
16
- # command "./minirake -quiet"
15
+ # command "./minirake --quiet"
17
16
  #
17
+ # install_dir "#{@dir}/build/host/lib"
18
18
  # static_library "libmruby.a"
19
19
  # end
20
20
 
@@ -1,4 +1,6 @@
1
+ # :nodoc:
1
2
  module Magica
3
+ # :nodoc:
2
4
  class Toolchain
3
5
  include Rake::DSL
4
6
 
@@ -7,7 +9,8 @@ module Magica
7
9
  end
8
10
 
9
11
  def initialize(name, &block)
10
- @name, @initializer = name.to_s, block
12
+ @name = name.to_s
13
+ @initializer = block
11
14
  Toolchain.toolchains ||= {}
12
15
  Toolchain.toolchains[@name] = self
13
16
  end
@@ -17,7 +20,7 @@ module Magica
17
20
  end
18
21
 
19
22
  def self.load
20
- builtin_path = File.join(File.dirname(__FILE__), "toolchains")
23
+ builtin_path = File.join(File.dirname(__FILE__), 'toolchains')
21
24
  Dir.glob("#{builtin_path}/*.rake").each do |file|
22
25
  Kernel.load file
23
26
  end
@@ -26,4 +29,3 @@ module Magica
26
29
 
27
30
  Toolchain.load
28
31
  end
29
-
@@ -1,16 +1,17 @@
1
- Magica::Toolchain.new :gcc do |config, params|
1
+ # rubocop:disable Matrics/LineLength
2
+ Magica::Toolchain.new :gcc do |config, _|
2
3
  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)]
4
+ cc.command = ENV['CC'] || 'gcc'
5
+ cc.flags = [ENV['CFLAGS'] || %w[-g -std=gnu99 -O3 -Wall -Werror-implicit-function-declaration -Wdeclaration-after-statement -Wwrite-strings]]
5
6
  end
6
7
 
7
8
  config.cxx do |cxx|
8
- cxx.command = ENV['CXX'] || "g++"
9
- cxx.flags = [ENV['CXXFLAGS'] || %w(-g -O3 -Wall -Werror-implicit-function-declaration)]
9
+ cxx.command = ENV['CXX'] || 'g++'
10
+ cxx.flags = [ENV['CXXFLAGS'] || %w[-g -O3 -Wall -Werror-implicit-function-declaration]]
10
11
  end
11
12
 
12
13
  config.linker do |linker|
13
- linker.command = ENV['LD'] || "gcc"
14
- linker.flags = [ENV['LDFLAGS'] || %w()]
14
+ linker.command = ENV['LD'] || 'gcc'
15
+ linker.flags = [ENV['LDFLAGS'] || %w[]]
15
16
  end
16
17
  end
@@ -1,3 +1,3 @@
1
1
  module Magica
2
- VERSION = "0.7.2"
2
+ VERSION = '0.8.0'.freeze
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.7.2
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - 蒼時弦也
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-03 00:00:00.000000000 Z
11
+ date: 2017-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -97,10 +97,8 @@ files:
97
97
  - lib/magica/framework.rb
98
98
  - lib/magica/i18n.rb
99
99
  - lib/magica/initialize.rb
100
- - lib/magica/magica.rb
101
100
  - lib/magica/package_config.rb
102
101
  - lib/magica/target.rb
103
- - lib/magica/tasks/build.rake
104
102
  - lib/magica/tasks/framework.rake
105
103
  - lib/magica/tasks/initialize.rake
106
104
  - lib/magica/templates/Magicafile
@@ -1,33 +0,0 @@
1
- module Magica
2
- class << self
3
- attr_accessor :default_toolchain, :toolchain_params
4
-
5
- def builds
6
- @builds ||= {}
7
- end
8
-
9
- def each_build(&block)
10
- return to_enum(:each_build) if block.nil?
11
- @builds.each do |key, build|
12
- build.instance_eval(&block)
13
- end
14
- end
15
-
16
- def root
17
- Dir.pwd
18
- end
19
-
20
- def default_compile_task
21
- proc { |options|
22
- clean if options[:clean]
23
-
24
- do_target(options[:target])
25
-
26
- objects = objfile(@sources)
27
- @sources.each { |source| compile source }
28
-
29
- link exefile, objects
30
- }
31
- end
32
- end
33
- end
File without changes