# file : build/generator # copyright : Copyright (c) 2004-2012 Code Synthesis Tools CC # license : GNU GPL v2; see accompanying LICENSE file # This makefile is an optional, transparent generator of "thunk" makefiles # for the build setups with separate src and out directories. Without the # generator, the make invocation for this setup has the following general # form: # # make -C out_root/subdir -f src_root/subdir/makefile # # With the generator enabled, the same can be achieved with the following # shorter command: # # make -C out_root/subdir # # Or, if the subdir directory may not yet exist, with this variant: # # make -C out_root dir=subdir # # To enable the generator, you will need to instruct make to pre-load it # for every invocation by adding it to the MAKEFILES environment variable: # # export MAKEFILES=build-X.Y/generator # # The thunk makefiles for individual sub-directories are generated as # needed and are automatically removed by the disfigure target. # ifdef dir .PHONY: _all _all: @mkdir -p $(dir) @$(MAKE) -C $(dir) dir= $(MAKECMDGOALS) ifneq ($(MAKECMDGOALS),) .PHONY: $(MAKECMDGOALS) $(MAKECMDGOALS): _all else .DEFAULT_GOAL := _all endif else ifeq ($(wildcard makefile Makefile GNUmakefile),) define literal_newline endef makefile: empty := makefile: space := $(empty) # makefile: tab := $(empty) $(empty) makefile: newline := $(literal_newline) # Find the src_root directory. # # $1 - current directory # makefile: find = \ $(if $1,$(if $(wildcard $1/build/bootstrap-dynamic.make),$1,$(call \ find,$(patsubst %/,%,$(dir $1))))) # Convert /foo/bar to ../../. # # $1 - relative path from $(CURDIR) # makefile: path = $(subst $(space),,$(foreach d,$(subst /, ,$1/),../)) # $1 - relative path from $(CURDIR) # makefile: command_body = \ @echo '\# Automatically generated by build.' >$@$(newline)\ $(tab)@echo 'ifndef dir' >>$@$(newline)\ $(tab)@echo 'override dir :=' >>$@$(newline)\ $(tab)@echo 'include $(if $1,$(call path,$1))build/bootstrap-dynamic.make' >>$@$(newline)\ $(tab)@echo 'include $$(src_root)$1/makefile' >>$@$(newline)\ $(tab)@echo 'endif' >>$@ # $1 - output root directory or empty if none were found # makefile: command = $(if $1,$(call command_body,$(subst $1,,$(CURDIR)))) makefile: $(call command,$(call find,$(CURDIR))) endif # makefile endif # dir