mirror of
https://github.com/ggml-org/whisper.cpp.git
synced 2026-07-23 11:10:57 -05:00
* Change MemoryView example using NDAV * Add note on audio attributes for #full and #full_parallel * Support more variants of MemoryView * Use IO.popen instead of Kernel.` for Windows compatibility * Use cmake's -C option instead of multiple -D options * Fix memsize calculation * Remove unused argument * Add is_interrupted field to abort callback container * Fix RBS syntax * Address document comment for RDoc * Add .document for RDoc * Add .rdoc_options * Run #full without GVL * Initialize callbacks with nil * Specify implicity Whisper::Params to distinguish from Whisper::Context::Params * Run callbacks without GVL * Call log callback with GVL * Run full_parallel without GVL * Run transcribe without GVL * Fix ruby_whisper_lock_gvl and ruby_whisper_unlock_gvl * Fix return value of encoder_begin_callback * Report GVL unlocking from transcribe * Remove unused interface * Restore overload of full_parallel * Close process * Fix struct name * Make is_without_gvl thread local * Use rb_thread_call_with_gvl instead of global variable * Retrieve instance variable in GVL * Narrow acceptable MemoryView format * Fix option cache path * Reduce files in package * Use append_cflags * Add ext/*.rb to task dependencies * Use copy instead of cp * Make TestPackage more portable * Patch for lower version Ruby * Make build scripts more portable * Add Windows support * Don't raise exceptions
126 lines
3.0 KiB
Ruby
126 lines
3.0 KiB
Ruby
require "fileutils"
|
|
|
|
class Options
|
|
def initialize(cmake="cmake")
|
|
@cmake = cmake
|
|
@options = {}
|
|
|
|
configure
|
|
write_cache_file
|
|
end
|
|
|
|
def to_a
|
|
[
|
|
"-D", "BUILD_SHARED_LIBS=OFF",
|
|
"-D", "WHISPER_BUILD_TESTS=OFF",
|
|
"-D", "CMAKE_ARCHIVE_OUTPUT_DIRECTORY=#{__dir__}",
|
|
"-D", "CMAKE_POSITION_INDEPENDENT_CODE=ON",
|
|
"-C", cache_path
|
|
]
|
|
end
|
|
|
|
def to_s
|
|
command_line(*to_a)
|
|
end
|
|
|
|
def graphviz_cmake_args
|
|
[]
|
|
end
|
|
|
|
private
|
|
|
|
def cmake_options
|
|
@cmake_options ||= 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
|
|
|
|
def cmake_options_output
|
|
Dir.chdir(__dir__) do
|
|
IO.popen([@cmake, "-S", "sources", "-B", "build", "-L"]) {|io| io.read}
|
|
end
|
|
end
|
|
|
|
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
|
|
|
|
# See ggml/src/ggml-cpu/CMakeLists.txt
|
|
def configure_accelerate
|
|
if RUBY_PLATFORM.match?(/darwin/) && enabled?("GGML_ACCELERATE")
|
|
$LDFLAGS << " -framework Accelerate"
|
|
end
|
|
end
|
|
|
|
# See ggml/src/ggml-metal/CMakeLists.txt
|
|
def configure_metal
|
|
$LDFLAGS << " -framework Foundation -framework Metal -framework MetalKit" if enabled?("GGML_METAL")
|
|
end
|
|
|
|
# See src/CmakeLists.txt
|
|
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]
|
|
return false unless op
|
|
return false unless op[0] == "BOOL"
|
|
if op[1].nil?
|
|
cmake_options[option][1]
|
|
else
|
|
op[1]
|
|
end
|
|
end
|
|
|
|
def cache_path
|
|
File.join(__dir__, "sources", "Options.cmake")
|
|
end
|
|
|
|
def write_cache_file
|
|
FileUtils.mkpath File.dirname(cache_path)
|
|
File.open cache_path, "w" do |file|
|
|
@options.reject {|name, (type, value)| value.nil?}.each do |name, (type, value)|
|
|
line = "set(CACHE{%<name>s} TYPE %<type>s FORCE VALUE %<value>s)" % {
|
|
name:,
|
|
type:,
|
|
value: value == true ? "ON" : value == false ? "OFF" : escape_cmake(value)
|
|
}
|
|
file.puts line
|
|
end
|
|
end
|
|
end
|
|
|
|
def escape_cmake(str)
|
|
str.gsub(/[\\"]/, '\\\\\&')
|
|
end
|
|
|
|
def command_line(*args)
|
|
args.collect {|arg| %|"#{arg.to_s.gsub(/[\\"]/, '\\\\\&')}"|}.join(" ")
|
|
end
|
|
end
|