class Gem::Ext::CmakeBuilder
此构建器创建使用 CMake 定义的扩展。如果 Gem 的 spec 文件将 `extension` 属性设置为包含 `CMakeLists.txt` 的字符串,则会调用此构建器。
通常,CMake 项目需要两个步骤来构建
* configure * build
构建器遵循此约定。首先运行配置步骤,然后运行构建步骤。
CMake 项目的可配置性很强,您很可能希望在安装 gem 时指定选项。要将选项传递给 CMake,请在 gem install 命令中将它们放在 `--` 之后。例如:
gem install <gem_name> -- --preset <preset_name>
请注意,选项**仅**传递给配置步骤 - 目前无法为构建步骤指定选项。如果这成为一个问题,可以更新 CMake 构建器以支持构建选项。
有用的选项包括:
-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
如果 Gem 作者通过 `CMakePresets.json` 文件提供了预设,您很可能想使用其中一个。如果没有,您可能希望指定一个生成器。推荐使用 Ninja,因为它能并行构建项目,因此比 Make 这种串行构建快得多。
属性
Public Class Methods
Source
# File lib/rubygems/ext/cmake_builder.rb, line 34 def initialize @runner = self.class.method(:run) @profile = :release end
Public Instance Methods
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
私有实例方法
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