44
55import argparse
66from pymakeutils .common import list_dependents
7+ import sys
78
89
910def parse_args ():
@@ -18,6 +19,13 @@ def parse_args():
1819 '--recursive' ,
1920 action = 'store_true' ,
2021 help = "Recursively include transitive dependents" )
22+ parser .add_argument (
23+ '-M' ,
24+ '--emit-makefrag' ,
25+ action = 'store_true' ,
26+ help = "Instead of outputting a list of Make targets, emit a Makefile fragment "
27+ "conditionally including each prerequisite if MAKE_CMD_GOALS includes "
28+ "any of its dependent targets." )
2129 parser .add_argument (
2230 '-d' ,
2331 '--debug' ,
@@ -26,19 +34,38 @@ def parse_args():
2634 return parser .parse_args ()
2735
2836
29- def main ():
30- args = parse_args ()
37+ def emit_makefrag (prerequisites , recursive , debug ):
38+ s = "-include "
39+ for p in sorted (set (prerequisites )):
40+ targets = list_dependents (p , recursive = recursive , debug = debug )
41+
42+ if not targets :
43+ print (f'Warning: no targets depend on prerequisite { p } .' , file = sys .stderr )
44+ continue
45+
46+ target_list = " " .join (sorted (targets ))
47+ s += f"$(if $(filter { target_list } ,$(MAKECMDGOALS)),{ p } ) "
48+ print (s .strip ())
3149
50+
51+ def emit_targets (prerequisites , recursive , debug ):
3252 # Take the union of all dependent targets for the given prerequisites
3353 all_deps = set ()
34- for p in args . prerequisites :
54+ for p in prerequisites :
3555 all_deps .update (
36- list_dependents (p , recursive = args . recursive , debug = args . debug )
56+ list_dependents (p , recursive = recursive , debug = debug )
3757 )
38- dependents = sorted (all_deps )
58+ print ('\n ' .join (sorted (all_deps )))
59+
60+
61+ def main ():
62+ args = parse_args ()
3963
40- # Print the list of dependent targets
41- print ('\n ' .join (dependents ))
64+ if args .emit_makefrag :
65+ emit = emit_makefrag
66+ else :
67+ emit = emit_targets
68+ emit (args .prerequisites , args .recursive , args .debug )
4269
4370
4471if __name__ == "__main__" :
0 commit comments