C++ stdlib check: don't check executables for deps
This avoids some possible false positives, as happens with, e.g., qt4.
This commit is contained in:
parent
8b969e981c
commit
edf474cb63
@ -164,6 +164,9 @@ class Build
|
|||||||
begin
|
begin
|
||||||
f.install
|
f.install
|
||||||
|
|
||||||
|
# This first test includes executables because we still
|
||||||
|
# want to record the stdlib for something that installs no
|
||||||
|
# dylibs.
|
||||||
stdlibs = Keg.new(f.prefix).detect_cxx_stdlibs
|
stdlibs = Keg.new(f.prefix).detect_cxx_stdlibs
|
||||||
# It's technically possible for the same lib to link to multiple
|
# It's technically possible for the same lib to link to multiple
|
||||||
# C++ stdlibs, but very bad news. Right now we don't track this
|
# C++ stdlibs, but very bad news. Right now we don't track this
|
||||||
@ -173,6 +176,13 @@ class Build
|
|||||||
# incompatibility.
|
# incompatibility.
|
||||||
stdlib_in_use.check_dependencies(f, deps)
|
stdlib_in_use.check_dependencies(f, deps)
|
||||||
|
|
||||||
|
# This second check is recorded for checking dependencies,
|
||||||
|
# so executable are irrelevant at this point. If a piece
|
||||||
|
# of software installs an executable that links against libstdc++
|
||||||
|
# and dylibs against libc++, libc++-only dependencies can safely
|
||||||
|
# link against it.
|
||||||
|
stdlibs = Keg.new(f.prefix).detect_cxx_stdlibs :skip_executables => true
|
||||||
|
|
||||||
Tab.create(f, ENV.compiler, stdlibs.first,
|
Tab.create(f, ENV.compiler, stdlibs.first,
|
||||||
Options.coerce(ARGV.options_only)).write
|
Options.coerce(ARGV.options_only)).write
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
|
|||||||
@ -125,6 +125,7 @@ class FormulaInstaller
|
|||||||
stdlib_in_use = CxxStdlib.new(stdlibs.first, MacOS.default_compiler)
|
stdlib_in_use = CxxStdlib.new(stdlibs.first, MacOS.default_compiler)
|
||||||
stdlib_in_use.check_dependencies(f, f.recursive_dependencies)
|
stdlib_in_use.check_dependencies(f, f.recursive_dependencies)
|
||||||
|
|
||||||
|
stdlibs = Keg.new(f.prefix).detect_cxx_stdlibs :skip_executables => true
|
||||||
tab = Tab.for_keg f.prefix
|
tab = Tab.for_keg f.prefix
|
||||||
tab.poured_from_bottle = true
|
tab.poured_from_bottle = true
|
||||||
tab.tabfile.delete if tab.tabfile
|
tab.tabfile.delete if tab.tabfile
|
||||||
|
|||||||
@ -66,10 +66,11 @@ class Keg
|
|||||||
# lib/, and ignores binaries and other mach-o objects
|
# lib/, and ignores binaries and other mach-o objects
|
||||||
# Note that this doesn't attempt to distinguish between libstdc++ versions,
|
# Note that this doesn't attempt to distinguish between libstdc++ versions,
|
||||||
# for instance between Apple libstdc++ and GNU libstdc++
|
# for instance between Apple libstdc++ and GNU libstdc++
|
||||||
def detect_cxx_stdlibs
|
def detect_cxx_stdlibs(opts={:skip_executables => false})
|
||||||
results = Set.new
|
results = Set.new
|
||||||
|
|
||||||
mach_o_files.each do |file|
|
mach_o_files.each do |file|
|
||||||
|
next if file.mach_o_executable? && opts[:skip_executables]
|
||||||
dylibs = file.dynamically_linked_libraries
|
dylibs = file.dynamically_linked_libraries
|
||||||
results << :libcxx unless dylibs.grep(/libc\+\+.+\.dylib/).empty?
|
results << :libcxx unless dylibs.grep(/libc\+\+.+\.dylib/).empty?
|
||||||
results << :libstdcxx unless dylibs.grep(/libstdc\+\+.+\.dylib/).empty?
|
results << :libstdcxx unless dylibs.grep(/libstdc\+\+.+\.dylib/).empty?
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user