diff --git a/Library/Homebrew/extend/os/mac/extend/ENV/super.rb b/Library/Homebrew/extend/os/mac/extend/ENV/super.rb index ca1dbf2c10..c928f4dda1 100644 --- a/Library/Homebrew/extend/os/mac/extend/ENV/super.rb +++ b/Library/Homebrew/extend/os/mac/extend/ENV/super.rb @@ -107,16 +107,17 @@ module Superenv # @private def setup_build_environment(formula = nil) - if formula&.requirements&.find { |req| req.is_a? XcodeRequirement } - self["HOMEBREW_SDKROOT"] = MacOS.sdk_path_if_needed && MacOS::Xcode.sdk_path - self["HOMEBREW_DEVELOPER_DIR"] = MacOS::Xcode.prefix - else - self["HOMEBREW_SDKROOT"] = MacOS.sdk_path_if_needed&.to_s - self["HOMEBREW_DEVELOPER_DIR"] = if MacOS::CLT.installed? && MacOS::CLT.provides_sdk? - MacOS::CLT::PKG_PATH - else + sdk = formula ? MacOS.sdk_for_formula(formula) : MacOS.sdk + if MacOS.sdk_root_needed? + self["HOMEBREW_SDKROOT"] = sdk.path + self["HOMEBREW_DEVELOPER_DIR"] = if sdk.source == :xcode MacOS::Xcode.prefix + else + MacOS::CLT::PKG_PATH end + else + self["HOMEBREW_SDKROOT"] = nil + self["HOMEBREW_DEVELOPER_DIR"] = nil end generic_setup_build_environment(formula) diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 705c868bca..80d6c5705e 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1352,8 +1352,7 @@ class Formula args << "-DHAVE_CLOCK_GETTIME:INTERNAL=0" if MacOS.version == "10.11" && MacOS::Xcode.version >= "8.0" # Ensure CMake is using the same SDK we are using. - sdk = MacOS.sdk_path_if_needed - args << "-DCMAKE_OSX_SYSROOT=#{sdk}" if sdk + args << "-DCMAKE_OSX_SYSROOT=#{MacOS.sdk_for_formula(self).path}" if MacOS.sdk_root_needed? args end diff --git a/Library/Homebrew/os/linux.rb b/Library/Homebrew/os/linux.rb index 82472db5ac..0c5d025859 100644 --- a/Library/Homebrew/os/linux.rb +++ b/Library/Homebrew/os/linux.rb @@ -53,6 +53,10 @@ module OS languages.first end + def sdk_root_needed? + false + end + def sdk_path_if_needed(_v = nil) nil end diff --git a/Library/Homebrew/os/mac.rb b/Library/Homebrew/os/mac.rb index 6163d11f23..5343d7def4 100644 --- a/Library/Homebrew/os/mac.rb +++ b/Library/Homebrew/os/mac.rb @@ -74,6 +74,17 @@ module OS @active_developer_dir ||= Utils.popen_read("/usr/bin/xcode-select", "-print-path").strip end + def sdk_root_needed? + if MacOS::CLT.installed? + # If there's no CLT SDK, return false + return false unless MacOS::CLT.provides_sdk? + # If the CLT is installed and headers are provided by the system, return false + return false unless MacOS::CLT.separate_header_package? + end + + true + end + # If a specific SDK is requested: # # 1. The requested SDK is returned, if it's installed. @@ -94,6 +105,13 @@ module OS @locator.sdk_if_applicable(v) end + def sdk_for_formula(f, v = nil) + # If the formula requires Xcode, don't return the CLT SDK + return Xcode.sdk if f.requirements.any? { |req| req.is_a? XcodeRequirement } + + sdk(v) + end + # Returns the path to an SDK or nil, following the rules set by {.sdk}. def sdk_path(v = nil) s = sdk(v) @@ -109,10 +127,7 @@ module OS # 4. On CLT-only systems with a CLT SDK, where headers are provided by the system, return nil. # 5. On CLT-only systems with a CLT SDK, where headers are not provided by the system, return the CLT SDK. - # If there's no CLT SDK, return early - return if MacOS::CLT.installed? && !MacOS::CLT.provides_sdk? - # If the CLT is installed and headers are provided by the system, return early - return if MacOS::CLT.installed? && !MacOS::CLT.separate_header_package? + return unless sdk_root_needed? sdk_path(v) end diff --git a/Library/Homebrew/os/mac/sdk.rb b/Library/Homebrew/os/mac/sdk.rb index a3a8dcf83d..156c41812d 100644 --- a/Library/Homebrew/os/mac/sdk.rb +++ b/Library/Homebrew/os/mac/sdk.rb @@ -5,11 +5,12 @@ require "os/mac/version" module OS module Mac class SDK - attr_reader :version, :path + attr_reader :version, :path, :source - def initialize(version, path) + def initialize(version, path, source) @version = OS::Mac::Version.new version @path = Pathname.new(path) + @source = source end end @@ -20,14 +21,14 @@ module OS path = sdk_paths[v] raise NoSDKError if path.nil? - SDK.new v, path + SDK.new v, path, source end def latest_sdk return if sdk_paths.empty? v, path = sdk_paths.max { |a, b| OS::Mac::Version.new(a[0]) <=> OS::Mac::Version.new(b[0]) } - SDK.new v, path + SDK.new v, path, source end def sdk_if_applicable(v = nil) @@ -48,6 +49,10 @@ module OS private + def source + nil + end + def source_version OS::Mac::Version::NULL end @@ -78,6 +83,10 @@ module OS class XcodeSDKLocator < BaseSDKLocator private + def source + :xcode + end + def source_version OS::Mac::Xcode.version end @@ -98,6 +107,10 @@ module OS class CLTSDKLocator < BaseSDKLocator private + def source + :clt + end + def source_version OS::Mac::CLT.version end