neutron 0.1.0 → 0.2.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: 9fcb3a8b875da195e8ce7c6e2b90c23f063d97e4
4
- data.tar.gz: b0783ecb19dfd497cfdb196b58b88070e16e546f
3
+ metadata.gz: ed6e7b52ccba90b2d31c4dcbd54897c0ad0257c4
4
+ data.tar.gz: 201733d607545352f5c569df22bc8641d5cd0ae3
5
5
  SHA512:
6
- metadata.gz: 132fce6e5d3e697d417e938a7713ae7d0c8c1172341f96f420b9ca990fef3acd45c79e9782bead94f371b575ce6d22ab86b9b2cdeadcf79bea34569f757a2be1
7
- data.tar.gz: 47d7b251754520c2e8d0f4e885b471618e72f432d50dade0b1d6269c4409a091861918a78f5c73c9069e2849e8d9a22eb7fb6ea1b3e14784424bf6ac0dd8ff3c
6
+ metadata.gz: 8b096c82be55a889e2c5669d986610b847140ba34cd635f33c2cdcbd1a4f3d5227b18e3f0eb07e49d202ac5785d30da042a16eccec82ca0bbd5aa6e6075bbd64
7
+ data.tar.gz: d677ab4e1ca425852ede20f55401d2ae757c1397eae292867476ffe2497a15fea8f44df3873ff9d2edcbdf74237ddf3baaf642a40414a3f74b103d9661db9276
data/README.md CHANGED
@@ -37,6 +37,8 @@ require 'neutron'
37
37
  require 'neutron/pkgconf'
38
38
  require 'neutron/cc'
39
39
  require 'neutron/valac'
40
+ require 'neutron/install'
41
+ require 'neutron/clean'
40
42
 
41
43
  Dir.chdir('src/') # We'll compile our stuff here
42
44
 
@@ -68,14 +70,30 @@ task :link do
68
70
  args: packages.to_cc(cflags: false) # Package list
69
71
  )
70
72
  end
