| # General-purpose GNU make include file |
| # |
| # Copyright (C) 2017, Broadcom. All Rights Reserved. |
| # |
| # Permission to use, copy, modify, and/or distribute this software for any |
| # purpose with or without fee is hereby granted, provided that the above |
| # copyright notice and this permission notice appear in all copies. |
| # |
| # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
| # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |
| # OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |
| # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| # |
| # |
| # <<Broadcom-WL-IPTag/Open:>> |
| # |
| # $Id: Makefile 506823 2014-10-07 12:59:32Z $ |
| # |
| |
| ifdef _RELPATH_MK_ |
| $(if $D,$(info =-= Avoiding redundant include ($(MAKEFILE_LIST)))) |
| else |
| unexport _RELPATH_MK_ # in case of make -e |
| _RELPATH_MK_ := 1 |
| |
| # Protection against process recursion when this file is |
| # included by setting MAKEFILES. |
| ifneq (,$(filter %$(notdir $(lastword $(MAKEFILE_LIST))),$(MAKEFILES))) |
| MAKEFILES := $(filter-out %$(notdir $(lastword $(MAKEFILE_LIST))),$(MAKEFILES)) |
| ifndef MAKEFILES |
| unexport MAKEFILES |
| endif |
| endif |
| |
| # Usage: $(call relpath,[<from-dir>,]<to-dir>) |
| # Returns the relative path from <from-dir> to <to-dir>; <from-dir> |
| # may be elided in which case it defaults to $(CURDIR). |
| |
| _rp_space := |
| _rp_space += |
| _rp_uname_s := $(shell uname -s) |
| |
| # Utility functions. |
| _rp_compose = $(subst ${_rp_space},$(strip $1),$(strip $2)) |
| _rp_endlist = $(wordlist $1,$(words $2),$2) |
| _rp_canonpath = $(if $(findstring CYGWIN,$(_rp_uname_s)),$(shell cygpath -a -u $1),$(abspath $1)) |
| |
| # ----relpath(): Self-recursive function which compares the first element |
| # of two given paths, then calls itself with the next two |
| # elements, and so on, until a difference is found. At each |
| # step, if the first element of both paths matches, that |
| # element is produced. |
| ----relpath = $(if $(filter $(firstword $1),$(firstword $2)), \ |
| $(firstword $1) \ |
| $(call $0,$(call _rp_endlist,2,$1),$(call _rp_endlist,2,$2)) \ |
| ) |
| # ---relpath(): This function removes $1 from the front of both $2 and |
| # $3 (removes common path prefix) and generates a relative |
| # path between the locations given by $2 and $3, by replacing |
| # each remaining element of $2 (after common prefix removal) |
| # with '..', then appending the remainder of $3 (after common |
| # prefix removal) to the string of '..'s |
| ---relpath = $(foreach e,$(subst /, ,$(patsubst $(if $1,/)$1/%,%,$2)),..) \ |
| $(if $3,$(patsubst $(if $1,/)$1/%,%,$3)) |
| # --relpath(): This function runs the output of ----relpath() through |
| # ---relpath(), and turns the result into an actual relative |
| # path string, separated by '/'. |
| --relpath = $(call _rp_compose,/, \ |
| $(call -$0,$(call _rp_compose,/,$(call --$0,$3,$4)),$1,$2) \ |
| ) |
| # -relpath(): This function makes a determination about the two given |
| # paths -- does one strictly prefix the other? If so, this |
| # function produces a relative path between the two inputs, |
| # without calling --relpath() and taking the "long road". |
| # If $1 prefixes $2, the result is the remainder of $2 after |
| # removing $1. If $2 prefixes $1, the result is the remainder |
| # of $1 after removing $2, but with each element in that |
| # remainder converted to '..'. |
| -relpath = $(if $(filter $1,$2),., \ |
| $(if $(filter $1/%,$2), \ |
| $(patsubst $1/%,%,$2), \ |
| $(if $(filter $2/%,$1), \ |
| $(call _rp_compose,/, \ |
| $(foreach e,$(subst /, ,$(patsubst $2/%,%,$1)),..) \ |
| ), \ |
| $(call -$0,$1,$2,$(subst /, ,$1),$(subst /, ,$2)) \ |
| ) \ |
| ) \ |
| ) |
| |
| # relpath(): This function loops over each element in $2, calculating |
| # the relative path from $1 to each element of $2. |
| relpath = $(if $1,,$(error Error: missing first parameter to $0))$(strip \ |
| $(if $2, \ |
| $(foreach d,$2,$(call -$0,$(call _rp_canonpath,$1),$(call _rp_canonpath,$d))), \ |
| $(foreach d,$1,$(call -$0,$(call _rp_canonpath,${CURDIR}),$(call _rp_canonpath,$d))) \ |
| ) \ |
| ) |
| |
| endif #_RELPATH_MK_ |