@@ -67,30 +67,47 @@ impl Step for Llvm {
67
67
}
68
68
}
69
69
70
- let rebuild_trigger = builder. src . join ( "src/rustllvm/llvm-rebuild-trigger" ) ;
71
- let rebuild_trigger_contents = t ! ( fs:: read_to_string( & rebuild_trigger) ) ;
72
-
73
- let ( out_dir, llvm_config_ret_dir) = if emscripten {
70
+ let ( submodule, root, out_dir, llvm_config_ret_dir) = if emscripten {
74
71
let dir = builder. emscripten_llvm_out ( target) ;
75
72
let config_dir = dir. join ( "bin" ) ;
76
- ( dir, config_dir)
73
+ ( "src/llvm-emscripten" , "src/llvm-emscripten" , dir, config_dir)
77
74
} else {
78
75
let mut dir = builder. llvm_out ( builder. config . build ) ;
79
76
if !builder. config . build . contains ( "msvc" ) || builder. config . ninja {
80
77
dir. push ( "build" ) ;
81
78
}
82
- ( builder. llvm_out ( target) , dir. join ( "bin" ) )
79
+ ( "src/llvm-project" , "src/llvm-project/llvm" , builder. llvm_out ( target) , dir. join ( "bin" ) )
83
80
} ;
84
- let done_stamp = out_dir. join ( "llvm-finished-building" ) ;
81
+
82
+ let git_output = t ! ( Command :: new( "git" )
83
+ . args( & [ "rev-parse" , "--verify" , & format!( "@:./{}" , submodule) ] )
84
+ . current_dir( & builder. src)
85
+ . output( ) ) ;
86
+
87
+ let llvm_commit = if git_output. status . success ( ) {
88
+ Some ( git_output. stdout )
89
+ } else {
90
+ println ! (
91
+ "git could not determine the LLVM submodule commit hash ({}). \
92
+ Assuming that an LLVM build is necessary.",
93
+ String :: from_utf8_lossy( & git_output. stderr) ,
94
+ ) ;
95
+ None
96
+ } ;
97
+
85
98
let build_llvm_config = llvm_config_ret_dir
86
99
. join ( exe ( "llvm-config" , & * builder. config . build ) ) ;
87
- if done_stamp. exists ( ) {
88
- let done_contents = t ! ( fs:: read_to_string( & done_stamp) ) ;
100
+ let done_stamp = out_dir. join ( "llvm-finished-building" ) ;
89
101
90
- // If LLVM was already built previously and contents of the rebuild-trigger file
91
- // didn't change from the previous build, then no action is required.
92
- if done_contents == rebuild_trigger_contents {
93
- return build_llvm_config
102
+ if let Some ( llvm_commit) = & llvm_commit {
103
+ if done_stamp. exists ( ) {
104
+ let done_contents = t ! ( fs:: read( & done_stamp) ) ;
105
+
106
+ // If LLVM was already built previously and the submodule's commit didn't change
107
+ // from the previous build, then no action is required.
108
+ if done_contents == llvm_commit. as_slice ( ) {
109
+ return build_llvm_config
110
+ }
94
111
}
95
112
}
96
113
@@ -101,7 +118,6 @@ impl Step for Llvm {
101
118
t ! ( fs:: create_dir_all( & out_dir) ) ;
102
119
103
120
// http://llvm.org/docs/CMake.html
104
- let root = if self . emscripten { "src/llvm-emscripten" } else { "src/llvm-project/llvm" } ;
105
121
let mut cfg = cmake:: Config :: new ( builder. src . join ( root) ) ;
106
122
107
123
let profile = match ( builder. config . llvm_optimize , builder. config . llvm_release_debuginfo ) {
@@ -279,7 +295,9 @@ impl Step for Llvm {
279
295
280
296
cfg. build ( ) ;
281
297
282
- t ! ( fs:: write( & done_stamp, & rebuild_trigger_contents) ) ;
298
+ if let Some ( llvm_commit) = llvm_commit {
299
+ t ! ( fs:: write( & done_stamp, & llvm_commit) ) ;
300
+ }
283
301
284
302
build_llvm_config
285
303
}
0 commit comments