Merge pull request #13328 from chrisroberts/windows-ext
Patch MakeMakefile for extension builds
This commit is contained in:
commit
8809fb6b68
@ -1,11 +1,12 @@
|
|||||||
# Copyright (c) HashiCorp, Inc.
|
# Copyright (c) HashiCorp, Inc.
|
||||||
# SPDX-License-Identifier: BUSL-1.1
|
# SPDX-License-Identifier: BUSL-1.1
|
||||||
|
|
||||||
require "log4r"
|
require "log4r"
|
||||||
|
|
||||||
# Add patches to log4r to support trace level
|
# Add patches to log4r to support trace level
|
||||||
require "vagrant/patches/log4r"
|
require "vagrant/patches/log4r"
|
||||||
require "vagrant/patches/net-ssh"
|
require "vagrant/patches/net-ssh"
|
||||||
|
require "vagrant/patches/rubygems"
|
||||||
|
|
||||||
# Set our log levels and include trace
|
# Set our log levels and include trace
|
||||||
require 'log4r/configurator'
|
require 'log4r/configurator'
|
||||||
Log4r::Configurator.custom_levels(*(["TRACE"] + Log4r::Log4rConfig::LogLevels))
|
Log4r::Configurator.custom_levels(*(["TRACE"] + Log4r::Log4rConfig::LogLevels))
|
||||||
|
|||||||
116
lib/vagrant/patches/builder/mkmf.rb
Normal file
116
lib/vagrant/patches/builder/mkmf.rb
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
# Copyright (c) HashiCorp, Inc.
|
||||||
|
# SPDX-License-Identifier: BUSL-1.1
|
||||||
|
|
||||||
|
# This custom mkmf.rb file is used on Windows platforms
|
||||||
|
# to handle common path related build failures where
|
||||||
|
# a space is included in the path. The default installation
|
||||||
|
# location being in Program Files results in most many
|
||||||
|
# extensions failing to build. These patches will attempt
|
||||||
|
# to find unquoted paths in flags and quote them prior to
|
||||||
|
# usage.
|
||||||
|
|
||||||
|
# Start with locating the real mkmf.rb file and
|
||||||
|
# loading it
|
||||||
|
mkmf_paths = $LOAD_PATH.find_all { |x|
|
||||||
|
!x.start_with?(__dir__) &&
|
||||||
|
File.exist?(File.join(x, "mkmf.rb"))
|
||||||
|
}.uniq
|
||||||
|
|
||||||
|
# At this point the path collection should only consist
|
||||||
|
# of a single entry. If there's more than one, load all
|
||||||
|
# of them but include a warning message that more than
|
||||||
|
# one was encountered. If none are found, then something
|
||||||
|
# bad is going on so just bail.
|
||||||
|
if mkmf_paths.size > 1
|
||||||
|
$stderr.puts "WARNING: Multiple mkmf.rb files located: #{mkmf_paths.inspect}"
|
||||||
|
elsif mkmf_paths.empty?
|
||||||
|
raise "Failed to locate mkmf.rb file"
|
||||||
|
end
|
||||||
|
|
||||||
|
mkmf_paths.each do |mpath|
|
||||||
|
require File.join(mpath, "mkmf.rb")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Attempt to detect and quote Windos paths found within
|
||||||
|
# the given string of flags
|
||||||
|
#
|
||||||
|
# @param [String] flags Compiler/linker flags
|
||||||
|
# @return [String] flags with paths quoted
|
||||||
|
def flag_cleaner(flags)
|
||||||
|
parts = flags.split(" -")
|
||||||
|
parts.map! do |p|
|
||||||
|
if p !~ %r{[A-Za-z]:(/|\\)}
|
||||||
|
next p
|
||||||
|
elsif p =~ %r{"[A-Za-z]:(/|\\).+"$}
|
||||||
|
next p
|
||||||
|
end
|
||||||
|
|
||||||
|
p.gsub(%r{([A-Za-z]:(/|\\).+)$}, '"\1"')
|
||||||
|
end
|
||||||
|
|
||||||
|
parts.join(" -")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Check values defined for CFLAGS, CPPFLAGS, LDFLAGS,
|
||||||
|
# and INCFLAGS for unquoted Windows paths and quote
|
||||||
|
# them.
|
||||||
|
def clean_flags!
|
||||||
|
$CFLAGS = flag_cleaner($CFLAGS)
|
||||||
|
$CPPFLAGS = flag_cleaner($CPPFLAGS)
|
||||||
|
$LDFLAGS = flag_cleaner($LDFLAGS)
|
||||||
|
$INCFLAGS = flag_cleaner($INCFLAGS)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Since mkmf loads the MakeMakefile module directly into the
|
||||||
|
# current scope, apply patches directly in the scope
|
||||||
|
def vagrant_create_makefile(*args)
|
||||||
|
clean_flags!
|
||||||
|
|
||||||
|
ruby_create_makefile(*args)
|
||||||
|
end
|
||||||
|
alias :ruby_create_makefile :create_makefile
|
||||||
|
alias :create_makefile :vagrant_create_makefile
|
||||||
|
|
||||||
|
def vagrant_append_cflags(*args)
|
||||||
|
result = ruby_append_cflags(*args)
|
||||||
|
clean_flags!
|
||||||
|
result
|
||||||
|
end
|
||||||
|
alias :ruby_append_cflags :append_cflags
|
||||||
|
alias :append_cflags :vagrant_append_cflags
|
||||||
|
|
||||||
|
def vagrant_append_cppflags(*args)
|
||||||
|
result = ruby_append_cppflags(*args)
|
||||||
|
clean_flags!
|
||||||
|
result
|
||||||
|
end
|
||||||
|
alias :ruby_append_cppflags :append_cppflags
|
||||||
|
alias :append_cppflags :vagrant_append_cppflags
|
||||||
|
|
||||||
|
def vagrant_append_ldflags(*args)
|
||||||
|
result = ruby_append_ldflags(*args)
|
||||||
|
clean_flags!
|
||||||
|
result
|
||||||
|
end
|
||||||
|
alias :ruby_append_ldflags :append_ldflags
|
||||||
|
alias :append_ldflags :vagrant_append_ldflags
|
||||||
|
|
||||||
|
def vagrant_cc_config(*args)
|
||||||
|
clean_flags!
|
||||||
|
ruby_cc_config(*args)
|
||||||
|
end
|
||||||
|
alias :ruby_cc_config :cc_config
|
||||||
|
alias :cc_config :vagrant_cc_config
|
||||||
|
|
||||||
|
def vagrant_link_config(*args)
|
||||||
|
clean_flags!
|
||||||
|
ruby_link_config(*args)
|
||||||
|
end
|
||||||
|
alias :ruby_link_config :link_config
|
||||||
|
alias :link_config :vagrant_link_config
|
||||||
|
|
||||||
|
# Finally, always append the flags that Vagrant has
|
||||||
|
# defined via the environment
|
||||||
|
append_cflags(ENV["CFLAGS"]) if ENV["CFLAGS"]
|
||||||
|
append_cppflags(ENV["CPPFLAGS"]) if ENV["CPPFLAGS"]
|
||||||
|
append_ldflags(ENV["LDFLAGS"]) if ENV["LDFLAGS"]
|
||||||
23
lib/vagrant/patches/rubygems.rb
Normal file
23
lib/vagrant/patches/rubygems.rb
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# Copyright (c) HashiCorp, Inc.
|
||||||
|
# SPDX-License-Identifier: BUSL-1.1
|
||||||
|
|
||||||
|
# This allows for effective monkey patching of the MakeMakefile
|
||||||
|
# module when building gem extensions. When gem extensions are
|
||||||
|
# built, the extconf.rb file is executed as a separate process.
|
||||||
|
# To support monkey patching the MakeMakefile module, the ruby
|
||||||
|
# executable path is adjusted to add a custom load path allowing
|
||||||
|
# a customized mkmf.rb file to load the proper mkmf.rb file, and
|
||||||
|
# then applying the proper patches.
|
||||||
|
if Gem.win_platform?
|
||||||
|
Gem.class_eval do
|
||||||
|
class << self
|
||||||
|
def vagrant_ruby
|
||||||
|
cmd = ruby_ruby
|
||||||
|
"#{cmd} -I\"#{Vagrant.source_root.join("lib/vagrant/patches/builder")}\""
|
||||||
|
end
|
||||||
|
|
||||||
|
alias_method :ruby_ruby, :ruby
|
||||||
|
alias_method :ruby, :vagrant_ruby
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
x
Reference in New Issue
Block a user