Xkvt is a tool that runs a series of commands and automatically determines the input/output files that are consumed/produced by each command. It can then output a build file for Make or Knit, or a generic JSON representation.
Xkvt uses ptrace to determine what files are read and written by each command.
Xkvt only supports Linux AMD64.
Suppose you have foo.c, bar.c and bar.h (see example/). The program could be built by running
gcc -Wall -O2 -c foo.c -o foo.o
gcc -Wall -O2 -c bar.c -o bar.o
gcc -Wall -O2 bar.o foo.o -o prog
These commands are in build.sh. If you run these commands through Xkvt, it can automatically produce a Makefile for this build:
$ xkvt -i build.sh -f make -o Makefile
gcc -Wall -O2 -c foo.c -o foo.o
gcc -Wall -O2 -c bar.c -o bar.o
gcc -Wall -O2 bar.o foo.o -o prog
$ cat Makefile
foo.o: foo.c bar.h
gcc -Wall -O2 -c foo.c -o foo.o
bar.o: bar.c
gcc -Wall -O2 -c bar.c -o bar.o
prog: bar.o foo.o
gcc -Wall -O2 bar.o foo.o -o prog
Note that Xkvt automatically detects that foo.o depends on bar.h (as well as foo.c).
Xkvt can also output a Knitfile, or a generic JSON representation that looks like this:
Show JSON
{
"Commands": [
{
"Command": "gcc -Wall -O2 -c foo.c -o foo.o",
"Inputs": ["foo.c", "bar.h"],
"Outputs": ["foo.o"]
},
{
"Command": "gcc -Wall -O2 -c bar.c -o bar.o",
"Inputs": ["bar.c"],
"Outputs": ["bar.o"]
},
{
"Command": "gcc -Wall -O2 bar.o foo.o -o prog",
"Inputs": ["bar.o", "foo.o"],
"Outputs": ["prog"]
}
]
}
Usage of xkvt:
-f, --format string output format (default "json")
-h, --help show this help message
-i, --input string input file
-o, --output string output file
-V, --verbose verbose debugging information