mkmf-cu 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dddc0a150502a76ea3ad3bf7a36d15f20b1070c6
4
+ data.tar.gz: b62362f39b1bf24113b97cd87011a423f733702c
5
+ SHA512:
6
+ metadata.gz: a6dcba385c2537d8cab74fd10655691c54c3e2f1492d69b1d8c04571622eeca96e714da25fed4a86316cb0246e72e19053db3e8c7bee0aa1b4445961cb0aace6
7
+ data.tar.gz: 190fc8e035136c97a438c0a1ec343abef2434b515565ea0c16b76cb3725df6471c34e38c82fe4524ce6cffa54eac4ef620bae616f07ed943ed87f92d62a4c320
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ require "mkmf-cu/opt"
3
+ require "open3"
4
+
5
+ opt, opt_h = build_optparser()
6
+
7
+ argv = ARGV.map{|e| e.dup }
8
+
9
+ $stderr.puts '[given command line options]: ' + ARGV.join(' ')
10
+ parse_ill_short(argv, opt_h)
11
+ parse_ill_short_with_arg(argv, opt_h)
12
+
13
+ argv = opt.parse(argv)
14
+
15
+ if opt_h["-c"].size > 0
16
+ s = generate_compiling_command_line(opt_h)
17
+ elsif opt_h['-dynamic'].size > 0 or opt_h['-shared'].size > 0
18
+ s = generate_linking_command_line(argv, opt_h)
19
+ else
20
+ raise
21
+ end
22
+
23
+ $stderr.puts "nvcc" + s
24
+ Open3.capture2("nvcc " + s)
@@ -0,0 +1,16 @@
1
+ require "mkmf"
2
+
3
+ MakeMakefile::CONFIG["CC"] = "mkmf-cu-nvcc --mkmf-cu-ext=c"
4
+ MakeMakefile::CONFIG["CXX"] = "mkmf-cu-nvcc --mkmf-cu-ext=cxx"
5
+ MakeMakefile::C_EXT << "cu"
6
+ MakeMakefile::SRC_EXT << "cu"
7
+
8
+ def compile_cu_with_cxx_compiler
9
+ MakeMakefile::C_EXT.delete("cu")
10
+ MakeMakefile::CXX_EXT << "cu"
11
+ end
12
+
13
+ def compile_cu_with_cc_compiler
14
+ MakeMakefile::CXX_EXT.delete("cu")
15
+ MakeMakefile::C_EXT << "cu"
16
+ end
@@ -0,0 +1,132 @@
1
+ require "optparse"
2
+ require "rbconfig"
3
+
4
+ def build_optparser
5
+ opt = OptionParser.new
6
+ opt_h = Hash.new{|h, k| h[k] = [] }
7
+
8
+ opt.on("--arch arg") {|v| opt_h["-arch"] << v }
9
+ opt.on("--std arg") {|v| opt_h["-std"] << v }
10
+ opt.on("--stdlib arg") {|v| opt_h["-stdlib"] << v }
11
+
12
+ opt.on("--Wl arg") {|v| opt_h["-Wl"] << v }
13
+
14
+ opt.on('--profile') {|v| opt_h["-pg"] << "" }
15
+ opt.on('-g') {|v| opt_h["-g"] << "" }
16
+ opt.on('-G', "--device-debug") {|v| opt_h["-G"] << "" }
17
+
18
+ opt.on('-I path') {|v| opt_h["-I"] << v }
19
+ opt.on('-D flag') {|v| opt_h["-D"] << v }
20
+ opt.on('-W flag') {|v| opt_h["-W"] << v }
21
+ opt.on('-o output') {|v| opt_h["-o"] << v }
22
+ opt.on('-c file') {|v| opt_h["-c"] << v }
23
+ opt.on('-f flag') {|v| opt_h["-f"] << v }
24
+ opt.on('-l file') {|v| opt_h["-l"] << v }
25
+ opt.on('-L path') {|v| opt_h["-L"] << v }
26
+ opt.on('-x pat', "--x pat") {|v| opt_h["-x"] << v }
27
+ opt.on('-O num'){|v| opt_h["-O"] << v if /[0-9]/ =~ v }
28
+ opt.on('--mkmf-cu-ext ext'){|v| opt_h["--mkmf-cu-ext"] << v}
29
+
30
+ return [opt, opt_h]
31
+ end
32
+
33
+ def parse_ill_short(argv, opt_h)
34
+ ["-shared", "-rdynamic", "-dynamic", "-bundle", "-pipe", "-pg"].each{|opt|
35
+ if ind = argv.find_index(opt)
36
+ opt_h[opt] << ""
37
+ argv.delete_at(ind)
38
+ end
39
+ }
40
+ ["-arch", "-std", "-stdlib"].each{|opt|
41
+ if ind = argv.find_index(opt)
42
+ argv[ind] = "-" + opt
43
+ end
44
+ }
45
+ end
46
+
47
+ def parse_ill_short_with_arg(argv, opt_h)
48
+ [/\A(\-stdlib)=(.*)/, /\A(\-Wl),(.*)/].each{|reg|
49
+ argv.each{|e|
50
+ if reg =~ e
51
+ e[0..-1] = "-" + $1 + '=' + $2
52
+ end
53
+ }
54
+ }
55
+ end
56
+
57
+ def compiler_option(opt_h)
58
+ ret = ""
59
+ ["-f", "-W", "-pipe"].each{|op|
60
+ opt_h[op].each{|e|
61
+ ret << " --compiler-options " + "#{op}#{e}"
62
+ }
63
+ }
64
+ ["-stdlib"].each{|op|
65
+ opt_h[op].each{|e|
66
+ ret << " --compiler-options " + "#{op}=#{e}"
67
+ }
68
+ }
69
+ return ret
70
+ end
71
+
72
+ def linker_option(opt_h)
73
+ ret = ""
74
+ ["-dynamic", "-bundle", "-shared", "-rdynamic"].each{|op|
75
+ opt_h[op].each{|e|
76
+ ret << " --linker-options " + op
77
+ }
78
+ }
79
+
80
+ opt_h["-Wl"].each{|e|
81
+ ret << " --linker-options " + e
82
+ }
83
+
84
+ return ret
85
+ end
86
+
87
+ def compiler_bin(opt_h)
88
+ if opt_h["--mkmf-cu-ext"][0] == "c"
89
+ " --compiler-bindir " + RbConfig::CONFIG["CC"]
90
+ elsif opt_h["--mkmf-cu-ext"][0] == "cxx"
91
+ " --compiler-bindir " + RbConfig::CONFIG["CXX"]
92
+ end
93
+ end
94
+
95
+ def generate_compiling_command_line(opt_h)
96
+ s = ""
97
+ # options nvcc can uderstatnd
98
+ ["-pg", "-g", "-G", "-x", "-I", "-D", "-o", "-c", "-O"].each{|op|
99
+ opt_h[op].each{|e|
100
+ case op
101
+ when "-o", "-c", "-x"
102
+ s << " #{op} #{e}"
103
+ else
104
+ s << " #{op}#{e}"
105
+ end
106
+ }
107
+ }
108
+ s << compiler_option(opt_h)
109
+ s << compiler_bin(opt_h)
110
+ return s
111
+ end
112
+
113
+ def generate_linking_command_line(argv, opt_h)
114
+ s = ""
115
+ ["-L", "-l", "-o", "-c", "-O"].each{|op|
116
+ opt_h[op].each{|e|
117
+ case op
118
+ when "-o", "-c"
119
+ s << " #{op} #{e}"
120
+ s << " " + argv[0] + " " if op == "-o"
121
+ else
122
+ s << " #{op}#{e}"
123
+ end
124
+ }
125
+ }
126
+ s << compiler_option(opt_h)
127
+ s << linker_option(opt_h)
128
+
129
+ s << compiler_bin(opt_h)
130
+
131
+ return s
132
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mkmf-cu
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Takashi Tamura
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-24 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Write Ruby extention in C/C++ with NVIDIA CUDA. A simple wrapper command
14
+ for nvcc and a monkey patch for mkmf.
15
+ email: ''
16
+ executables:
17
+ - mkmf-cu-nvcc
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - bin/mkmf-cu-nvcc
22
+ - lib/mkmf-cu.rb
23
+ - lib/mkmf-cu/opt.rb
24
+ homepage: https://github.com/ruby-accel/mkmf-cu
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.5.1
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Write Ruby extention in C/C++ with NVIDIA CUDA.
48
+ test_files: []