73
+
74
+ task :install do
75
+ # Installs results to #{prefix}/bin/. Uses ENV['PREFIX'] or '/usr/' as prefix
76
+ Neutron.install(
77
+ '../sample',
78
+ 'bin/'
79
+ )
80
+ end
81
+
82
+ task :clean do
83
+ # Removes all listed files
84
+ Neutron.clean(
85
+ *Neutron::FileList['*.vala.o'],
86
+ '../sample'
87
+ )
88
+ end
71
89
  ```
72
90
 
73
91
  ## ToDo
74
92
 
75
- 1. Gem-like version-checker
76
- 2. Shared-Object builder
77
- 3. `install` tool (must install headers, binaries, shared objects)
78
- 4. Finders for Boost, SFML, Qt, etc
93
+ 1. Docs
94
+ 2. Gem-like version-checker
95
+ 3. Finish Neutron::Valac module
96
+ 4. Finders for Boost, SFML, Qt, etc (should be implemented in separate gem)
79
97
 
80
98
  ## Development
81
99
 
data/lib/neutron/cc.rb CHANGED
@@ -5,9 +5,20 @@ module Neutron::CC
5
5
  o = {
6
6
  prog: 'cc',
7
7
  debug: false,
8
- args: ''
8
+ args: '',
9
+ shared: false
9
10
  }.merge(opts)
10
- Neutron.execute("#{o[:prog]} -o #{target} #{files.join(' ')} #{'-g' if o[:debug]} #{o[:args]}", must_success: true)
11
+ specific = ''
12
+ if o[:shared]
13
+ specific << ' -shared'
14
+ end
15
+ files.map! do |file|
16
+ File.expand_path(file)
17
+ end
18
+ Neutron.execute(
19
+ "#{o[:prog]} #{specific} -Wl,-rpath=./ -Wall -fpic -o #{target} #{files.join(' ')} #{'-g' if o[:debug]} #{o[:args]}",
20
+ must_success: true
21
+ )
11
22
  end
12
23
 
13
24
  def self.cc(*files, **opts)
@@ -17,6 +28,7 @@ module Neutron::CC
17
28
  args: ''
18
29
  }.merge(opts)
19
30
  files.each do |file|
31
+ file = File.expand_path(file)
20
32
  Neutron.execute("#{o[:prog]} -c #{file} #{'-g' if o[:debug]} #{o[:args]}", must_success: true)
21
33
  end
22
34
  end
@@ -28,6 +40,7 @@ module Neutron::CC
28
40
  args: ''
29
41
  }.merge(opts)
30
42
  files.each do |file|
43
+ file = File.expand_path(file)
31
44
  Neutron.execute("#{o[:prog]} -c #{file} #{'-g' if o[:debug]} #{o[:args]}", must_success: true)
32
45
  end
33
46
  end
@@ -0,0 +1,18 @@
1
+ require 'neutron'
2
+
3
+ module Neutron
4
+ def self.clean(*files)
5
+ files << Neutron::PkgStatus::FNAME
6
+ files.map! do |file|
7
+ File.expand_path(file)
8
+ end
9
+ files.each do |file|
10
+ if File.exist?(file)
11
+ Neutron.execute(
12
+ "rm -r #{file}",
13
+ must_success: true
14
+ )
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,28 @@
1
+ require 'neutron'
2
+
3
+ module Neutron
4
+ def self.install(*files, dir)
5
+ prefix = if ENV['PREFIX'] then ENV['PREFIX'] else '/usr' end
6
+ dir = File.expand_path(File.join(prefix, dir))
7
+ sudo = if ENV['USE_SUDO'] then 'sudo ' else '' end
8
+ unless File.exist? dir
9
+ Neutron.execute(
10
+ "#{sudo}mkdir --parents --mode=755 #{dir}",
11
+ must_success: true
12
+ )
13
+ end
14
+ files.each do |file|
15
+ p file
16
+ dn = File.join(dir, File.dirname(file))
17
+ p dn
18
+ #file = File.expand_path(file)
19
+ unless File.exist?(dn)
20
+ Neutron.execute("#{sudo}mkdir --parents --mode=755 #{dn}")
21
+ end
22
+ Neutron.execute(
23
+ "#{sudo}rsync -a --relative --chmod=755 #{file} #{dir}/",
24
+ must_success: true
25
+ )
26
+ end
27
+ end
28
+ end
@@ -47,4 +47,39 @@ class Neutron::PkgConf
47
47
  raise InvalidPkgConfError if tainted?
48
48
  @packages.map{|p|"--pkg #{p}"}.join(' ')
49
49
  end
50
+
51
+ def self.gen_pc(filename, **opts)
52
+ prefix = if ENV['PREFIX'] then ENV['PREFIX'] else '/usr' end
53
+ filename = File.expand_path(filename)
54
+
55
+ content = ''
56
+
57
+ content << "prefix=#{prefix}\n"
58
+ content << "exec_prefix=${prefix}\n"
59
+ content << "includedir=${prefix}/include\n"
60
+ content << "libdir=${exec_prefix}/lib\n"
61
+ content << "\n"
62
+
63
+ reqs = if opts[:requires] then opts[:requires].packages.join(' ') else '' end
64
+ preqs = if opts[:prequires] then opts[:prequires].packages.join(' ') else '' end
65
+
66
+ lname = opts[:name]
67
+ if m = /lib(.+)/.match(lname.downcase)
68
+ lname = m[1]
69
+ end
70
+
71
+ content << "Name: #{opts[:name] or 'Unnamed'}\n"
72
+ content << "Description: #{opts[:description] or 'No description'}\n"
73
+ content << "Version: #{opts[:version] or '0.1.0'}\n"
74
+ content << "Requires: #{reqs}\n"
75
+ content << "Requires.private: #{preqs}\n"
76
+ content << "Cflags: #{opts[:cflags] or "-I${includedir}/#{opts[:name].downcase or 'undefined'}"}\n"
77
+ content << "Libs: -L${libdir} -l#{lname or 'undefined'}\n"
78
+ content << "Libs.private: #{opts[:plibs] or ''}\n"
79
+
80
+ File.delete(filename) if File.exist?(filename)
81
+ File.write(filename, content)
82
+
83
+ puts "] Done generating pkg-config #{filename}"
84
+ end
50
85
  end
@@ -0,0 +1,10 @@
1
+ require 'neutron'
2
+
3
+ module Neutron::Static
4
+ def self.make_static(*files, out)
5
+ files.map! do |file|
6
+ File.expand_path(file)
7
+ end
8
+ Neutron.execute("ar rcs #{out} #{files.join(' ')}", must_success: true)
9
+ end
10
+ end
data/lib/neutron/valac.rb CHANGED
@@ -1,14 +1,65 @@
1
1
  require 'neutron'
2
2
 
3
- class Neutron::Valac
3
+ module Neutron::Valac
4
4
  def self.compile(*files, **opts)
5
5
  o = {
6
6
  prog: 'valac',
7
7
  debug: false,
8
+ type: :object,
9
+ gen_vapi: false,
10
+ gen_header: false,
8
11
  args: ''
9
12
  }.merge(opts)
13
+
14
+ specific = ''
15
+
16
+ if o[:debug]
17
+ specific << ' -g'
18
+ end
19
+
20
+ case o[:type]
21
+ when :object
22
+ specific << ' -c'
23
+ when :ccode
24
+ specific << ' -C'
25
+ else
26
+ raise TypeError, "Invalid output type: #{o[:type]}!"
27
+ end
28
+
10
29
  files.each do |file|
11
- Neutron.execute("#{o[:prog]} -c #{file} #{'-X g' if o[:debug]} #{o[:args]}", must_success: true)
30
+ file = File.expand_path(file)
31
+
32
+ iter_specific = ''
33
+
34
+ if o[:gen_vapi]
35
+ puts "Warning: this part of Neutron::Valac module is not finished. Use it at own risk!"
36
+ iter_specific << " --vapi #{Neutron.file_to_ext(file, '.vapi')}"
37
+ end
38
+
39
+ if o[:gen_header]
40
+ iter_specific << " --header #{Neutron.file_to_ext(file, '.h')}"
41
+ end
42
+
43
+ Neutron.execute("#{o[:prog]} #{file} #{specific} #{iter_specific} -b ./ --thread #{o[:args]}", must_success: true)
12
44
  end
13
45
  end
14
- end
46
+
47
+ def self.to_c(*files, **opts)
48
+ o = {
49
+ proc: 'valac',
50
+ args: ''
51
+ }
52
+ end
53
+
54
+ def self.vapi_header(header)
55
+ "[CCode (cheader_filename = \"#{header}\")]\n\n"
56
+ end
57
+ end
58
+
59
+ =begin
60
+ valac --vapi library.vapi --header library.h library.vala -C # Compiles library into C code and header to access it
61
+ cat *.vapi > libname.vapi # Concatenates all VAPIs into single file. Worked for me
62
+ gcc -c library.c -fpic `pkg-config --libs --cflags glib-2.0` # Compiles generated C code
63
+ gcc library.vala -o libname.so -shared -fpic `pkg-config --libs --cflags glib-2.0` # Compiles shared library
64
+ valac test.vala libname.vapi -X library.so -X -Wl,-rpath=./ # Compiles project using library
65
+ =end
@@ -1,3 +1,3 @@
1
1
  module Neutron
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
data/lib/neutron.rb CHANGED
@@ -3,10 +3,16 @@ require 'open3'
3
3
 
4
4
  require 'neutron/version'
5
5
 
6
+ # Main module
6
7
  module Neutron
8
+ # Execution error
7
9
  class ExecutionError < StandardError; end
8
10
 
11
+ # Polyfill for Rake::FileList
9
12
  class FileList < Array
13
+ # Selects all files which match given pattern/regex
14
+ # @param [String,Regexp] filter
15
+ # @return [Neutron::FileList]
10
16
  def self.[](filter)
11
17
  arr = Dir[filter]
12
18
  arr = arr.keep_if do |f|
@@ -15,24 +21,56 @@ module Neutron
15
21
  self.new(arr)
16
22
  end
17
23
 
24
+ # Switches all files to given extension
25
+ # @param [String] ext New extension
18
26
  def ext(ext)
19
27
  self.map do |f|
20
- m = /(.+)\..+/.match(f)
21
- if m
22
- m[1] + ext
23
- else
24
- f + ext
25
- end
28
+ Neutron.file_to_ext(f, ext)
26
29
  end
27
30
  end
28
31
  end
29
32
 
33
+ def self.file_to_ext(f, ext)
34
+ m = /(.+)\..+/.match(f)
35
+ if m
36
+ m[1] + ext
37
+ else
38
+ f + ext
39
+ end
40
+ end
41
+
42
+ def self.cat(*files, out, **opts)
43
+ out = File.expand_path(out)
44
+
45
+ File.delete(out) if File.exist?(out)
46
+
47
+ f = File.open(out, 'w')
48
+ puts "] Open: #{out}"
49
+
50
+ if opts[:prepend]
51
+ f.write(opts[:prepend])
52
+ puts "] Prepended content to #{out}"
53
+ end
54
+
55
+ files.each do |s|
56
+ s = File.expand_path(s)
57
+ f.write(File.read(s))
58
+ puts "] Write #{s} to #{out}"
59
+ end
60
+
61
+ f.close
62
+ puts "] Close: #{out}"
63
+ end
64
+
65
+ # Small extension for array which is developed to be used in Neutron.files()
30
66
  class FilePairList < Array
67
+ # @return [Array<String>]
31
68
  def sources
32
69
  self.map do |i|
33
70
  i.source
34
71
  end
35
72
  end
73
+ # @return [Array<String>]
36
74
  def targets
37
75
  self.map do |i|
38
76
  i.target
@@ -40,6 +78,10 @@ module Neutron
40
78
  end
41
79
  end
42
80
 
81
+ # Returns list of files which need to be processed
82
+ # @param [Array<String>] sources
83
+ # @param [String] t_ext Target extension
84
+ # @return [Neutron::FilePairList<FilePair>]
43
85
  def self.files(sources, t_ext)
44
86
  targets = sources.ext(t_ext)
45
87
  pairs = sources.zip(targets)
@@ -62,6 +104,11 @@ module Neutron
62
104
  Neutron::FilePairList.new(pairs)
63
105
  end
64
106
 
107
+ # Executes given command
108
+ # @param [String] string Command to execute
109
+ # @param [Hash] opts
110
+ # @option opts [Boolean] :must_success If exit code is not 0 - raises an exception
111
+ # @return [Array[String,Integer]] Output and exit code
65
112
  def self.execute(string, **opts)
66
113
  puts "> #{string}"
67
114
  stdin, stdout, waiter = *Open3.popen2e(string)
@@ -78,19 +125,28 @@ module Neutron
78
125
  return [out, waiter.value.exitstatus]
79
126
  end
80
127
 
128
+ # File pair
81
129
  class FilePair
82
130
  attr_reader :source, :target
83
131
  def initialize(source, target)
84
132
  @target = target
85
133
  @source = source
86
134
  end
135
+ def expand
136
+ @target = File.expand_path(@target)
137
+ @source = File.expand_path(@source)
138
+ self
139
+ end
87
140
  end
88
141
 
142
+ # Package status utilities
89
143
  module PkgStatus
90
144
  class PkgNotFoundError < StandardError; end
91
145
 
92
146
  FNAME = './.neutron_pkgs'.freeze
93
147
 
148
+ # Gets all checked packages
149
+ # @return [Array<String>]
94
150
  def self.get_checked
95
151
  if File.exist?(FNAME)
96
152
  JSON.load(File.read(FNAME))
@@ -99,6 +155,8 @@ module Neutron
99
155
  end
100
156
  end
101
157
 
158
+ # Adds found packages to `checked` list
159
+ # @param [Array<String>] found
102
160
  def self.add_found(found)
103
161
  checked = get_checked
104
162
  File.delete(FNAME) if File.exist?(FNAME)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neutron
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nickolay Ilyushin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-30 00:00:00.000000000 Z
11
+ date: 2017-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -55,7 +55,10 @@ files:
55
55
  - bin/setup
56
56
  - lib/neutron.rb
57
57
  - lib/neutron/cc.rb
58
+ - lib/neutron/clean.rb
59
+ - lib/neutron/install.rb
58
60
  - lib/neutron/pkgconf.rb
61
+ - lib/neutron/static_lib.rb
59
62
  - lib/neutron/valac.rb
60
63
  - lib/neutron/version.rb
61
64
  - neutron.gemspec