I've only had time to skim this so apologies if my reply is (even more) off
topic but the use of strace implies that you're doing what I call file
auditing, tracking file usage via open system calls and the like. In this
context I could mention a couple of my old OSS projects:

1. Poor Man's File Audit: https://github.com/boyski/pmaudit

This is a very lightweight way of autodiscovering file usage by monitoring
metadata (atime, mtime). I won't say more here since it would just repeat
the README.

2. Audited Objects: https://github.com/boyski/audited-objects

This is a more involved C program for Linux use which works by intercepting
system calls in user space which I had to abandon some years ago due to
day-job pressures. Roughly analogous to strace which at this point may be a
better choice unless you get into advanced usage. You definitely don't want
to touch the server side of this, which was being rewritten when I had to
abandon it, but the client worked pretty well when I dropped it. Close to
dead but mentioned for completeness.

David Boyce

On Fri, Dec 28, 2018 at 5:36 PM Brian Vandenberg <phantall+gnum...@gmail.com>
wrote:

> > blah.h : blah.cc
>> >> no real recipe was provided, just adding this note for emphasis; this
>> > last part is how I suggest you solve it
>>
>> Perfect but this does not work in the situations I am interested in,
>> that is where one single atomic command produces several files. Example:
>> pdflatex produces several files and there are cases where you want to
>> track some of them, e.g. document.pdf and document.aux.
>> --
>> Renaud
>>
>
> I may be mistaken, but this sounds like a problem I tried tackling: force
> PDF's to re-build if any of its dependencies changed.  I started with
> pdftex's "-recorder" flag, but it doesn't allow you to control output
> filename / directory and there were other problems that made it completely
> un-suited to generating a dependency list.  After looking at all the docs,
> what others on the internet tried, etc, I was ready to throw in the towel.
>
> The following ugly hack came about as I was thinking about how nice it'd
> be if I had something "magic" (eg, tup's use of fuse) to 'discover' what
> files were accessed; this is roughly what I threw together:
>
> $ cat blah.sh
> #!/bin/bash
> set -euo pipefail
> strace -y -f -o blah.dep.tmp pdflatex -halt-on-error
> -interaction=batchmode "${@}"
> perl -ni -e 'while( m{<([^>]+)>}g ) { my $tmp = $1; $tmp =~ m{'^$(pwd)'}
> && print "$tmp\n"}' blah.dep.tmp
> echo "${@} : $(sort -u blah.dep.tmp)" > blah.dep
>
> $ cat makefile
> -include $(shell find docs -name '*.dep')
> # note lack of dependencies listed; they come from the .dep files
> %.pdf :
> > blah.sh ${@}
>
> Explanation:
> * First time the build runs .dep files don't exist and it'll just assume
> everything is ok; subsequent builds will have all necessary dependencies
> * The "-y" flag in strace causes it to emit paths or descriptive text (eg,
> socket:12344321) in <>s for file descriptor arguments to functions:
> fstat(3</path/to/some/file>, {st_mode=S_IFREG|0644, st_size=170187, ...})
> = 0
> * The paths within <> are always fully qualified; the perl one-liner
> extracts each path and if it is a descendent of $(pwd) it gets printed;
> obviously the paths need to be filtered further to distinguish between
> output -vs- input, etc; the above is just a rough sketch
>
> Problems:
> * It's stupid; clever, but stupid
> * Platforms without strace would require a different solution
> * The "-y" flag is a relatively recent addition to strace; without it,
> extracting valid paths is more error prone.
>
> dtrace (solaris/bsd) and system tap (linux) scripts are also an option; in
> fact if I weren't looking at moving to tup I'd probably go that route.  The
> only hurdle there is that execution of the script would either require the
> user to have special permissions or the script needs to be owned by a user
> with those special permissions & marked setuid so normal users can execute
> it.
>
> -brian
>
> _______________________________________________
> Bug-make mailing list
> Bug-make@gnu.org
> https://lists.gnu.org/mailman/listinfo/bug-make
>
_______________________________________________
Bug-make mailing list
Bug-make@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-make

Reply via email to