Honour the O= flag that was passed to a higher level Makefile and then passed down as part of a tool build. To make this work, the top-level Makefile passes the original O= flag and subdir=tools to the tools/Makefile, and that in turn passes subdir=$(O)/$(subdir)/foodir when building tool foo in directory $(O)/$(subdir)/foodir (where the intervening slashes aren't added if an element is missing). For example, take perf. This is found in tools/perf/. Assume we're building into directory ~/zebra/, so we pass O=~/zebra to make. Dependening on where we run the build from, we see: make run in dir $(OUTPUT) dir ======================= ================== linux ~/zebra/tools/perf/ linux/tools ~/zebra/perf/ linux/tools/perf ~/zebra/ and if O= is not set, we get: make run in dir $(OUTPUT) dir ======================= ================== linux linux/tools/perf/ linux/tools linux/tools/perf/ linux/tools/perf linux/tools/perf/ The output directories are created by the descend function if they don't already exist.
Unified · Split
| @@ -1321,10 +1321,12 @@ kernelversion: · 1320 unmodified lines | ||
| 1321 | 1321 | |
| 1322 | 1322 | # Clear a bunch of variables before executing the submake |
| 1323 | 1323 | tools/: FORCE |
| 1324 | − $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= -C $(src)/tools/ | |
| 1324 | + $(Q)mkdir -p $(objtree)/tools | |
| 1325 | + $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= O=$(objtree) subdir=tools -C $(src)/tools/ | |
| 1325 | 1326 | |
| 1326 | 1327 | tools/%: FORCE |
| 1327 | − $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= -C $(src)/tools/ $* | |
| 1328 | + $(Q)mkdir -p $(objtree)/tools | |
| 1329 | + $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= O=$(objtree) subdir=tools -C $(src)/tools/ $* | |
| 1328 | 1330 | |
| 1329 | 1331 | # Single targets |
| 1330 | 1332 | # --------------------------------------------------------------------------- |
| @@ -1,8 +1,11 @@ | ||
| 1 | −ifeq ("$(origin O)", "command line") | |
| 1 | +ifeq ($(origin O), command line) | |
| 2 | 2 | dummy := $(if $(shell test -d $(O) || echo $(O)),$(error O=$(O) does not exist),) |
| 3 | 3 | ABSOLUTE_O := $(shell cd $(O) ; pwd) |
| 4 | − OUTPUT := $(ABSOLUTE_O)/ | |
| 4 | + OUTPUT := $(ABSOLUTE_O)/$(if $(subdir),$(subdir)/) | |
| 5 | 5 | COMMAND_O := O=$(ABSOLUTE_O) |
| 6 | +ifeq ($(objtree),) | |
| 7 | + objtree := $(O) | |
| 8 | +endif | |
| 6 | 9 | endif |
| 7 | 10 | |
| 8 | 11 | ifneq ($(OUTPUT),) |
| @@ -47,9 +50,10 @@ endif · 38 unmodified lines | ||
| 47 | 50 | # Call by doing: $(call descend,directory[,target]) |
| 48 | 51 | # |
| 49 | 52 | descend = \ |
| 50 | − $(QUIET_SUBDIR0)$(1) $(QUIET_SUBDIR1) $(2) | |
| 53 | + +mkdir -p $(OUTPUT)$(1) && \ | |
| 54 | + $(MAKE) $(COMMAND_O) subdir=$(if $(subdir),$(subdir)/$(1),$(1)) $(PRINT_DIR) -C $(1) | |
| 51 | 55 | |
| 52 | −QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir | |
| 56 | +QUIET_SUBDIR0 = +$(MAKE) $(COMMAND_O) -C # space to separate -C and subdir | |
| 53 | 57 | QUIET_SUBDIR1 = |
| 54 | 58 | |
| 55 | 59 | ifneq ($(findstring $(MAKEFLAGS),s),s) |
| @@ -64,5 +68,10 @@ ifndef V · 8 unmodified lines | ||
| 64 | 68 | $(MAKE) $(PRINT_DIR) -C $$subdir |
| 65 | 69 | QUIET_FLEX = @echo ' ' FLEX $@; |
| 66 | 70 | QUIET_BISON = @echo ' ' BISON $@; |
| 71 | + | |
| 72 | + descend = \ | |
| 73 | + @echo ' ' DESCEND $(1); \ | |
| 74 | + mkdir -p $(OUTPUT)$(1) && \ | |
| 75 | + $(MAKE) $(COMMAND_O) subdir=$(if $(subdir),$(subdir)/$(1),$(1)) $(PRINT_DIR) -C $(1) | |
| 67 | 76 | endif |
| 68 | 77 | endif |