module RakeCompilerDock

def cross_rubies


# }
# "2.4" => "2.4.10",
# "2.5" => "2.5.9",
# "2.6" => "2.6.10",
# "2.7" => "2.7.8",
# "3.0" => "3.0.7",
# "3.1" => "3.1.6",
# "3.2" => "3.2.6",
# "3.3" => "3.3.5",
# "3.4" => "3.4.1",
# => {
RakeCompilerDock.cross_rubies

For example:

Returns a Hash corresponding_patch_version>

a custom `RUBY_CC_VERSION` string that is valid.
Retrieve the cross-rubies that are available in the docker image. This can be used to construct
def cross_rubies
  {
    "3.4" => "3.4.1",
    "3.3" => "3.3.7",
    "3.2" => "3.2.6",
    "3.1" => "3.1.6",
    "3.0" => "3.0.7",
    "2.7" => "2.7.8",
    "2.6" => "2.6.10",
    "2.5" => "2.5.9",
    "2.4" => "2.4.10",
  }
end

def exec(*args, &block)

RakeCompilerDock.exec 'bash', '-c', 'echo $RUBY_CC_VERSION'

Examples:

* Option +:groupname+ can be used to overwrite the group name in the container
* Option +:username+ can be used to overwrite the user name in the container
* Option +:options+ can be an Array of additional options to the 'docker run' command.
* Option +:runas+ can be set to false to execute the command as user root.
* Option +:sigfw+ can be set to false to not stop the container on Ctrl-C.
* Option +:check_docker+ can be set to false to disable the docker check.
If not set, rake's verbose flag is used.
* Option +:verbose+ can be set to enable printing of the command line.

Without a block a RuntimeError is raised when the command exits non-zero.
If a block is given, upon command completion the block is called with an OK flag (true on a zero exit status) and a Process::Status object.

The command is run directly, without the shell.
Run the command cmd within a fresh rake-compiler-dock container.
def exec(*args, &block)
  Starter.exec(*args, &block)
end

def image_name

def image_name
  Starter.image_name
end

def ruby_cc_version(*requirements)


# => "3.4.1:3.3.7:3.2.6"
RakeCompilerDock.ruby_cc_version(Gem::Requirement.new("~> 3.2"))

# => "3.4.1:3.3.7:3.2.6"
RakeCompilerDock.ruby_cc_version("~> 3.2")

# => "3.4.1:2.7.8"
RakeCompilerDock.ruby_cc_version("2.7", "3.4")
For example:

Note that the returned string will contain versions sorted in descending order.

- a Gem::Requirement object
- a String that can be used as a Gem::Requirement constructor argument
- a String that matches the minor version exactly

where each `requirement` may be:
Returns a valid RUBY_CC_VERSION string for the given requirements,
def ruby_cc_version(*requirements)
  cross = cross_rubies
  output = []
  if requirements.empty?
    output += cross.values
  else
    requirements.each do |requirement|
      if cross[requirement]
        output << cross[requirement]
      else
        requirement = Gem::Requirement.new(requirement) unless requirement.is_a?(Gem::Requirement)
        versions = cross.values.find_all { |v| requirement.satisfied_by?(Gem::Version.new(v)) }
        raise("No matching ruby version for requirement: #{requirement.inspect}") if versions.empty?
        output += versions
      end
    end
  end
  output.uniq.sort.reverse.join(":")
end

def set_ruby_cc_version(*requirements)

for the given requirements.
Set the environment variable `RUBY_CC_VERSION` to the value returned by `ruby_cc_version`,
def set_ruby_cc_version(*requirements)
  ENV["RUBY_CC_VERSION"] = ruby_cc_version(*requirements)
end

def sh(cmd, options={}, &block)

end
end
puts "windows cross build failed (status = #{res.exitstatus})"
if ! ok
sh %{bundle && rake cross native gem}, verbose: false do |ok, res|

Check exit status after command runs:

RakeCompilerDock.sh 'bundle && rake cross native gem'

Examples:

Default is "x86-mingw32 x64-mingw32" .
Option +:platform+ is ignored when +:rubyvm+ is set to +:jruby+.
If the list contains multiple values, +cmd+ is consecutively executed in each of the docker images,
+x64-mingw32+, +x86-linux-gnu+, +x86-mingw32+, +x86_64-darwin+, +x86_64-linux-gnu+.
Allowed values are +aarch64-linux-gnu+, +arm-linux-gnu+, +arm64-darwin+, +x64-mingw-ucrt+,
It selects the docker image(s) with an appropriate toolchain.
Option +:platform+ can be set to a list of space separated values.

It selects the docker image with an appropriate toolchain.
Option +:rubyvm+ can be set to +:mri+ or +:jruby+ .

If not set, rake's verbose flag is used.
Option +:verbose+ can be set to enable printing of the command line.

Without a block a RuntimeError is raised when the command exits non-zero.
If a block is given, upon command completion the block is called with an OK flag (true on a zero exit status) and a Process::Status object.

Run the command cmd within a fresh rake-compiler-dock container and within a shell.
def sh(cmd, options={}, &block)
  Starter.sh(cmd, options, &block)
end