DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (5350524bb654)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
# -*- makefile -*-
# vim:set ts=8 sw=8 sts=8 noet:
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# The purpose of this file is to pull in non-recursive targets when performing
# a partial tree (not top-level) build. This will allow people to continue to
# build individual directories while some of the targets may not be normally
# defined in that make file.
#
# Non-recursive targets are attached to existing make targets. The
# NONRECURSIVE_TARGETS variable lists the make targets that modified. For
# each target in this list, the NONRECURSIVE_TARGET_<target> variable will
# contain a list of partial variable names. We will then look in variables
# named NONRECURSIVE_TARGETS_<target>_<fragment>_* for information describing
# how to evaluate non-recursive make targets.
#
# Targets are defined by the following variables:
#
#   FILE - The make file to evaluate. This is equivalent to
#      |make -f <FILE>|
#   DIRECTORY - The directory whose Makefile to evaluate. This is
#      equivalent to |make -C <DIRECTORY>|.
#   TARGETS - Targets to evaluate in that make file.
#
# Only 1 of FILE or DIRECTORY may be defined.
#
# For example:
#
# NONRECURSIVE_TARGETS = export libs
# NONRECURSIVE_TARGETS_export = headers
# NONRECURSIVE_TARGETS_export_headers_FILE = /path/to/exports.mk
# NONRECURSIVE_TARGETS_export_headers_TARGETS = $(DIST)/include/foo.h $(DIST)/include/bar.h
# NONRECURSIVE_TARGETS_libs = cppsrcs
# NONRECURSIVE_TARGETS_libs_cppsrcs_DIRECTORY = $(DEPTH)/foo
# NONRECURSIVE_TARGETS_libs_cppsrcs_TARGETS = /path/to/foo.o /path/to/bar.o
#
# Will get turned into the following:
#
# exports::
#     $(MAKE) -C $(DEPTH) -f /path/to/exports.mk $(DIST)/include/foo.h $(DIST)/include/bar.h
#
# libs::
#     $(MAKE) -C $(DEPTH)/foo /path/to/foo.o /path/to/bar.o

ifndef INCLUDED_NONRECURSIVE_MK

define define_nonrecursive_target
$(1)::
	$$(MAKE) -C $(or $(4),$$(DEPTH)) $(addprefix -f ,$(3)) $(2)
endef

$(foreach target,$(NONRECURSIVE_TARGETS), \
    $(foreach entry,$(NONRECURSIVE_TARGETS_$(target)), \
        $(eval $(call define_nonrecursive_target, \
            $(target), \
            $(NONRECURSIVE_TARGETS_$(target)_$(entry)_TARGETS), \
            $(NONRECURSIVE_TARGETS_$(target)_$(entry)_FILE), \
            $(NONRECURSIVE_TARGETS_$(target)_$(entry)_DIRECTORY), \
        )) \
    ) \
)

INCLUDED_NONRECURSIVE_MK := 1
endif