Skip to content

Commit

Permalink
compilers/cpp: check libc++ vs libstdc++ harder
Browse files Browse the repository at this point in the history
Instead of hardcoding any values, hardcode what we think the most likely
implementation is, and check that first. It was pointed out that while
for example, Apple only provides libc++ and supports that for xcode, a
user could install a custom environment (such as homebrew) which uses
it's own copy of libstdc++, and we need to account for that. This means
that a library search will be done, but only once and the result will be
cached, on all systems.
  • Loading branch information
dcbaker committed Jul 6, 2023
1 parent dd3c392 commit 9930b8a
Showing 1 changed file with 11 additions and 14 deletions.
25 changes: 11 additions & 14 deletions mesonbuild/compilers/cpp.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,22 +206,19 @@ def language_stdlib_only_link_flags(self, env: Environment) -> T.List[str]:
machine = env.machines[self.for_machine]
assert machine is not None, 'for mypy'

# We need to determine whether to us libc++ or libstdc++ In some cases
# we know the answer, so we'll hardcode those cases. There are other
# cases where we can't know the answer just by looking at the OS, namely
# on Linux. In that case we have to fallback to manually checking
stdlib: str
# We need to determine whether to us libc++ or libstdc++. We can't
# really know the answer in most cases, only the most likely answer,
# because a user can install things themselves or build custom images.
search_order: T.List[str] = []
if machine.system in {'android', 'darwin', 'dragonfly', 'freebsd', 'netbsd', 'openbsd'}:
stdlib = 'c++'
elif self.find_library('c++', env, []) is not None:
stdlib = 'c++'
elif self.find_library('stdc++', env, []) is not None:
stdlib = 'stdc++'
search_order = ['c++', 'stdc++']
else:
# TODO: maybe a bug exception?
raise MesonException('Could not detect either libc++ or libstdc++ as your C++ stdlib implementation.')

return search_dirs + [f'-l{stdlib}']
search_order = ['stdc++', 'c++']
for lib in search_order:
if self.find_library(lib, env, []) is not None:
return search_dirs + [f'-l{lib}']
# TODO: maybe a bug exception?
raise MesonException('Could not detect either libc++ or libstdc++ as your C++ stdlib implementation.')


class ClangCPPCompiler(_StdCPPLibMixin, ClangCompiler, CPPCompiler):
Expand Down

0 comments on commit 9930b8a

Please sign in to comment.