%% Boris Kolpackov <[EMAIL PROTECTED]> writes: bk> I came to the point where I cannot work around "default target bk> hijacking" problem. So I am planning to do something about it in bk> my -bk patch-set. I also hope this feature will end up in the main bk> stream thus this RFC.
bk> When makefile inclusion is used there is a recurring problem of bk> default target hijacking by auxiliary targets. For example I bk> have the following pattern: bk> 1. User `makefile' includes `bootstrap.make' to bootstrap build bk> system. bk> 2. `bootstrap.make' includes configuration makefiles that are bk> generated automatically. Rules for those configuration files bk> hijack default target. bk> # file: bootstrap.make bk> out_root := initialize-output-root bk> $(out_root)/configuration: bk> configure $@ bk> include $(out_root)/configuration bk> # file: makefile bk> include bootstrap.make bk> $(out_root)/driver: driver.c The way I typically solve this is that I always define the target I want to be the default first, with no prerequisites etc. Simply putting something like: all: by itself at the top of the first makefile is enough to force make to consider that target to be the default. So, in your example you could change your makefile to: # file: makefile all: include boostrap.make all: $(out_root)/driver $(out_root)/driver: driver.c Alternatively, if you have a makefile which is always included at the top (say your bootstrap.make file) you can put the "all" target in that file as the first thing: # file: bootstrap.make .PHONY: all all: out_root := initialize-output-root $(out_root)/configuration: configure $@ include $(out_root)/configuration # file: makefile include boostrap.make all: $(out_root)/driver $(out_root)/driver: driver.c With these methods what you do is declare the "real" default target (or list of targets) to be a prerequisite of the generic default target, "all". bk> This problem can be solved by specifying that particular target bk> cannot be default: bk> # file: bootstrap.make bk> out_root := initialize-output-root bk> .NOT_DEFAULT: $(out_root)/configuration bk> $(out_root)/configuration: bk> configure $@ bk> include $(out_root)/configuration bk> comments? Mm. I don't know about this. It seems like it's the wrong way around... if what you want to have is the default target, why have people declare everything that _cannot_ be the default? Why not just declare what _IS_ the default? -- ------------------------------------------------------------------------------- Paul D. Smith <[EMAIL PROTECTED]> Find some GNU make tips at: http://www.gnu.org http://make.paulandlesley.org "Please remain calm...I may be mad, but I am a professional." --Mad Scientist _______________________________________________ Bug-make mailing list [EMAIL PROTECTED] http://mail.gnu.org/mailman/listinfo/bug-make