On Tue, 8 Oct 2013 12:11:20 +0200, Ingo Molnar wrote: > If someone specifies a single target, mixed with O=, the following way: > > hubble:~/tip/tools/perf> make O=/tmp/perf util/stat.o > BUILD: Doing 'make -j8' parallel build > gcc -Wbad-function-cast -Wdeclaration-after-statement -Wformat-security > -Wformat-y2k [...] > > The build might even fail, if a target depends on other targets: > > hubble:~/tip/tools/perf> make O=/tmp/perf perf.o > ... > perf.c: In function ‘handle_options’: > perf.c:155:21: error: ‘PERF_HTML_PATH’ undeclared (first use in this > function) > > The correct way to invoke such targets is: > > hubble:~/tip/tools/perf> make O=/tmp/perf /tmp/perf/perf.o > BUILD: Doing 'make -j8' parallel build > GEN /tmp/perf/common-cmds.h > CC /tmp/perf/perf.o > > But that's unnecessary typing and it's also easy to mistakenly build into the > source directory. > > To fix this remove the generic suffix rules and add redirection to $(OUTPUT) > for the most popular .o targets.
I got this: $ cd tools/perf $ make ... (succeeded) $ make O=~/build/perf perf.o make: `perf.o' is up to date. $ rm ~/build/perf/perf.o $ make O=~/build/perf/ perf.o make: `perf.o' is up to date. > +# > +# If a target does not match any of the later rules then prefix it by > $(OUTPUT) > +# This makes targets like 'make O=/tmp/perf perf.o' work in a natural way. > +# > +ifneq ($(OUTPUT),) > +%.o: $(OUTPUT)%.o > + @echo " # Redirected target $@ => $(OUTPUT)$@" > +util/%.o: $(OUTPUT)util/%.o > + @echo " # Redirected target $@ => $(OUTPUT)util/$@" > +bench/%.o: $(OUTPUT)bench/%.o > + @echo " # Redirected target $@ => $(OUTPUT)bench/$@" > +tests/%.o: $(OUTPUT)tests/%.o > + @echo " # Redirected target $@ => $(OUTPUT)tests/$@" > +endif It also doesn't care about other directories - arch/, scripts/ and ui/ - and their subdirectories. So even on clean build it'll failed to build these files with O=dir. $ make clean $ make O=~/build/perf ui/stdio/hist.o BUILD: Doing 'make -j12' parallel build make[1]: *** No rule to make target `ui/stdio/hist.o'. Stop. make: *** [ui/stdio/hist.o] Error 2 Thanks, Namhyung -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/