|
|
class Options |
|
|
def initialize(cmake="cmake") |
|
|
@cmake = cmake |
|
|
@options = {} |
|
|
|
|
|
configure |
|
|
end |
|
|
|
|
|
def to_s |
|
|
@options |
|
|
.reject {|name, (type, value)| value.nil?} |
|
|
.collect {|name, (type, value)| "-D #{name}=#{value == true ? "ON" : value == false ? "OFF" : value.shellescape}"} |
|
|
.join(" ") |
|
|
end |
|
|
|
|
|
def cmake_options |
|
|
return @cmake_options if @cmake_options |
|
|
|
|
|
output = nil |
|
|
Dir.chdir __dir__ do |
|
|
output = `#{@cmake.shellescape} -S sources -B build -L` |
|
|
end |
|
|
@cmake_options = output.lines.drop_while {|line| line.chomp != "-- Cache values"}.drop(1) |
|
|
.filter_map {|line| |
|
|
option, value = line.chomp.split("=", 2) |
|
|
name, type = option.split(":", 2) |
|
|
[ |
|
|
name, |
|
|
[ |
|
|
type, |
|
|
type == "BOOL" ? value == "ON" : value |
|
|
] |
|
|
] |
|
|
}.to_h |
|
|
end |
|
|
|
|
|
private |
|
|
|
|
|
def configure |
|
|
cmake_options.each_pair do |name, (type, default_value)| |
|
|
option = option_name(name) |
|
|
value = type == "BOOL" ? enable_config(option) : arg_config("--#{option}") |
|
|
@options[name] = [type, value] |
|
|
end |
|
|
|
|
|
configure_accelerate |
|
|
configure_metal |
|
|
configure_coreml |
|
|
end |
|
|
|
|
|
|
|
|
def configure_accelerate |
|
|
if RUBY_PLATFORM.match?(/darwin/) && enabled?("GGML_ACCELERATE") |
|
|
$LDFLAGS << " -framework Accelerate" |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
def configure_metal |
|
|
$LDFLAGS << " -framework Foundation -framework Metal -framework MetalKit" if enabled?("GGML_METAL") |
|
|
end |
|
|
|
|
|
|
|
|
def configure_coreml |
|
|
if enabled?("WHISPER_COREML") |
|
|
$LDFLAGS << " -framework Foundation -framework CoreML" |
|
|
$defs << "-DRUBY_WHISPER_USE_COREML" |
|
|
end |
|
|
end |
|
|
|
|
|
def option_name(name) |
|
|
name.downcase.gsub("_", "-") |
|
|
end |
|
|
|
|
|
def enabled?(option) |
|
|
op = @options[option] |
|
|
raise "Option not exist: #{option}" unless op |
|
|
raise "Option not boolean: #{option}(#{op[0]})" unless op[0] == "BOOL" |
|
|
if op[1].nil? |
|
|
cmake_options[option][1] |
|
|
else |
|
|
op[1] |
|
|
end |
|
|
end |
|
|
end |
|
|
|