@@ -10,6 +10,7 @@ use crate::core::builder::{Builder, Cargo as CargoCommand, RunConfig, ShouldRun,
10
10
use crate :: core:: config:: TargetSelection ;
11
11
use crate :: utils:: channel:: GitInfo ;
12
12
use crate :: utils:: exec:: BootstrapCommand ;
13
+ use crate :: utils:: helpers:: output;
13
14
use crate :: utils:: helpers:: { add_dylib_path, exe, t} ;
14
15
use crate :: Compiler ;
15
16
use crate :: Mode ;
@@ -804,6 +805,59 @@ impl Step for LlvmBitcodeLinker {
804
805
}
805
806
}
806
807
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
+
807
861
macro_rules! tool_extended {
808
862
( ( $sel: ident, $builder: ident) ,
809
863
$( $name: ident,
0 commit comments