# depgraph
Makefile-style build of native stuff, for use in build.rs. Checks modified
times on output and input files, and then runs operation if there are changes
to input files.
# Example
This example builds object files from assembly using yasm when the assembly
files change.
```rust
extern crate depgraph;
use std::path::Path;
use std::{fs, env};
use std::process::Command;
fn build_assembly(out: &Path, deps: &[&Path]) -> Result<(), String> {
// Make sure the folder we're going to output to exists.
let out_dir = out.parent().unwrap();
fs::create_dir_all(out_dir).unwrap();
// Run the command with correct argument order
Command::new("yasm").args(&["-f", "elf64", "-o"]).arg(out).args(deps)
.status().unwrap();
// Everything went ok so we return Ok(()). Instead of panicking, we could
// have returned an error message and handled it in main.
Ok(())
}
fn main() {
// Get the directory we should put files in.
let out_dir = env::var("OUT_DIR").unwrap();
let out_dir = Path::new(&out_dir);
// Create the graph builder
let graph = depgraph::DepGraphBuilder::new()
// Add a rule to build an object file from an asm file using the build
// script in `build_assembly`.
.add_rule(out_dir.join("out/path/file.o"),
&[Path::new("src/input_file.asm")],
build_assembly)
// Build the graph, internally this checks for cyclic dependencies.
.build().unwrap();
// Run the necessary build scripts in the correct order.
graph.make(depgraph::MakeParams::None).unwrap();
}
```
# TODO
1. Preserve dependency order
2. Automated tests
3. More generics (not sure if this would add anything)
3. Optimizations (again not sure this would add anything)