4 ms·
We've been using memoize to build stuff for a while now, but we needed something that worked under Windows too. So here's our "fabricate" build tool. It's BSD l
by benhoyt 17y ago
We've been using memoize to build stuff for a while now, but we needed something that worked under Windows too. So here's our "fabricate" build tool. It's BSD licensed -- enjoy!
- loup-vaillant 17y agoI don't get it. Does it intercept file accesses to determine the dependencies? Looks like magic.
- silentbicycle 17y agoYes, via access times and strace: "When this build stage ran, it checked these files, so remember them as dependencies." Not magic at all, and should automatically work for languages that haven't even been invented yet.
- joe_bleau 17y agoCan it tell (using access times under windows) that the files were modified by that stage of the build command, and not by another unrelated process? How does it know which drives and directories to scan for recently modified files? Scanning all of them would take a while.
- silentbicycle 17y agoIt uses strace, a Linux-specific file change notification hook. It's not available on BSD or (IIRC) OS X, though ktrace is, so it could conceivably be ported. (The page says something vague about cygwin having a comparable hook to strace. I haven't developed for cygwin, though.) It looks like it checks for files modified specifically by its subprocesses.
- modeless 17y agoIt is possible to do strace-like stuff on Windows too as evidenced by Process Monitor. http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx http://technet.microsoft.com/en-us/sysinternals/bb896645.asp... If scanning atimes is too slow or unreliable, perhaps fabricate could be updated to use procmon?
- benhoyt 17y agoHere's a version of strace for Windows: http://www.intellectualheaven.com/default.asp?BH=projects&H=strace.htm http://www.intellectualheaven.com/default.asp?BH=projects... I've hacked it to print the actual file names on CreateFile() calls, but it's failing because it doesn't recurse and trace sub-processes. It should be theoretically possible by hooking CreateProcess(), but it's probably hard.
- kragen 17y agoDoes it scan your entire filesystem for atimes so as not to miss the .h files over in /usr/include, and if not, how does it know which directories need scanning?
- benhoyt 17y agoNo, it defaults to recursively scanning the current directory, but you can easily override this if you want, eg: setup(dirs=['.', '../lib'])