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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c76457397a26e8c8f5530223241085a5de1ed2cd
4
- data.tar.gz: a00d14e584583a1b50774002f0ebe94ea05c5d0c
3
+ metadata.gz: e2da1bed863df770f3cda733a7fd15f2ebbd2e14
4
+ data.tar.gz: b5753f85c89bedf34cc8f277f8adc9445e3389e6
5
5
  SHA512:
6
- metadata.gz: 7acc35bd25b2c8d3c416097a78ae04a47ff813c85eaad74e7ef921406533947ec58f13ea7e62dd89dd40385ef8bc49d65b74c9aa1e14a2df0303acc5d52c2646
7
- data.tar.gz: 8518c22efb3a15fbd7834847e1a655b9b05448f25272d0c004e4a5fdc8be0599c091ae569d3b912f00b6bc7094a751f8aa09bc09f80e98b40946af3d48356654
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"
@@ -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 define_builder(name = 'host', dest = 'build', &block)
11
- Builder.new(name, dest, &block)
10
+ def build(name = 'host', options = {dest: 'build'}, &block)
11
+ Build.new(name, options, &block)
12
12
  end
13
13
 
14
- def build(name, options = {}, &block)
15
- builder = Magica.targets[name.to_s]
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
- FileUtils.rm_r(@dest, force: true) if options[:clean]
22
+ clean if options[:clean]
19
23
 
20
24
  objects = objfile(@sources)
21
25
  @sources.each { |source| compile source }
22
26
 
23
- link exefile("#{@dest}/#{@name}"), objects
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
@@ -1,4 +1,4 @@
1
- task :default => :_all
1
+ task default: :_all
2
2
 
3
3
  task :_all do |t|
4
4
  if Rake::Task.task_defined?(:all)
@@ -3,13 +3,15 @@ require "magica/build"
3
3
  # Define default toolchain
4
4
  # toolchain :gcc
5
5
 
6
- # Define Builder
7
- define_builder :main
8
-
9
- # Register Build Task
10
- build :main, {clean: true}
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
- sh "build/main"
14
+ # Execute last build file
15
+ sh exefile
14
16
  end
15
17
 
@@ -1,3 +1,3 @@
1
1
  module Magica
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.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.2.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-17 00:00:00.000000000 Z
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
@@ -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