mirror of
				https://github.com/thunderbrewhq/thunderbrew
				synced 2025-10-31 16:26:03 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			174 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # ==============================================================================
 | |
| #  https://www.gnu.org/software/autoconf-archive/ax_compute_relative_paths.html
 | |
| # ==============================================================================
 | |
| #
 | |
| # SYNOPSIS
 | |
| #
 | |
| #   AX_COMPUTE_RELATIVE_PATHS(PATH_LIST)
 | |
| #
 | |
| # DESCRIPTION
 | |
| #
 | |
| #   PATH_LIST is a space-separated list of colon-separated triplets of the
 | |
| #   form 'FROM:TO:RESULT'. This function iterates over these triplets and
 | |
| #   set $RESULT to the relative path from $FROM to $TO. Note that $FROM and
 | |
| #   $TO needs to be absolute filenames for this macro to success.
 | |
| #
 | |
| #   For instance,
 | |
| #
 | |
| #     first=/usr/local/bin
 | |
| #     second=/usr/local/share
 | |
| #     AX_COMPUTE_RELATIVE_PATHS([first:second:fs second:first:sf])
 | |
| #     # $fs is set to ../share
 | |
| #     # $sf is set to ../bin
 | |
| #
 | |
| #   $FROM and $TO are both eval'ed recursively and normalized, this means
 | |
| #   that you can call this macro with autoconf's dirnames like `prefix' or
 | |
| #   `datadir'. For example:
 | |
| #
 | |
| #     AX_COMPUTE_RELATIVE_PATHS([bindir:datadir:bin_to_data])
 | |
| #
 | |
| #   AX_COMPUTE_RELATIVE_PATHS should also works with DOS filenames.
 | |
| #
 | |
| #   You may want to use this macro in order to make your package
 | |
| #   relocatable. Instead of hardcoding $datadir into your programs just
 | |
| #   encode $bin_to_data and try to determine $bindir at run-time.
 | |
| #
 | |
| #   This macro requires AX_NORMALIZE_PATH and AX_RECURSIVE_EVAL.
 | |
| #
 | |
| # LICENSE
 | |
| #
 | |
| #   Copyright (c) 2008 Alexandre Duret-Lutz <adl@gnu.org>
 | |
| #
 | |
| #   This program is free software; you can redistribute it and/or modify it
 | |
| #   under the terms of the GNU General Public License as published by the
 | |
| #   Free Software Foundation; either version 2 of the License, or (at your
 | |
| #   option) any later version.
 | |
| #
 | |
| #   This program is distributed in the hope that it will be useful, but
 | |
| #   WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 | |
| #   Public License for more details.
 | |
| #
 | |
| #   You should have received a copy of the GNU General Public License along
 | |
| #   with this program. If not, see <https://www.gnu.org/licenses/>.
 | |
| #
 | |
| #   As a special exception, the respective Autoconf Macro's copyright owner
 | |
| #   gives unlimited permission to copy, distribute and modify the configure
 | |
| #   scripts that are the output of Autoconf when processing the Macro. You
 | |
| #   need not follow the terms of the GNU General Public License when using
 | |
| #   or distributing such scripts, even though portions of the text of the
 | |
| #   Macro appear in them. The GNU General Public License (GPL) does govern
 | |
| #   all other use of the material that constitutes the Autoconf Macro.
 | |
| #
 | |
| #   This special exception to the GPL applies to versions of the Autoconf
 | |
| #   Macro released by the Autoconf Archive. When you make and distribute a
 | |
| #   modified version of the Autoconf Macro, you may extend this special
 | |
| #   exception to the GPL to apply to your modified version as well.
 | |
| 
 | |
| #serial 12
 | |
| 
 | |
| AU_ALIAS([ADL_COMPUTE_RELATIVE_PATHS], [AX_COMPUTE_RELATIVE_PATHS])
 | |
| AC_DEFUN([AX_COMPUTE_RELATIVE_PATHS],
 | |
| [for _lcl_i in $1; do
 | |
|   _lcl_from=\[$]`echo "[$]_lcl_i" | sed 's,:.*$,,'`
 | |
|   _lcl_to=\[$]`echo "[$]_lcl_i" | sed 's,^[[^:]]*:,,' | sed 's,:[[^:]]*$,,'`
 | |
|   _lcl_result_var=`echo "[$]_lcl_i" | sed 's,^.*:,,'`
 | |
|   AX_RECURSIVE_EVAL([[$]_lcl_from], [_lcl_from])
 | |
|   AX_RECURSIVE_EVAL([[$]_lcl_to], [_lcl_to])
 | |
|   _lcl_notation="$_lcl_from$_lcl_to"
 | |
|   AX_NORMALIZE_PATH([_lcl_from],['/'])
 | |
|   AX_NORMALIZE_PATH([_lcl_to],['/'])
 | |
|   AX_COMPUTE_RELATIVE_PATH([_lcl_from], [_lcl_to], [_lcl_result_tmp])
 | |
|   AX_NORMALIZE_PATH([_lcl_result_tmp],["[$]_lcl_notation"])
 | |
|   eval $_lcl_result_var='[$]_lcl_result_tmp'
 | |
| done])
 | |
| 
 | |
| ## Note:
 | |
| ## *****
 | |
| ## The following helper macros are too fragile to be used out
 | |
| ## of AX_COMPUTE_RELATIVE_PATHS (mainly because they assume that
 | |
| ## paths are normalized), that's why I'm keeping them in the same file.
 | |
| ## Still, some of them maybe worth to reuse.
 | |
