Class: Gem::Ext::CmakeBuilder
- Inherits:
-
Object
- Object
- Gem::Ext::CmakeBuilder
- 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
-
#profile ⇒ Object
Returns the value of attribute profile.
-
#runner ⇒ Object
Returns the value of attribute runner.
Instance Method Summary collapse
- #build(extension, dest_path, results, args = [], lib_dir = nil, cmake_dir = Dir.pwd, target_rbconfig = Gem.target_rbconfig) ⇒ Object
- #compile(cmake_dir, build_dir, args, results) ⇒ Object
- #configure(cmake_dir, build_dir, install_dir, args, results) ⇒ Object
-
#initialize ⇒ CmakeBuilder
constructor
A new instance of CmakeBuilder.
Constructor Details
#initialize ⇒ CmakeBuilder
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
#profile ⇒ Object
Returns the value of attribute profile.
33 34 35 |
# File 'lib/rubygems/cmake_builder.rb', line 33 def profile @profile end |
#runner ⇒ Object
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 |