diff --git a/lib/ExtUtils/CppGuess.pm b/lib/ExtUtils/CppGuess.pm index 0be5783..0a92fdf 100644 --- a/lib/ExtUtils/CppGuess.pm +++ b/lib/ExtUtils/CppGuess.pm @@ -405,7 +405,7 @@ sub _cc_is_clang { $self->{is_clang} = 0; my $cc_version = _capture( "$cc --version" ); if ( - $cc_version =~ m/\A(?:clang|apple llvm)/i + $cc_version =~ m/\A(?:(?:\S+ )?clang version|apple llvm)/i || $cc eq 'clang' # because why would they lie? || (($self->_config->{gccversion} || '') =~ /Clang|Apple LLVM/), ) { diff --git a/t/002_icpp.t b/t/002_icpp.t index 90b42a6..2d9b0d0 100644 --- a/t/002_icpp.t +++ b/t/002_icpp.t @@ -95,6 +95,61 @@ my @METHODS = qw( run_test(@$_) for @DATA; +# mock some compiler output +my $old_capture = \&ExtUtils::CppGuess::_capture; +our $CAPTURES; +{ + no warnings "redefine"; + *ExtUtils::CppGuess::_capture = + sub { + my @cmd = @_; + if (my $result = $CAPTURES->{"@cmd"}) { + note "Mocking output of @cmd: $result"; + return $result; + } + goto &$old_capture; + }; +} +my @CAPS = + ( + [ + { cc => "cc", config => { ccflags => '' } }, + { + is_sunstudio => 0, + is_msvc => undef, is_gcc => undef, is_clang => 1, + compiler_command => 'clang++ -xc++ -Wno-reserved-user-defined-literal', + linker_flags => '-lstdc++', + }, + { "cc --version" => "OpenBSD clang version 10.0.1" }, + ], + [ + { cc => "clang-15", config => { ccflags => '' } }, + { + is_sunstudio => 0, + is_msvc => undef, is_gcc => undef, is_clang => 1, + compiler_command => 'clang++ -xc++ -Wno-reserved-user-defined-literal', + linker_flags => '-lstdc++', + }, + { "clang-15 --version" => "Debian clang version 15.0.7" }, + ], + [ + { cc => "cc", config => { ccflags => '' } }, + { + is_sunstudio => 0, + is_msvc => undef, is_gcc => 1, is_clang => 0, + compiler_command => 'g++ -xc++', + linker_flags => '-lstdc++', + }, + { "cc --version" => "cc (Debian 12.2.0-14) 12.2.0" }, + ], + ); + +for my $test (@CAPS) { + my ($args, $expect, $cap) = @$test; + local $CAPTURES = $cap; + run_test($args, $expect); +} + done_testing; sub run_test {