| 
 | |
| dnl AX_COMPUTE_RELATIVE_PATH(FROM, TO, RESULT)
 | |
| dnl ===========================================
 | |
| dnl Compute the relative path to go from $FROM to $TO and set the value
 | |
| dnl of $RESULT to that value.  This function work on raw filenames
 | |
| dnl (for instead it will considerate /usr//local and /usr/local as
 | |
| dnl two distinct paths), you should really use AX_COMPUTE_RELATIVE_PATHS
 | |
| dnl instead to have the paths sanitized automatically.
 | |
| dnl
 | |
| dnl For instance:
 | |
| dnl    first_dir=/somewhere/on/my/disk/bin
 | |
| dnl    second_dir=/somewhere/on/another/disk/share
 | |
| dnl    AX_COMPUTE_RELATIVE_PATH(first_dir, second_dir, first_to_second)
 | |
| dnl will set $first_to_second to '../../../another/disk/share'.
 | |
| AC_DEFUN([AX_COMPUTE_RELATIVE_PATH],
 | |
| [AX_COMPUTE_COMMON_PATH([$1], [$2], [_lcl_common_prefix])
 | |
| AX_COMPUTE_BACK_PATH([$1], [_lcl_common_prefix], [_lcl_first_rel])
 | |
| AX_COMPUTE_SUFFIX_PATH([$2], [_lcl_common_prefix], [_lcl_second_suffix])
 | |
| $3="[$]_lcl_first_rel[$]_lcl_second_suffix"])
 | |
| 
 | |
| dnl AX_COMPUTE_COMMON_PATH(LEFT, RIGHT, RESULT)
 | |
| dnl ============================================
 | |
| dnl Compute the common path to $LEFT and $RIGHT and set the result to $RESULT.
 | |
| dnl
 | |
| dnl For instance:
 | |
| dnl    first_path=/somewhere/on/my/disk/bin
 | |
| dnl    second_path=/somewhere/on/another/disk/share
 | |
| dnl    AX_COMPUTE_COMMON_PATH(first_path, second_path, common_path)
 | |
| dnl will set $common_path to '/somewhere/on'.
 | |
| AC_DEFUN([AX_COMPUTE_COMMON_PATH],
 | |
| [$3=''
 | |
| _lcl_second_prefix_match=''
 | |
| while test "[$]_lcl_second_prefix_match" != 0; do
 | |
|   _lcl_first_prefix=`expr "x[$]$1" : "x\([$]$3/*[[^/]]*\)"`
 | |
|   _lcl_second_prefix_match=`expr "x[$]$2" : "x[$]_lcl_first_prefix"`
 | |
|   if test "[$]_lcl_second_prefix_match" != 0; then
 | |
|     if test "[$]_lcl_first_prefix" != "[$]$3"; then
 | |
|       $3="[$]_lcl_first_prefix"
 | |
|     else
 | |
|       _lcl_second_prefix_match=0
 | |
|     fi
 | |
|   fi
 | |
| done])
 | |
| 
 | |
| dnl AX_COMPUTE_SUFFIX_PATH(PATH, SUBPATH, RESULT)
 | |
| dnl ==============================================
 | |
| dnl Subtract $SUBPATH from $PATH, and set the resulting suffix
 | |
| dnl (or the empty string if $SUBPATH is not a subpath of $PATH)
 | |
| dnl to $RESULT.
 | |
| dnl
 | |
| dnl For instance:
 | |
| dnl    first_path=/somewhere/on/my/disk/bin
 | |
| dnl    second_path=/somewhere/on
 | |
| dnl    AX_COMPUTE_SUFFIX_PATH(first_path, second_path, common_path)
 | |
| dnl will set $common_path to '/my/disk/bin'.
 | |
| AC_DEFUN([AX_COMPUTE_SUFFIX_PATH],
 | |
| [$3=`expr "x[$]$1" : "x[$]$2/*\(.*\)"`])
 | |
| 
 | |
| dnl AX_COMPUTE_BACK_PATH(PATH, SUBPATH, RESULT)
 | |
| dnl ============================================
 | |
| dnl Compute the relative path to go from $PATH to $SUBPATH, knowing that
 | |
| dnl $SUBPATH is a subpath of $PATH (any other words, only repeated '../'
 | |
| dnl should be needed to move from $PATH to $SUBPATH) and set the value
 | |
| dnl of $RESULT to that value.  If $SUBPATH is not a subpath of PATH,
 | |
| dnl set $RESULT to the empty string.
 | |
| dnl
 | |
| dnl For instance:
 | |
| dnl    first_path=/somewhere/on/my/disk/bin
 | |
| dnl    second_path=/somewhere/on
 | |
| dnl    AX_COMPUTE_BACK_PATH(first_path, second_path, back_path)
 | |
| dnl will set $back_path to '../../../'.
 | |
| AC_DEFUN([AX_COMPUTE_BACK_PATH],
 | |
| [AX_COMPUTE_SUFFIX_PATH([$1], [$2], [_lcl_first_suffix])
 | |
| $3=''
 | |
| _lcl_tmp='xxx'
 | |
| while test "[$]_lcl_tmp" != ''; do
 | |
|   _lcl_tmp=`expr "x[$]_lcl_first_suffix" : "x[[^/]]*/*\(.*\)"`
 | |
|   if test "[$]_lcl_first_suffix" != ''; then
 | |
|      _lcl_first_suffix="[$]_lcl_tmp"
 | |
|      $3="../[$]$3"
 | |
|   fi
 | |
| done])
 | 
