2
3:- module(scan,
4 [
5 show_stored_targets/0,
6 collect_stored_targets/1,
7 collect_stored_targets/2,
8
9 stored_target/5
10 ]). 11:- use_module(biomake). 12
18:- dynamic stored_target/5.
24collect_stored_targets(Opts):-
25 collect_stored_targets('.',Opts).
26collect_stored_targets(Path,Opts):-
27 expand_file_name(Path,Dirs),
28 forall(member(Dir,Dirs),
29 ( dir_files_recursive(Dir,Files,[]),
30 forall(member(File,Files),
31 collect_file(File,Opts)))).
32
33dir_files_recursive(Dir,AllFiles,VL) :-
34 directory_files(Dir,Files),
35 findall(FilePath,(member(File,Files),
36 atomic_list_concat([Dir,/,File],FilePath)),
37 FilePaths),
38 debug(biomake,'dir files: ~w',[Dir]),
39 findall(FilePath,
40 ( member(Dir2,Files),
41 Dir2\='.',
42 Dir2\='..',
43 \+ member(Dir2,VL),
44 atomic_list_concat([Dir,/,Dir2],Dir3),
45 exists_directory(Dir3),
46 dir_files_recursive(Dir3,Files,[Dir2|VL]),
47 member(File,Files),
48 atomic_list_concat([Dir3,/,File],FilePath)
49 ),
50 Files2),
51 append(FilePaths,Files2,AllFiles).
52
53collect_file(File,Opts) :-
54 debug(biomake,'collecting: "~w"',[File]),
55 get_time(TimeChecked),
56 file_info(File,DL,Status,Opts),
57 debug(biomake,' info: ~w',[Status]),
58 time_file_wrap(File,TimeBuilt),
59 retractall(stored_target(File,_,_,_,_)),
60 assert(stored_target(File,DL,Status,TimeBuilt,TimeChecked)).
61
62file_info(T,DL,Status,Opts) :-
63 target_bindrule(T,Rule),
64 rule_dependencies(Rule,DL,Opts),
65 ( rebuild_required(T,DL,[],Opts)
66 -> Status=stale
67 ; Status=fresh),
68 !.
69file_info(_,[],unknown,_).
70
71time_file_wrap(F,T) :-
72 exists_file(F),
73 time_file(F,T),
74 !.
75time_file_wrap(_,-).
76
77show_stored_targets :-
78 forall(stored_target(T,DL,S,T1,T2),
79 (atomic_list_concat(DL,' ',DLA),
80 format("~w [~w] ~w ~w ~w~n",[T,DLA,S,T1,T2])))