magica 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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