Reorganize superenv include and library path setup
I found the dual use of CMAKE_*_PATH variables to make it difficult to reason about this code. Now a separate set of variables are used to communicate with the cc wrapper, and less work is performed in the wrapper itself. We no longer pass the SDK include path as a -isystem directory on Xcode-only setups. Doing so is redundant with `--sysroot` and has other side effects, namely changing the include path search order, which can break compilation of some software (e.g. qemu). On Xcode-only 10.9, we can additionally omit `--sysroot`, as the correct paths are built into the tools. A new variable, HOMEBREW_SYSROOT, is used to this information to the wrapper. It will be unset on Xcode-only 10.9. HOMEBREW_SDKROOT will continue to be set, as it is used for other things besides setting the include search path.
This commit is contained in:
parent
10bd849bd3
commit
613292e3ce
@ -26,14 +26,14 @@ end
|
||||
LOGGER = Logger.new
|
||||
|
||||
class Cmd
|
||||
attr_reader :brewfix, :brewtmp, :sdkroot
|
||||
attr_reader :brewfix, :brewtmp, :sysroot
|
||||
|
||||
def initialize path, args
|
||||
@arg0 = File.basename(path).freeze
|
||||
@args = args.freeze
|
||||
@brewfix = ENV['HOMEBREW_PREFIX']
|
||||
@brewtmp = ENV['HOMEBREW_TEMP']
|
||||
@sdkroot = ENV['HOMEBREW_SDKROOT']
|
||||
@sysroot = ENV['HOMEBREW_SYSROOT']
|
||||
end
|
||||
|
||||
def mode
|
||||
@ -89,11 +89,11 @@ class Cmd
|
||||
args = refurbished_args
|
||||
end
|
||||
|
||||
if sdkroot
|
||||
if sysroot
|
||||
if tool == "ld"
|
||||
args << "-syslibroot" << sdkroot
|
||||
args << "-syslibroot" << sysroot
|
||||
else
|
||||
args << "--sysroot=#{sdkroot}"
|
||||
args << "--sysroot=#{sysroot}"
|
||||
end
|
||||
end
|
||||
|
||||
@ -118,8 +118,8 @@ class Cmd
|
||||
end
|
||||
|
||||
def refurbished_args
|
||||
@lset = Set.new(libpath + syslibpath)
|
||||
@iset = Set.new(cpath.flatten)
|
||||
@lset = Set.new(library_paths + system_library_paths)
|
||||
@iset = Set.new(isystem_paths + include_paths)
|
||||
|
||||
args = []
|
||||
enum = @args.each
|
||||
@ -241,40 +241,12 @@ class Cmd
|
||||
ENV["HOMEBREW_ARCHFLAGS"].split(" ")
|
||||
end
|
||||
|
||||
def syspath
|
||||
if sdkroot
|
||||
%W{#{sdkroot}/usr /usr/local}
|
||||
else
|
||||
%W{/usr /usr/local}
|
||||
end
|
||||
end
|
||||
|
||||
def syslibpath
|
||||
# We reject brew's lib as we explicitly add this as a -L flag, thus it
|
||||
# is given higher priority by cc, so it surpasses the system libpath.
|
||||
# NOTE this only counts if Homebrew is installed at /usr/local
|
||||
syspath.reject { |d| d == brewfix }.map! { |d| File.join(d, "lib") }
|
||||
end
|
||||
|
||||
# Paths added as "-isystem<path>" and "-I<path>" flags
|
||||
def cpath
|
||||
cpath = path_split("CMAKE_PREFIX_PATH").map! { |d| File.join(d, "include") }
|
||||
cpath += path_split("CMAKE_INCLUDE_PATH")
|
||||
opt = cpath.grep(%r{^#{Regexp.escape(brewfix)}/opt}o)
|
||||
sys = cpath - opt
|
||||
[sys, opt]
|
||||
end
|
||||
|
||||
# Paths added as "-L<path>" flags
|
||||
def libpath
|
||||
libpath = path_split("CMAKE_PREFIX_PATH").map! { |d| File.join(d, "lib") }
|
||||
libpath += path_split("CMAKE_LIBRARY_PATH")
|
||||
libpath -= syslibpath
|
||||
libpath
|
||||
def cppflags
|
||||
path_flags("-isystem", isystem_paths) + path_flags("-I", include_paths)
|
||||
end
|
||||
|
||||
def ldflags
|
||||
args = path_flags("-L", libpath)
|
||||
args = path_flags("-L", library_paths)
|
||||
case mode
|
||||
when :ld
|
||||
args << "-headerpad_max_install_names"
|
||||
@ -284,12 +256,20 @@ class Cmd
|
||||
args
|
||||
end
|
||||
|
||||
# Keg-only opt paths get the "-I" treatment since it has higher priority than
|
||||
# "-isystem", and we want them to be searched before system directories as
|
||||
# well as any directories added by the build system.
|
||||
def cppflags
|
||||
sys, opt = cpath
|
||||
path_flags("-isystem", sys) + path_flags("-I", opt)
|
||||
def isystem_paths
|
||||
path_split("HOMEBREW_ISYSTEM_PATHS")
|
||||
end
|
||||
|
||||
def include_paths
|
||||
path_split("HOMEBREW_INCLUDE_PATHS")
|
||||
end
|
||||
|
||||
def library_paths
|
||||
path_split("HOMEBREW_LIBRARY_PATHS")
|
||||
end
|
||||
|
||||
def system_library_paths
|
||||
%W{#{sysroot}/usr/lib /usr/local/lib}
|
||||
end
|
||||
|
||||
def make_fuss args
|
||||
|
||||
@ -66,6 +66,15 @@ module Superenv
|
||||
self['CMAKE_LIBRARY_PATH'] = determine_cmake_library_path
|
||||
self['ACLOCAL_PATH'] = determine_aclocal_path
|
||||
self['M4'] = MacOS.locate("m4") if deps.include? "autoconf"
|
||||
self["HOMEBREW_ISYSTEM_PATHS"] = determine_isystem_paths
|
||||
self["HOMEBREW_INCLUDE_PATHS"] = determine_include_paths
|
||||
self["HOMEBREW_LIBRARY_PATHS"] = determine_library_paths
|
||||
|
||||
# On 10.9 the developer tools honor the correct sysroot by default.
|
||||
# On 10.7 and 10.8 we need to set it ourselves.
|
||||
if MacOS::Xcode.without_clt? && MacOS.version <= "10.8"
|
||||
self["HOMEBREW_SYSROOT"] = effective_sysroot
|
||||
end
|
||||
|
||||
# On 10.9, the tools in /usr/bin proxy to the active developer directory.
|
||||
# This means we can use them for any combination of CLT and Xcode.
|
||||
@ -100,6 +109,10 @@ module Superenv
|
||||
self["HOMEBREW_CXX"] = super
|
||||
end
|
||||
|
||||
def effective_sysroot
|
||||
if MacOS::Xcode.without_clt? then MacOS.sdk_path.to_s else "" end
|
||||
end
|
||||
|
||||
def determine_cc
|
||||
cc = compiler
|
||||
COMPILER_SYMBOL_MAP.invert.fetch(cc, cc)
|
||||
@ -159,40 +172,53 @@ module Superenv
|
||||
paths.to_path_s
|
||||
end
|
||||
|
||||
def determine_cmake_prefix_path
|
||||
paths = keg_only_deps.map{|dep| "#{HOMEBREW_PREFIX}/opt/#{dep}" }
|
||||
paths << HOMEBREW_PREFIX.to_s # put ourselves ahead of everything else
|
||||
paths << "#{MacOS.sdk_path}/usr" if MacOS::Xcode.without_clt?
|
||||
def determine_isystem_paths
|
||||
paths = []
|
||||
paths << "#{HOMEBREW_PREFIX}/include"
|
||||
paths << "#{effective_sysroot}/usr/include/libxml2" unless deps.include? "libxml2"
|
||||
paths << "#{effective_sysroot}/usr/include/apache2" if MacOS::Xcode.without_clt?
|
||||
paths << "#{effective_sysroot}/System/Library/Frameworks/OpenGL.framework/Versions/Current/Headers"
|
||||
paths << MacOS::X11.include.to_s << "#{MacOS::X11.include}/freetype2" if x11?
|
||||
paths.to_path_s
|
||||
end
|
||||
|
||||
def determine_cmake_frameworks_path
|
||||
paths = deps.map{|dep| "#{HOMEBREW_PREFIX}/opt/#{dep}/Frameworks" }
|
||||
paths << "#{MacOS.sdk_path}/System/Library/Frameworks" if MacOS::Xcode.without_clt?
|
||||
def determine_include_paths
|
||||
keg_only_deps.map { |dep| "#{HOMEBREW_PREFIX}/opt/#{dep}/include" }.to_path_s
|
||||
end
|
||||
|
||||
def determine_library_paths
|
||||
paths = keg_only_deps.map { |dep| "#{HOMEBREW_PREFIX}/opt/#{dep}/lib" }
|
||||
paths << "#{HOMEBREW_PREFIX}/lib"
|
||||
paths << "#{effective_sysroot}/System/Library/Frameworks/OpenGL.framework/Versions/Current/Libraries"
|
||||
paths << MacOS::X11.lib.to_s if x11?
|
||||
paths.to_path_s
|
||||
end
|
||||
|
||||
def determine_cmake_prefix_path
|
||||
paths = keg_only_deps.map { |dep| "#{HOMEBREW_PREFIX}/opt/#{dep}" }
|
||||
paths << HOMEBREW_PREFIX.to_s
|
||||
paths.to_path_s
|
||||
end
|
||||
|
||||
def determine_cmake_include_path
|
||||
sdk = MacOS.sdk_path if MacOS::Xcode.without_clt?
|
||||
paths = []
|
||||
paths << "#{sdk}/usr/include/libxml2" unless deps.include? 'libxml2'
|
||||
paths << "#{sdk}/usr/include/apache2" if MacOS::Xcode.without_clt?
|
||||
if x11?
|
||||
paths << MacOS::X11.include << "#{MacOS::X11.include}/freetype2"
|
||||
else
|
||||
paths << "#{sdk}/System/Library/Frameworks/OpenGL.framework/Versions/Current/Headers"
|
||||
end
|
||||
paths << "#{effective_sysroot}/usr/include/libxml2" unless deps.include? "libxml2"
|
||||
paths << "#{effective_sysroot}/usr/include/apache2" if MacOS::Xcode.without_clt?
|
||||
paths << "#{effective_sysroot}/System/Library/Frameworks/OpenGL.framework/Versions/Current/Headers"
|
||||
paths << MacOS::X11.include.to_s << "#{MacOS::X11.include}/freetype2" if x11?
|
||||
paths.to_path_s
|
||||
end
|
||||
|
||||
def determine_cmake_library_path
|
||||
sdk = MacOS.sdk_path if MacOS::Xcode.without_clt?
|
||||
paths = []
|
||||
if x11?
|
||||
paths << MacOS::X11.lib
|
||||
else
|
||||
paths << "#{sdk}/System/Library/Frameworks/OpenGL.framework/Versions/Current/Libraries"
|
||||
end
|
||||
paths << "#{effective_sysroot}/System/Library/Frameworks/OpenGL.framework/Versions/Current/Libraries"
|
||||
paths << MacOS::X11.lib.to_s if x11?
|
||||
paths.to_path_s
|
||||
end
|
||||
|
||||
def determine_cmake_frameworks_path
|
||||
paths = deps.map { |dep| "#{HOMEBREW_PREFIX}/opt/#{dep}/Frameworks" }
|
||||
paths << "#{effective_sysroot}/System/Library/Frameworks" if MacOS::Xcode.without_clt?
|
||||
paths.to_path_s
|
||||
end
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user