@@ -10,6 +10,7 @@ use crate::core::builder::{Builder, Cargo as CargoCommand, RunConfig, ShouldRun,
1010use crate :: core:: config:: TargetSelection ;
1111use crate :: utils:: channel:: GitInfo ;
1212use crate :: utils:: exec:: BootstrapCommand ;
13+ use crate :: utils:: helpers:: output;
1314use crate :: utils:: helpers:: { add_dylib_path, exe, t} ;
1415use crate :: Compiler ;
1516use crate :: Mode ;
@@ -804,6 +805,59 @@ impl Step for LlvmBitcodeLinker {
804805 }
805806}
806807
808+ #[ derive( Debug , Clone , Hash , PartialEq , Eq ) ]
809+ pub struct LibcxxVersionTool {
810+ pub target : TargetSelection ,
811+ }
812+
813+ #[ derive( Debug , Clone ) ]
814+ pub enum LibcxxVersion {
815+ Gnu ( usize ) ,
816+ #[ allow( dead_code) ]
817+ Llvm ( usize ) ,
818+ }
819+
820+ impl Step for LibcxxVersionTool {
821+ type Output = LibcxxVersion ;
822+ const DEFAULT : bool = false ;
823+ const ONLY_HOSTS : bool = true ;
824+
825+ fn should_run ( run : ShouldRun < ' _ > ) -> ShouldRun < ' _ > {
826+ run. never ( )
827+ }
828+
829+ fn run ( self , builder : & Builder < ' _ > ) -> LibcxxVersion {
830+ let out_dir = builder. out . join ( self . target . to_string ( ) ) . join ( "libcxx-version" ) ;
831+ let _ = fs:: remove_dir_all ( & out_dir) ;
832+ t ! ( fs:: create_dir_all( & out_dir) ) ;
833+
834+ let compiler = builder. cxx ( self . target ) . unwrap ( ) ;
835+ let mut cmd = Command :: new ( compiler) ;
836+
837+ let executable = out_dir. join ( "libcxx-version" ) ;
838+ cmd. arg ( "-o" ) . arg ( & executable) . arg ( builder. src . join ( "src/tools/libcxx-version/main.cpp" ) ) ;
839+
840+ builder. run_cmd ( & mut cmd) ;
841+
842+ if !executable. exists ( ) {
843+ panic ! ( "Something went wrong. {} is not present" , executable. display( ) ) ;
844+ }
845+
846+ let version_output = output ( & mut Command :: new ( executable) ) ;
847+
848+ let version_str = version_output. split_once ( "version:" ) . unwrap ( ) . 1 ;
849+ let version = version_str. trim ( ) . parse :: < usize > ( ) . unwrap ( ) ;
850+
851+ if version_output. starts_with ( "libstdc++" ) {
852+ LibcxxVersion :: Gnu ( version)
853+ } else if version_output. starts_with ( "libc++" ) {
854+ LibcxxVersion :: Llvm ( version)
855+ } else {
856+ panic ! ( "Coudln't recognize the standard library version." ) ;
857+ }
858+ }
859+ }
860+
807861macro_rules! tool_extended {
808862 ( ( $sel: ident, $builder: ident) ,
809863 $( $name: ident,
0 commit comments