@@ -43,17 +43,14 @@ fn main() {
43
43
env:: set_var ( "MOZCONFIG" , "" ) ;
44
44
45
45
let out_dir = PathBuf :: from ( env:: var_os ( "OUT_DIR" ) . unwrap ( ) ) ;
46
- let src_dir = out_dir. join ( "mozjs" ) ;
47
46
let build_dir = out_dir. join ( "build" ) ;
48
47
49
48
// Used by rust-mozjs downstream, don't remove.
50
49
println ! ( "cargo:outdir={}" , build_dir. display( ) ) ;
51
50
52
- copy_sources ( "mozjs" . as_ref ( ) , & src_dir) ;
53
-
54
51
fs:: create_dir_all ( & build_dir) . expect ( "could not create build dir" ) ;
55
52
56
- build_jsapi ( & src_dir , & build_dir) ;
53
+ build_jsapi ( & build_dir) ;
57
54
build_jsglue ( & build_dir) ;
58
55
build_jsapi_bindings ( & build_dir) ;
59
56
@@ -62,7 +59,11 @@ fn main() {
62
59
}
63
60
64
61
for entry in WalkDir :: new ( "mozjs" ) {
65
- println ! ( "cargo:rerun-if-changed={}" , entry. path( ) . display( ) ) ;
62
+ let entry = entry. unwrap ( ) ;
63
+ let path = entry. path ( ) ;
64
+ if !ignore ( path) {
65
+ println ! ( "cargo:rerun-if-changed={}" , path. display( ) ) ;
66
+ }
66
67
}
67
68
68
69
for file in EXTRA_FILES {
@@ -125,7 +126,7 @@ fn cc_flags() -> Vec<&'static str> {
125
126
result
126
127
}
127
128
128
- fn build_jsapi ( src_dir : & Path , build_dir : & Path ) {
129
+ fn build_jsapi ( build_dir : & Path ) {
129
130
let target = env:: var ( "TARGET" ) . unwrap ( ) ;
130
131
let mut make = find_make ( ) ;
131
132
@@ -160,7 +161,7 @@ fn build_jsapi(src_dir: &Path, build_dir: &Path) {
160
161
. args ( & [ "-R" , "-f" ] )
161
162
. arg ( cargo_manifest_dir. join ( "makefile.cargo" ) )
162
163
. current_dir ( & build_dir)
163
- . env ( "SRC_DIR" , & src_dir )
164
+ . env ( "SRC_DIR" , & cargo_manifest_dir . join ( "mozjs" ) )
164
165
. status ( )
165
166
. expect ( "Failed to run `make`" ) ;
166
167
assert ! ( result. success( ) ) ;
@@ -390,45 +391,19 @@ const MODULE_RAW_LINES: &'static [(&'static str, &'static str)] = &[
390
391
( "root::JS" , "pub type Rooted<T> = ::jsgc::Rooted<T>;" ) ,
391
392
] ;
392
393
393
- fn copy_sources ( source : & Path , target : & Path ) {
394
- for entry in WalkDir :: new ( source) {
395
- let entry = entry. expect ( "could not walk source tree" ) ;
396
- let relative_path = entry. path ( ) . strip_prefix ( & source) . unwrap ( ) ;
397
- let target_path = target. join ( relative_path) ;
398
-
399
- if entry. path ( ) . is_dir ( ) {
400
- if !target_path. exists ( ) {
401
- fs:: create_dir ( target_path) . expect ( "could not create directory" ) ;
402
- }
403
- } else {
404
- copy_file ( entry. path ( ) , & target_path)
405
- }
406
- }
407
- }
408
-
409
- fn copy_file ( source : & Path , target : & Path ) {
410
- if !target_is_up_to_date ( & source, & target) {
411
- fs:: copy ( & source, & target) . expect ( "could not copy file" ) ;
412
- }
413
- }
414
-
415
- fn target_is_up_to_date ( source : & Path , target : & Path ) -> bool {
416
- if !target. exists ( ) {
417
- return false ;
418
- }
419
-
420
- let source_metadata = source. metadata ( ) . expect ( "could not read source metadata" ) ;
421
- let target_metadata = target. metadata ( ) . expect ( "could not read target metadata" ) ;
422
-
423
- let source_modified = match source_metadata. modified ( ) {
424
- Ok ( modified) => modified,
425
- Err ( _) => return false ,
426
- } ;
427
-
428
- let target_modified = match target_metadata. modified ( ) {
429
- Ok ( modified) => modified,
430
- Err ( _) => return false ,
431
- } ;
432
-
433
- source_modified < target_modified
394
+ /// Rerun this build script if files under mozjs/ changed, unless this returns true.
395
+ /// Keep this in sync with .gitignore
396
+ fn ignore ( path : & Path ) -> bool {
397
+ let ignored_extensions = [ "pyc" , "so" , "dll" , "dylib" ] ;
398
+ let ignored_trailing_paths = [ [ "psutil" , "build" ] , [ "psutil" , "tmp" ] ] ;
399
+
400
+ path. extension ( ) . map_or ( false , |extension| {
401
+ ignored_extensions. iter ( ) . any ( |& ignored| extension == ignored)
402
+ } ) ||
403
+ ignored_trailing_paths. iter ( ) . any ( |trailing| {
404
+ let mut components = path. components ( ) . rev ( ) ;
405
+ trailing. iter ( ) . rev ( ) . all ( |& ignored| {
406
+ components. next ( ) . map_or ( false , |component| component. as_os_str ( ) == ignored)
407
+ } )
408
+ } )
434
409
}
0 commit comments