diff --git a/meta/build.py b/meta/build.py index 76673fa62b..24d9f286ee 100644 --- a/meta/build.py +++ b/meta/build.py @@ -5,6 +5,7 @@ import argparse import target import gen_instr +import gen_build_deps parser = argparse.ArgumentParser(description='Generate sources for Cretonne.') parser.add_argument('--out-dir', help='set output directory') @@ -15,3 +16,4 @@ out_dir = args.out_dir targets = target.all_targets() gen_instr.generate(targets, out_dir) +gen_build_deps.generate() diff --git a/meta/gen_build_deps.py b/meta/gen_build_deps.py new file mode 100644 index 0000000000..4d0c0cb260 --- /dev/null +++ b/meta/gen_build_deps.py @@ -0,0 +1,36 @@ +""" +Generate build dependencies for Cargo. + +The `build.py` script is invoked by cargo when building libcretonne to +generate Rust code from the instruction descriptions. Cargo needs to know when +it is necessary to rerun the build script. + +If the build script outputs lines of the form: + + cargo:rerun-if-changed=/path/to/file + +cargo will rerun the build script when those files have changed since the last +build. +""" + +import os +from os.path import dirname, abspath, join + + +def source_files(top): + """ + Recursively find all interesting source files and directories in the + directory tree starting at top. Yield a path to each file. + """ + for (dirpath, dirnames, filenames) in os.walk(top): + yield dirpath + for f in filenames: + if f.endswith('.py'): + yield join(dirpath, f) + + +def generate(): + print "Dependencies from meta language directory:" + meta = dirname(abspath(__file__)) + for path in source_files(meta): + print "cargo:rerun-if-changed=" + path diff --git a/src/libcretonne/build.rs b/src/libcretonne/build.rs index 523ddb3548..c275e33e53 100644 --- a/src/libcretonne/build.rs +++ b/src/libcretonne/build.rs @@ -32,9 +32,6 @@ fn main() { let meta_dir = top_dir.join("meta"); let build_script = meta_dir.join("build.py"); - // Let Cargo known that this script should be rerun if anything changes in the meta directory. - println!("cargo:rerun-if-changed={}", meta_dir.display()); - // Launch build script with Python. We'll just find python in the path. let status = process::Command::new("python") .current_dir(top_dir)