Class: Mkrf::Availability
- Inherits:
-
Object
- Object
- Mkrf::Availability
- Defined in:
- lib/mkrf/availability.rb
Overview
The Availability
class is concerned with libraries, headers, and functions. It can be easily wrapped (see Mkrf::Generator
for an example) and should be able to be used as a basis for a variety of programs which need to determine functionality based on what libraries are available on the current system.
Constant Summary collapse
- DEFAULT_INCLUDES =
[Config::CONFIG['includedir'], Config::CONFIG["archdir"], Config::CONFIG['sitelibdir'], "."]
- TEMP_SOURCE_FILE =
These really shouldn’t be static like this..
"temp_source.c"
- TEMP_EXECUTABLE =
"temp_executable"
Instance Attribute Summary collapse
-
#defines ⇒ Object
readonly
Returns the value of attribute defines.
-
#headers ⇒ Object
readonly
Returns the value of attribute headers.
-
#includes ⇒ Object
readonly
Returns the value of attribute includes.
-
#loaded_libs ⇒ Object
readonly
Returns the value of attribute loaded_libs.
-
#logger ⇒ Object
readonly
Returns the value of attribute logger.
Instance Method Summary collapse
-
#can_link?(function_body) ⇒ Boolean
Returns the result of an attempt to compile and link the function body passed in.
-
#find_executable(bin, *paths) ⇒ Object
Takes the name of an executable and an optional set of paths to search.
-
#has_function?(function) ⇒ Boolean
Returns
true
if the function is able to be called based on libraries and headers currently loaded. -
#has_header?(header, *paths) ⇒ Boolean
Returns
true
if the header is found in the default search path or in optional paths passed as an argument,false
otherwise. -
#has_library?(library, function = "main", *paths) ⇒ Boolean
Returns a boolean whether indicating whether the library can be found by attempting to reference the function passed (
main
by default). -
#include_header(header, *paths) ⇒ Object
Include a header in the list of availiable headers.
-
#include_library(library, function = "main", *paths) ⇒ Object
Include a library in the list of available libs.
-
#includes_compile_string ⇒ Object
Returns a string of include directories formatted for compilation.
-
#initialize(options = {}) ⇒ Availability
constructor
Create a new Availability instance.
-
#ld_outfile(filename) ⇒ Object
:nodoc:.
- #ldshared_string ⇒ Object
-
#library_compile_string ⇒ Object
Returns a string of libraries formatted for compilation.
-
#library_paths_compile_string ⇒ Object
Returns a string of libraries directories formatted for compilation.
- #with_headers(*args, &b) ⇒ Object
- #with_includes(*args, &b) ⇒ Object
- #with_loaded_libs(*args, &b) ⇒ Object
Constructor Details
#initialize(options = {}) ⇒ Availability
Create a new Availability instance.
Valid keys for the options hash include:
-
:loaded_libs
– libraries to load by default -
:library_paths
– libraries paths to include by default -
:headers
– headers to load by default -
:compiler
– which compiler to use when determining availability -
:includes
– directories that should be searched for include files
37 38 39 40 41 42 43 44 45 46 |
# File 'lib/mkrf/availability.rb', line 37 def initialize( = {}) @loaded_libs = [([:loaded_libs] || Config::CONFIG["LIBS"].gsub('-l', '').split)].flatten @library_paths = [([:library_paths] || [])].flatten # Not sure what COMMON_HEADERS looks like when populated @headers = [:headers] || [] # Config::CONFIG["COMMON_HEADERS"] @compiler = [:compiler] || Config::CONFIG["CC"] @includes = [([:includes] || DEFAULT_INCLUDES)].flatten @logger = Logger.new('mkrf.log') @defines = [] end |
Instance Attribute Details
#defines ⇒ Object (readonly)
Returns the value of attribute defines.
27 28 29 |
# File 'lib/mkrf/availability.rb', line 27 def defines @defines end |
#headers ⇒ Object (readonly)
Returns the value of attribute headers.
27 28 29 |
# File 'lib/mkrf/availability.rb', line 27 def headers @headers end |
#includes ⇒ Object (readonly)
Returns the value of attribute includes.
27 28 29 |
# File 'lib/mkrf/availability.rb', line 27 def includes @includes end |
#loaded_libs ⇒ Object (readonly)
Returns the value of attribute loaded_libs.
27 28 29 |
# File 'lib/mkrf/availability.rb', line 27 def loaded_libs @loaded_libs end |
#logger ⇒ Object (readonly)
Returns the value of attribute logger.
27 28 29 |
# File 'lib/mkrf/availability.rb', line 27 def logger @logger end |
Instance Method Details
#can_link?(function_body) ⇒ Boolean
Returns the result of an attempt to compile and link the function body passed in
126 127 128 129 130 131 132 133 134 |
# File 'lib/mkrf/availability.rb', line 126 def can_link?(function_body) silence_command_line do create_source(function_body) system(link_command) end ensure FileUtils.rm_f TEMP_SOURCE_FILE FileUtils.rm_f TEMP_EXECUTABLE end |
#find_executable(bin, *paths) ⇒ Object
Takes the name of an executable and an optional set of paths to search. If no paths are given, the environmental path is used by default. Returns the absolute path to an executable, or nil if not found.
190 191 192 193 194 195 196 197 |
# File 'lib/mkrf/availability.rb', line 190 def find_executable(bin, *paths) paths = ENV['PATH'].split(File::PATH_SEPARATOR) if paths.empty? paths.each do |path| file = File.join(path, bin) return file if File.executable?(file) end return nil end |
#has_function?(function) ⇒ Boolean
Returns true
if the function is able to be called based on libraries and headers currently loaded. Returns false
otherwise.
Params:
-
function
– the function to check for
114 115 116 117 118 119 120 121 122 |
# File 'lib/mkrf/availability.rb', line 114 def has_function?(function) if can_link?(simple_call(function)) or can_link?(simple_reference(function)) logger.info "Function found: #{function}()" return true else logger.warn "Function not found: #{function}()" return false end end |
#has_header?(header, *paths) ⇒ Boolean
Returns true
if the header is found in the default search path or in optional paths passed as an argument, false
otherwise. If the header is found, the preprocessor constant HAVE_BLAH is defined where BLAH is the name of the header in uppercase without the file extension.
Params:
-
header
– the header to be searched for -
paths
– an optional list of search paths if the header is not found in the default paths
98 99 100 101 102 103 104 105 106 107 |
# File 'lib/mkrf/availability.rb', line 98 def has_header?(header, *paths) if header_already_loaded?(header) || header_can_link?(header) || header_found_in_paths?(header, paths) defines << format("HAVE_%s", header.tr("a-z./\055", "A-Z___")) return true end logger.warn "Header not found: #{header}" return false end |
#has_library?(library, function = "main", *paths) ⇒ Boolean
Returns a boolean whether indicating whether the library can be found by attempting to reference the function passed (main
by default).
Params:
-
library
– the library to be included as a string -
function
– a method to base the inclusion of the library on.main
by default. -
paths
– an optional list of search paths if the library is not found in the default paths
81 82 83 84 85 86 87 88 |
# File 'lib/mkrf/availability.rb', line 81 def has_library?(library, function = "main", *paths) logger.info "Checking for library: #{library}" return true if library_already_loaded?(library) return true if RUBY_PLATFORM =~ /mswin/ # TODO: find a way on windows # Should this be only found_library? or a specialized version with # path searching? found_library?(library, function) end |
#include_header(header, *paths) ⇒ Object
Include a header in the list of availiable headers. Returns false
if the header is not available. Returns non-false otherwise. If the header is found, the preprocessor constant HAVE_BLAH is defined where BLAH is the name of the header in uppercase without the file extension.
Params:
-
header
– the name of the header to be included as a string. -
paths
– an optional list of search paths if the header is not found in the default paths.
70 71 72 |
# File 'lib/mkrf/availability.rb', line 70 def include_header(header, *paths) @headers << header if has_header?(header, *paths) end |
#include_library(library, function = "main", *paths) ⇒ Object
Include a library in the list of available libs. Returns false
if the library is not available. Returns non-false otherwise.
Params:
-
library
– the library to be included as a string. -
function
– a method to base the inclusion of the library on.main
by default. -
paths
– an optional list of search paths if the library is not found in the default paths.
55 56 57 58 59 60 |
# File 'lib/mkrf/availability.rb', line 55 def include_library(library, function = "main", *paths) paths.each do |library_dir| @library_paths << library_dir end @loaded_libs << library if has_library?(library, function) end |
#includes_compile_string ⇒ Object
Returns a string of include directories formatted for compilation
183 184 185 |
# File 'lib/mkrf/availability.rb', line 183 def includes_compile_string @includes.collect {|i| "-I#{i}"}.join(' ') end |
#ld_outfile(filename) ⇒ Object
:nodoc:
174 175 176 177 178 179 180 |
# File 'lib/mkrf/availability.rb', line 174 def ld_outfile(filename) # :nodoc: if RUBY_PLATFORM =~ /mswin/ "-out:#{filename}" else "-o #{filename}" end end |
#ldshared_string ⇒ Object
166 167 168 169 170 171 172 |
# File 'lib/mkrf/availability.rb', line 166 def ldshared_string if RUBY_PLATFORM =~ /mswin/ "link -nologo -incremental:no -debug -opt:ref -opt:icf -dll" else Config::CONFIG['LDSHARED'] end end |
#library_compile_string ⇒ Object
Returns a string of libraries formatted for compilation
149 150 151 152 153 154 155 |
# File 'lib/mkrf/availability.rb', line 149 def library_compile_string if RUBY_PLATFORM =~ /mswin/ @loaded_libs.join(' ') else @loaded_libs.collect {|l| "-l#{l}"}.join(' ') end end |
#library_paths_compile_string ⇒ Object
Returns a string of libraries directories formatted for compilation
158 159 160 161 162 163 164 |
# File 'lib/mkrf/availability.rb', line 158 def library_paths_compile_string if RUBY_PLATFORM =~ /mswin/ @library_paths.collect {|l| "/libpath:#{l}"}.join(' ') else @library_paths.collect {|l| "-L#{l}"}.join(' ') end end |
#with_headers(*args, &b) ⇒ Object
136 137 138 |
# File 'lib/mkrf/availability.rb', line 136 def with_headers(*args, &b) with_stackable_attribute('headers', *args, &b) end |
#with_includes(*args, &b) ⇒ Object
144 145 146 |
# File 'lib/mkrf/availability.rb', line 144 def with_includes(*args, &b) with_stackable_attribute('includes', *args, &b) end |
#with_loaded_libs(*args, &b) ⇒ Object
140 141 142 |
# File 'lib/mkrf/availability.rb', line 140 def with_loaded_libs(*args, &b) with_stackable_attribute('loaded_libs', *args, &b) end |