Class: Gem::Ext::CmakeBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/rubygems/cmake_builder.rb

Overview

This builder creates extensions defined using CMake. Its is invoked if a Gem’s spec file sets the ‘extension` property to a string that contains `CMakeLists.txt`.

In general, CMake projects are built in two steps:

* configure
* build

The builder follow this convention. First it runs a configuration step and then it runs a build step.

CMake projects can be quite configurable - it is likely you will want to specify options when installing a gem. To pass options to CMake specify them after ‘–` in the gem install command. For example:

gem install <gem_name> -- --preset <preset_name>

Note that options are ONLY sent to the configure step - it is not currently possible to specify options for the build step. If this becomes and issue then the CMake builder can be updated to support build options.

Useful options to know are:

-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

If the Gem author provides presets, via CMakePresets.json file, you will likely want to use one of them. If not, you may wish to specify a generator. Ninja is recommended because it can build projects in parallel and thus much faster than building them serially like Make does.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeCmakeBuilder

Returns a new instance of CmakeBuilder.



34
35
36
37
# File 'lib/rubygems/cmake_builder.rb', line 34

def initialize
  @runner = self.class.method(:run)
  @profile = :release
end

Instance Attribute Details

#profileObject

Returns the value of attribute profile.



33
34
35
# File 'lib/rubygems/cmake_builder.rb', line 33

def profile
  @profile
end

#runnerObject

Returns the value of attribute runner.



33
34
35
# File 'lib/rubygems/cmake_builder.rb', line 33

def runner
  @runner
end

Instance Method Details

#build(extension, dest_path, results, args = [], lib_dir = nil, cmake_dir = Dir.pwd, target_rbconfig = Gem.target_rbconfig) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/rubygems/cmake_builder.rb', line 39

def build(extension, dest_path, results, args = [], lib_dir = nil, cmake_dir = Dir.pwd,
          target_rbconfig = Gem.target_rbconfig)
  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

#compile(cmake_dir, build_dir, args, results) ⇒ Object



73
74
75
76
77
78
79
80
81
# File 'lib/rubygems/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

#configure(cmake_dir, build_dir, install_dir, args, results) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/rubygems/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