class Gem::Ext::CmakeBuilder
Dieser Builder erstellt Erweiterungen, die mit CMake definiert sind. Er wird aufgerufen, wenn eine Gem-Spezifikationsdatei die Eigenschaft 'extension' auf eine Zeichenkette setzt, die 'CMakeLists.txt' enthält.
Im Allgemeinen werden CMake-Projekte in zwei Schritten erstellt
* configure * build
Der Builder folgt dieser Konvention. Zuerst führt er einen Konfigurationsschritt aus und dann einen Build-Schritt.
CMake-Projekte können recht konfigurierbar sein - es ist wahrscheinlich, dass Sie beim Installieren eines Gems Optionen angeben möchten. Um Optionen an CMake zu übergeben, geben Sie diese nach '–' im Gem-Installationsbefehl an. Zum Beispiel
gem install <gem_name> -- --preset <preset_name>
Beachten Sie, dass Optionen NUR an den Konfigurationsschritt gesendet werden - es ist derzeit nicht möglich, Optionen für den Build-Schritt anzugeben. Wenn dies zu einem Problem wird, kann der CMake-Builder aktualisiert werden, um Build-Optionen zu unterstützen.
Nützliche Optionen, die Sie kennen sollten, sind
-G to specify a generator (-G Ninja is recommended) -D<CMAKE_VARIABLE> to set a CMake variable (for example -DCMAKE_BUILD_TYPE=Release) --preset <preset_name> to use a preset
Wenn der Gem-Autor Presets über eine CMakePresets.json-Datei bereitstellt, möchten Sie wahrscheinlich eines davon verwenden. Wenn nicht, möchten Sie vielleicht einen Generator angeben. Ninja wird empfohlen, da es Projekte parallel und somit viel schneller erstellen kann als die serielle Erstellung wie bei Make.
Attribute
Öffentliche Klassenmethoden
Source
# File lib/rubygems/ext/cmake_builder.rb, line 34 def initialize @runner = self.class.method(:run) @profile = :release end
Öffentliche Instanzmethoden
Source
# File lib/rubygems/ext/cmake_builder.rb, line 39 def build(extension, dest_path, results, args = [], lib_dir = nil, cmake_dir = Dir.pwd, target_rbconfig = Gem.target_rbconfig, n_jobs: nil) if target_rbconfig.path warn "--target-rbconfig is not yet supported for CMake extensions. Ignoring" end # Figure the build dir build_dir = File.join(cmake_dir, "build") # Check if the gem defined presets check_presets(cmake_dir, args, results) # Configure configure(cmake_dir, build_dir, dest_path, args, results) # Compile compile(cmake_dir, build_dir, args, results) results end
Source
# File lib/rubygems/ext/cmake_builder.rb, line 73 def compile(cmake_dir, build_dir, args, results) cmd = ["cmake", "--build", build_dir.to_s, "--config", @profile.to_s] runner.call(cmd, results, "cmake_compile", cmake_dir) end
Source
# File lib/rubygems/ext/cmake_builder.rb, line 60 def configure(cmake_dir, build_dir, install_dir, args, results) cmd = ["cmake", cmake_dir, "-B", build_dir, "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=#{install_dir}", # Windows "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=#{install_dir}", # Not Windows *Gem::Command.build_args, *args] runner.call(cmd, results, "cmake_configure", cmake_dir) end
Private Instanzmethoden
Source
# File lib/rubygems/ext/cmake_builder.rb, line 85 def check_presets(cmake_dir, args, results) # Return if the user specified a preset return unless args.grep(/--preset/i).empty? cmd = ["cmake", "--list-presets"] presets = Array.new begin runner.call(cmd, presets, "cmake_presets", cmake_dir) # Remove the first two lines of the array which is the current_directory and the command # that was run presets = presets[2..].join results << <<~EOS The gem author provided a list of presets that can be used to build the gem. To use a preset specify it on the command line: gem install <gem_name> -- --preset <preset_name> #{presets} EOS rescue Gem::InstallError # Do nothing, CMakePresets.json was not included in the Gem end end