1*132f818dSEnji Cooper#! /usr/bin/env sh 2*132f818dSEnji Cooper## DO NOT EDIT - This file generated from ./build-aux/ltmain.in 3*132f818dSEnji Cooper## by inline-source v2019-02-19.15 4*132f818dSEnji Cooper 5*132f818dSEnji Cooper# libtool (GNU libtool) 2.5.4 6*132f818dSEnji Cooper# Provide generalized library-building support services. 7*132f818dSEnji Cooper# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 8*132f818dSEnji Cooper 9*132f818dSEnji Cooper# Copyright (C) 1996-2019, 2021-2024 Free Software Foundation, Inc. 10*132f818dSEnji Cooper# This is free software; see the source for copying conditions. There is NO 11*132f818dSEnji Cooper# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12*132f818dSEnji Cooper 13*132f818dSEnji Cooper# GNU Libtool is free software; you can redistribute it and/or modify 14*132f818dSEnji Cooper# it under the terms of the GNU General Public License as published by 15*132f818dSEnji Cooper# the Free Software Foundation; either version 2 of the License, or 16*132f818dSEnji Cooper# (at your option) any later version. 17*132f818dSEnji Cooper# 18*132f818dSEnji Cooper# As a special exception to the GNU General Public License, 19*132f818dSEnji Cooper# if you distribute this file as part of a program or library that 20*132f818dSEnji Cooper# is built using GNU Libtool, you may include this file under the 21*132f818dSEnji Cooper# same distribution terms that you use for the rest of that program. 22*132f818dSEnji Cooper# 23*132f818dSEnji Cooper# GNU Libtool is distributed in the hope that it will be useful, but 24*132f818dSEnji Cooper# WITHOUT ANY WARRANTY; without even the implied warranty of 25*132f818dSEnji Cooper# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 26*132f818dSEnji Cooper# General Public License for more details. 27*132f818dSEnji Cooper# 28*132f818dSEnji Cooper# You should have received a copy of the GNU General Public License 29*132f818dSEnji Cooper# along with this program. If not, see <http://www.gnu.org/licenses/>. 30*132f818dSEnji Cooper 31*132f818dSEnji Cooper 32*132f818dSEnji CooperPROGRAM=libtool 33*132f818dSEnji CooperPACKAGE=libtool 34*132f818dSEnji CooperVERSION=2.5.4 35*132f818dSEnji Cooperpackage_revision=2.5.4 36*132f818dSEnji Cooper 37*132f818dSEnji Cooper 38*132f818dSEnji Cooper## ------ ## 39*132f818dSEnji Cooper## Usage. ## 40*132f818dSEnji Cooper## ------ ## 41*132f818dSEnji Cooper 42*132f818dSEnji Cooper# Run './libtool --help' for help with using this script from the 43*132f818dSEnji Cooper# command line. 44*132f818dSEnji Cooper 45*132f818dSEnji Cooper 46*132f818dSEnji Cooper## ------------------------------- ## 47*132f818dSEnji Cooper## User overridable command paths. ## 48*132f818dSEnji Cooper## ------------------------------- ## 49*132f818dSEnji Cooper 50*132f818dSEnji Cooper# After configure completes, it has a better idea of some of the 51*132f818dSEnji Cooper# shell tools we need than the defaults used by the functions shared 52*132f818dSEnji Cooper# with bootstrap, so set those here where they can still be over- 53*132f818dSEnji Cooper# ridden by the user, but otherwise take precedence. 54*132f818dSEnji Cooper 55*132f818dSEnji Cooper: ${AUTOCONF="autoconf"} 56*132f818dSEnji Cooper: ${AUTOMAKE="automake"} 57*132f818dSEnji Cooper 58*132f818dSEnji Cooper 59*132f818dSEnji Cooper## -------------------------- ## 60*132f818dSEnji Cooper## Source external libraries. ## 61*132f818dSEnji Cooper## -------------------------- ## 62*132f818dSEnji Cooper 63*132f818dSEnji Cooper# Much of our low-level functionality needs to be sourced from external 64*132f818dSEnji Cooper# libraries, which are installed to $pkgauxdir. 65*132f818dSEnji Cooper 66*132f818dSEnji Cooper# Set a version string for this script. 67*132f818dSEnji Cooperscriptversion=2019-02-19.15; # UTC 68*132f818dSEnji Cooper 69*132f818dSEnji Cooper# General shell script boiler plate, and helper functions. 70*132f818dSEnji Cooper# Written by Gary V. Vaughan, 2004 71*132f818dSEnji Cooper 72*132f818dSEnji Cooper# This is free software. There is NO warranty; not even for 73*132f818dSEnji Cooper# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 74*132f818dSEnji Cooper# 75*132f818dSEnji Cooper# Copyright (C) 2004-2019, 2021, 2023-2024 Bootstrap Authors 76*132f818dSEnji Cooper# 77*132f818dSEnji Cooper# This file is dual licensed under the terms of the MIT license 78*132f818dSEnji Cooper# <https://opensource.org/licenses/MIT>, and GPL version 2 or later 79*132f818dSEnji Cooper# <https://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of 80*132f818dSEnji Cooper# these licenses when using or redistributing this software or any of 81*132f818dSEnji Cooper# the files within it. See the URLs above, or the file `LICENSE` 82*132f818dSEnji Cooper# included in the Bootstrap distribution for the full license texts. 83*132f818dSEnji Cooper 84*132f818dSEnji Cooper# Please report bugs or propose patches to: 85*132f818dSEnji Cooper# <https://github.com/gnulib-modules/bootstrap/issues> 86*132f818dSEnji Cooper 87*132f818dSEnji Cooper 88*132f818dSEnji Cooper## ------ ## 89*132f818dSEnji Cooper## Usage. ## 90*132f818dSEnji Cooper## ------ ## 91*132f818dSEnji Cooper 92*132f818dSEnji Cooper# Evaluate this file near the top of your script to gain access to 93*132f818dSEnji Cooper# the functions and variables defined here: 94*132f818dSEnji Cooper# 95*132f818dSEnji Cooper# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh 96*132f818dSEnji Cooper# 97*132f818dSEnji Cooper# If you need to override any of the default environment variable 98*132f818dSEnji Cooper# settings, do that before evaluating this file. 99*132f818dSEnji Cooper 100*132f818dSEnji Cooper 101*132f818dSEnji Cooper## -------------------- ## 102*132f818dSEnji Cooper## Shell normalisation. ## 103*132f818dSEnji Cooper## -------------------- ## 104*132f818dSEnji Cooper 105*132f818dSEnji Cooper# Some shells need a little help to be as Bourne compatible as possible. 106*132f818dSEnji Cooper# Before doing anything else, make sure all that help has been provided! 107*132f818dSEnji Cooper 108*132f818dSEnji CooperDUALCASE=1; export DUALCASE # for MKS sh 109*132f818dSEnji Cooperif test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : 110*132f818dSEnji Cooper emulate sh 111*132f818dSEnji Cooper NULLCMD=: 112*132f818dSEnji Cooper # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which 113*132f818dSEnji Cooper # is contrary to our usage. Disable this feature. 114*132f818dSEnji Cooper alias -g '${1+"$@"}'='"$@"' 115*132f818dSEnji Cooper setopt NO_GLOB_SUBST 116*132f818dSEnji Cooperelse 117*132f818dSEnji Cooper case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac 118*132f818dSEnji Cooperfi 119*132f818dSEnji Cooper 120*132f818dSEnji Cooper# NLS nuisances: We save the old values in case they are required later. 121*132f818dSEnji Cooper_G_user_locale= 122*132f818dSEnji Cooper_G_safe_locale= 123*132f818dSEnji Cooperfor _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES 124*132f818dSEnji Cooperdo 125*132f818dSEnji Cooper eval "if test set = \"\${$_G_var+set}\"; then 126*132f818dSEnji Cooper save_$_G_var=\$$_G_var 127*132f818dSEnji Cooper $_G_var=C 128*132f818dSEnji Cooper export $_G_var 129*132f818dSEnji Cooper _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" 130*132f818dSEnji Cooper _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" 131*132f818dSEnji Cooper fi" 132*132f818dSEnji Cooperdone 133*132f818dSEnji Cooper# These NLS vars are set unconditionally (bootstrap issue #24). Unset those 134*132f818dSEnji Cooper# in case the environment reset is needed later and the $save_* variant is not 135*132f818dSEnji Cooper# defined (see the code above). 136*132f818dSEnji CooperLC_ALL=C 137*132f818dSEnji CooperLANGUAGE=C 138*132f818dSEnji Cooperexport LANGUAGE LC_ALL 139*132f818dSEnji Cooper 140*132f818dSEnji Cooper# Make sure IFS has a sensible default 141*132f818dSEnji Coopersp=' ' 142*132f818dSEnji Coopernl=' 143*132f818dSEnji Cooper' 144*132f818dSEnji CooperIFS="$sp $nl" 145*132f818dSEnji Cooper 146*132f818dSEnji Cooper# There are apparently some systems that use ';' as a PATH separator! 147*132f818dSEnji Cooperif test "${PATH_SEPARATOR+set}" != set; then 148*132f818dSEnji Cooper PATH_SEPARATOR=: 149*132f818dSEnji Cooper (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { 150*132f818dSEnji Cooper (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || 151*132f818dSEnji Cooper PATH_SEPARATOR=';' 152*132f818dSEnji Cooper } 153*132f818dSEnji Cooperfi 154*132f818dSEnji Cooper 155*132f818dSEnji Cooper 156*132f818dSEnji Cooper# func_unset VAR 157*132f818dSEnji Cooper# -------------- 158*132f818dSEnji Cooper# Portably unset VAR. 159*132f818dSEnji Cooper# In some shells, an 'unset VAR' statement leaves a non-zero return 160*132f818dSEnji Cooper# status if VAR is already unset, which might be problematic if the 161*132f818dSEnji Cooper# statement is used at the end of a function (thus poisoning its return 162*132f818dSEnji Cooper# value) or when 'set -e' is active (causing even a spurious abort of 163*132f818dSEnji Cooper# the script in this case). 164*132f818dSEnji Cooperfunc_unset () 165*132f818dSEnji Cooper{ 166*132f818dSEnji Cooper { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } 167*132f818dSEnji Cooper} 168*132f818dSEnji Cooper 169*132f818dSEnji Cooper 170*132f818dSEnji Cooper# Make sure CDPATH doesn't cause `cd` commands to output the target dir. 171*132f818dSEnji Cooperfunc_unset CDPATH 172*132f818dSEnji Cooper 173*132f818dSEnji Cooper# Make sure ${,E,F}GREP behave sanely. 174*132f818dSEnji Cooperfunc_unset GREP_OPTIONS 175*132f818dSEnji Cooper 176*132f818dSEnji Cooper 177*132f818dSEnji Cooper## ------------------------- ## 178*132f818dSEnji Cooper## Locate command utilities. ## 179*132f818dSEnji Cooper## ------------------------- ## 180*132f818dSEnji Cooper 181*132f818dSEnji Cooper 182*132f818dSEnji Cooper# func_executable_p FILE 183*132f818dSEnji Cooper# ---------------------- 184*132f818dSEnji Cooper# Check that FILE is an executable regular file. 185*132f818dSEnji Cooperfunc_executable_p () 186*132f818dSEnji Cooper{ 187*132f818dSEnji Cooper test -f "$1" && test -x "$1" 188*132f818dSEnji Cooper} 189*132f818dSEnji Cooper 190*132f818dSEnji Cooper 191*132f818dSEnji Cooper# func_path_progs PROGS_LIST CHECK_FUNC [PATH] 192*132f818dSEnji Cooper# -------------------------------------------- 193*132f818dSEnji Cooper# Search for either a program that responds to --version with output 194*132f818dSEnji Cooper# containing "GNU", or else returned by CHECK_FUNC otherwise, by 195*132f818dSEnji Cooper# trying all the directories in PATH with each of the elements of 196*132f818dSEnji Cooper# PROGS_LIST. 197*132f818dSEnji Cooper# 198*132f818dSEnji Cooper# CHECK_FUNC should accept the path to a candidate program, and 199*132f818dSEnji Cooper# set $func_check_prog_result if it truncates its output less than 200*132f818dSEnji Cooper# $_G_path_prog_max characters. 201*132f818dSEnji Cooperfunc_path_progs () 202*132f818dSEnji Cooper{ 203*132f818dSEnji Cooper _G_progs_list=$1 204*132f818dSEnji Cooper _G_check_func=$2 205*132f818dSEnji Cooper _G_PATH=${3-"$PATH"} 206*132f818dSEnji Cooper 207*132f818dSEnji Cooper _G_path_prog_max=0 208*132f818dSEnji Cooper _G_path_prog_found=false 209*132f818dSEnji Cooper _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} 210*132f818dSEnji Cooper for _G_dir in $_G_PATH; do 211*132f818dSEnji Cooper IFS=$_G_save_IFS 212*132f818dSEnji Cooper test -z "$_G_dir" && _G_dir=. 213*132f818dSEnji Cooper for _G_prog_name in $_G_progs_list; do 214*132f818dSEnji Cooper for _exeext in '' .EXE; do 215*132f818dSEnji Cooper _G_path_prog=$_G_dir/$_G_prog_name$_exeext 216*132f818dSEnji Cooper func_executable_p "$_G_path_prog" || continue 217*132f818dSEnji Cooper case `"$_G_path_prog" --version 2>&1` in 218*132f818dSEnji Cooper *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; 219*132f818dSEnji Cooper *) $_G_check_func $_G_path_prog 220*132f818dSEnji Cooper func_path_progs_result=$func_check_prog_result 221*132f818dSEnji Cooper ;; 222*132f818dSEnji Cooper esac 223*132f818dSEnji Cooper $_G_path_prog_found && break 3 224*132f818dSEnji Cooper done 225*132f818dSEnji Cooper done 226*132f818dSEnji Cooper done 227*132f818dSEnji Cooper IFS=$_G_save_IFS 228*132f818dSEnji Cooper test -z "$func_path_progs_result" && { 229*132f818dSEnji Cooper echo "no acceptable sed could be found in \$PATH" >&2 230*132f818dSEnji Cooper exit 1 231*132f818dSEnji Cooper } 232*132f818dSEnji Cooper} 233*132f818dSEnji Cooper 234*132f818dSEnji Cooper 235*132f818dSEnji Cooper# We want to be able to use the functions in this file before configure 236*132f818dSEnji Cooper# has figured out where the best binaries are kept, which means we have 237*132f818dSEnji Cooper# to search for them ourselves - except when the results are already set 238*132f818dSEnji Cooper# where we skip the searches. 239*132f818dSEnji Cooper 240*132f818dSEnji Cooper# Unless the user overrides by setting SED, search the path for either GNU 241*132f818dSEnji Cooper# sed, or the sed that truncates its output the least. 242*132f818dSEnji Coopertest -z "$SED" && { 243*132f818dSEnji Cooper _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ 244*132f818dSEnji Cooper for _G_i in 1 2 3 4 5 6 7; do 245*132f818dSEnji Cooper _G_sed_script=$_G_sed_script$nl$_G_sed_script 246*132f818dSEnji Cooper done 247*132f818dSEnji Cooper echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed 248*132f818dSEnji Cooper _G_sed_script= 249*132f818dSEnji Cooper 250*132f818dSEnji Cooper func_check_prog_sed () 251*132f818dSEnji Cooper { 252*132f818dSEnji Cooper _G_path_prog=$1 253*132f818dSEnji Cooper 254*132f818dSEnji Cooper _G_count=0 255*132f818dSEnji Cooper printf 0123456789 >conftest.in 256*132f818dSEnji Cooper while : 257*132f818dSEnji Cooper do 258*132f818dSEnji Cooper cat conftest.in conftest.in >conftest.tmp 259*132f818dSEnji Cooper mv conftest.tmp conftest.in 260*132f818dSEnji Cooper cp conftest.in conftest.nl 261*132f818dSEnji Cooper echo '' >> conftest.nl 262*132f818dSEnji Cooper "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break 263*132f818dSEnji Cooper diff conftest.out conftest.nl >/dev/null 2>&1 || break 264*132f818dSEnji Cooper _G_count=`expr $_G_count + 1` 265*132f818dSEnji Cooper if test "$_G_count" -gt "$_G_path_prog_max"; then 266*132f818dSEnji Cooper # Best one so far, save it but keep looking for a better one 267*132f818dSEnji Cooper func_check_prog_result=$_G_path_prog 268*132f818dSEnji Cooper _G_path_prog_max=$_G_count 269*132f818dSEnji Cooper fi 270*132f818dSEnji Cooper # 10*(2^10) chars as input seems more than enough 271*132f818dSEnji Cooper test 10 -lt "$_G_count" && break 272*132f818dSEnji Cooper done 273*132f818dSEnji Cooper rm -f conftest.in conftest.tmp conftest.nl conftest.out 274*132f818dSEnji Cooper } 275*132f818dSEnji Cooper 276*132f818dSEnji Cooper func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" 277*132f818dSEnji Cooper rm -f conftest.sed 278*132f818dSEnji Cooper SED=$func_path_progs_result 279*132f818dSEnji Cooper} 280*132f818dSEnji Cooper 281*132f818dSEnji Cooper 282*132f818dSEnji Cooper# Unless the user overrides by setting GREP, search the path for either GNU 283*132f818dSEnji Cooper# grep, or the grep that truncates its output the least. 284*132f818dSEnji Coopertest -z "$GREP" && { 285*132f818dSEnji Cooper func_check_prog_grep () 286*132f818dSEnji Cooper { 287*132f818dSEnji Cooper _G_path_prog=$1 288*132f818dSEnji Cooper 289*132f818dSEnji Cooper _G_count=0 290*132f818dSEnji Cooper _G_path_prog_max=0 291*132f818dSEnji Cooper printf 0123456789 >conftest.in 292*132f818dSEnji Cooper while : 293*132f818dSEnji Cooper do 294*132f818dSEnji Cooper cat conftest.in conftest.in >conftest.tmp 295*132f818dSEnji Cooper mv conftest.tmp conftest.in 296*132f818dSEnji Cooper cp conftest.in conftest.nl 297*132f818dSEnji Cooper echo 'GREP' >> conftest.nl 298*132f818dSEnji Cooper "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break 299*132f818dSEnji Cooper diff conftest.out conftest.nl >/dev/null 2>&1 || break 300*132f818dSEnji Cooper _G_count=`expr $_G_count + 1` 301*132f818dSEnji Cooper if test "$_G_count" -gt "$_G_path_prog_max"; then 302*132f818dSEnji Cooper # Best one so far, save it but keep looking for a better one 303*132f818dSEnji Cooper func_check_prog_result=$_G_path_prog 304*132f818dSEnji Cooper _G_path_prog_max=$_G_count 305*132f818dSEnji Cooper fi 306*132f818dSEnji Cooper # 10*(2^10) chars as input seems more than enough 307*132f818dSEnji Cooper test 10 -lt "$_G_count" && break 308*132f818dSEnji Cooper done 309*132f818dSEnji Cooper rm -f conftest.in conftest.tmp conftest.nl conftest.out 310*132f818dSEnji Cooper } 311*132f818dSEnji Cooper 312*132f818dSEnji Cooper func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" 313*132f818dSEnji Cooper GREP=$func_path_progs_result 314*132f818dSEnji Cooper} 315*132f818dSEnji Cooper 316*132f818dSEnji Cooper 317*132f818dSEnji Cooper## ------------------------------- ## 318*132f818dSEnji Cooper## User overridable command paths. ## 319*132f818dSEnji Cooper## ------------------------------- ## 320*132f818dSEnji Cooper 321*132f818dSEnji Cooper# All uppercase variable names are used for environment variables. These 322*132f818dSEnji Cooper# variables can be overridden by the user before calling a script that 323*132f818dSEnji Cooper# uses them if a suitable command of that name is not already available 324*132f818dSEnji Cooper# in the command search PATH. 325*132f818dSEnji Cooper 326*132f818dSEnji Cooper: ${CP="cp -f"} 327*132f818dSEnji Cooper: ${ECHO="printf %s\n"} 328*132f818dSEnji Cooper: ${EGREP="$GREP -E"} 329*132f818dSEnji Cooper: ${FGREP="$GREP -F"} 330*132f818dSEnji Cooper: ${LN_S="ln -s"} 331*132f818dSEnji Cooper: ${MAKE="make"} 332*132f818dSEnji Cooper: ${MKDIR="mkdir"} 333*132f818dSEnji Cooper: ${MV="mv -f"} 334*132f818dSEnji Cooper: ${RM="rm -f"} 335*132f818dSEnji Cooper: ${SHELL="${CONFIG_SHELL-/bin/sh}"} 336*132f818dSEnji Cooper 337*132f818dSEnji Cooper 338*132f818dSEnji Cooper## -------------------- ## 339*132f818dSEnji Cooper## Useful sed snippets. ## 340*132f818dSEnji Cooper## -------------------- ## 341*132f818dSEnji Cooper 342*132f818dSEnji Coopersed_dirname='s|/[^/]*$||' 343*132f818dSEnji Coopersed_basename='s|^.*/||' 344*132f818dSEnji Cooper 345*132f818dSEnji Cooper# Sed substitution that helps us do robust quoting. It backslashifies 346*132f818dSEnji Cooper# metacharacters that are still active within double-quoted strings. 347*132f818dSEnji Coopersed_quote_subst='s|\([`"$\\]\)|\\\1|g' 348*132f818dSEnji Cooper 349*132f818dSEnji Cooper# Same as above, but do not quote variable references. 350*132f818dSEnji Coopersed_double_quote_subst='s/\(["`\\]\)/\\\1/g' 351*132f818dSEnji Cooper 352*132f818dSEnji Cooper# Sed substitution that turns a string into a regex matching for the 353*132f818dSEnji Cooper# string literally. 354*132f818dSEnji Coopersed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' 355*132f818dSEnji Cooper 356*132f818dSEnji Cooper# Sed substitution that converts a w32 file name or path 357*132f818dSEnji Cooper# that contains forward slashes, into one that contains 358*132f818dSEnji Cooper# (escaped) backslashes. A very naive implementation. 359*132f818dSEnji Coopersed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' 360*132f818dSEnji Cooper 361*132f818dSEnji Cooper# Re-'\' parameter expansions in output of sed_double_quote_subst that 362*132f818dSEnji Cooper# were '\'-ed in input to the same. If an odd number of '\' preceded a 363*132f818dSEnji Cooper# '$' in input to sed_double_quote_subst, that '$' was protected from 364*132f818dSEnji Cooper# expansion. Since each input '\' is now two '\'s, look for any number 365*132f818dSEnji Cooper# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. 366*132f818dSEnji Cooper_G_bs='\\' 367*132f818dSEnji Cooper_G_bs2='\\\\' 368*132f818dSEnji Cooper_G_bs4='\\\\\\\\' 369*132f818dSEnji Cooper_G_dollar='\$' 370*132f818dSEnji Coopersed_double_backslash="\ 371*132f818dSEnji Cooper s/$_G_bs4/&\\ 372*132f818dSEnji Cooper/g 373*132f818dSEnji Cooper s/^$_G_bs2$_G_dollar/$_G_bs&/ 374*132f818dSEnji Cooper s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g 375*132f818dSEnji Cooper s/\n//g" 376*132f818dSEnji Cooper 377*132f818dSEnji Cooper# require_check_ifs_backslash 378*132f818dSEnji Cooper# --------------------------- 379*132f818dSEnji Cooper# Check if we can use backslash as IFS='\' separator, and set 380*132f818dSEnji Cooper# $check_ifs_backshlash_broken to ':' or 'false'. 381*132f818dSEnji Cooperrequire_check_ifs_backslash=func_require_check_ifs_backslash 382*132f818dSEnji Cooperfunc_require_check_ifs_backslash () 383*132f818dSEnji Cooper{ 384*132f818dSEnji Cooper _G_save_IFS=$IFS 385*132f818dSEnji Cooper IFS='\' 386*132f818dSEnji Cooper _G_check_ifs_backshlash='a\\b' 387*132f818dSEnji Cooper for _G_i in $_G_check_ifs_backshlash 388*132f818dSEnji Cooper do 389*132f818dSEnji Cooper case $_G_i in 390*132f818dSEnji Cooper a) 391*132f818dSEnji Cooper check_ifs_backshlash_broken=false 392*132f818dSEnji Cooper ;; 393*132f818dSEnji Cooper '') 394*132f818dSEnji Cooper break 395*132f818dSEnji Cooper ;; 396*132f818dSEnji Cooper *) 397*132f818dSEnji Cooper check_ifs_backshlash_broken=: 398*132f818dSEnji Cooper break 399*132f818dSEnji Cooper ;; 400*132f818dSEnji Cooper esac 401*132f818dSEnji Cooper done 402*132f818dSEnji Cooper IFS=$_G_save_IFS 403*132f818dSEnji Cooper require_check_ifs_backslash=: 404*132f818dSEnji Cooper} 405*132f818dSEnji Cooper 406*132f818dSEnji Cooper 407*132f818dSEnji Cooper## ----------------- ## 408*132f818dSEnji Cooper## Global variables. ## 409*132f818dSEnji Cooper## ----------------- ## 410*132f818dSEnji Cooper 411*132f818dSEnji Cooper# Except for the global variables explicitly listed below, the following 412*132f818dSEnji Cooper# functions in the '^func_' namespace, and the '^require_' namespace 413*132f818dSEnji Cooper# variables initialised in the 'Resource management' section, sourcing 414*132f818dSEnji Cooper# this file will not pollute your global namespace with anything 415*132f818dSEnji Cooper# else. There's no portable way to scope variables in Bourne shell 416*132f818dSEnji Cooper# though, so actually running these functions will sometimes place 417*132f818dSEnji Cooper# results into a variable named after the function, and often use 418*132f818dSEnji Cooper# temporary variables in the '^_G_' namespace. If you are careful to 419*132f818dSEnji Cooper# avoid using those namespaces casually in your sourcing script, things 420*132f818dSEnji Cooper# should continue to work as you expect. And, of course, you can freely 421*132f818dSEnji Cooper# overwrite any of the functions or variables defined here before 422*132f818dSEnji Cooper# calling anything to customize them. 423*132f818dSEnji Cooper 424*132f818dSEnji CooperEXIT_SUCCESS=0 425*132f818dSEnji CooperEXIT_FAILURE=1 426*132f818dSEnji CooperEXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. 427*132f818dSEnji CooperEXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. 428*132f818dSEnji Cooper 429*132f818dSEnji Cooper# Allow overriding, eg assuming that you follow the convention of 430*132f818dSEnji Cooper# putting '$debug_cmd' at the start of all your functions, you can get 431*132f818dSEnji Cooper# bash to show function call trace with: 432*132f818dSEnji Cooper# 433*132f818dSEnji Cooper# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name 434*132f818dSEnji Cooperdebug_cmd=${debug_cmd-":"} 435*132f818dSEnji Cooperexit_cmd=: 436*132f818dSEnji Cooper 437*132f818dSEnji Cooper# By convention, finish your script with: 438*132f818dSEnji Cooper# 439*132f818dSEnji Cooper# exit $exit_status 440*132f818dSEnji Cooper# 441*132f818dSEnji Cooper# so that you can set exit_status to non-zero if you want to indicate 442*132f818dSEnji Cooper# something went wrong during execution without actually bailing out at 443*132f818dSEnji Cooper# the point of failure. 444*132f818dSEnji Cooperexit_status=$EXIT_SUCCESS 445*132f818dSEnji Cooper 446*132f818dSEnji Cooper# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh 447*132f818dSEnji Cooper# is ksh but when the shell is invoked as "sh" and the current value of 448*132f818dSEnji Cooper# the _XPG environment variable is not equal to 1 (one), the special 449*132f818dSEnji Cooper# positional parameter $0, within a function call, is the name of the 450*132f818dSEnji Cooper# function. 451*132f818dSEnji Cooperprogpath=$0 452*132f818dSEnji Cooper 453*132f818dSEnji Cooper# The name of this program. 454*132f818dSEnji Cooperprogname=`$ECHO "$progpath" |$SED "$sed_basename"` 455*132f818dSEnji Cooper 456*132f818dSEnji Cooper# Make sure we have an absolute progpath for reexecution: 457*132f818dSEnji Coopercase $progpath in 458*132f818dSEnji Cooper [\\/]*|[A-Za-z]:\\*) ;; 459*132f818dSEnji Cooper *[\\/]*) 460*132f818dSEnji Cooper progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` 461*132f818dSEnji Cooper progdir=`cd "$progdir" && pwd` 462*132f818dSEnji Cooper progpath=$progdir/$progname 463*132f818dSEnji Cooper ;; 464*132f818dSEnji Cooper *) 465*132f818dSEnji Cooper _G_IFS=$IFS 466*132f818dSEnji Cooper IFS=${PATH_SEPARATOR-:} 467*132f818dSEnji Cooper for progdir in $PATH; do 468*132f818dSEnji Cooper IFS=$_G_IFS 469*132f818dSEnji Cooper test -x "$progdir/$progname" && break 470*132f818dSEnji Cooper done 471*132f818dSEnji Cooper IFS=$_G_IFS 472*132f818dSEnji Cooper test -n "$progdir" || progdir=`pwd` 473*132f818dSEnji Cooper progpath=$progdir/$progname 474*132f818dSEnji Cooper ;; 475*132f818dSEnji Cooperesac 476*132f818dSEnji Cooper 477*132f818dSEnji Cooper 478*132f818dSEnji Cooper## ----------------- ## 479*132f818dSEnji Cooper## Standard options. ## 480*132f818dSEnji Cooper## ----------------- ## 481*132f818dSEnji Cooper 482*132f818dSEnji Cooper# The following options affect the operation of the functions defined 483*132f818dSEnji Cooper# below, and should be set appropriately depending on run-time para- 484*132f818dSEnji Cooper# meters passed on the command line. 485*132f818dSEnji Cooper 486*132f818dSEnji Cooperopt_dry_run=false 487*132f818dSEnji Cooperopt_quiet=false 488*132f818dSEnji Cooperopt_verbose=false 489*132f818dSEnji Cooper 490*132f818dSEnji Cooper# Categories 'all' and 'none' are always available. Append any others 491*132f818dSEnji Cooper# you will pass as the first argument to func_warning from your own 492*132f818dSEnji Cooper# code. 493*132f818dSEnji Cooperwarning_categories= 494*132f818dSEnji Cooper 495*132f818dSEnji Cooper# By default, display warnings according to 'opt_warning_types'. Set 496*132f818dSEnji Cooper# 'warning_func' to ':' to elide all warnings, or func_fatal_error to 497*132f818dSEnji Cooper# treat the next displayed warning as a fatal error. 498*132f818dSEnji Cooperwarning_func=func_warn_and_continue 499*132f818dSEnji Cooper 500*132f818dSEnji Cooper# Set to 'all' to display all warnings, 'none' to suppress all 501*132f818dSEnji Cooper# warnings, or a space delimited list of some subset of 502*132f818dSEnji Cooper# 'warning_categories' to display only the listed warnings. 503*132f818dSEnji Cooperopt_warning_types=all 504*132f818dSEnji Cooper 505*132f818dSEnji Cooper 506*132f818dSEnji Cooper## -------------------- ## 507*132f818dSEnji Cooper## Resource management. ## 508*132f818dSEnji Cooper## -------------------- ## 509*132f818dSEnji Cooper 510*132f818dSEnji Cooper# This section contains definitions for functions that each ensure a 511*132f818dSEnji Cooper# particular resource (a file, or a non-empty configuration variable for 512*132f818dSEnji Cooper# example) is available, and if appropriate to extract default values 513*132f818dSEnji Cooper# from pertinent package files. Call them using their associated 514*132f818dSEnji Cooper# 'require_*' variable to ensure that they are executed, at most, once. 515*132f818dSEnji Cooper# 516*132f818dSEnji Cooper# It's entirely deliberate that calling these functions can set 517*132f818dSEnji Cooper# variables that don't obey the namespace limitations obeyed by the rest 518*132f818dSEnji Cooper# of this file, in order that that they be as useful as possible to 519*132f818dSEnji Cooper# callers. 520*132f818dSEnji Cooper 521*132f818dSEnji Cooper 522*132f818dSEnji Cooper# require_term_colors 523*132f818dSEnji Cooper# ------------------- 524*132f818dSEnji Cooper# Allow display of bold text on terminals that support it. 525*132f818dSEnji Cooperrequire_term_colors=func_require_term_colors 526*132f818dSEnji Cooperfunc_require_term_colors () 527*132f818dSEnji Cooper{ 528*132f818dSEnji Cooper $debug_cmd 529*132f818dSEnji Cooper 530*132f818dSEnji Cooper test -t 1 && { 531*132f818dSEnji Cooper # COLORTERM and USE_ANSI_COLORS environment variables take 532*132f818dSEnji Cooper # precedence, because most terminfo databases neglect to describe 533*132f818dSEnji Cooper # whether color sequences are supported. 534*132f818dSEnji Cooper test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} 535*132f818dSEnji Cooper 536*132f818dSEnji Cooper if test 1 = "$USE_ANSI_COLORS"; then 537*132f818dSEnji Cooper # Standard ANSI escape sequences 538*132f818dSEnji Cooper tc_reset='[0m' 539*132f818dSEnji Cooper tc_bold='[1m'; tc_standout='[7m' 540*132f818dSEnji Cooper tc_red='[31m'; tc_green='[32m' 541*132f818dSEnji Cooper tc_blue='[34m'; tc_cyan='[36m' 542*132f818dSEnji Cooper else 543*132f818dSEnji Cooper # Otherwise trust the terminfo database after all. 544*132f818dSEnji Cooper test -n "`tput sgr0 2>/dev/null`" && { 545*132f818dSEnji Cooper tc_reset=`tput sgr0` 546*132f818dSEnji Cooper test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` 547*132f818dSEnji Cooper tc_standout=$tc_bold 548*132f818dSEnji Cooper test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` 549*132f818dSEnji Cooper test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` 550*132f818dSEnji Cooper test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` 551*132f818dSEnji Cooper test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` 552*132f818dSEnji Cooper test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` 553*132f818dSEnji Cooper } 554*132f818dSEnji Cooper fi 555*132f818dSEnji Cooper } 556*132f818dSEnji Cooper 557*132f818dSEnji Cooper require_term_colors=: 558*132f818dSEnji Cooper} 559*132f818dSEnji Cooper 560*132f818dSEnji Cooper 561*132f818dSEnji Cooper## ----------------- ## 562*132f818dSEnji Cooper## Function library. ## 563*132f818dSEnji Cooper## ----------------- ## 564*132f818dSEnji Cooper 565*132f818dSEnji Cooper# This section contains a variety of useful functions to call in your 566*132f818dSEnji Cooper# scripts. Take note of the portable wrappers for features provided by 567*132f818dSEnji Cooper# some modern shells, which will fall back to slower equivalents on 568*132f818dSEnji Cooper# less featureful shells. 569*132f818dSEnji Cooper 570*132f818dSEnji Cooper 571*132f818dSEnji Cooper# func_append VAR VALUE 572*132f818dSEnji Cooper# --------------------- 573*132f818dSEnji Cooper# Append VALUE onto the existing contents of VAR. 574*132f818dSEnji Cooper 575*132f818dSEnji Cooper # We should try to minimise forks, especially on Windows where they are 576*132f818dSEnji Cooper # unreasonably slow, so skip the feature probes when bash or zsh are 577*132f818dSEnji Cooper # being used: 578*132f818dSEnji Cooper if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then 579*132f818dSEnji Cooper : ${_G_HAVE_ARITH_OP="yes"} 580*132f818dSEnji Cooper : ${_G_HAVE_XSI_OPS="yes"} 581*132f818dSEnji Cooper # The += operator was introduced in bash 3.1 582*132f818dSEnji Cooper case $BASH_VERSION in 583*132f818dSEnji Cooper [12].* | 3.0 | 3.0*) ;; 584*132f818dSEnji Cooper *) 585*132f818dSEnji Cooper : ${_G_HAVE_PLUSEQ_OP="yes"} 586*132f818dSEnji Cooper ;; 587*132f818dSEnji Cooper esac 588*132f818dSEnji Cooper fi 589*132f818dSEnji Cooper 590*132f818dSEnji Cooper # _G_HAVE_PLUSEQ_OP 591*132f818dSEnji Cooper # Can be empty, in which case the shell is probed, "yes" if += is 592*132f818dSEnji Cooper # usable or anything else if it does not work. 593*132f818dSEnji Cooper test -z "$_G_HAVE_PLUSEQ_OP" \ 594*132f818dSEnji Cooper && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ 595*132f818dSEnji Cooper && _G_HAVE_PLUSEQ_OP=yes 596*132f818dSEnji Cooper 597*132f818dSEnji Cooperif test yes = "$_G_HAVE_PLUSEQ_OP" 598*132f818dSEnji Cooperthen 599*132f818dSEnji Cooper # This is an XSI compatible shell, allowing a faster implementation... 600*132f818dSEnji Cooper eval 'func_append () 601*132f818dSEnji Cooper { 602*132f818dSEnji Cooper $debug_cmd 603*132f818dSEnji Cooper 604*132f818dSEnji Cooper eval "$1+=\$2" 605*132f818dSEnji Cooper }' 606*132f818dSEnji Cooperelse 607*132f818dSEnji Cooper # ...otherwise fall back to using expr, which is often a shell builtin. 608*132f818dSEnji Cooper func_append () 609*132f818dSEnji Cooper { 610*132f818dSEnji Cooper $debug_cmd 611*132f818dSEnji Cooper 612*132f818dSEnji Cooper eval "$1=\$$1\$2" 613*132f818dSEnji Cooper } 614*132f818dSEnji Cooperfi 615*132f818dSEnji Cooper 616*132f818dSEnji Cooper 617*132f818dSEnji Cooper# func_append_quoted VAR VALUE 618*132f818dSEnji Cooper# ---------------------------- 619*132f818dSEnji Cooper# Quote VALUE and append to the end of shell variable VAR, separated 620*132f818dSEnji Cooper# by a space. 621*132f818dSEnji Cooperif test yes = "$_G_HAVE_PLUSEQ_OP"; then 622*132f818dSEnji Cooper eval 'func_append_quoted () 623*132f818dSEnji Cooper { 624*132f818dSEnji Cooper $debug_cmd 625*132f818dSEnji Cooper 626*132f818dSEnji Cooper func_quote_arg pretty "$2" 627*132f818dSEnji Cooper eval "$1+=\\ \$func_quote_arg_result" 628*132f818dSEnji Cooper }' 629*132f818dSEnji Cooperelse 630*132f818dSEnji Cooper func_append_quoted () 631*132f818dSEnji Cooper { 632*132f818dSEnji Cooper $debug_cmd 633*132f818dSEnji Cooper 634*132f818dSEnji Cooper func_quote_arg pretty "$2" 635*132f818dSEnji Cooper eval "$1=\$$1\\ \$func_quote_arg_result" 636*132f818dSEnji Cooper } 637*132f818dSEnji Cooperfi 638*132f818dSEnji Cooper 639*132f818dSEnji Cooper 640*132f818dSEnji Cooper# func_append_uniq VAR VALUE 641*132f818dSEnji Cooper# -------------------------- 642*132f818dSEnji Cooper# Append unique VALUE onto the existing contents of VAR, assuming 643*132f818dSEnji Cooper# entries are delimited by the first character of VALUE. For example: 644*132f818dSEnji Cooper# 645*132f818dSEnji Cooper# func_append_uniq options " --another-option option-argument" 646*132f818dSEnji Cooper# 647*132f818dSEnji Cooper# will only append to $options if " --another-option option-argument " 648*132f818dSEnji Cooper# is not already present somewhere in $options already (note spaces at 649*132f818dSEnji Cooper# each end implied by leading space in second argument). 650*132f818dSEnji Cooperfunc_append_uniq () 651*132f818dSEnji Cooper{ 652*132f818dSEnji Cooper $debug_cmd 653*132f818dSEnji Cooper 654*132f818dSEnji Cooper eval _G_current_value='`$ECHO $'$1'`' 655*132f818dSEnji Cooper _G_delim=`expr "$2" : '\(.\)'` 656*132f818dSEnji Cooper 657*132f818dSEnji Cooper case $_G_delim$_G_current_value$_G_delim in 658*132f818dSEnji Cooper *"$2$_G_delim"*) ;; 659*132f818dSEnji Cooper *) func_append "$@" ;; 660*132f818dSEnji Cooper esac 661*132f818dSEnji Cooper} 662*132f818dSEnji Cooper 663*132f818dSEnji Cooper 664*132f818dSEnji Cooper# func_arith TERM... 665*132f818dSEnji Cooper# ------------------ 666*132f818dSEnji Cooper# Set func_arith_result to the result of evaluating TERMs. 667*132f818dSEnji Cooper test -z "$_G_HAVE_ARITH_OP" \ 668*132f818dSEnji Cooper && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ 669*132f818dSEnji Cooper && _G_HAVE_ARITH_OP=yes 670*132f818dSEnji Cooper 671*132f818dSEnji Cooperif test yes = "$_G_HAVE_ARITH_OP"; then 672*132f818dSEnji Cooper eval 'func_arith () 673*132f818dSEnji Cooper { 674*132f818dSEnji Cooper $debug_cmd 675*132f818dSEnji Cooper 676*132f818dSEnji Cooper func_arith_result=$(( $* )) 677*132f818dSEnji Cooper }' 678*132f818dSEnji Cooperelse 679*132f818dSEnji Cooper func_arith () 680*132f818dSEnji Cooper { 681*132f818dSEnji Cooper $debug_cmd 682*132f818dSEnji Cooper 683*132f818dSEnji Cooper func_arith_result=`expr "$@"` 684*132f818dSEnji Cooper } 685*132f818dSEnji Cooperfi 686*132f818dSEnji Cooper 687*132f818dSEnji Cooper 688*132f818dSEnji Cooper# func_basename FILE 689*132f818dSEnji Cooper# ------------------ 690*132f818dSEnji Cooper# Set func_basename_result to FILE with everything up to and including 691*132f818dSEnji Cooper# the last / stripped. 692*132f818dSEnji Cooperif test yes = "$_G_HAVE_XSI_OPS"; then 693*132f818dSEnji Cooper # If this shell supports suffix pattern removal, then use it to avoid 694*132f818dSEnji Cooper # forking. Hide the definitions single quotes in case the shell chokes 695*132f818dSEnji Cooper # on unsupported syntax... 696*132f818dSEnji Cooper _b='func_basename_result=${1##*/}' 697*132f818dSEnji Cooper _d='case $1 in 698*132f818dSEnji Cooper */*) func_dirname_result=${1%/*}$2 ;; 699*132f818dSEnji Cooper * ) func_dirname_result=$3 ;; 700*132f818dSEnji Cooper esac' 701*132f818dSEnji Cooper 702*132f818dSEnji Cooperelse 703*132f818dSEnji Cooper # ...otherwise fall back to using sed. 704*132f818dSEnji Cooper _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' 705*132f818dSEnji Cooper _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` 706*132f818dSEnji Cooper if test "X$func_dirname_result" = "X$1"; then 707*132f818dSEnji Cooper func_dirname_result=$3 708*132f818dSEnji Cooper else 709*132f818dSEnji Cooper func_append func_dirname_result "$2" 710*132f818dSEnji Cooper fi' 711*132f818dSEnji Cooperfi 712*132f818dSEnji Cooper 713*132f818dSEnji Coopereval 'func_basename () 714*132f818dSEnji Cooper{ 715*132f818dSEnji Cooper $debug_cmd 716*132f818dSEnji Cooper 717*132f818dSEnji Cooper '"$_b"' 718*132f818dSEnji Cooper}' 719*132f818dSEnji Cooper 720*132f818dSEnji Cooper 721*132f818dSEnji Cooper# func_dirname FILE APPEND NONDIR_REPLACEMENT 722*132f818dSEnji Cooper# ------------------------------------------- 723*132f818dSEnji Cooper# Compute the dirname of FILE. If nonempty, add APPEND to the result, 724*132f818dSEnji Cooper# otherwise set result to NONDIR_REPLACEMENT. 725*132f818dSEnji Coopereval 'func_dirname () 726*132f818dSEnji Cooper{ 727*132f818dSEnji Cooper $debug_cmd 728*132f818dSEnji Cooper 729*132f818dSEnji Cooper '"$_d"' 730*132f818dSEnji Cooper}' 731*132f818dSEnji Cooper 732*132f818dSEnji Cooper 733*132f818dSEnji Cooper# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT 734*132f818dSEnji Cooper# -------------------------------------------------------- 735*132f818dSEnji Cooper# Perform func_basename and func_dirname in a single function 736*132f818dSEnji Cooper# call: 737*132f818dSEnji Cooper# dirname: Compute the dirname of FILE. If nonempty, 738*132f818dSEnji Cooper# add APPEND to the result, otherwise set result 739*132f818dSEnji Cooper# to NONDIR_REPLACEMENT. 740*132f818dSEnji Cooper# value returned in "$func_dirname_result" 741*132f818dSEnji Cooper# basename: Compute filename of FILE. 742*132f818dSEnji Cooper# value returned in "$func_basename_result" 743*132f818dSEnji Cooper# For efficiency, we do not delegate to the functions above but instead 744*132f818dSEnji Cooper# duplicate the functionality here. 745*132f818dSEnji Coopereval 'func_dirname_and_basename () 746*132f818dSEnji Cooper{ 747*132f818dSEnji Cooper $debug_cmd 748*132f818dSEnji Cooper 749*132f818dSEnji Cooper '"$_b"' 750*132f818dSEnji Cooper '"$_d"' 751*132f818dSEnji Cooper}' 752*132f818dSEnji Cooper 753*132f818dSEnji Cooper 754*132f818dSEnji Cooper# func_echo ARG... 755*132f818dSEnji Cooper# ---------------- 756*132f818dSEnji Cooper# Echo program name prefixed message. 757*132f818dSEnji Cooperfunc_echo () 758*132f818dSEnji Cooper{ 759*132f818dSEnji Cooper $debug_cmd 760*132f818dSEnji Cooper 761*132f818dSEnji Cooper _G_message=$* 762*132f818dSEnji Cooper 763*132f818dSEnji Cooper func_echo_IFS=$IFS 764*132f818dSEnji Cooper IFS=$nl 765*132f818dSEnji Cooper for _G_line in $_G_message; do 766*132f818dSEnji Cooper IFS=$func_echo_IFS 767*132f818dSEnji Cooper $ECHO "$progname: $_G_line" 768*132f818dSEnji Cooper done 769*132f818dSEnji Cooper IFS=$func_echo_IFS 770*132f818dSEnji Cooper} 771*132f818dSEnji Cooper 772*132f818dSEnji Cooper 773*132f818dSEnji Cooper# func_echo_all ARG... 774*132f818dSEnji Cooper# -------------------- 775*132f818dSEnji Cooper# Invoke $ECHO with all args, space-separated. 776*132f818dSEnji Cooperfunc_echo_all () 777*132f818dSEnji Cooper{ 778*132f818dSEnji Cooper $ECHO "$*" 779*132f818dSEnji Cooper} 780*132f818dSEnji Cooper 781*132f818dSEnji Cooper 782*132f818dSEnji Cooper# func_echo_infix_1 INFIX ARG... 783*132f818dSEnji Cooper# ------------------------------ 784*132f818dSEnji Cooper# Echo program name, followed by INFIX on the first line, with any 785*132f818dSEnji Cooper# additional lines not showing INFIX. 786*132f818dSEnji Cooperfunc_echo_infix_1 () 787*132f818dSEnji Cooper{ 788*132f818dSEnji Cooper $debug_cmd 789*132f818dSEnji Cooper 790*132f818dSEnji Cooper $require_term_colors 791*132f818dSEnji Cooper 792*132f818dSEnji Cooper _G_infix=$1; shift 793*132f818dSEnji Cooper _G_indent=$_G_infix 794*132f818dSEnji Cooper _G_prefix="$progname: $_G_infix: " 795*132f818dSEnji Cooper _G_message=$* 796*132f818dSEnji Cooper 797*132f818dSEnji Cooper # Strip color escape sequences before counting printable length 798*132f818dSEnji Cooper for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" 799*132f818dSEnji Cooper do 800*132f818dSEnji Cooper test -n "$_G_tc" && { 801*132f818dSEnji Cooper _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` 802*132f818dSEnji Cooper _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` 803*132f818dSEnji Cooper } 804*132f818dSEnji Cooper done 805*132f818dSEnji Cooper _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes 806*132f818dSEnji Cooper 807*132f818dSEnji Cooper func_echo_infix_1_IFS=$IFS 808*132f818dSEnji Cooper IFS=$nl 809*132f818dSEnji Cooper for _G_line in $_G_message; do 810*132f818dSEnji Cooper IFS=$func_echo_infix_1_IFS 811*132f818dSEnji Cooper $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 812*132f818dSEnji Cooper _G_prefix=$_G_indent 813*132f818dSEnji Cooper done 814*132f818dSEnji Cooper IFS=$func_echo_infix_1_IFS 815*132f818dSEnji Cooper} 816*132f818dSEnji Cooper 817*132f818dSEnji Cooper 818*132f818dSEnji Cooper# func_error ARG... 819*132f818dSEnji Cooper# ----------------- 820*132f818dSEnji Cooper# Echo program name prefixed message to standard error. 821*132f818dSEnji Cooperfunc_error () 822*132f818dSEnji Cooper{ 823*132f818dSEnji Cooper $debug_cmd 824*132f818dSEnji Cooper 825*132f818dSEnji Cooper $require_term_colors 826*132f818dSEnji Cooper 827*132f818dSEnji Cooper func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 828*132f818dSEnji Cooper} 829*132f818dSEnji Cooper 830*132f818dSEnji Cooper 831*132f818dSEnji Cooper# func_fatal_error ARG... 832*132f818dSEnji Cooper# ----------------------- 833*132f818dSEnji Cooper# Echo program name prefixed message to standard error, and exit. 834*132f818dSEnji Cooperfunc_fatal_error () 835*132f818dSEnji Cooper{ 836*132f818dSEnji Cooper $debug_cmd 837*132f818dSEnji Cooper 838*132f818dSEnji Cooper func_error "$*" 839*132f818dSEnji Cooper exit $EXIT_FAILURE 840*132f818dSEnji Cooper} 841*132f818dSEnji Cooper 842*132f818dSEnji Cooper 843*132f818dSEnji Cooper# func_grep EXPRESSION FILENAME 844*132f818dSEnji Cooper# ----------------------------- 845*132f818dSEnji Cooper# Check whether EXPRESSION matches any line of FILENAME, without output. 846*132f818dSEnji Cooperfunc_grep () 847*132f818dSEnji Cooper{ 848*132f818dSEnji Cooper $debug_cmd 849*132f818dSEnji Cooper 850*132f818dSEnji Cooper $GREP "$1" "$2" >/dev/null 2>&1 851*132f818dSEnji Cooper} 852*132f818dSEnji Cooper 853*132f818dSEnji Cooper 854*132f818dSEnji Cooper# func_len STRING 855*132f818dSEnji Cooper# --------------- 856*132f818dSEnji Cooper# Set func_len_result to the length of STRING. STRING may not 857*132f818dSEnji Cooper# start with a hyphen. 858*132f818dSEnji Cooper test -z "$_G_HAVE_XSI_OPS" \ 859*132f818dSEnji Cooper && (eval 'x=a/b/c; 860*132f818dSEnji Cooper test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ 861*132f818dSEnji Cooper && _G_HAVE_XSI_OPS=yes 862*132f818dSEnji Cooper 863*132f818dSEnji Cooperif test yes = "$_G_HAVE_XSI_OPS"; then 864*132f818dSEnji Cooper eval 'func_len () 865*132f818dSEnji Cooper { 866*132f818dSEnji Cooper $debug_cmd 867*132f818dSEnji Cooper 868*132f818dSEnji Cooper func_len_result=${#1} 869*132f818dSEnji Cooper }' 870*132f818dSEnji Cooperelse 871*132f818dSEnji Cooper func_len () 872*132f818dSEnji Cooper { 873*132f818dSEnji Cooper $debug_cmd 874*132f818dSEnji Cooper 875*132f818dSEnji Cooper func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` 876*132f818dSEnji Cooper } 877*132f818dSEnji Cooperfi 878*132f818dSEnji Cooper 879*132f818dSEnji Cooper 880*132f818dSEnji Cooper# func_mkdir_p DIRECTORY-PATH 881*132f818dSEnji Cooper# --------------------------- 882*132f818dSEnji Cooper# Make sure the entire path to DIRECTORY-PATH is available. 883*132f818dSEnji Cooperfunc_mkdir_p () 884*132f818dSEnji Cooper{ 885*132f818dSEnji Cooper $debug_cmd 886*132f818dSEnji Cooper 887*132f818dSEnji Cooper _G_directory_path=$1 888*132f818dSEnji Cooper _G_dir_list= 889*132f818dSEnji Cooper 890*132f818dSEnji Cooper if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then 891*132f818dSEnji Cooper 892*132f818dSEnji Cooper # Protect directory names starting with '-' 893*132f818dSEnji Cooper case $_G_directory_path in 894*132f818dSEnji Cooper -*) _G_directory_path=./$_G_directory_path ;; 895*132f818dSEnji Cooper esac 896*132f818dSEnji Cooper 897*132f818dSEnji Cooper # While some portion of DIR does not yet exist... 898*132f818dSEnji Cooper while test ! -d "$_G_directory_path"; do 899*132f818dSEnji Cooper # ...make a list in topmost first order. Use a colon delimited 900*132f818dSEnji Cooper # list in case some portion of path contains whitespace. 901*132f818dSEnji Cooper _G_dir_list=$_G_directory_path:$_G_dir_list 902*132f818dSEnji Cooper 903*132f818dSEnji Cooper # If the last portion added has no slash in it, the list is done 904*132f818dSEnji Cooper case $_G_directory_path in */*) ;; *) break ;; esac 905*132f818dSEnji Cooper 906*132f818dSEnji Cooper # ...otherwise throw away the child directory and loop 907*132f818dSEnji Cooper _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` 908*132f818dSEnji Cooper done 909*132f818dSEnji Cooper _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` 910*132f818dSEnji Cooper 911*132f818dSEnji Cooper func_mkdir_p_IFS=$IFS; IFS=: 912*132f818dSEnji Cooper for _G_dir in $_G_dir_list; do 913*132f818dSEnji Cooper IFS=$func_mkdir_p_IFS 914*132f818dSEnji Cooper # mkdir can fail with a 'File exist' error if two processes 915*132f818dSEnji Cooper # try to create one of the directories concurrently. Don't 916*132f818dSEnji Cooper # stop in that case! 917*132f818dSEnji Cooper $MKDIR "$_G_dir" 2>/dev/null || : 918*132f818dSEnji Cooper done 919*132f818dSEnji Cooper IFS=$func_mkdir_p_IFS 920*132f818dSEnji Cooper 921*132f818dSEnji Cooper # Bail out if we (or some other process) failed to create a directory. 922*132f818dSEnji Cooper test -d "$_G_directory_path" || \ 923*132f818dSEnji Cooper func_fatal_error "Failed to create '$1'" 924*132f818dSEnji Cooper fi 925*132f818dSEnji Cooper} 926*132f818dSEnji Cooper 927*132f818dSEnji Cooper 928*132f818dSEnji Cooper# func_mktempdir [BASENAME] 929*132f818dSEnji Cooper# ------------------------- 930*132f818dSEnji Cooper# Make a temporary directory that won't clash with other running 931*132f818dSEnji Cooper# libtool processes, and avoids race conditions if possible. If 932*132f818dSEnji Cooper# given, BASENAME is the basename for that directory. 933*132f818dSEnji Cooperfunc_mktempdir () 934*132f818dSEnji Cooper{ 935*132f818dSEnji Cooper $debug_cmd 936*132f818dSEnji Cooper 937*132f818dSEnji Cooper _G_template=${TMPDIR-/tmp}/${1-$progname} 938*132f818dSEnji Cooper 939*132f818dSEnji Cooper if test : = "$opt_dry_run"; then 940*132f818dSEnji Cooper # Return a directory name, but don't create it in dry-run mode 941*132f818dSEnji Cooper _G_tmpdir=$_G_template-$$ 942*132f818dSEnji Cooper else 943*132f818dSEnji Cooper 944*132f818dSEnji Cooper # If mktemp works, use that first and foremost 945*132f818dSEnji Cooper _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` 946*132f818dSEnji Cooper 947*132f818dSEnji Cooper if test ! -d "$_G_tmpdir"; then 948*132f818dSEnji Cooper # Failing that, at least try and use $RANDOM to avoid a race 949*132f818dSEnji Cooper _G_tmpdir=$_G_template-${RANDOM-0}$$ 950*132f818dSEnji Cooper 951*132f818dSEnji Cooper func_mktempdir_umask=`umask` 952*132f818dSEnji Cooper umask 0077 953*132f818dSEnji Cooper $MKDIR "$_G_tmpdir" 954*132f818dSEnji Cooper umask $func_mktempdir_umask 955*132f818dSEnji Cooper fi 956*132f818dSEnji Cooper 957*132f818dSEnji Cooper # If we're not in dry-run mode, bomb out on failure 958*132f818dSEnji Cooper test -d "$_G_tmpdir" || \ 959*132f818dSEnji Cooper func_fatal_error "cannot create temporary directory '$_G_tmpdir'" 960*132f818dSEnji Cooper fi 961*132f818dSEnji Cooper 962*132f818dSEnji Cooper $ECHO "$_G_tmpdir" 963*132f818dSEnji Cooper} 964*132f818dSEnji Cooper 965*132f818dSEnji Cooper 966*132f818dSEnji Cooper# func_normal_abspath PATH 967*132f818dSEnji Cooper# ------------------------ 968*132f818dSEnji Cooper# Remove doubled-up and trailing slashes, "." path components, 969*132f818dSEnji Cooper# and cancel out any ".." path components in PATH after making 970*132f818dSEnji Cooper# it an absolute path. 971*132f818dSEnji Cooperfunc_normal_abspath () 972*132f818dSEnji Cooper{ 973*132f818dSEnji Cooper $debug_cmd 974*132f818dSEnji Cooper 975*132f818dSEnji Cooper # These SED scripts presuppose an absolute path with a trailing slash. 976*132f818dSEnji Cooper _G_pathcar='s|^/\([^/]*\).*$|\1|' 977*132f818dSEnji Cooper _G_pathcdr='s|^/[^/]*||' 978*132f818dSEnji Cooper _G_removedotparts=':dotsl 979*132f818dSEnji Cooper s|/\./|/|g 980*132f818dSEnji Cooper t dotsl 981*132f818dSEnji Cooper s|/\.$|/|' 982*132f818dSEnji Cooper _G_collapseslashes='s|/\{1,\}|/|g' 983*132f818dSEnji Cooper _G_finalslash='s|/*$|/|' 984*132f818dSEnji Cooper 985*132f818dSEnji Cooper # Start from root dir and reassemble the path. 986*132f818dSEnji Cooper func_normal_abspath_result= 987*132f818dSEnji Cooper func_normal_abspath_tpath=$1 988*132f818dSEnji Cooper func_normal_abspath_altnamespace= 989*132f818dSEnji Cooper case $func_normal_abspath_tpath in 990*132f818dSEnji Cooper "") 991*132f818dSEnji Cooper # Empty path, that just means $cwd. 992*132f818dSEnji Cooper func_stripname '' '/' "`pwd`" 993*132f818dSEnji Cooper func_normal_abspath_result=$func_stripname_result 994*132f818dSEnji Cooper return 995*132f818dSEnji Cooper ;; 996*132f818dSEnji Cooper # The next three entries are used to spot a run of precisely 997*132f818dSEnji Cooper # two leading slashes without using negated character classes; 998*132f818dSEnji Cooper # we take advantage of case's first-match behaviour. 999*132f818dSEnji Cooper ///*) 1000*132f818dSEnji Cooper # Unusual form of absolute path, do nothing. 1001*132f818dSEnji Cooper ;; 1002*132f818dSEnji Cooper //*) 1003*132f818dSEnji Cooper # Not necessarily an ordinary path; POSIX reserves leading '//' 1004*132f818dSEnji Cooper # and for example Cygwin uses it to access remote file shares 1005*132f818dSEnji Cooper # over CIFS/SMB, so we conserve a leading double slash if found. 1006*132f818dSEnji Cooper func_normal_abspath_altnamespace=/ 1007*132f818dSEnji Cooper ;; 1008*132f818dSEnji Cooper /*) 1009*132f818dSEnji Cooper # Absolute path, do nothing. 1010*132f818dSEnji Cooper ;; 1011*132f818dSEnji Cooper *) 1012*132f818dSEnji Cooper # Relative path, prepend $cwd. 1013*132f818dSEnji Cooper func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath 1014*132f818dSEnji Cooper ;; 1015*132f818dSEnji Cooper esac 1016*132f818dSEnji Cooper 1017*132f818dSEnji Cooper # Cancel out all the simple stuff to save iterations. We also want 1018*132f818dSEnji Cooper # the path to end with a slash for ease of parsing, so make sure 1019*132f818dSEnji Cooper # there is one (and only one) here. 1020*132f818dSEnji Cooper func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ 1021*132f818dSEnji Cooper -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` 1022*132f818dSEnji Cooper while :; do 1023*132f818dSEnji Cooper # Processed it all yet? 1024*132f818dSEnji Cooper if test / = "$func_normal_abspath_tpath"; then 1025*132f818dSEnji Cooper # If we ascended to the root using ".." the result may be empty now. 1026*132f818dSEnji Cooper if test -z "$func_normal_abspath_result"; then 1027*132f818dSEnji Cooper func_normal_abspath_result=/ 1028*132f818dSEnji Cooper fi 1029*132f818dSEnji Cooper break 1030*132f818dSEnji Cooper fi 1031*132f818dSEnji Cooper func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ 1032*132f818dSEnji Cooper -e "$_G_pathcar"` 1033*132f818dSEnji Cooper func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ 1034*132f818dSEnji Cooper -e "$_G_pathcdr"` 1035*132f818dSEnji Cooper # Figure out what to do with it 1036*132f818dSEnji Cooper case $func_normal_abspath_tcomponent in 1037*132f818dSEnji Cooper "") 1038*132f818dSEnji Cooper # Trailing empty path component, ignore it. 1039*132f818dSEnji Cooper ;; 1040*132f818dSEnji Cooper ..) 1041*132f818dSEnji Cooper # Parent dir; strip last assembled component from result. 1042*132f818dSEnji Cooper func_dirname "$func_normal_abspath_result" 1043*132f818dSEnji Cooper func_normal_abspath_result=$func_dirname_result 1044*132f818dSEnji Cooper ;; 1045*132f818dSEnji Cooper *) 1046*132f818dSEnji Cooper # Actual path component, append it. 1047*132f818dSEnji Cooper func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" 1048*132f818dSEnji Cooper ;; 1049*132f818dSEnji Cooper esac 1050*132f818dSEnji Cooper done 1051*132f818dSEnji Cooper # Restore leading double-slash if one was found on entry. 1052*132f818dSEnji Cooper func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result 1053*132f818dSEnji Cooper} 1054*132f818dSEnji Cooper 1055*132f818dSEnji Cooper 1056*132f818dSEnji Cooper# func_notquiet ARG... 1057*132f818dSEnji Cooper# -------------------- 1058*132f818dSEnji Cooper# Echo program name prefixed message only when not in quiet mode. 1059*132f818dSEnji Cooperfunc_notquiet () 1060*132f818dSEnji Cooper{ 1061*132f818dSEnji Cooper $debug_cmd 1062*132f818dSEnji Cooper 1063*132f818dSEnji Cooper $opt_quiet || func_echo ${1+"$@"} 1064*132f818dSEnji Cooper 1065*132f818dSEnji Cooper # A bug in bash halts the script if the last line of a function 1066*132f818dSEnji Cooper # fails when set -e is in force, so we need another command to 1067*132f818dSEnji Cooper # work around that: 1068*132f818dSEnji Cooper : 1069*132f818dSEnji Cooper} 1070*132f818dSEnji Cooper 1071*132f818dSEnji Cooper 1072*132f818dSEnji Cooper# func_relative_path SRCDIR DSTDIR 1073*132f818dSEnji Cooper# -------------------------------- 1074*132f818dSEnji Cooper# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. 1075*132f818dSEnji Cooperfunc_relative_path () 1076*132f818dSEnji Cooper{ 1077*132f818dSEnji Cooper $debug_cmd 1078*132f818dSEnji Cooper 1079*132f818dSEnji Cooper func_relative_path_result= 1080*132f818dSEnji Cooper func_normal_abspath "$1" 1081*132f818dSEnji Cooper func_relative_path_tlibdir=$func_normal_abspath_result 1082*132f818dSEnji Cooper func_normal_abspath "$2" 1083*132f818dSEnji Cooper func_relative_path_tbindir=$func_normal_abspath_result 1084*132f818dSEnji Cooper 1085*132f818dSEnji Cooper # Ascend the tree starting from libdir 1086*132f818dSEnji Cooper while :; do 1087*132f818dSEnji Cooper # check if we have found a prefix of bindir 1088*132f818dSEnji Cooper case $func_relative_path_tbindir in 1089*132f818dSEnji Cooper $func_relative_path_tlibdir) 1090*132f818dSEnji Cooper # found an exact match 1091*132f818dSEnji Cooper func_relative_path_tcancelled= 1092*132f818dSEnji Cooper break 1093*132f818dSEnji Cooper ;; 1094*132f818dSEnji Cooper $func_relative_path_tlibdir*) 1095*132f818dSEnji Cooper # found a matching prefix 1096*132f818dSEnji Cooper func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" 1097*132f818dSEnji Cooper func_relative_path_tcancelled=$func_stripname_result 1098*132f818dSEnji Cooper if test -z "$func_relative_path_result"; then 1099*132f818dSEnji Cooper func_relative_path_result=. 1100*132f818dSEnji Cooper fi 1101*132f818dSEnji Cooper break 1102*132f818dSEnji Cooper ;; 1103*132f818dSEnji Cooper *) 1104*132f818dSEnji Cooper func_dirname $func_relative_path_tlibdir 1105*132f818dSEnji Cooper func_relative_path_tlibdir=$func_dirname_result 1106*132f818dSEnji Cooper if test -z "$func_relative_path_tlibdir"; then 1107*132f818dSEnji Cooper # Have to descend all the way to the root! 1108*132f818dSEnji Cooper func_relative_path_result=../$func_relative_path_result 1109*132f818dSEnji Cooper func_relative_path_tcancelled=$func_relative_path_tbindir 1110*132f818dSEnji Cooper break 1111*132f818dSEnji Cooper fi 1112*132f818dSEnji Cooper func_relative_path_result=../$func_relative_path_result 1113*132f818dSEnji Cooper ;; 1114*132f818dSEnji Cooper esac 1115*132f818dSEnji Cooper done 1116*132f818dSEnji Cooper 1117*132f818dSEnji Cooper # Now calculate path; take care to avoid doubling-up slashes. 1118*132f818dSEnji Cooper func_stripname '' '/' "$func_relative_path_result" 1119*132f818dSEnji Cooper func_relative_path_result=$func_stripname_result 1120*132f818dSEnji Cooper func_stripname '/' '/' "$func_relative_path_tcancelled" 1121*132f818dSEnji Cooper if test -n "$func_stripname_result"; then 1122*132f818dSEnji Cooper func_append func_relative_path_result "/$func_stripname_result" 1123*132f818dSEnji Cooper fi 1124*132f818dSEnji Cooper 1125*132f818dSEnji Cooper # Normalisation. If bindir is libdir, return '.' else relative path. 1126*132f818dSEnji Cooper if test -n "$func_relative_path_result"; then 1127*132f818dSEnji Cooper func_stripname './' '' "$func_relative_path_result" 1128*132f818dSEnji Cooper func_relative_path_result=$func_stripname_result 1129*132f818dSEnji Cooper fi 1130*132f818dSEnji Cooper 1131*132f818dSEnji Cooper test -n "$func_relative_path_result" || func_relative_path_result=. 1132*132f818dSEnji Cooper 1133*132f818dSEnji Cooper : 1134*132f818dSEnji Cooper} 1135*132f818dSEnji Cooper 1136*132f818dSEnji Cooper 1137*132f818dSEnji Cooper# func_quote_portable EVAL ARG 1138*132f818dSEnji Cooper# ---------------------------- 1139*132f818dSEnji Cooper# Internal function to portably implement func_quote_arg. Note that we still 1140*132f818dSEnji Cooper# keep attention to performance here so we as much as possible try to avoid 1141*132f818dSEnji Cooper# calling sed binary (so far O(N) complexity as long as func_append is O(1)). 1142*132f818dSEnji Cooperfunc_quote_portable () 1143*132f818dSEnji Cooper{ 1144*132f818dSEnji Cooper $debug_cmd 1145*132f818dSEnji Cooper 1146*132f818dSEnji Cooper $require_check_ifs_backslash 1147*132f818dSEnji Cooper 1148*132f818dSEnji Cooper func_quote_portable_result=$2 1149*132f818dSEnji Cooper 1150*132f818dSEnji Cooper # one-time-loop (easy break) 1151*132f818dSEnji Cooper while true 1152*132f818dSEnji Cooper do 1153*132f818dSEnji Cooper if $1; then 1154*132f818dSEnji Cooper func_quote_portable_result=`$ECHO "$2" | $SED \ 1155*132f818dSEnji Cooper -e "$sed_double_quote_subst" -e "$sed_double_backslash"` 1156*132f818dSEnji Cooper break 1157*132f818dSEnji Cooper fi 1158*132f818dSEnji Cooper 1159*132f818dSEnji Cooper # Quote for eval. 1160*132f818dSEnji Cooper case $func_quote_portable_result in 1161*132f818dSEnji Cooper *[\\\`\"\$]*) 1162*132f818dSEnji Cooper # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string 1163*132f818dSEnji Cooper # contains the shell wildcard characters. 1164*132f818dSEnji Cooper case $check_ifs_backshlash_broken$func_quote_portable_result in 1165*132f818dSEnji Cooper :*|*[\[\*\?]*) 1166*132f818dSEnji Cooper func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ 1167*132f818dSEnji Cooper | $SED "$sed_quote_subst"` 1168*132f818dSEnji Cooper break 1169*132f818dSEnji Cooper ;; 1170*132f818dSEnji Cooper esac 1171*132f818dSEnji Cooper 1172*132f818dSEnji Cooper func_quote_portable_old_IFS=$IFS 1173*132f818dSEnji Cooper for _G_char in '\' '`' '"' '$' 1174*132f818dSEnji Cooper do 1175*132f818dSEnji Cooper # STATE($1) PREV($2) SEPARATOR($3) 1176*132f818dSEnji Cooper set start "" "" 1177*132f818dSEnji Cooper func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy 1178*132f818dSEnji Cooper IFS=$_G_char 1179*132f818dSEnji Cooper for _G_part in $func_quote_portable_result 1180*132f818dSEnji Cooper do 1181*132f818dSEnji Cooper case $1 in 1182*132f818dSEnji Cooper quote) 1183*132f818dSEnji Cooper func_append func_quote_portable_result "$3$2" 1184*132f818dSEnji Cooper set quote "$_G_part" "\\$_G_char" 1185*132f818dSEnji Cooper ;; 1186*132f818dSEnji Cooper start) 1187*132f818dSEnji Cooper set first "" "" 1188*132f818dSEnji Cooper func_quote_portable_result= 1189*132f818dSEnji Cooper ;; 1190*132f818dSEnji Cooper first) 1191*132f818dSEnji Cooper set quote "$_G_part" "" 1192*132f818dSEnji Cooper ;; 1193*132f818dSEnji Cooper esac 1194*132f818dSEnji Cooper done 1195*132f818dSEnji Cooper done 1196*132f818dSEnji Cooper IFS=$func_quote_portable_old_IFS 1197*132f818dSEnji Cooper ;; 1198*132f818dSEnji Cooper *) ;; 1199*132f818dSEnji Cooper esac 1200*132f818dSEnji Cooper break 1201*132f818dSEnji Cooper done 1202*132f818dSEnji Cooper 1203*132f818dSEnji Cooper func_quote_portable_unquoted_result=$func_quote_portable_result 1204*132f818dSEnji Cooper case $func_quote_portable_result in 1205*132f818dSEnji Cooper # double-quote args containing shell metacharacters to delay 1206*132f818dSEnji Cooper # word splitting, command substitution and variable expansion 1207*132f818dSEnji Cooper # for a subsequent eval. 1208*132f818dSEnji Cooper # many bourne shells cannot handle close brackets correctly 1209*132f818dSEnji Cooper # in scan sets, so we specify it separately. 1210*132f818dSEnji Cooper *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") 1211*132f818dSEnji Cooper func_quote_portable_result=\"$func_quote_portable_result\" 1212*132f818dSEnji Cooper ;; 1213*132f818dSEnji Cooper esac 1214*132f818dSEnji Cooper} 1215*132f818dSEnji Cooper 1216*132f818dSEnji Cooper 1217*132f818dSEnji Cooper# func_quotefast_eval ARG 1218*132f818dSEnji Cooper# ----------------------- 1219*132f818dSEnji Cooper# Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', 1220*132f818dSEnji Cooper# but optimized for speed. Result is stored in $func_quotefast_eval. 1221*132f818dSEnji Cooperif test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then 1222*132f818dSEnji Cooper printf -v _GL_test_printf_tilde %q '~' 1223*132f818dSEnji Cooper if test '\~' = "$_GL_test_printf_tilde"; then 1224*132f818dSEnji Cooper func_quotefast_eval () 1225*132f818dSEnji Cooper { 1226*132f818dSEnji Cooper printf -v func_quotefast_eval_result %q "$1" 1227*132f818dSEnji Cooper } 1228*132f818dSEnji Cooper else 1229*132f818dSEnji Cooper # Broken older Bash implementations. Make those faster too if possible. 1230*132f818dSEnji Cooper func_quotefast_eval () 1231*132f818dSEnji Cooper { 1232*132f818dSEnji Cooper case $1 in 1233*132f818dSEnji Cooper '~'*) 1234*132f818dSEnji Cooper func_quote_portable false "$1" 1235*132f818dSEnji Cooper func_quotefast_eval_result=$func_quote_portable_result 1236*132f818dSEnji Cooper ;; 1237*132f818dSEnji Cooper *) 1238*132f818dSEnji Cooper printf -v func_quotefast_eval_result %q "$1" 1239*132f818dSEnji Cooper ;; 1240*132f818dSEnji Cooper esac 1241*132f818dSEnji Cooper } 1242*132f818dSEnji Cooper fi 1243*132f818dSEnji Cooperelse 1244*132f818dSEnji Cooper func_quotefast_eval () 1245*132f818dSEnji Cooper { 1246*132f818dSEnji Cooper func_quote_portable false "$1" 1247*132f818dSEnji Cooper func_quotefast_eval_result=$func_quote_portable_result 1248*132f818dSEnji Cooper } 1249*132f818dSEnji Cooperfi 1250*132f818dSEnji Cooper 1251*132f818dSEnji Cooper 1252*132f818dSEnji Cooper# func_quote_arg MODEs ARG 1253*132f818dSEnji Cooper# ------------------------ 1254*132f818dSEnji Cooper# Quote one ARG to be evaled later. MODEs argument may contain zero or more 1255*132f818dSEnji Cooper# specifiers listed below separated by ',' character. This function returns two 1256*132f818dSEnji Cooper# values: 1257*132f818dSEnji Cooper# i) func_quote_arg_result 1258*132f818dSEnji Cooper# double-quoted (when needed), suitable for a subsequent eval 1259*132f818dSEnji Cooper# ii) func_quote_arg_unquoted_result 1260*132f818dSEnji Cooper# has all characters that are still active within double 1261*132f818dSEnji Cooper# quotes backslashified. Available only if 'unquoted' is specified. 1262*132f818dSEnji Cooper# 1263*132f818dSEnji Cooper# Available modes: 1264*132f818dSEnji Cooper# ---------------- 1265*132f818dSEnji Cooper# 'eval' (default) 1266*132f818dSEnji Cooper# - escape shell special characters 1267*132f818dSEnji Cooper# 'expand' 1268*132f818dSEnji Cooper# - the same as 'eval'; but do not quote variable references 1269*132f818dSEnji Cooper# 'pretty' 1270*132f818dSEnji Cooper# - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might 1271*132f818dSEnji Cooper# be used later in func_quote to get output like: 'echo "a b"' instead 1272*132f818dSEnji Cooper# of 'echo a\ b'. This is slower than default on some shells. 1273*132f818dSEnji Cooper# 'unquoted' 1274*132f818dSEnji Cooper# - produce also $func_quote_arg_unquoted_result which does not contain 1275*132f818dSEnji Cooper# wrapping double-quotes. 1276*132f818dSEnji Cooper# 1277*132f818dSEnji Cooper# Examples for 'func_quote_arg pretty,unquoted string': 1278*132f818dSEnji Cooper# 1279*132f818dSEnji Cooper# string | *_result | *_unquoted_result 1280*132f818dSEnji Cooper# ------------+-----------------------+------------------- 1281*132f818dSEnji Cooper# " | \" | \" 1282*132f818dSEnji Cooper# a b | "a b" | a b 1283*132f818dSEnji Cooper# "a b" | "\"a b\"" | \"a b\" 1284*132f818dSEnji Cooper# * | "*" | * 1285*132f818dSEnji Cooper# z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" 1286*132f818dSEnji Cooper# 1287*132f818dSEnji Cooper# Examples for 'func_quote_arg pretty,unquoted,expand string': 1288*132f818dSEnji Cooper# 1289*132f818dSEnji Cooper# string | *_result | *_unquoted_result 1290*132f818dSEnji Cooper# --------------+---------------------+-------------------- 1291*132f818dSEnji Cooper# z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" 1292*132f818dSEnji Cooperfunc_quote_arg () 1293*132f818dSEnji Cooper{ 1294*132f818dSEnji Cooper _G_quote_expand=false 1295*132f818dSEnji Cooper case ,$1, in 1296*132f818dSEnji Cooper *,expand,*) 1297*132f818dSEnji Cooper _G_quote_expand=: 1298*132f818dSEnji Cooper ;; 1299*132f818dSEnji Cooper esac 1300*132f818dSEnji Cooper 1301*132f818dSEnji Cooper case ,$1, in 1302*132f818dSEnji Cooper *,pretty,*|*,expand,*|*,unquoted,*) 1303*132f818dSEnji Cooper func_quote_portable $_G_quote_expand "$2" 1304*132f818dSEnji Cooper func_quote_arg_result=$func_quote_portable_result 1305*132f818dSEnji Cooper func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result 1306*132f818dSEnji Cooper ;; 1307*132f818dSEnji Cooper *) 1308*132f818dSEnji Cooper # Faster quote-for-eval for some shells. 1309*132f818dSEnji Cooper func_quotefast_eval "$2" 1310*132f818dSEnji Cooper func_quote_arg_result=$func_quotefast_eval_result 1311*132f818dSEnji Cooper ;; 1312*132f818dSEnji Cooper esac 1313*132f818dSEnji Cooper} 1314*132f818dSEnji Cooper 1315*132f818dSEnji Cooper 1316*132f818dSEnji Cooper# func_quote MODEs ARGs... 1317*132f818dSEnji Cooper# ------------------------ 1318*132f818dSEnji Cooper# Quote all ARGs to be evaled later and join them into single command. See 1319*132f818dSEnji Cooper# func_quote_arg's description for more info. 1320*132f818dSEnji Cooperfunc_quote () 1321*132f818dSEnji Cooper{ 1322*132f818dSEnji Cooper $debug_cmd 1323*132f818dSEnji Cooper _G_func_quote_mode=$1 ; shift 1324*132f818dSEnji Cooper func_quote_result= 1325*132f818dSEnji Cooper while test 0 -lt $#; do 1326*132f818dSEnji Cooper func_quote_arg "$_G_func_quote_mode" "$1" 1327*132f818dSEnji Cooper if test -n "$func_quote_result"; then 1328*132f818dSEnji Cooper func_append func_quote_result " $func_quote_arg_result" 1329*132f818dSEnji Cooper else 1330*132f818dSEnji Cooper func_append func_quote_result "$func_quote_arg_result" 1331*132f818dSEnji Cooper fi 1332*132f818dSEnji Cooper shift 1333*132f818dSEnji Cooper done 1334*132f818dSEnji Cooper} 1335*132f818dSEnji Cooper 1336*132f818dSEnji Cooper 1337*132f818dSEnji Cooper# func_stripname PREFIX SUFFIX NAME 1338*132f818dSEnji Cooper# --------------------------------- 1339*132f818dSEnji Cooper# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. 1340*132f818dSEnji Cooper# PREFIX and SUFFIX must not contain globbing or regex special 1341*132f818dSEnji Cooper# characters, hashes, percent signs, but SUFFIX may contain a leading 1342*132f818dSEnji Cooper# dot (in which case that matches only a dot). 1343*132f818dSEnji Cooperif test yes = "$_G_HAVE_XSI_OPS"; then 1344*132f818dSEnji Cooper eval 'func_stripname () 1345*132f818dSEnji Cooper { 1346*132f818dSEnji Cooper $debug_cmd 1347*132f818dSEnji Cooper 1348*132f818dSEnji Cooper # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are 1349*132f818dSEnji Cooper # positional parameters, so assign one to ordinary variable first. 1350*132f818dSEnji Cooper func_stripname_result=$3 1351*132f818dSEnji Cooper func_stripname_result=${func_stripname_result#"$1"} 1352*132f818dSEnji Cooper func_stripname_result=${func_stripname_result%"$2"} 1353*132f818dSEnji Cooper }' 1354*132f818dSEnji Cooperelse 1355*132f818dSEnji Cooper func_stripname () 1356*132f818dSEnji Cooper { 1357*132f818dSEnji Cooper $debug_cmd 1358*132f818dSEnji Cooper 1359*132f818dSEnji Cooper case $2 in 1360*132f818dSEnji Cooper .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; 1361*132f818dSEnji Cooper *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; 1362*132f818dSEnji Cooper esac 1363*132f818dSEnji Cooper } 1364*132f818dSEnji Cooperfi 1365*132f818dSEnji Cooper 1366*132f818dSEnji Cooper 1367*132f818dSEnji Cooper# func_show_eval CMD [FAIL_EXP] 1368*132f818dSEnji Cooper# ----------------------------- 1369*132f818dSEnji Cooper# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is 1370*132f818dSEnji Cooper# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP 1371*132f818dSEnji Cooper# is given, then evaluate it. 1372*132f818dSEnji Cooperfunc_show_eval () 1373*132f818dSEnji Cooper{ 1374*132f818dSEnji Cooper $debug_cmd 1375*132f818dSEnji Cooper 1376*132f818dSEnji Cooper _G_cmd=$1 1377*132f818dSEnji Cooper _G_fail_exp=${2-':'} 1378*132f818dSEnji Cooper 1379*132f818dSEnji Cooper func_quote_arg pretty,expand "$_G_cmd" 1380*132f818dSEnji Cooper eval "func_notquiet $func_quote_arg_result" 1381*132f818dSEnji Cooper 1382*132f818dSEnji Cooper $opt_dry_run || { 1383*132f818dSEnji Cooper eval "$_G_cmd" 1384*132f818dSEnji Cooper _G_status=$? 1385*132f818dSEnji Cooper if test 0 -ne "$_G_status"; then 1386*132f818dSEnji Cooper eval "(exit $_G_status); $_G_fail_exp" 1387*132f818dSEnji Cooper fi 1388*132f818dSEnji Cooper } 1389*132f818dSEnji Cooper} 1390*132f818dSEnji Cooper 1391*132f818dSEnji Cooper 1392*132f818dSEnji Cooper# func_show_eval_locale CMD [FAIL_EXP] 1393*132f818dSEnji Cooper# ------------------------------------ 1394*132f818dSEnji Cooper# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is 1395*132f818dSEnji Cooper# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP 1396*132f818dSEnji Cooper# is given, then evaluate it. Use the saved locale for evaluation. 1397*132f818dSEnji Cooperfunc_show_eval_locale () 1398*132f818dSEnji Cooper{ 1399*132f818dSEnji Cooper $debug_cmd 1400*132f818dSEnji Cooper 1401*132f818dSEnji Cooper _G_cmd=$1 1402*132f818dSEnji Cooper _G_fail_exp=${2-':'} 1403*132f818dSEnji Cooper 1404*132f818dSEnji Cooper $opt_quiet || { 1405*132f818dSEnji Cooper func_quote_arg expand,pretty "$_G_cmd" 1406*132f818dSEnji Cooper eval "func_echo $func_quote_arg_result" 1407*132f818dSEnji Cooper } 1408*132f818dSEnji Cooper 1409*132f818dSEnji Cooper $opt_dry_run || { 1410*132f818dSEnji Cooper eval "$_G_user_locale 1411*132f818dSEnji Cooper $_G_cmd" 1412*132f818dSEnji Cooper _G_status=$? 1413*132f818dSEnji Cooper eval "$_G_safe_locale" 1414*132f818dSEnji Cooper if test 0 -ne "$_G_status"; then 1415*132f818dSEnji Cooper eval "(exit $_G_status); $_G_fail_exp" 1416*132f818dSEnji Cooper fi 1417*132f818dSEnji Cooper } 1418*132f818dSEnji Cooper} 1419*132f818dSEnji Cooper 1420*132f818dSEnji Cooper 1421*132f818dSEnji Cooper# func_tr_sh 1422*132f818dSEnji Cooper# ---------- 1423*132f818dSEnji Cooper# Turn $1 into a string suitable for a shell variable name. 1424*132f818dSEnji Cooper# Result is stored in $func_tr_sh_result. All characters 1425*132f818dSEnji Cooper# not in the set a-zA-Z0-9_ are replaced with '_'. Further, 1426*132f818dSEnji Cooper# if $1 begins with a digit, a '_' is prepended as well. 1427*132f818dSEnji Cooperfunc_tr_sh () 1428*132f818dSEnji Cooper{ 1429*132f818dSEnji Cooper $debug_cmd 1430*132f818dSEnji Cooper 1431*132f818dSEnji Cooper case $1 in 1432*132f818dSEnji Cooper [0-9]* | *[!a-zA-Z0-9_]*) 1433*132f818dSEnji Cooper func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` 1434*132f818dSEnji Cooper ;; 1435*132f818dSEnji Cooper * ) 1436*132f818dSEnji Cooper func_tr_sh_result=$1 1437*132f818dSEnji Cooper ;; 1438*132f818dSEnji Cooper esac 1439*132f818dSEnji Cooper} 1440*132f818dSEnji Cooper 1441*132f818dSEnji Cooper 1442*132f818dSEnji Cooper# func_verbose ARG... 1443*132f818dSEnji Cooper# ------------------- 1444*132f818dSEnji Cooper# Echo program name prefixed message in verbose mode only. 1445*132f818dSEnji Cooperfunc_verbose () 1446*132f818dSEnji Cooper{ 1447*132f818dSEnji Cooper $debug_cmd 1448*132f818dSEnji Cooper 1449*132f818dSEnji Cooper $opt_verbose && func_echo "$*" 1450*132f818dSEnji Cooper 1451*132f818dSEnji Cooper : 1452*132f818dSEnji Cooper} 1453*132f818dSEnji Cooper 1454*132f818dSEnji Cooper 1455*132f818dSEnji Cooper# func_warn_and_continue ARG... 1456*132f818dSEnji Cooper# ----------------------------- 1457*132f818dSEnji Cooper# Echo program name prefixed warning message to standard error. 1458*132f818dSEnji Cooperfunc_warn_and_continue () 1459*132f818dSEnji Cooper{ 1460*132f818dSEnji Cooper $debug_cmd 1461*132f818dSEnji Cooper 1462*132f818dSEnji Cooper $require_term_colors 1463*132f818dSEnji Cooper 1464*132f818dSEnji Cooper func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 1465*132f818dSEnji Cooper} 1466*132f818dSEnji Cooper 1467*132f818dSEnji Cooper 1468*132f818dSEnji Cooper# func_warning CATEGORY ARG... 1469*132f818dSEnji Cooper# ---------------------------- 1470*132f818dSEnji Cooper# Echo program name prefixed warning message to standard error. Warning 1471*132f818dSEnji Cooper# messages can be filtered according to CATEGORY, where this function 1472*132f818dSEnji Cooper# elides messages where CATEGORY is not listed in the global variable 1473*132f818dSEnji Cooper# 'opt_warning_types'. 1474*132f818dSEnji Cooperfunc_warning () 1475*132f818dSEnji Cooper{ 1476*132f818dSEnji Cooper $debug_cmd 1477*132f818dSEnji Cooper 1478*132f818dSEnji Cooper # CATEGORY must be in the warning_categories list! 1479*132f818dSEnji Cooper case " $warning_categories " in 1480*132f818dSEnji Cooper *" $1 "*) ;; 1481*132f818dSEnji Cooper *) func_internal_error "invalid warning category '$1'" ;; 1482*132f818dSEnji Cooper esac 1483*132f818dSEnji Cooper 1484*132f818dSEnji Cooper _G_category=$1 1485*132f818dSEnji Cooper shift 1486*132f818dSEnji Cooper 1487*132f818dSEnji Cooper case " $opt_warning_types " in 1488*132f818dSEnji Cooper *" $_G_category "*) $warning_func ${1+"$@"} ;; 1489*132f818dSEnji Cooper esac 1490*132f818dSEnji Cooper} 1491*132f818dSEnji Cooper 1492*132f818dSEnji Cooper 1493*132f818dSEnji Cooper# func_sort_ver VER1 VER2 1494*132f818dSEnji Cooper# ----------------------- 1495*132f818dSEnji Cooper# 'sort -V' is not generally available. 1496*132f818dSEnji Cooper# Note this deviates from the version comparison in automake 1497*132f818dSEnji Cooper# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a 1498*132f818dSEnji Cooper# but this should suffice as we won't be specifying old 1499*132f818dSEnji Cooper# version formats or redundant trailing .0 in bootstrap.conf. 1500*132f818dSEnji Cooper# If we did want full compatibility then we should probably 1501*132f818dSEnji Cooper# use m4_version_compare from autoconf. 1502*132f818dSEnji Cooperfunc_sort_ver () 1503*132f818dSEnji Cooper{ 1504*132f818dSEnji Cooper $debug_cmd 1505*132f818dSEnji Cooper 1506*132f818dSEnji Cooper printf '%s\n%s\n' "$1" "$2" \ 1507*132f818dSEnji Cooper | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n 1508*132f818dSEnji Cooper} 1509*132f818dSEnji Cooper 1510*132f818dSEnji Cooper# func_lt_ver PREV CURR 1511*132f818dSEnji Cooper# --------------------- 1512*132f818dSEnji Cooper# Return true if PREV and CURR are in the correct order according to 1513*132f818dSEnji Cooper# func_sort_ver, otherwise false. Use it like this: 1514*132f818dSEnji Cooper# 1515*132f818dSEnji Cooper# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." 1516*132f818dSEnji Cooperfunc_lt_ver () 1517*132f818dSEnji Cooper{ 1518*132f818dSEnji Cooper $debug_cmd 1519*132f818dSEnji Cooper 1520*132f818dSEnji Cooper test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` 1521*132f818dSEnji Cooper} 1522*132f818dSEnji Cooper 1523*132f818dSEnji Cooper 1524*132f818dSEnji Cooper# Local variables: 1525*132f818dSEnji Cooper# mode: shell-script 1526*132f818dSEnji Cooper# sh-indentation: 2 1527*132f818dSEnji Cooper# eval: (add-hook 'before-save-hook 'time-stamp) 1528*132f818dSEnji Cooper# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" 1529*132f818dSEnji Cooper# time-stamp-time-zone: "UTC" 1530*132f818dSEnji Cooper# End: 1531*132f818dSEnji Cooper#! /bin/sh 1532*132f818dSEnji Cooper 1533*132f818dSEnji Cooper# A portable, pluggable option parser for Bourne shell. 1534*132f818dSEnji Cooper# Written by Gary V. Vaughan, 2010 1535*132f818dSEnji Cooper 1536*132f818dSEnji Cooper# This is free software. There is NO warranty; not even for 1537*132f818dSEnji Cooper# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 1538*132f818dSEnji Cooper# 1539*132f818dSEnji Cooper# Copyright (C) 2010-2019, 2021, 2023-2024 Bootstrap Authors 1540*132f818dSEnji Cooper# 1541*132f818dSEnji Cooper# This file is dual licensed under the terms of the MIT license 1542*132f818dSEnji Cooper# <https://opensource.org/licenses/MIT>, and GPL version 2 or later 1543*132f818dSEnji Cooper# <https://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of 1544*132f818dSEnji Cooper# these licenses when using or redistributing this software or any of 1545*132f818dSEnji Cooper# the files within it. See the URLs above, or the file `LICENSE` 1546*132f818dSEnji Cooper# included in the Bootstrap distribution for the full license texts. 1547*132f818dSEnji Cooper 1548*132f818dSEnji Cooper# Please report bugs or propose patches to: 1549*132f818dSEnji Cooper# <https://github.com/gnulib-modules/bootstrap/issues> 1550*132f818dSEnji Cooper 1551*132f818dSEnji Cooper# Set a version string for this script. 1552*132f818dSEnji Cooperscriptversion=2019-02-19.15; # UTC 1553*132f818dSEnji Cooper 1554*132f818dSEnji Cooper 1555*132f818dSEnji Cooper## ------ ## 1556*132f818dSEnji Cooper## Usage. ## 1557*132f818dSEnji Cooper## ------ ## 1558*132f818dSEnji Cooper 1559*132f818dSEnji Cooper# This file is a library for parsing options in your shell scripts along 1560*132f818dSEnji Cooper# with assorted other useful supporting features that you can make use 1561*132f818dSEnji Cooper# of too. 1562*132f818dSEnji Cooper# 1563*132f818dSEnji Cooper# For the simplest scripts you might need only: 1564*132f818dSEnji Cooper# 1565*132f818dSEnji Cooper# #!/bin/sh 1566*132f818dSEnji Cooper# . relative/path/to/funclib.sh 1567*132f818dSEnji Cooper# . relative/path/to/options-parser 1568*132f818dSEnji Cooper# scriptversion=1.0 1569*132f818dSEnji Cooper# func_options ${1+"$@"} 1570*132f818dSEnji Cooper# eval set dummy "$func_options_result"; shift 1571*132f818dSEnji Cooper# ...rest of your script... 1572*132f818dSEnji Cooper# 1573*132f818dSEnji Cooper# In order for the '--version' option to work, you will need to have a 1574*132f818dSEnji Cooper# suitably formatted comment like the one at the top of this file 1575*132f818dSEnji Cooper# starting with '# Written by ' and ending with '# Copyright'. 1576*132f818dSEnji Cooper# 1577*132f818dSEnji Cooper# For '-h' and '--help' to work, you will also need a one line 1578*132f818dSEnji Cooper# description of your script's purpose in a comment directly above the 1579*132f818dSEnji Cooper# '# Written by ' line, like the one at the top of this file. 1580*132f818dSEnji Cooper# 1581*132f818dSEnji Cooper# The default options also support '--debug', which will turn on shell 1582*132f818dSEnji Cooper# execution tracing (see the comment above debug_cmd below for another 1583*132f818dSEnji Cooper# use), and '--verbose' and the func_verbose function to allow your script 1584*132f818dSEnji Cooper# to display verbose messages only when your user has specified 1585*132f818dSEnji Cooper# '--verbose'. 1586*132f818dSEnji Cooper# 1587*132f818dSEnji Cooper# After sourcing this file, you can plug in processing for additional 1588*132f818dSEnji Cooper# options by amending the variables from the 'Configuration' section 1589*132f818dSEnji Cooper# below, and following the instructions in the 'Option parsing' 1590*132f818dSEnji Cooper# section further down. 1591*132f818dSEnji Cooper 1592*132f818dSEnji Cooper## -------------- ## 1593*132f818dSEnji Cooper## Configuration. ## 1594*132f818dSEnji Cooper## -------------- ## 1595*132f818dSEnji Cooper 1596*132f818dSEnji Cooper# You should override these variables in your script after sourcing this 1597*132f818dSEnji Cooper# file so that they reflect the customisations you have added to the 1598*132f818dSEnji Cooper# option parser. 1599*132f818dSEnji Cooper 1600*132f818dSEnji Cooper# The usage line for option parsing errors and the start of '-h' and 1601*132f818dSEnji Cooper# '--help' output messages. You can embed shell variables for delayed 1602*132f818dSEnji Cooper# expansion at the time the message is displayed, but you will need to 1603*132f818dSEnji Cooper# quote other shell meta-characters carefully to prevent them being 1604*132f818dSEnji Cooper# expanded when the contents are evaled. 1605*132f818dSEnji Cooperusage='$progpath [OPTION]...' 1606*132f818dSEnji Cooper 1607*132f818dSEnji Cooper# Short help message in response to '-h' and '--help'. Add to this or 1608*132f818dSEnji Cooper# override it after sourcing this library to reflect the full set of 1609*132f818dSEnji Cooper# options your script accepts. 1610*132f818dSEnji Cooperusage_message="\ 1611*132f818dSEnji Cooper --debug enable verbose shell tracing 1612*132f818dSEnji Cooper -W, --warnings=CATEGORY 1613*132f818dSEnji Cooper report the warnings falling in CATEGORY [all] 1614*132f818dSEnji Cooper -v, --verbose verbosely report processing 1615*132f818dSEnji Cooper --version print version information and exit 1616*132f818dSEnji Cooper -h, --help print short or long help message and exit 1617*132f818dSEnji Cooper" 1618*132f818dSEnji Cooper 1619*132f818dSEnji Cooper# Additional text appended to 'usage_message' in response to '--help'. 1620*132f818dSEnji Cooperlong_help_message=" 1621*132f818dSEnji CooperWarning categories include: 1622*132f818dSEnji Cooper 'all' show all warnings 1623*132f818dSEnji Cooper 'none' turn off all the warnings 1624*132f818dSEnji Cooper 'error' warnings are treated as fatal errors" 1625*132f818dSEnji Cooper 1626*132f818dSEnji Cooper# Help message printed before fatal option parsing errors. 1627*132f818dSEnji Cooperfatal_help="Try '\$progname --help' for more information." 1628*132f818dSEnji Cooper 1629*132f818dSEnji Cooper 1630*132f818dSEnji Cooper 1631*132f818dSEnji Cooper## ------------------------- ## 1632*132f818dSEnji Cooper## Hook function management. ## 1633*132f818dSEnji Cooper## ------------------------- ## 1634*132f818dSEnji Cooper 1635*132f818dSEnji Cooper# This section contains functions for adding, removing, and running hooks 1636*132f818dSEnji Cooper# in the main code. A hook is just a list of function names that can be 1637*132f818dSEnji Cooper# run in order later on. 1638*132f818dSEnji Cooper 1639*132f818dSEnji Cooper# func_hookable FUNC_NAME 1640*132f818dSEnji Cooper# ----------------------- 1641*132f818dSEnji Cooper# Declare that FUNC_NAME will run hooks added with 1642*132f818dSEnji Cooper# 'func_add_hook FUNC_NAME ...'. 1643*132f818dSEnji Cooperfunc_hookable () 1644*132f818dSEnji Cooper{ 1645*132f818dSEnji Cooper $debug_cmd 1646*132f818dSEnji Cooper 1647*132f818dSEnji Cooper func_append hookable_fns " $1" 1648*132f818dSEnji Cooper} 1649*132f818dSEnji Cooper 1650*132f818dSEnji Cooper 1651*132f818dSEnji Cooper# func_add_hook FUNC_NAME HOOK_FUNC 1652*132f818dSEnji Cooper# --------------------------------- 1653*132f818dSEnji Cooper# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must 1654*132f818dSEnji Cooper# first have been declared "hookable" by a call to 'func_hookable'. 1655*132f818dSEnji Cooperfunc_add_hook () 1656*132f818dSEnji Cooper{ 1657*132f818dSEnji Cooper $debug_cmd 1658*132f818dSEnji Cooper 1659*132f818dSEnji Cooper case " $hookable_fns " in 1660*132f818dSEnji Cooper *" $1 "*) ;; 1661*132f818dSEnji Cooper *) func_fatal_error "'$1' does not accept hook functions." ;; 1662*132f818dSEnji Cooper esac 1663*132f818dSEnji Cooper 1664*132f818dSEnji Cooper eval func_append ${1}_hooks '" $2"' 1665*132f818dSEnji Cooper} 1666*132f818dSEnji Cooper 1667*132f818dSEnji Cooper 1668*132f818dSEnji Cooper# func_remove_hook FUNC_NAME HOOK_FUNC 1669*132f818dSEnji Cooper# ------------------------------------ 1670*132f818dSEnji Cooper# Remove HOOK_FUNC from the list of hook functions to be called by 1671*132f818dSEnji Cooper# FUNC_NAME. 1672*132f818dSEnji Cooperfunc_remove_hook () 1673*132f818dSEnji Cooper{ 1674*132f818dSEnji Cooper $debug_cmd 1675*132f818dSEnji Cooper 1676*132f818dSEnji Cooper eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' 1677*132f818dSEnji Cooper} 1678*132f818dSEnji Cooper 1679*132f818dSEnji Cooper 1680*132f818dSEnji Cooper# func_propagate_result FUNC_NAME_A FUNC_NAME_B 1681*132f818dSEnji Cooper# --------------------------------------------- 1682*132f818dSEnji Cooper# If the *_result variable of FUNC_NAME_A _is set_, assign its value to 1683*132f818dSEnji Cooper# *_result variable of FUNC_NAME_B. 1684*132f818dSEnji Cooperfunc_propagate_result () 1685*132f818dSEnji Cooper{ 1686*132f818dSEnji Cooper $debug_cmd 1687*132f818dSEnji Cooper 1688*132f818dSEnji Cooper func_propagate_result_result=: 1689*132f818dSEnji Cooper if eval "test \"\${${1}_result+set}\" = set" 1690*132f818dSEnji Cooper then 1691*132f818dSEnji Cooper eval "${2}_result=\$${1}_result" 1692*132f818dSEnji Cooper else 1693*132f818dSEnji Cooper func_propagate_result_result=false 1694*132f818dSEnji Cooper fi 1695*132f818dSEnji Cooper} 1696*132f818dSEnji Cooper 1697*132f818dSEnji Cooper 1698*132f818dSEnji Cooper# func_run_hooks FUNC_NAME [ARG]... 1699*132f818dSEnji Cooper# --------------------------------- 1700*132f818dSEnji Cooper# Run all hook functions registered to FUNC_NAME. 1701*132f818dSEnji Cooper# It's assumed that the list of hook functions contains nothing more 1702*132f818dSEnji Cooper# than a whitespace-delimited list of legal shell function names, and 1703*132f818dSEnji Cooper# no effort is wasted trying to catch shell meta-characters or preserve 1704*132f818dSEnji Cooper# whitespace. 1705*132f818dSEnji Cooperfunc_run_hooks () 1706*132f818dSEnji Cooper{ 1707*132f818dSEnji Cooper $debug_cmd 1708*132f818dSEnji Cooper 1709*132f818dSEnji Cooper case " $hookable_fns " in 1710*132f818dSEnji Cooper *" $1 "*) ;; 1711*132f818dSEnji Cooper *) func_fatal_error "'$1' does not support hook functions." ;; 1712*132f818dSEnji Cooper esac 1713*132f818dSEnji Cooper 1714*132f818dSEnji Cooper eval _G_hook_fns=\$$1_hooks; shift 1715*132f818dSEnji Cooper 1716*132f818dSEnji Cooper for _G_hook in $_G_hook_fns; do 1717*132f818dSEnji Cooper func_unset "${_G_hook}_result" 1718*132f818dSEnji Cooper eval $_G_hook '${1+"$@"}' 1719*132f818dSEnji Cooper func_propagate_result $_G_hook func_run_hooks 1720*132f818dSEnji Cooper if $func_propagate_result_result; then 1721*132f818dSEnji Cooper eval set dummy "$func_run_hooks_result"; shift 1722*132f818dSEnji Cooper fi 1723*132f818dSEnji Cooper done 1724*132f818dSEnji Cooper} 1725*132f818dSEnji Cooper 1726*132f818dSEnji Cooper 1727*132f818dSEnji Cooper 1728*132f818dSEnji Cooper## --------------- ## 1729*132f818dSEnji Cooper## Option parsing. ## 1730*132f818dSEnji Cooper## --------------- ## 1731*132f818dSEnji Cooper 1732*132f818dSEnji Cooper# In order to add your own option parsing hooks, you must accept the 1733*132f818dSEnji Cooper# full positional parameter list from your hook function. You may remove 1734*132f818dSEnji Cooper# or edit any options that you action, and then pass back the remaining 1735*132f818dSEnji Cooper# unprocessed options in '<hooked_function_name>_result', escaped 1736*132f818dSEnji Cooper# suitably for 'eval'. 1737*132f818dSEnji Cooper# 1738*132f818dSEnji Cooper# The '<hooked_function_name>_result' variable is automatically unset 1739*132f818dSEnji Cooper# before your hook gets called; for best performance, only set the 1740*132f818dSEnji Cooper# *_result variable when necessary (i.e. don't call the 'func_quote' 1741*132f818dSEnji Cooper# function unnecessarily because it can be an expensive operation on some 1742*132f818dSEnji Cooper# machines). 1743*132f818dSEnji Cooper# 1744*132f818dSEnji Cooper# Like this: 1745*132f818dSEnji Cooper# 1746*132f818dSEnji Cooper# my_options_prep () 1747*132f818dSEnji Cooper# { 1748*132f818dSEnji Cooper# $debug_cmd 1749*132f818dSEnji Cooper# 1750*132f818dSEnji Cooper# # Extend the existing usage message. 1751*132f818dSEnji Cooper# usage_message=$usage_message' 1752*132f818dSEnji Cooper# -s, --silent don'\''t print informational messages 1753*132f818dSEnji Cooper# ' 1754*132f818dSEnji Cooper# # No change in '$@' (ignored completely by this hook). Leave 1755*132f818dSEnji Cooper# # my_options_prep_result variable intact. 1756*132f818dSEnji Cooper# } 1757*132f818dSEnji Cooper# func_add_hook func_options_prep my_options_prep 1758*132f818dSEnji Cooper# 1759*132f818dSEnji Cooper# 1760*132f818dSEnji Cooper# my_silent_option () 1761*132f818dSEnji Cooper# { 1762*132f818dSEnji Cooper# $debug_cmd 1763*132f818dSEnji Cooper# 1764*132f818dSEnji Cooper# args_changed=false 1765*132f818dSEnji Cooper# 1766*132f818dSEnji Cooper# # Note that, for efficiency, we parse as many options as we can 1767*132f818dSEnji Cooper# # recognise in a loop before passing the remainder back to the 1768*132f818dSEnji Cooper# # caller on the first unrecognised argument we encounter. 1769*132f818dSEnji Cooper# while test $# -gt 0; do 1770*132f818dSEnji Cooper# opt=$1; shift 1771*132f818dSEnji Cooper# case $opt in 1772*132f818dSEnji Cooper# --silent|-s) opt_silent=: 1773*132f818dSEnji Cooper# args_changed=: 1774*132f818dSEnji Cooper# ;; 1775*132f818dSEnji Cooper# # Separate non-argument short options: 1776*132f818dSEnji Cooper# -s*) func_split_short_opt "$_G_opt" 1777*132f818dSEnji Cooper# set dummy "$func_split_short_opt_name" \ 1778*132f818dSEnji Cooper# "-$func_split_short_opt_arg" ${1+"$@"} 1779*132f818dSEnji Cooper# shift 1780*132f818dSEnji Cooper# args_changed=: 1781*132f818dSEnji Cooper# ;; 1782*132f818dSEnji Cooper# *) # Make sure the first unrecognised option "$_G_opt" 1783*132f818dSEnji Cooper# # is added back to "$@" in case we need it later, 1784*132f818dSEnji Cooper# # if $args_changed was set to 'true'. 1785*132f818dSEnji Cooper# set dummy "$_G_opt" ${1+"$@"}; shift; break ;; 1786*132f818dSEnji Cooper# esac 1787*132f818dSEnji Cooper# done 1788*132f818dSEnji Cooper# 1789*132f818dSEnji Cooper# # Only call 'func_quote' here if we processed at least one argument. 1790*132f818dSEnji Cooper# if $args_changed; then 1791*132f818dSEnji Cooper# func_quote eval ${1+"$@"} 1792*132f818dSEnji Cooper# my_silent_option_result=$func_quote_result 1793*132f818dSEnji Cooper# fi 1794*132f818dSEnji Cooper# } 1795*132f818dSEnji Cooper# func_add_hook func_parse_options my_silent_option 1796*132f818dSEnji Cooper# 1797*132f818dSEnji Cooper# 1798*132f818dSEnji Cooper# my_option_validation () 1799*132f818dSEnji Cooper# { 1800*132f818dSEnji Cooper# $debug_cmd 1801*132f818dSEnji Cooper# 1802*132f818dSEnji Cooper# $opt_silent && $opt_verbose && func_fatal_help "\ 1803*132f818dSEnji Cooper# '--silent' and '--verbose' options are mutually exclusive." 1804*132f818dSEnji Cooper# } 1805*132f818dSEnji Cooper# func_add_hook func_validate_options my_option_validation 1806*132f818dSEnji Cooper# 1807*132f818dSEnji Cooper# You'll also need to manually amend $usage_message to reflect the extra 1808*132f818dSEnji Cooper# options you parse. It's preferable to append if you can, so that 1809*132f818dSEnji Cooper# multiple option parsing hooks can be added safely. 1810*132f818dSEnji Cooper 1811*132f818dSEnji Cooper 1812*132f818dSEnji Cooper# func_options_finish [ARG]... 1813*132f818dSEnji Cooper# ---------------------------- 1814*132f818dSEnji Cooper# Finishing the option parse loop (call 'func_options' hooks ATM). 1815*132f818dSEnji Cooperfunc_options_finish () 1816*132f818dSEnji Cooper{ 1817*132f818dSEnji Cooper $debug_cmd 1818*132f818dSEnji Cooper 1819*132f818dSEnji Cooper func_run_hooks func_options ${1+"$@"} 1820*132f818dSEnji Cooper func_propagate_result func_run_hooks func_options_finish 1821*132f818dSEnji Cooper} 1822*132f818dSEnji Cooper 1823*132f818dSEnji Cooper 1824*132f818dSEnji Cooper# func_options [ARG]... 1825*132f818dSEnji Cooper# --------------------- 1826*132f818dSEnji Cooper# All the functions called inside func_options are hookable. See the 1827*132f818dSEnji Cooper# individual implementations for details. 1828*132f818dSEnji Cooperfunc_hookable func_options 1829*132f818dSEnji Cooperfunc_options () 1830*132f818dSEnji Cooper{ 1831*132f818dSEnji Cooper $debug_cmd 1832*132f818dSEnji Cooper 1833*132f818dSEnji Cooper _G_options_quoted=false 1834*132f818dSEnji Cooper 1835*132f818dSEnji Cooper for my_func in options_prep parse_options validate_options options_finish 1836*132f818dSEnji Cooper do 1837*132f818dSEnji Cooper func_unset func_${my_func}_result 1838*132f818dSEnji Cooper func_unset func_run_hooks_result 1839*132f818dSEnji Cooper eval func_$my_func '${1+"$@"}' 1840*132f818dSEnji Cooper func_propagate_result func_$my_func func_options 1841*132f818dSEnji Cooper if $func_propagate_result_result; then 1842*132f818dSEnji Cooper eval set dummy "$func_options_result"; shift 1843*132f818dSEnji Cooper _G_options_quoted=: 1844*132f818dSEnji Cooper fi 1845*132f818dSEnji Cooper done 1846*132f818dSEnji Cooper 1847*132f818dSEnji Cooper $_G_options_quoted || { 1848*132f818dSEnji Cooper # As we (func_options) are top-level options-parser function and 1849*132f818dSEnji Cooper # nobody quoted "$@" for us yet, we need to do it explicitly for 1850*132f818dSEnji Cooper # caller. 1851*132f818dSEnji Cooper func_quote eval ${1+"$@"} 1852*132f818dSEnji Cooper func_options_result=$func_quote_result 1853*132f818dSEnji Cooper } 1854*132f818dSEnji Cooper} 1855*132f818dSEnji Cooper 1856*132f818dSEnji Cooper 1857*132f818dSEnji Cooper# func_options_prep [ARG]... 1858*132f818dSEnji Cooper# -------------------------- 1859*132f818dSEnji Cooper# All initialisations required before starting the option parse loop. 1860*132f818dSEnji Cooper# Note that when calling hook functions, we pass through the list of 1861*132f818dSEnji Cooper# positional parameters. If a hook function modifies that list, and 1862*132f818dSEnji Cooper# needs to propagate that back to rest of this script, then the complete 1863*132f818dSEnji Cooper# modified list must be put in 'func_run_hooks_result' before returning. 1864*132f818dSEnji Cooperfunc_hookable func_options_prep 1865*132f818dSEnji Cooperfunc_options_prep () 1866*132f818dSEnji Cooper{ 1867*132f818dSEnji Cooper $debug_cmd 1868*132f818dSEnji Cooper 1869*132f818dSEnji Cooper # Option defaults: 1870*132f818dSEnji Cooper opt_verbose=false 1871*132f818dSEnji Cooper opt_warning_types= 1872*132f818dSEnji Cooper 1873*132f818dSEnji Cooper func_run_hooks func_options_prep ${1+"$@"} 1874*132f818dSEnji Cooper func_propagate_result func_run_hooks func_options_prep 1875*132f818dSEnji Cooper} 1876*132f818dSEnji Cooper 1877*132f818dSEnji Cooper 1878*132f818dSEnji Cooper# func_parse_options [ARG]... 1879*132f818dSEnji Cooper# --------------------------- 1880*132f818dSEnji Cooper# The main option parsing loop. 1881*132f818dSEnji Cooperfunc_hookable func_parse_options 1882*132f818dSEnji Cooperfunc_parse_options () 1883*132f818dSEnji Cooper{ 1884*132f818dSEnji Cooper $debug_cmd 1885*132f818dSEnji Cooper 1886*132f818dSEnji Cooper _G_parse_options_requote=false 1887*132f818dSEnji Cooper # this just eases exit handling 1888*132f818dSEnji Cooper while test $# -gt 0; do 1889*132f818dSEnji Cooper # Defer to hook functions for initial option parsing, so they 1890*132f818dSEnji Cooper # get priority in the event of reusing an option name. 1891*132f818dSEnji Cooper func_run_hooks func_parse_options ${1+"$@"} 1892*132f818dSEnji Cooper func_propagate_result func_run_hooks func_parse_options 1893*132f818dSEnji Cooper if $func_propagate_result_result; then 1894*132f818dSEnji Cooper eval set dummy "$func_parse_options_result"; shift 1895*132f818dSEnji Cooper # Even though we may have changed "$@", we passed the "$@" array 1896*132f818dSEnji Cooper # down into the hook and it quoted it for us (because we are in 1897*132f818dSEnji Cooper # this if-branch). No need to quote it again. 1898*132f818dSEnji Cooper _G_parse_options_requote=false 1899*132f818dSEnji Cooper fi 1900*132f818dSEnji Cooper 1901*132f818dSEnji Cooper # Break out of the loop if we already parsed every option. 1902*132f818dSEnji Cooper test $# -gt 0 || break 1903*132f818dSEnji Cooper 1904*132f818dSEnji Cooper # We expect that one of the options parsed in this function matches 1905*132f818dSEnji Cooper # and thus we remove _G_opt from "$@" and need to re-quote. 1906*132f818dSEnji Cooper _G_match_parse_options=: 1907*132f818dSEnji Cooper _G_opt=$1 1908*132f818dSEnji Cooper shift 1909*132f818dSEnji Cooper case $_G_opt in 1910*132f818dSEnji Cooper --debug|-x) debug_cmd='set -x' 1911*132f818dSEnji Cooper func_echo "enabling shell trace mode" >&2 1912*132f818dSEnji Cooper $debug_cmd 1913*132f818dSEnji Cooper ;; 1914*132f818dSEnji Cooper 1915*132f818dSEnji Cooper --no-warnings|--no-warning|--no-warn) 1916*132f818dSEnji Cooper set dummy --warnings none ${1+"$@"} 1917*132f818dSEnji Cooper shift 1918*132f818dSEnji Cooper ;; 1919*132f818dSEnji Cooper 1920*132f818dSEnji Cooper --warnings|--warning|-W) 1921*132f818dSEnji Cooper if test $# = 0 && func_missing_arg $_G_opt; then 1922*132f818dSEnji Cooper _G_parse_options_requote=: 1923*132f818dSEnji Cooper break 1924*132f818dSEnji Cooper fi 1925*132f818dSEnji Cooper case " $warning_categories $1" in 1926*132f818dSEnji Cooper *" $1 "*) 1927*132f818dSEnji Cooper # trailing space prevents matching last $1 above 1928*132f818dSEnji Cooper func_append_uniq opt_warning_types " $1" 1929*132f818dSEnji Cooper ;; 1930*132f818dSEnji Cooper *all) 1931*132f818dSEnji Cooper opt_warning_types=$warning_categories 1932*132f818dSEnji Cooper ;; 1933*132f818dSEnji Cooper *none) 1934*132f818dSEnji Cooper opt_warning_types=none 1935*132f818dSEnji Cooper warning_func=: 1936*132f818dSEnji Cooper ;; 1937*132f818dSEnji Cooper *error) 1938*132f818dSEnji Cooper opt_warning_types=$warning_categories 1939*132f818dSEnji Cooper warning_func=func_fatal_error 1940*132f818dSEnji Cooper ;; 1941*132f818dSEnji Cooper *) 1942*132f818dSEnji Cooper func_fatal_error \ 1943*132f818dSEnji Cooper "unsupported warning category: '$1'" 1944*132f818dSEnji Cooper ;; 1945*132f818dSEnji Cooper esac 1946*132f818dSEnji Cooper shift 1947*132f818dSEnji Cooper ;; 1948*132f818dSEnji Cooper 1949*132f818dSEnji Cooper --verbose|-v) opt_verbose=: ;; 1950*132f818dSEnji Cooper --version) func_version ;; 1951*132f818dSEnji Cooper -\?|-h) func_usage ;; 1952*132f818dSEnji Cooper --help) func_help ;; 1953*132f818dSEnji Cooper 1954*132f818dSEnji Cooper # Separate optargs to long options (plugins may need this): 1955*132f818dSEnji Cooper --*=*) func_split_equals "$_G_opt" 1956*132f818dSEnji Cooper set dummy "$func_split_equals_lhs" \ 1957*132f818dSEnji Cooper "$func_split_equals_rhs" ${1+"$@"} 1958*132f818dSEnji Cooper shift 1959*132f818dSEnji Cooper ;; 1960*132f818dSEnji Cooper 1961*132f818dSEnji Cooper # Separate optargs to short options: 1962*132f818dSEnji Cooper -W*) 1963*132f818dSEnji Cooper func_split_short_opt "$_G_opt" 1964*132f818dSEnji Cooper set dummy "$func_split_short_opt_name" \ 1965*132f818dSEnji Cooper "$func_split_short_opt_arg" ${1+"$@"} 1966*132f818dSEnji Cooper shift 1967*132f818dSEnji Cooper ;; 1968*132f818dSEnji Cooper 1969*132f818dSEnji Cooper # Separate non-argument short options: 1970*132f818dSEnji Cooper -\?*|-h*|-v*|-x*) 1971*132f818dSEnji Cooper func_split_short_opt "$_G_opt" 1972*132f818dSEnji Cooper set dummy "$func_split_short_opt_name" \ 1973*132f818dSEnji Cooper "-$func_split_short_opt_arg" ${1+"$@"} 1974*132f818dSEnji Cooper shift 1975*132f818dSEnji Cooper ;; 1976*132f818dSEnji Cooper 1977*132f818dSEnji Cooper --) _G_parse_options_requote=: ; break ;; 1978*132f818dSEnji Cooper -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; 1979*132f818dSEnji Cooper *) set dummy "$_G_opt" ${1+"$@"}; shift 1980*132f818dSEnji Cooper _G_match_parse_options=false 1981*132f818dSEnji Cooper break 1982*132f818dSEnji Cooper ;; 1983*132f818dSEnji Cooper esac 1984*132f818dSEnji Cooper 1985*132f818dSEnji Cooper if $_G_match_parse_options; then 1986*132f818dSEnji Cooper _G_parse_options_requote=: 1987*132f818dSEnji Cooper fi 1988*132f818dSEnji Cooper done 1989*132f818dSEnji Cooper 1990*132f818dSEnji Cooper if $_G_parse_options_requote; then 1991*132f818dSEnji Cooper # save modified positional parameters for caller 1992*132f818dSEnji Cooper func_quote eval ${1+"$@"} 1993*132f818dSEnji Cooper func_parse_options_result=$func_quote_result 1994*132f818dSEnji Cooper fi 1995*132f818dSEnji Cooper} 1996*132f818dSEnji Cooper 1997*132f818dSEnji Cooper 1998*132f818dSEnji Cooper# func_validate_options [ARG]... 1999*132f818dSEnji Cooper# ------------------------------ 2000*132f818dSEnji Cooper# Perform any sanity checks on option settings and/or unconsumed 2001*132f818dSEnji Cooper# arguments. 2002*132f818dSEnji Cooperfunc_hookable func_validate_options 2003*132f818dSEnji Cooperfunc_validate_options () 2004*132f818dSEnji Cooper{ 2005*132f818dSEnji Cooper $debug_cmd 2006*132f818dSEnji Cooper 2007*132f818dSEnji Cooper # Display all warnings if -W was not given. 2008*132f818dSEnji Cooper test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" 2009*132f818dSEnji Cooper 2010*132f818dSEnji Cooper func_run_hooks func_validate_options ${1+"$@"} 2011*132f818dSEnji Cooper func_propagate_result func_run_hooks func_validate_options 2012*132f818dSEnji Cooper 2013*132f818dSEnji Cooper # Bail if the options were screwed! 2014*132f818dSEnji Cooper $exit_cmd $EXIT_FAILURE 2015*132f818dSEnji Cooper} 2016*132f818dSEnji Cooper 2017*132f818dSEnji Cooper 2018*132f818dSEnji Cooper 2019*132f818dSEnji Cooper## ----------------- ## 2020*132f818dSEnji Cooper## Helper functions. ## 2021*132f818dSEnji Cooper## ----------------- ## 2022*132f818dSEnji Cooper 2023*132f818dSEnji Cooper# This section contains the helper functions used by the rest of the 2024*132f818dSEnji Cooper# hookable option parser framework in ascii-betical order. 2025*132f818dSEnji Cooper 2026*132f818dSEnji Cooper 2027*132f818dSEnji Cooper# func_fatal_help ARG... 2028*132f818dSEnji Cooper# ---------------------- 2029*132f818dSEnji Cooper# Echo program name prefixed message to standard error, followed by 2030*132f818dSEnji Cooper# a help hint, and exit. 2031*132f818dSEnji Cooperfunc_fatal_help () 2032*132f818dSEnji Cooper{ 2033*132f818dSEnji Cooper $debug_cmd 2034*132f818dSEnji Cooper 2035*132f818dSEnji Cooper eval \$ECHO \""Usage: $usage"\" 2036*132f818dSEnji Cooper eval \$ECHO \""$fatal_help"\" 2037*132f818dSEnji Cooper func_error ${1+"$@"} 2038*132f818dSEnji Cooper exit $EXIT_FAILURE 2039*132f818dSEnji Cooper} 2040*132f818dSEnji Cooper 2041*132f818dSEnji Cooper 2042*132f818dSEnji Cooper# func_help 2043*132f818dSEnji Cooper# --------- 2044*132f818dSEnji Cooper# Echo long help message to standard output and exit. 2045*132f818dSEnji Cooperfunc_help () 2046*132f818dSEnji Cooper{ 2047*132f818dSEnji Cooper $debug_cmd 2048*132f818dSEnji Cooper 2049*132f818dSEnji Cooper func_usage_message 2050*132f818dSEnji Cooper $ECHO "$long_help_message" 2051*132f818dSEnji Cooper exit 0 2052*132f818dSEnji Cooper} 2053*132f818dSEnji Cooper 2054*132f818dSEnji Cooper 2055*132f818dSEnji Cooper# func_missing_arg ARGNAME 2056*132f818dSEnji Cooper# ------------------------ 2057*132f818dSEnji Cooper# Echo program name prefixed message to standard error and set global 2058*132f818dSEnji Cooper# exit_cmd. 2059*132f818dSEnji Cooperfunc_missing_arg () 2060*132f818dSEnji Cooper{ 2061*132f818dSEnji Cooper $debug_cmd 2062*132f818dSEnji Cooper 2063*132f818dSEnji Cooper func_error "Missing argument for '$1'." 2064*132f818dSEnji Cooper exit_cmd=exit 2065*132f818dSEnji Cooper} 2066*132f818dSEnji Cooper 2067*132f818dSEnji Cooper 2068*132f818dSEnji Cooper# func_split_equals STRING 2069*132f818dSEnji Cooper# ------------------------ 2070*132f818dSEnji Cooper# Set func_split_equals_lhs and func_split_equals_rhs shell variables 2071*132f818dSEnji Cooper# after splitting STRING at the '=' sign. 2072*132f818dSEnji Coopertest -z "$_G_HAVE_XSI_OPS" \ 2073*132f818dSEnji Cooper && (eval 'x=a/b/c; 2074*132f818dSEnji Cooper test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ 2075*132f818dSEnji Cooper && _G_HAVE_XSI_OPS=yes 2076*132f818dSEnji Cooper 2077*132f818dSEnji Cooperif test yes = "$_G_HAVE_XSI_OPS" 2078*132f818dSEnji Cooperthen 2079*132f818dSEnji Cooper # This is an XSI compatible shell, allowing a faster implementation... 2080*132f818dSEnji Cooper eval 'func_split_equals () 2081*132f818dSEnji Cooper { 2082*132f818dSEnji Cooper $debug_cmd 2083*132f818dSEnji Cooper 2084*132f818dSEnji Cooper func_split_equals_lhs=${1%%=*} 2085*132f818dSEnji Cooper func_split_equals_rhs=${1#*=} 2086*132f818dSEnji Cooper if test "x$func_split_equals_lhs" = "x$1"; then 2087*132f818dSEnji Cooper func_split_equals_rhs= 2088*132f818dSEnji Cooper fi 2089*132f818dSEnji Cooper }' 2090*132f818dSEnji Cooperelse 2091*132f818dSEnji Cooper # ...otherwise fall back to using expr, which is often a shell builtin. 2092*132f818dSEnji Cooper func_split_equals () 2093*132f818dSEnji Cooper { 2094*132f818dSEnji Cooper $debug_cmd 2095*132f818dSEnji Cooper 2096*132f818dSEnji Cooper func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` 2097*132f818dSEnji Cooper func_split_equals_rhs= 2098*132f818dSEnji Cooper test "x$func_split_equals_lhs=" = "x$1" \ 2099*132f818dSEnji Cooper || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` 2100*132f818dSEnji Cooper } 2101*132f818dSEnji Cooperfi #func_split_equals 2102*132f818dSEnji Cooper 2103*132f818dSEnji Cooper 2104*132f818dSEnji Cooper# func_split_short_opt SHORTOPT 2105*132f818dSEnji Cooper# ----------------------------- 2106*132f818dSEnji Cooper# Set func_split_short_opt_name and func_split_short_opt_arg shell 2107*132f818dSEnji Cooper# variables after splitting SHORTOPT after the 2nd character. 2108*132f818dSEnji Cooperif test yes = "$_G_HAVE_XSI_OPS" 2109*132f818dSEnji Cooperthen 2110*132f818dSEnji Cooper # This is an XSI compatible shell, allowing a faster implementation... 2111*132f818dSEnji Cooper eval 'func_split_short_opt () 2112*132f818dSEnji Cooper { 2113*132f818dSEnji Cooper $debug_cmd 2114*132f818dSEnji Cooper 2115*132f818dSEnji Cooper func_split_short_opt_arg=${1#??} 2116*132f818dSEnji Cooper func_split_short_opt_name=${1%"$func_split_short_opt_arg"} 2117*132f818dSEnji Cooper }' 2118*132f818dSEnji Cooperelse 2119*132f818dSEnji Cooper # ...otherwise fall back to using expr, which is often a shell builtin. 2120*132f818dSEnji Cooper func_split_short_opt () 2121*132f818dSEnji Cooper { 2122*132f818dSEnji Cooper $debug_cmd 2123*132f818dSEnji Cooper 2124*132f818dSEnji Cooper func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` 2125*132f818dSEnji Cooper func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` 2126*132f818dSEnji Cooper } 2127*132f818dSEnji Cooperfi #func_split_short_opt 2128*132f818dSEnji Cooper 2129*132f818dSEnji Cooper 2130*132f818dSEnji Cooper# func_usage 2131*132f818dSEnji Cooper# ---------- 2132*132f818dSEnji Cooper# Echo short help message to standard output and exit. 2133*132f818dSEnji Cooperfunc_usage () 2134*132f818dSEnji Cooper{ 2135*132f818dSEnji Cooper $debug_cmd 2136*132f818dSEnji Cooper 2137*132f818dSEnji Cooper func_usage_message 2138*132f818dSEnji Cooper $ECHO "Run '$progname --help |${PAGER-more}' for full usage" 2139*132f818dSEnji Cooper exit 0 2140*132f818dSEnji Cooper} 2141*132f818dSEnji Cooper 2142*132f818dSEnji Cooper 2143*132f818dSEnji Cooper# func_usage_message 2144*132f818dSEnji Cooper# ------------------ 2145*132f818dSEnji Cooper# Echo short help message to standard output. 2146*132f818dSEnji Cooperfunc_usage_message () 2147*132f818dSEnji Cooper{ 2148*132f818dSEnji Cooper $debug_cmd 2149*132f818dSEnji Cooper 2150*132f818dSEnji Cooper eval \$ECHO \""Usage: $usage"\" 2151*132f818dSEnji Cooper echo 2152*132f818dSEnji Cooper $SED -n 's|^# || 2153*132f818dSEnji Cooper /^Written by/{ 2154*132f818dSEnji Cooper x;p;x 2155*132f818dSEnji Cooper } 2156*132f818dSEnji Cooper h 2157*132f818dSEnji Cooper /^Written by/q' < "$progpath" 2158*132f818dSEnji Cooper echo 2159*132f818dSEnji Cooper eval \$ECHO \""$usage_message"\" 2160*132f818dSEnji Cooper} 2161*132f818dSEnji Cooper 2162*132f818dSEnji Cooper 2163*132f818dSEnji Cooper# func_version 2164*132f818dSEnji Cooper# ------------ 2165*132f818dSEnji Cooper# Echo version message to standard output and exit. 2166*132f818dSEnji Cooper# The version message is extracted from the calling file's header 2167*132f818dSEnji Cooper# comments, with leading '# ' stripped: 2168*132f818dSEnji Cooper# 1. First display the progname and version 2169*132f818dSEnji Cooper# 2. Followed by the header comment line matching /^# Written by / 2170*132f818dSEnji Cooper# 3. Then a blank line followed by the first following line matching 2171*132f818dSEnji Cooper# /^# Copyright / 2172*132f818dSEnji Cooper# 4. Immediately followed by any lines between the previous matches, 2173*132f818dSEnji Cooper# except lines preceding the intervening completely blank line. 2174*132f818dSEnji Cooper# For example, see the header comments of this file. 2175*132f818dSEnji Cooperfunc_version () 2176*132f818dSEnji Cooper{ 2177*132f818dSEnji Cooper $debug_cmd 2178*132f818dSEnji Cooper 2179*132f818dSEnji Cooper printf '%s\n' "$progname $scriptversion" 2180*132f818dSEnji Cooper $SED -n ' 2181*132f818dSEnji Cooper /^# Written by /!b 2182*132f818dSEnji Cooper s|^# ||; p; n 2183*132f818dSEnji Cooper 2184*132f818dSEnji Cooper :fwd2blnk 2185*132f818dSEnji Cooper /./ { 2186*132f818dSEnji Cooper n 2187*132f818dSEnji Cooper b fwd2blnk 2188*132f818dSEnji Cooper } 2189*132f818dSEnji Cooper p; n 2190*132f818dSEnji Cooper 2191*132f818dSEnji Cooper :holdwrnt 2192*132f818dSEnji Cooper s|^# || 2193*132f818dSEnji Cooper s|^# *$|| 2194*132f818dSEnji Cooper /^Copyright /!{ 2195*132f818dSEnji Cooper /./H 2196*132f818dSEnji Cooper n 2197*132f818dSEnji Cooper b holdwrnt 2198*132f818dSEnji Cooper } 2199*132f818dSEnji Cooper 2200*132f818dSEnji Cooper s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| 2201*132f818dSEnji Cooper G 2202*132f818dSEnji Cooper s|\(\n\)\n*|\1|g 2203*132f818dSEnji Cooper p; q' < "$progpath" 2204*132f818dSEnji Cooper 2205*132f818dSEnji Cooper exit $? 2206*132f818dSEnji Cooper} 2207*132f818dSEnji Cooper 2208*132f818dSEnji Cooper 2209*132f818dSEnji Cooper# Local variables: 2210*132f818dSEnji Cooper# mode: shell-script 2211*132f818dSEnji Cooper# sh-indentation: 2 2212*132f818dSEnji Cooper# eval: (add-hook 'before-save-hook 'time-stamp) 2213*132f818dSEnji Cooper# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" 2214*132f818dSEnji Cooper# time-stamp-time-zone: "UTC" 2215*132f818dSEnji Cooper# End: 2216*132f818dSEnji Cooper 2217*132f818dSEnji Cooper# Set a version string. 2218*132f818dSEnji Cooperscriptversion='(GNU libtool) 2.5.4' 2219*132f818dSEnji Cooper 2220*132f818dSEnji Cooper# func_version 2221*132f818dSEnji Cooper# ------------ 2222*132f818dSEnji Cooper# Echo version message to standard output and exit. 2223*132f818dSEnji Cooperfunc_version () 2224*132f818dSEnji Cooper{ 2225*132f818dSEnji Cooper $debug_cmd 2226*132f818dSEnji Cooper 2227*132f818dSEnji Cooper year=`date +%Y` 2228*132f818dSEnji Cooper 2229*132f818dSEnji Cooper cat <<EOF 2230*132f818dSEnji Cooper$progname $scriptversion 2231*132f818dSEnji CooperCopyright (C) $year Free Software Foundation, Inc. 2232*132f818dSEnji CooperLicense GPLv2+: GNU GPL version 2 or later <https://gnu.org/licenses/gpl.html> 2233*132f818dSEnji CooperThis is free software: you are free to change and redistribute it. 2234*132f818dSEnji CooperThere is NO WARRANTY, to the extent permitted by law. 2235*132f818dSEnji Cooper 2236*132f818dSEnji CooperOriginally written by Gordon Matzigkeit, 1996 2237*132f818dSEnji Cooper(See AUTHORS for complete contributor listing) 2238*132f818dSEnji CooperEOF 2239*132f818dSEnji Cooper 2240*132f818dSEnji Cooper exit $? 2241*132f818dSEnji Cooper} 2242*132f818dSEnji Cooper 2243*132f818dSEnji Cooper 2244*132f818dSEnji Cooper# func_echo ARG... 2245*132f818dSEnji Cooper# ---------------- 2246*132f818dSEnji Cooper# Libtool also displays the current mode in messages, so override 2247*132f818dSEnji Cooper# funclib.sh func_echo with this custom definition. 2248*132f818dSEnji Cooperfunc_echo () 2249*132f818dSEnji Cooper{ 2250*132f818dSEnji Cooper $debug_cmd 2251*132f818dSEnji Cooper 2252*132f818dSEnji Cooper _G_message=$* 2253*132f818dSEnji Cooper 2254*132f818dSEnji Cooper func_echo_IFS=$IFS 2255*132f818dSEnji Cooper IFS=$nl 2256*132f818dSEnji Cooper for _G_line in $_G_message; do 2257*132f818dSEnji Cooper IFS=$func_echo_IFS 2258*132f818dSEnji Cooper $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" 2259*132f818dSEnji Cooper done 2260*132f818dSEnji Cooper IFS=$func_echo_IFS 2261*132f818dSEnji Cooper} 2262*132f818dSEnji Cooper 2263*132f818dSEnji Cooper 2264*132f818dSEnji Cooper## ---------------- ## 2265*132f818dSEnji Cooper## Options parsing. ## 2266*132f818dSEnji Cooper## ---------------- ## 2267*132f818dSEnji Cooper 2268*132f818dSEnji Cooper# Hook in the functions to make sure our own options are parsed during 2269*132f818dSEnji Cooper# the option parsing loop. 2270*132f818dSEnji Cooper 2271*132f818dSEnji Cooperusage='$progpath [OPTION]... [MODE-ARG]...' 2272*132f818dSEnji Cooper 2273*132f818dSEnji Cooper# Short help message in response to '-h'. 2274*132f818dSEnji Cooperusage_message="Options: 2275*132f818dSEnji Cooper --config show all configuration variables 2276*132f818dSEnji Cooper --debug enable verbose shell tracing 2277*132f818dSEnji Cooper -n, --dry-run display commands without modifying any files 2278*132f818dSEnji Cooper --features display basic configuration information 2279*132f818dSEnji Cooper --finish use operation '--mode=finish' 2280*132f818dSEnji Cooper --mode=MODE use operation mode MODE 2281*132f818dSEnji Cooper --no-finish don't update shared library cache 2282*132f818dSEnji Cooper --no-quiet, --no-silent print default informational messages 2283*132f818dSEnji Cooper --no-warnings equivalent to '-Wnone' 2284*132f818dSEnji Cooper --preserve-dup-deps don't remove duplicate dependency libraries 2285*132f818dSEnji Cooper --quiet, --silent don't print informational messages 2286*132f818dSEnji Cooper --reorder-cache=DIRS reorder shared library cache for preferred DIRS 2287*132f818dSEnji Cooper --tag=TAG use configuration variables from tag TAG 2288*132f818dSEnji Cooper -v, --verbose print more informational messages than default 2289*132f818dSEnji Cooper --version print version information 2290*132f818dSEnji Cooper -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] 2291*132f818dSEnji Cooper -h, --help, --help-all print short, long, or detailed help message 2292*132f818dSEnji Cooper" 2293*132f818dSEnji Cooper 2294*132f818dSEnji Cooper# Additional text appended to 'usage_message' in response to '--help'. 2295*132f818dSEnji Cooperfunc_help () 2296*132f818dSEnji Cooper{ 2297*132f818dSEnji Cooper $debug_cmd 2298*132f818dSEnji Cooper 2299*132f818dSEnji Cooper func_usage_message 2300*132f818dSEnji Cooper $ECHO "$long_help_message 2301*132f818dSEnji Cooper 2302*132f818dSEnji CooperMODE must be one of the following: 2303*132f818dSEnji Cooper 2304*132f818dSEnji Cooper clean remove files from the build directory 2305*132f818dSEnji Cooper compile compile a source file into a libtool object 2306*132f818dSEnji Cooper execute automatically set library path, then run a program 2307*132f818dSEnji Cooper finish complete the installation of libtool libraries 2308*132f818dSEnji Cooper install install libraries or executables 2309*132f818dSEnji Cooper link create a library or an executable 2310*132f818dSEnji Cooper uninstall remove libraries from an installed directory 2311*132f818dSEnji Cooper 2312*132f818dSEnji CooperMODE-ARGS vary depending on the MODE. When passed as first option, 2313*132f818dSEnji Cooper'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. 2314*132f818dSEnji CooperTry '$progname --help --mode=MODE' for a more detailed description of MODE. 2315*132f818dSEnji Cooper 2316*132f818dSEnji CooperWhen reporting a bug, please describe a test case to reproduce it and 2317*132f818dSEnji Cooperinclude the following information: 2318*132f818dSEnji Cooper 2319*132f818dSEnji Cooper host-triplet: $host 2320*132f818dSEnji Cooper shell: $SHELL 2321*132f818dSEnji Cooper compiler: $LTCC 2322*132f818dSEnji Cooper compiler flags: $LTCFLAGS 2323*132f818dSEnji Cooper linker: $LD (gnu? $with_gnu_ld) 2324*132f818dSEnji Cooper version: $progname $scriptversion 2325*132f818dSEnji Cooper automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` 2326*132f818dSEnji Cooper autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` 2327*132f818dSEnji Cooper 2328*132f818dSEnji CooperReport bugs to <bug-libtool@gnu.org>. 2329*132f818dSEnji CooperGNU libtool home page: <https://www.gnu.org/software/libtool/>. 2330*132f818dSEnji CooperGeneral help using GNU software: <https://www.gnu.org/gethelp/>." 2331*132f818dSEnji Cooper exit 0 2332*132f818dSEnji Cooper} 2333*132f818dSEnji Cooper 2334*132f818dSEnji Cooper 2335*132f818dSEnji Cooper# func_lo2o OBJECT-NAME 2336*132f818dSEnji Cooper# --------------------- 2337*132f818dSEnji Cooper# Transform OBJECT-NAME from a '.lo' suffix to the platform specific 2338*132f818dSEnji Cooper# object suffix. 2339*132f818dSEnji Cooper 2340*132f818dSEnji Cooperlo2o=s/\\.lo\$/.$objext/ 2341*132f818dSEnji Coopero2lo=s/\\.$objext\$/.lo/ 2342*132f818dSEnji Cooper 2343*132f818dSEnji Cooperif test yes = "$_G_HAVE_XSI_OPS"; then 2344*132f818dSEnji Cooper eval 'func_lo2o () 2345*132f818dSEnji Cooper { 2346*132f818dSEnji Cooper case $1 in 2347*132f818dSEnji Cooper *.lo) func_lo2o_result=${1%.lo}.$objext ;; 2348*132f818dSEnji Cooper * ) func_lo2o_result=$1 ;; 2349*132f818dSEnji Cooper esac 2350*132f818dSEnji Cooper }' 2351*132f818dSEnji Cooper 2352*132f818dSEnji Cooper # func_xform LIBOBJ-OR-SOURCE 2353*132f818dSEnji Cooper # --------------------------- 2354*132f818dSEnji Cooper # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) 2355*132f818dSEnji Cooper # suffix to a '.lo' libtool-object suffix. 2356*132f818dSEnji Cooper eval 'func_xform () 2357*132f818dSEnji Cooper { 2358*132f818dSEnji Cooper func_xform_result=${1%.*}.lo 2359*132f818dSEnji Cooper }' 2360*132f818dSEnji Cooperelse 2361*132f818dSEnji Cooper # ...otherwise fall back to using sed. 2362*132f818dSEnji Cooper func_lo2o () 2363*132f818dSEnji Cooper { 2364*132f818dSEnji Cooper func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` 2365*132f818dSEnji Cooper } 2366*132f818dSEnji Cooper 2367*132f818dSEnji Cooper func_xform () 2368*132f818dSEnji Cooper { 2369*132f818dSEnji Cooper func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` 2370*132f818dSEnji Cooper } 2371*132f818dSEnji Cooperfi 2372*132f818dSEnji Cooper 2373*132f818dSEnji Cooper 2374*132f818dSEnji Cooper# func_fatal_configuration ARG... 2375*132f818dSEnji Cooper# ------------------------------- 2376*132f818dSEnji Cooper# Echo program name prefixed message to standard error, followed by 2377*132f818dSEnji Cooper# a configuration failure hint, and exit. 2378*132f818dSEnji Cooperfunc_fatal_configuration () 2379*132f818dSEnji Cooper{ 2380*132f818dSEnji Cooper func_fatal_error ${1+"$@"} \ 2381*132f818dSEnji Cooper "See the $PACKAGE documentation for more information." \ 2382*132f818dSEnji Cooper "Fatal configuration error." 2383*132f818dSEnji Cooper} 2384*132f818dSEnji Cooper 2385*132f818dSEnji Cooper 2386*132f818dSEnji Cooper# func_config 2387*132f818dSEnji Cooper# ----------- 2388*132f818dSEnji Cooper# Display the configuration for all the tags in this script. 2389*132f818dSEnji Cooperfunc_config () 2390*132f818dSEnji Cooper{ 2391*132f818dSEnji Cooper re_begincf='^# ### BEGIN LIBTOOL' 2392*132f818dSEnji Cooper re_endcf='^# ### END LIBTOOL' 2393*132f818dSEnji Cooper 2394*132f818dSEnji Cooper # Default configuration. 2395*132f818dSEnji Cooper $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" 2396*132f818dSEnji Cooper 2397*132f818dSEnji Cooper # Now print the configurations for the tags. 2398*132f818dSEnji Cooper for tagname in $taglist; do 2399*132f818dSEnji Cooper $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" 2400*132f818dSEnji Cooper done 2401*132f818dSEnji Cooper 2402*132f818dSEnji Cooper exit $? 2403*132f818dSEnji Cooper} 2404*132f818dSEnji Cooper 2405*132f818dSEnji Cooper 2406*132f818dSEnji Cooper# func_features 2407*132f818dSEnji Cooper# ------------- 2408*132f818dSEnji Cooper# Display the features supported by this script. 2409*132f818dSEnji Cooperfunc_features () 2410*132f818dSEnji Cooper{ 2411*132f818dSEnji Cooper echo "host: $host" 2412*132f818dSEnji Cooper if test yes = "$build_libtool_libs"; then 2413*132f818dSEnji Cooper echo "enable shared libraries" 2414*132f818dSEnji Cooper else 2415*132f818dSEnji Cooper echo "disable shared libraries" 2416*132f818dSEnji Cooper fi 2417*132f818dSEnji Cooper if test yes = "$build_old_libs"; then 2418*132f818dSEnji Cooper echo "enable static libraries" 2419*132f818dSEnji Cooper else 2420*132f818dSEnji Cooper echo "disable static libraries" 2421*132f818dSEnji Cooper fi 2422*132f818dSEnji Cooper 2423*132f818dSEnji Cooper exit $? 2424*132f818dSEnji Cooper} 2425*132f818dSEnji Cooper 2426*132f818dSEnji Cooper 2427*132f818dSEnji Cooper# func_enable_tag TAGNAME 2428*132f818dSEnji Cooper# ----------------------- 2429*132f818dSEnji Cooper# Verify that TAGNAME is valid, and either flag an error and exit, or 2430*132f818dSEnji Cooper# enable the TAGNAME tag. We also add TAGNAME to the global $taglist 2431*132f818dSEnji Cooper# variable here. 2432*132f818dSEnji Cooperfunc_enable_tag () 2433*132f818dSEnji Cooper{ 2434*132f818dSEnji Cooper # Global variable: 2435*132f818dSEnji Cooper tagname=$1 2436*132f818dSEnji Cooper 2437*132f818dSEnji Cooper re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" 2438*132f818dSEnji Cooper re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" 2439*132f818dSEnji Cooper sed_extractcf=/$re_begincf/,/$re_endcf/p 2440*132f818dSEnji Cooper 2441*132f818dSEnji Cooper # Validate tagname. 2442*132f818dSEnji Cooper case $tagname in 2443*132f818dSEnji Cooper *[!-_A-Za-z0-9,/]*) 2444*132f818dSEnji Cooper func_fatal_error "invalid tag name: $tagname" 2445*132f818dSEnji Cooper ;; 2446*132f818dSEnji Cooper esac 2447*132f818dSEnji Cooper 2448*132f818dSEnji Cooper # Don't test for the "default" C tag, as we know it's 2449*132f818dSEnji Cooper # there but not specially marked. 2450*132f818dSEnji Cooper case $tagname in 2451*132f818dSEnji Cooper CC) ;; 2452*132f818dSEnji Cooper *) 2453*132f818dSEnji Cooper if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then 2454*132f818dSEnji Cooper taglist="$taglist $tagname" 2455*132f818dSEnji Cooper 2456*132f818dSEnji Cooper # Evaluate the configuration. Be careful to quote the path 2457*132f818dSEnji Cooper # and the sed script, to avoid splitting on whitespace, but 2458*132f818dSEnji Cooper # also don't use non-portable quotes within backquotes within 2459*132f818dSEnji Cooper # quotes we have to do it in 2 steps: 2460*132f818dSEnji Cooper extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` 2461*132f818dSEnji Cooper eval "$extractedcf" 2462*132f818dSEnji Cooper else 2463*132f818dSEnji Cooper func_error "ignoring unknown tag $tagname" 2464*132f818dSEnji Cooper fi 2465*132f818dSEnji Cooper ;; 2466*132f818dSEnji Cooper esac 2467*132f818dSEnji Cooper} 2468*132f818dSEnji Cooper 2469*132f818dSEnji Cooper 2470*132f818dSEnji Cooper# func_check_version_match 2471*132f818dSEnji Cooper# ------------------------ 2472*132f818dSEnji Cooper# Ensure that we are using m4 macros, and libtool script from the same 2473*132f818dSEnji Cooper# release of libtool. 2474*132f818dSEnji Cooperfunc_check_version_match () 2475*132f818dSEnji Cooper{ 2476*132f818dSEnji Cooper if test "$package_revision" != "$macro_revision"; then 2477*132f818dSEnji Cooper if test "$VERSION" != "$macro_version"; then 2478*132f818dSEnji Cooper if test -z "$macro_version"; then 2479*132f818dSEnji Cooper cat >&2 <<_LT_EOF 2480*132f818dSEnji Cooper$progname: Version mismatch error. This is $PACKAGE $VERSION, but the 2481*132f818dSEnji Cooper$progname: definition of this LT_INIT comes from an older release. 2482*132f818dSEnji Cooper$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION 2483*132f818dSEnji Cooper$progname: and run autoconf again. 2484*132f818dSEnji Cooper_LT_EOF 2485*132f818dSEnji Cooper else 2486*132f818dSEnji Cooper cat >&2 <<_LT_EOF 2487*132f818dSEnji Cooper$progname: Version mismatch error. This is $PACKAGE $VERSION, but the 2488*132f818dSEnji Cooper$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. 2489*132f818dSEnji Cooper$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION 2490*132f818dSEnji Cooper$progname: and run autoconf again. 2491*132f818dSEnji Cooper_LT_EOF 2492*132f818dSEnji Cooper fi 2493*132f818dSEnji Cooper else 2494*132f818dSEnji Cooper cat >&2 <<_LT_EOF 2495*132f818dSEnji Cooper$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, 2496*132f818dSEnji Cooper$progname: but the definition of this LT_INIT comes from revision $macro_revision. 2497*132f818dSEnji Cooper$progname: You should recreate aclocal.m4 with macros from revision $package_revision 2498*132f818dSEnji Cooper$progname: of $PACKAGE $VERSION and run autoconf again. 2499*132f818dSEnji Cooper_LT_EOF 2500*132f818dSEnji Cooper fi 2501*132f818dSEnji Cooper 2502*132f818dSEnji Cooper exit $EXIT_MISMATCH 2503*132f818dSEnji Cooper fi 2504*132f818dSEnji Cooper} 2505*132f818dSEnji Cooper 2506*132f818dSEnji Cooper 2507*132f818dSEnji Cooper# libtool_options_prep [ARG]... 2508*132f818dSEnji Cooper# ----------------------------- 2509*132f818dSEnji Cooper# Preparation for options parsed by libtool. 2510*132f818dSEnji Cooperlibtool_options_prep () 2511*132f818dSEnji Cooper{ 2512*132f818dSEnji Cooper $debug_mode 2513*132f818dSEnji Cooper 2514*132f818dSEnji Cooper # Option defaults: 2515*132f818dSEnji Cooper opt_config=false 2516*132f818dSEnji Cooper opt_dlopen= 2517*132f818dSEnji Cooper opt_dry_run=false 2518*132f818dSEnji Cooper opt_help=false 2519*132f818dSEnji Cooper opt_mode= 2520*132f818dSEnji Cooper opt_reorder_cache=false 2521*132f818dSEnji Cooper opt_preserve_dup_deps=false 2522*132f818dSEnji Cooper opt_quiet=false 2523*132f818dSEnji Cooper opt_finishing=true 2524*132f818dSEnji Cooper opt_warning= 2525*132f818dSEnji Cooper 2526*132f818dSEnji Cooper nonopt= 2527*132f818dSEnji Cooper preserve_args= 2528*132f818dSEnji Cooper 2529*132f818dSEnji Cooper _G_rc_lt_options_prep=: 2530*132f818dSEnji Cooper 2531*132f818dSEnji Cooper # Shorthand for --mode=foo, only valid as the first argument 2532*132f818dSEnji Cooper case $1 in 2533*132f818dSEnji Cooper clean|clea|cle|cl) 2534*132f818dSEnji Cooper shift; set dummy --mode clean ${1+"$@"}; shift 2535*132f818dSEnji Cooper ;; 2536*132f818dSEnji Cooper compile|compil|compi|comp|com|co|c) 2537*132f818dSEnji Cooper shift; set dummy --mode compile ${1+"$@"}; shift 2538*132f818dSEnji Cooper ;; 2539*132f818dSEnji Cooper execute|execut|execu|exec|exe|ex|e) 2540*132f818dSEnji Cooper shift; set dummy --mode execute ${1+"$@"}; shift 2541*132f818dSEnji Cooper ;; 2542*132f818dSEnji Cooper finish|finis|fini|fin|fi|f) 2543*132f818dSEnji Cooper shift; set dummy --mode finish ${1+"$@"}; shift 2544*132f818dSEnji Cooper ;; 2545*132f818dSEnji Cooper install|instal|insta|inst|ins|in|i) 2546*132f818dSEnji Cooper shift; set dummy --mode install ${1+"$@"}; shift 2547*132f818dSEnji Cooper ;; 2548*132f818dSEnji Cooper link|lin|li|l) 2549*132f818dSEnji Cooper shift; set dummy --mode link ${1+"$@"}; shift 2550*132f818dSEnji Cooper ;; 2551*132f818dSEnji Cooper uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) 2552*132f818dSEnji Cooper shift; set dummy --mode uninstall ${1+"$@"}; shift 2553*132f818dSEnji Cooper ;; 2554*132f818dSEnji Cooper *) 2555*132f818dSEnji Cooper _G_rc_lt_options_prep=false 2556*132f818dSEnji Cooper ;; 2557*132f818dSEnji Cooper esac 2558*132f818dSEnji Cooper 2559*132f818dSEnji Cooper if $_G_rc_lt_options_prep; then 2560*132f818dSEnji Cooper # Pass back the list of options. 2561*132f818dSEnji Cooper func_quote eval ${1+"$@"} 2562*132f818dSEnji Cooper libtool_options_prep_result=$func_quote_result 2563*132f818dSEnji Cooper fi 2564*132f818dSEnji Cooper} 2565*132f818dSEnji Cooperfunc_add_hook func_options_prep libtool_options_prep 2566*132f818dSEnji Cooper 2567*132f818dSEnji Cooper 2568*132f818dSEnji Cooper# libtool_parse_options [ARG]... 2569*132f818dSEnji Cooper# --------------------------------- 2570*132f818dSEnji Cooper# Provide handling for libtool specific options. 2571*132f818dSEnji Cooperlibtool_parse_options () 2572*132f818dSEnji Cooper{ 2573*132f818dSEnji Cooper $debug_cmd 2574*132f818dSEnji Cooper 2575*132f818dSEnji Cooper _G_rc_lt_parse_options=false 2576*132f818dSEnji Cooper 2577*132f818dSEnji Cooper # Perform our own loop to consume as many options as possible in 2578*132f818dSEnji Cooper # each iteration. 2579*132f818dSEnji Cooper while test $# -gt 0; do 2580*132f818dSEnji Cooper _G_match_lt_parse_options=: 2581*132f818dSEnji Cooper _G_opt=$1 2582*132f818dSEnji Cooper shift 2583*132f818dSEnji Cooper case $_G_opt in 2584*132f818dSEnji Cooper --dry-run|--dryrun|-n) 2585*132f818dSEnji Cooper opt_dry_run=: 2586*132f818dSEnji Cooper ;; 2587*132f818dSEnji Cooper 2588*132f818dSEnji Cooper --config) func_config ;; 2589*132f818dSEnji Cooper 2590*132f818dSEnji Cooper --dlopen|-dlopen) 2591*132f818dSEnji Cooper opt_dlopen="${opt_dlopen+$opt_dlopen 2592*132f818dSEnji Cooper}$1" 2593*132f818dSEnji Cooper shift 2594*132f818dSEnji Cooper ;; 2595*132f818dSEnji Cooper 2596*132f818dSEnji Cooper --preserve-dup-deps) 2597*132f818dSEnji Cooper opt_preserve_dup_deps=: ;; 2598*132f818dSEnji Cooper 2599*132f818dSEnji Cooper --features) func_features ;; 2600*132f818dSEnji Cooper 2601*132f818dSEnji Cooper --finish) set dummy --mode finish ${1+"$@"}; shift ;; 2602*132f818dSEnji Cooper 2603*132f818dSEnji Cooper --help) opt_help=: ;; 2604*132f818dSEnji Cooper 2605*132f818dSEnji Cooper --help-all) opt_help=': help-all' ;; 2606*132f818dSEnji Cooper 2607*132f818dSEnji Cooper --mode) test $# = 0 && func_missing_arg $_G_opt && break 2608*132f818dSEnji Cooper opt_mode=$1 2609*132f818dSEnji Cooper case $1 in 2610*132f818dSEnji Cooper # Valid mode arguments: 2611*132f818dSEnji Cooper clean|compile|execute|finish|install|link|relink|uninstall) ;; 2612*132f818dSEnji Cooper 2613*132f818dSEnji Cooper # Catch anything else as an error 2614*132f818dSEnji Cooper *) func_error "invalid argument '$1' for $_G_opt" 2615*132f818dSEnji Cooper exit_cmd=exit 2616*132f818dSEnji Cooper ;; 2617*132f818dSEnji Cooper esac 2618*132f818dSEnji Cooper shift 2619*132f818dSEnji Cooper ;; 2620*132f818dSEnji Cooper 2621*132f818dSEnji Cooper --no-finish) 2622*132f818dSEnji Cooper opt_finishing=false 2623*132f818dSEnji Cooper func_append preserve_args " $_G_opt" 2624*132f818dSEnji Cooper ;; 2625*132f818dSEnji Cooper 2626*132f818dSEnji Cooper --no-silent|--no-quiet) 2627*132f818dSEnji Cooper opt_quiet=false 2628*132f818dSEnji Cooper func_append preserve_args " $_G_opt" 2629*132f818dSEnji Cooper ;; 2630*132f818dSEnji Cooper 2631*132f818dSEnji Cooper --no-warnings|--no-warning|--no-warn) 2632*132f818dSEnji Cooper opt_warning=false 2633*132f818dSEnji Cooper func_append preserve_args " $_G_opt" 2634*132f818dSEnji Cooper ;; 2635*132f818dSEnji Cooper 2636*132f818dSEnji Cooper --no-verbose) 2637*132f818dSEnji Cooper opt_verbose=false 2638*132f818dSEnji Cooper func_append preserve_args " $_G_opt" 2639*132f818dSEnji Cooper ;; 2640*132f818dSEnji Cooper 2641*132f818dSEnji Cooper --reorder-cache) 2642*132f818dSEnji Cooper opt_reorder_cache=true 2643*132f818dSEnji Cooper shared_lib_dirs=$1 2644*132f818dSEnji Cooper if test -n "$shared_lib_dirs"; then 2645*132f818dSEnji Cooper case $1 in 2646*132f818dSEnji Cooper # Must begin with /: 2647*132f818dSEnji Cooper /*) ;; 2648*132f818dSEnji Cooper 2649*132f818dSEnji Cooper # Catch anything else as an error (relative paths) 2650*132f818dSEnji Cooper *) func_error "invalid argument '$1' for $_G_opt" 2651*132f818dSEnji Cooper func_error "absolute paths are required for $_G_opt" 2652*132f818dSEnji Cooper exit_cmd=exit 2653*132f818dSEnji Cooper ;; 2654*132f818dSEnji Cooper esac 2655*132f818dSEnji Cooper fi 2656*132f818dSEnji Cooper shift 2657*132f818dSEnji Cooper ;; 2658*132f818dSEnji Cooper 2659*132f818dSEnji Cooper --silent|--quiet) 2660*132f818dSEnji Cooper opt_quiet=: 2661*132f818dSEnji Cooper opt_verbose=false 2662*132f818dSEnji Cooper func_append preserve_args " $_G_opt" 2663*132f818dSEnji Cooper ;; 2664*132f818dSEnji Cooper 2665*132f818dSEnji Cooper --tag) test $# = 0 && func_missing_arg $_G_opt && break 2666*132f818dSEnji Cooper opt_tag=$1 2667*132f818dSEnji Cooper func_append preserve_args " $_G_opt $1" 2668*132f818dSEnji Cooper func_enable_tag "$1" 2669*132f818dSEnji Cooper shift 2670*132f818dSEnji Cooper ;; 2671*132f818dSEnji Cooper 2672*132f818dSEnji Cooper --verbose|-v) opt_quiet=false 2673*132f818dSEnji Cooper opt_verbose=: 2674*132f818dSEnji Cooper func_append preserve_args " $_G_opt" 2675*132f818dSEnji Cooper ;; 2676*132f818dSEnji Cooper 2677*132f818dSEnji Cooper # An option not handled by this hook function: 2678*132f818dSEnji Cooper *) set dummy "$_G_opt" ${1+"$@"} ; shift 2679*132f818dSEnji Cooper _G_match_lt_parse_options=false 2680*132f818dSEnji Cooper break 2681*132f818dSEnji Cooper ;; 2682*132f818dSEnji Cooper esac 2683*132f818dSEnji Cooper $_G_match_lt_parse_options && _G_rc_lt_parse_options=: 2684*132f818dSEnji Cooper done 2685*132f818dSEnji Cooper 2686*132f818dSEnji Cooper if $_G_rc_lt_parse_options; then 2687*132f818dSEnji Cooper # save modified positional parameters for caller 2688*132f818dSEnji Cooper func_quote eval ${1+"$@"} 2689*132f818dSEnji Cooper libtool_parse_options_result=$func_quote_result 2690*132f818dSEnji Cooper fi 2691*132f818dSEnji Cooper} 2692*132f818dSEnji Cooperfunc_add_hook func_parse_options libtool_parse_options 2693*132f818dSEnji Cooper 2694*132f818dSEnji Cooper 2695*132f818dSEnji Cooper# func_warning ARG... 2696*132f818dSEnji Cooper# ------------------- 2697*132f818dSEnji Cooper# Libtool warnings are not categorized, so override funclib.sh 2698*132f818dSEnji Cooper# func_warning with this simpler definition. 2699*132f818dSEnji Cooperfunc_warning () 2700*132f818dSEnji Cooper{ 2701*132f818dSEnji Cooper if $opt_warning; then 2702*132f818dSEnji Cooper $debug_cmd 2703*132f818dSEnji Cooper $warning_func ${1+"$@"} 2704*132f818dSEnji Cooper fi 2705*132f818dSEnji Cooper} 2706*132f818dSEnji Cooper 2707*132f818dSEnji Cooper 2708*132f818dSEnji Cooper# libtool_validate_options [ARG]... 2709*132f818dSEnji Cooper# --------------------------------- 2710*132f818dSEnji Cooper# Perform any sanity checks on option settings and/or unconsumed 2711*132f818dSEnji Cooper# arguments. 2712*132f818dSEnji Cooperlibtool_validate_options () 2713*132f818dSEnji Cooper{ 2714*132f818dSEnji Cooper # save first non-option argument 2715*132f818dSEnji Cooper if test 0 -lt $#; then 2716*132f818dSEnji Cooper nonopt=$1 2717*132f818dSEnji Cooper shift 2718*132f818dSEnji Cooper fi 2719*132f818dSEnji Cooper 2720*132f818dSEnji Cooper # preserve --debug 2721*132f818dSEnji Cooper test : = "$debug_cmd" || func_append preserve_args " --debug" 2722*132f818dSEnji Cooper 2723*132f818dSEnji Cooper case $host_os in 2724*132f818dSEnji Cooper # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 2725*132f818dSEnji Cooper # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 2726*132f818dSEnji Cooper cygwin* | mingw* | windows* | pw32* | cegcc* | solaris2* | os2*) 2727*132f818dSEnji Cooper # don't eliminate duplications in $postdeps and $predeps 2728*132f818dSEnji Cooper opt_duplicate_compiler_generated_deps=: 2729*132f818dSEnji Cooper ;; 2730*132f818dSEnji Cooper *) 2731*132f818dSEnji Cooper opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps 2732*132f818dSEnji Cooper ;; 2733*132f818dSEnji Cooper esac 2734*132f818dSEnji Cooper 2735*132f818dSEnji Cooper $opt_help || { 2736*132f818dSEnji Cooper # Sanity checks first: 2737*132f818dSEnji Cooper func_check_version_match 2738*132f818dSEnji Cooper 2739*132f818dSEnji Cooper test yes != "$build_libtool_libs" \ 2740*132f818dSEnji Cooper && test yes != "$build_old_libs" \ 2741*132f818dSEnji Cooper && func_fatal_configuration "not configured to build any kind of library" 2742*132f818dSEnji Cooper 2743*132f818dSEnji Cooper # Darwin sucks 2744*132f818dSEnji Cooper eval std_shrext=\"$shrext_cmds\" 2745*132f818dSEnji Cooper 2746*132f818dSEnji Cooper # Only execute mode is allowed to have -dlopen flags. 2747*132f818dSEnji Cooper if test -n "$opt_dlopen" && test execute != "$opt_mode"; then 2748*132f818dSEnji Cooper func_error "unrecognized option '-dlopen'" 2749*132f818dSEnji Cooper $ECHO "$help" 1>&2 2750*132f818dSEnji Cooper exit $EXIT_FAILURE 2751*132f818dSEnji Cooper fi 2752*132f818dSEnji Cooper 2753*132f818dSEnji Cooper # Change the help message to a mode-specific one. 2754*132f818dSEnji Cooper generic_help=$help 2755*132f818dSEnji Cooper help="Try '$progname --help --mode=$opt_mode' for more information." 2756*132f818dSEnji Cooper } 2757*132f818dSEnji Cooper 2758*132f818dSEnji Cooper # Pass back the unparsed argument list 2759*132f818dSEnji Cooper func_quote eval ${1+"$@"} 2760*132f818dSEnji Cooper libtool_validate_options_result=$func_quote_result 2761*132f818dSEnji Cooper} 2762*132f818dSEnji Cooperfunc_add_hook func_validate_options libtool_validate_options 2763*132f818dSEnji Cooper 2764*132f818dSEnji Cooper 2765*132f818dSEnji Cooper# Process options as early as possible so that --help and --version 2766*132f818dSEnji Cooper# can return quickly. 2767*132f818dSEnji Cooperfunc_options ${1+"$@"} 2768*132f818dSEnji Coopereval set dummy "$func_options_result"; shift 2769*132f818dSEnji Cooper 2770*132f818dSEnji Cooper 2771*132f818dSEnji Cooper 2772*132f818dSEnji Cooper## ----------- ## 2773*132f818dSEnji Cooper## Main. ## 2774*132f818dSEnji Cooper## ----------- ## 2775*132f818dSEnji Cooper 2776*132f818dSEnji Coopermagic='%%%MAGIC variable%%%' 2777*132f818dSEnji Coopermagic_exe='%%%MAGIC EXE variable%%%' 2778*132f818dSEnji Cooper 2779*132f818dSEnji Cooper# Global variables. 2780*132f818dSEnji Cooperextracted_archives= 2781*132f818dSEnji Cooperextracted_serial=0 2782*132f818dSEnji Cooper 2783*132f818dSEnji Cooper# If this variable is set in any of the actions, the command in it 2784*132f818dSEnji Cooper# will be execed at the end. This prevents here-documents from being 2785*132f818dSEnji Cooper# left over by shells. 2786*132f818dSEnji Cooperexec_cmd= 2787*132f818dSEnji Cooper 2788*132f818dSEnji Cooper 2789*132f818dSEnji Cooper# A function that is used when there is no print builtin or printf. 2790*132f818dSEnji Cooperfunc_fallback_echo () 2791*132f818dSEnji Cooper{ 2792*132f818dSEnji Cooper eval 'cat <<_LTECHO_EOF 2793*132f818dSEnji Cooper$1 2794*132f818dSEnji Cooper_LTECHO_EOF' 2795*132f818dSEnji Cooper} 2796*132f818dSEnji Cooper 2797*132f818dSEnji Cooper# func_generated_by_libtool 2798*132f818dSEnji Cooper# True iff stdin has been generated by Libtool. This function is only 2799*132f818dSEnji Cooper# a basic sanity check; it will hardly flush out determined imposters. 2800*132f818dSEnji Cooperfunc_generated_by_libtool_p () 2801*132f818dSEnji Cooper{ 2802*132f818dSEnji Cooper $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 2803*132f818dSEnji Cooper} 2804*132f818dSEnji Cooper 2805*132f818dSEnji Cooper# func_lalib_p file 2806*132f818dSEnji Cooper# True iff FILE is a libtool '.la' library or '.lo' object file. 2807*132f818dSEnji Cooper# This function is only a basic sanity check; it will hardly flush out 2808*132f818dSEnji Cooper# determined imposters. 2809*132f818dSEnji Cooperfunc_lalib_p () 2810*132f818dSEnji Cooper{ 2811*132f818dSEnji Cooper test -f "$1" && 2812*132f818dSEnji Cooper $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p 2813*132f818dSEnji Cooper} 2814*132f818dSEnji Cooper 2815*132f818dSEnji Cooper# func_lalib_unsafe_p file 2816*132f818dSEnji Cooper# True iff FILE is a libtool '.la' library or '.lo' object file. 2817*132f818dSEnji Cooper# This function implements the same check as func_lalib_p without 2818*132f818dSEnji Cooper# resorting to external programs. To this end, it redirects stdin and 2819*132f818dSEnji Cooper# closes it afterwards, without saving the original file descriptor. 2820*132f818dSEnji Cooper# As a safety measure, use it only where a negative result would be 2821*132f818dSEnji Cooper# fatal anyway. Works if 'file' does not exist. 2822*132f818dSEnji Cooperfunc_lalib_unsafe_p () 2823*132f818dSEnji Cooper{ 2824*132f818dSEnji Cooper lalib_p=no 2825*132f818dSEnji Cooper if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then 2826*132f818dSEnji Cooper for lalib_p_l in 1 2 3 4 2827*132f818dSEnji Cooper do 2828*132f818dSEnji Cooper read lalib_p_line 2829*132f818dSEnji Cooper case $lalib_p_line in 2830*132f818dSEnji Cooper \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; 2831*132f818dSEnji Cooper esac 2832*132f818dSEnji Cooper done 2833*132f818dSEnji Cooper exec 0<&5 5<&- 2834*132f818dSEnji Cooper fi 2835*132f818dSEnji Cooper test yes = "$lalib_p" 2836*132f818dSEnji Cooper} 2837*132f818dSEnji Cooper 2838*132f818dSEnji Cooper# func_ltwrapper_script_p file 2839*132f818dSEnji Cooper# True iff FILE is a libtool wrapper script 2840*132f818dSEnji Cooper# This function is only a basic sanity check; it will hardly flush out 2841*132f818dSEnji Cooper# determined imposters. 2842*132f818dSEnji Cooperfunc_ltwrapper_script_p () 2843*132f818dSEnji Cooper{ 2844*132f818dSEnji Cooper test -f "$1" && 2845*132f818dSEnji Cooper $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p 2846*132f818dSEnji Cooper} 2847*132f818dSEnji Cooper 2848*132f818dSEnji Cooper# func_ltwrapper_executable_p file 2849*132f818dSEnji Cooper# True iff FILE is a libtool wrapper executable 2850*132f818dSEnji Cooper# This function is only a basic sanity check; it will hardly flush out 2851*132f818dSEnji Cooper# determined imposters. 2852*132f818dSEnji Cooperfunc_ltwrapper_executable_p () 2853*132f818dSEnji Cooper{ 2854*132f818dSEnji Cooper func_ltwrapper_exec_suffix= 2855*132f818dSEnji Cooper case $1 in 2856*132f818dSEnji Cooper *.exe) ;; 2857*132f818dSEnji Cooper *) func_ltwrapper_exec_suffix=.exe ;; 2858*132f818dSEnji Cooper esac 2859*132f818dSEnji Cooper $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 2860*132f818dSEnji Cooper} 2861*132f818dSEnji Cooper 2862*132f818dSEnji Cooper# func_ltwrapper_scriptname file 2863*132f818dSEnji Cooper# Assumes file is an ltwrapper_executable 2864*132f818dSEnji Cooper# uses $file to determine the appropriate filename for a 2865*132f818dSEnji Cooper# temporary ltwrapper_script. 2866*132f818dSEnji Cooperfunc_ltwrapper_scriptname () 2867*132f818dSEnji Cooper{ 2868*132f818dSEnji Cooper func_dirname_and_basename "$1" "" "." 2869*132f818dSEnji Cooper func_stripname '' '.exe' "$func_basename_result" 2870*132f818dSEnji Cooper func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper 2871*132f818dSEnji Cooper} 2872*132f818dSEnji Cooper 2873*132f818dSEnji Cooper# func_ltwrapper_p file 2874*132f818dSEnji Cooper# True iff FILE is a libtool wrapper script or wrapper executable 2875*132f818dSEnji Cooper# This function is only a basic sanity check; it will hardly flush out 2876*132f818dSEnji Cooper# determined imposters. 2877*132f818dSEnji Cooperfunc_ltwrapper_p () 2878*132f818dSEnji Cooper{ 2879*132f818dSEnji Cooper func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" 2880*132f818dSEnji Cooper} 2881*132f818dSEnji Cooper 2882*132f818dSEnji Cooper 2883*132f818dSEnji Cooper# func_execute_cmds commands fail_cmd 2884*132f818dSEnji Cooper# Execute tilde-delimited COMMANDS. 2885*132f818dSEnji Cooper# If FAIL_CMD is given, eval that upon failure. 2886*132f818dSEnji Cooper# FAIL_CMD may read-access the current command in variable CMD! 2887*132f818dSEnji Cooperfunc_execute_cmds () 2888*132f818dSEnji Cooper{ 2889*132f818dSEnji Cooper $debug_cmd 2890*132f818dSEnji Cooper 2891*132f818dSEnji Cooper save_ifs=$IFS; IFS='~' 2892*132f818dSEnji Cooper for cmd in $1; do 2893*132f818dSEnji Cooper IFS=$sp$nl 2894*132f818dSEnji Cooper eval cmd=\"$cmd\" 2895*132f818dSEnji Cooper IFS=$save_ifs 2896*132f818dSEnji Cooper func_show_eval "$cmd" "${2-:}" 2897*132f818dSEnji Cooper done 2898*132f818dSEnji Cooper IFS=$save_ifs 2899*132f818dSEnji Cooper} 2900*132f818dSEnji Cooper 2901*132f818dSEnji Cooper 2902*132f818dSEnji Cooper# func_source file 2903*132f818dSEnji Cooper# Source FILE, adding directory component if necessary. 2904*132f818dSEnji Cooper# Note that it is not necessary on cygwin/mingw to append a dot to 2905*132f818dSEnji Cooper# FILE even if both FILE and FILE.exe exist: automatic-append-.exe 2906*132f818dSEnji Cooper# behavior happens only for exec(3), not for open(2)! Also, sourcing 2907*132f818dSEnji Cooper# 'FILE.' does not work on cygwin managed mounts. 2908*132f818dSEnji Cooperfunc_source () 2909*132f818dSEnji Cooper{ 2910*132f818dSEnji Cooper $debug_cmd 2911*132f818dSEnji Cooper 2912*132f818dSEnji Cooper case $1 in 2913*132f818dSEnji Cooper */* | *\\*) . "$1" ;; 2914*132f818dSEnji Cooper *) . "./$1" ;; 2915*132f818dSEnji Cooper esac 2916*132f818dSEnji Cooper} 2917*132f818dSEnji Cooper 2918*132f818dSEnji Cooper 2919*132f818dSEnji Cooper# func_resolve_sysroot PATH 2920*132f818dSEnji Cooper# Replace a leading = in PATH with a sysroot. Store the result into 2921*132f818dSEnji Cooper# func_resolve_sysroot_result 2922*132f818dSEnji Cooperfunc_resolve_sysroot () 2923*132f818dSEnji Cooper{ 2924*132f818dSEnji Cooper func_resolve_sysroot_result=$1 2925*132f818dSEnji Cooper case $func_resolve_sysroot_result in 2926*132f818dSEnji Cooper =*) 2927*132f818dSEnji Cooper func_stripname '=' '' "$func_resolve_sysroot_result" 2928*132f818dSEnji Cooper func_resolve_sysroot_result=$lt_sysroot$func_stripname_result 2929*132f818dSEnji Cooper ;; 2930*132f818dSEnji Cooper esac 2931*132f818dSEnji Cooper} 2932*132f818dSEnji Cooper 2933*132f818dSEnji Cooper# func_replace_sysroot PATH 2934*132f818dSEnji Cooper# If PATH begins with the sysroot, replace it with = and 2935*132f818dSEnji Cooper# store the result into func_replace_sysroot_result. 2936*132f818dSEnji Cooperfunc_replace_sysroot () 2937*132f818dSEnji Cooper{ 2938*132f818dSEnji Cooper case $lt_sysroot:$1 in 2939*132f818dSEnji Cooper ?*:"$lt_sysroot"*) 2940*132f818dSEnji Cooper func_stripname "$lt_sysroot" '' "$1" 2941*132f818dSEnji Cooper func_replace_sysroot_result='='$func_stripname_result 2942*132f818dSEnji Cooper ;; 2943*132f818dSEnji Cooper *) 2944*132f818dSEnji Cooper # Including no sysroot. 2945*132f818dSEnji Cooper func_replace_sysroot_result=$1 2946*132f818dSEnji Cooper ;; 2947*132f818dSEnji Cooper esac 2948*132f818dSEnji Cooper} 2949*132f818dSEnji Cooper 2950*132f818dSEnji Cooper# func_infer_tag arg 2951*132f818dSEnji Cooper# Infer tagged configuration to use if any are available and 2952*132f818dSEnji Cooper# if one wasn't chosen via the "--tag" command line option. 2953*132f818dSEnji Cooper# Only attempt this if the compiler in the base compile 2954*132f818dSEnji Cooper# command doesn't match the default compiler. 2955*132f818dSEnji Cooper# arg is usually of the form 'gcc ...' 2956*132f818dSEnji Cooperfunc_infer_tag () 2957*132f818dSEnji Cooper{ 2958*132f818dSEnji Cooper $debug_cmd 2959*132f818dSEnji Cooper 2960*132f818dSEnji Cooper if test -n "$available_tags" && test -z "$tagname"; then 2961*132f818dSEnji Cooper CC_quoted= 2962*132f818dSEnji Cooper for arg in $CC; do 2963*132f818dSEnji Cooper func_append_quoted CC_quoted "$arg" 2964*132f818dSEnji Cooper done 2965*132f818dSEnji Cooper CC_expanded=`func_echo_all $CC` 2966*132f818dSEnji Cooper CC_quoted_expanded=`func_echo_all $CC_quoted` 2967*132f818dSEnji Cooper case $@ in 2968*132f818dSEnji Cooper # Blanks in the command may have been stripped by the calling shell, 2969*132f818dSEnji Cooper # but not from the CC environment variable when configure was run. 2970*132f818dSEnji Cooper " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ 2971*132f818dSEnji Cooper " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; 2972*132f818dSEnji Cooper # Blanks at the start of $base_compile will cause this to fail 2973*132f818dSEnji Cooper # if we don't check for them as well. 2974*132f818dSEnji Cooper *) 2975*132f818dSEnji Cooper for z in $available_tags; do 2976*132f818dSEnji Cooper if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then 2977*132f818dSEnji Cooper # Evaluate the configuration. 2978*132f818dSEnji Cooper eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" 2979*132f818dSEnji Cooper CC_quoted= 2980*132f818dSEnji Cooper for arg in $CC; do 2981*132f818dSEnji Cooper # Double-quote args containing other shell metacharacters. 2982*132f818dSEnji Cooper func_append_quoted CC_quoted "$arg" 2983*132f818dSEnji Cooper done 2984*132f818dSEnji Cooper CC_expanded=`func_echo_all $CC` 2985*132f818dSEnji Cooper CC_quoted_expanded=`func_echo_all $CC_quoted` 2986*132f818dSEnji Cooper case "$@ " in 2987*132f818dSEnji Cooper " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ 2988*132f818dSEnji Cooper " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) 2989*132f818dSEnji Cooper # The compiler in the base compile command matches 2990*132f818dSEnji Cooper # the one in the tagged configuration. 2991*132f818dSEnji Cooper # Assume this is the tagged configuration we want. 2992*132f818dSEnji Cooper tagname=$z 2993*132f818dSEnji Cooper break 2994*132f818dSEnji Cooper ;; 2995*132f818dSEnji Cooper esac 2996*132f818dSEnji Cooper fi 2997*132f818dSEnji Cooper done 2998*132f818dSEnji Cooper # If $tagname still isn't set, then no tagged configuration 2999*132f818dSEnji Cooper # was found and let the user know that the "--tag" command 3000*132f818dSEnji Cooper # line option must be used. 3001*132f818dSEnji Cooper if test -z "$tagname"; then 3002*132f818dSEnji Cooper func_echo "unable to infer tagged configuration" 3003*132f818dSEnji Cooper func_fatal_error "specify a tag with '--tag'" 3004*132f818dSEnji Cooper# else 3005*132f818dSEnji Cooper# func_verbose "using $tagname tagged configuration" 3006*132f818dSEnji Cooper fi 3007*132f818dSEnji Cooper ;; 3008*132f818dSEnji Cooper esac 3009*132f818dSEnji Cooper fi 3010*132f818dSEnji Cooper} 3011*132f818dSEnji Cooper 3012*132f818dSEnji Cooper 3013*132f818dSEnji Cooper 3014*132f818dSEnji Cooper# func_write_libtool_object output_name pic_name nonpic_name 3015*132f818dSEnji Cooper# Create a libtool object file (analogous to a ".la" file), 3016*132f818dSEnji Cooper# but don't create it if we're doing a dry run. 3017*132f818dSEnji Cooperfunc_write_libtool_object () 3018*132f818dSEnji Cooper{ 3019*132f818dSEnji Cooper write_libobj=$1 3020*132f818dSEnji Cooper if test yes = "$build_libtool_libs"; then 3021*132f818dSEnji Cooper write_lobj=\'$2\' 3022*132f818dSEnji Cooper else 3023*132f818dSEnji Cooper write_lobj=none 3024*132f818dSEnji Cooper fi 3025*132f818dSEnji Cooper 3026*132f818dSEnji Cooper if test yes = "$build_old_libs"; then 3027*132f818dSEnji Cooper write_oldobj=\'$3\' 3028*132f818dSEnji Cooper else 3029*132f818dSEnji Cooper write_oldobj=none 3030*132f818dSEnji Cooper fi 3031*132f818dSEnji Cooper 3032*132f818dSEnji Cooper $opt_dry_run || { 3033*132f818dSEnji Cooper cat >${write_libobj}T <<EOF 3034*132f818dSEnji Cooper# $write_libobj - a libtool object file 3035*132f818dSEnji Cooper# Generated by $PROGRAM (GNU $PACKAGE) $VERSION 3036*132f818dSEnji Cooper# 3037*132f818dSEnji Cooper# Please DO NOT delete this file! 3038*132f818dSEnji Cooper# It is necessary for linking the library. 3039*132f818dSEnji Cooper 3040*132f818dSEnji Cooper# Name of the PIC object. 3041*132f818dSEnji Cooperpic_object=$write_lobj 3042*132f818dSEnji Cooper 3043*132f818dSEnji Cooper# Name of the non-PIC object 3044*132f818dSEnji Coopernon_pic_object=$write_oldobj 3045*132f818dSEnji Cooper 3046*132f818dSEnji CooperEOF 3047*132f818dSEnji Cooper $MV "${write_libobj}T" "$write_libobj" 3048*132f818dSEnji Cooper } 3049*132f818dSEnji Cooper} 3050*132f818dSEnji Cooper 3051*132f818dSEnji Cooper 3052*132f818dSEnji Cooper################################################## 3053*132f818dSEnji Cooper# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS # 3054*132f818dSEnji Cooper################################################## 3055*132f818dSEnji Cooper 3056*132f818dSEnji Cooper# func_convert_core_file_wine_to_w32 ARG 3057*132f818dSEnji Cooper# Helper function used by file name conversion functions when $build is *nix, 3058*132f818dSEnji Cooper# and $host is mingw, windows, cygwin, or some other w32 environment. Relies on a 3059*132f818dSEnji Cooper# correctly configured wine environment available, with the winepath program 3060*132f818dSEnji Cooper# in $build's $PATH. 3061*132f818dSEnji Cooper# 3062*132f818dSEnji Cooper# ARG is the $build file name to be converted to w32 format. 3063*132f818dSEnji Cooper# Result is available in $func_convert_core_file_wine_to_w32_result, and will 3064*132f818dSEnji Cooper# be empty on error (or when ARG is empty) 3065*132f818dSEnji Cooperfunc_convert_core_file_wine_to_w32 () 3066*132f818dSEnji Cooper{ 3067*132f818dSEnji Cooper $debug_cmd 3068*132f818dSEnji Cooper 3069*132f818dSEnji Cooper func_convert_core_file_wine_to_w32_result=$1 3070*132f818dSEnji Cooper if test -n "$1"; then 3071*132f818dSEnji Cooper # Unfortunately, winepath does not exit with a non-zero error code, so we 3072*132f818dSEnji Cooper # are forced to check the contents of stdout. On the other hand, if the 3073*132f818dSEnji Cooper # command is not found, the shell will set an exit code of 127 and print 3074*132f818dSEnji Cooper # *an error message* to stdout. So we must check for both error code of 3075*132f818dSEnji Cooper # zero AND non-empty stdout, which explains the odd construction: 3076*132f818dSEnji Cooper func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null` 3077*132f818dSEnji Cooper if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then 3078*132f818dSEnji Cooper func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | 3079*132f818dSEnji Cooper $SED -e "$sed_naive_backslashify"` 3080*132f818dSEnji Cooper else 3081*132f818dSEnji Cooper func_convert_core_file_wine_to_w32_result= 3082*132f818dSEnji Cooper fi 3083*132f818dSEnji Cooper fi 3084*132f818dSEnji Cooper} 3085*132f818dSEnji Cooper# end: func_convert_core_file_wine_to_w32 3086*132f818dSEnji Cooper 3087*132f818dSEnji Cooper 3088*132f818dSEnji Cooper# func_convert_core_path_wine_to_w32 ARG 3089*132f818dSEnji Cooper# Helper function used by path conversion functions when $build is *nix, and 3090*132f818dSEnji Cooper# $host is mingw, windows, cygwin, or some other w32 environment. Relies on a 3091*132f818dSEnji Cooper# correctly configured wine environment available, with the winepath program 3092*132f818dSEnji Cooper# in $build's $PATH. Assumes ARG has no leading or trailing path separator 3093*132f818dSEnji Cooper# characters. 3094*132f818dSEnji Cooper# 3095*132f818dSEnji Cooper# ARG is path to be converted from $build format to win32. 3096*132f818dSEnji Cooper# Result is available in $func_convert_core_path_wine_to_w32_result. 3097*132f818dSEnji Cooper# Unconvertible file (directory) names in ARG are skipped; if no directory names 3098*132f818dSEnji Cooper# are convertible, then the result may be empty. 3099*132f818dSEnji Cooperfunc_convert_core_path_wine_to_w32 () 3100*132f818dSEnji Cooper{ 3101*132f818dSEnji Cooper $debug_cmd 3102*132f818dSEnji Cooper 3103*132f818dSEnji Cooper # unfortunately, winepath doesn't convert paths, only file names 3104*132f818dSEnji Cooper func_convert_core_path_wine_to_w32_result= 3105*132f818dSEnji Cooper if test -n "$1"; then 3106*132f818dSEnji Cooper oldIFS=$IFS 3107*132f818dSEnji Cooper IFS=: 3108*132f818dSEnji Cooper for func_convert_core_path_wine_to_w32_f in $1; do 3109*132f818dSEnji Cooper IFS=$oldIFS 3110*132f818dSEnji Cooper func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" 3111*132f818dSEnji Cooper if test -n "$func_convert_core_file_wine_to_w32_result"; then 3112*132f818dSEnji Cooper if test -z "$func_convert_core_path_wine_to_w32_result"; then 3113*132f818dSEnji Cooper func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result 3114*132f818dSEnji Cooper else 3115*132f818dSEnji Cooper func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" 3116*132f818dSEnji Cooper fi 3117*132f818dSEnji Cooper fi 3118*132f818dSEnji Cooper done 3119*132f818dSEnji Cooper IFS=$oldIFS 3120*132f818dSEnji Cooper fi 3121*132f818dSEnji Cooper} 3122*132f818dSEnji Cooper# end: func_convert_core_path_wine_to_w32 3123*132f818dSEnji Cooper 3124*132f818dSEnji Cooper 3125*132f818dSEnji Cooper# func_cygpath ARGS... 3126*132f818dSEnji Cooper# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when 3127*132f818dSEnji Cooper# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) 3128*132f818dSEnji Cooper# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or 3129*132f818dSEnji Cooper# (2), returns the Cygwin file name or path in func_cygpath_result (input 3130*132f818dSEnji Cooper# file name or path is assumed to be in w32 format, as previously converted 3131*132f818dSEnji Cooper# from $build's *nix or MSYS format). In case (3), returns the w32 file name 3132*132f818dSEnji Cooper# or path in func_cygpath_result (input file name or path is assumed to be in 3133*132f818dSEnji Cooper# Cygwin format). Returns an empty string on error. 3134*132f818dSEnji Cooper# 3135*132f818dSEnji Cooper# ARGS are passed to cygpath, with the last one being the file name or path to 3136*132f818dSEnji Cooper# be converted. 3137*132f818dSEnji Cooper# 3138*132f818dSEnji Cooper# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH 3139*132f818dSEnji Cooper# environment variable; do not put it in $PATH. 3140*132f818dSEnji Cooperfunc_cygpath () 3141*132f818dSEnji Cooper{ 3142*132f818dSEnji Cooper $debug_cmd 3143*132f818dSEnji Cooper 3144*132f818dSEnji Cooper if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then 3145*132f818dSEnji Cooper func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` 3146*132f818dSEnji Cooper if test "$?" -ne 0; then 3147*132f818dSEnji Cooper # on failure, ensure result is empty 3148*132f818dSEnji Cooper func_cygpath_result= 3149*132f818dSEnji Cooper fi 3150*132f818dSEnji Cooper else 3151*132f818dSEnji Cooper func_cygpath_result= 3152*132f818dSEnji Cooper func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" 3153*132f818dSEnji Cooper fi 3154*132f818dSEnji Cooper} 3155*132f818dSEnji Cooper#end: func_cygpath 3156*132f818dSEnji Cooper 3157*132f818dSEnji Cooper 3158*132f818dSEnji Cooper# func_convert_core_msys_to_w32 ARG 3159*132f818dSEnji Cooper# Convert file name or path ARG from MSYS format to w32 format. Return 3160*132f818dSEnji Cooper# result in func_convert_core_msys_to_w32_result. 3161*132f818dSEnji Cooperfunc_convert_core_msys_to_w32 () 3162*132f818dSEnji Cooper{ 3163*132f818dSEnji Cooper $debug_cmd 3164*132f818dSEnji Cooper 3165*132f818dSEnji Cooper # awkward: cmd appends spaces to result 3166*132f818dSEnji Cooper func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | 3167*132f818dSEnji Cooper $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` 3168*132f818dSEnji Cooper} 3169*132f818dSEnji Cooper#end: func_convert_core_msys_to_w32 3170*132f818dSEnji Cooper 3171*132f818dSEnji Cooper 3172*132f818dSEnji Cooper# func_convert_file_check ARG1 ARG2 3173*132f818dSEnji Cooper# Verify that ARG1 (a file name in $build format) was converted to $host 3174*132f818dSEnji Cooper# format in ARG2. Otherwise, emit an error message, but continue (resetting 3175*132f818dSEnji Cooper# func_to_host_file_result to ARG1). 3176*132f818dSEnji Cooperfunc_convert_file_check () 3177*132f818dSEnji Cooper{ 3178*132f818dSEnji Cooper $debug_cmd 3179*132f818dSEnji Cooper 3180*132f818dSEnji Cooper if test -z "$2" && test -n "$1"; then 3181*132f818dSEnji Cooper func_error "Could not determine host file name corresponding to" 3182*132f818dSEnji Cooper func_error " '$1'" 3183*132f818dSEnji Cooper func_error "Continuing, but uninstalled executables may not work." 3184*132f818dSEnji Cooper # Fallback: 3185*132f818dSEnji Cooper func_to_host_file_result=$1 3186*132f818dSEnji Cooper fi 3187*132f818dSEnji Cooper} 3188*132f818dSEnji Cooper# end func_convert_file_check 3189*132f818dSEnji Cooper 3190*132f818dSEnji Cooper 3191*132f818dSEnji Cooper# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH 3192*132f818dSEnji Cooper# Verify that FROM_PATH (a path in $build format) was converted to $host 3193*132f818dSEnji Cooper# format in TO_PATH. Otherwise, emit an error message, but continue, resetting 3194*132f818dSEnji Cooper# func_to_host_file_result to a simplistic fallback value (see below). 3195*132f818dSEnji Cooperfunc_convert_path_check () 3196*132f818dSEnji Cooper{ 3197*132f818dSEnji Cooper $debug_cmd 3198*132f818dSEnji Cooper 3199*132f818dSEnji Cooper if test -z "$4" && test -n "$3"; then 3200*132f818dSEnji Cooper func_error "Could not determine the host path corresponding to" 3201*132f818dSEnji Cooper func_error " '$3'" 3202*132f818dSEnji Cooper func_error "Continuing, but uninstalled executables may not work." 3203*132f818dSEnji Cooper # Fallback. This is a deliberately simplistic "conversion" and 3204*132f818dSEnji Cooper # should not be "improved". See libtool.info. 3205*132f818dSEnji Cooper if test "x$1" != "x$2"; then 3206*132f818dSEnji Cooper lt_replace_pathsep_chars="s|$1|$2|g" 3207*132f818dSEnji Cooper func_to_host_path_result=`echo "$3" | 3208*132f818dSEnji Cooper $SED -e "$lt_replace_pathsep_chars"` 3209*132f818dSEnji Cooper else 3210*132f818dSEnji Cooper func_to_host_path_result=$3 3211*132f818dSEnji Cooper fi 3212*132f818dSEnji Cooper fi 3213*132f818dSEnji Cooper} 3214*132f818dSEnji Cooper# end func_convert_path_check 3215*132f818dSEnji Cooper 3216*132f818dSEnji Cooper 3217*132f818dSEnji Cooper# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG 3218*132f818dSEnji Cooper# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT 3219*132f818dSEnji Cooper# and appending REPL if ORIG matches BACKPAT. 3220*132f818dSEnji Cooperfunc_convert_path_front_back_pathsep () 3221*132f818dSEnji Cooper{ 3222*132f818dSEnji Cooper $debug_cmd 3223*132f818dSEnji Cooper 3224*132f818dSEnji Cooper case $4 in 3225*132f818dSEnji Cooper $1 ) func_to_host_path_result=$3$func_to_host_path_result 3226*132f818dSEnji Cooper ;; 3227*132f818dSEnji Cooper esac 3228*132f818dSEnji Cooper case $4 in 3229*132f818dSEnji Cooper $2 ) func_append func_to_host_path_result "$3" 3230*132f818dSEnji Cooper ;; 3231*132f818dSEnji Cooper esac 3232*132f818dSEnji Cooper} 3233*132f818dSEnji Cooper# end func_convert_path_front_back_pathsep 3234*132f818dSEnji Cooper 3235*132f818dSEnji Cooper 3236*132f818dSEnji Cooper# func_convert_delimited_path PATH ORIG_DELIMITER NEW_DELIMITER 3237*132f818dSEnji Cooper# Replaces a delimiter for a given path. 3238*132f818dSEnji Cooperfunc_convert_delimited_path () 3239*132f818dSEnji Cooper{ 3240*132f818dSEnji Cooper converted_path=`$ECHO "$1" | $SED "s#$2#$3#g"` 3241*132f818dSEnji Cooper} 3242*132f818dSEnji Cooper# end func_convert_delimited_path 3243*132f818dSEnji Cooper 3244*132f818dSEnji Cooper 3245*132f818dSEnji Cooper################################################## 3246*132f818dSEnji Cooper# $build to $host FILE NAME CONVERSION FUNCTIONS # 3247*132f818dSEnji Cooper################################################## 3248*132f818dSEnji Cooper# invoked via '$to_host_file_cmd ARG' 3249*132f818dSEnji Cooper# 3250*132f818dSEnji Cooper# In each case, ARG is the path to be converted from $build to $host format. 3251*132f818dSEnji Cooper# Result will be available in $func_to_host_file_result. 3252*132f818dSEnji Cooper 3253*132f818dSEnji Cooper 3254*132f818dSEnji Cooper# func_to_host_file ARG 3255*132f818dSEnji Cooper# Converts the file name ARG from $build format to $host format. Return result 3256*132f818dSEnji Cooper# in func_to_host_file_result. 3257*132f818dSEnji Cooperfunc_to_host_file () 3258*132f818dSEnji Cooper{ 3259*132f818dSEnji Cooper $debug_cmd 3260*132f818dSEnji Cooper 3261*132f818dSEnji Cooper $to_host_file_cmd "$1" 3262*132f818dSEnji Cooper} 3263*132f818dSEnji Cooper# end func_to_host_file 3264*132f818dSEnji Cooper 3265*132f818dSEnji Cooper 3266*132f818dSEnji Cooper# func_to_tool_file ARG LAZY 3267*132f818dSEnji Cooper# converts the file name ARG from $build format to toolchain format. Return 3268*132f818dSEnji Cooper# result in func_to_tool_file_result. If the conversion in use is listed 3269*132f818dSEnji Cooper# in (the comma separated) LAZY, no conversion takes place. 3270*132f818dSEnji Cooperfunc_to_tool_file () 3271*132f818dSEnji Cooper{ 3272*132f818dSEnji Cooper $debug_cmd 3273*132f818dSEnji Cooper 3274*132f818dSEnji Cooper case ,$2, in 3275*132f818dSEnji Cooper *,"$to_tool_file_cmd",*) 3276*132f818dSEnji Cooper func_to_tool_file_result=$1 3277*132f818dSEnji Cooper ;; 3278*132f818dSEnji Cooper *) 3279*132f818dSEnji Cooper $to_tool_file_cmd "$1" 3280*132f818dSEnji Cooper func_to_tool_file_result=$func_to_host_file_result 3281*132f818dSEnji Cooper ;; 3282*132f818dSEnji Cooper esac 3283*132f818dSEnji Cooper} 3284*132f818dSEnji Cooper# end func_to_tool_file 3285*132f818dSEnji Cooper 3286*132f818dSEnji Cooper 3287*132f818dSEnji Cooper# func_convert_file_noop ARG 3288*132f818dSEnji Cooper# Copy ARG to func_to_host_file_result. 3289*132f818dSEnji Cooperfunc_convert_file_noop () 3290*132f818dSEnji Cooper{ 3291*132f818dSEnji Cooper func_to_host_file_result=$1 3292*132f818dSEnji Cooper} 3293*132f818dSEnji Cooper# end func_convert_file_noop 3294*132f818dSEnji Cooper 3295*132f818dSEnji Cooper 3296*132f818dSEnji Cooper# func_convert_file_msys_to_w32 ARG 3297*132f818dSEnji Cooper# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic 3298*132f818dSEnji Cooper# conversion to w32 is not available inside the cwrapper. Returns result in 3299*132f818dSEnji Cooper# func_to_host_file_result. 3300*132f818dSEnji Cooperfunc_convert_file_msys_to_w32 () 3301*132f818dSEnji Cooper{ 3302*132f818dSEnji Cooper $debug_cmd 3303*132f818dSEnji Cooper 3304*132f818dSEnji Cooper func_to_host_file_result=$1 3305*132f818dSEnji Cooper if test -n "$1"; then 3306*132f818dSEnji Cooper func_convert_core_msys_to_w32 "$1" 3307*132f818dSEnji Cooper func_to_host_file_result=$func_convert_core_msys_to_w32_result 3308*132f818dSEnji Cooper fi 3309*132f818dSEnji Cooper func_convert_file_check "$1" "$func_to_host_file_result" 3310*132f818dSEnji Cooper} 3311*132f818dSEnji Cooper# end func_convert_file_msys_to_w32 3312*132f818dSEnji Cooper 3313*132f818dSEnji Cooper 3314*132f818dSEnji Cooper# func_convert_file_cygwin_to_w32 ARG 3315*132f818dSEnji Cooper# Convert file name ARG from Cygwin to w32 format. Returns result in 3316*132f818dSEnji Cooper# func_to_host_file_result. 3317*132f818dSEnji Cooperfunc_convert_file_cygwin_to_w32 () 3318*132f818dSEnji Cooper{ 3319*132f818dSEnji Cooper $debug_cmd 3320*132f818dSEnji Cooper 3321*132f818dSEnji Cooper func_to_host_file_result=$1 3322*132f818dSEnji Cooper if test -n "$1"; then 3323*132f818dSEnji Cooper # because $build is cygwin, we call "the" cygpath in $PATH; no need to use 3324*132f818dSEnji Cooper # LT_CYGPATH in this case. 3325*132f818dSEnji Cooper func_to_host_file_result=`cygpath -m "$1"` 3326*132f818dSEnji Cooper fi 3327*132f818dSEnji Cooper func_convert_file_check "$1" "$func_to_host_file_result" 3328*132f818dSEnji Cooper} 3329*132f818dSEnji Cooper# end func_convert_file_cygwin_to_w32 3330*132f818dSEnji Cooper 3331*132f818dSEnji Cooper 3332*132f818dSEnji Cooper# func_convert_file_nix_to_w32 ARG 3333*132f818dSEnji Cooper# Convert file name ARG from *nix to w32 format. Requires a wine environment 3334*132f818dSEnji Cooper# and a working winepath. Returns result in func_to_host_file_result. 3335*132f818dSEnji Cooperfunc_convert_file_nix_to_w32 () 3336*132f818dSEnji Cooper{ 3337*132f818dSEnji Cooper $debug_cmd 3338*132f818dSEnji Cooper 3339*132f818dSEnji Cooper func_to_host_file_result=$1 3340*132f818dSEnji Cooper if test -n "$1"; then 3341*132f818dSEnji Cooper func_convert_core_file_wine_to_w32 "$1" 3342*132f818dSEnji Cooper func_to_host_file_result=$func_convert_core_file_wine_to_w32_result 3343*132f818dSEnji Cooper fi 3344*132f818dSEnji Cooper func_convert_file_check "$1" "$func_to_host_file_result" 3345*132f818dSEnji Cooper} 3346*132f818dSEnji Cooper# end func_convert_file_nix_to_w32 3347*132f818dSEnji Cooper 3348*132f818dSEnji Cooper 3349*132f818dSEnji Cooper# func_convert_file_msys_to_cygwin ARG 3350*132f818dSEnji Cooper# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. 3351*132f818dSEnji Cooper# Returns result in func_to_host_file_result. 3352*132f818dSEnji Cooperfunc_convert_file_msys_to_cygwin () 3353*132f818dSEnji Cooper{ 3354*132f818dSEnji Cooper $debug_cmd 3355*132f818dSEnji Cooper 3356*132f818dSEnji Cooper func_to_host_file_result=$1 3357*132f818dSEnji Cooper if test -n "$1"; then 3358*132f818dSEnji Cooper func_convert_core_msys_to_w32 "$1" 3359*132f818dSEnji Cooper func_cygpath -u "$func_convert_core_msys_to_w32_result" 3360*132f818dSEnji Cooper func_to_host_file_result=$func_cygpath_result 3361*132f818dSEnji Cooper fi 3362*132f818dSEnji Cooper func_convert_file_check "$1" "$func_to_host_file_result" 3363*132f818dSEnji Cooper} 3364*132f818dSEnji Cooper# end func_convert_file_msys_to_cygwin 3365*132f818dSEnji Cooper 3366*132f818dSEnji Cooper 3367*132f818dSEnji Cooper# func_convert_file_nix_to_cygwin ARG 3368*132f818dSEnji Cooper# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed 3369*132f818dSEnji Cooper# in a wine environment, working winepath, and LT_CYGPATH set. Returns result 3370*132f818dSEnji Cooper# in func_to_host_file_result. 3371*132f818dSEnji Cooperfunc_convert_file_nix_to_cygwin () 3372*132f818dSEnji Cooper{ 3373*132f818dSEnji Cooper $debug_cmd 3374*132f818dSEnji Cooper 3375*132f818dSEnji Cooper func_to_host_file_result=$1 3376*132f818dSEnji Cooper if test -n "$1"; then 3377*132f818dSEnji Cooper # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. 3378*132f818dSEnji Cooper func_convert_core_file_wine_to_w32 "$1" 3379*132f818dSEnji Cooper func_cygpath -u "$func_convert_core_file_wine_to_w32_result" 3380*132f818dSEnji Cooper func_to_host_file_result=$func_cygpath_result 3381*132f818dSEnji Cooper fi 3382*132f818dSEnji Cooper func_convert_file_check "$1" "$func_to_host_file_result" 3383*132f818dSEnji Cooper} 3384*132f818dSEnji Cooper# end func_convert_file_nix_to_cygwin 3385*132f818dSEnji Cooper 3386*132f818dSEnji Cooper 3387*132f818dSEnji Cooper############################################# 3388*132f818dSEnji Cooper# $build to $host PATH CONVERSION FUNCTIONS # 3389*132f818dSEnji Cooper############################################# 3390*132f818dSEnji Cooper# invoked via '$to_host_path_cmd ARG' 3391*132f818dSEnji Cooper# 3392*132f818dSEnji Cooper# In each case, ARG is the path to be converted from $build to $host format. 3393*132f818dSEnji Cooper# The result will be available in $func_to_host_path_result. 3394*132f818dSEnji Cooper# 3395*132f818dSEnji Cooper# Path separators are also converted from $build format to $host format. If 3396*132f818dSEnji Cooper# ARG begins or ends with a path separator character, it is preserved (but 3397*132f818dSEnji Cooper# converted to $host format) on output. 3398*132f818dSEnji Cooper# 3399*132f818dSEnji Cooper# All path conversion functions are named using the following convention: 3400*132f818dSEnji Cooper# file name conversion function : func_convert_file_X_to_Y () 3401*132f818dSEnji Cooper# path conversion function : func_convert_path_X_to_Y () 3402*132f818dSEnji Cooper# where, for any given $build/$host combination the 'X_to_Y' value is the 3403*132f818dSEnji Cooper# same. If conversion functions are added for new $build/$host combinations, 3404*132f818dSEnji Cooper# the two new functions must follow this pattern, or func_init_to_host_path_cmd 3405*132f818dSEnji Cooper# will break. 3406*132f818dSEnji Cooper 3407*132f818dSEnji Cooper 3408*132f818dSEnji Cooper# func_init_to_host_path_cmd 3409*132f818dSEnji Cooper# Ensures that function "pointer" variable $to_host_path_cmd is set to the 3410*132f818dSEnji Cooper# appropriate value, based on the value of $to_host_file_cmd. 3411*132f818dSEnji Cooperto_host_path_cmd= 3412*132f818dSEnji Cooperfunc_init_to_host_path_cmd () 3413*132f818dSEnji Cooper{ 3414*132f818dSEnji Cooper $debug_cmd 3415*132f818dSEnji Cooper 3416*132f818dSEnji Cooper if test -z "$to_host_path_cmd"; then 3417*132f818dSEnji Cooper func_stripname 'func_convert_file_' '' "$to_host_file_cmd" 3418*132f818dSEnji Cooper to_host_path_cmd=func_convert_path_$func_stripname_result 3419*132f818dSEnji Cooper fi 3420*132f818dSEnji Cooper} 3421*132f818dSEnji Cooper 3422*132f818dSEnji Cooper 3423*132f818dSEnji Cooper# func_to_host_path ARG 3424*132f818dSEnji Cooper# Converts the path ARG from $build format to $host format. Return result 3425*132f818dSEnji Cooper# in func_to_host_path_result. 3426*132f818dSEnji Cooperfunc_to_host_path () 3427*132f818dSEnji Cooper{ 3428*132f818dSEnji Cooper $debug_cmd 3429*132f818dSEnji Cooper 3430*132f818dSEnji Cooper func_init_to_host_path_cmd 3431*132f818dSEnji Cooper $to_host_path_cmd "$1" 3432*132f818dSEnji Cooper} 3433*132f818dSEnji Cooper# end func_to_host_path 3434*132f818dSEnji Cooper 3435*132f818dSEnji Cooper 3436*132f818dSEnji Cooper# func_convert_path_noop ARG 3437*132f818dSEnji Cooper# Copy ARG to func_to_host_path_result. 3438*132f818dSEnji Cooperfunc_convert_path_noop () 3439*132f818dSEnji Cooper{ 3440*132f818dSEnji Cooper func_to_host_path_result=$1 3441*132f818dSEnji Cooper} 3442*132f818dSEnji Cooper# end func_convert_path_noop 3443*132f818dSEnji Cooper 3444*132f818dSEnji Cooper 3445*132f818dSEnji Cooper# func_convert_path_msys_to_w32 ARG 3446*132f818dSEnji Cooper# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic 3447*132f818dSEnji Cooper# conversion to w32 is not available inside the cwrapper. Returns result in 3448*132f818dSEnji Cooper# func_to_host_path_result. 3449*132f818dSEnji Cooperfunc_convert_path_msys_to_w32 () 3450*132f818dSEnji Cooper{ 3451*132f818dSEnji Cooper $debug_cmd 3452*132f818dSEnji Cooper 3453*132f818dSEnji Cooper func_to_host_path_result=$1 3454*132f818dSEnji Cooper if test -n "$1"; then 3455*132f818dSEnji Cooper # Remove leading and trailing path separator characters from ARG. MSYS 3456*132f818dSEnji Cooper # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; 3457*132f818dSEnji Cooper # and winepath ignores them completely. 3458*132f818dSEnji Cooper func_stripname : : "$1" 3459*132f818dSEnji Cooper func_to_host_path_tmp1=$func_stripname_result 3460*132f818dSEnji Cooper func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" 3461*132f818dSEnji Cooper func_to_host_path_result=$func_convert_core_msys_to_w32_result 3462*132f818dSEnji Cooper func_convert_path_check : ";" \ 3463*132f818dSEnji Cooper "$func_to_host_path_tmp1" "$func_to_host_path_result" 3464*132f818dSEnji Cooper func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" 3465*132f818dSEnji Cooper fi 3466*132f818dSEnji Cooper} 3467*132f818dSEnji Cooper# end func_convert_path_msys_to_w32 3468*132f818dSEnji Cooper 3469*132f818dSEnji Cooper 3470*132f818dSEnji Cooper# func_convert_path_cygwin_to_w32 ARG 3471*132f818dSEnji Cooper# Convert path ARG from Cygwin to w32 format. Returns result in 3472*132f818dSEnji Cooper# func_to_host_file_result. 3473*132f818dSEnji Cooperfunc_convert_path_cygwin_to_w32 () 3474*132f818dSEnji Cooper{ 3475*132f818dSEnji Cooper $debug_cmd 3476*132f818dSEnji Cooper 3477*132f818dSEnji Cooper func_to_host_path_result=$1 3478*132f818dSEnji Cooper if test -n "$1"; then 3479*132f818dSEnji Cooper # See func_convert_path_msys_to_w32: 3480*132f818dSEnji Cooper func_stripname : : "$1" 3481*132f818dSEnji Cooper func_to_host_path_tmp1=$func_stripname_result 3482*132f818dSEnji Cooper func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` 3483*132f818dSEnji Cooper func_convert_path_check : ";" \ 3484*132f818dSEnji Cooper "$func_to_host_path_tmp1" "$func_to_host_path_result" 3485*132f818dSEnji Cooper func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" 3486*132f818dSEnji Cooper fi 3487*132f818dSEnji Cooper} 3488*132f818dSEnji Cooper# end func_convert_path_cygwin_to_w32 3489*132f818dSEnji Cooper 3490*132f818dSEnji Cooper 3491*132f818dSEnji Cooper# func_convert_path_nix_to_w32 ARG 3492*132f818dSEnji Cooper# Convert path ARG from *nix to w32 format. Requires a wine environment and 3493*132f818dSEnji Cooper# a working winepath. Returns result in func_to_host_file_result. 3494*132f818dSEnji Cooperfunc_convert_path_nix_to_w32 () 3495*132f818dSEnji Cooper{ 3496*132f818dSEnji Cooper $debug_cmd 3497*132f818dSEnji Cooper 3498*132f818dSEnji Cooper func_to_host_path_result=$1 3499*132f818dSEnji Cooper if test -n "$1"; then 3500*132f818dSEnji Cooper # See func_convert_path_msys_to_w32: 3501*132f818dSEnji Cooper func_stripname : : "$1" 3502*132f818dSEnji Cooper func_to_host_path_tmp1=$func_stripname_result 3503*132f818dSEnji Cooper func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" 3504*132f818dSEnji Cooper func_to_host_path_result=$func_convert_core_path_wine_to_w32_result 3505*132f818dSEnji Cooper func_convert_path_check : ";" \ 3506*132f818dSEnji Cooper "$func_to_host_path_tmp1" "$func_to_host_path_result" 3507*132f818dSEnji Cooper func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" 3508*132f818dSEnji Cooper fi 3509*132f818dSEnji Cooper} 3510*132f818dSEnji Cooper# end func_convert_path_nix_to_w32 3511*132f818dSEnji Cooper 3512*132f818dSEnji Cooper 3513*132f818dSEnji Cooper# func_convert_path_msys_to_cygwin ARG 3514*132f818dSEnji Cooper# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. 3515*132f818dSEnji Cooper# Returns result in func_to_host_file_result. 3516*132f818dSEnji Cooperfunc_convert_path_msys_to_cygwin () 3517*132f818dSEnji Cooper{ 3518*132f818dSEnji Cooper $debug_cmd 3519*132f818dSEnji Cooper 3520*132f818dSEnji Cooper func_to_host_path_result=$1 3521*132f818dSEnji Cooper if test -n "$1"; then 3522*132f818dSEnji Cooper # See func_convert_path_msys_to_w32: 3523*132f818dSEnji Cooper func_stripname : : "$1" 3524*132f818dSEnji Cooper func_to_host_path_tmp1=$func_stripname_result 3525*132f818dSEnji Cooper func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" 3526*132f818dSEnji Cooper func_cygpath -u -p "$func_convert_core_msys_to_w32_result" 3527*132f818dSEnji Cooper func_to_host_path_result=$func_cygpath_result 3528*132f818dSEnji Cooper func_convert_path_check : : \ 3529*132f818dSEnji Cooper "$func_to_host_path_tmp1" "$func_to_host_path_result" 3530*132f818dSEnji Cooper func_convert_path_front_back_pathsep ":*" "*:" : "$1" 3531*132f818dSEnji Cooper fi 3532*132f818dSEnji Cooper} 3533*132f818dSEnji Cooper# end func_convert_path_msys_to_cygwin 3534*132f818dSEnji Cooper 3535*132f818dSEnji Cooper 3536*132f818dSEnji Cooper# func_convert_path_nix_to_cygwin ARG 3537*132f818dSEnji Cooper# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a 3538*132f818dSEnji Cooper# a wine environment, working winepath, and LT_CYGPATH set. Returns result in 3539*132f818dSEnji Cooper# func_to_host_file_result. 3540*132f818dSEnji Cooperfunc_convert_path_nix_to_cygwin () 3541*132f818dSEnji Cooper{ 3542*132f818dSEnji Cooper $debug_cmd 3543*132f818dSEnji Cooper 3544*132f818dSEnji Cooper func_to_host_path_result=$1 3545*132f818dSEnji Cooper if test -n "$1"; then 3546*132f818dSEnji Cooper # Remove leading and trailing path separator characters from 3547*132f818dSEnji Cooper # ARG. msys behavior is inconsistent here, cygpath turns them 3548*132f818dSEnji Cooper # into '.;' and ';.', and winepath ignores them completely. 3549*132f818dSEnji Cooper func_stripname : : "$1" 3550*132f818dSEnji Cooper func_to_host_path_tmp1=$func_stripname_result 3551*132f818dSEnji Cooper func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" 3552*132f818dSEnji Cooper func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" 3553*132f818dSEnji Cooper func_to_host_path_result=$func_cygpath_result 3554*132f818dSEnji Cooper func_convert_path_check : : \ 3555*132f818dSEnji Cooper "$func_to_host_path_tmp1" "$func_to_host_path_result" 3556*132f818dSEnji Cooper func_convert_path_front_back_pathsep ":*" "*:" : "$1" 3557*132f818dSEnji Cooper fi 3558*132f818dSEnji Cooper} 3559*132f818dSEnji Cooper# end func_convert_path_nix_to_cygwin 3560*132f818dSEnji Cooper 3561*132f818dSEnji Cooper 3562*132f818dSEnji Cooper# func_dll_def_p FILE 3563*132f818dSEnji Cooper# True iff FILE is a Windows DLL '.def' file. 3564*132f818dSEnji Cooper# Keep in sync with _LT_DLL_DEF_P in libtool.m4 3565*132f818dSEnji Cooperfunc_dll_def_p () 3566*132f818dSEnji Cooper{ 3567*132f818dSEnji Cooper $debug_cmd 3568*132f818dSEnji Cooper 3569*132f818dSEnji Cooper func_dll_def_p_tmp=`$SED -n \ 3570*132f818dSEnji Cooper -e 's/^[ ]*//' \ 3571*132f818dSEnji Cooper -e '/^\(;.*\)*$/d' \ 3572*132f818dSEnji Cooper -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ 3573*132f818dSEnji Cooper -e q \ 3574*132f818dSEnji Cooper "$1"` 3575*132f818dSEnji Cooper test DEF = "$func_dll_def_p_tmp" 3576*132f818dSEnji Cooper} 3577*132f818dSEnji Cooper 3578*132f818dSEnji Cooper 3579*132f818dSEnji Cooper# func_reorder_shared_lib_cache DIRS 3580*132f818dSEnji Cooper# Reorder the shared library cache by unconfiguring previous shared library cache 3581*132f818dSEnji Cooper# and configuring preferred search directories before previous search directories. 3582*132f818dSEnji Cooper# Previous shared library cache: /usr/lib /usr/local/lib 3583*132f818dSEnji Cooper# Preferred search directories: /tmp/testing 3584*132f818dSEnji Cooper# Reordered shared library cache: /tmp/testing /usr/lib /usr/local/lib 3585*132f818dSEnji Cooperfunc_reorder_shared_lib_cache () 3586*132f818dSEnji Cooper{ 3587*132f818dSEnji Cooper $debug_cmd 3588*132f818dSEnji Cooper 3589*132f818dSEnji Cooper case $host_os in 3590*132f818dSEnji Cooper openbsd*) 3591*132f818dSEnji Cooper get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"` 3592*132f818dSEnji Cooper func_convert_delimited_path "$get_search_directories" ':' '\ ' 3593*132f818dSEnji Cooper save_search_directories=$converted_path 3594*132f818dSEnji Cooper func_convert_delimited_path "$1" ':' '\ ' 3595*132f818dSEnji Cooper 3596*132f818dSEnji Cooper # Ensure directories exist 3597*132f818dSEnji Cooper for dir in $converted_path; do 3598*132f818dSEnji Cooper # Ensure each directory is an absolute path 3599*132f818dSEnji Cooper case $dir in 3600*132f818dSEnji Cooper /*) ;; 3601*132f818dSEnji Cooper *) func_error "Directory '$dir' is not an absolute path" 3602*132f818dSEnji Cooper exit $EXIT_FAILURE ;; 3603*132f818dSEnji Cooper esac 3604*132f818dSEnji Cooper # Ensure no trailing slashes 3605*132f818dSEnji Cooper func_stripname '' '/' "$dir" 3606*132f818dSEnji Cooper dir=$func_stripname_result 3607*132f818dSEnji Cooper if test -d "$dir"; then 3608*132f818dSEnji Cooper if test -n "$preferred_search_directories"; then 3609*132f818dSEnji Cooper preferred_search_directories="$preferred_search_directories $dir" 3610*132f818dSEnji Cooper else 3611*132f818dSEnji Cooper preferred_search_directories=$dir 3612*132f818dSEnji Cooper fi 3613*132f818dSEnji Cooper else 3614*132f818dSEnji Cooper func_error "Directory '$dir' does not exist" 3615*132f818dSEnji Cooper exit $EXIT_FAILURE 3616*132f818dSEnji Cooper fi 3617*132f818dSEnji Cooper done 3618*132f818dSEnji Cooper 3619*132f818dSEnji Cooper PATH="$PATH:/sbin" ldconfig -U $save_search_directories 3620*132f818dSEnji Cooper PATH="$PATH:/sbin" ldconfig -m $preferred_search_directories $save_search_directories 3621*132f818dSEnji Cooper get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"` 3622*132f818dSEnji Cooper func_convert_delimited_path "$get_search_directories" ':' '\ ' 3623*132f818dSEnji Cooper reordered_search_directories=$converted_path 3624*132f818dSEnji Cooper 3625*132f818dSEnji Cooper $ECHO "Original: $save_search_directories" 3626*132f818dSEnji Cooper $ECHO "Reordered: $reordered_search_directories" 3627*132f818dSEnji Cooper exit $EXIT_SUCCESS 3628*132f818dSEnji Cooper ;; 3629*132f818dSEnji Cooper *) 3630*132f818dSEnji Cooper func_error "--reorder-cache is not supported for host_os=$host_os." 3631*132f818dSEnji Cooper exit $EXIT_FAILURE 3632*132f818dSEnji Cooper ;; 3633*132f818dSEnji Cooper esac 3634*132f818dSEnji Cooper} 3635*132f818dSEnji Cooper# end func_reorder_shared_lib_cache 3636*132f818dSEnji Cooper 3637*132f818dSEnji Cooper 3638*132f818dSEnji Cooper# func_mode_compile arg... 3639*132f818dSEnji Cooperfunc_mode_compile () 3640*132f818dSEnji Cooper{ 3641*132f818dSEnji Cooper $debug_cmd 3642*132f818dSEnji Cooper 3643*132f818dSEnji Cooper # Get the compilation command and the source file. 3644*132f818dSEnji Cooper base_compile= 3645*132f818dSEnji Cooper srcfile=$nonopt # always keep a non-empty value in "srcfile" 3646*132f818dSEnji Cooper suppress_opt=yes 3647*132f818dSEnji Cooper suppress_output= 3648*132f818dSEnji Cooper arg_mode=normal 3649*132f818dSEnji Cooper libobj= 3650*132f818dSEnji Cooper later= 3651*132f818dSEnji Cooper pie_flag= 3652*132f818dSEnji Cooper 3653*132f818dSEnji Cooper for arg 3654*132f818dSEnji Cooper do 3655*132f818dSEnji Cooper case $arg_mode in 3656*132f818dSEnji Cooper arg ) 3657*132f818dSEnji Cooper # do not "continue". Instead, add this to base_compile 3658*132f818dSEnji Cooper lastarg=$arg 3659*132f818dSEnji Cooper arg_mode=normal 3660*132f818dSEnji Cooper ;; 3661*132f818dSEnji Cooper 3662*132f818dSEnji Cooper target ) 3663*132f818dSEnji Cooper libobj=$arg 3664*132f818dSEnji Cooper arg_mode=normal 3665*132f818dSEnji Cooper continue 3666*132f818dSEnji Cooper ;; 3667*132f818dSEnji Cooper 3668*132f818dSEnji Cooper normal ) 3669*132f818dSEnji Cooper # Accept any command-line options. 3670*132f818dSEnji Cooper case $arg in 3671*132f818dSEnji Cooper -o) 3672*132f818dSEnji Cooper test -n "$libobj" && \ 3673*132f818dSEnji Cooper func_fatal_error "you cannot specify '-o' more than once" 3674*132f818dSEnji Cooper arg_mode=target 3675*132f818dSEnji Cooper continue 3676*132f818dSEnji Cooper ;; 3677*132f818dSEnji Cooper 3678*132f818dSEnji Cooper -pie | -fpie | -fPIE) 3679*132f818dSEnji Cooper func_append pie_flag " $arg" 3680*132f818dSEnji Cooper continue 3681*132f818dSEnji Cooper ;; 3682*132f818dSEnji Cooper 3683*132f818dSEnji Cooper -shared | -static | -prefer-pic | -prefer-non-pic) 3684*132f818dSEnji Cooper func_append later " $arg" 3685*132f818dSEnji Cooper continue 3686*132f818dSEnji Cooper ;; 3687*132f818dSEnji Cooper 3688*132f818dSEnji Cooper -no-suppress) 3689*132f818dSEnji Cooper suppress_opt=no 3690*132f818dSEnji Cooper continue 3691*132f818dSEnji Cooper ;; 3692*132f818dSEnji Cooper 3693*132f818dSEnji Cooper -Xcompiler) 3694*132f818dSEnji Cooper arg_mode=arg # the next one goes into the "base_compile" arg list 3695*132f818dSEnji Cooper continue # The current "srcfile" will either be retained or 3696*132f818dSEnji Cooper ;; # replaced later. I would guess that would be a bug. 3697*132f818dSEnji Cooper 3698*132f818dSEnji Cooper -Wc,*) 3699*132f818dSEnji Cooper func_stripname '-Wc,' '' "$arg" 3700*132f818dSEnji Cooper args=$func_stripname_result 3701*132f818dSEnji Cooper lastarg= 3702*132f818dSEnji Cooper save_ifs=$IFS; IFS=, 3703*132f818dSEnji Cooper for arg in $args; do 3704*132f818dSEnji Cooper IFS=$save_ifs 3705*132f818dSEnji Cooper func_append_quoted lastarg "$arg" 3706*132f818dSEnji Cooper done 3707*132f818dSEnji Cooper IFS=$save_ifs 3708*132f818dSEnji Cooper func_stripname ' ' '' "$lastarg" 3709*132f818dSEnji Cooper lastarg=$func_stripname_result 3710*132f818dSEnji Cooper 3711*132f818dSEnji Cooper # Add the arguments to base_compile. 3712*132f818dSEnji Cooper func_append base_compile " $lastarg" 3713*132f818dSEnji Cooper continue 3714*132f818dSEnji Cooper ;; 3715*132f818dSEnji Cooper 3716*132f818dSEnji Cooper *) 3717*132f818dSEnji Cooper # Accept the current argument as the source file. 3718*132f818dSEnji Cooper # The previous "srcfile" becomes the current argument. 3719*132f818dSEnji Cooper # 3720*132f818dSEnji Cooper lastarg=$srcfile 3721*132f818dSEnji Cooper srcfile=$arg 3722*132f818dSEnji Cooper ;; 3723*132f818dSEnji Cooper esac # case $arg 3724*132f818dSEnji Cooper ;; 3725*132f818dSEnji Cooper esac # case $arg_mode 3726*132f818dSEnji Cooper 3727*132f818dSEnji Cooper # Aesthetically quote the previous argument. 3728*132f818dSEnji Cooper func_append_quoted base_compile "$lastarg" 3729*132f818dSEnji Cooper done # for arg 3730*132f818dSEnji Cooper 3731*132f818dSEnji Cooper case $arg_mode in 3732*132f818dSEnji Cooper arg) 3733*132f818dSEnji Cooper func_fatal_error "you must specify an argument for -Xcompile" 3734*132f818dSEnji Cooper ;; 3735*132f818dSEnji Cooper target) 3736*132f818dSEnji Cooper func_fatal_error "you must specify a target with '-o'" 3737*132f818dSEnji Cooper ;; 3738*132f818dSEnji Cooper *) 3739*132f818dSEnji Cooper # Get the name of the library object. 3740*132f818dSEnji Cooper test -z "$libobj" && { 3741*132f818dSEnji Cooper func_basename "$srcfile" 3742*132f818dSEnji Cooper libobj=$func_basename_result 3743*132f818dSEnji Cooper } 3744*132f818dSEnji Cooper ;; 3745*132f818dSEnji Cooper esac 3746*132f818dSEnji Cooper 3747*132f818dSEnji Cooper # Recognize several different file suffixes. 3748*132f818dSEnji Cooper # If the user specifies -o file.o, it is replaced with file.lo 3749*132f818dSEnji Cooper case $libobj in 3750*132f818dSEnji Cooper *.[cCFSifmso] | \ 3751*132f818dSEnji Cooper *.ada | *.adb | *.ads | *.asm | \ 3752*132f818dSEnji Cooper *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ 3753*132f818dSEnji Cooper *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) 3754*132f818dSEnji Cooper func_xform "$libobj" 3755*132f818dSEnji Cooper libobj=$func_xform_result 3756*132f818dSEnji Cooper ;; 3757*132f818dSEnji Cooper esac 3758*132f818dSEnji Cooper 3759*132f818dSEnji Cooper case $libobj in 3760*132f818dSEnji Cooper *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; 3761*132f818dSEnji Cooper *) 3762*132f818dSEnji Cooper func_fatal_error "cannot determine name of library object from '$libobj'" 3763*132f818dSEnji Cooper ;; 3764*132f818dSEnji Cooper esac 3765*132f818dSEnji Cooper 3766*132f818dSEnji Cooper func_infer_tag $base_compile 3767*132f818dSEnji Cooper 3768*132f818dSEnji Cooper for arg in $later; do 3769*132f818dSEnji Cooper case $arg in 3770*132f818dSEnji Cooper -shared) 3771*132f818dSEnji Cooper test yes = "$build_libtool_libs" \ 3772*132f818dSEnji Cooper || func_fatal_configuration "cannot build a shared library" 3773*132f818dSEnji Cooper build_old_libs=no 3774*132f818dSEnji Cooper continue 3775*132f818dSEnji Cooper ;; 3776*132f818dSEnji Cooper 3777*132f818dSEnji Cooper -static) 3778*132f818dSEnji Cooper build_libtool_libs=no 3779*132f818dSEnji Cooper build_old_libs=yes 3780*132f818dSEnji Cooper continue 3781*132f818dSEnji Cooper ;; 3782*132f818dSEnji Cooper 3783*132f818dSEnji Cooper -prefer-pic) 3784*132f818dSEnji Cooper pic_mode=yes 3785*132f818dSEnji Cooper continue 3786*132f818dSEnji Cooper ;; 3787*132f818dSEnji Cooper 3788*132f818dSEnji Cooper -prefer-non-pic) 3789*132f818dSEnji Cooper pic_mode=no 3790*132f818dSEnji Cooper continue 3791*132f818dSEnji Cooper ;; 3792*132f818dSEnji Cooper esac 3793*132f818dSEnji Cooper done 3794*132f818dSEnji Cooper 3795*132f818dSEnji Cooper func_quote_arg pretty "$libobj" 3796*132f818dSEnji Cooper test "X$libobj" != "X$func_quote_arg_result" \ 3797*132f818dSEnji Cooper && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ 3798*132f818dSEnji Cooper && func_warning "libobj name '$libobj' may not contain shell special characters." 3799*132f818dSEnji Cooper func_dirname_and_basename "$obj" "/" "" 3800*132f818dSEnji Cooper objname=$func_basename_result 3801*132f818dSEnji Cooper xdir=$func_dirname_result 3802*132f818dSEnji Cooper lobj=$xdir$objdir/$objname 3803*132f818dSEnji Cooper 3804*132f818dSEnji Cooper test -z "$base_compile" && \ 3805*132f818dSEnji Cooper func_fatal_help "you must specify a compilation command" 3806*132f818dSEnji Cooper 3807*132f818dSEnji Cooper # Delete any leftover library objects. 3808*132f818dSEnji Cooper if test yes = "$build_old_libs"; then 3809*132f818dSEnji Cooper removelist="$obj $lobj $libobj ${libobj}T" 3810*132f818dSEnji Cooper else 3811*132f818dSEnji Cooper removelist="$lobj $libobj ${libobj}T" 3812*132f818dSEnji Cooper fi 3813*132f818dSEnji Cooper 3814*132f818dSEnji Cooper # On Cygwin there's no "real" PIC flag so we must build both object types 3815*132f818dSEnji Cooper case $host_os in 3816*132f818dSEnji Cooper cygwin* | mingw* | windows* | pw32* | os2* | cegcc*) 3817*132f818dSEnji Cooper pic_mode=default 3818*132f818dSEnji Cooper ;; 3819*132f818dSEnji Cooper esac 3820*132f818dSEnji Cooper if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then 3821*132f818dSEnji Cooper # non-PIC code in shared libraries is not supported 3822*132f818dSEnji Cooper pic_mode=default 3823*132f818dSEnji Cooper fi 3824*132f818dSEnji Cooper 3825*132f818dSEnji Cooper # Calculate the filename of the output object if compiler does 3826*132f818dSEnji Cooper # not support -o with -c 3827*132f818dSEnji Cooper if test no = "$compiler_c_o"; then 3828*132f818dSEnji Cooper output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext 3829*132f818dSEnji Cooper lockfile=$output_obj.lock 3830*132f818dSEnji Cooper else 3831*132f818dSEnji Cooper output_obj= 3832*132f818dSEnji Cooper need_locks=no 3833*132f818dSEnji Cooper lockfile= 3834*132f818dSEnji Cooper fi 3835*132f818dSEnji Cooper 3836*132f818dSEnji Cooper # Lock this critical section if it is needed 3837*132f818dSEnji Cooper # We use this script file to make the link, it avoids creating a new file 3838*132f818dSEnji Cooper if test yes = "$need_locks"; then 3839*132f818dSEnji Cooper until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do 3840*132f818dSEnji Cooper func_echo "Waiting for $lockfile to be removed" 3841*132f818dSEnji Cooper sleep 2 3842*132f818dSEnji Cooper done 3843*132f818dSEnji Cooper elif test warn = "$need_locks"; then 3844*132f818dSEnji Cooper if test -f "$lockfile"; then 3845*132f818dSEnji Cooper $ECHO "\ 3846*132f818dSEnji Cooper*** ERROR, $lockfile exists and contains: 3847*132f818dSEnji Cooper`cat $lockfile 2>/dev/null` 3848*132f818dSEnji Cooper 3849*132f818dSEnji CooperThis indicates that another process is trying to use the same 3850*132f818dSEnji Coopertemporary object file, and libtool could not work around it because 3851*132f818dSEnji Cooperyour compiler does not support '-c' and '-o' together. If you 3852*132f818dSEnji Cooperrepeat this compilation, it may succeed, by chance, but you had better 3853*132f818dSEnji Cooperavoid parallel builds (make -j) in this platform, or get a better 3854*132f818dSEnji Coopercompiler." 3855*132f818dSEnji Cooper 3856*132f818dSEnji Cooper $opt_dry_run || $RM $removelist 3857*132f818dSEnji Cooper exit $EXIT_FAILURE 3858*132f818dSEnji Cooper fi 3859*132f818dSEnji Cooper func_append removelist " $output_obj" 3860*132f818dSEnji Cooper $ECHO "$srcfile" > "$lockfile" 3861*132f818dSEnji Cooper fi 3862*132f818dSEnji Cooper 3863*132f818dSEnji Cooper $opt_dry_run || $RM $removelist 3864*132f818dSEnji Cooper func_append removelist " $lockfile" 3865*132f818dSEnji Cooper trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 3866*132f818dSEnji Cooper 3867*132f818dSEnji Cooper func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 3868*132f818dSEnji Cooper srcfile=$func_to_tool_file_result 3869*132f818dSEnji Cooper func_quote_arg pretty "$srcfile" 3870*132f818dSEnji Cooper qsrcfile=$func_quote_arg_result 3871*132f818dSEnji Cooper 3872*132f818dSEnji Cooper # Only build a PIC object if we are building libtool libraries. 3873*132f818dSEnji Cooper if test yes = "$build_libtool_libs"; then 3874*132f818dSEnji Cooper # Without this assignment, base_compile gets emptied. 3875*132f818dSEnji Cooper fbsd_hideous_sh_bug=$base_compile 3876*132f818dSEnji Cooper 3877*132f818dSEnji Cooper if test no != "$pic_mode"; then 3878*132f818dSEnji Cooper command="$base_compile $qsrcfile $pic_flag" 3879*132f818dSEnji Cooper else 3880*132f818dSEnji Cooper # Don't build PIC code 3881*132f818dSEnji Cooper command="$base_compile $qsrcfile" 3882*132f818dSEnji Cooper fi 3883*132f818dSEnji Cooper 3884*132f818dSEnji Cooper func_mkdir_p "$xdir$objdir" 3885*132f818dSEnji Cooper 3886*132f818dSEnji Cooper if test -z "$output_obj"; then 3887*132f818dSEnji Cooper # Place PIC objects in $objdir 3888*132f818dSEnji Cooper func_append command " -o $lobj" 3889*132f818dSEnji Cooper fi 3890*132f818dSEnji Cooper 3891*132f818dSEnji Cooper func_show_eval_locale "$command" \ 3892*132f818dSEnji Cooper 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' 3893*132f818dSEnji Cooper 3894*132f818dSEnji Cooper if test warn = "$need_locks" && 3895*132f818dSEnji Cooper test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then 3896*132f818dSEnji Cooper $ECHO "\ 3897*132f818dSEnji Cooper*** ERROR, $lockfile contains: 3898*132f818dSEnji Cooper`cat $lockfile 2>/dev/null` 3899*132f818dSEnji Cooper 3900*132f818dSEnji Cooperbut it should contain: 3901*132f818dSEnji Cooper$srcfile 3902*132f818dSEnji Cooper 3903*132f818dSEnji CooperThis indicates that another process is trying to use the same 3904*132f818dSEnji Coopertemporary object file, and libtool could not work around it because 3905*132f818dSEnji Cooperyour compiler does not support '-c' and '-o' together. If you 3906*132f818dSEnji Cooperrepeat this compilation, it may succeed, by chance, but you had better 3907*132f818dSEnji Cooperavoid parallel builds (make -j) in this platform, or get a better 3908*132f818dSEnji Coopercompiler." 3909*132f818dSEnji Cooper 3910*132f818dSEnji Cooper $opt_dry_run || $RM $removelist 3911*132f818dSEnji Cooper exit $EXIT_FAILURE 3912*132f818dSEnji Cooper fi 3913*132f818dSEnji Cooper 3914*132f818dSEnji Cooper # Just move the object if needed, then go on to compile the next one 3915*132f818dSEnji Cooper if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then 3916*132f818dSEnji Cooper func_show_eval '$MV "$output_obj" "$lobj"' \ 3917*132f818dSEnji Cooper 'error=$?; $opt_dry_run || $RM $removelist; exit $error' 3918*132f818dSEnji Cooper fi 3919*132f818dSEnji Cooper 3920*132f818dSEnji Cooper # Allow error messages only from the first compilation. 3921*132f818dSEnji Cooper if test yes = "$suppress_opt"; then 3922*132f818dSEnji Cooper suppress_output=' >/dev/null 2>&1' 3923*132f818dSEnji Cooper fi 3924*132f818dSEnji Cooper fi 3925*132f818dSEnji Cooper 3926*132f818dSEnji Cooper # Only build a position-dependent object if we build old libraries. 3927*132f818dSEnji Cooper if test yes = "$build_old_libs"; then 3928*132f818dSEnji Cooper if test yes != "$pic_mode"; then 3929*132f818dSEnji Cooper # Don't build PIC code 3930*132f818dSEnji Cooper command="$base_compile $qsrcfile$pie_flag" 3931*132f818dSEnji Cooper else 3932*132f818dSEnji Cooper command="$base_compile $qsrcfile $pic_flag" 3933*132f818dSEnji Cooper fi 3934*132f818dSEnji Cooper if test yes = "$compiler_c_o"; then 3935*132f818dSEnji Cooper func_append command " -o $obj" 3936*132f818dSEnji Cooper fi 3937*132f818dSEnji Cooper 3938*132f818dSEnji Cooper # Suppress compiler output if we already did a PIC compilation. 3939*132f818dSEnji Cooper func_append command "$suppress_output" 3940*132f818dSEnji Cooper func_show_eval_locale "$command" \ 3941*132f818dSEnji Cooper '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 3942*132f818dSEnji Cooper 3943*132f818dSEnji Cooper if test warn = "$need_locks" && 3944*132f818dSEnji Cooper test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then 3945*132f818dSEnji Cooper $ECHO "\ 3946*132f818dSEnji Cooper*** ERROR, $lockfile contains: 3947*132f818dSEnji Cooper`cat $lockfile 2>/dev/null` 3948*132f818dSEnji Cooper 3949*132f818dSEnji Cooperbut it should contain: 3950*132f818dSEnji Cooper$srcfile 3951*132f818dSEnji Cooper 3952*132f818dSEnji CooperThis indicates that another process is trying to use the same 3953*132f818dSEnji Coopertemporary object file, and libtool could not work around it because 3954*132f818dSEnji Cooperyour compiler does not support '-c' and '-o' together. If you 3955*132f818dSEnji Cooperrepeat this compilation, it may succeed, by chance, but you had better 3956*132f818dSEnji Cooperavoid parallel builds (make -j) in this platform, or get a better 3957*132f818dSEnji Coopercompiler." 3958*132f818dSEnji Cooper 3959*132f818dSEnji Cooper $opt_dry_run || $RM $removelist 3960*132f818dSEnji Cooper exit $EXIT_FAILURE 3961*132f818dSEnji Cooper fi 3962*132f818dSEnji Cooper 3963*132f818dSEnji Cooper # Just move the object if needed 3964*132f818dSEnji Cooper if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then 3965*132f818dSEnji Cooper func_show_eval '$MV "$output_obj" "$obj"' \ 3966*132f818dSEnji Cooper 'error=$?; $opt_dry_run || $RM $removelist; exit $error' 3967*132f818dSEnji Cooper fi 3968*132f818dSEnji Cooper fi 3969*132f818dSEnji Cooper 3970*132f818dSEnji Cooper $opt_dry_run || { 3971*132f818dSEnji Cooper func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" 3972*132f818dSEnji Cooper 3973*132f818dSEnji Cooper # Unlock the critical section if it was locked 3974*132f818dSEnji Cooper if test no != "$need_locks"; then 3975*132f818dSEnji Cooper removelist=$lockfile 3976*132f818dSEnji Cooper $RM "$lockfile" 3977*132f818dSEnji Cooper fi 3978*132f818dSEnji Cooper } 3979*132f818dSEnji Cooper 3980*132f818dSEnji Cooper exit $EXIT_SUCCESS 3981*132f818dSEnji Cooper} 3982*132f818dSEnji Cooper 3983*132f818dSEnji Cooper$opt_help || { 3984*132f818dSEnji Cooper test compile = "$opt_mode" && func_mode_compile ${1+"$@"} 3985*132f818dSEnji Cooper} 3986*132f818dSEnji Cooper 3987*132f818dSEnji Cooperfunc_mode_help () 3988*132f818dSEnji Cooper{ 3989*132f818dSEnji Cooper # We need to display help for each of the modes. 3990*132f818dSEnji Cooper case $opt_mode in 3991*132f818dSEnji Cooper "") 3992*132f818dSEnji Cooper # Generic help is extracted from the usage comments 3993*132f818dSEnji Cooper # at the start of this file. 3994*132f818dSEnji Cooper func_help 3995*132f818dSEnji Cooper ;; 3996*132f818dSEnji Cooper 3997*132f818dSEnji Cooper clean) 3998*132f818dSEnji Cooper $ECHO \ 3999*132f818dSEnji Cooper"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... 4000*132f818dSEnji Cooper 4001*132f818dSEnji CooperRemove files from the build directory. 4002*132f818dSEnji Cooper 4003*132f818dSEnji CooperRM is the name of the program to use to delete files associated with each FILE 4004*132f818dSEnji Cooper(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed 4005*132f818dSEnji Cooperto RM. 4006*132f818dSEnji Cooper 4007*132f818dSEnji CooperIf FILE is a libtool library, object or program, all the files associated 4008*132f818dSEnji Cooperwith it are deleted. Otherwise, only FILE itself is deleted using RM." 4009*132f818dSEnji Cooper ;; 4010*132f818dSEnji Cooper 4011*132f818dSEnji Cooper compile) 4012*132f818dSEnji Cooper $ECHO \ 4013*132f818dSEnji Cooper"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE 4014*132f818dSEnji Cooper 4015*132f818dSEnji CooperCompile a source file into a libtool library object. 4016*132f818dSEnji Cooper 4017*132f818dSEnji CooperThis mode accepts the following additional options: 4018*132f818dSEnji Cooper 4019*132f818dSEnji Cooper -o OUTPUT-FILE set the output file name to OUTPUT-FILE 4020*132f818dSEnji Cooper -no-suppress do not suppress compiler output for multiple passes 4021*132f818dSEnji Cooper -prefer-pic try to build PIC objects only 4022*132f818dSEnji Cooper -prefer-non-pic try to build non-PIC objects only 4023*132f818dSEnji Cooper -shared do not build a '.o' file suitable for static linking 4024*132f818dSEnji Cooper -static only build a '.o' file suitable for static linking 4025*132f818dSEnji Cooper -Wc,FLAG 4026*132f818dSEnji Cooper -Xcompiler FLAG pass FLAG directly to the compiler 4027*132f818dSEnji Cooper 4028*132f818dSEnji CooperCOMPILE-COMMAND is a command to be used in creating a 'standard' object file 4029*132f818dSEnji Cooperfrom the given SOURCEFILE. 4030*132f818dSEnji Cooper 4031*132f818dSEnji CooperThe output file name is determined by removing the directory component from 4032*132f818dSEnji CooperSOURCEFILE, then substituting the C source code suffix '.c' with the 4033*132f818dSEnji Cooperlibrary object suffix, '.lo'." 4034*132f818dSEnji Cooper ;; 4035*132f818dSEnji Cooper 4036*132f818dSEnji Cooper execute) 4037*132f818dSEnji Cooper $ECHO \ 4038*132f818dSEnji Cooper"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... 4039*132f818dSEnji Cooper 4040*132f818dSEnji CooperAutomatically set library path, then run a program. 4041*132f818dSEnji Cooper 4042*132f818dSEnji CooperThis mode accepts the following additional options: 4043*132f818dSEnji Cooper 4044*132f818dSEnji Cooper -dlopen FILE add the directory containing FILE to the library path 4045*132f818dSEnji Cooper 4046*132f818dSEnji CooperThis mode sets the library path environment variable according to '-dlopen' 4047*132f818dSEnji Cooperflags. 4048*132f818dSEnji Cooper 4049*132f818dSEnji CooperIf any of the ARGS are libtool executable wrappers, then they are translated 4050*132f818dSEnji Cooperinto their corresponding uninstalled binary, and any of their required library 4051*132f818dSEnji Cooperdirectories are added to the library path. 4052*132f818dSEnji Cooper 4053*132f818dSEnji CooperThen, COMMAND is executed, with ARGS as arguments." 4054*132f818dSEnji Cooper ;; 4055*132f818dSEnji Cooper 4056*132f818dSEnji Cooper finish) 4057*132f818dSEnji Cooper $ECHO \ 4058*132f818dSEnji Cooper"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... 4059*132f818dSEnji Cooper 4060*132f818dSEnji CooperComplete the installation of libtool libraries. 4061*132f818dSEnji Cooper 4062*132f818dSEnji CooperEach LIBDIR is a directory that contains libtool libraries. 4063*132f818dSEnji Cooper 4064*132f818dSEnji CooperThe commands that this mode executes may require superuser privileges. Use 4065*132f818dSEnji Cooperthe '--dry-run' option if you just want to see what would be executed." 4066*132f818dSEnji Cooper ;; 4067*132f818dSEnji Cooper 4068*132f818dSEnji Cooper install) 4069*132f818dSEnji Cooper $ECHO \ 4070*132f818dSEnji Cooper"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... 4071*132f818dSEnji Cooper 4072*132f818dSEnji CooperInstall executables or libraries. 4073*132f818dSEnji Cooper 4074*132f818dSEnji CooperINSTALL-COMMAND is the installation command. The first component should be 4075*132f818dSEnji Coopereither the 'install' or 'cp' program. 4076*132f818dSEnji Cooper 4077*132f818dSEnji CooperThe following components of INSTALL-COMMAND are treated specially: 4078*132f818dSEnji Cooper 4079*132f818dSEnji Cooper -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation 4080*132f818dSEnji Cooper 4081*132f818dSEnji CooperThe rest of the components are interpreted as arguments to that command (only 4082*132f818dSEnji CooperBSD-compatible install options are recognized)." 4083*132f818dSEnji Cooper ;; 4084*132f818dSEnji Cooper 4085*132f818dSEnji Cooper link) 4086*132f818dSEnji Cooper $ECHO \ 4087*132f818dSEnji Cooper"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... 4088*132f818dSEnji Cooper 4089*132f818dSEnji CooperLink object files or libraries together to form another library, or to 4090*132f818dSEnji Coopercreate an executable program. 4091*132f818dSEnji Cooper 4092*132f818dSEnji CooperLINK-COMMAND is a command using the C compiler that you would use to create 4093*132f818dSEnji Coopera program from several object files. 4094*132f818dSEnji Cooper 4095*132f818dSEnji CooperThe following components of LINK-COMMAND are treated specially: 4096*132f818dSEnji Cooper 4097*132f818dSEnji Cooper -all-static do not do any dynamic linking at all 4098*132f818dSEnji Cooper -avoid-version do not add a version suffix if possible 4099*132f818dSEnji Cooper -bindir BINDIR specify path to binaries directory (for systems where 4100*132f818dSEnji Cooper libraries must be found in the PATH setting at runtime) 4101*132f818dSEnji Cooper -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime 4102*132f818dSEnji Cooper -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols 4103*132f818dSEnji Cooper -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) 4104*132f818dSEnji Cooper -export-symbols SYMFILE 4105*132f818dSEnji Cooper try to export only the symbols listed in SYMFILE 4106*132f818dSEnji Cooper -export-symbols-regex REGEX 4107*132f818dSEnji Cooper try to export only the symbols matching REGEX 4108*132f818dSEnji Cooper -LLIBDIR search LIBDIR for required installed libraries 4109*132f818dSEnji Cooper -lNAME OUTPUT-FILE requires the installed library libNAME 4110*132f818dSEnji Cooper -module build a library that can dlopened 4111*132f818dSEnji Cooper -no-fast-install disable the fast-install mode 4112*132f818dSEnji Cooper -no-install link a not-installable executable 4113*132f818dSEnji Cooper -no-undefined declare that a library does not refer to external symbols 4114*132f818dSEnji Cooper -o OUTPUT-FILE create OUTPUT-FILE from the specified objects 4115*132f818dSEnji Cooper -objectlist FILE use a list of object files found in FILE to specify objects 4116*132f818dSEnji Cooper -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) 4117*132f818dSEnji Cooper -precious-files-regex REGEX 4118*132f818dSEnji Cooper don't remove output files matching REGEX 4119*132f818dSEnji Cooper -release RELEASE specify package release information 4120*132f818dSEnji Cooper -rpath LIBDIR the created library will eventually be installed in LIBDIR 4121*132f818dSEnji Cooper -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries 4122*132f818dSEnji Cooper -shared only do dynamic linking of libtool libraries 4123*132f818dSEnji Cooper -shrext SUFFIX override the standard shared library file extension 4124*132f818dSEnji Cooper -static do not do any dynamic linking of uninstalled libtool libraries 4125*132f818dSEnji Cooper -static-libtool-libs 4126*132f818dSEnji Cooper do not do any dynamic linking of libtool libraries 4127*132f818dSEnji Cooper -version-info CURRENT[:REVISION[:AGE]] 4128*132f818dSEnji Cooper specify library version info [each variable defaults to 0] 4129*132f818dSEnji Cooper -weak LIBNAME declare that the target provides the LIBNAME interface 4130*132f818dSEnji Cooper -Wc,FLAG 4131*132f818dSEnji Cooper -Xcompiler FLAG pass linker-specific FLAG directly to the compiler 4132*132f818dSEnji Cooper -Wa,FLAG 4133*132f818dSEnji Cooper -Xassembler FLAG pass linker-specific FLAG directly to the assembler 4134*132f818dSEnji Cooper -Wl,FLAG 4135*132f818dSEnji Cooper -Xlinker FLAG pass linker-specific FLAG directly to the linker 4136*132f818dSEnji Cooper -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) 4137*132f818dSEnji Cooper 4138*132f818dSEnji CooperAll other options (arguments beginning with '-') are ignored. 4139*132f818dSEnji Cooper 4140*132f818dSEnji CooperEvery other argument is treated as a filename. Files ending in '.la' are 4141*132f818dSEnji Coopertreated as uninstalled libtool libraries, other files are standard or library 4142*132f818dSEnji Cooperobject files. 4143*132f818dSEnji Cooper 4144*132f818dSEnji CooperIf the OUTPUT-FILE ends in '.la', then a libtool library is created, 4145*132f818dSEnji Cooperonly library objects ('.lo' files) may be specified, and '-rpath' is 4146*132f818dSEnji Cooperrequired, except when creating a convenience library. 4147*132f818dSEnji Cooper 4148*132f818dSEnji CooperIf OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created 4149*132f818dSEnji Cooperusing 'ar' and 'ranlib', or on Windows using 'lib'. 4150*132f818dSEnji Cooper 4151*132f818dSEnji CooperIf OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file 4152*132f818dSEnji Cooperis created, otherwise an executable program is created." 4153*132f818dSEnji Cooper ;; 4154*132f818dSEnji Cooper 4155*132f818dSEnji Cooper uninstall) 4156*132f818dSEnji Cooper $ECHO \ 4157*132f818dSEnji Cooper"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... 4158*132f818dSEnji Cooper 4159*132f818dSEnji CooperRemove libraries from an installation directory. 4160*132f818dSEnji Cooper 4161*132f818dSEnji CooperRM is the name of the program to use to delete files associated with each FILE 4162*132f818dSEnji Cooper(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed 4163*132f818dSEnji Cooperto RM. 4164*132f818dSEnji Cooper 4165*132f818dSEnji CooperIf FILE is a libtool library, all the files associated with it are deleted. 4166*132f818dSEnji CooperOtherwise, only FILE itself is deleted using RM." 4167*132f818dSEnji Cooper ;; 4168*132f818dSEnji Cooper 4169*132f818dSEnji Cooper *) 4170*132f818dSEnji Cooper func_fatal_help "invalid operation mode '$opt_mode'" 4171*132f818dSEnji Cooper ;; 4172*132f818dSEnji Cooper esac 4173*132f818dSEnji Cooper 4174*132f818dSEnji Cooper echo 4175*132f818dSEnji Cooper $ECHO "Try '$progname --help' for more information about other modes." 4176*132f818dSEnji Cooper} 4177*132f818dSEnji Cooper 4178*132f818dSEnji Cooper# Now that we've collected a possible --mode arg, show help if necessary 4179*132f818dSEnji Cooperif $opt_help; then 4180*132f818dSEnji Cooper if test : = "$opt_help"; then 4181*132f818dSEnji Cooper func_mode_help 4182*132f818dSEnji Cooper else 4183*132f818dSEnji Cooper { 4184*132f818dSEnji Cooper func_help noexit 4185*132f818dSEnji Cooper for opt_mode in compile link execute install finish uninstall clean; do 4186*132f818dSEnji Cooper func_mode_help 4187*132f818dSEnji Cooper done 4188*132f818dSEnji Cooper } | $SED -n '1p; 2,$s/^Usage:/ or: /p' 4189*132f818dSEnji Cooper { 4190*132f818dSEnji Cooper func_help noexit 4191*132f818dSEnji Cooper for opt_mode in compile link execute install finish uninstall clean; do 4192*132f818dSEnji Cooper echo 4193*132f818dSEnji Cooper func_mode_help 4194*132f818dSEnji Cooper done 4195*132f818dSEnji Cooper } | 4196*132f818dSEnji Cooper $SED '1d 4197*132f818dSEnji Cooper /^When reporting/,/^Report/{ 4198*132f818dSEnji Cooper H 4199*132f818dSEnji Cooper d 4200*132f818dSEnji Cooper } 4201*132f818dSEnji Cooper $x 4202*132f818dSEnji Cooper /information about other modes/d 4203*132f818dSEnji Cooper /more detailed .*MODE/d 4204*132f818dSEnji Cooper s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' 4205*132f818dSEnji Cooper fi 4206*132f818dSEnji Cooper exit $? 4207*132f818dSEnji Cooperfi 4208*132f818dSEnji Cooper 4209*132f818dSEnji Cooper 4210*132f818dSEnji Cooper# If option '--reorder-cache', reorder the shared library cache and exit. 4211*132f818dSEnji Cooperif $opt_reorder_cache; then 4212*132f818dSEnji Cooper func_reorder_shared_lib_cache $shared_lib_dirs 4213*132f818dSEnji Cooperfi 4214*132f818dSEnji Cooper 4215*132f818dSEnji Cooper 4216*132f818dSEnji Cooper# func_mode_execute arg... 4217*132f818dSEnji Cooperfunc_mode_execute () 4218*132f818dSEnji Cooper{ 4219*132f818dSEnji Cooper $debug_cmd 4220*132f818dSEnji Cooper 4221*132f818dSEnji Cooper # The first argument is the command name. 4222*132f818dSEnji Cooper cmd=$nonopt 4223*132f818dSEnji Cooper test -z "$cmd" && \ 4224*132f818dSEnji Cooper func_fatal_help "you must specify a COMMAND" 4225*132f818dSEnji Cooper 4226*132f818dSEnji Cooper # Handle -dlopen flags immediately. 4227*132f818dSEnji Cooper for file in $opt_dlopen; do 4228*132f818dSEnji Cooper test -f "$file" \ 4229*132f818dSEnji Cooper || func_fatal_help "'$file' is not a file" 4230*132f818dSEnji Cooper 4231*132f818dSEnji Cooper dir= 4232*132f818dSEnji Cooper case $file in 4233*132f818dSEnji Cooper *.la) 4234*132f818dSEnji Cooper func_resolve_sysroot "$file" 4235*132f818dSEnji Cooper file=$func_resolve_sysroot_result 4236*132f818dSEnji Cooper 4237*132f818dSEnji Cooper # Check to see that this really is a libtool archive. 4238*132f818dSEnji Cooper func_lalib_unsafe_p "$file" \ 4239*132f818dSEnji Cooper || func_fatal_help "'$lib' is not a valid libtool archive" 4240*132f818dSEnji Cooper 4241*132f818dSEnji Cooper # Read the libtool library. 4242*132f818dSEnji Cooper dlname= 4243*132f818dSEnji Cooper library_names= 4244*132f818dSEnji Cooper func_source "$file" 4245*132f818dSEnji Cooper 4246*132f818dSEnji Cooper # Skip this library if it cannot be dlopened. 4247*132f818dSEnji Cooper if test -z "$dlname"; then 4248*132f818dSEnji Cooper # Warn if it was a shared library. 4249*132f818dSEnji Cooper test -n "$library_names" && \ 4250*132f818dSEnji Cooper func_warning "'$file' was not linked with '-export-dynamic'" 4251*132f818dSEnji Cooper continue 4252*132f818dSEnji Cooper fi 4253*132f818dSEnji Cooper 4254*132f818dSEnji Cooper func_dirname "$file" "" "." 4255*132f818dSEnji Cooper dir=$func_dirname_result 4256*132f818dSEnji Cooper 4257*132f818dSEnji Cooper if test -f "$dir/$objdir/$dlname"; then 4258*132f818dSEnji Cooper func_append dir "/$objdir" 4259*132f818dSEnji Cooper else 4260*132f818dSEnji Cooper if test ! -f "$dir/$dlname"; then 4261*132f818dSEnji Cooper func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" 4262*132f818dSEnji Cooper fi 4263*132f818dSEnji Cooper fi 4264*132f818dSEnji Cooper ;; 4265*132f818dSEnji Cooper 4266*132f818dSEnji Cooper *.lo) 4267*132f818dSEnji Cooper # Just add the directory containing the .lo file. 4268*132f818dSEnji Cooper func_dirname "$file" "" "." 4269*132f818dSEnji Cooper dir=$func_dirname_result 4270*132f818dSEnji Cooper ;; 4271*132f818dSEnji Cooper 4272*132f818dSEnji Cooper *) 4273*132f818dSEnji Cooper func_warning "'-dlopen' is ignored for non-libtool libraries and objects" 4274*132f818dSEnji Cooper continue 4275*132f818dSEnji Cooper ;; 4276*132f818dSEnji Cooper esac 4277*132f818dSEnji Cooper 4278*132f818dSEnji Cooper # Get the absolute pathname. 4279*132f818dSEnji Cooper absdir=`cd "$dir" && pwd` 4280*132f818dSEnji Cooper test -n "$absdir" && dir=$absdir 4281*132f818dSEnji Cooper 4282*132f818dSEnji Cooper # Now add the directory to shlibpath_var. 4283*132f818dSEnji Cooper if eval "test -z \"\$$shlibpath_var\""; then 4284*132f818dSEnji Cooper eval "$shlibpath_var=\"\$dir\"" 4285*132f818dSEnji Cooper else 4286*132f818dSEnji Cooper eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" 4287*132f818dSEnji Cooper fi 4288*132f818dSEnji Cooper done 4289*132f818dSEnji Cooper 4290*132f818dSEnji Cooper # This variable tells wrapper scripts just to set shlibpath_var 4291*132f818dSEnji Cooper # rather than running their programs. 4292*132f818dSEnji Cooper libtool_execute_magic=$magic 4293*132f818dSEnji Cooper 4294*132f818dSEnji Cooper # Check if any of the arguments is a wrapper script. 4295*132f818dSEnji Cooper args= 4296*132f818dSEnji Cooper for file 4297*132f818dSEnji Cooper do 4298*132f818dSEnji Cooper case $file in 4299*132f818dSEnji Cooper -* | *.la | *.lo ) ;; 4300*132f818dSEnji Cooper *) 4301*132f818dSEnji Cooper # Do a test to see if this is really a libtool program. 4302*132f818dSEnji Cooper if func_ltwrapper_script_p "$file"; then 4303*132f818dSEnji Cooper func_source "$file" 4304*132f818dSEnji Cooper # Transform arg to wrapped name. 4305*132f818dSEnji Cooper file=$progdir/$program 4306*132f818dSEnji Cooper elif func_ltwrapper_executable_p "$file"; then 4307*132f818dSEnji Cooper func_ltwrapper_scriptname "$file" 4308*132f818dSEnji Cooper func_source "$func_ltwrapper_scriptname_result" 4309*132f818dSEnji Cooper # Transform arg to wrapped name. 4310*132f818dSEnji Cooper file=$progdir/$program 4311*132f818dSEnji Cooper fi 4312*132f818dSEnji Cooper ;; 4313*132f818dSEnji Cooper esac 4314*132f818dSEnji Cooper # Quote arguments (to preserve shell metacharacters). 4315*132f818dSEnji Cooper func_append_quoted args "$file" 4316*132f818dSEnji Cooper done 4317*132f818dSEnji Cooper 4318*132f818dSEnji Cooper if $opt_dry_run; then 4319*132f818dSEnji Cooper # Display what would be done. 4320*132f818dSEnji Cooper if test -n "$shlibpath_var"; then 4321*132f818dSEnji Cooper eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" 4322*132f818dSEnji Cooper echo "export $shlibpath_var" 4323*132f818dSEnji Cooper fi 4324*132f818dSEnji Cooper $ECHO "$cmd$args" 4325*132f818dSEnji Cooper exit $EXIT_SUCCESS 4326*132f818dSEnji Cooper else 4327*132f818dSEnji Cooper if test -n "$shlibpath_var"; then 4328*132f818dSEnji Cooper # Export the shlibpath_var. 4329*132f818dSEnji Cooper eval "export $shlibpath_var" 4330*132f818dSEnji Cooper fi 4331*132f818dSEnji Cooper 4332*132f818dSEnji Cooper # Restore saved environment variables 4333*132f818dSEnji Cooper for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES 4334*132f818dSEnji Cooper do 4335*132f818dSEnji Cooper eval "if test \"\${save_$lt_var+set}\" = set; then 4336*132f818dSEnji Cooper $lt_var=\$save_$lt_var; export $lt_var 4337*132f818dSEnji Cooper else 4338*132f818dSEnji Cooper $lt_unset $lt_var 4339*132f818dSEnji Cooper fi" 4340*132f818dSEnji Cooper done 4341*132f818dSEnji Cooper 4342*132f818dSEnji Cooper # Now prepare to actually exec the command. 4343*132f818dSEnji Cooper exec_cmd=\$cmd$args 4344*132f818dSEnji Cooper fi 4345*132f818dSEnji Cooper} 4346*132f818dSEnji Cooper 4347*132f818dSEnji Coopertest execute = "$opt_mode" && func_mode_execute ${1+"$@"} 4348*132f818dSEnji Cooper 4349*132f818dSEnji Cooper 4350*132f818dSEnji Cooper# func_mode_finish arg... 4351*132f818dSEnji Cooperfunc_mode_finish () 4352*132f818dSEnji Cooper{ 4353*132f818dSEnji Cooper $debug_cmd 4354*132f818dSEnji Cooper 4355*132f818dSEnji Cooper libs= 4356*132f818dSEnji Cooper libdirs= 4357*132f818dSEnji Cooper admincmds= 4358*132f818dSEnji Cooper 4359*132f818dSEnji Cooper for opt in "$nonopt" ${1+"$@"} 4360*132f818dSEnji Cooper do 4361*132f818dSEnji Cooper if test -d "$opt"; then 4362*132f818dSEnji Cooper func_append libdirs " $opt" 4363*132f818dSEnji Cooper 4364*132f818dSEnji Cooper elif test -f "$opt"; then 4365*132f818dSEnji Cooper if func_lalib_unsafe_p "$opt"; then 4366*132f818dSEnji Cooper func_append libs " $opt" 4367*132f818dSEnji Cooper else 4368*132f818dSEnji Cooper func_warning "'$opt' is not a valid libtool archive" 4369*132f818dSEnji Cooper fi 4370*132f818dSEnji Cooper 4371*132f818dSEnji Cooper else 4372*132f818dSEnji Cooper func_fatal_error "invalid argument '$opt'" 4373*132f818dSEnji Cooper fi 4374*132f818dSEnji Cooper done 4375*132f818dSEnji Cooper 4376*132f818dSEnji Cooper if test -n "$libs"; then 4377*132f818dSEnji Cooper if test -n "$lt_sysroot"; then 4378*132f818dSEnji Cooper sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` 4379*132f818dSEnji Cooper sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" 4380*132f818dSEnji Cooper else 4381*132f818dSEnji Cooper sysroot_cmd= 4382*132f818dSEnji Cooper fi 4383*132f818dSEnji Cooper 4384*132f818dSEnji Cooper # Remove sysroot references 4385*132f818dSEnji Cooper if $opt_dry_run; then 4386*132f818dSEnji Cooper for lib in $libs; do 4387*132f818dSEnji Cooper echo "removing references to $lt_sysroot and '=' prefixes from $lib" 4388*132f818dSEnji Cooper done 4389*132f818dSEnji Cooper else 4390*132f818dSEnji Cooper tmpdir=`func_mktempdir` 4391*132f818dSEnji Cooper for lib in $libs; do 4392*132f818dSEnji Cooper $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ 4393*132f818dSEnji Cooper > $tmpdir/tmp-la 4394*132f818dSEnji Cooper mv -f $tmpdir/tmp-la $lib 4395*132f818dSEnji Cooper done 4396*132f818dSEnji Cooper ${RM}r "$tmpdir" 4397*132f818dSEnji Cooper fi 4398*132f818dSEnji Cooper fi 4399*132f818dSEnji Cooper 4400*132f818dSEnji Cooper if test -n "$finish_cmds$finish_eval" && test -n "$libdirs" && $opt_finishing; then 4401*132f818dSEnji Cooper for libdir in $libdirs; do 4402*132f818dSEnji Cooper if test -n "$finish_cmds"; then 4403*132f818dSEnji Cooper # Do each command in the finish commands. 4404*132f818dSEnji Cooper func_execute_cmds "$finish_cmds" 'admincmds="$admincmds 4405*132f818dSEnji Cooper'"$cmd"'"' 4406*132f818dSEnji Cooper fi 4407*132f818dSEnji Cooper if test -n "$finish_eval"; then 4408*132f818dSEnji Cooper # Do the single finish_eval. 4409*132f818dSEnji Cooper eval cmds=\"$finish_eval\" 4410*132f818dSEnji Cooper $opt_dry_run || eval "$cmds" || func_append admincmds " 4411*132f818dSEnji Cooper $cmds" 4412*132f818dSEnji Cooper fi 4413*132f818dSEnji Cooper done 4414*132f818dSEnji Cooper fi 4415*132f818dSEnji Cooper 4416*132f818dSEnji Cooper # Exit here if they wanted silent mode. 4417*132f818dSEnji Cooper $opt_quiet && exit $EXIT_SUCCESS 4418*132f818dSEnji Cooper 4419*132f818dSEnji Cooper if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then 4420*132f818dSEnji Cooper echo "----------------------------------------------------------------------" 4421*132f818dSEnji Cooper echo "Libraries have been installed in:" 4422*132f818dSEnji Cooper for libdir in $libdirs; do 4423*132f818dSEnji Cooper $ECHO " $libdir" 4424*132f818dSEnji Cooper done 4425*132f818dSEnji Cooper if test "false" = "$opt_finishing"; then 4426*132f818dSEnji Cooper echo 4427*132f818dSEnji Cooper echo "NOTE: finish_cmds were not executed during testing, so you must" 4428*132f818dSEnji Cooper echo "manually run ldconfig to add a given test directory, LIBDIR, to" 4429*132f818dSEnji Cooper echo "the search path for generated executables." 4430*132f818dSEnji Cooper fi 4431*132f818dSEnji Cooper echo 4432*132f818dSEnji Cooper echo "If you ever happen to want to link against installed libraries" 4433*132f818dSEnji Cooper echo "in a given directory, LIBDIR, you must either use libtool, and" 4434*132f818dSEnji Cooper echo "specify the full pathname of the library, or use the '-LLIBDIR'" 4435*132f818dSEnji Cooper echo "flag during linking and do at least one of the following:" 4436*132f818dSEnji Cooper if test -n "$shlibpath_var"; then 4437*132f818dSEnji Cooper echo " - add LIBDIR to the '$shlibpath_var' environment variable" 4438*132f818dSEnji Cooper echo " during execution" 4439*132f818dSEnji Cooper fi 4440*132f818dSEnji Cooper if test -n "$runpath_var"; then 4441*132f818dSEnji Cooper echo " - add LIBDIR to the '$runpath_var' environment variable" 4442*132f818dSEnji Cooper echo " during linking" 4443*132f818dSEnji Cooper fi 4444*132f818dSEnji Cooper if test -n "$hardcode_libdir_flag_spec"; then 4445*132f818dSEnji Cooper libdir=LIBDIR 4446*132f818dSEnji Cooper eval flag=\"$hardcode_libdir_flag_spec\" 4447*132f818dSEnji Cooper 4448*132f818dSEnji Cooper $ECHO " - use the '$flag' linker flag" 4449*132f818dSEnji Cooper fi 4450*132f818dSEnji Cooper if test -n "$admincmds"; then 4451*132f818dSEnji Cooper $ECHO " - have your system administrator run these commands:$admincmds" 4452*132f818dSEnji Cooper fi 4453*132f818dSEnji Cooper if test -f /etc/ld.so.conf; then 4454*132f818dSEnji Cooper echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" 4455*132f818dSEnji Cooper fi 4456*132f818dSEnji Cooper echo 4457*132f818dSEnji Cooper 4458*132f818dSEnji Cooper echo "See any operating system documentation about shared libraries for" 4459*132f818dSEnji Cooper case $host in 4460*132f818dSEnji Cooper solaris2.[6789]|solaris2.1[0-9]) 4461*132f818dSEnji Cooper echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" 4462*132f818dSEnji Cooper echo "pages." 4463*132f818dSEnji Cooper ;; 4464*132f818dSEnji Cooper *) 4465*132f818dSEnji Cooper echo "more information, such as the ld(1) and ld.so(8) manual pages." 4466*132f818dSEnji Cooper ;; 4467*132f818dSEnji Cooper esac 4468*132f818dSEnji Cooper echo "----------------------------------------------------------------------" 4469*132f818dSEnji Cooper fi 4470*132f818dSEnji Cooper exit $EXIT_SUCCESS 4471*132f818dSEnji Cooper} 4472*132f818dSEnji Cooper 4473*132f818dSEnji Coopertest finish = "$opt_mode" && func_mode_finish ${1+"$@"} 4474*132f818dSEnji Cooper 4475*132f818dSEnji Cooper 4476*132f818dSEnji Cooper# func_mode_install arg... 4477*132f818dSEnji Cooperfunc_mode_install () 4478*132f818dSEnji Cooper{ 4479*132f818dSEnji Cooper $debug_cmd 4480*132f818dSEnji Cooper 4481*132f818dSEnji Cooper # There may be an optional sh(1) argument at the beginning of 4482*132f818dSEnji Cooper # install_prog (especially on Windows NT). 4483*132f818dSEnji Cooper if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || 4484*132f818dSEnji Cooper # Allow the use of GNU shtool's install command. 4485*132f818dSEnji Cooper case $nonopt in *shtool*) :;; *) false;; esac 4486*132f818dSEnji Cooper then 4487*132f818dSEnji Cooper # Aesthetically quote it. 4488*132f818dSEnji Cooper func_quote_arg pretty "$nonopt" 4489*132f818dSEnji Cooper install_prog="$func_quote_arg_result " 4490*132f818dSEnji Cooper arg=$1 4491*132f818dSEnji Cooper shift 4492*132f818dSEnji Cooper else 4493*132f818dSEnji Cooper install_prog= 4494*132f818dSEnji Cooper arg=$nonopt 4495*132f818dSEnji Cooper fi 4496*132f818dSEnji Cooper 4497*132f818dSEnji Cooper # The real first argument should be the name of the installation program. 4498*132f818dSEnji Cooper # Aesthetically quote it. 4499*132f818dSEnji Cooper func_quote_arg pretty "$arg" 4500*132f818dSEnji Cooper func_append install_prog "$func_quote_arg_result" 4501*132f818dSEnji Cooper install_shared_prog=$install_prog 4502*132f818dSEnji Cooper case " $install_prog " in 4503*132f818dSEnji Cooper *[\\\ /]cp\ *) install_cp=: ;; 4504*132f818dSEnji Cooper *) install_cp=false ;; 4505*132f818dSEnji Cooper esac 4506*132f818dSEnji Cooper 4507*132f818dSEnji Cooper # We need to accept at least all the BSD install flags. 4508*132f818dSEnji Cooper dest= 4509*132f818dSEnji Cooper files= 4510*132f818dSEnji Cooper opts= 4511*132f818dSEnji Cooper prev= 4512*132f818dSEnji Cooper install_type= 4513*132f818dSEnji Cooper isdir=false 4514*132f818dSEnji Cooper stripme= 4515*132f818dSEnji Cooper no_mode=: 4516*132f818dSEnji Cooper for arg 4517*132f818dSEnji Cooper do 4518*132f818dSEnji Cooper arg2= 4519*132f818dSEnji Cooper if test -n "$dest"; then 4520*132f818dSEnji Cooper func_append files " $dest" 4521*132f818dSEnji Cooper dest=$arg 4522*132f818dSEnji Cooper continue 4523*132f818dSEnji Cooper fi 4524*132f818dSEnji Cooper 4525*132f818dSEnji Cooper case $arg in 4526*132f818dSEnji Cooper -d) isdir=: ;; 4527*132f818dSEnji Cooper -f) 4528*132f818dSEnji Cooper if $install_cp; then :; else 4529*132f818dSEnji Cooper prev=$arg 4530*132f818dSEnji Cooper fi 4531*132f818dSEnji Cooper ;; 4532*132f818dSEnji Cooper -g | -m | -o) 4533*132f818dSEnji Cooper prev=$arg 4534*132f818dSEnji Cooper ;; 4535*132f818dSEnji Cooper -s) 4536*132f818dSEnji Cooper stripme=" -s" 4537*132f818dSEnji Cooper continue 4538*132f818dSEnji Cooper ;; 4539*132f818dSEnji Cooper -*) 4540*132f818dSEnji Cooper ;; 4541*132f818dSEnji Cooper *) 4542*132f818dSEnji Cooper # If the previous option needed an argument, then skip it. 4543*132f818dSEnji Cooper if test -n "$prev"; then 4544*132f818dSEnji Cooper if test X-m = "X$prev" && test -n "$install_override_mode"; then 4545*132f818dSEnji Cooper arg2=$install_override_mode 4546*132f818dSEnji Cooper no_mode=false 4547*132f818dSEnji Cooper fi 4548*132f818dSEnji Cooper prev= 4549*132f818dSEnji Cooper else 4550*132f818dSEnji Cooper dest=$arg 4551*132f818dSEnji Cooper continue 4552*132f818dSEnji Cooper fi 4553*132f818dSEnji Cooper ;; 4554*132f818dSEnji Cooper esac 4555*132f818dSEnji Cooper 4556*132f818dSEnji Cooper # Aesthetically quote the argument. 4557*132f818dSEnji Cooper func_quote_arg pretty "$arg" 4558*132f818dSEnji Cooper func_append install_prog " $func_quote_arg_result" 4559*132f818dSEnji Cooper if test -n "$arg2"; then 4560*132f818dSEnji Cooper func_quote_arg pretty "$arg2" 4561*132f818dSEnji Cooper fi 4562*132f818dSEnji Cooper func_append install_shared_prog " $func_quote_arg_result" 4563*132f818dSEnji Cooper done 4564*132f818dSEnji Cooper 4565*132f818dSEnji Cooper test -z "$install_prog" && \ 4566*132f818dSEnji Cooper func_fatal_help "you must specify an install program" 4567*132f818dSEnji Cooper 4568*132f818dSEnji Cooper test -n "$prev" && \ 4569*132f818dSEnji Cooper func_fatal_help "the '$prev' option requires an argument" 4570*132f818dSEnji Cooper 4571*132f818dSEnji Cooper if test -n "$install_override_mode" && $no_mode; then 4572*132f818dSEnji Cooper if $install_cp; then :; else 4573*132f818dSEnji Cooper func_quote_arg pretty "$install_override_mode" 4574*132f818dSEnji Cooper func_append install_shared_prog " -m $func_quote_arg_result" 4575*132f818dSEnji Cooper fi 4576*132f818dSEnji Cooper fi 4577*132f818dSEnji Cooper 4578*132f818dSEnji Cooper if test -z "$files"; then 4579*132f818dSEnji Cooper if test -z "$dest"; then 4580*132f818dSEnji Cooper func_fatal_help "no file or destination specified" 4581*132f818dSEnji Cooper else 4582*132f818dSEnji Cooper func_fatal_help "you must specify a destination" 4583*132f818dSEnji Cooper fi 4584*132f818dSEnji Cooper fi 4585*132f818dSEnji Cooper 4586*132f818dSEnji Cooper # Strip any trailing slash from the destination. 4587*132f818dSEnji Cooper func_stripname '' '/' "$dest" 4588*132f818dSEnji Cooper dest=$func_stripname_result 4589*132f818dSEnji Cooper 4590*132f818dSEnji Cooper # Check to see that the destination is a directory. 4591*132f818dSEnji Cooper test -d "$dest" && isdir=: 4592*132f818dSEnji Cooper if $isdir; then 4593*132f818dSEnji Cooper destdir=$dest 4594*132f818dSEnji Cooper destname= 4595*132f818dSEnji Cooper else 4596*132f818dSEnji Cooper func_dirname_and_basename "$dest" "" "." 4597*132f818dSEnji Cooper destdir=$func_dirname_result 4598*132f818dSEnji Cooper destname=$func_basename_result 4599*132f818dSEnji Cooper 4600*132f818dSEnji Cooper # Not a directory, so check to see that there is only one file specified. 4601*132f818dSEnji Cooper set dummy $files; shift 4602*132f818dSEnji Cooper test "$#" -gt 1 && \ 4603*132f818dSEnji Cooper func_fatal_help "'$dest' is not a directory" 4604*132f818dSEnji Cooper fi 4605*132f818dSEnji Cooper case $destdir in 4606*132f818dSEnji Cooper [\\/]* | [A-Za-z]:[\\/]*) ;; 4607*132f818dSEnji Cooper *) 4608*132f818dSEnji Cooper for file in $files; do 4609*132f818dSEnji Cooper case $file in 4610*132f818dSEnji Cooper *.lo) ;; 4611*132f818dSEnji Cooper *) 4612*132f818dSEnji Cooper func_fatal_help "'$destdir' must be an absolute directory name" 4613*132f818dSEnji Cooper ;; 4614*132f818dSEnji Cooper esac 4615*132f818dSEnji Cooper done 4616*132f818dSEnji Cooper ;; 4617*132f818dSEnji Cooper esac 4618*132f818dSEnji Cooper 4619*132f818dSEnji Cooper # This variable tells wrapper scripts just to set variables rather 4620*132f818dSEnji Cooper # than running their programs. 4621*132f818dSEnji Cooper libtool_install_magic=$magic 4622*132f818dSEnji Cooper 4623*132f818dSEnji Cooper staticlibs= 4624*132f818dSEnji Cooper future_libdirs= 4625*132f818dSEnji Cooper current_libdirs= 4626*132f818dSEnji Cooper for file in $files; do 4627*132f818dSEnji Cooper 4628*132f818dSEnji Cooper # Do each installation. 4629*132f818dSEnji Cooper case $file in 4630*132f818dSEnji Cooper *.$libext) 4631*132f818dSEnji Cooper # Do the static libraries later. 4632*132f818dSEnji Cooper func_append staticlibs " $file" 4633*132f818dSEnji Cooper ;; 4634*132f818dSEnji Cooper 4635*132f818dSEnji Cooper *.la) 4636*132f818dSEnji Cooper func_resolve_sysroot "$file" 4637*132f818dSEnji Cooper file=$func_resolve_sysroot_result 4638*132f818dSEnji Cooper 4639*132f818dSEnji Cooper # Check to see that this really is a libtool archive. 4640*132f818dSEnji Cooper func_lalib_unsafe_p "$file" \ 4641*132f818dSEnji Cooper || func_fatal_help "'$file' is not a valid libtool archive" 4642*132f818dSEnji Cooper 4643*132f818dSEnji Cooper library_names= 4644*132f818dSEnji Cooper old_library= 4645*132f818dSEnji Cooper relink_command= 4646*132f818dSEnji Cooper func_source "$file" 4647*132f818dSEnji Cooper 4648*132f818dSEnji Cooper # Add the libdir to current_libdirs if it is the destination. 4649*132f818dSEnji Cooper if test "X$destdir" = "X$libdir"; then 4650*132f818dSEnji Cooper case "$current_libdirs " in 4651*132f818dSEnji Cooper *" $libdir "*) ;; 4652*132f818dSEnji Cooper *) func_append current_libdirs " $libdir" ;; 4653*132f818dSEnji Cooper esac 4654*132f818dSEnji Cooper else 4655*132f818dSEnji Cooper # Note the libdir as a future libdir. 4656*132f818dSEnji Cooper case "$future_libdirs " in 4657*132f818dSEnji Cooper *" $libdir "*) ;; 4658*132f818dSEnji Cooper *) func_append future_libdirs " $libdir" ;; 4659*132f818dSEnji Cooper esac 4660*132f818dSEnji Cooper fi 4661*132f818dSEnji Cooper 4662*132f818dSEnji Cooper func_dirname "$file" "/" "" 4663*132f818dSEnji Cooper dir=$func_dirname_result 4664*132f818dSEnji Cooper func_append dir "$objdir" 4665*132f818dSEnji Cooper 4666*132f818dSEnji Cooper if test -n "$relink_command"; then 4667*132f818dSEnji Cooper # Strip any trailing slash from the destination. 4668*132f818dSEnji Cooper func_stripname '' '/' "$libdir" 4669*132f818dSEnji Cooper destlibdir=$func_stripname_result 4670*132f818dSEnji Cooper 4671*132f818dSEnji Cooper func_stripname '' '/' "$destdir" 4672*132f818dSEnji Cooper s_destdir=$func_stripname_result 4673*132f818dSEnji Cooper 4674*132f818dSEnji Cooper # Determine the prefix the user has applied to our future dir. 4675*132f818dSEnji Cooper inst_prefix_dir=`$ECHO "X$s_destdir" | $Xsed -e "s%$destlibdir\$%%"` 4676*132f818dSEnji Cooper 4677*132f818dSEnji Cooper # Don't allow the user to place us outside of our expected 4678*132f818dSEnji Cooper # location b/c this prevents finding dependent libraries that 4679*132f818dSEnji Cooper # are installed to the same prefix. 4680*132f818dSEnji Cooper # At present, this check doesn't affect windows .dll's that 4681*132f818dSEnji Cooper # are installed into $libdir/../bin (currently, that works fine) 4682*132f818dSEnji Cooper # but it's something to keep an eye on. 4683*132f818dSEnji Cooper test "$inst_prefix_dir" = "$destdir" && \ 4684*132f818dSEnji Cooper func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" 4685*132f818dSEnji Cooper 4686*132f818dSEnji Cooper if test -n "$inst_prefix_dir"; then 4687*132f818dSEnji Cooper # Stick the inst_prefix_dir data into the link command. 4688*132f818dSEnji Cooper relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` 4689*132f818dSEnji Cooper else 4690*132f818dSEnji Cooper relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` 4691*132f818dSEnji Cooper fi 4692*132f818dSEnji Cooper 4693*132f818dSEnji Cooper func_warning "relinking '$file'" 4694*132f818dSEnji Cooper func_show_eval "$relink_command" \ 4695*132f818dSEnji Cooper 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' 4696*132f818dSEnji Cooper fi 4697*132f818dSEnji Cooper 4698*132f818dSEnji Cooper # See the names of the shared library. 4699*132f818dSEnji Cooper set dummy $library_names; shift 4700*132f818dSEnji Cooper if test -n "$1"; then 4701*132f818dSEnji Cooper realname=$1 4702*132f818dSEnji Cooper shift 4703*132f818dSEnji Cooper 4704*132f818dSEnji Cooper srcname=$realname 4705*132f818dSEnji Cooper test -n "$relink_command" && srcname=${realname}T 4706*132f818dSEnji Cooper 4707*132f818dSEnji Cooper # Install the shared library and build the symlinks. 4708*132f818dSEnji Cooper func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 4709*132f818dSEnji Cooper 'exit $?' 4710*132f818dSEnji Cooper tstripme=$stripme 4711*132f818dSEnji Cooper case $host_os in 4712*132f818dSEnji Cooper cygwin* | mingw* | windows* | pw32* | cegcc*) 4713*132f818dSEnji Cooper case $realname in 4714*132f818dSEnji Cooper *.dll.a) 4715*132f818dSEnji Cooper tstripme= 4716*132f818dSEnji Cooper ;; 4717*132f818dSEnji Cooper esac 4718*132f818dSEnji Cooper ;; 4719*132f818dSEnji Cooper os2*) 4720*132f818dSEnji Cooper case $realname in 4721*132f818dSEnji Cooper *_dll.a) 4722*132f818dSEnji Cooper tstripme= 4723*132f818dSEnji Cooper ;; 4724*132f818dSEnji Cooper esac 4725*132f818dSEnji Cooper ;; 4726*132f818dSEnji Cooper esac 4727*132f818dSEnji Cooper if test -n "$tstripme" && test -n "$striplib"; then 4728*132f818dSEnji Cooper func_show_eval "$striplib $destdir/$realname" 'exit $?' 4729*132f818dSEnji Cooper fi 4730*132f818dSEnji Cooper 4731*132f818dSEnji Cooper if test "$#" -gt 0; then 4732*132f818dSEnji Cooper # Delete the old symlinks, and create new ones. 4733*132f818dSEnji Cooper # Try 'ln -sf' first, because the 'ln' binary might depend on 4734*132f818dSEnji Cooper # the symlink we replace! Solaris /bin/ln does not understand -f, 4735*132f818dSEnji Cooper # so we also need to try rm && ln -s. 4736*132f818dSEnji Cooper for linkname 4737*132f818dSEnji Cooper do 4738*132f818dSEnji Cooper test "$linkname" != "$realname" \ 4739*132f818dSEnji Cooper && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" 4740*132f818dSEnji Cooper done 4741*132f818dSEnji Cooper fi 4742*132f818dSEnji Cooper 4743*132f818dSEnji Cooper # Do each command in the postinstall commands. 4744*132f818dSEnji Cooper lib=$destdir/$realname 4745*132f818dSEnji Cooper func_execute_cmds "$postinstall_cmds" 'exit $?' 4746*132f818dSEnji Cooper fi 4747*132f818dSEnji Cooper 4748*132f818dSEnji Cooper # Install the pseudo-library for information purposes. 4749*132f818dSEnji Cooper func_basename "$file" 4750*132f818dSEnji Cooper name=$func_basename_result 4751*132f818dSEnji Cooper instname=$dir/${name}i 4752*132f818dSEnji Cooper func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' 4753*132f818dSEnji Cooper 4754*132f818dSEnji Cooper # Maybe install the static library, too. 4755*132f818dSEnji Cooper test -n "$old_library" && func_append staticlibs " $dir/$old_library" 4756*132f818dSEnji Cooper ;; 4757*132f818dSEnji Cooper 4758*132f818dSEnji Cooper *.lo) 4759*132f818dSEnji Cooper # Install (i.e. copy) a libtool object. 4760*132f818dSEnji Cooper 4761*132f818dSEnji Cooper # Figure out destination file name, if it wasn't already specified. 4762*132f818dSEnji Cooper if test -n "$destname"; then 4763*132f818dSEnji Cooper destfile=$destdir/$destname 4764*132f818dSEnji Cooper else 4765*132f818dSEnji Cooper func_basename "$file" 4766*132f818dSEnji Cooper destfile=$func_basename_result 4767*132f818dSEnji Cooper destfile=$destdir/$destfile 4768*132f818dSEnji Cooper fi 4769*132f818dSEnji Cooper 4770*132f818dSEnji Cooper # Deduce the name of the destination old-style object file. 4771*132f818dSEnji Cooper case $destfile in 4772*132f818dSEnji Cooper *.lo) 4773*132f818dSEnji Cooper func_lo2o "$destfile" 4774*132f818dSEnji Cooper staticdest=$func_lo2o_result 4775*132f818dSEnji Cooper ;; 4776*132f818dSEnji Cooper *.$objext) 4777*132f818dSEnji Cooper staticdest=$destfile 4778*132f818dSEnji Cooper destfile= 4779*132f818dSEnji Cooper ;; 4780*132f818dSEnji Cooper *) 4781*132f818dSEnji Cooper func_fatal_help "cannot copy a libtool object to '$destfile'" 4782*132f818dSEnji Cooper ;; 4783*132f818dSEnji Cooper esac 4784*132f818dSEnji Cooper 4785*132f818dSEnji Cooper # Install the libtool object if requested. 4786*132f818dSEnji Cooper test -n "$destfile" && \ 4787*132f818dSEnji Cooper func_show_eval "$install_prog $file $destfile" 'exit $?' 4788*132f818dSEnji Cooper 4789*132f818dSEnji Cooper # Install the old object if enabled. 4790*132f818dSEnji Cooper if test yes = "$build_old_libs"; then 4791*132f818dSEnji Cooper # Deduce the name of the old-style object file. 4792*132f818dSEnji Cooper func_lo2o "$file" 4793*132f818dSEnji Cooper staticobj=$func_lo2o_result 4794*132f818dSEnji Cooper func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' 4795*132f818dSEnji Cooper fi 4796*132f818dSEnji Cooper exit $EXIT_SUCCESS 4797*132f818dSEnji Cooper ;; 4798*132f818dSEnji Cooper 4799*132f818dSEnji Cooper *) 4800*132f818dSEnji Cooper # Figure out destination file name, if it wasn't already specified. 4801*132f818dSEnji Cooper if test -n "$destname"; then 4802*132f818dSEnji Cooper destfile=$destdir/$destname 4803*132f818dSEnji Cooper else 4804*132f818dSEnji Cooper func_basename "$file" 4805*132f818dSEnji Cooper destfile=$func_basename_result 4806*132f818dSEnji Cooper destfile=$destdir/$destfile 4807*132f818dSEnji Cooper fi 4808*132f818dSEnji Cooper 4809*132f818dSEnji Cooper # If the file is missing, and there is a .exe on the end, strip it 4810*132f818dSEnji Cooper # because it is most likely a libtool script we actually want to 4811*132f818dSEnji Cooper # install 4812*132f818dSEnji Cooper stripped_ext= 4813*132f818dSEnji Cooper case $file in 4814*132f818dSEnji Cooper *.exe) 4815*132f818dSEnji Cooper if test ! -f "$file"; then 4816*132f818dSEnji Cooper func_stripname '' '.exe' "$file" 4817*132f818dSEnji Cooper file=$func_stripname_result 4818*132f818dSEnji Cooper stripped_ext=.exe 4819*132f818dSEnji Cooper fi 4820*132f818dSEnji Cooper ;; 4821*132f818dSEnji Cooper esac 4822*132f818dSEnji Cooper 4823*132f818dSEnji Cooper # Do a test to see if this is really a libtool program. 4824*132f818dSEnji Cooper case $host in 4825*132f818dSEnji Cooper *cygwin* | *mingw* | *windows*) 4826*132f818dSEnji Cooper if func_ltwrapper_executable_p "$file"; then 4827*132f818dSEnji Cooper func_ltwrapper_scriptname "$file" 4828*132f818dSEnji Cooper wrapper=$func_ltwrapper_scriptname_result 4829*132f818dSEnji Cooper else 4830*132f818dSEnji Cooper func_stripname '' '.exe' "$file" 4831*132f818dSEnji Cooper wrapper=$func_stripname_result 4832*132f818dSEnji Cooper fi 4833*132f818dSEnji Cooper ;; 4834*132f818dSEnji Cooper *) 4835*132f818dSEnji Cooper wrapper=$file 4836*132f818dSEnji Cooper ;; 4837*132f818dSEnji Cooper esac 4838*132f818dSEnji Cooper if func_ltwrapper_script_p "$wrapper"; then 4839*132f818dSEnji Cooper notinst_deplibs= 4840*132f818dSEnji Cooper relink_command= 4841*132f818dSEnji Cooper 4842*132f818dSEnji Cooper func_source "$wrapper" 4843*132f818dSEnji Cooper 4844*132f818dSEnji Cooper # Check the variables that should have been set. 4845*132f818dSEnji Cooper test -z "$generated_by_libtool_version" && \ 4846*132f818dSEnji Cooper func_fatal_error "invalid libtool wrapper script '$wrapper'" 4847*132f818dSEnji Cooper 4848*132f818dSEnji Cooper finalize=: 4849*132f818dSEnji Cooper for lib in $notinst_deplibs; do 4850*132f818dSEnji Cooper # Check to see that each library is installed. 4851*132f818dSEnji Cooper libdir= 4852*132f818dSEnji Cooper if test -f "$lib"; then 4853*132f818dSEnji Cooper func_source "$lib" 4854*132f818dSEnji Cooper fi 4855*132f818dSEnji Cooper libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` 4856*132f818dSEnji Cooper if test -n "$libdir" && test ! -f "$libfile"; then 4857*132f818dSEnji Cooper func_warning "'$lib' has not been installed in '$libdir'" 4858*132f818dSEnji Cooper finalize=false 4859*132f818dSEnji Cooper fi 4860*132f818dSEnji Cooper done 4861*132f818dSEnji Cooper 4862*132f818dSEnji Cooper relink_command= 4863*132f818dSEnji Cooper func_source "$wrapper" 4864*132f818dSEnji Cooper 4865*132f818dSEnji Cooper outputname= 4866*132f818dSEnji Cooper if test no = "$fast_install" && test -n "$relink_command"; then 4867*132f818dSEnji Cooper $opt_dry_run || { 4868*132f818dSEnji Cooper if $finalize; then 4869*132f818dSEnji Cooper tmpdir=`func_mktempdir` 4870*132f818dSEnji Cooper func_basename "$file$stripped_ext" 4871*132f818dSEnji Cooper file=$func_basename_result 4872*132f818dSEnji Cooper outputname=$tmpdir/$file 4873*132f818dSEnji Cooper # Replace the output file specification. 4874*132f818dSEnji Cooper relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` 4875*132f818dSEnji Cooper 4876*132f818dSEnji Cooper $opt_quiet || { 4877*132f818dSEnji Cooper func_quote_arg expand,pretty "$relink_command" 4878*132f818dSEnji Cooper eval "func_echo $func_quote_arg_result" 4879*132f818dSEnji Cooper } 4880*132f818dSEnji Cooper if eval "$relink_command"; then : 4881*132f818dSEnji Cooper else 4882*132f818dSEnji Cooper func_error "error: relink '$file' with the above command before installing it" 4883*132f818dSEnji Cooper $opt_dry_run || ${RM}r "$tmpdir" 4884*132f818dSEnji Cooper continue 4885*132f818dSEnji Cooper fi 4886*132f818dSEnji Cooper file=$outputname 4887*132f818dSEnji Cooper else 4888*132f818dSEnji Cooper func_warning "cannot relink '$file'" 4889*132f818dSEnji Cooper fi 4890*132f818dSEnji Cooper } 4891*132f818dSEnji Cooper else 4892*132f818dSEnji Cooper # Install the binary that we compiled earlier. 4893*132f818dSEnji Cooper file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` 4894*132f818dSEnji Cooper fi 4895*132f818dSEnji Cooper fi 4896*132f818dSEnji Cooper 4897*132f818dSEnji Cooper # remove .exe since cygwin /usr/bin/install will append another 4898*132f818dSEnji Cooper # one anyway 4899*132f818dSEnji Cooper case $install_prog,$host in 4900*132f818dSEnji Cooper */usr/bin/install*,*cygwin*) 4901*132f818dSEnji Cooper case $file:$destfile in 4902*132f818dSEnji Cooper *.exe:*.exe) 4903*132f818dSEnji Cooper # this is ok 4904*132f818dSEnji Cooper ;; 4905*132f818dSEnji Cooper *.exe:*) 4906*132f818dSEnji Cooper destfile=$destfile.exe 4907*132f818dSEnji Cooper ;; 4908*132f818dSEnji Cooper *:*.exe) 4909*132f818dSEnji Cooper func_stripname '' '.exe' "$destfile" 4910*132f818dSEnji Cooper destfile=$func_stripname_result 4911*132f818dSEnji Cooper ;; 4912*132f818dSEnji Cooper esac 4913*132f818dSEnji Cooper ;; 4914*132f818dSEnji Cooper esac 4915*132f818dSEnji Cooper func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' 4916*132f818dSEnji Cooper $opt_dry_run || if test -n "$outputname"; then 4917*132f818dSEnji Cooper ${RM}r "$tmpdir" 4918*132f818dSEnji Cooper fi 4919*132f818dSEnji Cooper ;; 4920*132f818dSEnji Cooper esac 4921*132f818dSEnji Cooper done 4922*132f818dSEnji Cooper 4923*132f818dSEnji Cooper for file in $staticlibs; do 4924*132f818dSEnji Cooper func_basename "$file" 4925*132f818dSEnji Cooper name=$func_basename_result 4926*132f818dSEnji Cooper 4927*132f818dSEnji Cooper # Set up the ranlib parameters. 4928*132f818dSEnji Cooper oldlib=$destdir/$name 4929*132f818dSEnji Cooper func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 4930*132f818dSEnji Cooper tool_oldlib=$func_to_tool_file_result 4931*132f818dSEnji Cooper 4932*132f818dSEnji Cooper func_show_eval "$install_prog \$file \$oldlib" 'exit $?' 4933*132f818dSEnji Cooper 4934*132f818dSEnji Cooper if test -n "$stripme" && test -n "$old_striplib"; then 4935*132f818dSEnji Cooper func_show_eval "$old_striplib $tool_oldlib" 'exit $?' 4936*132f818dSEnji Cooper fi 4937*132f818dSEnji Cooper 4938*132f818dSEnji Cooper # Do each command in the postinstall commands. 4939*132f818dSEnji Cooper func_execute_cmds "$old_postinstall_cmds" 'exit $?' 4940*132f818dSEnji Cooper done 4941*132f818dSEnji Cooper 4942*132f818dSEnji Cooper test -n "$future_libdirs" && \ 4943*132f818dSEnji Cooper func_warning "remember to run '$progname --finish$future_libdirs'" 4944*132f818dSEnji Cooper 4945*132f818dSEnji Cooper if test -n "$current_libdirs"; then 4946*132f818dSEnji Cooper # Maybe just do a dry run. 4947*132f818dSEnji Cooper $opt_dry_run && current_libdirs=" -n$current_libdirs" 4948*132f818dSEnji Cooper exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' 4949*132f818dSEnji Cooper else 4950*132f818dSEnji Cooper exit $EXIT_SUCCESS 4951*132f818dSEnji Cooper fi 4952*132f818dSEnji Cooper} 4953*132f818dSEnji Cooper 4954*132f818dSEnji Coopertest install = "$opt_mode" && func_mode_install ${1+"$@"} 4955*132f818dSEnji Cooper 4956*132f818dSEnji Cooper 4957*132f818dSEnji Cooper# func_generate_dlsyms outputname originator pic_p 4958*132f818dSEnji Cooper# Extract symbols from dlprefiles and create ${outputname}S.o with 4959*132f818dSEnji Cooper# a dlpreopen symbol table. 4960*132f818dSEnji Cooperfunc_generate_dlsyms () 4961*132f818dSEnji Cooper{ 4962*132f818dSEnji Cooper $debug_cmd 4963*132f818dSEnji Cooper 4964*132f818dSEnji Cooper my_outputname=$1 4965*132f818dSEnji Cooper my_originator=$2 4966*132f818dSEnji Cooper my_pic_p=${3-false} 4967*132f818dSEnji Cooper my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` 4968*132f818dSEnji Cooper my_dlsyms= 4969*132f818dSEnji Cooper 4970*132f818dSEnji Cooper if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then 4971*132f818dSEnji Cooper if test -n "$NM" && test -n "$global_symbol_pipe"; then 4972*132f818dSEnji Cooper my_dlsyms=${my_outputname}S.c 4973*132f818dSEnji Cooper else 4974*132f818dSEnji Cooper func_error "not configured to extract global symbols from dlpreopened files" 4975*132f818dSEnji Cooper fi 4976*132f818dSEnji Cooper fi 4977*132f818dSEnji Cooper 4978*132f818dSEnji Cooper if test -n "$my_dlsyms"; then 4979*132f818dSEnji Cooper case $my_dlsyms in 4980*132f818dSEnji Cooper "") ;; 4981*132f818dSEnji Cooper *.c) 4982*132f818dSEnji Cooper # Discover the nlist of each of the dlfiles. 4983*132f818dSEnji Cooper nlist=$output_objdir/$my_outputname.nm 4984*132f818dSEnji Cooper 4985*132f818dSEnji Cooper func_show_eval "$RM $nlist ${nlist}S ${nlist}T" 4986*132f818dSEnji Cooper 4987*132f818dSEnji Cooper # Parse the name list into a source file. 4988*132f818dSEnji Cooper func_verbose "creating $output_objdir/$my_dlsyms" 4989*132f818dSEnji Cooper 4990*132f818dSEnji Cooper $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ 4991*132f818dSEnji Cooper/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ 4992*132f818dSEnji Cooper/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ 4993*132f818dSEnji Cooper 4994*132f818dSEnji Cooper#ifdef __cplusplus 4995*132f818dSEnji Cooperextern \"C\" { 4996*132f818dSEnji Cooper#endif 4997*132f818dSEnji Cooper 4998*132f818dSEnji Cooper#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) 4999*132f818dSEnji Cooper#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" 5000*132f818dSEnji Cooper#endif 5001*132f818dSEnji Cooper 5002*132f818dSEnji Cooper/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ 5003*132f818dSEnji Cooper#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE 5004*132f818dSEnji Cooper/* DATA imports from DLLs on WIN32 can't be const, because runtime 5005*132f818dSEnji Cooper relocations are performed -- see ld's documentation on pseudo-relocs. */ 5006*132f818dSEnji Cooper# define LT_DLSYM_CONST 5007*132f818dSEnji Cooper#elif defined __osf__ 5008*132f818dSEnji Cooper/* This system does not cope well with relocations in const data. */ 5009*132f818dSEnji Cooper# define LT_DLSYM_CONST 5010*132f818dSEnji Cooper#else 5011*132f818dSEnji Cooper# define LT_DLSYM_CONST const 5012*132f818dSEnji Cooper#endif 5013*132f818dSEnji Cooper 5014*132f818dSEnji Cooper#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) 5015*132f818dSEnji Cooper 5016*132f818dSEnji Cooper/* External symbol declarations for the compiler. */\ 5017*132f818dSEnji Cooper" 5018*132f818dSEnji Cooper 5019*132f818dSEnji Cooper if test yes = "$dlself"; then 5020*132f818dSEnji Cooper func_verbose "generating symbol list for '$output'" 5021*132f818dSEnji Cooper 5022*132f818dSEnji Cooper $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" 5023*132f818dSEnji Cooper 5024*132f818dSEnji Cooper # Add our own program objects to the symbol list. 5025*132f818dSEnji Cooper progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` 5026*132f818dSEnji Cooper for progfile in $progfiles; do 5027*132f818dSEnji Cooper func_to_tool_file "$progfile" func_convert_file_msys_to_w32 5028*132f818dSEnji Cooper func_verbose "extracting global C symbols from '$func_to_tool_file_result'" 5029*132f818dSEnji Cooper $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" 5030*132f818dSEnji Cooper done 5031*132f818dSEnji Cooper 5032*132f818dSEnji Cooper if test -n "$exclude_expsyms"; then 5033*132f818dSEnji Cooper $opt_dry_run || { 5034*132f818dSEnji Cooper eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' 5035*132f818dSEnji Cooper eval '$MV "$nlist"T "$nlist"' 5036*132f818dSEnji Cooper } 5037*132f818dSEnji Cooper fi 5038*132f818dSEnji Cooper 5039*132f818dSEnji Cooper if test -n "$export_symbols_regex"; then 5040*132f818dSEnji Cooper $opt_dry_run || { 5041*132f818dSEnji Cooper eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' 5042*132f818dSEnji Cooper eval '$MV "$nlist"T "$nlist"' 5043*132f818dSEnji Cooper } 5044*132f818dSEnji Cooper fi 5045*132f818dSEnji Cooper 5046*132f818dSEnji Cooper # Prepare the list of exported symbols 5047*132f818dSEnji Cooper if test -z "$export_symbols"; then 5048*132f818dSEnji Cooper export_symbols=$output_objdir/$outputname.exp 5049*132f818dSEnji Cooper $opt_dry_run || { 5050*132f818dSEnji Cooper $RM $export_symbols 5051*132f818dSEnji Cooper eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' 5052*132f818dSEnji Cooper case $host in 5053*132f818dSEnji Cooper *cygwin* | *mingw* | *windows* | *cegcc* ) 5054*132f818dSEnji Cooper eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' 5055*132f818dSEnji Cooper eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' 5056*132f818dSEnji Cooper ;; 5057*132f818dSEnji Cooper esac 5058*132f818dSEnji Cooper } 5059*132f818dSEnji Cooper else 5060*132f818dSEnji Cooper $opt_dry_run || { 5061*132f818dSEnji Cooper eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' 5062*132f818dSEnji Cooper eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' 5063*132f818dSEnji Cooper eval '$MV "$nlist"T "$nlist"' 5064*132f818dSEnji Cooper case $host in 5065*132f818dSEnji Cooper *cygwin* | *mingw* | *windows* | *cegcc* ) 5066*132f818dSEnji Cooper eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' 5067*132f818dSEnji Cooper eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' 5068*132f818dSEnji Cooper ;; 5069*132f818dSEnji Cooper esac 5070*132f818dSEnji Cooper } 5071*132f818dSEnji Cooper fi 5072*132f818dSEnji Cooper fi 5073*132f818dSEnji Cooper 5074*132f818dSEnji Cooper for dlprefile in $dlprefiles; do 5075*132f818dSEnji Cooper func_verbose "extracting global C symbols from '$dlprefile'" 5076*132f818dSEnji Cooper func_basename "$dlprefile" 5077*132f818dSEnji Cooper name=$func_basename_result 5078*132f818dSEnji Cooper case $host in 5079*132f818dSEnji Cooper *cygwin* | *mingw* | *windows* | *cegcc* ) 5080*132f818dSEnji Cooper # if an import library, we need to obtain dlname 5081*132f818dSEnji Cooper if func_win32_import_lib_p "$dlprefile"; then 5082*132f818dSEnji Cooper func_tr_sh "$dlprefile" 5083*132f818dSEnji Cooper eval "curr_lafile=\$libfile_$func_tr_sh_result" 5084*132f818dSEnji Cooper dlprefile_dlbasename= 5085*132f818dSEnji Cooper if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then 5086*132f818dSEnji Cooper # Use subshell, to avoid clobbering current variable values 5087*132f818dSEnji Cooper dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` 5088*132f818dSEnji Cooper if test -n "$dlprefile_dlname"; then 5089*132f818dSEnji Cooper func_basename "$dlprefile_dlname" 5090*132f818dSEnji Cooper dlprefile_dlbasename=$func_basename_result 5091*132f818dSEnji Cooper else 5092*132f818dSEnji Cooper # no lafile. user explicitly requested -dlpreopen <import library>. 5093*132f818dSEnji Cooper $sharedlib_from_linklib_cmd "$dlprefile" 5094*132f818dSEnji Cooper dlprefile_dlbasename=$sharedlib_from_linklib_result 5095*132f818dSEnji Cooper fi 5096*132f818dSEnji Cooper fi 5097*132f818dSEnji Cooper $opt_dry_run || { 5098*132f818dSEnji Cooper if test -n "$dlprefile_dlbasename"; then 5099*132f818dSEnji Cooper eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' 5100*132f818dSEnji Cooper else 5101*132f818dSEnji Cooper func_warning "Could not compute DLL name from $name" 5102*132f818dSEnji Cooper eval '$ECHO ": $name " >> "$nlist"' 5103*132f818dSEnji Cooper fi 5104*132f818dSEnji Cooper func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 5105*132f818dSEnji Cooper case $host in 5106*132f818dSEnji Cooper i[3456]86-*-mingw32*) 5107*132f818dSEnji Cooper eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | 5108*132f818dSEnji Cooper $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" 5109*132f818dSEnji Cooper ;; 5110*132f818dSEnji Cooper *) 5111*132f818dSEnji Cooper eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | 5112*132f818dSEnji Cooper $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/__nm_//' >> '$nlist'" 5113*132f818dSEnji Cooper ;; 5114*132f818dSEnji Cooper esac 5115*132f818dSEnji Cooper } 5116*132f818dSEnji Cooper else # not an import lib 5117*132f818dSEnji Cooper $opt_dry_run || { 5118*132f818dSEnji Cooper eval '$ECHO ": $name " >> "$nlist"' 5119*132f818dSEnji Cooper func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 5120*132f818dSEnji Cooper eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" 5121*132f818dSEnji Cooper } 5122*132f818dSEnji Cooper fi 5123*132f818dSEnji Cooper ;; 5124*132f818dSEnji Cooper *) 5125*132f818dSEnji Cooper $opt_dry_run || { 5126*132f818dSEnji Cooper eval '$ECHO ": $name " >> "$nlist"' 5127*132f818dSEnji Cooper func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 5128*132f818dSEnji Cooper eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" 5129*132f818dSEnji Cooper } 5130*132f818dSEnji Cooper ;; 5131*132f818dSEnji Cooper esac 5132*132f818dSEnji Cooper done 5133*132f818dSEnji Cooper 5134*132f818dSEnji Cooper $opt_dry_run || { 5135*132f818dSEnji Cooper # Make sure we have at least an empty file. 5136*132f818dSEnji Cooper test -f "$nlist" || : > "$nlist" 5137*132f818dSEnji Cooper 5138*132f818dSEnji Cooper if test -n "$exclude_expsyms"; then 5139*132f818dSEnji Cooper $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T 5140*132f818dSEnji Cooper $MV "$nlist"T "$nlist" 5141*132f818dSEnji Cooper fi 5142*132f818dSEnji Cooper 5143*132f818dSEnji Cooper # Try sorting and uniquifying the output. 5144*132f818dSEnji Cooper if $GREP -v "^: " < "$nlist" | 5145*132f818dSEnji Cooper if sort -k 3 </dev/null >/dev/null 2>&1; then 5146*132f818dSEnji Cooper sort -k 3 5147*132f818dSEnji Cooper else 5148*132f818dSEnji Cooper sort +2 5149*132f818dSEnji Cooper fi | 5150*132f818dSEnji Cooper uniq > "$nlist"S; then 5151*132f818dSEnji Cooper : 5152*132f818dSEnji Cooper else 5153*132f818dSEnji Cooper $GREP -v "^: " < "$nlist" > "$nlist"S 5154*132f818dSEnji Cooper fi 5155*132f818dSEnji Cooper 5156*132f818dSEnji Cooper if test -f "$nlist"S; then 5157*132f818dSEnji Cooper eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' 5158*132f818dSEnji Cooper else 5159*132f818dSEnji Cooper echo '/* NONE */' >> "$output_objdir/$my_dlsyms" 5160*132f818dSEnji Cooper fi 5161*132f818dSEnji Cooper 5162*132f818dSEnji Cooper func_show_eval '$RM "${nlist}I"' 5163*132f818dSEnji Cooper if test -n "$global_symbol_to_import"; then 5164*132f818dSEnji Cooper eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' 5165*132f818dSEnji Cooper fi 5166*132f818dSEnji Cooper 5167*132f818dSEnji Cooper echo >> "$output_objdir/$my_dlsyms" "\ 5168*132f818dSEnji Cooper 5169*132f818dSEnji Cooper/* The mapping between symbol names and symbols. */ 5170*132f818dSEnji Coopertypedef struct { 5171*132f818dSEnji Cooper const char *name; 5172*132f818dSEnji Cooper void *address; 5173*132f818dSEnji Cooper} lt_dlsymlist; 5174*132f818dSEnji Cooperextern LT_DLSYM_CONST lt_dlsymlist 5175*132f818dSEnji Cooperlt_${my_prefix}_LTX_preloaded_symbols[];\ 5176*132f818dSEnji Cooper" 5177*132f818dSEnji Cooper 5178*132f818dSEnji Cooper if test -s "$nlist"I; then 5179*132f818dSEnji Cooper echo >> "$output_objdir/$my_dlsyms" "\ 5180*132f818dSEnji Cooperstatic void lt_syminit(void) 5181*132f818dSEnji Cooper{ 5182*132f818dSEnji Cooper LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; 5183*132f818dSEnji Cooper for (; symbol->name; ++symbol) 5184*132f818dSEnji Cooper {" 5185*132f818dSEnji Cooper $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" 5186*132f818dSEnji Cooper echo >> "$output_objdir/$my_dlsyms" "\ 5187*132f818dSEnji Cooper } 5188*132f818dSEnji Cooper}" 5189*132f818dSEnji Cooper fi 5190*132f818dSEnji Cooper echo >> "$output_objdir/$my_dlsyms" "\ 5191*132f818dSEnji CooperLT_DLSYM_CONST lt_dlsymlist 5192*132f818dSEnji Cooperlt_${my_prefix}_LTX_preloaded_symbols[] = 5193*132f818dSEnji Cooper{ {\"$my_originator\", (void *) 0}," 5194*132f818dSEnji Cooper 5195*132f818dSEnji Cooper if test -s "$nlist"I; then 5196*132f818dSEnji Cooper echo >> "$output_objdir/$my_dlsyms" "\ 5197*132f818dSEnji Cooper {\"@INIT@\", (void *) <_syminit}," 5198*132f818dSEnji Cooper fi 5199*132f818dSEnji Cooper 5200*132f818dSEnji Cooper case $need_lib_prefix in 5201*132f818dSEnji Cooper no) 5202*132f818dSEnji Cooper eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" 5203*132f818dSEnji Cooper ;; 5204*132f818dSEnji Cooper *) 5205*132f818dSEnji Cooper eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" 5206*132f818dSEnji Cooper ;; 5207*132f818dSEnji Cooper esac 5208*132f818dSEnji Cooper echo >> "$output_objdir/$my_dlsyms" "\ 5209*132f818dSEnji Cooper {0, (void *) 0} 5210*132f818dSEnji Cooper}; 5211*132f818dSEnji Cooper 5212*132f818dSEnji Cooper/* This works around a problem in FreeBSD linker */ 5213*132f818dSEnji Cooper#ifdef FREEBSD_WORKAROUND 5214*132f818dSEnji Cooperstatic const void *lt_preloaded_setup() { 5215*132f818dSEnji Cooper return lt_${my_prefix}_LTX_preloaded_symbols; 5216*132f818dSEnji Cooper} 5217*132f818dSEnji Cooper#endif 5218*132f818dSEnji Cooper 5219*132f818dSEnji Cooper#ifdef __cplusplus 5220*132f818dSEnji Cooper} 5221*132f818dSEnji Cooper#endif\ 5222*132f818dSEnji Cooper" 5223*132f818dSEnji Cooper } # !$opt_dry_run 5224*132f818dSEnji Cooper 5225*132f818dSEnji Cooper pic_flag_for_symtable= 5226*132f818dSEnji Cooper case "$compile_command " in 5227*132f818dSEnji Cooper *" -static "*) ;; 5228*132f818dSEnji Cooper *) 5229*132f818dSEnji Cooper case $host in 5230*132f818dSEnji Cooper # compiling the symbol table file with pic_flag works around 5231*132f818dSEnji Cooper # a FreeBSD bug that causes programs to crash when -lm is 5232*132f818dSEnji Cooper # linked before any other PIC object. But we must not use 5233*132f818dSEnji Cooper # pic_flag when linking with -static. The problem exists in 5234*132f818dSEnji Cooper # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. 5235*132f818dSEnji Cooper *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) 5236*132f818dSEnji Cooper pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; 5237*132f818dSEnji Cooper *-*-hpux*) 5238*132f818dSEnji Cooper pic_flag_for_symtable=" $pic_flag" ;; 5239*132f818dSEnji Cooper *) 5240*132f818dSEnji Cooper $my_pic_p && pic_flag_for_symtable=" $pic_flag" 5241*132f818dSEnji Cooper ;; 5242*132f818dSEnji Cooper esac 5243*132f818dSEnji Cooper ;; 5244*132f818dSEnji Cooper esac 5245*132f818dSEnji Cooper symtab_cflags= 5246*132f818dSEnji Cooper for arg in $LTCFLAGS; do 5247*132f818dSEnji Cooper case $arg in 5248*132f818dSEnji Cooper -pie | -fpie | -fPIE) ;; 5249*132f818dSEnji Cooper *) func_append symtab_cflags " $arg" ;; 5250*132f818dSEnji Cooper esac 5251*132f818dSEnji Cooper done 5252*132f818dSEnji Cooper 5253*132f818dSEnji Cooper # Now compile the dynamic symbol file. 5254*132f818dSEnji Cooper func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' 5255*132f818dSEnji Cooper 5256*132f818dSEnji Cooper # Clean up the generated files. 5257*132f818dSEnji Cooper func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' 5258*132f818dSEnji Cooper 5259*132f818dSEnji Cooper # Transform the symbol file into the correct name. 5260*132f818dSEnji Cooper symfileobj=$output_objdir/${my_outputname}S.$objext 5261*132f818dSEnji Cooper case $host in 5262*132f818dSEnji Cooper *cygwin* | *mingw* | *windows* | *cegcc* ) 5263*132f818dSEnji Cooper if test -f "$output_objdir/$my_outputname.def"; then 5264*132f818dSEnji Cooper compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` 5265*132f818dSEnji Cooper finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` 5266*132f818dSEnji Cooper else 5267*132f818dSEnji Cooper compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` 5268*132f818dSEnji Cooper finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` 5269*132f818dSEnji Cooper fi 5270*132f818dSEnji Cooper ;; 5271*132f818dSEnji Cooper *) 5272*132f818dSEnji Cooper compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` 5273*132f818dSEnji Cooper finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` 5274*132f818dSEnji Cooper ;; 5275*132f818dSEnji Cooper esac 5276*132f818dSEnji Cooper ;; 5277*132f818dSEnji Cooper *) 5278*132f818dSEnji Cooper func_fatal_error "unknown suffix for '$my_dlsyms'" 5279*132f818dSEnji Cooper ;; 5280*132f818dSEnji Cooper esac 5281*132f818dSEnji Cooper else 5282*132f818dSEnji Cooper # We keep going just in case the user didn't refer to 5283*132f818dSEnji Cooper # lt_preloaded_symbols. The linker will fail if global_symbol_pipe 5284*132f818dSEnji Cooper # really was required. 5285*132f818dSEnji Cooper 5286*132f818dSEnji Cooper # Nullify the symbol file. 5287*132f818dSEnji Cooper compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` 5288*132f818dSEnji Cooper finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` 5289*132f818dSEnji Cooper fi 5290*132f818dSEnji Cooper} 5291*132f818dSEnji Cooper 5292*132f818dSEnji Cooper# func_cygming_gnu_implib_p ARG 5293*132f818dSEnji Cooper# This predicate returns with zero status (TRUE) if 5294*132f818dSEnji Cooper# ARG is a GNU/binutils-style import library. Returns 5295*132f818dSEnji Cooper# with nonzero status (FALSE) otherwise. 5296*132f818dSEnji Cooperfunc_cygming_gnu_implib_p () 5297*132f818dSEnji Cooper{ 5298*132f818dSEnji Cooper $debug_cmd 5299*132f818dSEnji Cooper 5300*132f818dSEnji Cooper func_to_tool_file "$1" func_convert_file_msys_to_w32 5301*132f818dSEnji Cooper func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` 5302*132f818dSEnji Cooper test -n "$func_cygming_gnu_implib_tmp" 5303*132f818dSEnji Cooper} 5304*132f818dSEnji Cooper 5305*132f818dSEnji Cooper# func_cygming_ms_implib_p ARG 5306*132f818dSEnji Cooper# This predicate returns with zero status (TRUE) if 5307*132f818dSEnji Cooper# ARG is an MS-style import library. Returns 5308*132f818dSEnji Cooper# with nonzero status (FALSE) otherwise. 5309*132f818dSEnji Cooperfunc_cygming_ms_implib_p () 5310*132f818dSEnji Cooper{ 5311*132f818dSEnji Cooper $debug_cmd 5312*132f818dSEnji Cooper 5313*132f818dSEnji Cooper func_to_tool_file "$1" func_convert_file_msys_to_w32 5314*132f818dSEnji Cooper func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` 5315*132f818dSEnji Cooper test -n "$func_cygming_ms_implib_tmp" 5316*132f818dSEnji Cooper} 5317*132f818dSEnji Cooper 5318*132f818dSEnji Cooper# func_win32_libid arg 5319*132f818dSEnji Cooper# return the library type of file 'arg' 5320*132f818dSEnji Cooper# 5321*132f818dSEnji Cooper# Need a lot of goo to handle *both* DLLs and import libs 5322*132f818dSEnji Cooper# Has to be a shell function in order to 'eat' the argument 5323*132f818dSEnji Cooper# that is supplied when $file_magic_command is called. 5324*132f818dSEnji Cooper# Despite the name, also deal with 64 bit binaries. 5325*132f818dSEnji Cooperfunc_win32_libid () 5326*132f818dSEnji Cooper{ 5327*132f818dSEnji Cooper $debug_cmd 5328*132f818dSEnji Cooper 5329*132f818dSEnji Cooper win32_libid_type=unknown 5330*132f818dSEnji Cooper win32_fileres=`file -L $1 2>/dev/null` 5331*132f818dSEnji Cooper case $win32_fileres in 5332*132f818dSEnji Cooper *ar\ archive\ import\ library*) # definitely import 5333*132f818dSEnji Cooper win32_libid_type="x86 archive import" 5334*132f818dSEnji Cooper ;; 5335*132f818dSEnji Cooper *ar\ archive*) # could be an import, or static 5336*132f818dSEnji Cooper # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. 5337*132f818dSEnji Cooper if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | 5338*132f818dSEnji Cooper $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' >/dev/null; then 5339*132f818dSEnji Cooper case $nm_interface in 5340*132f818dSEnji Cooper "MS dumpbin") 5341*132f818dSEnji Cooper if func_cygming_ms_implib_p "$1" || 5342*132f818dSEnji Cooper func_cygming_gnu_implib_p "$1" 5343*132f818dSEnji Cooper then 5344*132f818dSEnji Cooper win32_nmres=import 5345*132f818dSEnji Cooper else 5346*132f818dSEnji Cooper win32_nmres= 5347*132f818dSEnji Cooper fi 5348*132f818dSEnji Cooper ;; 5349*132f818dSEnji Cooper *) 5350*132f818dSEnji Cooper func_to_tool_file "$1" func_convert_file_msys_to_w32 5351*132f818dSEnji Cooper win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | 5352*132f818dSEnji Cooper $SED -n -e ' 5353*132f818dSEnji Cooper 1,100{ 5354*132f818dSEnji Cooper / I /{ 5355*132f818dSEnji Cooper s|.*|import| 5356*132f818dSEnji Cooper p 5357*132f818dSEnji Cooper q 5358*132f818dSEnji Cooper } 5359*132f818dSEnji Cooper }'` 5360*132f818dSEnji Cooper ;; 5361*132f818dSEnji Cooper esac 5362*132f818dSEnji Cooper case $win32_nmres in 5363*132f818dSEnji Cooper import*) win32_libid_type="x86 archive import";; 5364*132f818dSEnji Cooper *) win32_libid_type="x86 archive static";; 5365*132f818dSEnji Cooper esac 5366*132f818dSEnji Cooper fi 5367*132f818dSEnji Cooper ;; 5368*132f818dSEnji Cooper *DLL*) 5369*132f818dSEnji Cooper win32_libid_type="x86 DLL" 5370*132f818dSEnji Cooper ;; 5371*132f818dSEnji Cooper *executable*) # but shell scripts are "executable" too... 5372*132f818dSEnji Cooper case $win32_fileres in 5373*132f818dSEnji Cooper *MS\ Windows\ PE\ Intel*) 5374*132f818dSEnji Cooper win32_libid_type="x86 DLL" 5375*132f818dSEnji Cooper ;; 5376*132f818dSEnji Cooper esac 5377*132f818dSEnji Cooper ;; 5378*132f818dSEnji Cooper esac 5379*132f818dSEnji Cooper $ECHO "$win32_libid_type" 5380*132f818dSEnji Cooper} 5381*132f818dSEnji Cooper 5382*132f818dSEnji Cooper# func_cygming_dll_for_implib ARG 5383*132f818dSEnji Cooper# 5384*132f818dSEnji Cooper# Platform-specific function to extract the 5385*132f818dSEnji Cooper# name of the DLL associated with the specified 5386*132f818dSEnji Cooper# import library ARG. 5387*132f818dSEnji Cooper# Invoked by eval'ing the libtool variable 5388*132f818dSEnji Cooper# $sharedlib_from_linklib_cmd 5389*132f818dSEnji Cooper# Result is available in the variable 5390*132f818dSEnji Cooper# $sharedlib_from_linklib_result 5391*132f818dSEnji Cooperfunc_cygming_dll_for_implib () 5392*132f818dSEnji Cooper{ 5393*132f818dSEnji Cooper $debug_cmd 5394*132f818dSEnji Cooper 5395*132f818dSEnji Cooper sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` 5396*132f818dSEnji Cooper} 5397*132f818dSEnji Cooper 5398*132f818dSEnji Cooper# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs 5399*132f818dSEnji Cooper# 5400*132f818dSEnji Cooper# The is the core of a fallback implementation of a 5401*132f818dSEnji Cooper# platform-specific function to extract the name of the 5402*132f818dSEnji Cooper# DLL associated with the specified import library LIBNAME. 5403*132f818dSEnji Cooper# 5404*132f818dSEnji Cooper# SECTION_NAME is either .idata$6 or .idata$7, depending 5405*132f818dSEnji Cooper# on the platform and compiler that created the implib. 5406*132f818dSEnji Cooper# 5407*132f818dSEnji Cooper# Echos the name of the DLL associated with the 5408*132f818dSEnji Cooper# specified import library. 5409*132f818dSEnji Cooperfunc_cygming_dll_for_implib_fallback_core () 5410*132f818dSEnji Cooper{ 5411*132f818dSEnji Cooper $debug_cmd 5412*132f818dSEnji Cooper 5413*132f818dSEnji Cooper match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` 5414*132f818dSEnji Cooper $OBJDUMP -s --section "$1" "$2" 2>/dev/null | 5415*132f818dSEnji Cooper $SED '/^Contents of section '"$match_literal"':/{ 5416*132f818dSEnji Cooper # Place marker at beginning of archive member dllname section 5417*132f818dSEnji Cooper s/.*/====MARK====/ 5418*132f818dSEnji Cooper p 5419*132f818dSEnji Cooper d 5420*132f818dSEnji Cooper } 5421*132f818dSEnji Cooper # These lines can sometimes be longer than 43 characters, but 5422*132f818dSEnji Cooper # are always uninteresting 5423*132f818dSEnji Cooper /:[ ]*file format pe[i]\{,1\}-/d 5424*132f818dSEnji Cooper /^In archive [^:]*:/d 5425*132f818dSEnji Cooper # Ensure marker is printed 5426*132f818dSEnji Cooper /^====MARK====/p 5427*132f818dSEnji Cooper # Remove all lines with less than 43 characters 5428*132f818dSEnji Cooper /^.\{43\}/!d 5429*132f818dSEnji Cooper # From remaining lines, remove first 43 characters 5430*132f818dSEnji Cooper s/^.\{43\}//' | 5431*132f818dSEnji Cooper $SED -n ' 5432*132f818dSEnji Cooper # Join marker and all lines until next marker into a single line 5433*132f818dSEnji Cooper /^====MARK====/ b para 5434*132f818dSEnji Cooper H 5435*132f818dSEnji Cooper $ b para 5436*132f818dSEnji Cooper b 5437*132f818dSEnji Cooper :para 5438*132f818dSEnji Cooper x 5439*132f818dSEnji Cooper s/\n//g 5440*132f818dSEnji Cooper # Remove the marker 5441*132f818dSEnji Cooper s/^====MARK====// 5442*132f818dSEnji Cooper # Remove trailing dots and whitespace 5443*132f818dSEnji Cooper s/[\. \t]*$// 5444*132f818dSEnji Cooper # Print 5445*132f818dSEnji Cooper /./p' | 5446*132f818dSEnji Cooper # we now have a list, one entry per line, of the stringified 5447*132f818dSEnji Cooper # contents of the appropriate section of all members of the 5448*132f818dSEnji Cooper # archive that possess that section. Heuristic: eliminate 5449*132f818dSEnji Cooper # all those that have a first or second character that is 5450*132f818dSEnji Cooper # a '.' (that is, objdump's representation of an unprintable 5451*132f818dSEnji Cooper # character.) This should work for all archives with less than 5452*132f818dSEnji Cooper # 0x302f exports -- but will fail for DLLs whose name actually 5453*132f818dSEnji Cooper # begins with a literal '.' or a single character followed by 5454*132f818dSEnji Cooper # a '.'. 5455*132f818dSEnji Cooper # 5456*132f818dSEnji Cooper # Of those that remain, print the first one. 5457*132f818dSEnji Cooper $SED -e '/^\./d;/^.\./d;q' 5458*132f818dSEnji Cooper} 5459*132f818dSEnji Cooper 5460*132f818dSEnji Cooper# func_cygming_dll_for_implib_fallback ARG 5461*132f818dSEnji Cooper# Platform-specific function to extract the 5462*132f818dSEnji Cooper# name of the DLL associated with the specified 5463*132f818dSEnji Cooper# import library ARG. 5464*132f818dSEnji Cooper# 5465*132f818dSEnji Cooper# This fallback implementation is for use when $DLLTOOL 5466*132f818dSEnji Cooper# does not support the --identify-strict option. 5467*132f818dSEnji Cooper# Invoked by eval'ing the libtool variable 5468*132f818dSEnji Cooper# $sharedlib_from_linklib_cmd 5469*132f818dSEnji Cooper# Result is available in the variable 5470*132f818dSEnji Cooper# $sharedlib_from_linklib_result 5471*132f818dSEnji Cooperfunc_cygming_dll_for_implib_fallback () 5472*132f818dSEnji Cooper{ 5473*132f818dSEnji Cooper $debug_cmd 5474*132f818dSEnji Cooper 5475*132f818dSEnji Cooper if func_cygming_gnu_implib_p "$1"; then 5476*132f818dSEnji Cooper # binutils import library 5477*132f818dSEnji Cooper sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` 5478*132f818dSEnji Cooper elif func_cygming_ms_implib_p "$1"; then 5479*132f818dSEnji Cooper # ms-generated import library 5480*132f818dSEnji Cooper sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` 5481*132f818dSEnji Cooper else 5482*132f818dSEnji Cooper # unknown 5483*132f818dSEnji Cooper sharedlib_from_linklib_result= 5484*132f818dSEnji Cooper fi 5485*132f818dSEnji Cooper} 5486*132f818dSEnji Cooper 5487*132f818dSEnji Cooper 5488*132f818dSEnji Cooper# func_extract_an_archive dir oldlib 5489*132f818dSEnji Cooperfunc_extract_an_archive () 5490*132f818dSEnji Cooper{ 5491*132f818dSEnji Cooper $debug_cmd 5492*132f818dSEnji Cooper 5493*132f818dSEnji Cooper f_ex_an_ar_dir=$1; shift 5494*132f818dSEnji Cooper f_ex_an_ar_oldlib=$1 5495*132f818dSEnji Cooper if test yes = "$lock_old_archive_extraction"; then 5496*132f818dSEnji Cooper lockfile=$f_ex_an_ar_oldlib.lock 5497*132f818dSEnji Cooper until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do 5498*132f818dSEnji Cooper func_echo "Waiting for $lockfile to be removed" 5499*132f818dSEnji Cooper sleep 2 5500*132f818dSEnji Cooper done 5501*132f818dSEnji Cooper fi 5502*132f818dSEnji Cooper func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 5503*132f818dSEnji Cooper 'stat=$?; rm -f "$lockfile"; exit $stat' 5504*132f818dSEnji Cooper if test yes = "$lock_old_archive_extraction"; then 5505*132f818dSEnji Cooper $opt_dry_run || rm -f "$lockfile" 5506*132f818dSEnji Cooper fi 5507*132f818dSEnji Cooper if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then 5508*132f818dSEnji Cooper : 5509*132f818dSEnji Cooper else 5510*132f818dSEnji Cooper func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 5511*132f818dSEnji Cooper fi 5512*132f818dSEnji Cooper} 5513*132f818dSEnji Cooper 5514*132f818dSEnji Cooper 5515*132f818dSEnji Cooper# func_extract_archives gentop oldlib ... 5516*132f818dSEnji Cooperfunc_extract_archives () 5517*132f818dSEnji Cooper{ 5518*132f818dSEnji Cooper $debug_cmd 5519*132f818dSEnji Cooper 5520*132f818dSEnji Cooper my_gentop=$1; shift 5521*132f818dSEnji Cooper my_oldlibs=${1+"$@"} 5522*132f818dSEnji Cooper my_oldobjs= 5523*132f818dSEnji Cooper my_xlib= 5524*132f818dSEnji Cooper my_xabs= 5525*132f818dSEnji Cooper my_xdir= 5526*132f818dSEnji Cooper 5527*132f818dSEnji Cooper for my_xlib in $my_oldlibs; do 5528*132f818dSEnji Cooper # Extract the objects. 5529*132f818dSEnji Cooper case $my_xlib in 5530*132f818dSEnji Cooper [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; 5531*132f818dSEnji Cooper *) my_xabs=`pwd`"/$my_xlib" ;; 5532*132f818dSEnji Cooper esac 5533*132f818dSEnji Cooper func_basename "$my_xlib" 5534*132f818dSEnji Cooper my_xlib=$func_basename_result 5535*132f818dSEnji Cooper my_xlib_u=$my_xlib 5536*132f818dSEnji Cooper while :; do 5537*132f818dSEnji Cooper case " $extracted_archives " in 5538*132f818dSEnji Cooper *" $my_xlib_u "*) 5539*132f818dSEnji Cooper func_arith $extracted_serial + 1 5540*132f818dSEnji Cooper extracted_serial=$func_arith_result 5541*132f818dSEnji Cooper my_xlib_u=lt$extracted_serial-$my_xlib ;; 5542*132f818dSEnji Cooper *) break ;; 5543*132f818dSEnji Cooper esac 5544*132f818dSEnji Cooper done 5545*132f818dSEnji Cooper extracted_archives="$extracted_archives $my_xlib_u" 5546*132f818dSEnji Cooper my_xdir=$my_gentop/$my_xlib_u 5547*132f818dSEnji Cooper 5548*132f818dSEnji Cooper func_mkdir_p "$my_xdir" 5549*132f818dSEnji Cooper 5550*132f818dSEnji Cooper case $host in 5551*132f818dSEnji Cooper *-darwin*) 5552*132f818dSEnji Cooper func_verbose "Extracting $my_xabs" 5553*132f818dSEnji Cooper # Do not bother doing anything if just a dry run 5554*132f818dSEnji Cooper $opt_dry_run || { 5555*132f818dSEnji Cooper darwin_orig_dir=`pwd` 5556*132f818dSEnji Cooper cd $my_xdir || exit $? 5557*132f818dSEnji Cooper darwin_archive=$my_xabs 5558*132f818dSEnji Cooper darwin_curdir=`pwd` 5559*132f818dSEnji Cooper func_basename "$darwin_archive" 5560*132f818dSEnji Cooper darwin_base_archive=$func_basename_result 5561*132f818dSEnji Cooper darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` 5562*132f818dSEnji Cooper if test -n "$darwin_arches"; then 5563*132f818dSEnji Cooper darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` 5564*132f818dSEnji Cooper darwin_arch= 5565*132f818dSEnji Cooper func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" 5566*132f818dSEnji Cooper for darwin_arch in $darwin_arches; do 5567*132f818dSEnji Cooper func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" 5568*132f818dSEnji Cooper $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" 5569*132f818dSEnji Cooper cd "unfat-$$/$darwin_base_archive-$darwin_arch" 5570*132f818dSEnji Cooper func_extract_an_archive "`pwd`" "$darwin_base_archive" 5571*132f818dSEnji Cooper cd "$darwin_curdir" 5572*132f818dSEnji Cooper $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" 5573*132f818dSEnji Cooper done # $darwin_arches 5574*132f818dSEnji Cooper ## Okay now we've a bunch of thin objects, gotta fatten them up :) 5575*132f818dSEnji Cooper darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` 5576*132f818dSEnji Cooper darwin_file= 5577*132f818dSEnji Cooper darwin_files= 5578*132f818dSEnji Cooper for darwin_file in $darwin_filelist; do 5579*132f818dSEnji Cooper darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` 5580*132f818dSEnji Cooper $LIPO -create -output "$darwin_file" $darwin_files 5581*132f818dSEnji Cooper done # $darwin_filelist 5582*132f818dSEnji Cooper $RM -rf unfat-$$ 5583*132f818dSEnji Cooper cd "$darwin_orig_dir" 5584*132f818dSEnji Cooper else 5585*132f818dSEnji Cooper cd $darwin_orig_dir 5586*132f818dSEnji Cooper func_extract_an_archive "$my_xdir" "$my_xabs" 5587*132f818dSEnji Cooper fi # $darwin_arches 5588*132f818dSEnji Cooper } # !$opt_dry_run 5589*132f818dSEnji Cooper ;; 5590*132f818dSEnji Cooper *) 5591*132f818dSEnji Cooper func_extract_an_archive "$my_xdir" "$my_xabs" 5592*132f818dSEnji Cooper ;; 5593*132f818dSEnji Cooper esac 5594*132f818dSEnji Cooper my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` 5595*132f818dSEnji Cooper done 5596*132f818dSEnji Cooper 5597*132f818dSEnji Cooper func_extract_archives_result=$my_oldobjs 5598*132f818dSEnji Cooper} 5599*132f818dSEnji Cooper 5600*132f818dSEnji Cooper 5601*132f818dSEnji Cooper# func_emit_wrapper [arg=no] 5602*132f818dSEnji Cooper# 5603*132f818dSEnji Cooper# Emit a libtool wrapper script on stdout. 5604*132f818dSEnji Cooper# Don't directly open a file because we may want to 5605*132f818dSEnji Cooper# incorporate the script contents within a cygwin/mingw/windows 5606*132f818dSEnji Cooper# wrapper executable. Must ONLY be called from within 5607*132f818dSEnji Cooper# func_mode_link because it depends on a number of variables 5608*132f818dSEnji Cooper# set therein. 5609*132f818dSEnji Cooper# 5610*132f818dSEnji Cooper# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR 5611*132f818dSEnji Cooper# variable will take. If 'yes', then the emitted script 5612*132f818dSEnji Cooper# will assume that the directory where it is stored is 5613*132f818dSEnji Cooper# the $objdir directory. This is a cygwin/mingw/windows-specific 5614*132f818dSEnji Cooper# behavior. 5615*132f818dSEnji Cooperfunc_emit_wrapper () 5616*132f818dSEnji Cooper{ 5617*132f818dSEnji Cooper func_emit_wrapper_arg1=${1-no} 5618*132f818dSEnji Cooper 5619*132f818dSEnji Cooper $ECHO "\ 5620*132f818dSEnji Cooper#! $SHELL 5621*132f818dSEnji Cooper 5622*132f818dSEnji Cooper# $output - temporary wrapper script for $objdir/$outputname 5623*132f818dSEnji Cooper# Generated by $PROGRAM (GNU $PACKAGE) $VERSION 5624*132f818dSEnji Cooper# 5625*132f818dSEnji Cooper# The $output program cannot be directly executed until all the libtool 5626*132f818dSEnji Cooper# libraries that it depends on are installed. 5627*132f818dSEnji Cooper# 5628*132f818dSEnji Cooper# This wrapper script should never be moved out of the build directory. 5629*132f818dSEnji Cooper# If it is, it will not operate correctly. 5630*132f818dSEnji Cooper 5631*132f818dSEnji Cooper# Sed substitution that helps us do robust quoting. It backslashifies 5632*132f818dSEnji Cooper# metacharacters that are still active within double-quoted strings. 5633*132f818dSEnji Coopersed_quote_subst='$sed_quote_subst' 5634*132f818dSEnji Cooper 5635*132f818dSEnji Cooper# Be Bourne compatible 5636*132f818dSEnji Cooperif test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then 5637*132f818dSEnji Cooper emulate sh 5638*132f818dSEnji Cooper NULLCMD=: 5639*132f818dSEnji Cooper # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which 5640*132f818dSEnji Cooper # is contrary to our usage. Disable this feature. 5641*132f818dSEnji Cooper alias -g '\${1+\"\$@\"}'='\"\$@\"' 5642*132f818dSEnji Cooper setopt NO_GLOB_SUBST 5643*132f818dSEnji Cooperelse 5644*132f818dSEnji Cooper case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac 5645*132f818dSEnji Cooperfi 5646*132f818dSEnji CooperBIN_SH=xpg4; export BIN_SH # for Tru64 5647*132f818dSEnji CooperDUALCASE=1; export DUALCASE # for MKS sh 5648*132f818dSEnji Cooper 5649*132f818dSEnji Cooper# The HP-UX ksh and POSIX shell print the target directory to stdout 5650*132f818dSEnji Cooper# if CDPATH is set. 5651*132f818dSEnji Cooper(unset CDPATH) >/dev/null 2>&1 && unset CDPATH 5652*132f818dSEnji Cooper 5653*132f818dSEnji Cooperrelink_command=\"$relink_command\" 5654*132f818dSEnji Cooper 5655*132f818dSEnji Cooper# This environment variable determines our operation mode. 5656*132f818dSEnji Cooperif test \"\$libtool_install_magic\" = \"$magic\"; then 5657*132f818dSEnji Cooper # install mode needs the following variables: 5658*132f818dSEnji Cooper generated_by_libtool_version='$macro_version' 5659*132f818dSEnji Cooper notinst_deplibs='$notinst_deplibs' 5660*132f818dSEnji Cooperelse 5661*132f818dSEnji Cooper # When we are sourced in execute mode, \$file and \$ECHO are already set. 5662*132f818dSEnji Cooper if test \"\$libtool_execute_magic\" != \"$magic\"; then 5663*132f818dSEnji Cooper file=\"\$0\"" 5664*132f818dSEnji Cooper 5665*132f818dSEnji Cooper func_quote_arg pretty "$ECHO" 5666*132f818dSEnji Cooper qECHO=$func_quote_arg_result 5667*132f818dSEnji Cooper $ECHO "\ 5668*132f818dSEnji Cooper 5669*132f818dSEnji Cooper# A function that is used when there is no print builtin or printf. 5670*132f818dSEnji Cooperfunc_fallback_echo () 5671*132f818dSEnji Cooper{ 5672*132f818dSEnji Cooper eval 'cat <<_LTECHO_EOF 5673*132f818dSEnji Cooper\$1 5674*132f818dSEnji Cooper_LTECHO_EOF' 5675*132f818dSEnji Cooper} 5676*132f818dSEnji Cooper ECHO=$qECHO 5677*132f818dSEnji Cooper fi 5678*132f818dSEnji Cooper 5679*132f818dSEnji Cooper# Very basic option parsing. These options are (a) specific to 5680*132f818dSEnji Cooper# the libtool wrapper, (b) are identical between the wrapper 5681*132f818dSEnji Cooper# /script/ and the wrapper /executable/ that is used only on 5682*132f818dSEnji Cooper# windows platforms, and (c) all begin with the string "--lt-" 5683*132f818dSEnji Cooper# (application programs are unlikely to have options that match 5684*132f818dSEnji Cooper# this pattern). 5685*132f818dSEnji Cooper# 5686*132f818dSEnji Cooper# There are only two supported options: --lt-debug and 5687*132f818dSEnji Cooper# --lt-dump-script. There is, deliberately, no --lt-help. 5688*132f818dSEnji Cooper# 5689*132f818dSEnji Cooper# The first argument to this parsing function should be the 5690*132f818dSEnji Cooper# script's $0 value, followed by "$@". 5691*132f818dSEnji Cooperlt_option_debug= 5692*132f818dSEnji Cooperfunc_parse_lt_options () 5693*132f818dSEnji Cooper{ 5694*132f818dSEnji Cooper lt_script_arg0=\$0 5695*132f818dSEnji Cooper shift 5696*132f818dSEnji Cooper for lt_opt 5697*132f818dSEnji Cooper do 5698*132f818dSEnji Cooper case \"\$lt_opt\" in 5699*132f818dSEnji Cooper --lt-debug) lt_option_debug=1 ;; 5700*132f818dSEnji Cooper --lt-dump-script) 5701*132f818dSEnji Cooper lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` 5702*132f818dSEnji Cooper test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. 5703*132f818dSEnji Cooper lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` 5704*132f818dSEnji Cooper cat \"\$lt_dump_D/\$lt_dump_F\" 5705*132f818dSEnji Cooper exit 0 5706*132f818dSEnji Cooper ;; 5707*132f818dSEnji Cooper --lt-*) 5708*132f818dSEnji Cooper \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 5709*132f818dSEnji Cooper exit 1 5710*132f818dSEnji Cooper ;; 5711*132f818dSEnji Cooper esac 5712*132f818dSEnji Cooper done 5713*132f818dSEnji Cooper 5714*132f818dSEnji Cooper # Print the debug banner immediately: 5715*132f818dSEnji Cooper if test -n \"\$lt_option_debug\"; then 5716*132f818dSEnji Cooper echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 5717*132f818dSEnji Cooper fi 5718*132f818dSEnji Cooper} 5719*132f818dSEnji Cooper 5720*132f818dSEnji Cooper# Used when --lt-debug. Prints its arguments to stdout 5721*132f818dSEnji Cooper# (redirection is the responsibility of the caller) 5722*132f818dSEnji Cooperfunc_lt_dump_args () 5723*132f818dSEnji Cooper{ 5724*132f818dSEnji Cooper lt_dump_args_N=1; 5725*132f818dSEnji Cooper for lt_arg 5726*132f818dSEnji Cooper do 5727*132f818dSEnji Cooper \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" 5728*132f818dSEnji Cooper lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` 5729*132f818dSEnji Cooper done 5730*132f818dSEnji Cooper} 5731*132f818dSEnji Cooper 5732*132f818dSEnji Cooper# Core function for launching the target application 5733*132f818dSEnji Cooperfunc_exec_program_core () 5734*132f818dSEnji Cooper{ 5735*132f818dSEnji Cooper" 5736*132f818dSEnji Cooper case $host in 5737*132f818dSEnji Cooper # Backslashes separate directories on plain windows 5738*132f818dSEnji Cooper *-*-mingw* | *-*-windows* | *-*-os2* | *-cegcc*) 5739*132f818dSEnji Cooper $ECHO "\ 5740*132f818dSEnji Cooper if test -n \"\$lt_option_debug\"; then 5741*132f818dSEnji Cooper \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 5742*132f818dSEnji Cooper func_lt_dump_args \${1+\"\$@\"} 1>&2 5743*132f818dSEnji Cooper fi 5744*132f818dSEnji Cooper exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} 5745*132f818dSEnji Cooper" 5746*132f818dSEnji Cooper ;; 5747*132f818dSEnji Cooper 5748*132f818dSEnji Cooper *) 5749*132f818dSEnji Cooper $ECHO "\ 5750*132f818dSEnji Cooper if test -n \"\$lt_option_debug\"; then 5751*132f818dSEnji Cooper \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 5752*132f818dSEnji Cooper func_lt_dump_args \${1+\"\$@\"} 1>&2 5753*132f818dSEnji Cooper fi 5754*132f818dSEnji Cooper exec \"\$progdir/\$program\" \${1+\"\$@\"} 5755*132f818dSEnji Cooper" 5756*132f818dSEnji Cooper ;; 5757*132f818dSEnji Cooper esac 5758*132f818dSEnji Cooper $ECHO "\ 5759*132f818dSEnji Cooper \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 5760*132f818dSEnji Cooper exit 1 5761*132f818dSEnji Cooper} 5762*132f818dSEnji Cooper 5763*132f818dSEnji Cooper# A function to encapsulate launching the target application 5764*132f818dSEnji Cooper# Strips options in the --lt-* namespace from \$@ and 5765*132f818dSEnji Cooper# launches target application with the remaining arguments. 5766*132f818dSEnji Cooperfunc_exec_program () 5767*132f818dSEnji Cooper{ 5768*132f818dSEnji Cooper case \" \$* \" in 5769*132f818dSEnji Cooper *\\ --lt-*) 5770*132f818dSEnji Cooper for lt_wr_arg 5771*132f818dSEnji Cooper do 5772*132f818dSEnji Cooper case \$lt_wr_arg in 5773*132f818dSEnji Cooper --lt-*) ;; 5774*132f818dSEnji Cooper *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; 5775*132f818dSEnji Cooper esac 5776*132f818dSEnji Cooper shift 5777*132f818dSEnji Cooper done ;; 5778*132f818dSEnji Cooper esac 5779*132f818dSEnji Cooper func_exec_program_core \${1+\"\$@\"} 5780*132f818dSEnji Cooper} 5781*132f818dSEnji Cooper 5782*132f818dSEnji Cooper # Parse options 5783*132f818dSEnji Cooper func_parse_lt_options \"\$0\" \${1+\"\$@\"} 5784*132f818dSEnji Cooper 5785*132f818dSEnji Cooper # Find the directory that this script lives in. 5786*132f818dSEnji Cooper thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` 5787*132f818dSEnji Cooper test \"x\$thisdir\" = \"x\$file\" && thisdir=. 5788*132f818dSEnji Cooper 5789*132f818dSEnji Cooper # Follow symbolic links until we get to the real thisdir. 5790*132f818dSEnji Cooper file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` 5791*132f818dSEnji Cooper while test -n \"\$file\"; do 5792*132f818dSEnji Cooper destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` 5793*132f818dSEnji Cooper 5794*132f818dSEnji Cooper # If there was a directory component, then change thisdir. 5795*132f818dSEnji Cooper if test \"x\$destdir\" != \"x\$file\"; then 5796*132f818dSEnji Cooper case \"\$destdir\" in 5797*132f818dSEnji Cooper [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; 5798*132f818dSEnji Cooper *) thisdir=\"\$thisdir/\$destdir\" ;; 5799*132f818dSEnji Cooper esac 5800*132f818dSEnji Cooper fi 5801*132f818dSEnji Cooper 5802*132f818dSEnji Cooper file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` 5803*132f818dSEnji Cooper file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` 5804*132f818dSEnji Cooper done 5805*132f818dSEnji Cooper 5806*132f818dSEnji Cooper # Usually 'no', except on cygwin/mingw/windows when embedded into 5807*132f818dSEnji Cooper # the cwrapper. 5808*132f818dSEnji Cooper WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 5809*132f818dSEnji Cooper if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then 5810*132f818dSEnji Cooper # special case for '.' 5811*132f818dSEnji Cooper if test \"\$thisdir\" = \".\"; then 5812*132f818dSEnji Cooper thisdir=\`pwd\` 5813*132f818dSEnji Cooper fi 5814*132f818dSEnji Cooper # remove .libs from thisdir 5815*132f818dSEnji Cooper case \"\$thisdir\" in 5816*132f818dSEnji Cooper *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; 5817*132f818dSEnji Cooper $objdir ) thisdir=. ;; 5818*132f818dSEnji Cooper esac 5819*132f818dSEnji Cooper fi 5820*132f818dSEnji Cooper 5821*132f818dSEnji Cooper # Try to get the absolute directory name. 5822*132f818dSEnji Cooper absdir=\`cd \"\$thisdir\" && pwd\` 5823*132f818dSEnji Cooper test -n \"\$absdir\" && thisdir=\"\$absdir\" 5824*132f818dSEnji Cooper" 5825*132f818dSEnji Cooper 5826*132f818dSEnji Cooper if test yes = "$fast_install"; then 5827*132f818dSEnji Cooper $ECHO "\ 5828*132f818dSEnji Cooper program=lt-'$outputname'$exeext 5829*132f818dSEnji Cooper progdir=\"\$thisdir/$objdir\" 5830*132f818dSEnji Cooper 5831*132f818dSEnji Cooper if test ! -f \"\$progdir/\$program\" || 5832*132f818dSEnji Cooper { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ 5833*132f818dSEnji Cooper test \"X\$file\" != \"X\$progdir/\$program\"; }; then 5834*132f818dSEnji Cooper 5835*132f818dSEnji Cooper file=\"\$\$-\$program\" 5836*132f818dSEnji Cooper 5837*132f818dSEnji Cooper if test ! -d \"\$progdir\"; then 5838*132f818dSEnji Cooper $MKDIR \"\$progdir\" 5839*132f818dSEnji Cooper else 5840*132f818dSEnji Cooper $RM \"\$progdir/\$file\" 5841*132f818dSEnji Cooper fi" 5842*132f818dSEnji Cooper 5843*132f818dSEnji Cooper $ECHO "\ 5844*132f818dSEnji Cooper 5845*132f818dSEnji Cooper # relink executable if necessary 5846*132f818dSEnji Cooper if test -n \"\$relink_command\"; then 5847*132f818dSEnji Cooper if relink_command_output=\`eval \$relink_command 2>&1\`; then : 5848*132f818dSEnji Cooper else 5849*132f818dSEnji Cooper \$ECHO \"\$relink_command_output\" >&2 5850*132f818dSEnji Cooper $RM \"\$progdir/\$file\" 5851*132f818dSEnji Cooper exit 1 5852*132f818dSEnji Cooper fi 5853*132f818dSEnji Cooper fi 5854*132f818dSEnji Cooper 5855*132f818dSEnji Cooper $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || 5856*132f818dSEnji Cooper { $RM \"\$progdir/\$program\"; 5857*132f818dSEnji Cooper $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } 5858*132f818dSEnji Cooper $RM \"\$progdir/\$file\" 5859*132f818dSEnji Cooper fi" 5860*132f818dSEnji Cooper else 5861*132f818dSEnji Cooper $ECHO "\ 5862*132f818dSEnji Cooper program='$outputname' 5863*132f818dSEnji Cooper progdir=\"\$thisdir/$objdir\" 5864*132f818dSEnji Cooper" 5865*132f818dSEnji Cooper fi 5866*132f818dSEnji Cooper 5867*132f818dSEnji Cooper $ECHO "\ 5868*132f818dSEnji Cooper 5869*132f818dSEnji Cooper if test -f \"\$progdir/\$program\"; then" 5870*132f818dSEnji Cooper 5871*132f818dSEnji Cooper # fixup the dll searchpath if we need to. 5872*132f818dSEnji Cooper # 5873*132f818dSEnji Cooper # Fix the DLL searchpath if we need to. Do this before prepending 5874*132f818dSEnji Cooper # to shlibpath, because on Windows, both are PATH and uninstalled 5875*132f818dSEnji Cooper # libraries must come first. 5876*132f818dSEnji Cooper if test -n "$dllsearchpath"; then 5877*132f818dSEnji Cooper $ECHO "\ 5878*132f818dSEnji Cooper # Add the dll search path components to the executable PATH 5879*132f818dSEnji Cooper PATH=$dllsearchpath:\$PATH 5880*132f818dSEnji Cooper" 5881*132f818dSEnji Cooper fi 5882*132f818dSEnji Cooper 5883*132f818dSEnji Cooper # Export our shlibpath_var if we have one. 5884*132f818dSEnji Cooper if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then 5885*132f818dSEnji Cooper $ECHO "\ 5886*132f818dSEnji Cooper # Add our own library path to $shlibpath_var 5887*132f818dSEnji Cooper $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" 5888*132f818dSEnji Cooper 5889*132f818dSEnji Cooper # Some systems cannot cope with colon-terminated $shlibpath_var 5890*132f818dSEnji Cooper # The second colon is a workaround for a bug in BeOS R4 sed 5891*132f818dSEnji Cooper $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` 5892*132f818dSEnji Cooper 5893*132f818dSEnji Cooper export $shlibpath_var 5894*132f818dSEnji Cooper" 5895*132f818dSEnji Cooper fi 5896*132f818dSEnji Cooper 5897*132f818dSEnji Cooper $ECHO "\ 5898*132f818dSEnji Cooper if test \"\$libtool_execute_magic\" != \"$magic\"; then 5899*132f818dSEnji Cooper # Run the actual program with our arguments. 5900*132f818dSEnji Cooper func_exec_program \${1+\"\$@\"} 5901*132f818dSEnji Cooper fi 5902*132f818dSEnji Cooper else 5903*132f818dSEnji Cooper # The program doesn't exist. 5904*132f818dSEnji Cooper \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 5905*132f818dSEnji Cooper \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 5906*132f818dSEnji Cooper \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 5907*132f818dSEnji Cooper exit 1 5908*132f818dSEnji Cooper fi 5909*132f818dSEnji Cooperfi\ 5910*132f818dSEnji Cooper" 5911*132f818dSEnji Cooper} 5912*132f818dSEnji Cooper 5913*132f818dSEnji Cooper 5914*132f818dSEnji Cooper# func_emit_cwrapperexe_src 5915*132f818dSEnji Cooper# emit the source code for a wrapper executable on stdout 5916*132f818dSEnji Cooper# Must ONLY be called from within func_mode_link because 5917*132f818dSEnji Cooper# it depends on a number of variable set therein. 5918*132f818dSEnji Cooperfunc_emit_cwrapperexe_src () 5919*132f818dSEnji Cooper{ 5920*132f818dSEnji Cooper cat <<EOF 5921*132f818dSEnji Cooper 5922*132f818dSEnji Cooper/* $cwrappersource - temporary wrapper executable for $objdir/$outputname 5923*132f818dSEnji Cooper Generated by $PROGRAM (GNU $PACKAGE) $VERSION 5924*132f818dSEnji Cooper 5925*132f818dSEnji Cooper The $output program cannot be directly executed until all the libtool 5926*132f818dSEnji Cooper libraries that it depends on are installed. 5927*132f818dSEnji Cooper 5928*132f818dSEnji Cooper This wrapper executable should never be moved out of the build directory. 5929*132f818dSEnji Cooper If it is, it will not operate correctly. 5930*132f818dSEnji Cooper*/ 5931*132f818dSEnji CooperEOF 5932*132f818dSEnji Cooper cat <<"EOF" 5933*132f818dSEnji Cooper#ifdef _MSC_VER 5934*132f818dSEnji Cooper# define _CRT_SECURE_NO_DEPRECATE 1 5935*132f818dSEnji Cooper#endif 5936*132f818dSEnji Cooper#include <stdio.h> 5937*132f818dSEnji Cooper#include <stdlib.h> 5938*132f818dSEnji Cooper#if defined _WIN32 && !defined __GNUC__ 5939*132f818dSEnji Cooper# include <direct.h> 5940*132f818dSEnji Cooper# include <process.h> 5941*132f818dSEnji Cooper# include <io.h> 5942*132f818dSEnji Cooper#else 5943*132f818dSEnji Cooper# include <unistd.h> 5944*132f818dSEnji Cooper# include <stdint.h> 5945*132f818dSEnji Cooper# ifdef __CYGWIN__ 5946*132f818dSEnji Cooper# include <io.h> 5947*132f818dSEnji Cooper# endif 5948*132f818dSEnji Cooper#endif 5949*132f818dSEnji Cooper#include <malloc.h> 5950*132f818dSEnji Cooper#include <stdarg.h> 5951*132f818dSEnji Cooper#include <assert.h> 5952*132f818dSEnji Cooper#include <string.h> 5953*132f818dSEnji Cooper#include <ctype.h> 5954*132f818dSEnji Cooper#include <errno.h> 5955*132f818dSEnji Cooper#include <fcntl.h> 5956*132f818dSEnji Cooper#include <sys/stat.h> 5957*132f818dSEnji Cooper 5958*132f818dSEnji Cooper#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) 5959*132f818dSEnji Cooper 5960*132f818dSEnji Cooper/* declarations of non-ANSI functions */ 5961*132f818dSEnji Cooper#if defined __MINGW32__ 5962*132f818dSEnji Cooper# ifdef __STRICT_ANSI__ 5963*132f818dSEnji Cooper_CRTIMP int __cdecl _putenv (const char *); 5964*132f818dSEnji Cooper# endif 5965*132f818dSEnji Cooper#elif defined __CYGWIN__ 5966*132f818dSEnji Cooper# ifdef __STRICT_ANSI__ 5967*132f818dSEnji Cooperchar *realpath (const char *, char *); 5968*132f818dSEnji Cooperint putenv (char *); 5969*132f818dSEnji Cooperint setenv (const char *, const char *, int); 5970*132f818dSEnji Cooper# endif 5971*132f818dSEnji Cooper/* #elif defined other_platform || defined ... */ 5972*132f818dSEnji Cooper#endif 5973*132f818dSEnji Cooper 5974*132f818dSEnji Cooper/* portability defines, excluding path handling macros */ 5975*132f818dSEnji Cooper#if defined _MSC_VER 5976*132f818dSEnji Cooper# define setmode _setmode 5977*132f818dSEnji Cooper# define stat _stat 5978*132f818dSEnji Cooper# define chmod _chmod 5979*132f818dSEnji Cooper# define getcwd _getcwd 5980*132f818dSEnji Cooper# define putenv _putenv 5981*132f818dSEnji Cooper# define S_IXUSR _S_IEXEC 5982*132f818dSEnji Cooper#elif defined __MINGW32__ 5983*132f818dSEnji Cooper# define setmode _setmode 5984*132f818dSEnji Cooper# define stat _stat 5985*132f818dSEnji Cooper# define chmod _chmod 5986*132f818dSEnji Cooper# define getcwd _getcwd 5987*132f818dSEnji Cooper# define putenv _putenv 5988*132f818dSEnji Cooper#elif defined __CYGWIN__ 5989*132f818dSEnji Cooper# define HAVE_SETENV 5990*132f818dSEnji Cooper# define FOPEN_WB "wb" 5991*132f818dSEnji Cooper/* #elif defined other platforms ... */ 5992*132f818dSEnji Cooper#endif 5993*132f818dSEnji Cooper 5994*132f818dSEnji Cooper#if defined PATH_MAX 5995*132f818dSEnji Cooper# define LT_PATHMAX PATH_MAX 5996*132f818dSEnji Cooper#elif defined MAXPATHLEN 5997*132f818dSEnji Cooper# define LT_PATHMAX MAXPATHLEN 5998*132f818dSEnji Cooper#else 5999*132f818dSEnji Cooper# define LT_PATHMAX 1024 6000*132f818dSEnji Cooper#endif 6001*132f818dSEnji Cooper 6002*132f818dSEnji Cooper#ifndef S_IXOTH 6003*132f818dSEnji Cooper# define S_IXOTH 0 6004*132f818dSEnji Cooper#endif 6005*132f818dSEnji Cooper#ifndef S_IXGRP 6006*132f818dSEnji Cooper# define S_IXGRP 0 6007*132f818dSEnji Cooper#endif 6008*132f818dSEnji Cooper 6009*132f818dSEnji Cooper/* path handling portability macros */ 6010*132f818dSEnji Cooper#ifndef DIR_SEPARATOR 6011*132f818dSEnji Cooper# define DIR_SEPARATOR '/' 6012*132f818dSEnji Cooper# define PATH_SEPARATOR ':' 6013*132f818dSEnji Cooper#endif 6014*132f818dSEnji Cooper 6015*132f818dSEnji Cooper#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ 6016*132f818dSEnji Cooper defined __OS2__ 6017*132f818dSEnji Cooper# define HAVE_DOS_BASED_FILE_SYSTEM 6018*132f818dSEnji Cooper# define FOPEN_WB "wb" 6019*132f818dSEnji Cooper# ifndef DIR_SEPARATOR_2 6020*132f818dSEnji Cooper# define DIR_SEPARATOR_2 '\\' 6021*132f818dSEnji Cooper# endif 6022*132f818dSEnji Cooper# ifndef PATH_SEPARATOR_2 6023*132f818dSEnji Cooper# define PATH_SEPARATOR_2 ';' 6024*132f818dSEnji Cooper# endif 6025*132f818dSEnji Cooper#endif 6026*132f818dSEnji Cooper 6027*132f818dSEnji Cooper#ifndef DIR_SEPARATOR_2 6028*132f818dSEnji Cooper# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) 6029*132f818dSEnji Cooper#else /* DIR_SEPARATOR_2 */ 6030*132f818dSEnji Cooper# define IS_DIR_SEPARATOR(ch) \ 6031*132f818dSEnji Cooper (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) 6032*132f818dSEnji Cooper#endif /* DIR_SEPARATOR_2 */ 6033*132f818dSEnji Cooper 6034*132f818dSEnji Cooper#ifndef PATH_SEPARATOR_2 6035*132f818dSEnji Cooper# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) 6036*132f818dSEnji Cooper#else /* PATH_SEPARATOR_2 */ 6037*132f818dSEnji Cooper# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) 6038*132f818dSEnji Cooper#endif /* PATH_SEPARATOR_2 */ 6039*132f818dSEnji Cooper 6040*132f818dSEnji Cooper#ifndef FOPEN_WB 6041*132f818dSEnji Cooper# define FOPEN_WB "w" 6042*132f818dSEnji Cooper#endif 6043*132f818dSEnji Cooper#ifndef _O_BINARY 6044*132f818dSEnji Cooper# define _O_BINARY 0 6045*132f818dSEnji Cooper#endif 6046*132f818dSEnji Cooper 6047*132f818dSEnji Cooper#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) 6048*132f818dSEnji Cooper#define XFREE(stale) do { \ 6049*132f818dSEnji Cooper if (stale) { free (stale); stale = 0; } \ 6050*132f818dSEnji Cooper} while (0) 6051*132f818dSEnji Cooper 6052*132f818dSEnji Cooper#if defined LT_DEBUGWRAPPER 6053*132f818dSEnji Cooperstatic int lt_debug = 1; 6054*132f818dSEnji Cooper#else 6055*132f818dSEnji Cooperstatic int lt_debug = 0; 6056*132f818dSEnji Cooper#endif 6057*132f818dSEnji Cooper 6058*132f818dSEnji Cooperconst char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ 6059*132f818dSEnji Cooper 6060*132f818dSEnji Coopervoid *xmalloc (size_t num); 6061*132f818dSEnji Cooperchar *xstrdup (const char *string); 6062*132f818dSEnji Cooperconst char *base_name (const char *name); 6063*132f818dSEnji Cooperchar *find_executable (const char *wrapper); 6064*132f818dSEnji Cooperchar *chase_symlinks (const char *pathspec); 6065*132f818dSEnji Cooperint make_executable (const char *path); 6066*132f818dSEnji Cooperint check_executable (const char *path); 6067*132f818dSEnji Cooperchar *strendzap (char *str, const char *pat); 6068*132f818dSEnji Coopervoid lt_debugprintf (const char *file, int line, const char *fmt, ...); 6069*132f818dSEnji Coopervoid lt_fatal (const char *file, int line, const char *message, ...); 6070*132f818dSEnji Cooperstatic const char *nonnull (const char *s); 6071*132f818dSEnji Cooperstatic const char *nonempty (const char *s); 6072*132f818dSEnji Coopervoid lt_setenv (const char *name, const char *value); 6073*132f818dSEnji Cooperchar *lt_extend_str (const char *orig_value, const char *add, int to_end); 6074*132f818dSEnji Coopervoid lt_update_exe_path (const char *name, const char *value); 6075*132f818dSEnji Coopervoid lt_update_lib_path (const char *name, const char *value); 6076*132f818dSEnji Cooperchar **prepare_spawn (char **argv); 6077*132f818dSEnji Coopervoid lt_dump_script (FILE *f); 6078*132f818dSEnji CooperEOF 6079*132f818dSEnji Cooper 6080*132f818dSEnji Cooper cat <<EOF 6081*132f818dSEnji Cooper#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) 6082*132f818dSEnji Cooper# define externally_visible volatile 6083*132f818dSEnji Cooper#else 6084*132f818dSEnji Cooper# define externally_visible __attribute__((externally_visible)) volatile 6085*132f818dSEnji Cooper#endif 6086*132f818dSEnji Cooperexternally_visible const char * MAGIC_EXE = "$magic_exe"; 6087*132f818dSEnji Cooperconst char * LIB_PATH_VARNAME = "$shlibpath_var"; 6088*132f818dSEnji CooperEOF 6089*132f818dSEnji Cooper 6090*132f818dSEnji Cooper if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then 6091*132f818dSEnji Cooper func_to_host_path "$temp_rpath" 6092*132f818dSEnji Cooper cat <<EOF 6093*132f818dSEnji Cooperconst char * LIB_PATH_VALUE = "$func_to_host_path_result"; 6094*132f818dSEnji CooperEOF 6095*132f818dSEnji Cooper else 6096*132f818dSEnji Cooper cat <<"EOF" 6097*132f818dSEnji Cooperconst char * LIB_PATH_VALUE = ""; 6098*132f818dSEnji CooperEOF 6099*132f818dSEnji Cooper fi 6100*132f818dSEnji Cooper 6101*132f818dSEnji Cooper if test -n "$dllsearchpath"; then 6102*132f818dSEnji Cooper func_to_host_path "$dllsearchpath:" 6103*132f818dSEnji Cooper cat <<EOF 6104*132f818dSEnji Cooperconst char * EXE_PATH_VARNAME = "PATH"; 6105*132f818dSEnji Cooperconst char * EXE_PATH_VALUE = "$func_to_host_path_result"; 6106*132f818dSEnji CooperEOF 6107*132f818dSEnji Cooper else 6108*132f818dSEnji Cooper cat <<"EOF" 6109*132f818dSEnji Cooperconst char * EXE_PATH_VARNAME = ""; 6110*132f818dSEnji Cooperconst char * EXE_PATH_VALUE = ""; 6111*132f818dSEnji CooperEOF 6112*132f818dSEnji Cooper fi 6113*132f818dSEnji Cooper 6114*132f818dSEnji Cooper if test yes = "$fast_install"; then 6115*132f818dSEnji Cooper cat <<EOF 6116*132f818dSEnji Cooperconst char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */ 6117*132f818dSEnji CooperEOF 6118*132f818dSEnji Cooper else 6119*132f818dSEnji Cooper cat <<EOF 6120*132f818dSEnji Cooperconst char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */ 6121*132f818dSEnji CooperEOF 6122*132f818dSEnji Cooper fi 6123*132f818dSEnji Cooper 6124*132f818dSEnji Cooper 6125*132f818dSEnji Cooper cat <<"EOF" 6126*132f818dSEnji Cooper 6127*132f818dSEnji Cooper#define LTWRAPPER_OPTION_PREFIX "--lt-" 6128*132f818dSEnji Cooper 6129*132f818dSEnji Cooperstatic const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX; 6130*132f818dSEnji Cooperstatic const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script"; 6131*132f818dSEnji Cooperstatic const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug"; 6132*132f818dSEnji Cooper 6133*132f818dSEnji Cooperint 6134*132f818dSEnji Coopermain (int argc, char *argv[]) 6135*132f818dSEnji Cooper{ 6136*132f818dSEnji Cooper char **newargz; 6137*132f818dSEnji Cooper int newargc; 6138*132f818dSEnji Cooper char *tmp_pathspec; 6139*132f818dSEnji Cooper char *actual_cwrapper_path; 6140*132f818dSEnji Cooper char *actual_cwrapper_name; 6141*132f818dSEnji Cooper char *target_name; 6142*132f818dSEnji Cooper char *lt_argv_zero; 6143*132f818dSEnji Cooper int rval = 127; 6144*132f818dSEnji Cooper 6145*132f818dSEnji Cooper int i; 6146*132f818dSEnji Cooper 6147*132f818dSEnji Cooper program_name = (char *) xstrdup (base_name (argv[0])); 6148*132f818dSEnji Cooper newargz = XMALLOC (char *, (size_t) argc + 1); 6149*132f818dSEnji Cooper 6150*132f818dSEnji Cooper /* very simple arg parsing; don't want to rely on getopt 6151*132f818dSEnji Cooper * also, copy all non cwrapper options to newargz, except 6152*132f818dSEnji Cooper * argz[0], which is handled differently 6153*132f818dSEnji Cooper */ 6154*132f818dSEnji Cooper newargc=0; 6155*132f818dSEnji Cooper for (i = 1; i < argc; i++) 6156*132f818dSEnji Cooper { 6157*132f818dSEnji Cooper if (STREQ (argv[i], dumpscript_opt)) 6158*132f818dSEnji Cooper { 6159*132f818dSEnji CooperEOF 6160*132f818dSEnji Cooper case $host in 6161*132f818dSEnji Cooper *mingw* | *windows* | *cygwin* ) 6162*132f818dSEnji Cooper # make stdout use "unix" line endings 6163*132f818dSEnji Cooper echo " setmode(1,_O_BINARY);" 6164*132f818dSEnji Cooper ;; 6165*132f818dSEnji Cooper esac 6166*132f818dSEnji Cooper 6167*132f818dSEnji Cooper cat <<"EOF" 6168*132f818dSEnji Cooper lt_dump_script (stdout); 6169*132f818dSEnji Cooper return 0; 6170*132f818dSEnji Cooper } 6171*132f818dSEnji Cooper if (STREQ (argv[i], debug_opt)) 6172*132f818dSEnji Cooper { 6173*132f818dSEnji Cooper lt_debug = 1; 6174*132f818dSEnji Cooper continue; 6175*132f818dSEnji Cooper } 6176*132f818dSEnji Cooper if (STREQ (argv[i], ltwrapper_option_prefix)) 6177*132f818dSEnji Cooper { 6178*132f818dSEnji Cooper /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX 6179*132f818dSEnji Cooper namespace, but it is not one of the ones we know about and 6180*132f818dSEnji Cooper have already dealt with, above (including dump-script), then 6181*132f818dSEnji Cooper report an error. Otherwise, targets might begin to believe 6182*132f818dSEnji Cooper they are allowed to use options in the LTWRAPPER_OPTION_PREFIX 6183*132f818dSEnji Cooper namespace. The first time any user complains about this, we'll 6184*132f818dSEnji Cooper need to make LTWRAPPER_OPTION_PREFIX a configure-time option 6185*132f818dSEnji Cooper or a configure.ac-settable value. 6186*132f818dSEnji Cooper */ 6187*132f818dSEnji Cooper lt_fatal (__FILE__, __LINE__, 6188*132f818dSEnji Cooper "unrecognized %s option: '%s'", 6189*132f818dSEnji Cooper ltwrapper_option_prefix, argv[i]); 6190*132f818dSEnji Cooper } 6191*132f818dSEnji Cooper /* otherwise ... */ 6192*132f818dSEnji Cooper newargz[++newargc] = xstrdup (argv[i]); 6193*132f818dSEnji Cooper } 6194*132f818dSEnji Cooper newargz[++newargc] = NULL; 6195*132f818dSEnji Cooper 6196*132f818dSEnji CooperEOF 6197*132f818dSEnji Cooper cat <<EOF 6198*132f818dSEnji Cooper /* The GNU banner must be the first non-error debug message */ 6199*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n"); 6200*132f818dSEnji CooperEOF 6201*132f818dSEnji Cooper cat <<"EOF" 6202*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]); 6203*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name); 6204*132f818dSEnji Cooper 6205*132f818dSEnji Cooper tmp_pathspec = find_executable (argv[0]); 6206*132f818dSEnji Cooper if (tmp_pathspec == NULL) 6207*132f818dSEnji Cooper lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]); 6208*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, 6209*132f818dSEnji Cooper "(main) found exe (before symlink chase) at: %s\n", 6210*132f818dSEnji Cooper tmp_pathspec); 6211*132f818dSEnji Cooper 6212*132f818dSEnji Cooper actual_cwrapper_path = chase_symlinks (tmp_pathspec); 6213*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, 6214*132f818dSEnji Cooper "(main) found exe (after symlink chase) at: %s\n", 6215*132f818dSEnji Cooper actual_cwrapper_path); 6216*132f818dSEnji Cooper XFREE (tmp_pathspec); 6217*132f818dSEnji Cooper 6218*132f818dSEnji Cooper actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path)); 6219*132f818dSEnji Cooper strendzap (actual_cwrapper_path, actual_cwrapper_name); 6220*132f818dSEnji Cooper 6221*132f818dSEnji Cooper /* wrapper name transforms */ 6222*132f818dSEnji Cooper strendzap (actual_cwrapper_name, ".exe"); 6223*132f818dSEnji Cooper tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1); 6224*132f818dSEnji Cooper XFREE (actual_cwrapper_name); 6225*132f818dSEnji Cooper actual_cwrapper_name = tmp_pathspec; 6226*132f818dSEnji Cooper tmp_pathspec = 0; 6227*132f818dSEnji Cooper 6228*132f818dSEnji Cooper /* target_name transforms -- use actual target program name; might have lt- prefix */ 6229*132f818dSEnji Cooper target_name = xstrdup (base_name (TARGET_PROGRAM_NAME)); 6230*132f818dSEnji Cooper strendzap (target_name, ".exe"); 6231*132f818dSEnji Cooper tmp_pathspec = lt_extend_str (target_name, ".exe", 1); 6232*132f818dSEnji Cooper XFREE (target_name); 6233*132f818dSEnji Cooper target_name = tmp_pathspec; 6234*132f818dSEnji Cooper tmp_pathspec = 0; 6235*132f818dSEnji Cooper 6236*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, 6237*132f818dSEnji Cooper "(main) libtool target name: %s\n", 6238*132f818dSEnji Cooper target_name); 6239*132f818dSEnji CooperEOF 6240*132f818dSEnji Cooper 6241*132f818dSEnji Cooper cat <<EOF 6242*132f818dSEnji Cooper newargz[0] = 6243*132f818dSEnji Cooper XMALLOC (char, (strlen (actual_cwrapper_path) + 6244*132f818dSEnji Cooper strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1)); 6245*132f818dSEnji Cooper strcpy (newargz[0], actual_cwrapper_path); 6246*132f818dSEnji Cooper strcat (newargz[0], "$objdir"); 6247*132f818dSEnji Cooper strcat (newargz[0], "/"); 6248*132f818dSEnji CooperEOF 6249*132f818dSEnji Cooper 6250*132f818dSEnji Cooper cat <<"EOF" 6251*132f818dSEnji Cooper /* stop here, and copy so we don't have to do this twice */ 6252*132f818dSEnji Cooper tmp_pathspec = xstrdup (newargz[0]); 6253*132f818dSEnji Cooper 6254*132f818dSEnji Cooper /* do NOT want the lt- prefix here, so use actual_cwrapper_name */ 6255*132f818dSEnji Cooper strcat (newargz[0], actual_cwrapper_name); 6256*132f818dSEnji Cooper 6257*132f818dSEnji Cooper /* DO want the lt- prefix here if it exists, so use target_name */ 6258*132f818dSEnji Cooper lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1); 6259*132f818dSEnji Cooper XFREE (tmp_pathspec); 6260*132f818dSEnji Cooper tmp_pathspec = NULL; 6261*132f818dSEnji CooperEOF 6262*132f818dSEnji Cooper 6263*132f818dSEnji Cooper case $host_os in 6264*132f818dSEnji Cooper mingw* | windows*) 6265*132f818dSEnji Cooper cat <<"EOF" 6266*132f818dSEnji Cooper { 6267*132f818dSEnji Cooper char* p; 6268*132f818dSEnji Cooper while ((p = strchr (newargz[0], '\\')) != NULL) 6269*132f818dSEnji Cooper { 6270*132f818dSEnji Cooper *p = '/'; 6271*132f818dSEnji Cooper } 6272*132f818dSEnji Cooper while ((p = strchr (lt_argv_zero, '\\')) != NULL) 6273*132f818dSEnji Cooper { 6274*132f818dSEnji Cooper *p = '/'; 6275*132f818dSEnji Cooper } 6276*132f818dSEnji Cooper } 6277*132f818dSEnji CooperEOF 6278*132f818dSEnji Cooper ;; 6279*132f818dSEnji Cooper esac 6280*132f818dSEnji Cooper 6281*132f818dSEnji Cooper cat <<"EOF" 6282*132f818dSEnji Cooper XFREE (target_name); 6283*132f818dSEnji Cooper XFREE (actual_cwrapper_path); 6284*132f818dSEnji Cooper XFREE (actual_cwrapper_name); 6285*132f818dSEnji Cooper 6286*132f818dSEnji Cooper lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */ 6287*132f818dSEnji Cooper lt_setenv ("DUALCASE", "1"); /* for MSK sh */ 6288*132f818dSEnji Cooper /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must 6289*132f818dSEnji Cooper be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath) 6290*132f818dSEnji Cooper because on Windows, both *_VARNAMEs are PATH but uninstalled 6291*132f818dSEnji Cooper libraries must come first. */ 6292*132f818dSEnji Cooper lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE); 6293*132f818dSEnji Cooper lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE); 6294*132f818dSEnji Cooper 6295*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n", 6296*132f818dSEnji Cooper nonnull (lt_argv_zero)); 6297*132f818dSEnji Cooper for (i = 0; i < newargc; i++) 6298*132f818dSEnji Cooper { 6299*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n", 6300*132f818dSEnji Cooper i, nonnull (newargz[i])); 6301*132f818dSEnji Cooper } 6302*132f818dSEnji Cooper 6303*132f818dSEnji CooperEOF 6304*132f818dSEnji Cooper 6305*132f818dSEnji Cooper case $host_os in 6306*132f818dSEnji Cooper mingw* | windows*) 6307*132f818dSEnji Cooper cat <<"EOF" 6308*132f818dSEnji Cooper /* execv doesn't actually work on mingw as expected on unix */ 6309*132f818dSEnji Cooper newargz = prepare_spawn (newargz); 6310*132f818dSEnji Cooper rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); 6311*132f818dSEnji Cooper if (rval == -1) 6312*132f818dSEnji Cooper { 6313*132f818dSEnji Cooper /* failed to start process */ 6314*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, 6315*132f818dSEnji Cooper "(main) failed to launch target \"%s\": %s\n", 6316*132f818dSEnji Cooper lt_argv_zero, nonnull (strerror (errno))); 6317*132f818dSEnji Cooper return 127; 6318*132f818dSEnji Cooper } 6319*132f818dSEnji Cooper return rval; 6320*132f818dSEnji CooperEOF 6321*132f818dSEnji Cooper ;; 6322*132f818dSEnji Cooper *) 6323*132f818dSEnji Cooper cat <<"EOF" 6324*132f818dSEnji Cooper execv (lt_argv_zero, newargz); 6325*132f818dSEnji Cooper return rval; /* =127, but avoids unused variable warning */ 6326*132f818dSEnji CooperEOF 6327*132f818dSEnji Cooper ;; 6328*132f818dSEnji Cooper esac 6329*132f818dSEnji Cooper 6330*132f818dSEnji Cooper cat <<"EOF" 6331*132f818dSEnji Cooper} 6332*132f818dSEnji Cooper 6333*132f818dSEnji Coopervoid * 6334*132f818dSEnji Cooperxmalloc (size_t num) 6335*132f818dSEnji Cooper{ 6336*132f818dSEnji Cooper void *p = (void *) malloc (num); 6337*132f818dSEnji Cooper if (!p) 6338*132f818dSEnji Cooper lt_fatal (__FILE__, __LINE__, "memory exhausted"); 6339*132f818dSEnji Cooper 6340*132f818dSEnji Cooper return p; 6341*132f818dSEnji Cooper} 6342*132f818dSEnji Cooper 6343*132f818dSEnji Cooperchar * 6344*132f818dSEnji Cooperxstrdup (const char *string) 6345*132f818dSEnji Cooper{ 6346*132f818dSEnji Cooper return string ? strcpy ((char *) xmalloc (strlen (string) + 1), 6347*132f818dSEnji Cooper string) : NULL; 6348*132f818dSEnji Cooper} 6349*132f818dSEnji Cooper 6350*132f818dSEnji Cooperconst char * 6351*132f818dSEnji Cooperbase_name (const char *name) 6352*132f818dSEnji Cooper{ 6353*132f818dSEnji Cooper const char *base; 6354*132f818dSEnji Cooper 6355*132f818dSEnji Cooper#if defined HAVE_DOS_BASED_FILE_SYSTEM 6356*132f818dSEnji Cooper /* Skip over the disk name in MSDOS pathnames. */ 6357*132f818dSEnji Cooper if (isalpha ((unsigned char) name[0]) && name[1] == ':') 6358*132f818dSEnji Cooper name += 2; 6359*132f818dSEnji Cooper#endif 6360*132f818dSEnji Cooper 6361*132f818dSEnji Cooper for (base = name; *name; name++) 6362*132f818dSEnji Cooper if (IS_DIR_SEPARATOR (*name)) 6363*132f818dSEnji Cooper base = name + 1; 6364*132f818dSEnji Cooper return base; 6365*132f818dSEnji Cooper} 6366*132f818dSEnji Cooper 6367*132f818dSEnji Cooperint 6368*132f818dSEnji Coopercheck_executable (const char *path) 6369*132f818dSEnji Cooper{ 6370*132f818dSEnji Cooper struct stat st; 6371*132f818dSEnji Cooper 6372*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n", 6373*132f818dSEnji Cooper nonempty (path)); 6374*132f818dSEnji Cooper if ((!path) || (!*path)) 6375*132f818dSEnji Cooper return 0; 6376*132f818dSEnji Cooper 6377*132f818dSEnji Cooper if ((stat (path, &st) >= 0) 6378*132f818dSEnji Cooper && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) 6379*132f818dSEnji Cooper return 1; 6380*132f818dSEnji Cooper else 6381*132f818dSEnji Cooper return 0; 6382*132f818dSEnji Cooper} 6383*132f818dSEnji Cooper 6384*132f818dSEnji Cooperint 6385*132f818dSEnji Coopermake_executable (const char *path) 6386*132f818dSEnji Cooper{ 6387*132f818dSEnji Cooper int rval = 0; 6388*132f818dSEnji Cooper struct stat st; 6389*132f818dSEnji Cooper 6390*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", 6391*132f818dSEnji Cooper nonempty (path)); 6392*132f818dSEnji Cooper if ((!path) || (!*path)) 6393*132f818dSEnji Cooper return 0; 6394*132f818dSEnji Cooper 6395*132f818dSEnji Cooper if (stat (path, &st) >= 0) 6396*132f818dSEnji Cooper { 6397*132f818dSEnji Cooper rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); 6398*132f818dSEnji Cooper } 6399*132f818dSEnji Cooper return rval; 6400*132f818dSEnji Cooper} 6401*132f818dSEnji Cooper 6402*132f818dSEnji Cooper/* Searches for the full path of the wrapper. Returns 6403*132f818dSEnji Cooper newly allocated full path name if found, NULL otherwise 6404*132f818dSEnji Cooper Does not chase symlinks, even on platforms that support them. 6405*132f818dSEnji Cooper*/ 6406*132f818dSEnji Cooperchar * 6407*132f818dSEnji Cooperfind_executable (const char *wrapper) 6408*132f818dSEnji Cooper{ 6409*132f818dSEnji Cooper int has_slash = 0; 6410*132f818dSEnji Cooper const char *p; 6411*132f818dSEnji Cooper const char *p_next; 6412*132f818dSEnji Cooper /* static buffer for getcwd */ 6413*132f818dSEnji Cooper char tmp[LT_PATHMAX + 1]; 6414*132f818dSEnji Cooper size_t tmp_len; 6415*132f818dSEnji Cooper char *concat_name; 6416*132f818dSEnji Cooper 6417*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", 6418*132f818dSEnji Cooper nonempty (wrapper)); 6419*132f818dSEnji Cooper 6420*132f818dSEnji Cooper if ((wrapper == NULL) || (*wrapper == '\0')) 6421*132f818dSEnji Cooper return NULL; 6422*132f818dSEnji Cooper 6423*132f818dSEnji Cooper /* Absolute path? */ 6424*132f818dSEnji Cooper#if defined HAVE_DOS_BASED_FILE_SYSTEM 6425*132f818dSEnji Cooper if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') 6426*132f818dSEnji Cooper { 6427*132f818dSEnji Cooper concat_name = xstrdup (wrapper); 6428*132f818dSEnji Cooper if (check_executable (concat_name)) 6429*132f818dSEnji Cooper return concat_name; 6430*132f818dSEnji Cooper XFREE (concat_name); 6431*132f818dSEnji Cooper } 6432*132f818dSEnji Cooper else 6433*132f818dSEnji Cooper { 6434*132f818dSEnji Cooper#endif 6435*132f818dSEnji Cooper if (IS_DIR_SEPARATOR (wrapper[0])) 6436*132f818dSEnji Cooper { 6437*132f818dSEnji Cooper concat_name = xstrdup (wrapper); 6438*132f818dSEnji Cooper if (check_executable (concat_name)) 6439*132f818dSEnji Cooper return concat_name; 6440*132f818dSEnji Cooper XFREE (concat_name); 6441*132f818dSEnji Cooper } 6442*132f818dSEnji Cooper#if defined HAVE_DOS_BASED_FILE_SYSTEM 6443*132f818dSEnji Cooper } 6444*132f818dSEnji Cooper#endif 6445*132f818dSEnji Cooper 6446*132f818dSEnji Cooper for (p = wrapper; *p; p++) 6447*132f818dSEnji Cooper if (*p == '/') 6448*132f818dSEnji Cooper { 6449*132f818dSEnji Cooper has_slash = 1; 6450*132f818dSEnji Cooper break; 6451*132f818dSEnji Cooper } 6452*132f818dSEnji Cooper if (!has_slash) 6453*132f818dSEnji Cooper { 6454*132f818dSEnji Cooper /* no slashes; search PATH */ 6455*132f818dSEnji Cooper const char *path = getenv ("PATH"); 6456*132f818dSEnji Cooper if (path != NULL) 6457*132f818dSEnji Cooper { 6458*132f818dSEnji Cooper for (p = path; *p; p = p_next) 6459*132f818dSEnji Cooper { 6460*132f818dSEnji Cooper const char *q; 6461*132f818dSEnji Cooper size_t p_len; 6462*132f818dSEnji Cooper for (q = p; *q; q++) 6463*132f818dSEnji Cooper if (IS_PATH_SEPARATOR (*q)) 6464*132f818dSEnji Cooper break; 6465*132f818dSEnji Cooper p_len = (size_t) (q - p); 6466*132f818dSEnji Cooper p_next = (*q == '\0' ? q : q + 1); 6467*132f818dSEnji Cooper if (p_len == 0) 6468*132f818dSEnji Cooper { 6469*132f818dSEnji Cooper /* empty path: current directory */ 6470*132f818dSEnji Cooper if (getcwd (tmp, LT_PATHMAX) == NULL) 6471*132f818dSEnji Cooper lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", 6472*132f818dSEnji Cooper nonnull (strerror (errno))); 6473*132f818dSEnji Cooper tmp_len = strlen (tmp); 6474*132f818dSEnji Cooper concat_name = 6475*132f818dSEnji Cooper XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); 6476*132f818dSEnji Cooper memcpy (concat_name, tmp, tmp_len); 6477*132f818dSEnji Cooper concat_name[tmp_len] = '/'; 6478*132f818dSEnji Cooper strcpy (concat_name + tmp_len + 1, wrapper); 6479*132f818dSEnji Cooper } 6480*132f818dSEnji Cooper else 6481*132f818dSEnji Cooper { 6482*132f818dSEnji Cooper concat_name = 6483*132f818dSEnji Cooper XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); 6484*132f818dSEnji Cooper memcpy (concat_name, p, p_len); 6485*132f818dSEnji Cooper concat_name[p_len] = '/'; 6486*132f818dSEnji Cooper strcpy (concat_name + p_len + 1, wrapper); 6487*132f818dSEnji Cooper } 6488*132f818dSEnji Cooper if (check_executable (concat_name)) 6489*132f818dSEnji Cooper return concat_name; 6490*132f818dSEnji Cooper XFREE (concat_name); 6491*132f818dSEnji Cooper } 6492*132f818dSEnji Cooper } 6493*132f818dSEnji Cooper /* not found in PATH; assume curdir */ 6494*132f818dSEnji Cooper } 6495*132f818dSEnji Cooper /* Relative path | not found in path: prepend cwd */ 6496*132f818dSEnji Cooper if (getcwd (tmp, LT_PATHMAX) == NULL) 6497*132f818dSEnji Cooper lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", 6498*132f818dSEnji Cooper nonnull (strerror (errno))); 6499*132f818dSEnji Cooper tmp_len = strlen (tmp); 6500*132f818dSEnji Cooper concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); 6501*132f818dSEnji Cooper memcpy (concat_name, tmp, tmp_len); 6502*132f818dSEnji Cooper concat_name[tmp_len] = '/'; 6503*132f818dSEnji Cooper strcpy (concat_name + tmp_len + 1, wrapper); 6504*132f818dSEnji Cooper 6505*132f818dSEnji Cooper if (check_executable (concat_name)) 6506*132f818dSEnji Cooper return concat_name; 6507*132f818dSEnji Cooper XFREE (concat_name); 6508*132f818dSEnji Cooper return NULL; 6509*132f818dSEnji Cooper} 6510*132f818dSEnji Cooper 6511*132f818dSEnji Cooperchar * 6512*132f818dSEnji Cooperchase_symlinks (const char *pathspec) 6513*132f818dSEnji Cooper{ 6514*132f818dSEnji Cooper#ifndef S_ISLNK 6515*132f818dSEnji Cooper return xstrdup (pathspec); 6516*132f818dSEnji Cooper#else 6517*132f818dSEnji Cooper char buf[LT_PATHMAX]; 6518*132f818dSEnji Cooper struct stat s; 6519*132f818dSEnji Cooper char *tmp_pathspec = xstrdup (pathspec); 6520*132f818dSEnji Cooper char *p; 6521*132f818dSEnji Cooper int has_symlinks = 0; 6522*132f818dSEnji Cooper while (strlen (tmp_pathspec) && !has_symlinks) 6523*132f818dSEnji Cooper { 6524*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, 6525*132f818dSEnji Cooper "checking path component for symlinks: %s\n", 6526*132f818dSEnji Cooper tmp_pathspec); 6527*132f818dSEnji Cooper if (lstat (tmp_pathspec, &s) == 0) 6528*132f818dSEnji Cooper { 6529*132f818dSEnji Cooper if (S_ISLNK (s.st_mode) != 0) 6530*132f818dSEnji Cooper { 6531*132f818dSEnji Cooper has_symlinks = 1; 6532*132f818dSEnji Cooper break; 6533*132f818dSEnji Cooper } 6534*132f818dSEnji Cooper 6535*132f818dSEnji Cooper /* search backwards for last DIR_SEPARATOR */ 6536*132f818dSEnji Cooper p = tmp_pathspec + strlen (tmp_pathspec) - 1; 6537*132f818dSEnji Cooper while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) 6538*132f818dSEnji Cooper p--; 6539*132f818dSEnji Cooper if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) 6540*132f818dSEnji Cooper { 6541*132f818dSEnji Cooper /* no more DIR_SEPARATORS left */ 6542*132f818dSEnji Cooper break; 6543*132f818dSEnji Cooper } 6544*132f818dSEnji Cooper *p = '\0'; 6545*132f818dSEnji Cooper } 6546*132f818dSEnji Cooper else 6547*132f818dSEnji Cooper { 6548*132f818dSEnji Cooper lt_fatal (__FILE__, __LINE__, 6549*132f818dSEnji Cooper "error accessing file \"%s\": %s", 6550*132f818dSEnji Cooper tmp_pathspec, nonnull (strerror (errno))); 6551*132f818dSEnji Cooper } 6552*132f818dSEnji Cooper } 6553*132f818dSEnji Cooper XFREE (tmp_pathspec); 6554*132f818dSEnji Cooper 6555*132f818dSEnji Cooper if (!has_symlinks) 6556*132f818dSEnji Cooper { 6557*132f818dSEnji Cooper return xstrdup (pathspec); 6558*132f818dSEnji Cooper } 6559*132f818dSEnji Cooper 6560*132f818dSEnji Cooper tmp_pathspec = realpath (pathspec, buf); 6561*132f818dSEnji Cooper if (tmp_pathspec == 0) 6562*132f818dSEnji Cooper { 6563*132f818dSEnji Cooper lt_fatal (__FILE__, __LINE__, 6564*132f818dSEnji Cooper "could not follow symlinks for %s", pathspec); 6565*132f818dSEnji Cooper } 6566*132f818dSEnji Cooper return xstrdup (tmp_pathspec); 6567*132f818dSEnji Cooper#endif 6568*132f818dSEnji Cooper} 6569*132f818dSEnji Cooper 6570*132f818dSEnji Cooperchar * 6571*132f818dSEnji Cooperstrendzap (char *str, const char *pat) 6572*132f818dSEnji Cooper{ 6573*132f818dSEnji Cooper size_t len, patlen; 6574*132f818dSEnji Cooper 6575*132f818dSEnji Cooper assert (str != NULL); 6576*132f818dSEnji Cooper assert (pat != NULL); 6577*132f818dSEnji Cooper 6578*132f818dSEnji Cooper len = strlen (str); 6579*132f818dSEnji Cooper patlen = strlen (pat); 6580*132f818dSEnji Cooper 6581*132f818dSEnji Cooper if (patlen <= len) 6582*132f818dSEnji Cooper { 6583*132f818dSEnji Cooper str += len - patlen; 6584*132f818dSEnji Cooper if (STREQ (str, pat)) 6585*132f818dSEnji Cooper *str = '\0'; 6586*132f818dSEnji Cooper } 6587*132f818dSEnji Cooper return str; 6588*132f818dSEnji Cooper} 6589*132f818dSEnji Cooper 6590*132f818dSEnji Coopervoid 6591*132f818dSEnji Cooperlt_debugprintf (const char *file, int line, const char *fmt, ...) 6592*132f818dSEnji Cooper{ 6593*132f818dSEnji Cooper va_list args; 6594*132f818dSEnji Cooper if (lt_debug) 6595*132f818dSEnji Cooper { 6596*132f818dSEnji Cooper (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); 6597*132f818dSEnji Cooper va_start (args, fmt); 6598*132f818dSEnji Cooper (void) vfprintf (stderr, fmt, args); 6599*132f818dSEnji Cooper va_end (args); 6600*132f818dSEnji Cooper } 6601*132f818dSEnji Cooper} 6602*132f818dSEnji Cooper 6603*132f818dSEnji Cooperstatic void 6604*132f818dSEnji Cooperlt_error_core (int exit_status, const char *file, 6605*132f818dSEnji Cooper int line, const char *mode, 6606*132f818dSEnji Cooper const char *message, va_list ap) 6607*132f818dSEnji Cooper{ 6608*132f818dSEnji Cooper fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); 6609*132f818dSEnji Cooper vfprintf (stderr, message, ap); 6610*132f818dSEnji Cooper fprintf (stderr, ".\n"); 6611*132f818dSEnji Cooper 6612*132f818dSEnji Cooper if (exit_status >= 0) 6613*132f818dSEnji Cooper exit (exit_status); 6614*132f818dSEnji Cooper} 6615*132f818dSEnji Cooper 6616*132f818dSEnji Coopervoid 6617*132f818dSEnji Cooperlt_fatal (const char *file, int line, const char *message, ...) 6618*132f818dSEnji Cooper{ 6619*132f818dSEnji Cooper va_list ap; 6620*132f818dSEnji Cooper va_start (ap, message); 6621*132f818dSEnji Cooper lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); 6622*132f818dSEnji Cooper va_end (ap); 6623*132f818dSEnji Cooper} 6624*132f818dSEnji Cooper 6625*132f818dSEnji Cooperstatic const char * 6626*132f818dSEnji Coopernonnull (const char *s) 6627*132f818dSEnji Cooper{ 6628*132f818dSEnji Cooper return s ? s : "(null)"; 6629*132f818dSEnji Cooper} 6630*132f818dSEnji Cooper 6631*132f818dSEnji Cooperstatic const char * 6632*132f818dSEnji Coopernonempty (const char *s) 6633*132f818dSEnji Cooper{ 6634*132f818dSEnji Cooper return (s && !*s) ? "(empty)" : nonnull (s); 6635*132f818dSEnji Cooper} 6636*132f818dSEnji Cooper 6637*132f818dSEnji Coopervoid 6638*132f818dSEnji Cooperlt_setenv (const char *name, const char *value) 6639*132f818dSEnji Cooper{ 6640*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, 6641*132f818dSEnji Cooper "(lt_setenv) setting '%s' to '%s'\n", 6642*132f818dSEnji Cooper nonnull (name), nonnull (value)); 6643*132f818dSEnji Cooper { 6644*132f818dSEnji Cooper#ifdef HAVE_SETENV 6645*132f818dSEnji Cooper /* always make a copy, for consistency with !HAVE_SETENV */ 6646*132f818dSEnji Cooper char *str = xstrdup (value); 6647*132f818dSEnji Cooper setenv (name, str, 1); 6648*132f818dSEnji Cooper#else 6649*132f818dSEnji Cooper size_t len = strlen (name) + 1 + strlen (value) + 1; 6650*132f818dSEnji Cooper char *str = XMALLOC (char, len); 6651*132f818dSEnji Cooper sprintf (str, "%s=%s", name, value); 6652*132f818dSEnji Cooper if (putenv (str) != EXIT_SUCCESS) 6653*132f818dSEnji Cooper { 6654*132f818dSEnji Cooper XFREE (str); 6655*132f818dSEnji Cooper } 6656*132f818dSEnji Cooper#endif 6657*132f818dSEnji Cooper } 6658*132f818dSEnji Cooper} 6659*132f818dSEnji Cooper 6660*132f818dSEnji Cooperchar * 6661*132f818dSEnji Cooperlt_extend_str (const char *orig_value, const char *add, int to_end) 6662*132f818dSEnji Cooper{ 6663*132f818dSEnji Cooper char *new_value; 6664*132f818dSEnji Cooper if (orig_value && *orig_value) 6665*132f818dSEnji Cooper { 6666*132f818dSEnji Cooper size_t orig_value_len = strlen (orig_value); 6667*132f818dSEnji Cooper size_t add_len = strlen (add); 6668*132f818dSEnji Cooper new_value = XMALLOC (char, add_len + orig_value_len + 1); 6669*132f818dSEnji Cooper if (to_end) 6670*132f818dSEnji Cooper { 6671*132f818dSEnji Cooper strcpy (new_value, orig_value); 6672*132f818dSEnji Cooper strcpy (new_value + orig_value_len, add); 6673*132f818dSEnji Cooper } 6674*132f818dSEnji Cooper else 6675*132f818dSEnji Cooper { 6676*132f818dSEnji Cooper strcpy (new_value, add); 6677*132f818dSEnji Cooper strcpy (new_value + add_len, orig_value); 6678*132f818dSEnji Cooper } 6679*132f818dSEnji Cooper } 6680*132f818dSEnji Cooper else 6681*132f818dSEnji Cooper { 6682*132f818dSEnji Cooper new_value = xstrdup (add); 6683*132f818dSEnji Cooper } 6684*132f818dSEnji Cooper return new_value; 6685*132f818dSEnji Cooper} 6686*132f818dSEnji Cooper 6687*132f818dSEnji Coopervoid 6688*132f818dSEnji Cooperlt_update_exe_path (const char *name, const char *value) 6689*132f818dSEnji Cooper{ 6690*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, 6691*132f818dSEnji Cooper "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", 6692*132f818dSEnji Cooper nonnull (name), nonnull (value)); 6693*132f818dSEnji Cooper 6694*132f818dSEnji Cooper if (name && *name && value && *value) 6695*132f818dSEnji Cooper { 6696*132f818dSEnji Cooper char *new_value = lt_extend_str (getenv (name), value, 0); 6697*132f818dSEnji Cooper /* some systems can't cope with a ':'-terminated path #' */ 6698*132f818dSEnji Cooper size_t len = strlen (new_value); 6699*132f818dSEnji Cooper while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) 6700*132f818dSEnji Cooper { 6701*132f818dSEnji Cooper new_value[--len] = '\0'; 6702*132f818dSEnji Cooper } 6703*132f818dSEnji Cooper lt_setenv (name, new_value); 6704*132f818dSEnji Cooper XFREE (new_value); 6705*132f818dSEnji Cooper } 6706*132f818dSEnji Cooper} 6707*132f818dSEnji Cooper 6708*132f818dSEnji Coopervoid 6709*132f818dSEnji Cooperlt_update_lib_path (const char *name, const char *value) 6710*132f818dSEnji Cooper{ 6711*132f818dSEnji Cooper lt_debugprintf (__FILE__, __LINE__, 6712*132f818dSEnji Cooper "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", 6713*132f818dSEnji Cooper nonnull (name), nonnull (value)); 6714*132f818dSEnji Cooper 6715*132f818dSEnji Cooper if (name && *name && value && *value) 6716*132f818dSEnji Cooper { 6717*132f818dSEnji Cooper char *new_value = lt_extend_str (getenv (name), value, 0); 6718*132f818dSEnji Cooper lt_setenv (name, new_value); 6719*132f818dSEnji Cooper XFREE (new_value); 6720*132f818dSEnji Cooper } 6721*132f818dSEnji Cooper} 6722*132f818dSEnji Cooper 6723*132f818dSEnji CooperEOF 6724*132f818dSEnji Cooper case $host_os in 6725*132f818dSEnji Cooper mingw* | windows*) 6726*132f818dSEnji Cooper cat <<"EOF" 6727*132f818dSEnji Cooper 6728*132f818dSEnji Cooper/* Prepares an argument vector before calling spawn(). 6729*132f818dSEnji Cooper Note that spawn() does not by itself call the command interpreter 6730*132f818dSEnji Cooper (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : 6731*132f818dSEnji Cooper ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 6732*132f818dSEnji Cooper GetVersionEx(&v); 6733*132f818dSEnji Cooper v.dwPlatformId == VER_PLATFORM_WIN32_NT; 6734*132f818dSEnji Cooper }) ? "cmd.exe" : "command.com"). 6735*132f818dSEnji Cooper Instead it simply concatenates the arguments, separated by ' ', and calls 6736*132f818dSEnji Cooper CreateProcess(). We must quote the arguments since Win32 CreateProcess() 6737*132f818dSEnji Cooper interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a 6738*132f818dSEnji Cooper special way: 6739*132f818dSEnji Cooper - Space and tab are interpreted as delimiters. They are not treated as 6740*132f818dSEnji Cooper delimiters if they are surrounded by double quotes: "...". 6741*132f818dSEnji Cooper - Unescaped double quotes are removed from the input. Their only effect is 6742*132f818dSEnji Cooper that within double quotes, space and tab are treated like normal 6743*132f818dSEnji Cooper characters. 6744*132f818dSEnji Cooper - Backslashes not followed by double quotes are not special. 6745*132f818dSEnji Cooper - But 2*n+1 backslashes followed by a double quote become 6746*132f818dSEnji Cooper n backslashes followed by a double quote (n >= 0): 6747*132f818dSEnji Cooper \" -> " 6748*132f818dSEnji Cooper \\\" -> \" 6749*132f818dSEnji Cooper \\\\\" -> \\" 6750*132f818dSEnji Cooper */ 6751*132f818dSEnji Cooper#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" 6752*132f818dSEnji Cooper#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" 6753*132f818dSEnji Cooperchar ** 6754*132f818dSEnji Cooperprepare_spawn (char **argv) 6755*132f818dSEnji Cooper{ 6756*132f818dSEnji Cooper size_t argc; 6757*132f818dSEnji Cooper char **new_argv; 6758*132f818dSEnji Cooper size_t i; 6759*132f818dSEnji Cooper 6760*132f818dSEnji Cooper /* Count number of arguments. */ 6761*132f818dSEnji Cooper for (argc = 0; argv[argc] != NULL; argc++) 6762*132f818dSEnji Cooper ; 6763*132f818dSEnji Cooper 6764*132f818dSEnji Cooper /* Allocate new argument vector. */ 6765*132f818dSEnji Cooper new_argv = XMALLOC (char *, argc + 1); 6766*132f818dSEnji Cooper 6767*132f818dSEnji Cooper /* Put quoted arguments into the new argument vector. */ 6768*132f818dSEnji Cooper for (i = 0; i < argc; i++) 6769*132f818dSEnji Cooper { 6770*132f818dSEnji Cooper const char *string = argv[i]; 6771*132f818dSEnji Cooper 6772*132f818dSEnji Cooper if (string[0] == '\0') 6773*132f818dSEnji Cooper new_argv[i] = xstrdup ("\"\""); 6774*132f818dSEnji Cooper else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) 6775*132f818dSEnji Cooper { 6776*132f818dSEnji Cooper int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); 6777*132f818dSEnji Cooper size_t length; 6778*132f818dSEnji Cooper unsigned int backslashes; 6779*132f818dSEnji Cooper const char *s; 6780*132f818dSEnji Cooper char *quoted_string; 6781*132f818dSEnji Cooper char *p; 6782*132f818dSEnji Cooper 6783*132f818dSEnji Cooper length = 0; 6784*132f818dSEnji Cooper backslashes = 0; 6785*132f818dSEnji Cooper if (quote_around) 6786*132f818dSEnji Cooper length++; 6787*132f818dSEnji Cooper for (s = string; *s != '\0'; s++) 6788*132f818dSEnji Cooper { 6789*132f818dSEnji Cooper char c = *s; 6790*132f818dSEnji Cooper if (c == '"') 6791*132f818dSEnji Cooper length += backslashes + 1; 6792*132f818dSEnji Cooper length++; 6793*132f818dSEnji Cooper if (c == '\\') 6794*132f818dSEnji Cooper backslashes++; 6795*132f818dSEnji Cooper else 6796*132f818dSEnji Cooper backslashes = 0; 6797*132f818dSEnji Cooper } 6798*132f818dSEnji Cooper if (quote_around) 6799*132f818dSEnji Cooper length += backslashes + 1; 6800*132f818dSEnji Cooper 6801*132f818dSEnji Cooper quoted_string = XMALLOC (char, length + 1); 6802*132f818dSEnji Cooper 6803*132f818dSEnji Cooper p = quoted_string; 6804*132f818dSEnji Cooper backslashes = 0; 6805*132f818dSEnji Cooper if (quote_around) 6806*132f818dSEnji Cooper *p++ = '"'; 6807*132f818dSEnji Cooper for (s = string; *s != '\0'; s++) 6808*132f818dSEnji Cooper { 6809*132f818dSEnji Cooper char c = *s; 6810*132f818dSEnji Cooper if (c == '"') 6811*132f818dSEnji Cooper { 6812*132f818dSEnji Cooper unsigned int j; 6813*132f818dSEnji Cooper for (j = backslashes + 1; j > 0; j--) 6814*132f818dSEnji Cooper *p++ = '\\'; 6815*132f818dSEnji Cooper } 6816*132f818dSEnji Cooper *p++ = c; 6817*132f818dSEnji Cooper if (c == '\\') 6818*132f818dSEnji Cooper backslashes++; 6819*132f818dSEnji Cooper else 6820*132f818dSEnji Cooper backslashes = 0; 6821*132f818dSEnji Cooper } 6822*132f818dSEnji Cooper if (quote_around) 6823*132f818dSEnji Cooper { 6824*132f818dSEnji Cooper unsigned int j; 6825*132f818dSEnji Cooper for (j = backslashes; j > 0; j--) 6826*132f818dSEnji Cooper *p++ = '\\'; 6827*132f818dSEnji Cooper *p++ = '"'; 6828*132f818dSEnji Cooper } 6829*132f818dSEnji Cooper *p = '\0'; 6830*132f818dSEnji Cooper 6831*132f818dSEnji Cooper new_argv[i] = quoted_string; 6832*132f818dSEnji Cooper } 6833*132f818dSEnji Cooper else 6834*132f818dSEnji Cooper new_argv[i] = (char *) string; 6835*132f818dSEnji Cooper } 6836*132f818dSEnji Cooper new_argv[argc] = NULL; 6837*132f818dSEnji Cooper 6838*132f818dSEnji Cooper return new_argv; 6839*132f818dSEnji Cooper} 6840*132f818dSEnji CooperEOF 6841*132f818dSEnji Cooper ;; 6842*132f818dSEnji Cooper esac 6843*132f818dSEnji Cooper 6844*132f818dSEnji Cooper cat <<"EOF" 6845*132f818dSEnji Coopervoid lt_dump_script (FILE* f) 6846*132f818dSEnji Cooper{ 6847*132f818dSEnji CooperEOF 6848*132f818dSEnji Cooper func_emit_wrapper yes | 6849*132f818dSEnji Cooper $SED -n -e ' 6850*132f818dSEnji Coopers/^\(.\{79\}\)\(..*\)/\1\ 6851*132f818dSEnji Cooper\2/ 6852*132f818dSEnji Cooperh 6853*132f818dSEnji Coopers/\([\\"]\)/\\\1/g 6854*132f818dSEnji Coopers/$/\\n/ 6855*132f818dSEnji Coopers/\([^\n]*\).*/ fputs ("\1", f);/p 6856*132f818dSEnji Cooperg 6857*132f818dSEnji CooperD' 6858*132f818dSEnji Cooper cat <<"EOF" 6859*132f818dSEnji Cooper} 6860*132f818dSEnji CooperEOF 6861*132f818dSEnji Cooper} 6862*132f818dSEnji Cooper# end: func_emit_cwrapperexe_src 6863*132f818dSEnji Cooper 6864*132f818dSEnji Cooper# func_win32_import_lib_p ARG 6865*132f818dSEnji Cooper# True if ARG is an import lib, as indicated by $file_magic_cmd 6866*132f818dSEnji Cooperfunc_win32_import_lib_p () 6867*132f818dSEnji Cooper{ 6868*132f818dSEnji Cooper $debug_cmd 6869*132f818dSEnji Cooper 6870*132f818dSEnji Cooper case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in 6871*132f818dSEnji Cooper *import*) : ;; 6872*132f818dSEnji Cooper *) false ;; 6873*132f818dSEnji Cooper esac 6874*132f818dSEnji Cooper} 6875*132f818dSEnji Cooper 6876*132f818dSEnji Cooper# func_suncc_cstd_abi 6877*132f818dSEnji Cooper# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! 6878*132f818dSEnji Cooper# Several compiler flags select an ABI that is incompatible with the 6879*132f818dSEnji Cooper# Cstd library. Avoid specifying it if any are in CXXFLAGS. 6880*132f818dSEnji Cooperfunc_suncc_cstd_abi () 6881*132f818dSEnji Cooper{ 6882*132f818dSEnji Cooper $debug_cmd 6883*132f818dSEnji Cooper 6884*132f818dSEnji Cooper case " $compile_command " in 6885*132f818dSEnji Cooper *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) 6886*132f818dSEnji Cooper suncc_use_cstd_abi=no 6887*132f818dSEnji Cooper ;; 6888*132f818dSEnji Cooper *) 6889*132f818dSEnji Cooper suncc_use_cstd_abi=yes 6890*132f818dSEnji Cooper ;; 6891*132f818dSEnji Cooper esac 6892*132f818dSEnji Cooper} 6893*132f818dSEnji Cooper 6894*132f818dSEnji Cooper# func_mode_link arg... 6895*132f818dSEnji Cooperfunc_mode_link () 6896*132f818dSEnji Cooper{ 6897*132f818dSEnji Cooper $debug_cmd 6898*132f818dSEnji Cooper 6899*132f818dSEnji Cooper case $host in 6900*132f818dSEnji Cooper *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) 6901*132f818dSEnji Cooper # It is impossible to link a dll without this setting, and 6902*132f818dSEnji Cooper # we shouldn't force the makefile maintainer to figure out 6903*132f818dSEnji Cooper # what system we are compiling for in order to pass an extra 6904*132f818dSEnji Cooper # flag for every libtool invocation. 6905*132f818dSEnji Cooper # allow_undefined=no 6906*132f818dSEnji Cooper 6907*132f818dSEnji Cooper # FIXME: Unfortunately, there are problems with the above when trying 6908*132f818dSEnji Cooper # to make a dll that has undefined symbols, in which case not 6909*132f818dSEnji Cooper # even a static library is built. For now, we need to specify 6910*132f818dSEnji Cooper # -no-undefined on the libtool link line when we can be certain 6911*132f818dSEnji Cooper # that all symbols are satisfied, otherwise we get a static library. 6912*132f818dSEnji Cooper allow_undefined=yes 6913*132f818dSEnji Cooper ;; 6914*132f818dSEnji Cooper *) 6915*132f818dSEnji Cooper allow_undefined=yes 6916*132f818dSEnji Cooper ;; 6917*132f818dSEnji Cooper esac 6918*132f818dSEnji Cooper libtool_args=$nonopt 6919*132f818dSEnji Cooper base_compile="$nonopt $@" 6920*132f818dSEnji Cooper compile_command=$nonopt 6921*132f818dSEnji Cooper finalize_command=$nonopt 6922*132f818dSEnji Cooper 6923*132f818dSEnji Cooper compile_rpath= 6924*132f818dSEnji Cooper compile_rpath_tail= 6925*132f818dSEnji Cooper finalize_rpath= 6926*132f818dSEnji Cooper compile_shlibpath= 6927*132f818dSEnji Cooper finalize_shlibpath= 6928*132f818dSEnji Cooper convenience= 6929*132f818dSEnji Cooper old_convenience= 6930*132f818dSEnji Cooper deplibs= 6931*132f818dSEnji Cooper old_deplibs= 6932*132f818dSEnji Cooper compiler_flags= 6933*132f818dSEnji Cooper linker_flags= 6934*132f818dSEnji Cooper dllsearchpath= 6935*132f818dSEnji Cooper lib_search_path=`pwd` 6936*132f818dSEnji Cooper inst_prefix_dir= 6937*132f818dSEnji Cooper new_inherited_linker_flags= 6938*132f818dSEnji Cooper 6939*132f818dSEnji Cooper avoid_version=no 6940*132f818dSEnji Cooper bindir= 6941*132f818dSEnji Cooper dlfiles= 6942*132f818dSEnji Cooper dlprefiles= 6943*132f818dSEnji Cooper dlself=no 6944*132f818dSEnji Cooper export_dynamic=no 6945*132f818dSEnji Cooper export_symbols= 6946*132f818dSEnji Cooper export_symbols_regex= 6947*132f818dSEnji Cooper generated= 6948*132f818dSEnji Cooper libobjs= 6949*132f818dSEnji Cooper ltlibs= 6950*132f818dSEnji Cooper module=no 6951*132f818dSEnji Cooper no_install=no 6952*132f818dSEnji Cooper objs= 6953*132f818dSEnji Cooper os2dllname= 6954*132f818dSEnji Cooper non_pic_objects= 6955*132f818dSEnji Cooper precious_files_regex= 6956*132f818dSEnji Cooper prefer_static_libs=no 6957*132f818dSEnji Cooper preload=false 6958*132f818dSEnji Cooper prev= 6959*132f818dSEnji Cooper prevarg= 6960*132f818dSEnji Cooper release= 6961*132f818dSEnji Cooper rpath= 6962*132f818dSEnji Cooper xrpath= 6963*132f818dSEnji Cooper perm_rpath= 6964*132f818dSEnji Cooper temp_rpath= 6965*132f818dSEnji Cooper temp_rpath_tail= 6966*132f818dSEnji Cooper thread_safe=no 6967*132f818dSEnji Cooper vinfo= 6968*132f818dSEnji Cooper vinfo_number=no 6969*132f818dSEnji Cooper weak_libs= 6970*132f818dSEnji Cooper rpath_arg= 6971*132f818dSEnji Cooper single_module=$wl-single_module 6972*132f818dSEnji Cooper func_infer_tag $base_compile 6973*132f818dSEnji Cooper 6974*132f818dSEnji Cooper # We need to know -static, to get the right output filenames. 6975*132f818dSEnji Cooper for arg 6976*132f818dSEnji Cooper do 6977*132f818dSEnji Cooper case $arg in 6978*132f818dSEnji Cooper -shared) 6979*132f818dSEnji Cooper test yes != "$build_libtool_libs" \ 6980*132f818dSEnji Cooper && func_fatal_configuration "cannot build a shared library" 6981*132f818dSEnji Cooper build_old_libs=no 6982*132f818dSEnji Cooper break 6983*132f818dSEnji Cooper ;; 6984*132f818dSEnji Cooper -all-static | -static | -static-libtool-libs) 6985*132f818dSEnji Cooper case $arg in 6986*132f818dSEnji Cooper -all-static) 6987*132f818dSEnji Cooper if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then 6988*132f818dSEnji Cooper func_warning "complete static linking is impossible in this configuration" 6989*132f818dSEnji Cooper fi 6990*132f818dSEnji Cooper if test -n "$link_static_flag"; then 6991*132f818dSEnji Cooper dlopen_self=$dlopen_self_static 6992*132f818dSEnji Cooper fi 6993*132f818dSEnji Cooper prefer_static_libs=yes 6994*132f818dSEnji Cooper ;; 6995*132f818dSEnji Cooper -static) 6996*132f818dSEnji Cooper if test -z "$pic_flag" && test -n "$link_static_flag"; then 6997*132f818dSEnji Cooper dlopen_self=$dlopen_self_static 6998*132f818dSEnji Cooper fi 6999*132f818dSEnji Cooper prefer_static_libs=built 7000*132f818dSEnji Cooper ;; 7001*132f818dSEnji Cooper -static-libtool-libs) 7002*132f818dSEnji Cooper if test -z "$pic_flag" && test -n "$link_static_flag"; then 7003*132f818dSEnji Cooper dlopen_self=$dlopen_self_static 7004*132f818dSEnji Cooper fi 7005*132f818dSEnji Cooper prefer_static_libs=yes 7006*132f818dSEnji Cooper ;; 7007*132f818dSEnji Cooper esac 7008*132f818dSEnji Cooper build_libtool_libs=no 7009*132f818dSEnji Cooper build_old_libs=yes 7010*132f818dSEnji Cooper break 7011*132f818dSEnji Cooper ;; 7012*132f818dSEnji Cooper esac 7013*132f818dSEnji Cooper done 7014*132f818dSEnji Cooper 7015*132f818dSEnji Cooper # See if our shared archives depend on static archives. 7016*132f818dSEnji Cooper test -n "$old_archive_from_new_cmds" && build_old_libs=yes 7017*132f818dSEnji Cooper 7018*132f818dSEnji Cooper # Go through the arguments, transforming them on the way. 7019*132f818dSEnji Cooper while test "$#" -gt 0; do 7020*132f818dSEnji Cooper arg=$1 7021*132f818dSEnji Cooper shift 7022*132f818dSEnji Cooper func_quote_arg pretty,unquoted "$arg" 7023*132f818dSEnji Cooper qarg=$func_quote_arg_unquoted_result 7024*132f818dSEnji Cooper func_append libtool_args " $func_quote_arg_result" 7025*132f818dSEnji Cooper 7026*132f818dSEnji Cooper # If the previous option needs an argument, assign it. 7027*132f818dSEnji Cooper if test -n "$prev"; then 7028*132f818dSEnji Cooper case $prev in 7029*132f818dSEnji Cooper output) 7030*132f818dSEnji Cooper func_append compile_command " @OUTPUT@" 7031*132f818dSEnji Cooper func_append finalize_command " @OUTPUT@" 7032*132f818dSEnji Cooper ;; 7033*132f818dSEnji Cooper esac 7034*132f818dSEnji Cooper 7035*132f818dSEnji Cooper case $prev in 7036*132f818dSEnji Cooper bindir) 7037*132f818dSEnji Cooper bindir=$arg 7038*132f818dSEnji Cooper prev= 7039*132f818dSEnji Cooper continue 7040*132f818dSEnji Cooper ;; 7041*132f818dSEnji Cooper dlfiles|dlprefiles) 7042*132f818dSEnji Cooper $preload || { 7043*132f818dSEnji Cooper # Add the symbol object into the linking commands. 7044*132f818dSEnji Cooper func_append compile_command " @SYMFILE@" 7045*132f818dSEnji Cooper func_append finalize_command " @SYMFILE@" 7046*132f818dSEnji Cooper preload=: 7047*132f818dSEnji Cooper } 7048*132f818dSEnji Cooper case $arg in 7049*132f818dSEnji Cooper *.la | *.lo) ;; # We handle these cases below. 7050*132f818dSEnji Cooper force) 7051*132f818dSEnji Cooper if test no = "$dlself"; then 7052*132f818dSEnji Cooper dlself=needless 7053*132f818dSEnji Cooper export_dynamic=yes 7054*132f818dSEnji Cooper fi 7055*132f818dSEnji Cooper prev= 7056*132f818dSEnji Cooper continue 7057*132f818dSEnji Cooper ;; 7058*132f818dSEnji Cooper self) 7059*132f818dSEnji Cooper if test dlprefiles = "$prev"; then 7060*132f818dSEnji Cooper dlself=yes 7061*132f818dSEnji Cooper elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then 7062*132f818dSEnji Cooper dlself=yes 7063*132f818dSEnji Cooper else 7064*132f818dSEnji Cooper dlself=needless 7065*132f818dSEnji Cooper export_dynamic=yes 7066*132f818dSEnji Cooper fi 7067*132f818dSEnji Cooper prev= 7068*132f818dSEnji Cooper continue 7069*132f818dSEnji Cooper ;; 7070*132f818dSEnji Cooper *) 7071*132f818dSEnji Cooper if test dlfiles = "$prev"; then 7072*132f818dSEnji Cooper func_append dlfiles " $arg" 7073*132f818dSEnji Cooper else 7074*132f818dSEnji Cooper func_append dlprefiles " $arg" 7075*132f818dSEnji Cooper fi 7076*132f818dSEnji Cooper prev= 7077*132f818dSEnji Cooper continue 7078*132f818dSEnji Cooper ;; 7079*132f818dSEnji Cooper esac 7080*132f818dSEnji Cooper ;; 7081*132f818dSEnji Cooper expsyms) 7082*132f818dSEnji Cooper export_symbols=$arg 7083*132f818dSEnji Cooper test -f "$arg" \ 7084*132f818dSEnji Cooper || func_fatal_error "symbol file '$arg' does not exist" 7085*132f818dSEnji Cooper prev= 7086*132f818dSEnji Cooper continue 7087*132f818dSEnji Cooper ;; 7088*132f818dSEnji Cooper expsyms_regex) 7089*132f818dSEnji Cooper export_symbols_regex=$arg 7090*132f818dSEnji Cooper prev= 7091*132f818dSEnji Cooper continue 7092*132f818dSEnji Cooper ;; 7093*132f818dSEnji Cooper framework) 7094*132f818dSEnji Cooper case $host in 7095*132f818dSEnji Cooper *-*-darwin*) 7096*132f818dSEnji Cooper case "$deplibs " in 7097*132f818dSEnji Cooper *" $qarg.ltframework "*) ;; 7098*132f818dSEnji Cooper *) func_append deplibs " $qarg.ltframework" # this is fixed later 7099*132f818dSEnji Cooper ;; 7100*132f818dSEnji Cooper esac 7101*132f818dSEnji Cooper ;; 7102*132f818dSEnji Cooper esac 7103*132f818dSEnji Cooper prev= 7104*132f818dSEnji Cooper continue 7105*132f818dSEnji Cooper ;; 7106*132f818dSEnji Cooper inst_prefix) 7107*132f818dSEnji Cooper inst_prefix_dir=$arg 7108*132f818dSEnji Cooper prev= 7109*132f818dSEnji Cooper continue 7110*132f818dSEnji Cooper ;; 7111*132f818dSEnji Cooper mllvm) 7112*132f818dSEnji Cooper # Clang does not use LLVM to link, so we can simply discard any 7113*132f818dSEnji Cooper # '-mllvm $arg' options when doing the link step. 7114*132f818dSEnji Cooper prev= 7115*132f818dSEnji Cooper continue 7116*132f818dSEnji Cooper ;; 7117*132f818dSEnji Cooper objectlist) 7118*132f818dSEnji Cooper if test -f "$arg"; then 7119*132f818dSEnji Cooper save_arg=$arg 7120*132f818dSEnji Cooper moreargs= 7121*132f818dSEnji Cooper for fil in `cat "$save_arg"` 7122*132f818dSEnji Cooper do 7123*132f818dSEnji Cooper# func_append moreargs " $fil" 7124*132f818dSEnji Cooper arg=$fil 7125*132f818dSEnji Cooper # A libtool-controlled object. 7126*132f818dSEnji Cooper 7127*132f818dSEnji Cooper # Check to see that this really is a libtool object. 7128*132f818dSEnji Cooper if func_lalib_unsafe_p "$arg"; then 7129*132f818dSEnji Cooper pic_object= 7130*132f818dSEnji Cooper non_pic_object= 7131*132f818dSEnji Cooper 7132*132f818dSEnji Cooper # Read the .lo file 7133*132f818dSEnji Cooper func_source "$arg" 7134*132f818dSEnji Cooper 7135*132f818dSEnji Cooper if test -z "$pic_object" || 7136*132f818dSEnji Cooper test -z "$non_pic_object" || 7137*132f818dSEnji Cooper test none = "$pic_object" && 7138*132f818dSEnji Cooper test none = "$non_pic_object"; then 7139*132f818dSEnji Cooper func_fatal_error "cannot find name of object for '$arg'" 7140*132f818dSEnji Cooper fi 7141*132f818dSEnji Cooper 7142*132f818dSEnji Cooper # Extract subdirectory from the argument. 7143*132f818dSEnji Cooper func_dirname "$arg" "/" "" 7144*132f818dSEnji Cooper xdir=$func_dirname_result 7145*132f818dSEnji Cooper 7146*132f818dSEnji Cooper if test none != "$pic_object"; then 7147*132f818dSEnji Cooper # Prepend the subdirectory the object is found in. 7148*132f818dSEnji Cooper pic_object=$xdir$pic_object 7149*132f818dSEnji Cooper 7150*132f818dSEnji Cooper if test dlfiles = "$prev"; then 7151*132f818dSEnji Cooper if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then 7152*132f818dSEnji Cooper func_append dlfiles " $pic_object" 7153*132f818dSEnji Cooper prev= 7154*132f818dSEnji Cooper continue 7155*132f818dSEnji Cooper else 7156*132f818dSEnji Cooper # If libtool objects are unsupported, then we need to preload. 7157*132f818dSEnji Cooper prev=dlprefiles 7158*132f818dSEnji Cooper fi 7159*132f818dSEnji Cooper fi 7160*132f818dSEnji Cooper 7161*132f818dSEnji Cooper # CHECK ME: I think I busted this. -Ossama 7162*132f818dSEnji Cooper if test dlprefiles = "$prev"; then 7163*132f818dSEnji Cooper # Preload the old-style object. 7164*132f818dSEnji Cooper func_append dlprefiles " $pic_object" 7165*132f818dSEnji Cooper prev= 7166*132f818dSEnji Cooper fi 7167*132f818dSEnji Cooper 7168*132f818dSEnji Cooper # A PIC object. 7169*132f818dSEnji Cooper func_append libobjs " $pic_object" 7170*132f818dSEnji Cooper arg=$pic_object 7171*132f818dSEnji Cooper fi 7172*132f818dSEnji Cooper 7173*132f818dSEnji Cooper # Non-PIC object. 7174*132f818dSEnji Cooper if test none != "$non_pic_object"; then 7175*132f818dSEnji Cooper # Prepend the subdirectory the object is found in. 7176*132f818dSEnji Cooper non_pic_object=$xdir$non_pic_object 7177*132f818dSEnji Cooper 7178*132f818dSEnji Cooper # A standard non-PIC object 7179*132f818dSEnji Cooper func_append non_pic_objects " $non_pic_object" 7180*132f818dSEnji Cooper if test -z "$pic_object" || test none = "$pic_object"; then 7181*132f818dSEnji Cooper arg=$non_pic_object 7182*132f818dSEnji Cooper fi 7183*132f818dSEnji Cooper else 7184*132f818dSEnji Cooper # If the PIC object exists, use it instead. 7185*132f818dSEnji Cooper # $xdir was prepended to $pic_object above. 7186*132f818dSEnji Cooper non_pic_object=$pic_object 7187*132f818dSEnji Cooper func_append non_pic_objects " $non_pic_object" 7188*132f818dSEnji Cooper fi 7189*132f818dSEnji Cooper else 7190*132f818dSEnji Cooper # Only an error if not doing a dry-run. 7191*132f818dSEnji Cooper if $opt_dry_run; then 7192*132f818dSEnji Cooper # Extract subdirectory from the argument. 7193*132f818dSEnji Cooper func_dirname "$arg" "/" "" 7194*132f818dSEnji Cooper xdir=$func_dirname_result 7195*132f818dSEnji Cooper 7196*132f818dSEnji Cooper func_lo2o "$arg" 7197*132f818dSEnji Cooper pic_object=$xdir$objdir/$func_lo2o_result 7198*132f818dSEnji Cooper non_pic_object=$xdir$func_lo2o_result 7199*132f818dSEnji Cooper func_append libobjs " $pic_object" 7200*132f818dSEnji Cooper func_append non_pic_objects " $non_pic_object" 7201*132f818dSEnji Cooper else 7202*132f818dSEnji Cooper func_fatal_error "'$arg' is not a valid libtool object" 7203*132f818dSEnji Cooper fi 7204*132f818dSEnji Cooper fi 7205*132f818dSEnji Cooper done 7206*132f818dSEnji Cooper else 7207*132f818dSEnji Cooper func_fatal_error "link input file '$arg' does not exist" 7208*132f818dSEnji Cooper fi 7209*132f818dSEnji Cooper arg=$save_arg 7210*132f818dSEnji Cooper prev= 7211*132f818dSEnji Cooper continue 7212*132f818dSEnji Cooper ;; 7213*132f818dSEnji Cooper os2dllname) 7214*132f818dSEnji Cooper os2dllname=$arg 7215*132f818dSEnji Cooper prev= 7216*132f818dSEnji Cooper continue 7217*132f818dSEnji Cooper ;; 7218*132f818dSEnji Cooper precious_regex) 7219*132f818dSEnji Cooper precious_files_regex=$arg 7220*132f818dSEnji Cooper prev= 7221*132f818dSEnji Cooper continue 7222*132f818dSEnji Cooper ;; 7223*132f818dSEnji Cooper release) 7224*132f818dSEnji Cooper release=-$arg 7225*132f818dSEnji Cooper prev= 7226*132f818dSEnji Cooper continue 7227*132f818dSEnji Cooper ;; 7228*132f818dSEnji Cooper rpath | xrpath) 7229*132f818dSEnji Cooper # We need an absolute path. 7230*132f818dSEnji Cooper case $arg in 7231*132f818dSEnji Cooper [\\/]* | [A-Za-z]:[\\/]*) ;; 7232*132f818dSEnji Cooper *) 7233*132f818dSEnji Cooper func_fatal_error "argument to -rpath is not absolute: $arg" 7234*132f818dSEnji Cooper ;; 7235*132f818dSEnji Cooper esac 7236*132f818dSEnji Cooper if test rpath = "$prev"; then 7237*132f818dSEnji Cooper case "$rpath " in 7238*132f818dSEnji Cooper *" $arg "*) ;; 7239*132f818dSEnji Cooper *) func_append rpath " $arg" ;; 7240*132f818dSEnji Cooper esac 7241*132f818dSEnji Cooper else 7242*132f818dSEnji Cooper case "$xrpath " in 7243*132f818dSEnji Cooper *" $arg "*) ;; 7244*132f818dSEnji Cooper *) func_append xrpath " $arg" ;; 7245*132f818dSEnji Cooper esac 7246*132f818dSEnji Cooper fi 7247*132f818dSEnji Cooper prev= 7248*132f818dSEnji Cooper continue 7249*132f818dSEnji Cooper ;; 7250*132f818dSEnji Cooper shrext) 7251*132f818dSEnji Cooper shrext_cmds=$arg 7252*132f818dSEnji Cooper prev= 7253*132f818dSEnji Cooper continue 7254*132f818dSEnji Cooper ;; 7255*132f818dSEnji Cooper weak) 7256*132f818dSEnji Cooper func_append weak_libs " $arg" 7257*132f818dSEnji Cooper prev= 7258*132f818dSEnji Cooper continue 7259*132f818dSEnji Cooper ;; 7260*132f818dSEnji Cooper xassembler) 7261*132f818dSEnji Cooper func_append compiler_flags " -Xassembler $qarg" 7262*132f818dSEnji Cooper prev= 7263*132f818dSEnji Cooper func_append compile_command " -Xassembler $qarg" 7264*132f818dSEnji Cooper func_append finalize_command " -Xassembler $qarg" 7265*132f818dSEnji Cooper continue 7266*132f818dSEnji Cooper ;; 7267*132f818dSEnji Cooper xcclinker) 7268*132f818dSEnji Cooper func_append linker_flags " $qarg" 7269*132f818dSEnji Cooper func_append compiler_flags " $qarg" 7270*132f818dSEnji Cooper prev= 7271*132f818dSEnji Cooper func_append compile_command " $qarg" 7272*132f818dSEnji Cooper func_append finalize_command " $qarg" 7273*132f818dSEnji Cooper continue 7274*132f818dSEnji Cooper ;; 7275*132f818dSEnji Cooper xcompiler) 7276*132f818dSEnji Cooper func_append compiler_flags " $qarg" 7277*132f818dSEnji Cooper prev= 7278*132f818dSEnji Cooper func_append compile_command " $qarg" 7279*132f818dSEnji Cooper func_append finalize_command " $qarg" 7280*132f818dSEnji Cooper continue 7281*132f818dSEnji Cooper ;; 7282*132f818dSEnji Cooper xlinker) 7283*132f818dSEnji Cooper func_append linker_flags " $qarg" 7284*132f818dSEnji Cooper func_append compiler_flags " $wl$qarg" 7285*132f818dSEnji Cooper prev= 7286*132f818dSEnji Cooper func_append compile_command " $wl$qarg" 7287*132f818dSEnji Cooper func_append finalize_command " $wl$qarg" 7288*132f818dSEnji Cooper continue 7289*132f818dSEnji Cooper ;; 7290*132f818dSEnji Cooper *) 7291*132f818dSEnji Cooper eval "$prev=\"\$arg\"" 7292*132f818dSEnji Cooper prev= 7293*132f818dSEnji Cooper continue 7294*132f818dSEnji Cooper ;; 7295*132f818dSEnji Cooper esac 7296*132f818dSEnji Cooper fi # test -n "$prev" 7297*132f818dSEnji Cooper 7298*132f818dSEnji Cooper prevarg=$arg 7299*132f818dSEnji Cooper 7300*132f818dSEnji Cooper case $arg in 7301*132f818dSEnji Cooper -all-static) 7302*132f818dSEnji Cooper if test -n "$link_static_flag"; then 7303*132f818dSEnji Cooper # See comment for -static flag below, for more details. 7304*132f818dSEnji Cooper func_append compile_command " $link_static_flag" 7305*132f818dSEnji Cooper func_append finalize_command " $link_static_flag" 7306*132f818dSEnji Cooper fi 7307*132f818dSEnji Cooper continue 7308*132f818dSEnji Cooper ;; 7309*132f818dSEnji Cooper 7310*132f818dSEnji Cooper -allow-undefined) 7311*132f818dSEnji Cooper # FIXME: remove this flag sometime in the future. 7312*132f818dSEnji Cooper func_fatal_error "'-allow-undefined' must not be used because it is the default" 7313*132f818dSEnji Cooper ;; 7314*132f818dSEnji Cooper 7315*132f818dSEnji Cooper -avoid-version) 7316*132f818dSEnji Cooper avoid_version=yes 7317*132f818dSEnji Cooper continue 7318*132f818dSEnji Cooper ;; 7319*132f818dSEnji Cooper 7320*132f818dSEnji Cooper -bindir) 7321*132f818dSEnji Cooper prev=bindir 7322*132f818dSEnji Cooper continue 7323*132f818dSEnji Cooper ;; 7324*132f818dSEnji Cooper 7325*132f818dSEnji Cooper -dlopen) 7326*132f818dSEnji Cooper prev=dlfiles 7327*132f818dSEnji Cooper continue 7328*132f818dSEnji Cooper ;; 7329*132f818dSEnji Cooper 7330*132f818dSEnji Cooper -dlpreopen) 7331*132f818dSEnji Cooper prev=dlprefiles 7332*132f818dSEnji Cooper continue 7333*132f818dSEnji Cooper ;; 7334*132f818dSEnji Cooper 7335*132f818dSEnji Cooper -export-dynamic) 7336*132f818dSEnji Cooper export_dynamic=yes 7337*132f818dSEnji Cooper continue 7338*132f818dSEnji Cooper ;; 7339*132f818dSEnji Cooper 7340*132f818dSEnji Cooper -export-symbols | -export-symbols-regex) 7341*132f818dSEnji Cooper if test -n "$export_symbols" || test -n "$export_symbols_regex"; then 7342*132f818dSEnji Cooper func_fatal_error "more than one -exported-symbols argument is not allowed" 7343*132f818dSEnji Cooper fi 7344*132f818dSEnji Cooper if test X-export-symbols = "X$arg"; then 7345*132f818dSEnji Cooper prev=expsyms 7346*132f818dSEnji Cooper else 7347*132f818dSEnji Cooper prev=expsyms_regex 7348*132f818dSEnji Cooper fi 7349*132f818dSEnji Cooper continue 7350*132f818dSEnji Cooper ;; 7351*132f818dSEnji Cooper 7352*132f818dSEnji Cooper -framework) 7353*132f818dSEnji Cooper prev=framework 7354*132f818dSEnji Cooper continue 7355*132f818dSEnji Cooper ;; 7356*132f818dSEnji Cooper 7357*132f818dSEnji Cooper -inst-prefix-dir) 7358*132f818dSEnji Cooper prev=inst_prefix 7359*132f818dSEnji Cooper continue 7360*132f818dSEnji Cooper ;; 7361*132f818dSEnji Cooper 7362*132f818dSEnji Cooper # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* 7363*132f818dSEnji Cooper # so, if we see these flags be careful not to treat them like -L 7364*132f818dSEnji Cooper -L[A-Z][A-Z]*:*) 7365*132f818dSEnji Cooper case $with_gcc/$host in 7366*132f818dSEnji Cooper no/*-*-irix* | /*-*-irix*) 7367*132f818dSEnji Cooper func_append compile_command " $arg" 7368*132f818dSEnji Cooper func_append finalize_command " $arg" 7369*132f818dSEnji Cooper ;; 7370*132f818dSEnji Cooper esac 7371*132f818dSEnji Cooper continue 7372*132f818dSEnji Cooper ;; 7373*132f818dSEnji Cooper 7374*132f818dSEnji Cooper -L*) 7375*132f818dSEnji Cooper func_stripname "-L" '' "$arg" 7376*132f818dSEnji Cooper if test -z "$func_stripname_result"; then 7377*132f818dSEnji Cooper if test "$#" -gt 0; then 7378*132f818dSEnji Cooper func_fatal_error "require no space between '-L' and '$1'" 7379*132f818dSEnji Cooper else 7380*132f818dSEnji Cooper func_fatal_error "need path for '-L' option" 7381*132f818dSEnji Cooper fi 7382*132f818dSEnji Cooper fi 7383*132f818dSEnji Cooper func_resolve_sysroot "$func_stripname_result" 7384*132f818dSEnji Cooper dir=$func_resolve_sysroot_result 7385*132f818dSEnji Cooper # We need an absolute path. 7386*132f818dSEnji Cooper case $dir in 7387*132f818dSEnji Cooper [\\/]* | [A-Za-z]:[\\/]*) ;; 7388*132f818dSEnji Cooper *) 7389*132f818dSEnji Cooper absdir=`cd "$dir" && pwd` 7390*132f818dSEnji Cooper test -z "$absdir" && \ 7391*132f818dSEnji Cooper func_fatal_error "cannot determine absolute directory name of '$dir'" 7392*132f818dSEnji Cooper dir=$absdir 7393*132f818dSEnji Cooper ;; 7394*132f818dSEnji Cooper esac 7395*132f818dSEnji Cooper case "$deplibs " in 7396*132f818dSEnji Cooper *" -L$dir "* | *" $arg "*) 7397*132f818dSEnji Cooper # Will only happen for absolute or sysroot arguments 7398*132f818dSEnji Cooper ;; 7399*132f818dSEnji Cooper *) 7400*132f818dSEnji Cooper # Preserve sysroot, but never include relative directories 7401*132f818dSEnji Cooper case $dir in 7402*132f818dSEnji Cooper [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; 7403*132f818dSEnji Cooper *) func_append deplibs " -L$dir" ;; 7404*132f818dSEnji Cooper esac 7405*132f818dSEnji Cooper func_append lib_search_path " $dir" 7406*132f818dSEnji Cooper ;; 7407*132f818dSEnji Cooper esac 7408*132f818dSEnji Cooper case $host in 7409*132f818dSEnji Cooper *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) 7410*132f818dSEnji Cooper testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` 7411*132f818dSEnji Cooper case :$dllsearchpath: in 7412*132f818dSEnji Cooper *":$dir:"*) ;; 7413*132f818dSEnji Cooper ::) dllsearchpath=$dir;; 7414*132f818dSEnji Cooper *) func_append dllsearchpath ":$dir";; 7415*132f818dSEnji Cooper esac 7416*132f818dSEnji Cooper case :$dllsearchpath: in 7417*132f818dSEnji Cooper *":$testbindir:"*) ;; 7418*132f818dSEnji Cooper ::) dllsearchpath=$testbindir;; 7419*132f818dSEnji Cooper *) func_append dllsearchpath ":$testbindir";; 7420*132f818dSEnji Cooper esac 7421*132f818dSEnji Cooper ;; 7422*132f818dSEnji Cooper esac 7423*132f818dSEnji Cooper continue 7424*132f818dSEnji Cooper ;; 7425*132f818dSEnji Cooper 7426*132f818dSEnji Cooper -l*) 7427*132f818dSEnji Cooper if test X-lc = "X$arg" || test X-lm = "X$arg"; then 7428*132f818dSEnji Cooper case $host in 7429*132f818dSEnji Cooper *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) 7430*132f818dSEnji Cooper # These systems don't actually have a C or math library (as such) 7431*132f818dSEnji Cooper continue 7432*132f818dSEnji Cooper ;; 7433*132f818dSEnji Cooper *-*-os2*) 7434*132f818dSEnji Cooper # These systems don't actually have a C library (as such) 7435*132f818dSEnji Cooper test X-lc = "X$arg" && continue 7436*132f818dSEnji Cooper ;; 7437*132f818dSEnji Cooper *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) 7438*132f818dSEnji Cooper # Do not include libc due to us having libc/libc_r. 7439*132f818dSEnji Cooper test X-lc = "X$arg" && continue 7440*132f818dSEnji Cooper ;; 7441*132f818dSEnji Cooper *-*-rhapsody* | *-*-darwin1.[012]) 7442*132f818dSEnji Cooper # Rhapsody C and math libraries are in the System framework 7443*132f818dSEnji Cooper func_append deplibs " System.ltframework" 7444*132f818dSEnji Cooper continue 7445*132f818dSEnji Cooper ;; 7446*132f818dSEnji Cooper *-*-sco3.2v5* | *-*-sco5v6*) 7447*132f818dSEnji Cooper # Causes problems with __ctype 7448*132f818dSEnji Cooper test X-lc = "X$arg" && continue 7449*132f818dSEnji Cooper ;; 7450*132f818dSEnji Cooper *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) 7451*132f818dSEnji Cooper # Compiler inserts libc in the correct place for threads to work 7452*132f818dSEnji Cooper test X-lc = "X$arg" && continue 7453*132f818dSEnji Cooper ;; 7454*132f818dSEnji Cooper esac 7455*132f818dSEnji Cooper elif test X-lc_r = "X$arg"; then 7456*132f818dSEnji Cooper case $host in 7457*132f818dSEnji Cooper *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) 7458*132f818dSEnji Cooper # Do not include libc_r directly, use -pthread flag. 7459*132f818dSEnji Cooper continue 7460*132f818dSEnji Cooper ;; 7461*132f818dSEnji Cooper esac 7462*132f818dSEnji Cooper fi 7463*132f818dSEnji Cooper func_append deplibs " $arg" 7464*132f818dSEnji Cooper continue 7465*132f818dSEnji Cooper ;; 7466*132f818dSEnji Cooper 7467*132f818dSEnji Cooper -mllvm) 7468*132f818dSEnji Cooper prev=mllvm 7469*132f818dSEnji Cooper continue 7470*132f818dSEnji Cooper ;; 7471*132f818dSEnji Cooper 7472*132f818dSEnji Cooper -module) 7473*132f818dSEnji Cooper module=yes 7474*132f818dSEnji Cooper continue 7475*132f818dSEnji Cooper ;; 7476*132f818dSEnji Cooper 7477*132f818dSEnji Cooper # Tru64 UNIX uses -model [arg] to determine the layout of C++ 7478*132f818dSEnji Cooper # classes, name mangling, and exception handling. 7479*132f818dSEnji Cooper # Darwin uses the -arch flag to determine output architecture. 7480*132f818dSEnji Cooper # -q <option> for IBM XL C/C++ compiler. 7481*132f818dSEnji Cooper -model|-arch|-isysroot|--sysroot|-q) 7482*132f818dSEnji Cooper func_append compiler_flags " $arg" 7483*132f818dSEnji Cooper func_append compile_command " $arg" 7484*132f818dSEnji Cooper func_append finalize_command " $arg" 7485*132f818dSEnji Cooper prev=xcompiler 7486*132f818dSEnji Cooper continue 7487*132f818dSEnji Cooper ;; 7488*132f818dSEnji Cooper # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199. 7489*132f818dSEnji Cooper -pthread) 7490*132f818dSEnji Cooper case $host in 7491*132f818dSEnji Cooper *solaris2*) ;; 7492*132f818dSEnji Cooper *) 7493*132f818dSEnji Cooper case "$new_inherited_linker_flags " in 7494*132f818dSEnji Cooper *" $arg "*) ;; 7495*132f818dSEnji Cooper * ) func_append new_inherited_linker_flags " $arg" ;; 7496*132f818dSEnji Cooper esac 7497*132f818dSEnji Cooper ;; 7498*132f818dSEnji Cooper esac 7499*132f818dSEnji Cooper continue 7500*132f818dSEnji Cooper ;; 7501*132f818dSEnji Cooper -mt|-mthreads|-kthread|-Kthread|-pthreads|--thread-safe \ 7502*132f818dSEnji Cooper |-threads|-fopenmp|-fopenmp=*|-openmp|-mp|-xopenmp|-omp|-qsmp=*) 7503*132f818dSEnji Cooper func_append compiler_flags " $arg" 7504*132f818dSEnji Cooper func_append compile_command " $arg" 7505*132f818dSEnji Cooper func_append finalize_command " $arg" 7506*132f818dSEnji Cooper case "$new_inherited_linker_flags " in 7507*132f818dSEnji Cooper *" $arg "*) ;; 7508*132f818dSEnji Cooper * ) func_append new_inherited_linker_flags " $arg" ;; 7509*132f818dSEnji Cooper esac 7510*132f818dSEnji Cooper continue 7511*132f818dSEnji Cooper ;; 7512*132f818dSEnji Cooper 7513*132f818dSEnji Cooper -multi_module) 7514*132f818dSEnji Cooper single_module=$wl-multi_module 7515*132f818dSEnji Cooper continue 7516*132f818dSEnji Cooper ;; 7517*132f818dSEnji Cooper 7518*132f818dSEnji Cooper -no-fast-install) 7519*132f818dSEnji Cooper fast_install=no 7520*132f818dSEnji Cooper continue 7521*132f818dSEnji Cooper ;; 7522*132f818dSEnji Cooper 7523*132f818dSEnji Cooper -no-install) 7524*132f818dSEnji Cooper case $host in 7525*132f818dSEnji Cooper *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) 7526*132f818dSEnji Cooper # The PATH hackery in wrapper scripts is required on Windows 7527*132f818dSEnji Cooper # and Darwin in order for the loader to find any dlls it needs. 7528*132f818dSEnji Cooper func_warning "'-no-install' is ignored for $host" 7529*132f818dSEnji Cooper func_warning "assuming '-no-fast-install' instead" 7530*132f818dSEnji Cooper fast_install=no 7531*132f818dSEnji Cooper ;; 7532*132f818dSEnji Cooper *) no_install=yes ;; 7533*132f818dSEnji Cooper esac 7534*132f818dSEnji Cooper continue 7535*132f818dSEnji Cooper ;; 7536*132f818dSEnji Cooper 7537*132f818dSEnji Cooper -no-undefined) 7538*132f818dSEnji Cooper allow_undefined=no 7539*132f818dSEnji Cooper continue 7540*132f818dSEnji Cooper ;; 7541*132f818dSEnji Cooper 7542*132f818dSEnji Cooper -objectlist) 7543*132f818dSEnji Cooper prev=objectlist 7544*132f818dSEnji Cooper continue 7545*132f818dSEnji Cooper ;; 7546*132f818dSEnji Cooper 7547*132f818dSEnji Cooper -os2dllname) 7548*132f818dSEnji Cooper prev=os2dllname 7549*132f818dSEnji Cooper continue 7550*132f818dSEnji Cooper ;; 7551*132f818dSEnji Cooper 7552*132f818dSEnji Cooper -o) prev=output ;; 7553*132f818dSEnji Cooper 7554*132f818dSEnji Cooper -precious-files-regex) 7555*132f818dSEnji Cooper prev=precious_regex 7556*132f818dSEnji Cooper continue 7557*132f818dSEnji Cooper ;; 7558*132f818dSEnji Cooper 7559*132f818dSEnji Cooper -release) 7560*132f818dSEnji Cooper prev=release 7561*132f818dSEnji Cooper continue 7562*132f818dSEnji Cooper ;; 7563*132f818dSEnji Cooper 7564*132f818dSEnji Cooper -rpath) 7565*132f818dSEnji Cooper prev=rpath 7566*132f818dSEnji Cooper continue 7567*132f818dSEnji Cooper ;; 7568*132f818dSEnji Cooper 7569*132f818dSEnji Cooper -R) 7570*132f818dSEnji Cooper prev=xrpath 7571*132f818dSEnji Cooper continue 7572*132f818dSEnji Cooper ;; 7573*132f818dSEnji Cooper 7574*132f818dSEnji Cooper -R*) 7575*132f818dSEnji Cooper func_stripname '-R' '' "$arg" 7576*132f818dSEnji Cooper dir=$func_stripname_result 7577*132f818dSEnji Cooper # We need an absolute path. 7578*132f818dSEnji Cooper case $dir in 7579*132f818dSEnji Cooper [\\/]* | [A-Za-z]:[\\/]*) ;; 7580*132f818dSEnji Cooper =*) 7581*132f818dSEnji Cooper func_stripname '=' '' "$dir" 7582*132f818dSEnji Cooper dir=$lt_sysroot$func_stripname_result 7583*132f818dSEnji Cooper ;; 7584*132f818dSEnji Cooper *) 7585*132f818dSEnji Cooper func_fatal_error "argument ($arg) to '-R' is not an absolute path: $dir" 7586*132f818dSEnji Cooper ;; 7587*132f818dSEnji Cooper esac 7588*132f818dSEnji Cooper case "$xrpath " in 7589*132f818dSEnji Cooper *" $dir "*) ;; 7590*132f818dSEnji Cooper *) func_append xrpath " $dir" ;; 7591*132f818dSEnji Cooper esac 7592*132f818dSEnji Cooper continue 7593*132f818dSEnji Cooper ;; 7594*132f818dSEnji Cooper 7595*132f818dSEnji Cooper -shared) 7596*132f818dSEnji Cooper # The effects of -shared are defined in a previous loop. 7597*132f818dSEnji Cooper continue 7598*132f818dSEnji Cooper ;; 7599*132f818dSEnji Cooper 7600*132f818dSEnji Cooper -shrext) 7601*132f818dSEnji Cooper prev=shrext 7602*132f818dSEnji Cooper continue 7603*132f818dSEnji Cooper ;; 7604*132f818dSEnji Cooper 7605*132f818dSEnji Cooper -static | -static-libtool-libs) 7606*132f818dSEnji Cooper # The effects of -static are defined in a previous loop. 7607*132f818dSEnji Cooper # We used to do the same as -all-static on platforms that 7608*132f818dSEnji Cooper # didn't have a PIC flag, but the assumption that the effects 7609*132f818dSEnji Cooper # would be equivalent was wrong. It would break on at least 7610*132f818dSEnji Cooper # Digital Unix and AIX. 7611*132f818dSEnji Cooper continue 7612*132f818dSEnji Cooper ;; 7613*132f818dSEnji Cooper 7614*132f818dSEnji Cooper -thread-safe) 7615*132f818dSEnji Cooper thread_safe=yes 7616*132f818dSEnji Cooper continue 7617*132f818dSEnji Cooper ;; 7618*132f818dSEnji Cooper 7619*132f818dSEnji Cooper -version-info) 7620*132f818dSEnji Cooper prev=vinfo 7621*132f818dSEnji Cooper continue 7622*132f818dSEnji Cooper ;; 7623*132f818dSEnji Cooper 7624*132f818dSEnji Cooper -version-number) 7625*132f818dSEnji Cooper prev=vinfo 7626*132f818dSEnji Cooper vinfo_number=yes 7627*132f818dSEnji Cooper continue 7628*132f818dSEnji Cooper ;; 7629*132f818dSEnji Cooper 7630*132f818dSEnji Cooper -weak) 7631*132f818dSEnji Cooper prev=weak 7632*132f818dSEnji Cooper continue 7633*132f818dSEnji Cooper ;; 7634*132f818dSEnji Cooper 7635*132f818dSEnji Cooper -Wc,*) 7636*132f818dSEnji Cooper func_stripname '-Wc,' '' "$arg" 7637*132f818dSEnji Cooper args=$func_stripname_result 7638*132f818dSEnji Cooper arg= 7639*132f818dSEnji Cooper save_ifs=$IFS; IFS=, 7640*132f818dSEnji Cooper for flag in $args; do 7641*132f818dSEnji Cooper IFS=$save_ifs 7642*132f818dSEnji Cooper func_quote_arg pretty "$flag" 7643*132f818dSEnji Cooper func_append arg " $func_quote_arg_result" 7644*132f818dSEnji Cooper func_append compiler_flags " $func_quote_arg_result" 7645*132f818dSEnji Cooper done 7646*132f818dSEnji Cooper IFS=$save_ifs 7647*132f818dSEnji Cooper func_stripname ' ' '' "$arg" 7648*132f818dSEnji Cooper arg=$func_stripname_result 7649*132f818dSEnji Cooper ;; 7650*132f818dSEnji Cooper 7651*132f818dSEnji Cooper -Wl,*) 7652*132f818dSEnji Cooper func_stripname '-Wl,' '' "$arg" 7653*132f818dSEnji Cooper args=$func_stripname_result 7654*132f818dSEnji Cooper arg= 7655*132f818dSEnji Cooper save_ifs=$IFS; IFS=, 7656*132f818dSEnji Cooper for flag in $args; do 7657*132f818dSEnji Cooper IFS=$save_ifs 7658*132f818dSEnji Cooper func_quote_arg pretty "$flag" 7659*132f818dSEnji Cooper func_append arg " $wl$func_quote_arg_result" 7660*132f818dSEnji Cooper func_append compiler_flags " $wl$func_quote_arg_result" 7661*132f818dSEnji Cooper func_append linker_flags " $func_quote_arg_result" 7662*132f818dSEnji Cooper done 7663*132f818dSEnji Cooper IFS=$save_ifs 7664*132f818dSEnji Cooper func_stripname ' ' '' "$arg" 7665*132f818dSEnji Cooper arg=$func_stripname_result 7666*132f818dSEnji Cooper ;; 7667*132f818dSEnji Cooper 7668*132f818dSEnji Cooper -Xassembler) 7669*132f818dSEnji Cooper prev=xassembler 7670*132f818dSEnji Cooper continue 7671*132f818dSEnji Cooper ;; 7672*132f818dSEnji Cooper 7673*132f818dSEnji Cooper -Xcompiler) 7674*132f818dSEnji Cooper prev=xcompiler 7675*132f818dSEnji Cooper continue 7676*132f818dSEnji Cooper ;; 7677*132f818dSEnji Cooper 7678*132f818dSEnji Cooper -Xlinker) 7679*132f818dSEnji Cooper prev=xlinker 7680*132f818dSEnji Cooper continue 7681*132f818dSEnji Cooper ;; 7682*132f818dSEnji Cooper 7683*132f818dSEnji Cooper -XCClinker) 7684*132f818dSEnji Cooper prev=xcclinker 7685*132f818dSEnji Cooper continue 7686*132f818dSEnji Cooper ;; 7687*132f818dSEnji Cooper 7688*132f818dSEnji Cooper # -msg_* for osf cc 7689*132f818dSEnji Cooper -msg_*) 7690*132f818dSEnji Cooper func_quote_arg pretty "$arg" 7691*132f818dSEnji Cooper arg=$func_quote_arg_result 7692*132f818dSEnji Cooper ;; 7693*132f818dSEnji Cooper 7694*132f818dSEnji Cooper # Flags to be passed through unchanged, with rationale: 7695*132f818dSEnji Cooper # -64, -mips[0-9] enable 64-bit mode for the SGI compiler 7696*132f818dSEnji Cooper # -r[0-9][0-9]* specify processor for the SGI compiler 7697*132f818dSEnji Cooper # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler 7698*132f818dSEnji Cooper # +DA*, +DD* enable 64-bit mode for the HP compiler 7699*132f818dSEnji Cooper # -q* compiler args for the IBM compiler 7700*132f818dSEnji Cooper # -m*, -t[45]*, -txscale* architecture-specific flags for GCC 7701*132f818dSEnji Cooper # -F/path path to uninstalled frameworks, gcc on darwin 7702*132f818dSEnji Cooper # -p, -pg, --coverage, -fprofile-* profiling flags for GCC 7703*132f818dSEnji Cooper # -fstack-protector* stack protector flags for GCC 7704*132f818dSEnji Cooper # @file GCC response files 7705*132f818dSEnji Cooper # -tp=* Portland pgcc target processor selection 7706*132f818dSEnji Cooper # --sysroot=* for sysroot support 7707*132f818dSEnji Cooper # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization 7708*132f818dSEnji Cooper # -specs=* GCC specs files 7709*132f818dSEnji Cooper # -stdlib=* select c++ std lib with clang 7710*132f818dSEnji Cooper # -fdiagnostics-color* simply affects output 7711*132f818dSEnji Cooper # -frecord-gcc-switches used to verify flags were respected 7712*132f818dSEnji Cooper # -fsanitize=* Clang/GCC memory and address sanitizer 7713*132f818dSEnji Cooper # -fno-sanitize* Clang/GCC memory and address sanitizer 7714*132f818dSEnji Cooper # -shared-libsan Link with shared sanitizer runtimes (Clang) 7715*132f818dSEnji Cooper # -static-libsan Link with static sanitizer runtimes (Clang) 7716*132f818dSEnji Cooper # -no-canonical-prefixes Do not expand any symbolic links 7717*132f818dSEnji Cooper # -fuse-ld=* Linker select flags for GCC 7718*132f818dSEnji Cooper # -static-* direct GCC to link specific libraries statically 7719*132f818dSEnji Cooper # -fcilkplus Cilk Plus language extension features for C/C++ 7720*132f818dSEnji Cooper # -rtlib=* select c runtime lib with clang 7721*132f818dSEnji Cooper # --unwindlib=* select unwinder library with clang 7722*132f818dSEnji Cooper # -f{file|debug|macro|profile}-prefix-map=* needed for lto linking 7723*132f818dSEnji Cooper # -Wa,* Pass flags directly to the assembler 7724*132f818dSEnji Cooper # -Werror, -Werror=* Report (specified) warnings as errors 7725*132f818dSEnji Cooper -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ 7726*132f818dSEnji Cooper -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ 7727*132f818dSEnji Cooper -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-no-canonical-prefixes| \ 7728*132f818dSEnji Cooper -stdlib=*|-rtlib=*|--unwindlib=*| \ 7729*132f818dSEnji Cooper -specs=*|-fsanitize=*|-fno-sanitize*|-shared-libsan|-static-libsan| \ 7730*132f818dSEnji Cooper -ffile-prefix-map=*|-fdebug-prefix-map=*|-fmacro-prefix-map=*|-fprofile-prefix-map=*| \ 7731*132f818dSEnji Cooper -fdiagnostics-color*|-frecord-gcc-switches| \ 7732*132f818dSEnji Cooper -fuse-ld=*|-static-*|-fcilkplus|-Wa,*|-Werror|-Werror=*) 7733*132f818dSEnji Cooper func_quote_arg pretty "$arg" 7734*132f818dSEnji Cooper arg=$func_quote_arg_result 7735*132f818dSEnji Cooper func_append compile_command " $arg" 7736*132f818dSEnji Cooper func_append finalize_command " $arg" 7737*132f818dSEnji Cooper func_append compiler_flags " $arg" 7738*132f818dSEnji Cooper continue 7739*132f818dSEnji Cooper ;; 7740*132f818dSEnji Cooper 7741*132f818dSEnji Cooper -Z*) 7742*132f818dSEnji Cooper if test os2 = "`expr $host : '.*\(os2\)'`"; then 7743*132f818dSEnji Cooper # OS/2 uses -Zxxx to specify OS/2-specific options 7744*132f818dSEnji Cooper compiler_flags="$compiler_flags $arg" 7745*132f818dSEnji Cooper func_append compile_command " $arg" 7746*132f818dSEnji Cooper func_append finalize_command " $arg" 7747*132f818dSEnji Cooper case $arg in 7748*132f818dSEnji Cooper -Zlinker | -Zstack) 7749*132f818dSEnji Cooper prev=xcompiler 7750*132f818dSEnji Cooper ;; 7751*132f818dSEnji Cooper esac 7752*132f818dSEnji Cooper continue 7753*132f818dSEnji Cooper else 7754*132f818dSEnji Cooper # Otherwise treat like 'Some other compiler flag' below 7755*132f818dSEnji Cooper func_quote_arg pretty "$arg" 7756*132f818dSEnji Cooper arg=$func_quote_arg_result 7757*132f818dSEnji Cooper fi 7758*132f818dSEnji Cooper ;; 7759*132f818dSEnji Cooper 7760*132f818dSEnji Cooper # Some other compiler flag. 7761*132f818dSEnji Cooper -* | +*) 7762*132f818dSEnji Cooper func_quote_arg pretty "$arg" 7763*132f818dSEnji Cooper arg=$func_quote_arg_result 7764*132f818dSEnji Cooper ;; 7765*132f818dSEnji Cooper 7766*132f818dSEnji Cooper *.$objext) 7767*132f818dSEnji Cooper # A standard object. 7768*132f818dSEnji Cooper func_append objs " $arg" 7769*132f818dSEnji Cooper ;; 7770*132f818dSEnji Cooper 7771*132f818dSEnji Cooper *.lo) 7772*132f818dSEnji Cooper # A libtool-controlled object. 7773*132f818dSEnji Cooper 7774*132f818dSEnji Cooper # Check to see that this really is a libtool object. 7775*132f818dSEnji Cooper if func_lalib_unsafe_p "$arg"; then 7776*132f818dSEnji Cooper pic_object= 7777*132f818dSEnji Cooper non_pic_object= 7778*132f818dSEnji Cooper 7779*132f818dSEnji Cooper # Read the .lo file 7780*132f818dSEnji Cooper func_source "$arg" 7781*132f818dSEnji Cooper 7782*132f818dSEnji Cooper if test -z "$pic_object" || 7783*132f818dSEnji Cooper test -z "$non_pic_object" || 7784*132f818dSEnji Cooper test none = "$pic_object" && 7785*132f818dSEnji Cooper test none = "$non_pic_object"; then 7786*132f818dSEnji Cooper func_fatal_error "cannot find name of object for '$arg'" 7787*132f818dSEnji Cooper fi 7788*132f818dSEnji Cooper 7789*132f818dSEnji Cooper # Extract subdirectory from the argument. 7790*132f818dSEnji Cooper func_dirname "$arg" "/" "" 7791*132f818dSEnji Cooper xdir=$func_dirname_result 7792*132f818dSEnji Cooper 7793*132f818dSEnji Cooper test none = "$pic_object" || { 7794*132f818dSEnji Cooper # Prepend the subdirectory the object is found in. 7795*132f818dSEnji Cooper pic_object=$xdir$pic_object 7796*132f818dSEnji Cooper 7797*132f818dSEnji Cooper if test dlfiles = "$prev"; then 7798*132f818dSEnji Cooper if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then 7799*132f818dSEnji Cooper func_append dlfiles " $pic_object" 7800*132f818dSEnji Cooper prev= 7801*132f818dSEnji Cooper continue 7802*132f818dSEnji Cooper else 7803*132f818dSEnji Cooper # If libtool objects are unsupported, then we need to preload. 7804*132f818dSEnji Cooper prev=dlprefiles 7805*132f818dSEnji Cooper fi 7806*132f818dSEnji Cooper fi 7807*132f818dSEnji Cooper 7808*132f818dSEnji Cooper # CHECK ME: I think I busted this. -Ossama 7809*132f818dSEnji Cooper if test dlprefiles = "$prev"; then 7810*132f818dSEnji Cooper # Preload the old-style object. 7811*132f818dSEnji Cooper func_append dlprefiles " $pic_object" 7812*132f818dSEnji Cooper prev= 7813*132f818dSEnji Cooper fi 7814*132f818dSEnji Cooper 7815*132f818dSEnji Cooper # A PIC object. 7816*132f818dSEnji Cooper func_append libobjs " $pic_object" 7817*132f818dSEnji Cooper arg=$pic_object 7818*132f818dSEnji Cooper } 7819*132f818dSEnji Cooper 7820*132f818dSEnji Cooper # Non-PIC object. 7821*132f818dSEnji Cooper if test none != "$non_pic_object"; then 7822*132f818dSEnji Cooper # Prepend the subdirectory the object is found in. 7823*132f818dSEnji Cooper non_pic_object=$xdir$non_pic_object 7824*132f818dSEnji Cooper 7825*132f818dSEnji Cooper # A standard non-PIC object 7826*132f818dSEnji Cooper func_append non_pic_objects " $non_pic_object" 7827*132f818dSEnji Cooper if test -z "$pic_object" || test none = "$pic_object"; then 7828*132f818dSEnji Cooper arg=$non_pic_object 7829*132f818dSEnji Cooper fi 7830*132f818dSEnji Cooper else 7831*132f818dSEnji Cooper # If the PIC object exists, use it instead. 7832*132f818dSEnji Cooper # $xdir was prepended to $pic_object above. 7833*132f818dSEnji Cooper non_pic_object=$pic_object 7834*132f818dSEnji Cooper func_append non_pic_objects " $non_pic_object" 7835*132f818dSEnji Cooper fi 7836*132f818dSEnji Cooper else 7837*132f818dSEnji Cooper # Only an error if not doing a dry-run. 7838*132f818dSEnji Cooper if $opt_dry_run; then 7839*132f818dSEnji Cooper # Extract subdirectory from the argument. 7840*132f818dSEnji Cooper func_dirname "$arg" "/" "" 7841*132f818dSEnji Cooper xdir=$func_dirname_result 7842*132f818dSEnji Cooper 7843*132f818dSEnji Cooper func_lo2o "$arg" 7844*132f818dSEnji Cooper pic_object=$xdir$objdir/$func_lo2o_result 7845*132f818dSEnji Cooper non_pic_object=$xdir$func_lo2o_result 7846*132f818dSEnji Cooper func_append libobjs " $pic_object" 7847*132f818dSEnji Cooper func_append non_pic_objects " $non_pic_object" 7848*132f818dSEnji Cooper else 7849*132f818dSEnji Cooper func_fatal_error "'$arg' is not a valid libtool object" 7850*132f818dSEnji Cooper fi 7851*132f818dSEnji Cooper fi 7852*132f818dSEnji Cooper ;; 7853*132f818dSEnji Cooper 7854*132f818dSEnji Cooper *.$libext) 7855*132f818dSEnji Cooper # An archive. 7856*132f818dSEnji Cooper func_append deplibs " $arg" 7857*132f818dSEnji Cooper func_append old_deplibs " $arg" 7858*132f818dSEnji Cooper continue 7859*132f818dSEnji Cooper ;; 7860*132f818dSEnji Cooper 7861*132f818dSEnji Cooper *.la) 7862*132f818dSEnji Cooper # A libtool-controlled library. 7863*132f818dSEnji Cooper 7864*132f818dSEnji Cooper func_resolve_sysroot "$arg" 7865*132f818dSEnji Cooper if test dlfiles = "$prev"; then 7866*132f818dSEnji Cooper # This library was specified with -dlopen. 7867*132f818dSEnji Cooper func_append dlfiles " $func_resolve_sysroot_result" 7868*132f818dSEnji Cooper prev= 7869*132f818dSEnji Cooper elif test dlprefiles = "$prev"; then 7870*132f818dSEnji Cooper # The library was specified with -dlpreopen. 7871*132f818dSEnji Cooper func_append dlprefiles " $func_resolve_sysroot_result" 7872*132f818dSEnji Cooper prev= 7873*132f818dSEnji Cooper else 7874*132f818dSEnji Cooper func_append deplibs " $func_resolve_sysroot_result" 7875*132f818dSEnji Cooper fi 7876*132f818dSEnji Cooper continue 7877*132f818dSEnji Cooper ;; 7878*132f818dSEnji Cooper 7879*132f818dSEnji Cooper # Some other compiler argument. 7880*132f818dSEnji Cooper *) 7881*132f818dSEnji Cooper # Unknown arguments in both finalize_command and compile_command need 7882*132f818dSEnji Cooper # to be aesthetically quoted because they are evaled later. 7883*132f818dSEnji Cooper func_quote_arg pretty "$arg" 7884*132f818dSEnji Cooper arg=$func_quote_arg_result 7885*132f818dSEnji Cooper ;; 7886*132f818dSEnji Cooper esac # arg 7887*132f818dSEnji Cooper 7888*132f818dSEnji Cooper # Now actually substitute the argument into the commands. 7889*132f818dSEnji Cooper if test -n "$arg"; then 7890*132f818dSEnji Cooper if test -n "$rpath_arg"; then 7891*132f818dSEnji Cooper func_append finalize_rpath " ${arg##*,}" 7892*132f818dSEnji Cooper unset rpath_arg 7893*132f818dSEnji Cooper else 7894*132f818dSEnji Cooper case $arg in 7895*132f818dSEnji Cooper -Wl,-rpath,*) 7896*132f818dSEnji Cooper func_append finalize_rpath " ${arg##*,}";; 7897*132f818dSEnji Cooper -Wl,-rpath) 7898*132f818dSEnji Cooper rpath_arg=1;; 7899*132f818dSEnji Cooper *) 7900*132f818dSEnji Cooper func_append compile_command " $arg" 7901*132f818dSEnji Cooper func_append finalize_command " $arg" 7902*132f818dSEnji Cooper esac 7903*132f818dSEnji Cooper fi 7904*132f818dSEnji Cooper fi 7905*132f818dSEnji Cooper done # argument parsing loop 7906*132f818dSEnji Cooper 7907*132f818dSEnji Cooper test -n "$prev" && \ 7908*132f818dSEnji Cooper func_fatal_help "the '$prevarg' option requires an argument" 7909*132f818dSEnji Cooper 7910*132f818dSEnji Cooper if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then 7911*132f818dSEnji Cooper eval arg=\"$export_dynamic_flag_spec\" 7912*132f818dSEnji Cooper func_append compile_command " $arg" 7913*132f818dSEnji Cooper func_append finalize_command " $arg" 7914*132f818dSEnji Cooper fi 7915*132f818dSEnji Cooper 7916*132f818dSEnji Cooper oldlibs= 7917*132f818dSEnji Cooper # calculate the name of the file, without its directory 7918*132f818dSEnji Cooper func_basename "$output" 7919*132f818dSEnji Cooper outputname=$func_basename_result 7920*132f818dSEnji Cooper libobjs_save=$libobjs 7921*132f818dSEnji Cooper 7922*132f818dSEnji Cooper if test -n "$shlibpath_var"; then 7923*132f818dSEnji Cooper # get the directories listed in $shlibpath_var 7924*132f818dSEnji Cooper eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` 7925*132f818dSEnji Cooper else 7926*132f818dSEnji Cooper shlib_search_path= 7927*132f818dSEnji Cooper fi 7928*132f818dSEnji Cooper eval sys_lib_search_path=\"$sys_lib_search_path_spec\" 7929*132f818dSEnji Cooper eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" 7930*132f818dSEnji Cooper 7931*132f818dSEnji Cooper # Definition is injected by LT_CONFIG during libtool generation. 7932*132f818dSEnji Cooper func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" 7933*132f818dSEnji Cooper 7934*132f818dSEnji Cooper func_dirname "$output" "/" "" 7935*132f818dSEnji Cooper output_objdir=$func_dirname_result$objdir 7936*132f818dSEnji Cooper func_to_tool_file "$output_objdir/" 7937*132f818dSEnji Cooper tool_output_objdir=$func_to_tool_file_result 7938*132f818dSEnji Cooper # Create the object directory. 7939*132f818dSEnji Cooper func_mkdir_p "$output_objdir" 7940*132f818dSEnji Cooper 7941*132f818dSEnji Cooper # Determine the type of output 7942*132f818dSEnji Cooper case $output in 7943*132f818dSEnji Cooper "") 7944*132f818dSEnji Cooper func_fatal_help "you must specify an output file" 7945*132f818dSEnji Cooper ;; 7946*132f818dSEnji Cooper *.$libext) linkmode=oldlib ;; 7947*132f818dSEnji Cooper *.lo | *.$objext) linkmode=obj ;; 7948*132f818dSEnji Cooper *.la) linkmode=lib ;; 7949*132f818dSEnji Cooper *) linkmode=prog ;; # Anything else should be a program. 7950*132f818dSEnji Cooper esac 7951*132f818dSEnji Cooper 7952*132f818dSEnji Cooper specialdeplibs= 7953*132f818dSEnji Cooper 7954*132f818dSEnji Cooper libs= 7955*132f818dSEnji Cooper # Find all interdependent deplibs by searching for libraries 7956*132f818dSEnji Cooper # that are linked more than once (e.g. -la -lb -la) 7957*132f818dSEnji Cooper for deplib in $deplibs; do 7958*132f818dSEnji Cooper if $opt_preserve_dup_deps; then 7959*132f818dSEnji Cooper case "$libs " in 7960*132f818dSEnji Cooper *" $deplib "*) func_append specialdeplibs " $deplib" ;; 7961*132f818dSEnji Cooper esac 7962*132f818dSEnji Cooper fi 7963*132f818dSEnji Cooper func_append libs " $deplib" 7964*132f818dSEnji Cooper done 7965*132f818dSEnji Cooper 7966*132f818dSEnji Cooper if test lib = "$linkmode"; then 7967*132f818dSEnji Cooper libs="$predeps $libs $compiler_lib_search_path $postdeps" 7968*132f818dSEnji Cooper 7969*132f818dSEnji Cooper # Compute libraries that are listed more than once in $predeps 7970*132f818dSEnji Cooper # $postdeps and mark them as special (i.e., whose duplicates are 7971*132f818dSEnji Cooper # not to be eliminated). 7972*132f818dSEnji Cooper pre_post_deps= 7973*132f818dSEnji Cooper if $opt_duplicate_compiler_generated_deps; then 7974*132f818dSEnji Cooper for pre_post_dep in $predeps $postdeps; do 7975*132f818dSEnji Cooper case "$pre_post_deps " in 7976*132f818dSEnji Cooper *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; 7977*132f818dSEnji Cooper esac 7978*132f818dSEnji Cooper func_append pre_post_deps " $pre_post_dep" 7979*132f818dSEnji Cooper done 7980*132f818dSEnji Cooper fi 7981*132f818dSEnji Cooper pre_post_deps= 7982*132f818dSEnji Cooper fi 7983*132f818dSEnji Cooper 7984*132f818dSEnji Cooper deplibs= 7985*132f818dSEnji Cooper newdependency_libs= 7986*132f818dSEnji Cooper newlib_search_path= 7987*132f818dSEnji Cooper need_relink=no # whether we're linking any uninstalled libtool libraries 7988*132f818dSEnji Cooper notinst_deplibs= # not-installed libtool libraries 7989*132f818dSEnji Cooper notinst_path= # paths that contain not-installed libtool libraries 7990*132f818dSEnji Cooper 7991*132f818dSEnji Cooper case $linkmode in 7992*132f818dSEnji Cooper lib) 7993*132f818dSEnji Cooper passes="conv dlpreopen link" 7994*132f818dSEnji Cooper for file in $dlfiles $dlprefiles; do 7995*132f818dSEnji Cooper case $file in 7996*132f818dSEnji Cooper *.la) ;; 7997*132f818dSEnji Cooper *) 7998*132f818dSEnji Cooper func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" 7999*132f818dSEnji Cooper ;; 8000*132f818dSEnji Cooper esac 8001*132f818dSEnji Cooper done 8002*132f818dSEnji Cooper ;; 8003*132f818dSEnji Cooper prog) 8004*132f818dSEnji Cooper compile_deplibs= 8005*132f818dSEnji Cooper finalize_deplibs= 8006*132f818dSEnji Cooper alldeplibs=false 8007*132f818dSEnji Cooper newdlfiles= 8008*132f818dSEnji Cooper newdlprefiles= 8009*132f818dSEnji Cooper passes="conv scan dlopen dlpreopen link" 8010*132f818dSEnji Cooper ;; 8011*132f818dSEnji Cooper *) passes="conv" 8012*132f818dSEnji Cooper ;; 8013*132f818dSEnji Cooper esac 8014*132f818dSEnji Cooper 8015*132f818dSEnji Cooper for pass in $passes; do 8016*132f818dSEnji Cooper # The preopen pass in lib mode reverses $deplibs; put it back here 8017*132f818dSEnji Cooper # so that -L comes before libs that need it for instance... 8018*132f818dSEnji Cooper if test lib,link = "$linkmode,$pass"; then 8019*132f818dSEnji Cooper ## FIXME: Find the place where the list is rebuilt in the wrong 8020*132f818dSEnji Cooper ## order, and fix it there properly 8021*132f818dSEnji Cooper tmp_deplibs= 8022*132f818dSEnji Cooper for deplib in $deplibs; do 8023*132f818dSEnji Cooper tmp_deplibs="$deplib $tmp_deplibs" 8024*132f818dSEnji Cooper done 8025*132f818dSEnji Cooper deplibs=$tmp_deplibs 8026*132f818dSEnji Cooper fi 8027*132f818dSEnji Cooper 8028*132f818dSEnji Cooper if test lib,link = "$linkmode,$pass" || 8029*132f818dSEnji Cooper test prog,scan = "$linkmode,$pass"; then 8030*132f818dSEnji Cooper libs=$deplibs 8031*132f818dSEnji Cooper deplibs= 8032*132f818dSEnji Cooper fi 8033*132f818dSEnji Cooper if test prog = "$linkmode"; then 8034*132f818dSEnji Cooper case $pass in 8035*132f818dSEnji Cooper dlopen) libs=$dlfiles ;; 8036*132f818dSEnji Cooper dlpreopen) libs=$dlprefiles ;; 8037*132f818dSEnji Cooper link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; 8038*132f818dSEnji Cooper esac 8039*132f818dSEnji Cooper fi 8040*132f818dSEnji Cooper if test lib,dlpreopen = "$linkmode,$pass"; then 8041*132f818dSEnji Cooper # Collect and forward deplibs of preopened libtool libs 8042*132f818dSEnji Cooper for lib in $dlprefiles; do 8043*132f818dSEnji Cooper # Ignore non-libtool-libs 8044*132f818dSEnji Cooper dependency_libs= 8045*132f818dSEnji Cooper func_resolve_sysroot "$lib" 8046*132f818dSEnji Cooper case $lib in 8047*132f818dSEnji Cooper *.la) func_source "$func_resolve_sysroot_result" ;; 8048*132f818dSEnji Cooper esac 8049*132f818dSEnji Cooper 8050*132f818dSEnji Cooper # Collect preopened libtool deplibs, except any this library 8051*132f818dSEnji Cooper # has declared as weak libs 8052*132f818dSEnji Cooper for deplib in $dependency_libs; do 8053*132f818dSEnji Cooper func_basename "$deplib" 8054*132f818dSEnji Cooper deplib_base=$func_basename_result 8055*132f818dSEnji Cooper case " $weak_libs " in 8056*132f818dSEnji Cooper *" $deplib_base "*) ;; 8057*132f818dSEnji Cooper *) func_append deplibs " $deplib" ;; 8058*132f818dSEnji Cooper esac 8059*132f818dSEnji Cooper done 8060*132f818dSEnji Cooper done 8061*132f818dSEnji Cooper libs=$dlprefiles 8062*132f818dSEnji Cooper fi 8063*132f818dSEnji Cooper if test dlopen = "$pass"; then 8064*132f818dSEnji Cooper # Collect dlpreopened libraries 8065*132f818dSEnji Cooper save_deplibs=$deplibs 8066*132f818dSEnji Cooper deplibs= 8067*132f818dSEnji Cooper fi 8068*132f818dSEnji Cooper 8069*132f818dSEnji Cooper for deplib in $libs; do 8070*132f818dSEnji Cooper lib= 8071*132f818dSEnji Cooper found=false 8072*132f818dSEnji Cooper case $deplib in 8073*132f818dSEnji Cooper -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ 8074*132f818dSEnji Cooper |-threads|-fopenmp|-fopenmp=*|-openmp|-mp|-xopenmp|-omp|-qsmp=*) 8075*132f818dSEnji Cooper if test prog,link = "$linkmode,$pass"; then 8076*132f818dSEnji Cooper compile_deplibs="$deplib $compile_deplibs" 8077*132f818dSEnji Cooper finalize_deplibs="$deplib $finalize_deplibs" 8078*132f818dSEnji Cooper else 8079*132f818dSEnji Cooper func_append compiler_flags " $deplib" 8080*132f818dSEnji Cooper if test lib = "$linkmode"; then 8081*132f818dSEnji Cooper case "$new_inherited_linker_flags " in 8082*132f818dSEnji Cooper *" $deplib "*) ;; 8083*132f818dSEnji Cooper * ) func_append new_inherited_linker_flags " $deplib" ;; 8084*132f818dSEnji Cooper esac 8085*132f818dSEnji Cooper fi 8086*132f818dSEnji Cooper fi 8087*132f818dSEnji Cooper continue 8088*132f818dSEnji Cooper ;; 8089*132f818dSEnji Cooper -l*) 8090*132f818dSEnji Cooper if test lib != "$linkmode" && test prog != "$linkmode"; then 8091*132f818dSEnji Cooper func_warning "'-l' is ignored for archives/objects" 8092*132f818dSEnji Cooper continue 8093*132f818dSEnji Cooper fi 8094*132f818dSEnji Cooper func_stripname '-l' '' "$deplib" 8095*132f818dSEnji Cooper name=$func_stripname_result 8096*132f818dSEnji Cooper if test lib = "$linkmode"; then 8097*132f818dSEnji Cooper searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" 8098*132f818dSEnji Cooper else 8099*132f818dSEnji Cooper searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" 8100*132f818dSEnji Cooper fi 8101*132f818dSEnji Cooper for searchdir in $searchdirs; do 8102*132f818dSEnji Cooper for search_ext in .la $std_shrext .so .a; do 8103*132f818dSEnji Cooper # Search the libtool library 8104*132f818dSEnji Cooper lib=$searchdir/lib$name$search_ext 8105*132f818dSEnji Cooper if test -f "$lib"; then 8106*132f818dSEnji Cooper if test .la = "$search_ext"; then 8107*132f818dSEnji Cooper found=: 8108*132f818dSEnji Cooper else 8109*132f818dSEnji Cooper found=false 8110*132f818dSEnji Cooper fi 8111*132f818dSEnji Cooper break 2 8112*132f818dSEnji Cooper fi 8113*132f818dSEnji Cooper done 8114*132f818dSEnji Cooper done 8115*132f818dSEnji Cooper if $found; then 8116*132f818dSEnji Cooper # deplib is a libtool library 8117*132f818dSEnji Cooper # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, 8118*132f818dSEnji Cooper # We need to do some special things here, and not later. 8119*132f818dSEnji Cooper if test yes = "$allow_libtool_libs_with_static_runtimes"; then 8120*132f818dSEnji Cooper case " $predeps $postdeps " in 8121*132f818dSEnji Cooper *" $deplib "*) 8122*132f818dSEnji Cooper if func_lalib_p "$lib"; then 8123*132f818dSEnji Cooper library_names= 8124*132f818dSEnji Cooper old_library= 8125*132f818dSEnji Cooper func_source "$lib" 8126*132f818dSEnji Cooper for l in $old_library $library_names; do 8127*132f818dSEnji Cooper ll=$l 8128*132f818dSEnji Cooper done 8129*132f818dSEnji Cooper if test "X$ll" = "X$old_library"; then # only static version available 8130*132f818dSEnji Cooper found=false 8131*132f818dSEnji Cooper func_dirname "$lib" "" "." 8132*132f818dSEnji Cooper ladir=$func_dirname_result 8133*132f818dSEnji Cooper lib=$ladir/$old_library 8134*132f818dSEnji Cooper if test prog,link = "$linkmode,$pass"; then 8135*132f818dSEnji Cooper compile_deplibs="$deplib $compile_deplibs" 8136*132f818dSEnji Cooper finalize_deplibs="$deplib $finalize_deplibs" 8137*132f818dSEnji Cooper else 8138*132f818dSEnji Cooper deplibs="$deplib $deplibs" 8139*132f818dSEnji Cooper test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" 8140*132f818dSEnji Cooper fi 8141*132f818dSEnji Cooper continue 8142*132f818dSEnji Cooper fi 8143*132f818dSEnji Cooper fi 8144*132f818dSEnji Cooper ;; 8145*132f818dSEnji Cooper *) ;; 8146*132f818dSEnji Cooper esac 8147*132f818dSEnji Cooper fi 8148*132f818dSEnji Cooper else 8149*132f818dSEnji Cooper # deplib doesn't seem to be a libtool library 8150*132f818dSEnji Cooper if test prog,link = "$linkmode,$pass"; then 8151*132f818dSEnji Cooper compile_deplibs="$deplib $compile_deplibs" 8152*132f818dSEnji Cooper finalize_deplibs="$deplib $finalize_deplibs" 8153*132f818dSEnji Cooper else 8154*132f818dSEnji Cooper deplibs="$deplib $deplibs" 8155*132f818dSEnji Cooper test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" 8156*132f818dSEnji Cooper fi 8157*132f818dSEnji Cooper continue 8158*132f818dSEnji Cooper fi 8159*132f818dSEnji Cooper ;; # -l 8160*132f818dSEnji Cooper *.ltframework) 8161*132f818dSEnji Cooper if test prog,link = "$linkmode,$pass"; then 8162*132f818dSEnji Cooper compile_deplibs="$deplib $compile_deplibs" 8163*132f818dSEnji Cooper finalize_deplibs="$deplib $finalize_deplibs" 8164*132f818dSEnji Cooper else 8165*132f818dSEnji Cooper deplibs="$deplib $deplibs" 8166*132f818dSEnji Cooper if test lib = "$linkmode"; then 8167*132f818dSEnji Cooper case "$new_inherited_linker_flags " in 8168*132f818dSEnji Cooper *" $deplib "*) ;; 8169*132f818dSEnji Cooper * ) func_append new_inherited_linker_flags " $deplib" ;; 8170*132f818dSEnji Cooper esac 8171*132f818dSEnji Cooper fi 8172*132f818dSEnji Cooper fi 8173*132f818dSEnji Cooper continue 8174*132f818dSEnji Cooper ;; 8175*132f818dSEnji Cooper -L*) 8176*132f818dSEnji Cooper case $linkmode in 8177*132f818dSEnji Cooper lib) 8178*132f818dSEnji Cooper deplibs="$deplib $deplibs" 8179*132f818dSEnji Cooper test conv = "$pass" && continue 8180*132f818dSEnji Cooper newdependency_libs="$deplib $newdependency_libs" 8181*132f818dSEnji Cooper func_stripname '-L' '' "$deplib" 8182*132f818dSEnji Cooper func_resolve_sysroot "$func_stripname_result" 8183*132f818dSEnji Cooper func_append newlib_search_path " $func_resolve_sysroot_result" 8184*132f818dSEnji Cooper ;; 8185*132f818dSEnji Cooper prog) 8186*132f818dSEnji Cooper if test conv = "$pass"; then 8187*132f818dSEnji Cooper deplibs="$deplib $deplibs" 8188*132f818dSEnji Cooper continue 8189*132f818dSEnji Cooper fi 8190*132f818dSEnji Cooper if test scan = "$pass"; then 8191*132f818dSEnji Cooper deplibs="$deplib $deplibs" 8192*132f818dSEnji Cooper else 8193*132f818dSEnji Cooper compile_deplibs="$deplib $compile_deplibs" 8194*132f818dSEnji Cooper finalize_deplibs="$deplib $finalize_deplibs" 8195*132f818dSEnji Cooper fi 8196*132f818dSEnji Cooper func_stripname '-L' '' "$deplib" 8197*132f818dSEnji Cooper func_resolve_sysroot "$func_stripname_result" 8198*132f818dSEnji Cooper func_append newlib_search_path " $func_resolve_sysroot_result" 8199*132f818dSEnji Cooper ;; 8200*132f818dSEnji Cooper *) 8201*132f818dSEnji Cooper func_warning "'-L' is ignored for archives/objects" 8202*132f818dSEnji Cooper ;; 8203*132f818dSEnji Cooper esac # linkmode 8204*132f818dSEnji Cooper continue 8205*132f818dSEnji Cooper ;; # -L 8206*132f818dSEnji Cooper -R*) 8207*132f818dSEnji Cooper if test link = "$pass"; then 8208*132f818dSEnji Cooper func_stripname '-R' '' "$deplib" 8209*132f818dSEnji Cooper func_resolve_sysroot "$func_stripname_result" 8210*132f818dSEnji Cooper dir=$func_resolve_sysroot_result 8211*132f818dSEnji Cooper # Make sure the xrpath contains only unique directories. 8212*132f818dSEnji Cooper case "$xrpath " in 8213*132f818dSEnji Cooper *" $dir "*) ;; 8214*132f818dSEnji Cooper *) func_append xrpath " $dir" ;; 8215*132f818dSEnji Cooper esac 8216*132f818dSEnji Cooper fi 8217*132f818dSEnji Cooper deplibs="$deplib $deplibs" 8218*132f818dSEnji Cooper continue 8219*132f818dSEnji Cooper ;; 8220*132f818dSEnji Cooper *.la) 8221*132f818dSEnji Cooper func_resolve_sysroot "$deplib" 8222*132f818dSEnji Cooper lib=$func_resolve_sysroot_result 8223*132f818dSEnji Cooper ;; 8224*132f818dSEnji Cooper *.$libext) 8225*132f818dSEnji Cooper if test conv = "$pass"; then 8226*132f818dSEnji Cooper deplibs="$deplib $deplibs" 8227*132f818dSEnji Cooper continue 8228*132f818dSEnji Cooper fi 8229*132f818dSEnji Cooper case $linkmode in 8230*132f818dSEnji Cooper lib) 8231*132f818dSEnji Cooper # Linking convenience modules into shared libraries is allowed, 8232*132f818dSEnji Cooper # but linking other static libraries is non-portable. 8233*132f818dSEnji Cooper case " $dlpreconveniencelibs " in 8234*132f818dSEnji Cooper *" $deplib "*) ;; 8235*132f818dSEnji Cooper *) 8236*132f818dSEnji Cooper valid_a_lib=false 8237*132f818dSEnji Cooper case $deplibs_check_method in 8238*132f818dSEnji Cooper match_pattern*) 8239*132f818dSEnji Cooper set dummy $deplibs_check_method; shift 8240*132f818dSEnji Cooper match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` 8241*132f818dSEnji Cooper if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ 8242*132f818dSEnji Cooper | $EGREP "$match_pattern_regex" > /dev/null; then 8243*132f818dSEnji Cooper valid_a_lib=: 8244*132f818dSEnji Cooper fi 8245*132f818dSEnji Cooper ;; 8246*132f818dSEnji Cooper pass_all) 8247*132f818dSEnji Cooper valid_a_lib=: 8248*132f818dSEnji Cooper ;; 8249*132f818dSEnji Cooper esac 8250*132f818dSEnji Cooper if $valid_a_lib; then 8251*132f818dSEnji Cooper func_warning "Linking the shared library $output against the static library $deplib is not portable!" 8252*132f818dSEnji Cooper deplibs="$deplib $deplibs" 8253*132f818dSEnji Cooper else 8254*132f818dSEnji Cooper func_warning "Trying to link with static lib archive $deplib." 8255*132f818dSEnji Cooper func_warning "I have the capability to make that library automatically link in when" 8256*132f818dSEnji Cooper func_warning "you link to this library. But I can only do this if you have a" 8257*132f818dSEnji Cooper func_warning "shared version of the library, which you do not appear to have" 8258*132f818dSEnji Cooper func_warning "because the file extensions .$libext of this argument makes me believe" 8259*132f818dSEnji Cooper func_warning "that it is just a static archive that I should not use here." 8260*132f818dSEnji Cooper fi 8261*132f818dSEnji Cooper ;; 8262*132f818dSEnji Cooper esac 8263*132f818dSEnji Cooper continue 8264*132f818dSEnji Cooper ;; 8265*132f818dSEnji Cooper prog) 8266*132f818dSEnji Cooper if test link != "$pass"; then 8267*132f818dSEnji Cooper deplibs="$deplib $deplibs" 8268*132f818dSEnji Cooper else 8269*132f818dSEnji Cooper compile_deplibs="$deplib $compile_deplibs" 8270*132f818dSEnji Cooper finalize_deplibs="$deplib $finalize_deplibs" 8271*132f818dSEnji Cooper fi 8272*132f818dSEnji Cooper continue 8273*132f818dSEnji Cooper ;; 8274*132f818dSEnji Cooper esac # linkmode 8275*132f818dSEnji Cooper ;; # *.$libext 8276*132f818dSEnji Cooper *.lo | *.$objext) 8277*132f818dSEnji Cooper if test conv = "$pass"; then 8278*132f818dSEnji Cooper deplibs="$deplib $deplibs" 8279*132f818dSEnji Cooper elif test prog = "$linkmode"; then 8280*132f818dSEnji Cooper if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then 8281*132f818dSEnji Cooper # If there is no dlopen support or we're linking statically, 8282*132f818dSEnji Cooper # we need to preload. 8283*132f818dSEnji Cooper func_append newdlprefiles " $deplib" 8284*132f818dSEnji Cooper compile_deplibs="$deplib $compile_deplibs" 8285*132f818dSEnji Cooper finalize_deplibs="$deplib $finalize_deplibs" 8286*132f818dSEnji Cooper else 8287*132f818dSEnji Cooper func_append newdlfiles " $deplib" 8288*132f818dSEnji Cooper fi 8289*132f818dSEnji Cooper fi 8290*132f818dSEnji Cooper continue 8291*132f818dSEnji Cooper ;; 8292*132f818dSEnji Cooper %DEPLIBS%) 8293*132f818dSEnji Cooper alldeplibs=: 8294*132f818dSEnji Cooper continue 8295*132f818dSEnji Cooper ;; 8296*132f818dSEnji Cooper esac # case $deplib 8297*132f818dSEnji Cooper 8298*132f818dSEnji Cooper $found || test -f "$lib" \ 8299*132f818dSEnji Cooper || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" 8300*132f818dSEnji Cooper 8301*132f818dSEnji Cooper # Check to see that this really is a libtool archive. 8302*132f818dSEnji Cooper func_lalib_unsafe_p "$lib" \ 8303*132f818dSEnji Cooper || func_fatal_error "'$lib' is not a valid libtool archive" 8304*132f818dSEnji Cooper 8305*132f818dSEnji Cooper func_dirname "$lib" "" "." 8306*132f818dSEnji Cooper ladir=$func_dirname_result 8307*132f818dSEnji Cooper 8308*132f818dSEnji Cooper dlname= 8309*132f818dSEnji Cooper dlopen= 8310*132f818dSEnji Cooper dlpreopen= 8311*132f818dSEnji Cooper libdir= 8312*132f818dSEnji Cooper library_names= 8313*132f818dSEnji Cooper old_library= 8314*132f818dSEnji Cooper inherited_linker_flags= 8315*132f818dSEnji Cooper # If the library was installed with an old release of libtool, 8316*132f818dSEnji Cooper # it will not redefine variables installed, or shouldnotlink 8317*132f818dSEnji Cooper installed=yes 8318*132f818dSEnji Cooper shouldnotlink=no 8319*132f818dSEnji Cooper avoidtemprpath= 8320*132f818dSEnji Cooper 8321*132f818dSEnji Cooper 8322*132f818dSEnji Cooper # Read the .la file 8323*132f818dSEnji Cooper func_source "$lib" 8324*132f818dSEnji Cooper 8325*132f818dSEnji Cooper # Convert "-framework foo" to "foo.ltframework" 8326*132f818dSEnji Cooper if test -n "$inherited_linker_flags"; then 8327*132f818dSEnji Cooper tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` 8328*132f818dSEnji Cooper for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do 8329*132f818dSEnji Cooper case " $new_inherited_linker_flags " in 8330*132f818dSEnji Cooper *" $tmp_inherited_linker_flag "*) ;; 8331*132f818dSEnji Cooper *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; 8332*132f818dSEnji Cooper esac 8333*132f818dSEnji Cooper done 8334*132f818dSEnji Cooper fi 8335*132f818dSEnji Cooper dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 8336*132f818dSEnji Cooper if test lib,link = "$linkmode,$pass" || 8337*132f818dSEnji Cooper test prog,scan = "$linkmode,$pass" || 8338*132f818dSEnji Cooper { test prog != "$linkmode" && test lib != "$linkmode"; }; then 8339*132f818dSEnji Cooper test -n "$dlopen" && func_append dlfiles " $dlopen" 8340*132f818dSEnji Cooper test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" 8341*132f818dSEnji Cooper fi 8342*132f818dSEnji Cooper 8343*132f818dSEnji Cooper if test conv = "$pass"; then 8344*132f818dSEnji Cooper # Only check for convenience libraries 8345*132f818dSEnji Cooper deplibs="$lib $deplibs" 8346*132f818dSEnji Cooper if test -z "$libdir"; then 8347*132f818dSEnji Cooper if test -z "$old_library"; then 8348*132f818dSEnji Cooper func_fatal_error "cannot find name of link library for '$lib'" 8349*132f818dSEnji Cooper fi 8350*132f818dSEnji Cooper # It is a libtool convenience library, so add in its objects. 8351*132f818dSEnji Cooper func_append convenience " $ladir/$objdir/$old_library" 8352*132f818dSEnji Cooper func_append old_convenience " $ladir/$objdir/$old_library" 8353*132f818dSEnji Cooper elif test prog != "$linkmode" && test lib != "$linkmode"; then 8354*132f818dSEnji Cooper func_fatal_error "'$lib' is not a convenience library" 8355*132f818dSEnji Cooper fi 8356*132f818dSEnji Cooper tmp_libs= 8357*132f818dSEnji Cooper for deplib in $dependency_libs; do 8358*132f818dSEnji Cooper deplibs="$deplib $deplibs" 8359*132f818dSEnji Cooper if $opt_preserve_dup_deps; then 8360*132f818dSEnji Cooper case "$tmp_libs " in 8361*132f818dSEnji Cooper *" $deplib "*) func_append specialdeplibs " $deplib" ;; 8362*132f818dSEnji Cooper esac 8363*132f818dSEnji Cooper fi 8364*132f818dSEnji Cooper func_append tmp_libs " $deplib" 8365*132f818dSEnji Cooper done 8366*132f818dSEnji Cooper continue 8367*132f818dSEnji Cooper fi # $pass = conv 8368*132f818dSEnji Cooper 8369*132f818dSEnji Cooper 8370*132f818dSEnji Cooper # Get the name of the library we link against. 8371*132f818dSEnji Cooper linklib= 8372*132f818dSEnji Cooper if test -n "$old_library" && 8373*132f818dSEnji Cooper { test yes = "$prefer_static_libs" || 8374*132f818dSEnji Cooper test built,no = "$prefer_static_libs,$installed"; }; then 8375*132f818dSEnji Cooper linklib=$old_library 8376*132f818dSEnji Cooper else 8377*132f818dSEnji Cooper for l in $old_library $library_names; do 8378*132f818dSEnji Cooper linklib=$l 8379*132f818dSEnji Cooper done 8380*132f818dSEnji Cooper fi 8381*132f818dSEnji Cooper if test -z "$linklib"; then 8382*132f818dSEnji Cooper func_fatal_error "cannot find name of link library for '$lib'" 8383*132f818dSEnji Cooper fi 8384*132f818dSEnji Cooper 8385*132f818dSEnji Cooper # This library was specified with -dlopen. 8386*132f818dSEnji Cooper if test dlopen = "$pass"; then 8387*132f818dSEnji Cooper test -z "$libdir" \ 8388*132f818dSEnji Cooper && func_fatal_error "cannot -dlopen a convenience library: '$lib'" 8389*132f818dSEnji Cooper if test -z "$dlname" || 8390*132f818dSEnji Cooper test yes != "$dlopen_support" || 8391*132f818dSEnji Cooper test no = "$build_libtool_libs" 8392*132f818dSEnji Cooper then 8393*132f818dSEnji Cooper # If there is no dlname, no dlopen support or we're linking 8394*132f818dSEnji Cooper # statically, we need to preload. We also need to preload any 8395*132f818dSEnji Cooper # dependent libraries so libltdl's deplib preloader doesn't 8396*132f818dSEnji Cooper # bomb out in the load deplibs phase. 8397*132f818dSEnji Cooper func_append dlprefiles " $lib $dependency_libs" 8398*132f818dSEnji Cooper else 8399*132f818dSEnji Cooper func_append newdlfiles " $lib" 8400*132f818dSEnji Cooper fi 8401*132f818dSEnji Cooper continue 8402*132f818dSEnji Cooper fi # $pass = dlopen 8403*132f818dSEnji Cooper 8404*132f818dSEnji Cooper # We need an absolute path. 8405*132f818dSEnji Cooper case $ladir in 8406*132f818dSEnji Cooper [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; 8407*132f818dSEnji Cooper *) 8408*132f818dSEnji Cooper abs_ladir=`cd "$ladir" && pwd` 8409*132f818dSEnji Cooper if test -z "$abs_ladir"; then 8410*132f818dSEnji Cooper func_warning "cannot determine absolute directory name of '$ladir'" 8411*132f818dSEnji Cooper func_warning "passing it literally to the linker, although it might fail" 8412*132f818dSEnji Cooper abs_ladir=$ladir 8413*132f818dSEnji Cooper fi 8414*132f818dSEnji Cooper ;; 8415*132f818dSEnji Cooper esac 8416*132f818dSEnji Cooper func_basename "$lib" 8417*132f818dSEnji Cooper laname=$func_basename_result 8418*132f818dSEnji Cooper 8419*132f818dSEnji Cooper # Find the relevant object directory and library name. 8420*132f818dSEnji Cooper if test yes = "$installed"; then 8421*132f818dSEnji Cooper if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then 8422*132f818dSEnji Cooper func_warning "library '$lib' was moved." 8423*132f818dSEnji Cooper dir=$ladir 8424*132f818dSEnji Cooper absdir=$abs_ladir 8425*132f818dSEnji Cooper libdir=$abs_ladir 8426*132f818dSEnji Cooper else 8427*132f818dSEnji Cooper dir=$lt_sysroot$libdir 8428*132f818dSEnji Cooper absdir=$lt_sysroot$libdir 8429*132f818dSEnji Cooper fi 8430*132f818dSEnji Cooper test yes = "$hardcode_automatic" && avoidtemprpath=yes 8431*132f818dSEnji Cooper else 8432*132f818dSEnji Cooper if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then 8433*132f818dSEnji Cooper dir=$ladir 8434*132f818dSEnji Cooper absdir=$abs_ladir 8435*132f818dSEnji Cooper # Remove this search path later 8436*132f818dSEnji Cooper func_append notinst_path " $abs_ladir" 8437*132f818dSEnji Cooper else 8438*132f818dSEnji Cooper dir=$ladir/$objdir 8439*132f818dSEnji Cooper absdir=$abs_ladir/$objdir 8440*132f818dSEnji Cooper # Remove this search path later 8441*132f818dSEnji Cooper func_append notinst_path " $abs_ladir" 8442*132f818dSEnji Cooper fi 8443*132f818dSEnji Cooper fi # $installed = yes 8444*132f818dSEnji Cooper func_stripname 'lib' '.la' "$laname" 8445*132f818dSEnji Cooper name=$func_stripname_result 8446*132f818dSEnji Cooper 8447*132f818dSEnji Cooper # This library was specified with -dlpreopen. 8448*132f818dSEnji Cooper if test dlpreopen = "$pass"; then 8449*132f818dSEnji Cooper if test -z "$libdir" && test prog = "$linkmode"; then 8450*132f818dSEnji Cooper func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" 8451*132f818dSEnji Cooper fi 8452*132f818dSEnji Cooper case $host in 8453*132f818dSEnji Cooper # special handling for platforms with PE-DLLs. 8454*132f818dSEnji Cooper *cygwin* | *mingw* | *windows* | *cegcc* ) 8455*132f818dSEnji Cooper # Linker will automatically link against shared library if both 8456*132f818dSEnji Cooper # static and shared are present. Therefore, ensure we extract 8457*132f818dSEnji Cooper # symbols from the import library if a shared library is present 8458*132f818dSEnji Cooper # (otherwise, the dlopen module name will be incorrect). We do 8459*132f818dSEnji Cooper # this by putting the import library name into $newdlprefiles. 8460*132f818dSEnji Cooper # We recover the dlopen module name by 'saving' the la file 8461*132f818dSEnji Cooper # name in a special purpose variable, and (later) extracting the 8462*132f818dSEnji Cooper # dlname from the la file. 8463*132f818dSEnji Cooper if test -n "$dlname"; then 8464*132f818dSEnji Cooper func_tr_sh "$dir/$linklib" 8465*132f818dSEnji Cooper eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" 8466*132f818dSEnji Cooper func_append newdlprefiles " $dir/$linklib" 8467*132f818dSEnji Cooper else 8468*132f818dSEnji Cooper func_append newdlprefiles " $dir/$old_library" 8469*132f818dSEnji Cooper # Keep a list of preopened convenience libraries to check 8470*132f818dSEnji Cooper # that they are being used correctly in the link pass. 8471*132f818dSEnji Cooper test -z "$libdir" && \ 8472*132f818dSEnji Cooper func_append dlpreconveniencelibs " $dir/$old_library" 8473*132f818dSEnji Cooper fi 8474*132f818dSEnji Cooper ;; 8475*132f818dSEnji Cooper * ) 8476*132f818dSEnji Cooper # Prefer using a static library (so that no silly _DYNAMIC symbols 8477*132f818dSEnji Cooper # are required to link). 8478*132f818dSEnji Cooper if test -n "$old_library"; then 8479*132f818dSEnji Cooper func_append newdlprefiles " $dir/$old_library" 8480*132f818dSEnji Cooper # Keep a list of preopened convenience libraries to check 8481*132f818dSEnji Cooper # that they are being used correctly in the link pass. 8482*132f818dSEnji Cooper test -z "$libdir" && \ 8483*132f818dSEnji Cooper func_append dlpreconveniencelibs " $dir/$old_library" 8484*132f818dSEnji Cooper # Otherwise, use the dlname, so that lt_dlopen finds it. 8485*132f818dSEnji Cooper elif test -n "$dlname"; then 8486*132f818dSEnji Cooper func_append newdlprefiles " $dir/$dlname" 8487*132f818dSEnji Cooper else 8488*132f818dSEnji Cooper func_append newdlprefiles " $dir/$linklib" 8489*132f818dSEnji Cooper fi 8490*132f818dSEnji Cooper ;; 8491*132f818dSEnji Cooper esac 8492*132f818dSEnji Cooper fi # $pass = dlpreopen 8493*132f818dSEnji Cooper 8494*132f818dSEnji Cooper if test -z "$libdir"; then 8495*132f818dSEnji Cooper # Link the convenience library 8496*132f818dSEnji Cooper if test lib = "$linkmode"; then 8497*132f818dSEnji Cooper deplibs="$dir/$old_library $deplibs" 8498*132f818dSEnji Cooper elif test prog,link = "$linkmode,$pass"; then 8499*132f818dSEnji Cooper compile_deplibs="$dir/$old_library $compile_deplibs" 8500*132f818dSEnji Cooper finalize_deplibs="$dir/$old_library $finalize_deplibs" 8501*132f818dSEnji Cooper else 8502*132f818dSEnji Cooper deplibs="$lib $deplibs" # used for prog,scan pass 8503*132f818dSEnji Cooper fi 8504*132f818dSEnji Cooper continue 8505*132f818dSEnji Cooper fi 8506*132f818dSEnji Cooper 8507*132f818dSEnji Cooper 8508*132f818dSEnji Cooper if test prog = "$linkmode" && test link != "$pass"; then 8509*132f818dSEnji Cooper func_append newlib_search_path " $ladir" 8510*132f818dSEnji Cooper deplibs="$lib $deplibs" 8511*132f818dSEnji Cooper 8512*132f818dSEnji Cooper linkalldeplibs=false 8513*132f818dSEnji Cooper if test no != "$link_all_deplibs" || test -z "$library_names" || 8514*132f818dSEnji Cooper test no = "$build_libtool_libs"; then 8515*132f818dSEnji Cooper linkalldeplibs=: 8516*132f818dSEnji Cooper fi 8517*132f818dSEnji Cooper 8518*132f818dSEnji Cooper tmp_libs= 8519*132f818dSEnji Cooper for deplib in $dependency_libs; do 8520*132f818dSEnji Cooper case $deplib in 8521*132f818dSEnji Cooper -L*) func_stripname '-L' '' "$deplib" 8522*132f818dSEnji Cooper func_resolve_sysroot "$func_stripname_result" 8523*132f818dSEnji Cooper func_append newlib_search_path " $func_resolve_sysroot_result" 8524*132f818dSEnji Cooper ;; 8525*132f818dSEnji Cooper esac 8526*132f818dSEnji Cooper # Need to link against all dependency_libs? 8527*132f818dSEnji Cooper if $linkalldeplibs; then 8528*132f818dSEnji Cooper deplibs="$deplib $deplibs" 8529*132f818dSEnji Cooper else 8530*132f818dSEnji Cooper # Need to hardcode shared library paths 8531*132f818dSEnji Cooper # or/and link against static libraries 8532*132f818dSEnji Cooper newdependency_libs="$deplib $newdependency_libs" 8533*132f818dSEnji Cooper fi 8534*132f818dSEnji Cooper if $opt_preserve_dup_deps; then 8535*132f818dSEnji Cooper case "$tmp_libs " in 8536*132f818dSEnji Cooper *" $deplib "*) func_append specialdeplibs " $deplib" ;; 8537*132f818dSEnji Cooper esac 8538*132f818dSEnji Cooper fi 8539*132f818dSEnji Cooper func_append tmp_libs " $deplib" 8540*132f818dSEnji Cooper done # for deplib 8541*132f818dSEnji Cooper continue 8542*132f818dSEnji Cooper fi # $linkmode = prog... 8543*132f818dSEnji Cooper 8544*132f818dSEnji Cooper if test prog,link = "$linkmode,$pass"; then 8545*132f818dSEnji Cooper if test -n "$library_names" && 8546*132f818dSEnji Cooper { { test no = "$prefer_static_libs" || 8547*132f818dSEnji Cooper test built,yes = "$prefer_static_libs,$installed"; } || 8548*132f818dSEnji Cooper test -z "$old_library"; }; then 8549*132f818dSEnji Cooper # We need to hardcode the library path 8550*132f818dSEnji Cooper if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then 8551*132f818dSEnji Cooper # Make sure the rpath contains only unique directories. 8552*132f818dSEnji Cooper case $temp_rpath: in 8553*132f818dSEnji Cooper *"$absdir:"*) ;; 8554*132f818dSEnji Cooper *) case $absdir in 8555*132f818dSEnji Cooper "$progdir/"*) func_append temp_rpath "$absdir:" ;; 8556*132f818dSEnji Cooper *) func_append temp_rpath_tail "$absdir:" ;; 8557*132f818dSEnji Cooper esac 8558*132f818dSEnji Cooper esac 8559*132f818dSEnji Cooper fi 8560*132f818dSEnji Cooper 8561*132f818dSEnji Cooper # Hardcode the library path. 8562*132f818dSEnji Cooper # Skip directories that are in the system default run-time 8563*132f818dSEnji Cooper # search path. 8564*132f818dSEnji Cooper case " $sys_lib_dlsearch_path " in 8565*132f818dSEnji Cooper *" $absdir "*) ;; 8566*132f818dSEnji Cooper *) 8567*132f818dSEnji Cooper case "$compile_rpath$compile_rpath_tail " in 8568*132f818dSEnji Cooper *" $absdir "*) ;; 8569*132f818dSEnji Cooper *) case $absdir in 8570*132f818dSEnji Cooper "$progdir/"*) func_append compile_rpath " $absdir" ;; 8571*132f818dSEnji Cooper *) func_append compile_rpath_tail " $absdir" ;; 8572*132f818dSEnji Cooper esac 8573*132f818dSEnji Cooper esac 8574*132f818dSEnji Cooper ;; 8575*132f818dSEnji Cooper esac 8576*132f818dSEnji Cooper case " $sys_lib_dlsearch_path " in 8577*132f818dSEnji Cooper *" $libdir "*) ;; 8578*132f818dSEnji Cooper *) 8579*132f818dSEnji Cooper case "$finalize_rpath " in 8580*132f818dSEnji Cooper *" $libdir "*) ;; 8581*132f818dSEnji Cooper *) func_append finalize_rpath " $libdir" ;; 8582*132f818dSEnji Cooper esac 8583*132f818dSEnji Cooper ;; 8584*132f818dSEnji Cooper esac 8585*132f818dSEnji Cooper fi # $linkmode,$pass = prog,link... 8586*132f818dSEnji Cooper 8587*132f818dSEnji Cooper if $alldeplibs && 8588*132f818dSEnji Cooper { test pass_all = "$deplibs_check_method" || 8589*132f818dSEnji Cooper { test yes = "$build_libtool_libs" && 8590*132f818dSEnji Cooper test -n "$library_names"; }; }; then 8591*132f818dSEnji Cooper # We only need to search for static libraries 8592*132f818dSEnji Cooper continue 8593*132f818dSEnji Cooper fi 8594*132f818dSEnji Cooper fi 8595*132f818dSEnji Cooper 8596*132f818dSEnji Cooper link_static=no # Whether the deplib will be linked statically 8597*132f818dSEnji Cooper use_static_libs=$prefer_static_libs 8598*132f818dSEnji Cooper if test built = "$use_static_libs" && test yes = "$installed"; then 8599*132f818dSEnji Cooper use_static_libs=no 8600*132f818dSEnji Cooper fi 8601*132f818dSEnji Cooper if test -n "$library_names" && 8602*132f818dSEnji Cooper { test no = "$use_static_libs" || test -z "$old_library"; }; then 8603*132f818dSEnji Cooper case $host_os in 8604*132f818dSEnji Cooper cygwin* | mingw* | windows* | cegcc* | os2*) 8605*132f818dSEnji Cooper # No point in relinking DLLs because paths are not encoded 8606*132f818dSEnji Cooper func_append notinst_deplibs " $lib" 8607*132f818dSEnji Cooper need_relink=no 8608*132f818dSEnji Cooper ;; 8609*132f818dSEnji Cooper *) 8610*132f818dSEnji Cooper if test no = "$installed"; then 8611*132f818dSEnji Cooper func_append notinst_deplibs " $lib" 8612*132f818dSEnji Cooper need_relink=yes 8613*132f818dSEnji Cooper fi 8614*132f818dSEnji Cooper ;; 8615*132f818dSEnji Cooper esac 8616*132f818dSEnji Cooper # This is a shared library 8617*132f818dSEnji Cooper 8618*132f818dSEnji Cooper # Warn about portability, can't link against -module's on some 8619*132f818dSEnji Cooper # systems (darwin). Don't bleat about dlopened modules though! 8620*132f818dSEnji Cooper dlopenmodule= 8621*132f818dSEnji Cooper for dlpremoduletest in $dlprefiles; do 8622*132f818dSEnji Cooper if test "X$dlpremoduletest" = "X$lib"; then 8623*132f818dSEnji Cooper dlopenmodule=$dlpremoduletest 8624*132f818dSEnji Cooper break 8625*132f818dSEnji Cooper fi 8626*132f818dSEnji Cooper done 8627*132f818dSEnji Cooper if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then 8628*132f818dSEnji Cooper echo 8629*132f818dSEnji Cooper if test prog = "$linkmode"; then 8630*132f818dSEnji Cooper func_warning "Linking the executable $output against the loadable module" 8631*132f818dSEnji Cooper else 8632*132f818dSEnji Cooper func_warning "Linking the shared library $output against the loadable module" 8633*132f818dSEnji Cooper fi 8634*132f818dSEnji Cooper func_warning "$linklib is not portable!" 8635*132f818dSEnji Cooper fi 8636*132f818dSEnji Cooper if test lib = "$linkmode" && 8637*132f818dSEnji Cooper test yes = "$hardcode_into_libs"; then 8638*132f818dSEnji Cooper # Hardcode the library path. 8639*132f818dSEnji Cooper # Skip directories that are in the system default run-time 8640*132f818dSEnji Cooper # search path. 8641*132f818dSEnji Cooper case " $sys_lib_dlsearch_path " in 8642*132f818dSEnji Cooper *" $absdir "*) ;; 8643*132f818dSEnji Cooper *) 8644*132f818dSEnji Cooper case "$compile_rpath$compile_rpath_tail " in 8645*132f818dSEnji Cooper *" $absdir "*) ;; 8646*132f818dSEnji Cooper *) case $absdir in 8647*132f818dSEnji Cooper "$progdir/"*) func_append compile_rpath " $absdir" ;; 8648*132f818dSEnji Cooper *) func_append compile_rpath_tail " $absdir" ;; 8649*132f818dSEnji Cooper esac 8650*132f818dSEnji Cooper esac 8651*132f818dSEnji Cooper ;; 8652*132f818dSEnji Cooper esac 8653*132f818dSEnji Cooper case " $sys_lib_dlsearch_path " in 8654*132f818dSEnji Cooper *" $libdir "*) ;; 8655*132f818dSEnji Cooper *) 8656*132f818dSEnji Cooper case "$finalize_rpath " in 8657*132f818dSEnji Cooper *" $libdir "*) ;; 8658*132f818dSEnji Cooper *) func_append finalize_rpath " $libdir" ;; 8659*132f818dSEnji Cooper esac 8660*132f818dSEnji Cooper ;; 8661*132f818dSEnji Cooper esac 8662*132f818dSEnji Cooper fi 8663*132f818dSEnji Cooper 8664*132f818dSEnji Cooper if test -n "$old_archive_from_expsyms_cmds"; then 8665*132f818dSEnji Cooper # figure out the soname 8666*132f818dSEnji Cooper set dummy $library_names 8667*132f818dSEnji Cooper shift 8668*132f818dSEnji Cooper realname=$1 8669*132f818dSEnji Cooper shift 8670*132f818dSEnji Cooper libname=`eval "\\$ECHO \"$libname_spec\""` 8671*132f818dSEnji Cooper # use dlname if we got it. it's perfectly good, no? 8672*132f818dSEnji Cooper if test -n "$dlname"; then 8673*132f818dSEnji Cooper soname=$dlname 8674*132f818dSEnji Cooper elif test -n "$soname_spec"; then 8675*132f818dSEnji Cooper # bleh windows 8676*132f818dSEnji Cooper case $host_os in 8677*132f818dSEnji Cooper cygwin* | mingw* | windows* | cegcc* | os2*) 8678*132f818dSEnji Cooper func_arith $current - $age 8679*132f818dSEnji Cooper major=$func_arith_result 8680*132f818dSEnji Cooper versuffix=-$major 8681*132f818dSEnji Cooper ;; 8682*132f818dSEnji Cooper esac 8683*132f818dSEnji Cooper eval soname=\"$soname_spec\" 8684*132f818dSEnji Cooper else 8685*132f818dSEnji Cooper soname=$realname 8686*132f818dSEnji Cooper fi 8687*132f818dSEnji Cooper 8688*132f818dSEnji Cooper # Make a new name for the extract_expsyms_cmds to use 8689*132f818dSEnji Cooper soroot=$soname 8690*132f818dSEnji Cooper func_basename "$soroot" 8691*132f818dSEnji Cooper soname=$func_basename_result 8692*132f818dSEnji Cooper func_stripname 'lib' '.dll' "$soname" 8693*132f818dSEnji Cooper newlib=libimp-$func_stripname_result.a 8694*132f818dSEnji Cooper 8695*132f818dSEnji Cooper # If the library has no export list, then create one now 8696*132f818dSEnji Cooper if test -f "$output_objdir/$soname-def"; then : 8697*132f818dSEnji Cooper else 8698*132f818dSEnji Cooper func_verbose "extracting exported symbol list from '$soname'" 8699*132f818dSEnji Cooper func_execute_cmds "$extract_expsyms_cmds" 'exit $?' 8700*132f818dSEnji Cooper fi 8701*132f818dSEnji Cooper 8702*132f818dSEnji Cooper # Create $newlib 8703*132f818dSEnji Cooper if test -f "$output_objdir/$newlib"; then :; else 8704*132f818dSEnji Cooper func_verbose "generating import library for '$soname'" 8705*132f818dSEnji Cooper func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' 8706*132f818dSEnji Cooper fi 8707*132f818dSEnji Cooper # make sure the library variables are pointing to the new library 8708*132f818dSEnji Cooper dir=$output_objdir 8709*132f818dSEnji Cooper linklib=$newlib 8710*132f818dSEnji Cooper fi # test -n "$old_archive_from_expsyms_cmds" 8711*132f818dSEnji Cooper 8712*132f818dSEnji Cooper if test prog = "$linkmode" || test relink != "$opt_mode"; then 8713*132f818dSEnji Cooper add_shlibpath= 8714*132f818dSEnji Cooper add_dir= 8715*132f818dSEnji Cooper add= 8716*132f818dSEnji Cooper lib_linked=yes 8717*132f818dSEnji Cooper case $hardcode_action in 8718*132f818dSEnji Cooper immediate | unsupported) 8719*132f818dSEnji Cooper if test no = "$hardcode_direct"; then 8720*132f818dSEnji Cooper add=$dir/$linklib 8721*132f818dSEnji Cooper case $host in 8722*132f818dSEnji Cooper *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; 8723*132f818dSEnji Cooper *-*-sysv4*uw2*) add_dir=-L$dir ;; 8724*132f818dSEnji Cooper *-*-emscripten*) add_dir=-L$dir ;; 8725*132f818dSEnji Cooper *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ 8726*132f818dSEnji Cooper *-*-unixware7*) add_dir=-L$dir ;; 8727*132f818dSEnji Cooper *-*-darwin* ) 8728*132f818dSEnji Cooper # if the lib is a (non-dlopened) module then we cannot 8729*132f818dSEnji Cooper # link against it, someone is ignoring the earlier warnings 8730*132f818dSEnji Cooper if /usr/bin/file -L $add 2> /dev/null | 8731*132f818dSEnji Cooper $GREP ": [^:]* bundle" >/dev/null; then 8732*132f818dSEnji Cooper if test "X$dlopenmodule" != "X$lib"; then 8733*132f818dSEnji Cooper func_warning "lib $linklib is a module, not a shared library" 8734*132f818dSEnji Cooper if test -z "$old_library"; then 8735*132f818dSEnji Cooper func_warning "And there doesn't seem to be a static archive available" 8736*132f818dSEnji Cooper func_warning "The link will probably fail, sorry" 8737*132f818dSEnji Cooper else 8738*132f818dSEnji Cooper add=$dir/$old_library 8739*132f818dSEnji Cooper fi 8740*132f818dSEnji Cooper elif test -n "$old_library"; then 8741*132f818dSEnji Cooper add=$dir/$old_library 8742*132f818dSEnji Cooper fi 8743*132f818dSEnji Cooper fi 8744*132f818dSEnji Cooper esac 8745*132f818dSEnji Cooper elif test no = "$hardcode_minus_L"; then 8746*132f818dSEnji Cooper case $host in 8747*132f818dSEnji Cooper *-*-sunos*) add_shlibpath=$dir ;; 8748*132f818dSEnji Cooper esac 8749*132f818dSEnji Cooper add_dir=-L$dir 8750*132f818dSEnji Cooper add=-l$name 8751*132f818dSEnji Cooper elif test no = "$hardcode_shlibpath_var"; then 8752*132f818dSEnji Cooper add_shlibpath=$dir 8753*132f818dSEnji Cooper add=-l$name 8754*132f818dSEnji Cooper else 8755*132f818dSEnji Cooper lib_linked=no 8756*132f818dSEnji Cooper fi 8757*132f818dSEnji Cooper ;; 8758*132f818dSEnji Cooper relink) 8759*132f818dSEnji Cooper if test yes = "$hardcode_direct" && 8760*132f818dSEnji Cooper test no = "$hardcode_direct_absolute"; then 8761*132f818dSEnji Cooper add=$dir/$linklib 8762*132f818dSEnji Cooper elif test yes = "$hardcode_minus_L"; then 8763*132f818dSEnji Cooper add_dir=-L$absdir 8764*132f818dSEnji Cooper # Try looking first in the location we're being installed to. 8765*132f818dSEnji Cooper if test -n "$inst_prefix_dir"; then 8766*132f818dSEnji Cooper case $libdir in 8767*132f818dSEnji Cooper [\\/]*) 8768*132f818dSEnji Cooper func_append add_dir " -L$inst_prefix_dir$libdir" 8769*132f818dSEnji Cooper ;; 8770*132f818dSEnji Cooper esac 8771*132f818dSEnji Cooper fi 8772*132f818dSEnji Cooper add=-l$name 8773*132f818dSEnji Cooper elif test yes = "$hardcode_shlibpath_var"; then 8774*132f818dSEnji Cooper add_shlibpath=$dir 8775*132f818dSEnji Cooper add=-l$name 8776*132f818dSEnji Cooper else 8777*132f818dSEnji Cooper lib_linked=no 8778*132f818dSEnji Cooper fi 8779*132f818dSEnji Cooper ;; 8780*132f818dSEnji Cooper *) lib_linked=no ;; 8781*132f818dSEnji Cooper esac 8782*132f818dSEnji Cooper 8783*132f818dSEnji Cooper if test yes != "$lib_linked"; then 8784*132f818dSEnji Cooper func_fatal_configuration "unsupported hardcode properties" 8785*132f818dSEnji Cooper fi 8786*132f818dSEnji Cooper 8787*132f818dSEnji Cooper if test -n "$add_shlibpath"; then 8788*132f818dSEnji Cooper case :$compile_shlibpath: in 8789*132f818dSEnji Cooper *":$add_shlibpath:"*) ;; 8790*132f818dSEnji Cooper *) func_append compile_shlibpath "$add_shlibpath:" ;; 8791*132f818dSEnji Cooper esac 8792*132f818dSEnji Cooper fi 8793*132f818dSEnji Cooper if test prog = "$linkmode"; then 8794*132f818dSEnji Cooper test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" 8795*132f818dSEnji Cooper test -n "$add" && compile_deplibs="$add $compile_deplibs" 8796*132f818dSEnji Cooper else 8797*132f818dSEnji Cooper test -n "$add_dir" && deplibs="$add_dir $deplibs" 8798*132f818dSEnji Cooper test -n "$add" && deplibs="$add $deplibs" 8799*132f818dSEnji Cooper if test yes != "$hardcode_direct" && 8800*132f818dSEnji Cooper test yes != "$hardcode_minus_L" && 8801*132f818dSEnji Cooper test yes = "$hardcode_shlibpath_var"; then 8802*132f818dSEnji Cooper case :$finalize_shlibpath: in 8803*132f818dSEnji Cooper *":$libdir:"*) ;; 8804*132f818dSEnji Cooper *) func_append finalize_shlibpath "$libdir:" ;; 8805*132f818dSEnji Cooper esac 8806*132f818dSEnji Cooper fi 8807*132f818dSEnji Cooper fi 8808*132f818dSEnji Cooper fi 8809*132f818dSEnji Cooper 8810*132f818dSEnji Cooper if test prog = "$linkmode" || test relink = "$opt_mode"; then 8811*132f818dSEnji Cooper add_shlibpath= 8812*132f818dSEnji Cooper add_dir= 8813*132f818dSEnji Cooper add= 8814*132f818dSEnji Cooper # Finalize command for both is simple: just hardcode it. 8815*132f818dSEnji Cooper if test yes = "$hardcode_direct" && 8816*132f818dSEnji Cooper test no = "$hardcode_direct_absolute"; then 8817*132f818dSEnji Cooper add=$libdir/$linklib 8818*132f818dSEnji Cooper elif test yes = "$hardcode_minus_L"; then 8819*132f818dSEnji Cooper add_dir=-L$lt_sysroot$libdir 8820*132f818dSEnji Cooper add=-l$name 8821*132f818dSEnji Cooper elif test yes = "$hardcode_shlibpath_var"; then 8822*132f818dSEnji Cooper case :$finalize_shlibpath: in 8823*132f818dSEnji Cooper *":$libdir:"*) ;; 8824*132f818dSEnji Cooper *) func_append finalize_shlibpath "$libdir:" ;; 8825*132f818dSEnji Cooper esac 8826*132f818dSEnji Cooper add=-l$name 8827*132f818dSEnji Cooper elif test yes = "$hardcode_automatic"; then 8828*132f818dSEnji Cooper if test -n "$inst_prefix_dir" && 8829*132f818dSEnji Cooper test -f "$inst_prefix_dir$libdir/$linklib"; then 8830*132f818dSEnji Cooper add=$inst_prefix_dir$libdir/$linklib 8831*132f818dSEnji Cooper else 8832*132f818dSEnji Cooper add=$libdir/$linklib 8833*132f818dSEnji Cooper fi 8834*132f818dSEnji Cooper else 8835*132f818dSEnji Cooper # We cannot seem to hardcode it, guess we'll fake it. 8836*132f818dSEnji Cooper add_dir=-L$lt_sysroot$libdir 8837*132f818dSEnji Cooper # Try looking first in the location we're being installed to. 8838*132f818dSEnji Cooper if test -n "$inst_prefix_dir"; then 8839*132f818dSEnji Cooper case $libdir in 8840*132f818dSEnji Cooper [\\/]*) 8841*132f818dSEnji Cooper func_append add_dir " -L$inst_prefix_dir$libdir" 8842*132f818dSEnji Cooper ;; 8843*132f818dSEnji Cooper esac 8844*132f818dSEnji Cooper fi 8845*132f818dSEnji Cooper add=-l$name 8846*132f818dSEnji Cooper fi 8847*132f818dSEnji Cooper 8848*132f818dSEnji Cooper if test prog = "$linkmode"; then 8849*132f818dSEnji Cooper test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" 8850*132f818dSEnji Cooper test -n "$add" && finalize_deplibs="$add $finalize_deplibs" 8851*132f818dSEnji Cooper else 8852*132f818dSEnji Cooper test -n "$add_dir" && deplibs="$add_dir $deplibs" 8853*132f818dSEnji Cooper test -n "$add" && deplibs="$add $deplibs" 8854*132f818dSEnji Cooper fi 8855*132f818dSEnji Cooper fi 8856*132f818dSEnji Cooper elif test prog = "$linkmode"; then 8857*132f818dSEnji Cooper # Here we assume that one of hardcode_direct or hardcode_minus_L 8858*132f818dSEnji Cooper # is not unsupported. This is valid on all known static and 8859*132f818dSEnji Cooper # shared platforms. 8860*132f818dSEnji Cooper if test unsupported != "$hardcode_direct"; then 8861*132f818dSEnji Cooper test -n "$old_library" && linklib=$old_library 8862*132f818dSEnji Cooper compile_deplibs="$dir/$linklib $compile_deplibs" 8863*132f818dSEnji Cooper finalize_deplibs="$dir/$linklib $finalize_deplibs" 8864*132f818dSEnji Cooper else 8865*132f818dSEnji Cooper compile_deplibs="-l$name -L$dir $compile_deplibs" 8866*132f818dSEnji Cooper finalize_deplibs="-l$name -L$dir $finalize_deplibs" 8867*132f818dSEnji Cooper fi 8868*132f818dSEnji Cooper elif test yes = "$build_libtool_libs"; then 8869*132f818dSEnji Cooper # Not a shared library 8870*132f818dSEnji Cooper if test pass_all != "$deplibs_check_method"; then 8871*132f818dSEnji Cooper # We're trying link a shared library against a static one 8872*132f818dSEnji Cooper # but the system doesn't support it. 8873*132f818dSEnji Cooper 8874*132f818dSEnji Cooper # Just print a warning and add the library to dependency_libs so 8875*132f818dSEnji Cooper # that the program can be linked against the static library. 8876*132f818dSEnji Cooper func_warning "This system cannot link to static lib archive $lib." 8877*132f818dSEnji Cooper func_warning "I have the capability to make that library automatically link in when" 8878*132f818dSEnji Cooper func_warning "you link to this library. But I can only do this if you have a" 8879*132f818dSEnji Cooper func_warning "shared version of the library, which you do not appear to have." 8880*132f818dSEnji Cooper if test yes = "$module"; then 8881*132f818dSEnji Cooper func_warning "But as you try to build a module library, libtool will still create " 8882*132f818dSEnji Cooper func_warning "a static module, that should work as long as the dlopening application" 8883*132f818dSEnji Cooper func_warning "is linked with the -dlopen flag to resolve symbols at runtime." 8884*132f818dSEnji Cooper if test -z "$global_symbol_pipe"; then 8885*132f818dSEnji Cooper func_warning "However, this would only work if libtool was able to extract symbol" 8886*132f818dSEnji Cooper func_warning "lists from a program, using 'nm' or equivalent, but libtool could" 8887*132f818dSEnji Cooper func_warning "not find such a program. So, this module is probably useless." 8888*132f818dSEnji Cooper func_warning "'nm' from GNU binutils and a full rebuild may help." 8889*132f818dSEnji Cooper fi 8890*132f818dSEnji Cooper if test no = "$build_old_libs"; then 8891*132f818dSEnji Cooper build_libtool_libs=module 8892*132f818dSEnji Cooper build_old_libs=yes 8893*132f818dSEnji Cooper else 8894*132f818dSEnji Cooper build_libtool_libs=no 8895*132f818dSEnji Cooper fi 8896*132f818dSEnji Cooper fi 8897*132f818dSEnji Cooper else 8898*132f818dSEnji Cooper deplibs="$dir/$old_library $deplibs" 8899*132f818dSEnji Cooper link_static=yes 8900*132f818dSEnji Cooper fi 8901*132f818dSEnji Cooper fi # link shared/static library? 8902*132f818dSEnji Cooper 8903*132f818dSEnji Cooper if test lib = "$linkmode"; then 8904*132f818dSEnji Cooper if test -n "$dependency_libs" && 8905*132f818dSEnji Cooper { test yes != "$hardcode_into_libs" || 8906*132f818dSEnji Cooper test yes = "$build_old_libs" || 8907*132f818dSEnji Cooper test yes = "$link_static"; }; then 8908*132f818dSEnji Cooper # Extract -R from dependency_libs 8909*132f818dSEnji Cooper temp_deplibs= 8910*132f818dSEnji Cooper for libdir in $dependency_libs; do 8911*132f818dSEnji Cooper case $libdir in 8912*132f818dSEnji Cooper -R*) func_stripname '-R' '' "$libdir" 8913*132f818dSEnji Cooper temp_xrpath=$func_stripname_result 8914*132f818dSEnji Cooper case " $xrpath " in 8915*132f818dSEnji Cooper *" $temp_xrpath "*) ;; 8916*132f818dSEnji Cooper *) func_append xrpath " $temp_xrpath";; 8917*132f818dSEnji Cooper esac;; 8918*132f818dSEnji Cooper *) func_append temp_deplibs " $libdir";; 8919*132f818dSEnji Cooper esac 8920*132f818dSEnji Cooper done 8921*132f818dSEnji Cooper dependency_libs=$temp_deplibs 8922*132f818dSEnji Cooper fi 8923*132f818dSEnji Cooper 8924*132f818dSEnji Cooper func_append newlib_search_path " $absdir" 8925*132f818dSEnji Cooper # Link against this library 8926*132f818dSEnji Cooper test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" 8927*132f818dSEnji Cooper # ... and its dependency_libs 8928*132f818dSEnji Cooper tmp_libs= 8929*132f818dSEnji Cooper for deplib in $dependency_libs; do 8930*132f818dSEnji Cooper newdependency_libs="$deplib $newdependency_libs" 8931*132f818dSEnji Cooper case $deplib in 8932*132f818dSEnji Cooper -L*) func_stripname '-L' '' "$deplib" 8933*132f818dSEnji Cooper func_resolve_sysroot "$func_stripname_result";; 8934*132f818dSEnji Cooper *) func_resolve_sysroot "$deplib" ;; 8935*132f818dSEnji Cooper esac 8936*132f818dSEnji Cooper if $opt_preserve_dup_deps; then 8937*132f818dSEnji Cooper case "$tmp_libs " in 8938*132f818dSEnji Cooper *" $func_resolve_sysroot_result "*) 8939*132f818dSEnji Cooper func_append specialdeplibs " $func_resolve_sysroot_result" ;; 8940*132f818dSEnji Cooper esac 8941*132f818dSEnji Cooper fi 8942*132f818dSEnji Cooper func_append tmp_libs " $func_resolve_sysroot_result" 8943*132f818dSEnji Cooper done 8944*132f818dSEnji Cooper 8945*132f818dSEnji Cooper if test no != "$link_all_deplibs"; then 8946*132f818dSEnji Cooper # Add the search paths of all dependency libraries 8947*132f818dSEnji Cooper for deplib in $dependency_libs; do 8948*132f818dSEnji Cooper path= 8949*132f818dSEnji Cooper case $deplib in 8950*132f818dSEnji Cooper -L*) path=$deplib ;; 8951*132f818dSEnji Cooper *.la) 8952*132f818dSEnji Cooper func_resolve_sysroot "$deplib" 8953*132f818dSEnji Cooper deplib=$func_resolve_sysroot_result 8954*132f818dSEnji Cooper func_dirname "$deplib" "" "." 8955*132f818dSEnji Cooper dir=$func_dirname_result 8956*132f818dSEnji Cooper # We need an absolute path. 8957*132f818dSEnji Cooper case $dir in 8958*132f818dSEnji Cooper [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; 8959*132f818dSEnji Cooper *) 8960*132f818dSEnji Cooper absdir=`cd "$dir" && pwd` 8961*132f818dSEnji Cooper if test -z "$absdir"; then 8962*132f818dSEnji Cooper func_warning "cannot determine absolute directory name of '$dir'" 8963*132f818dSEnji Cooper absdir=$dir 8964*132f818dSEnji Cooper fi 8965*132f818dSEnji Cooper ;; 8966*132f818dSEnji Cooper esac 8967*132f818dSEnji Cooper if $GREP "^installed=no" $deplib > /dev/null; then 8968*132f818dSEnji Cooper case $host in 8969*132f818dSEnji Cooper *-*-darwin*) 8970*132f818dSEnji Cooper depdepl= 8971*132f818dSEnji Cooper eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` 8972*132f818dSEnji Cooper if test -n "$deplibrary_names"; then 8973*132f818dSEnji Cooper for tmp in $deplibrary_names; do 8974*132f818dSEnji Cooper depdepl=$tmp 8975*132f818dSEnji Cooper done 8976*132f818dSEnji Cooper if test -f "$absdir/$objdir/$depdepl"; then 8977*132f818dSEnji Cooper depdepl=$absdir/$objdir/$depdepl 8978*132f818dSEnji Cooper darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` 8979*132f818dSEnji Cooper if test -z "$darwin_install_name"; then 8980*132f818dSEnji Cooper darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` 8981*132f818dSEnji Cooper fi 8982*132f818dSEnji Cooper func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" 8983*132f818dSEnji Cooper func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" 8984*132f818dSEnji Cooper path= 8985*132f818dSEnji Cooper fi 8986*132f818dSEnji Cooper fi 8987*132f818dSEnji Cooper ;; 8988*132f818dSEnji Cooper *) 8989*132f818dSEnji Cooper path=-L$absdir/$objdir 8990*132f818dSEnji Cooper ;; 8991*132f818dSEnji Cooper esac 8992*132f818dSEnji Cooper else 8993*132f818dSEnji Cooper eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` 8994*132f818dSEnji Cooper test -z "$libdir" && \ 8995*132f818dSEnji Cooper func_fatal_error "'$deplib' is not a valid libtool archive" 8996*132f818dSEnji Cooper test "$absdir" != "$libdir" && \ 8997*132f818dSEnji Cooper func_warning "'$deplib' seems to be moved" 8998*132f818dSEnji Cooper 8999*132f818dSEnji Cooper path=-L$absdir 9000*132f818dSEnji Cooper fi 9001*132f818dSEnji Cooper ;; 9002*132f818dSEnji Cooper esac 9003*132f818dSEnji Cooper case " $deplibs " in 9004*132f818dSEnji Cooper *" $path "*) ;; 9005*132f818dSEnji Cooper *) deplibs="$path $deplibs" ;; 9006*132f818dSEnji Cooper esac 9007*132f818dSEnji Cooper done 9008*132f818dSEnji Cooper fi # link_all_deplibs != no 9009*132f818dSEnji Cooper fi # linkmode = lib 9010*132f818dSEnji Cooper done # for deplib in $libs 9011*132f818dSEnji Cooper 9012*132f818dSEnji Cooper func_append temp_rpath "$temp_rpath_tail" 9013*132f818dSEnji Cooper func_append compile_rpath "$compile_rpath_tail" 9014*132f818dSEnji Cooper 9015*132f818dSEnji Cooper if test link = "$pass"; then 9016*132f818dSEnji Cooper if test prog = "$linkmode"; then 9017*132f818dSEnji Cooper compile_deplibs="$new_inherited_linker_flags $compile_deplibs" 9018*132f818dSEnji Cooper finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" 9019*132f818dSEnji Cooper else 9020*132f818dSEnji Cooper compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 9021*132f818dSEnji Cooper fi 9022*132f818dSEnji Cooper fi 9023*132f818dSEnji Cooper dependency_libs=$newdependency_libs 9024*132f818dSEnji Cooper if test dlpreopen = "$pass"; then 9025*132f818dSEnji Cooper # Link the dlpreopened libraries before other libraries 9026*132f818dSEnji Cooper for deplib in $save_deplibs; do 9027*132f818dSEnji Cooper deplibs="$deplib $deplibs" 9028*132f818dSEnji Cooper done 9029*132f818dSEnji Cooper fi 9030*132f818dSEnji Cooper if test dlopen != "$pass"; then 9031*132f818dSEnji Cooper test conv = "$pass" || { 9032*132f818dSEnji Cooper # Make sure lib_search_path contains only unique directories. 9033*132f818dSEnji Cooper lib_search_path= 9034*132f818dSEnji Cooper for dir in $newlib_search_path; do 9035*132f818dSEnji Cooper case "$lib_search_path " in 9036*132f818dSEnji Cooper *" $dir "*) ;; 9037*132f818dSEnji Cooper *) func_append lib_search_path " $dir" ;; 9038*132f818dSEnji Cooper esac 9039*132f818dSEnji Cooper done 9040*132f818dSEnji Cooper newlib_search_path= 9041*132f818dSEnji Cooper } 9042*132f818dSEnji Cooper 9043*132f818dSEnji Cooper if test prog,link = "$linkmode,$pass"; then 9044*132f818dSEnji Cooper vars="compile_deplibs finalize_deplibs" 9045*132f818dSEnji Cooper else 9046*132f818dSEnji Cooper vars=deplibs 9047*132f818dSEnji Cooper fi 9048*132f818dSEnji Cooper for var in $vars dependency_libs; do 9049*132f818dSEnji Cooper # Add libraries to $var in reverse order 9050*132f818dSEnji Cooper eval tmp_libs=\"\$$var\" 9051*132f818dSEnji Cooper new_libs= 9052*132f818dSEnji Cooper # FIXME: Pedantically, this is the right thing to do, so 9053*132f818dSEnji Cooper # that some nasty dependency loop isn't accidentally 9054*132f818dSEnji Cooper # broken: new_libs="$deplib $new_libs" 9055*132f818dSEnji Cooper for deplib in $tmp_libs; do 9056*132f818dSEnji Cooper if $opt_preserve_dup_deps; then 9057*132f818dSEnji Cooper new_libs="$deplib $new_libs" 9058*132f818dSEnji Cooper else 9059*132f818dSEnji Cooper # Pragmatically, this seems to cause very few problems in 9060*132f818dSEnji Cooper # practice: 9061*132f818dSEnji Cooper case $deplib in 9062*132f818dSEnji Cooper -L*) new_libs="$deplib $new_libs" ;; 9063*132f818dSEnji Cooper -R*) ;; 9064*132f818dSEnji Cooper *) 9065*132f818dSEnji Cooper # And here is the reason: when a library appears more 9066*132f818dSEnji Cooper # than once as an explicit dependence of a library, or 9067*132f818dSEnji Cooper # is implicitly linked in more than once by the 9068*132f818dSEnji Cooper # compiler, it is considered special, and multiple 9069*132f818dSEnji Cooper # occurrences thereof are not removed. Compare this 9070*132f818dSEnji Cooper # with having the same library being listed as a 9071*132f818dSEnji Cooper # dependency of multiple other libraries: in this case, 9072*132f818dSEnji Cooper # we know (pedantically, we assume) the library does not 9073*132f818dSEnji Cooper # need to be listed more than once, so we keep only the 9074*132f818dSEnji Cooper # last copy. This is not always right, but it is rare 9075*132f818dSEnji Cooper # enough that we require users that really mean to play 9076*132f818dSEnji Cooper # such unportable linking tricks to link the library 9077*132f818dSEnji Cooper # using -Wl,-lname, so that libtool does not consider it 9078*132f818dSEnji Cooper # for duplicate removal. And if not possible for portability 9079*132f818dSEnji Cooper # reasons, then --preserve-dup-deps should be used. 9080*132f818dSEnji Cooper case " $specialdeplibs " in 9081*132f818dSEnji Cooper *" $deplib "*) new_libs="$deplib $new_libs" ;; 9082*132f818dSEnji Cooper *) 9083*132f818dSEnji Cooper case " $new_libs " in 9084*132f818dSEnji Cooper *" $deplib "*) ;; 9085*132f818dSEnji Cooper *) new_libs="$deplib $new_libs" ;; 9086*132f818dSEnji Cooper esac 9087*132f818dSEnji Cooper ;; 9088*132f818dSEnji Cooper esac 9089*132f818dSEnji Cooper ;; 9090*132f818dSEnji Cooper esac 9091*132f818dSEnji Cooper fi 9092*132f818dSEnji Cooper done 9093*132f818dSEnji Cooper tmp_libs= 9094*132f818dSEnji Cooper for deplib in $new_libs; do 9095*132f818dSEnji Cooper case $deplib in 9096*132f818dSEnji Cooper -L*) 9097*132f818dSEnji Cooper case " $tmp_libs " in 9098*132f818dSEnji Cooper *" $deplib "*) ;; 9099*132f818dSEnji Cooper *) func_append tmp_libs " $deplib" ;; 9100*132f818dSEnji Cooper esac 9101*132f818dSEnji Cooper ;; 9102*132f818dSEnji Cooper *) func_append tmp_libs " $deplib" ;; 9103*132f818dSEnji Cooper esac 9104*132f818dSEnji Cooper done 9105*132f818dSEnji Cooper eval $var=\"$tmp_libs\" 9106*132f818dSEnji Cooper done # for var 9107*132f818dSEnji Cooper fi 9108*132f818dSEnji Cooper 9109*132f818dSEnji Cooper # Add Sun CC postdeps if required: 9110*132f818dSEnji Cooper test CXX = "$tagname" && { 9111*132f818dSEnji Cooper case $host_os in 9112*132f818dSEnji Cooper linux*) 9113*132f818dSEnji Cooper case `$CC -V 2>&1 | $SED 5q` in 9114*132f818dSEnji Cooper *Sun\ C*) # Sun C++ 5.9 9115*132f818dSEnji Cooper func_suncc_cstd_abi 9116*132f818dSEnji Cooper 9117*132f818dSEnji Cooper if test no != "$suncc_use_cstd_abi"; then 9118*132f818dSEnji Cooper func_append postdeps ' -library=Cstd -library=Crun' 9119*132f818dSEnji Cooper fi 9120*132f818dSEnji Cooper ;; 9121*132f818dSEnji Cooper esac 9122*132f818dSEnji Cooper ;; 9123*132f818dSEnji Cooper 9124*132f818dSEnji Cooper solaris*) 9125*132f818dSEnji Cooper func_cc_basename "$CC" 9126*132f818dSEnji Cooper case $func_cc_basename_result in 9127*132f818dSEnji Cooper CC* | sunCC*) 9128*132f818dSEnji Cooper func_suncc_cstd_abi 9129*132f818dSEnji Cooper 9130*132f818dSEnji Cooper if test no != "$suncc_use_cstd_abi"; then 9131*132f818dSEnji Cooper func_append postdeps ' -library=Cstd -library=Crun' 9132*132f818dSEnji Cooper fi 9133*132f818dSEnji Cooper ;; 9134*132f818dSEnji Cooper esac 9135*132f818dSEnji Cooper ;; 9136*132f818dSEnji Cooper esac 9137*132f818dSEnji Cooper } 9138*132f818dSEnji Cooper 9139*132f818dSEnji Cooper # Last step: remove runtime libs from dependency_libs 9140*132f818dSEnji Cooper # (they stay in deplibs) 9141*132f818dSEnji Cooper tmp_libs= 9142*132f818dSEnji Cooper for i in $dependency_libs; do 9143*132f818dSEnji Cooper case " $predeps $postdeps $compiler_lib_search_path " in 9144*132f818dSEnji Cooper *" $i "*) 9145*132f818dSEnji Cooper i= 9146*132f818dSEnji Cooper ;; 9147*132f818dSEnji Cooper esac 9148*132f818dSEnji Cooper if test -n "$i"; then 9149*132f818dSEnji Cooper func_append tmp_libs " $i" 9150*132f818dSEnji Cooper fi 9151*132f818dSEnji Cooper done 9152*132f818dSEnji Cooper dependency_libs=$tmp_libs 9153*132f818dSEnji Cooper done # for pass 9154*132f818dSEnji Cooper if test prog = "$linkmode"; then 9155*132f818dSEnji Cooper dlfiles=$newdlfiles 9156*132f818dSEnji Cooper fi 9157*132f818dSEnji Cooper if test prog = "$linkmode" || test lib = "$linkmode"; then 9158*132f818dSEnji Cooper dlprefiles=$newdlprefiles 9159*132f818dSEnji Cooper fi 9160*132f818dSEnji Cooper 9161*132f818dSEnji Cooper case $linkmode in 9162*132f818dSEnji Cooper oldlib) 9163*132f818dSEnji Cooper if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then 9164*132f818dSEnji Cooper func_warning "'-dlopen' is ignored for archives" 9165*132f818dSEnji Cooper fi 9166*132f818dSEnji Cooper 9167*132f818dSEnji Cooper case " $deplibs" in 9168*132f818dSEnji Cooper *\ -l* | *\ -L*) 9169*132f818dSEnji Cooper func_warning "'-l' and '-L' are ignored for archives" ;; 9170*132f818dSEnji Cooper esac 9171*132f818dSEnji Cooper 9172*132f818dSEnji Cooper test -n "$rpath" && \ 9173*132f818dSEnji Cooper func_warning "'-rpath' is ignored for archives" 9174*132f818dSEnji Cooper 9175*132f818dSEnji Cooper test -n "$xrpath" && \ 9176*132f818dSEnji Cooper func_warning "'-R' is ignored for archives" 9177*132f818dSEnji Cooper 9178*132f818dSEnji Cooper test -n "$vinfo" && \ 9179*132f818dSEnji Cooper func_warning "'-version-info/-version-number' is ignored for archives" 9180*132f818dSEnji Cooper 9181*132f818dSEnji Cooper test -n "$release" && \ 9182*132f818dSEnji Cooper func_warning "'-release' is ignored for archives" 9183*132f818dSEnji Cooper 9184*132f818dSEnji Cooper test -n "$export_symbols$export_symbols_regex" && \ 9185*132f818dSEnji Cooper func_warning "'-export-symbols' is ignored for archives" 9186*132f818dSEnji Cooper 9187*132f818dSEnji Cooper # Now set the variables for building old libraries. 9188*132f818dSEnji Cooper build_libtool_libs=no 9189*132f818dSEnji Cooper oldlibs=$output 9190*132f818dSEnji Cooper func_append objs "$old_deplibs" 9191*132f818dSEnji Cooper ;; 9192*132f818dSEnji Cooper 9193*132f818dSEnji Cooper lib) 9194*132f818dSEnji Cooper # Make sure we only generate libraries of the form 'libNAME.la'. 9195*132f818dSEnji Cooper case $outputname in 9196*132f818dSEnji Cooper lib*) 9197*132f818dSEnji Cooper func_stripname 'lib' '.la' "$outputname" 9198*132f818dSEnji Cooper name=$func_stripname_result 9199*132f818dSEnji Cooper eval shared_ext=\"$shrext_cmds\" 9200*132f818dSEnji Cooper eval libname=\"$libname_spec\" 9201*132f818dSEnji Cooper ;; 9202*132f818dSEnji Cooper *) 9203*132f818dSEnji Cooper test no = "$module" \ 9204*132f818dSEnji Cooper && func_fatal_help "libtool library '$output' must begin with 'lib'" 9205*132f818dSEnji Cooper 9206*132f818dSEnji Cooper if test no != "$need_lib_prefix"; then 9207*132f818dSEnji Cooper # Add the "lib" prefix for modules if required 9208*132f818dSEnji Cooper func_stripname '' '.la' "$outputname" 9209*132f818dSEnji Cooper name=$func_stripname_result 9210*132f818dSEnji Cooper eval shared_ext=\"$shrext_cmds\" 9211*132f818dSEnji Cooper eval libname=\"$libname_spec\" 9212*132f818dSEnji Cooper else 9213*132f818dSEnji Cooper func_stripname '' '.la' "$outputname" 9214*132f818dSEnji Cooper libname=$func_stripname_result 9215*132f818dSEnji Cooper fi 9216*132f818dSEnji Cooper ;; 9217*132f818dSEnji Cooper esac 9218*132f818dSEnji Cooper 9219*132f818dSEnji Cooper if test -n "$objs"; then 9220*132f818dSEnji Cooper if test pass_all != "$deplibs_check_method"; then 9221*132f818dSEnji Cooper func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" 9222*132f818dSEnji Cooper else 9223*132f818dSEnji Cooper func_warning "Linking the shared library $output against the non-libtool objects $objs is not portable!" 9224*132f818dSEnji Cooper func_append libobjs " $objs" 9225*132f818dSEnji Cooper fi 9226*132f818dSEnji Cooper fi 9227*132f818dSEnji Cooper 9228*132f818dSEnji Cooper test no = "$dlself" \ 9229*132f818dSEnji Cooper || func_warning "'-dlopen self' is ignored for libtool libraries" 9230*132f818dSEnji Cooper 9231*132f818dSEnji Cooper set dummy $rpath 9232*132f818dSEnji Cooper shift 9233*132f818dSEnji Cooper test 1 -lt "$#" \ 9234*132f818dSEnji Cooper && func_warning "ignoring multiple '-rpath's for a libtool library" 9235*132f818dSEnji Cooper 9236*132f818dSEnji Cooper install_libdir=$1 9237*132f818dSEnji Cooper 9238*132f818dSEnji Cooper oldlibs= 9239*132f818dSEnji Cooper if test -z "$rpath"; then 9240*132f818dSEnji Cooper if test yes = "$build_libtool_libs"; then 9241*132f818dSEnji Cooper # Building a libtool convenience library. 9242*132f818dSEnji Cooper # Some compilers have problems with a '.al' extension so 9243*132f818dSEnji Cooper # convenience libraries should have the same extension an 9244*132f818dSEnji Cooper # archive normally would. 9245*132f818dSEnji Cooper oldlibs="$output_objdir/$libname.$libext $oldlibs" 9246*132f818dSEnji Cooper build_libtool_libs=convenience 9247*132f818dSEnji Cooper build_old_libs=yes 9248*132f818dSEnji Cooper fi 9249*132f818dSEnji Cooper 9250*132f818dSEnji Cooper test -n "$vinfo" && \ 9251*132f818dSEnji Cooper func_warning "'-version-info/-version-number' is ignored for convenience libraries" 9252*132f818dSEnji Cooper 9253*132f818dSEnji Cooper test -n "$release" && \ 9254*132f818dSEnji Cooper func_warning "'-release' is ignored for convenience libraries" 9255*132f818dSEnji Cooper else 9256*132f818dSEnji Cooper 9257*132f818dSEnji Cooper # Parse the version information argument. 9258*132f818dSEnji Cooper save_ifs=$IFS; IFS=: 9259*132f818dSEnji Cooper set dummy $vinfo 0 0 0 9260*132f818dSEnji Cooper shift 9261*132f818dSEnji Cooper IFS=$save_ifs 9262*132f818dSEnji Cooper 9263*132f818dSEnji Cooper test -n "$7" && \ 9264*132f818dSEnji Cooper func_fatal_help "too many parameters to '-version-info'" 9265*132f818dSEnji Cooper 9266*132f818dSEnji Cooper # convert absolute version numbers to libtool ages 9267*132f818dSEnji Cooper # this retains compatibility with .la files and attempts 9268*132f818dSEnji Cooper # to make the code below a bit more comprehensible 9269*132f818dSEnji Cooper 9270*132f818dSEnji Cooper case $vinfo_number in 9271*132f818dSEnji Cooper yes) 9272*132f818dSEnji Cooper number_major=$1 9273*132f818dSEnji Cooper number_minor=$2 9274*132f818dSEnji Cooper number_revision=$3 9275*132f818dSEnji Cooper # 9276*132f818dSEnji Cooper # There are really only two kinds -- those that 9277*132f818dSEnji Cooper # use the current revision as the major version 9278*132f818dSEnji Cooper # and those that subtract age and use age as 9279*132f818dSEnji Cooper # a minor version. But, then there is irix 9280*132f818dSEnji Cooper # that has an extra 1 added just for fun 9281*132f818dSEnji Cooper # 9282*132f818dSEnji Cooper case $version_type in 9283*132f818dSEnji Cooper # correct linux to gnu/linux during the next big refactor 9284*132f818dSEnji Cooper darwin|freebsd-elf|linux|midnightbsd-elf|osf|qnx|windows|none) 9285*132f818dSEnji Cooper func_arith $number_major + $number_minor 9286*132f818dSEnji Cooper current=$func_arith_result 9287*132f818dSEnji Cooper age=$number_minor 9288*132f818dSEnji Cooper revision=$number_revision 9289*132f818dSEnji Cooper ;; 9290*132f818dSEnji Cooper freebsd-aout|sco|sunos) 9291*132f818dSEnji Cooper current=$number_major 9292*132f818dSEnji Cooper revision=$number_minor 9293*132f818dSEnji Cooper age=0 9294*132f818dSEnji Cooper ;; 9295*132f818dSEnji Cooper irix|nonstopux) 9296*132f818dSEnji Cooper func_arith $number_major + $number_minor 9297*132f818dSEnji Cooper current=$func_arith_result 9298*132f818dSEnji Cooper age=$number_minor 9299*132f818dSEnji Cooper revision=$number_minor 9300*132f818dSEnji Cooper lt_irix_increment=no 9301*132f818dSEnji Cooper ;; 9302*132f818dSEnji Cooper *) 9303*132f818dSEnji Cooper func_fatal_configuration "$modename: unknown library version type '$version_type'" 9304*132f818dSEnji Cooper ;; 9305*132f818dSEnji Cooper esac 9306*132f818dSEnji Cooper ;; 9307*132f818dSEnji Cooper no) 9308*132f818dSEnji Cooper current=$1 9309*132f818dSEnji Cooper revision=$2 9310*132f818dSEnji Cooper age=$3 9311*132f818dSEnji Cooper ;; 9312*132f818dSEnji Cooper esac 9313*132f818dSEnji Cooper 9314*132f818dSEnji Cooper # Check that each of the things are valid numbers. 9315*132f818dSEnji Cooper case $current in 9316*132f818dSEnji Cooper 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; 9317*132f818dSEnji Cooper *) 9318*132f818dSEnji Cooper func_error "CURRENT '$current' must be a nonnegative integer" 9319*132f818dSEnji Cooper func_fatal_error "'$vinfo' is not valid version information" 9320*132f818dSEnji Cooper ;; 9321*132f818dSEnji Cooper esac 9322*132f818dSEnji Cooper 9323*132f818dSEnji Cooper case $revision in 9324*132f818dSEnji Cooper 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; 9325*132f818dSEnji Cooper *) 9326*132f818dSEnji Cooper func_error "REVISION '$revision' must be a nonnegative integer" 9327*132f818dSEnji Cooper func_fatal_error "'$vinfo' is not valid version information" 9328*132f818dSEnji Cooper ;; 9329*132f818dSEnji Cooper esac 9330*132f818dSEnji Cooper 9331*132f818dSEnji Cooper case $age in 9332*132f818dSEnji Cooper 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; 9333*132f818dSEnji Cooper *) 9334*132f818dSEnji Cooper func_error "AGE '$age' must be a nonnegative integer" 9335*132f818dSEnji Cooper func_fatal_error "'$vinfo' is not valid version information" 9336*132f818dSEnji Cooper ;; 9337*132f818dSEnji Cooper esac 9338*132f818dSEnji Cooper 9339*132f818dSEnji Cooper if test "$age" -gt "$current"; then 9340*132f818dSEnji Cooper func_error "AGE '$age' is greater than the current interface number '$current'" 9341*132f818dSEnji Cooper func_fatal_error "'$vinfo' is not valid version information" 9342*132f818dSEnji Cooper fi 9343*132f818dSEnji Cooper 9344*132f818dSEnji Cooper # Calculate the version variables. 9345*132f818dSEnji Cooper major= 9346*132f818dSEnji Cooper versuffix= 9347*132f818dSEnji Cooper verstring= 9348*132f818dSEnji Cooper case $version_type in 9349*132f818dSEnji Cooper none) ;; 9350*132f818dSEnji Cooper 9351*132f818dSEnji Cooper darwin) 9352*132f818dSEnji Cooper # Like Linux, but with the current version available in 9353*132f818dSEnji Cooper # verstring for coding it into the library header 9354*132f818dSEnji Cooper func_arith $current - $age 9355*132f818dSEnji Cooper major=.$func_arith_result 9356*132f818dSEnji Cooper versuffix=$major.$age.$revision 9357*132f818dSEnji Cooper # Darwin ld doesn't like 0 for these options... 9358*132f818dSEnji Cooper func_arith $current + 1 9359*132f818dSEnji Cooper minor_current=$func_arith_result 9360*132f818dSEnji Cooper xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" 9361*132f818dSEnji Cooper verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" 9362*132f818dSEnji Cooper # On Darwin other compilers 9363*132f818dSEnji Cooper case $CC in 9364*132f818dSEnji Cooper nagfor*) 9365*132f818dSEnji Cooper verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" 9366*132f818dSEnji Cooper ;; 9367*132f818dSEnji Cooper *) 9368*132f818dSEnji Cooper verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" 9369*132f818dSEnji Cooper ;; 9370*132f818dSEnji Cooper esac 9371*132f818dSEnji Cooper ;; 9372*132f818dSEnji Cooper 9373*132f818dSEnji Cooper freebsd-aout) 9374*132f818dSEnji Cooper major=.$current 9375*132f818dSEnji Cooper versuffix=.$current.$revision 9376*132f818dSEnji Cooper ;; 9377*132f818dSEnji Cooper 9378*132f818dSEnji Cooper freebsd-elf | midnightbsd-elf) 9379*132f818dSEnji Cooper func_arith $current - $age 9380*132f818dSEnji Cooper major=.$func_arith_result 9381*132f818dSEnji Cooper versuffix=$major.$age.$revision 9382*132f818dSEnji Cooper ;; 9383*132f818dSEnji Cooper 9384*132f818dSEnji Cooper irix | nonstopux) 9385*132f818dSEnji Cooper if test no = "$lt_irix_increment"; then 9386*132f818dSEnji Cooper func_arith $current - $age 9387*132f818dSEnji Cooper else 9388*132f818dSEnji Cooper func_arith $current - $age + 1 9389*132f818dSEnji Cooper fi 9390*132f818dSEnji Cooper major=$func_arith_result 9391*132f818dSEnji Cooper 9392*132f818dSEnji Cooper case $version_type in 9393*132f818dSEnji Cooper nonstopux) verstring_prefix=nonstopux ;; 9394*132f818dSEnji Cooper *) verstring_prefix=sgi ;; 9395*132f818dSEnji Cooper esac 9396*132f818dSEnji Cooper verstring=$verstring_prefix$major.$revision 9397*132f818dSEnji Cooper 9398*132f818dSEnji Cooper # Add in all the interfaces that we are compatible with. 9399*132f818dSEnji Cooper loop=$revision 9400*132f818dSEnji Cooper while test 0 -ne "$loop"; do 9401*132f818dSEnji Cooper func_arith $revision - $loop 9402*132f818dSEnji Cooper iface=$func_arith_result 9403*132f818dSEnji Cooper func_arith $loop - 1 9404*132f818dSEnji Cooper loop=$func_arith_result 9405*132f818dSEnji Cooper verstring=$verstring_prefix$major.$iface:$verstring 9406*132f818dSEnji Cooper done 9407*132f818dSEnji Cooper 9408*132f818dSEnji Cooper # Before this point, $major must not contain '.'. 9409*132f818dSEnji Cooper major=.$major 9410*132f818dSEnji Cooper versuffix=$major.$revision 9411*132f818dSEnji Cooper ;; 9412*132f818dSEnji Cooper 9413*132f818dSEnji Cooper linux) # correct to gnu/linux during the next big refactor 9414*132f818dSEnji Cooper func_arith $current - $age 9415*132f818dSEnji Cooper major=.$func_arith_result 9416*132f818dSEnji Cooper versuffix=$major.$age.$revision 9417*132f818dSEnji Cooper ;; 9418*132f818dSEnji Cooper 9419*132f818dSEnji Cooper osf) 9420*132f818dSEnji Cooper func_arith $current - $age 9421*132f818dSEnji Cooper major=.$func_arith_result 9422*132f818dSEnji Cooper versuffix=.$current.$age.$revision 9423*132f818dSEnji Cooper verstring=$current.$age.$revision 9424*132f818dSEnji Cooper 9425*132f818dSEnji Cooper # Add in all the interfaces that we are compatible with. 9426*132f818dSEnji Cooper loop=$age 9427*132f818dSEnji Cooper while test 0 -ne "$loop"; do 9428*132f818dSEnji Cooper func_arith $current - $loop 9429*132f818dSEnji Cooper iface=$func_arith_result 9430*132f818dSEnji Cooper func_arith $loop - 1 9431*132f818dSEnji Cooper loop=$func_arith_result 9432*132f818dSEnji Cooper verstring=$verstring:$iface.0 9433*132f818dSEnji Cooper done 9434*132f818dSEnji Cooper 9435*132f818dSEnji Cooper # Make executables depend on our current version. 9436*132f818dSEnji Cooper func_append verstring ":$current.0" 9437*132f818dSEnji Cooper ;; 9438*132f818dSEnji Cooper 9439*132f818dSEnji Cooper qnx) 9440*132f818dSEnji Cooper func_arith $current - $age 9441*132f818dSEnji Cooper major=.$func_arith_result 9442*132f818dSEnji Cooper versuffix=$major.$age.$revision 9443*132f818dSEnji Cooper ;; 9444*132f818dSEnji Cooper 9445*132f818dSEnji Cooper sco) 9446*132f818dSEnji Cooper major=.$current 9447*132f818dSEnji Cooper versuffix=.$current 9448*132f818dSEnji Cooper ;; 9449*132f818dSEnji Cooper 9450*132f818dSEnji Cooper sunos) 9451*132f818dSEnji Cooper major=.$current 9452*132f818dSEnji Cooper versuffix=.$current.$revision 9453*132f818dSEnji Cooper ;; 9454*132f818dSEnji Cooper 9455*132f818dSEnji Cooper windows) 9456*132f818dSEnji Cooper # Use '-' rather than '.', since we only want one 9457*132f818dSEnji Cooper # extension on DOS 8.3 file systems. 9458*132f818dSEnji Cooper func_arith $current - $age 9459*132f818dSEnji Cooper major=$func_arith_result 9460*132f818dSEnji Cooper versuffix=-$major 9461*132f818dSEnji Cooper ;; 9462*132f818dSEnji Cooper 9463*132f818dSEnji Cooper *) 9464*132f818dSEnji Cooper func_fatal_configuration "unknown library version type '$version_type'" 9465*132f818dSEnji Cooper ;; 9466*132f818dSEnji Cooper esac 9467*132f818dSEnji Cooper 9468*132f818dSEnji Cooper # Clear the version info if we defaulted, and they specified a release. 9469*132f818dSEnji Cooper if test -z "$vinfo" && test -n "$release"; then 9470*132f818dSEnji Cooper major= 9471*132f818dSEnji Cooper case $version_type in 9472*132f818dSEnji Cooper darwin) 9473*132f818dSEnji Cooper # we can't check for "0.0" in archive_cmds due to quoting 9474*132f818dSEnji Cooper # problems, so we reset it completely 9475*132f818dSEnji Cooper verstring= 9476*132f818dSEnji Cooper ;; 9477*132f818dSEnji Cooper *) 9478*132f818dSEnji Cooper verstring=0.0 9479*132f818dSEnji Cooper ;; 9480*132f818dSEnji Cooper esac 9481*132f818dSEnji Cooper if test no = "$need_version"; then 9482*132f818dSEnji Cooper versuffix= 9483*132f818dSEnji Cooper else 9484*132f818dSEnji Cooper versuffix=.0.0 9485*132f818dSEnji Cooper fi 9486*132f818dSEnji Cooper fi 9487*132f818dSEnji Cooper 9488*132f818dSEnji Cooper # Remove version info from name if versioning should be avoided 9489*132f818dSEnji Cooper if test yes,no = "$avoid_version,$need_version"; then 9490*132f818dSEnji Cooper major= 9491*132f818dSEnji Cooper versuffix= 9492*132f818dSEnji Cooper verstring= 9493*132f818dSEnji Cooper fi 9494*132f818dSEnji Cooper 9495*132f818dSEnji Cooper # Check to see if the archive will have undefined symbols. 9496*132f818dSEnji Cooper if test yes = "$allow_undefined"; then 9497*132f818dSEnji Cooper if test unsupported = "$allow_undefined_flag"; then 9498*132f818dSEnji Cooper if test yes = "$build_old_libs"; then 9499*132f818dSEnji Cooper func_warning "undefined symbols not allowed in $host shared libraries; building static only" 9500*132f818dSEnji Cooper build_libtool_libs=no 9501*132f818dSEnji Cooper else 9502*132f818dSEnji Cooper func_fatal_error "can't build $host shared library unless -no-undefined is specified" 9503*132f818dSEnji Cooper fi 9504*132f818dSEnji Cooper fi 9505*132f818dSEnji Cooper else 9506*132f818dSEnji Cooper # Don't allow undefined symbols. 9507*132f818dSEnji Cooper allow_undefined_flag=$no_undefined_flag 9508*132f818dSEnji Cooper fi 9509*132f818dSEnji Cooper 9510*132f818dSEnji Cooper fi 9511*132f818dSEnji Cooper 9512*132f818dSEnji Cooper func_generate_dlsyms "$libname" "$libname" : 9513*132f818dSEnji Cooper func_append libobjs " $symfileobj" 9514*132f818dSEnji Cooper test " " = "$libobjs" && libobjs= 9515*132f818dSEnji Cooper 9516*132f818dSEnji Cooper if test relink != "$opt_mode"; then 9517*132f818dSEnji Cooper # Remove our outputs, but don't remove object files since they 9518*132f818dSEnji Cooper # may have been created when compiling PIC objects. 9519*132f818dSEnji Cooper removelist= 9520*132f818dSEnji Cooper tempremovelist=`$ECHO "$output_objdir/*"` 9521*132f818dSEnji Cooper for p in $tempremovelist; do 9522*132f818dSEnji Cooper case $p in 9523*132f818dSEnji Cooper *.$objext | *.gcno) 9524*132f818dSEnji Cooper ;; 9525*132f818dSEnji Cooper $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) 9526*132f818dSEnji Cooper if test -n "$precious_files_regex"; then 9527*132f818dSEnji Cooper if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 9528*132f818dSEnji Cooper then 9529*132f818dSEnji Cooper continue 9530*132f818dSEnji Cooper fi 9531*132f818dSEnji Cooper fi 9532*132f818dSEnji Cooper func_append removelist " $p" 9533*132f818dSEnji Cooper ;; 9534*132f818dSEnji Cooper *) ;; 9535*132f818dSEnji Cooper esac 9536*132f818dSEnji Cooper done 9537*132f818dSEnji Cooper test -n "$removelist" && \ 9538*132f818dSEnji Cooper func_show_eval "${RM}r \$removelist" 9539*132f818dSEnji Cooper fi 9540*132f818dSEnji Cooper 9541*132f818dSEnji Cooper # Now set the variables for building old libraries. 9542*132f818dSEnji Cooper if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then 9543*132f818dSEnji Cooper func_append oldlibs " $output_objdir/$libname.$libext" 9544*132f818dSEnji Cooper 9545*132f818dSEnji Cooper # Transform .lo files to .o files. 9546*132f818dSEnji Cooper oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` 9547*132f818dSEnji Cooper fi 9548*132f818dSEnji Cooper 9549*132f818dSEnji Cooper # Eliminate all temporary directories. 9550*132f818dSEnji Cooper #for path in $notinst_path; do 9551*132f818dSEnji Cooper # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` 9552*132f818dSEnji Cooper # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` 9553*132f818dSEnji Cooper # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` 9554*132f818dSEnji Cooper #done 9555*132f818dSEnji Cooper 9556*132f818dSEnji Cooper if test -n "$xrpath"; then 9557*132f818dSEnji Cooper # If the user specified any rpath flags, then add them. 9558*132f818dSEnji Cooper temp_xrpath= 9559*132f818dSEnji Cooper for libdir in $xrpath; do 9560*132f818dSEnji Cooper func_replace_sysroot "$libdir" 9561*132f818dSEnji Cooper func_append temp_xrpath " -R$func_replace_sysroot_result" 9562*132f818dSEnji Cooper case "$finalize_rpath " in 9563*132f818dSEnji Cooper *" $libdir "*) ;; 9564*132f818dSEnji Cooper *) func_append finalize_rpath " $libdir" ;; 9565*132f818dSEnji Cooper esac 9566*132f818dSEnji Cooper done 9567*132f818dSEnji Cooper if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then 9568*132f818dSEnji Cooper dependency_libs="$temp_xrpath $dependency_libs" 9569*132f818dSEnji Cooper fi 9570*132f818dSEnji Cooper fi 9571*132f818dSEnji Cooper 9572*132f818dSEnji Cooper # Make sure dlfiles contains only unique files that won't be dlpreopened 9573*132f818dSEnji Cooper old_dlfiles=$dlfiles 9574*132f818dSEnji Cooper dlfiles= 9575*132f818dSEnji Cooper for lib in $old_dlfiles; do 9576*132f818dSEnji Cooper case " $dlprefiles $dlfiles " in 9577*132f818dSEnji Cooper *" $lib "*) ;; 9578*132f818dSEnji Cooper *) func_append dlfiles " $lib" ;; 9579*132f818dSEnji Cooper esac 9580*132f818dSEnji Cooper done 9581*132f818dSEnji Cooper 9582*132f818dSEnji Cooper # Make sure dlprefiles contains only unique files 9583*132f818dSEnji Cooper old_dlprefiles=$dlprefiles 9584*132f818dSEnji Cooper dlprefiles= 9585*132f818dSEnji Cooper for lib in $old_dlprefiles; do 9586*132f818dSEnji Cooper case "$dlprefiles " in 9587*132f818dSEnji Cooper *" $lib "*) ;; 9588*132f818dSEnji Cooper *) func_append dlprefiles " $lib" ;; 9589*132f818dSEnji Cooper esac 9590*132f818dSEnji Cooper done 9591*132f818dSEnji Cooper 9592*132f818dSEnji Cooper if test yes = "$build_libtool_libs"; then 9593*132f818dSEnji Cooper if test -n "$rpath"; then 9594*132f818dSEnji Cooper case $host in 9595*132f818dSEnji Cooper *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) 9596*132f818dSEnji Cooper # these systems don't actually have a c library (as such)! 9597*132f818dSEnji Cooper ;; 9598*132f818dSEnji Cooper *-*-rhapsody* | *-*-darwin1.[012]) 9599*132f818dSEnji Cooper # Rhapsody C library is in the System framework 9600*132f818dSEnji Cooper func_append deplibs " System.ltframework" 9601*132f818dSEnji Cooper ;; 9602*132f818dSEnji Cooper *-*-netbsd*) 9603*132f818dSEnji Cooper # Don't link with libc until the a.out ld.so is fixed. 9604*132f818dSEnji Cooper ;; 9605*132f818dSEnji Cooper *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) 9606*132f818dSEnji Cooper # Do not include libc due to us having libc/libc_r. 9607*132f818dSEnji Cooper ;; 9608*132f818dSEnji Cooper *-*-sco3.2v5* | *-*-sco5v6*) 9609*132f818dSEnji Cooper # Causes problems with __ctype 9610*132f818dSEnji Cooper ;; 9611*132f818dSEnji Cooper *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) 9612*132f818dSEnji Cooper # Compiler inserts libc in the correct place for threads to work 9613*132f818dSEnji Cooper ;; 9614*132f818dSEnji Cooper *) 9615*132f818dSEnji Cooper # Add libc to deplibs on all other systems if necessary. 9616*132f818dSEnji Cooper if test yes = "$build_libtool_need_lc"; then 9617*132f818dSEnji Cooper func_append deplibs " -lc" 9618*132f818dSEnji Cooper fi 9619*132f818dSEnji Cooper ;; 9620*132f818dSEnji Cooper esac 9621*132f818dSEnji Cooper fi 9622*132f818dSEnji Cooper 9623*132f818dSEnji Cooper # Transform deplibs into only deplibs that can be linked in shared. 9624*132f818dSEnji Cooper name_save=$name 9625*132f818dSEnji Cooper libname_save=$libname 9626*132f818dSEnji Cooper release_save=$release 9627*132f818dSEnji Cooper versuffix_save=$versuffix 9628*132f818dSEnji Cooper major_save=$major 9629*132f818dSEnji Cooper # I'm not sure if I'm treating the release correctly. I think 9630*132f818dSEnji Cooper # release should show up in the -l (ie -lgmp5) so we don't want to 9631*132f818dSEnji Cooper # add it in twice. Is that correct? 9632*132f818dSEnji Cooper release= 9633*132f818dSEnji Cooper versuffix= 9634*132f818dSEnji Cooper major= 9635*132f818dSEnji Cooper newdeplibs= 9636*132f818dSEnji Cooper droppeddeps=no 9637*132f818dSEnji Cooper case $deplibs_check_method in 9638*132f818dSEnji Cooper pass_all) 9639*132f818dSEnji Cooper # Don't check for shared/static. Everything works. 9640*132f818dSEnji Cooper # This might be a little naive. We might want to check 9641*132f818dSEnji Cooper # whether the library exists or not. But this is on 9642*132f818dSEnji Cooper # osf3 & osf4 and I'm not really sure... Just 9643*132f818dSEnji Cooper # implementing what was already the behavior. 9644*132f818dSEnji Cooper newdeplibs=$deplibs 9645*132f818dSEnji Cooper ;; 9646*132f818dSEnji Cooper file_magic*) 9647*132f818dSEnji Cooper set dummy $deplibs_check_method; shift 9648*132f818dSEnji Cooper file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` 9649*132f818dSEnji Cooper for a_deplib in $deplibs; do 9650*132f818dSEnji Cooper case $a_deplib in 9651*132f818dSEnji Cooper -l*) 9652*132f818dSEnji Cooper func_stripname -l '' "$a_deplib" 9653*132f818dSEnji Cooper name=$func_stripname_result 9654*132f818dSEnji Cooper if test yes = "$allow_libtool_libs_with_static_runtimes"; then 9655*132f818dSEnji Cooper case " $predeps $postdeps " in 9656*132f818dSEnji Cooper *" $a_deplib "*) 9657*132f818dSEnji Cooper func_append newdeplibs " $a_deplib" 9658*132f818dSEnji Cooper a_deplib= 9659*132f818dSEnji Cooper ;; 9660*132f818dSEnji Cooper esac 9661*132f818dSEnji Cooper fi 9662*132f818dSEnji Cooper if test -n "$a_deplib"; then 9663*132f818dSEnji Cooper libname=`eval "\\$ECHO \"$libname_spec\""` 9664*132f818dSEnji Cooper if test -n "$file_magic_glob"; then 9665*132f818dSEnji Cooper libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` 9666*132f818dSEnji Cooper else 9667*132f818dSEnji Cooper libnameglob=$libname 9668*132f818dSEnji Cooper fi 9669*132f818dSEnji Cooper test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob` 9670*132f818dSEnji Cooper for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do 9671*132f818dSEnji Cooper if test yes = "$want_nocaseglob"; then 9672*132f818dSEnji Cooper shopt -s nocaseglob 9673*132f818dSEnji Cooper potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` 9674*132f818dSEnji Cooper $nocaseglob 9675*132f818dSEnji Cooper else 9676*132f818dSEnji Cooper potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` 9677*132f818dSEnji Cooper fi 9678*132f818dSEnji Cooper for potent_lib in $potential_libs; do 9679*132f818dSEnji Cooper # Follow soft links. 9680*132f818dSEnji Cooper if ls -lLd "$potent_lib" 2>/dev/null | 9681*132f818dSEnji Cooper $GREP " -> " >/dev/null; then 9682*132f818dSEnji Cooper continue 9683*132f818dSEnji Cooper fi 9684*132f818dSEnji Cooper # The statement above tries to avoid entering an 9685*132f818dSEnji Cooper # endless loop below, in case of cyclic links. 9686*132f818dSEnji Cooper # We might still enter an endless loop, since a link 9687*132f818dSEnji Cooper # loop can be closed while we follow links, 9688*132f818dSEnji Cooper # but so what? 9689*132f818dSEnji Cooper potlib=$potent_lib 9690*132f818dSEnji Cooper while test -h "$potlib" 2>/dev/null; do 9691*132f818dSEnji Cooper potliblink=`ls -ld $potlib | $SED 's/.* -> //'` 9692*132f818dSEnji Cooper case $potliblink in 9693*132f818dSEnji Cooper [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; 9694*132f818dSEnji Cooper *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; 9695*132f818dSEnji Cooper esac 9696*132f818dSEnji Cooper done 9697*132f818dSEnji Cooper if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | 9698*132f818dSEnji Cooper $SED -e 10q | 9699*132f818dSEnji Cooper $EGREP "$file_magic_regex" > /dev/null; then 9700*132f818dSEnji Cooper func_append newdeplibs " $a_deplib" 9701*132f818dSEnji Cooper a_deplib= 9702*132f818dSEnji Cooper break 2 9703*132f818dSEnji Cooper fi 9704*132f818dSEnji Cooper done 9705*132f818dSEnji Cooper done 9706*132f818dSEnji Cooper fi 9707*132f818dSEnji Cooper if test -n "$a_deplib"; then 9708*132f818dSEnji Cooper droppeddeps=yes 9709*132f818dSEnji Cooper func_warning "Linker path does not have real file for library $a_deplib." 9710*132f818dSEnji Cooper func_warning "I have the capability to make that library automatically link in when" 9711*132f818dSEnji Cooper func_warning "you link to this library. But I can only do this if you have a" 9712*132f818dSEnji Cooper func_warning "shared version of the library, which you do not appear to have" 9713*132f818dSEnji Cooper func_warning "because I did check the linker path looking for a file starting" 9714*132f818dSEnji Cooper if test -z "$potlib"; then 9715*132f818dSEnji Cooper func_warning "with $libname but no candidates were found. (...for file magic test)" 9716*132f818dSEnji Cooper else 9717*132f818dSEnji Cooper func_warning "with $libname and none of the candidates passed a file format test" 9718*132f818dSEnji Cooper func_warning "using a file magic. Last file checked: $potlib" 9719*132f818dSEnji Cooper fi 9720*132f818dSEnji Cooper fi 9721*132f818dSEnji Cooper ;; 9722*132f818dSEnji Cooper *) 9723*132f818dSEnji Cooper # Add a -L argument. 9724*132f818dSEnji Cooper func_append newdeplibs " $a_deplib" 9725*132f818dSEnji Cooper ;; 9726*132f818dSEnji Cooper esac 9727*132f818dSEnji Cooper done # Gone through all deplibs. 9728*132f818dSEnji Cooper ;; 9729*132f818dSEnji Cooper match_pattern*) 9730*132f818dSEnji Cooper set dummy $deplibs_check_method; shift 9731*132f818dSEnji Cooper match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` 9732*132f818dSEnji Cooper for a_deplib in $deplibs; do 9733*132f818dSEnji Cooper case $a_deplib in 9734*132f818dSEnji Cooper -l*) 9735*132f818dSEnji Cooper func_stripname -l '' "$a_deplib" 9736*132f818dSEnji Cooper name=$func_stripname_result 9737*132f818dSEnji Cooper if test yes = "$allow_libtool_libs_with_static_runtimes"; then 9738*132f818dSEnji Cooper case " $predeps $postdeps " in 9739*132f818dSEnji Cooper *" $a_deplib "*) 9740*132f818dSEnji Cooper func_append newdeplibs " $a_deplib" 9741*132f818dSEnji Cooper a_deplib= 9742*132f818dSEnji Cooper ;; 9743*132f818dSEnji Cooper esac 9744*132f818dSEnji Cooper fi 9745*132f818dSEnji Cooper if test -n "$a_deplib"; then 9746*132f818dSEnji Cooper libname=`eval "\\$ECHO \"$libname_spec\""` 9747*132f818dSEnji Cooper for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do 9748*132f818dSEnji Cooper potential_libs=`ls $i/$libname[.-]* 2>/dev/null` 9749*132f818dSEnji Cooper for potent_lib in $potential_libs; do 9750*132f818dSEnji Cooper potlib=$potent_lib # see symlink-check above in file_magic test 9751*132f818dSEnji Cooper if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ 9752*132f818dSEnji Cooper $EGREP "$match_pattern_regex" > /dev/null; then 9753*132f818dSEnji Cooper func_append newdeplibs " $a_deplib" 9754*132f818dSEnji Cooper a_deplib= 9755*132f818dSEnji Cooper break 2 9756*132f818dSEnji Cooper fi 9757*132f818dSEnji Cooper done 9758*132f818dSEnji Cooper done 9759*132f818dSEnji Cooper fi 9760*132f818dSEnji Cooper if test -n "$a_deplib"; then 9761*132f818dSEnji Cooper droppeddeps=yes 9762*132f818dSEnji Cooper func_warning "Linker path does not have real file for library $a_deplib." 9763*132f818dSEnji Cooper func_warning "I have the capability to make that library automatically link in when" 9764*132f818dSEnji Cooper func_warning "you link to this library. But I can only do this if you have a" 9765*132f818dSEnji Cooper func_warning "shared version of the library, which you do not appear to have" 9766*132f818dSEnji Cooper func_warning "because I did check the linker path looking for a file starting" 9767*132f818dSEnji Cooper if test -z "$potlib"; then 9768*132f818dSEnji Cooper func_warning "with $libname but no candidates were found. (...for regex pattern test)" 9769*132f818dSEnji Cooper else 9770*132f818dSEnji Cooper func_warning "with $libname and none of the candidates passed a file format test" 9771*132f818dSEnji Cooper func_warning "using a regex pattern. Last file checked: $potlib" 9772*132f818dSEnji Cooper fi 9773*132f818dSEnji Cooper fi 9774*132f818dSEnji Cooper ;; 9775*132f818dSEnji Cooper *) 9776*132f818dSEnji Cooper # Add a -L argument. 9777*132f818dSEnji Cooper func_append newdeplibs " $a_deplib" 9778*132f818dSEnji Cooper ;; 9779*132f818dSEnji Cooper esac 9780*132f818dSEnji Cooper done # Gone through all deplibs. 9781*132f818dSEnji Cooper ;; 9782*132f818dSEnji Cooper none | unknown | *) 9783*132f818dSEnji Cooper newdeplibs= 9784*132f818dSEnji Cooper tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` 9785*132f818dSEnji Cooper if test yes = "$allow_libtool_libs_with_static_runtimes"; then 9786*132f818dSEnji Cooper for i in $predeps $postdeps; do 9787*132f818dSEnji Cooper # can't use Xsed below, because $i might contain '/' 9788*132f818dSEnji Cooper tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` 9789*132f818dSEnji Cooper done 9790*132f818dSEnji Cooper fi 9791*132f818dSEnji Cooper case $tmp_deplibs in 9792*132f818dSEnji Cooper *[!\ \ ]*) 9793*132f818dSEnji Cooper echo 9794*132f818dSEnji Cooper if test none = "$deplibs_check_method"; then 9795*132f818dSEnji Cooper func_warning "Inter-library dependencies are not supported in this platform." 9796*132f818dSEnji Cooper else 9797*132f818dSEnji Cooper func_warning "Inter-library dependencies are not known to be supported." 9798*132f818dSEnji Cooper fi 9799*132f818dSEnji Cooper func_warning "All declared inter-library dependencies are being dropped." 9800*132f818dSEnji Cooper droppeddeps=yes 9801*132f818dSEnji Cooper ;; 9802*132f818dSEnji Cooper esac 9803*132f818dSEnji Cooper ;; 9804*132f818dSEnji Cooper esac 9805*132f818dSEnji Cooper versuffix=$versuffix_save 9806*132f818dSEnji Cooper major=$major_save 9807*132f818dSEnji Cooper release=$release_save 9808*132f818dSEnji Cooper libname=$libname_save 9809*132f818dSEnji Cooper name=$name_save 9810*132f818dSEnji Cooper 9811*132f818dSEnji Cooper case $host in 9812*132f818dSEnji Cooper *-*-rhapsody* | *-*-darwin1.[012]) 9813*132f818dSEnji Cooper # On Rhapsody replace the C library with the System framework 9814*132f818dSEnji Cooper newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` 9815*132f818dSEnji Cooper ;; 9816*132f818dSEnji Cooper esac 9817*132f818dSEnji Cooper 9818*132f818dSEnji Cooper if test yes = "$droppeddeps"; then 9819*132f818dSEnji Cooper if test yes = "$module"; then 9820*132f818dSEnji Cooper func_warning "libtool could not satisfy all declared inter-library" 9821*132f818dSEnji Cooper func_warning "dependencies of module $libname. Therefore, libtool will create" 9822*132f818dSEnji Cooper func_warning "a static module, that should work as long as the dlopening" 9823*132f818dSEnji Cooper func_warning "application is linked with the -dlopen flag." 9824*132f818dSEnji Cooper if test -z "$global_symbol_pipe"; then 9825*132f818dSEnji Cooper func_warning "However, this would only work if libtool was able to extract symbol" 9826*132f818dSEnji Cooper func_warning "lists from a program, using 'nm' or equivalent, but libtool could" 9827*132f818dSEnji Cooper func_warning "not find such a program. So, this module is probably useless." 9828*132f818dSEnji Cooper func_warning "'nm' from GNU binutils and a full rebuild may help." 9829*132f818dSEnji Cooper fi 9830*132f818dSEnji Cooper if test no = "$build_old_libs"; then 9831*132f818dSEnji Cooper oldlibs=$output_objdir/$libname.$libext 9832*132f818dSEnji Cooper build_libtool_libs=module 9833*132f818dSEnji Cooper build_old_libs=yes 9834*132f818dSEnji Cooper else 9835*132f818dSEnji Cooper build_libtool_libs=no 9836*132f818dSEnji Cooper fi 9837*132f818dSEnji Cooper else 9838*132f818dSEnji Cooper echo "*** The inter-library dependencies that have been dropped here will be" 9839*132f818dSEnji Cooper echo "*** automatically added whenever a program is linked with this library" 9840*132f818dSEnji Cooper echo "*** or is declared to -dlopen it." 9841*132f818dSEnji Cooper 9842*132f818dSEnji Cooper if test no = "$allow_undefined"; then 9843*132f818dSEnji Cooper echo 9844*132f818dSEnji Cooper echo "*** Since this library must not contain undefined symbols," 9845*132f818dSEnji Cooper echo "*** because either the platform does not support them or" 9846*132f818dSEnji Cooper echo "*** it was explicitly requested with -no-undefined," 9847*132f818dSEnji Cooper echo "*** libtool will only create a static version of it." 9848*132f818dSEnji Cooper if test no = "$build_old_libs"; then 9849*132f818dSEnji Cooper oldlibs=$output_objdir/$libname.$libext 9850*132f818dSEnji Cooper build_libtool_libs=module 9851*132f818dSEnji Cooper build_old_libs=yes 9852*132f818dSEnji Cooper else 9853*132f818dSEnji Cooper build_libtool_libs=no 9854*132f818dSEnji Cooper fi 9855*132f818dSEnji Cooper fi 9856*132f818dSEnji Cooper fi 9857*132f818dSEnji Cooper fi 9858*132f818dSEnji Cooper # Done checking deplibs! 9859*132f818dSEnji Cooper deplibs=$newdeplibs 9860*132f818dSEnji Cooper fi 9861*132f818dSEnji Cooper # Time to change all our "foo.ltframework" stuff back to "-framework foo" 9862*132f818dSEnji Cooper case $host in 9863*132f818dSEnji Cooper *-*-darwin*) 9864*132f818dSEnji Cooper newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 9865*132f818dSEnji Cooper new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 9866*132f818dSEnji Cooper deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 9867*132f818dSEnji Cooper ;; 9868*132f818dSEnji Cooper esac 9869*132f818dSEnji Cooper 9870*132f818dSEnji Cooper # move library search paths that coincide with paths to not yet 9871*132f818dSEnji Cooper # installed libraries to the beginning of the library search list 9872*132f818dSEnji Cooper new_libs= 9873*132f818dSEnji Cooper for path in $notinst_path; do 9874*132f818dSEnji Cooper case " $new_libs " in 9875*132f818dSEnji Cooper *" -L$path/$objdir "*) ;; 9876*132f818dSEnji Cooper *) 9877*132f818dSEnji Cooper case " $deplibs " in 9878*132f818dSEnji Cooper *" -L$path/$objdir "*) 9879*132f818dSEnji Cooper func_append new_libs " -L$path/$objdir" ;; 9880*132f818dSEnji Cooper esac 9881*132f818dSEnji Cooper ;; 9882*132f818dSEnji Cooper esac 9883*132f818dSEnji Cooper done 9884*132f818dSEnji Cooper for deplib in $deplibs; do 9885*132f818dSEnji Cooper case $deplib in 9886*132f818dSEnji Cooper -L*) 9887*132f818dSEnji Cooper case " $new_libs " in 9888*132f818dSEnji Cooper *" $deplib "*) ;; 9889*132f818dSEnji Cooper *) func_append new_libs " $deplib" ;; 9890*132f818dSEnji Cooper esac 9891*132f818dSEnji Cooper ;; 9892*132f818dSEnji Cooper *) func_append new_libs " $deplib" ;; 9893*132f818dSEnji Cooper esac 9894*132f818dSEnji Cooper done 9895*132f818dSEnji Cooper deplibs=$new_libs 9896*132f818dSEnji Cooper 9897*132f818dSEnji Cooper # All the library-specific variables (install_libdir is set above). 9898*132f818dSEnji Cooper library_names= 9899*132f818dSEnji Cooper old_library= 9900*132f818dSEnji Cooper dlname= 9901*132f818dSEnji Cooper 9902*132f818dSEnji Cooper # Test again, we may have decided not to build it any more 9903*132f818dSEnji Cooper if test yes = "$build_libtool_libs"; then 9904*132f818dSEnji Cooper # Remove $wl instances when linking with ld. 9905*132f818dSEnji Cooper # FIXME: should test the right _cmds variable. 9906*132f818dSEnji Cooper case $archive_cmds in 9907*132f818dSEnji Cooper *\$LD\ *) wl= ;; 9908*132f818dSEnji Cooper esac 9909*132f818dSEnji Cooper if test yes = "$hardcode_into_libs"; then 9910*132f818dSEnji Cooper # Hardcode the library paths 9911*132f818dSEnji Cooper hardcode_libdirs= 9912*132f818dSEnji Cooper dep_rpath= 9913*132f818dSEnji Cooper rpath=$finalize_rpath 9914*132f818dSEnji Cooper test relink = "$opt_mode" || rpath=$compile_rpath$rpath 9915*132f818dSEnji Cooper for libdir in $rpath; do 9916*132f818dSEnji Cooper if test -n "$hardcode_libdir_flag_spec"; then 9917*132f818dSEnji Cooper if test -n "$hardcode_libdir_separator"; then 9918*132f818dSEnji Cooper func_replace_sysroot "$libdir" 9919*132f818dSEnji Cooper libdir=$func_replace_sysroot_result 9920*132f818dSEnji Cooper if test -z "$hardcode_libdirs"; then 9921*132f818dSEnji Cooper hardcode_libdirs=$libdir 9922*132f818dSEnji Cooper else 9923*132f818dSEnji Cooper # Just accumulate the unique libdirs. 9924*132f818dSEnji Cooper case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in 9925*132f818dSEnji Cooper *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) 9926*132f818dSEnji Cooper ;; 9927*132f818dSEnji Cooper *) 9928*132f818dSEnji Cooper func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" 9929*132f818dSEnji Cooper ;; 9930*132f818dSEnji Cooper esac 9931*132f818dSEnji Cooper fi 9932*132f818dSEnji Cooper else 9933*132f818dSEnji Cooper eval flag=\"$hardcode_libdir_flag_spec\" 9934*132f818dSEnji Cooper func_append dep_rpath " $flag" 9935*132f818dSEnji Cooper fi 9936*132f818dSEnji Cooper elif test -n "$runpath_var"; then 9937*132f818dSEnji Cooper case "$perm_rpath " in 9938*132f818dSEnji Cooper *" $libdir "*) ;; 9939*132f818dSEnji Cooper *) func_append perm_rpath " $libdir" ;; 9940*132f818dSEnji Cooper esac 9941*132f818dSEnji Cooper fi 9942*132f818dSEnji Cooper done 9943*132f818dSEnji Cooper # Substitute the hardcoded libdirs into the rpath. 9944*132f818dSEnji Cooper if test -n "$hardcode_libdir_separator" && 9945*132f818dSEnji Cooper test -n "$hardcode_libdirs"; then 9946*132f818dSEnji Cooper libdir=$hardcode_libdirs 9947*132f818dSEnji Cooper eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" 9948*132f818dSEnji Cooper fi 9949*132f818dSEnji Cooper if test -n "$runpath_var" && test -n "$perm_rpath"; then 9950*132f818dSEnji Cooper # We should set the runpath_var. 9951*132f818dSEnji Cooper rpath= 9952*132f818dSEnji Cooper for dir in $perm_rpath; do 9953*132f818dSEnji Cooper func_append rpath "$dir:" 9954*132f818dSEnji Cooper done 9955*132f818dSEnji Cooper eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" 9956*132f818dSEnji Cooper fi 9957*132f818dSEnji Cooper test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" 9958*132f818dSEnji Cooper fi 9959*132f818dSEnji Cooper 9960*132f818dSEnji Cooper shlibpath=$finalize_shlibpath 9961*132f818dSEnji Cooper test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath 9962*132f818dSEnji Cooper if test -n "$shlibpath"; then 9963*132f818dSEnji Cooper eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" 9964*132f818dSEnji Cooper fi 9965*132f818dSEnji Cooper 9966*132f818dSEnji Cooper # Get the real and link names of the library. 9967*132f818dSEnji Cooper eval shared_ext=\"$shrext_cmds\" 9968*132f818dSEnji Cooper eval library_names=\"$library_names_spec\" 9969*132f818dSEnji Cooper set dummy $library_names 9970*132f818dSEnji Cooper shift 9971*132f818dSEnji Cooper realname=$1 9972*132f818dSEnji Cooper shift 9973*132f818dSEnji Cooper 9974*132f818dSEnji Cooper if test -n "$soname_spec"; then 9975*132f818dSEnji Cooper eval soname=\"$soname_spec\" 9976*132f818dSEnji Cooper else 9977*132f818dSEnji Cooper soname=$realname 9978*132f818dSEnji Cooper fi 9979*132f818dSEnji Cooper if test -z "$dlname"; then 9980*132f818dSEnji Cooper dlname=$soname 9981*132f818dSEnji Cooper fi 9982*132f818dSEnji Cooper 9983*132f818dSEnji Cooper lib=$output_objdir/$realname 9984*132f818dSEnji Cooper linknames= 9985*132f818dSEnji Cooper for link 9986*132f818dSEnji Cooper do 9987*132f818dSEnji Cooper func_append linknames " $link" 9988*132f818dSEnji Cooper done 9989*132f818dSEnji Cooper 9990*132f818dSEnji Cooper # Use standard objects if they are pic 9991*132f818dSEnji Cooper test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` 9992*132f818dSEnji Cooper test "X$libobjs" = "X " && libobjs= 9993*132f818dSEnji Cooper 9994*132f818dSEnji Cooper delfiles= 9995*132f818dSEnji Cooper if test -n "$export_symbols" && test -n "$include_expsyms"; then 9996*132f818dSEnji Cooper $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" 9997*132f818dSEnji Cooper export_symbols=$output_objdir/$libname.uexp 9998*132f818dSEnji Cooper func_append delfiles " $export_symbols" 9999*132f818dSEnji Cooper fi 10000*132f818dSEnji Cooper 10001*132f818dSEnji Cooper orig_export_symbols= 10002*132f818dSEnji Cooper case $host_os in 10003*132f818dSEnji Cooper cygwin* | mingw* | windows* | cegcc*) 10004*132f818dSEnji Cooper if test -n "$export_symbols" && test -z "$export_symbols_regex"; then 10005*132f818dSEnji Cooper # exporting using user supplied symfile 10006*132f818dSEnji Cooper func_dll_def_p "$export_symbols" || { 10007*132f818dSEnji Cooper # and it's NOT already a .def file. Must figure out 10008*132f818dSEnji Cooper # which of the given symbols are data symbols and tag 10009*132f818dSEnji Cooper # them as such. So, trigger use of export_symbols_cmds. 10010*132f818dSEnji Cooper # export_symbols gets reassigned inside the "prepare 10011*132f818dSEnji Cooper # the list of exported symbols" if statement, so the 10012*132f818dSEnji Cooper # include_expsyms logic still works. 10013*132f818dSEnji Cooper orig_export_symbols=$export_symbols 10014*132f818dSEnji Cooper export_symbols= 10015*132f818dSEnji Cooper always_export_symbols=yes 10016*132f818dSEnji Cooper } 10017*132f818dSEnji Cooper fi 10018*132f818dSEnji Cooper ;; 10019*132f818dSEnji Cooper esac 10020*132f818dSEnji Cooper 10021*132f818dSEnji Cooper # Prepare the list of exported symbols 10022*132f818dSEnji Cooper if test -z "$export_symbols"; then 10023*132f818dSEnji Cooper if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then 10024*132f818dSEnji Cooper func_verbose "generating symbol list for '$libname.la'" 10025*132f818dSEnji Cooper export_symbols=$output_objdir/$libname.exp 10026*132f818dSEnji Cooper $opt_dry_run || $RM $export_symbols 10027*132f818dSEnji Cooper cmds=$export_symbols_cmds 10028*132f818dSEnji Cooper save_ifs=$IFS; IFS='~' 10029*132f818dSEnji Cooper for cmd1 in $cmds; do 10030*132f818dSEnji Cooper IFS=$save_ifs 10031*132f818dSEnji Cooper # Take the normal branch if the nm_file_list_spec branch 10032*132f818dSEnji Cooper # doesn't work or if tool conversion is not needed. 10033*132f818dSEnji Cooper case $nm_file_list_spec~$to_tool_file_cmd in 10034*132f818dSEnji Cooper *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) 10035*132f818dSEnji Cooper try_normal_branch=yes 10036*132f818dSEnji Cooper eval cmd=\"$cmd1\" 10037*132f818dSEnji Cooper func_len " $cmd" 10038*132f818dSEnji Cooper len=$func_len_result 10039*132f818dSEnji Cooper ;; 10040*132f818dSEnji Cooper *) 10041*132f818dSEnji Cooper try_normal_branch=no 10042*132f818dSEnji Cooper ;; 10043*132f818dSEnji Cooper esac 10044*132f818dSEnji Cooper if test yes = "$try_normal_branch" \ 10045*132f818dSEnji Cooper && { test "$len" -lt "$max_cmd_len" \ 10046*132f818dSEnji Cooper || test "$max_cmd_len" -le -1; } 10047*132f818dSEnji Cooper then 10048*132f818dSEnji Cooper func_show_eval "$cmd" 'exit $?' 10049*132f818dSEnji Cooper skipped_export=false 10050*132f818dSEnji Cooper elif test -n "$nm_file_list_spec"; then 10051*132f818dSEnji Cooper func_basename "$output" 10052*132f818dSEnji Cooper output_la=$func_basename_result 10053*132f818dSEnji Cooper save_libobjs=$libobjs 10054*132f818dSEnji Cooper save_output=$output 10055*132f818dSEnji Cooper output=$output_objdir/$output_la.nm 10056*132f818dSEnji Cooper func_to_tool_file "$output" 10057*132f818dSEnji Cooper libobjs=$nm_file_list_spec$func_to_tool_file_result 10058*132f818dSEnji Cooper func_append delfiles " $output" 10059*132f818dSEnji Cooper func_verbose "creating $NM input file list: $output" 10060*132f818dSEnji Cooper for obj in $save_libobjs; do 10061*132f818dSEnji Cooper func_to_tool_file "$obj" 10062*132f818dSEnji Cooper $ECHO "$func_to_tool_file_result" 10063*132f818dSEnji Cooper done > "$output" 10064*132f818dSEnji Cooper eval cmd=\"$cmd1\" 10065*132f818dSEnji Cooper func_show_eval "$cmd" 'exit $?' 10066*132f818dSEnji Cooper output=$save_output 10067*132f818dSEnji Cooper libobjs=$save_libobjs 10068*132f818dSEnji Cooper skipped_export=false 10069*132f818dSEnji Cooper else 10070*132f818dSEnji Cooper # The command line is too long to execute in one step. 10071*132f818dSEnji Cooper func_verbose "using reloadable object file for export list..." 10072*132f818dSEnji Cooper skipped_export=: 10073*132f818dSEnji Cooper # Break out early, otherwise skipped_export may be 10074*132f818dSEnji Cooper # set to false by a later but shorter cmd. 10075*132f818dSEnji Cooper break 10076*132f818dSEnji Cooper fi 10077*132f818dSEnji Cooper done 10078*132f818dSEnji Cooper IFS=$save_ifs 10079*132f818dSEnji Cooper if test -n "$export_symbols_regex" && test : != "$skipped_export"; then 10080*132f818dSEnji Cooper func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' 10081*132f818dSEnji Cooper func_show_eval '$MV "${export_symbols}T" "$export_symbols"' 10082*132f818dSEnji Cooper fi 10083*132f818dSEnji Cooper fi 10084*132f818dSEnji Cooper fi 10085*132f818dSEnji Cooper 10086*132f818dSEnji Cooper if test -n "$export_symbols" && test -n "$include_expsyms"; then 10087*132f818dSEnji Cooper tmp_export_symbols=$export_symbols 10088*132f818dSEnji Cooper test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols 10089*132f818dSEnji Cooper $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' 10090*132f818dSEnji Cooper fi 10091*132f818dSEnji Cooper 10092*132f818dSEnji Cooper if test : != "$skipped_export" && test -n "$orig_export_symbols"; then 10093*132f818dSEnji Cooper # The given exports_symbols file has to be filtered, so filter it. 10094*132f818dSEnji Cooper func_verbose "filter symbol list for '$libname.la' to tag DATA exports" 10095*132f818dSEnji Cooper # FIXME: $output_objdir/$libname.filter potentially contains lots of 10096*132f818dSEnji Cooper # 's' commands, which not all seds can handle. GNU sed should be fine 10097*132f818dSEnji Cooper # though. Also, the filter scales superlinearly with the number of 10098*132f818dSEnji Cooper # global variables. join(1) would be nice here, but unfortunately 10099*132f818dSEnji Cooper # isn't a blessed tool. 10100*132f818dSEnji Cooper $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter 10101*132f818dSEnji Cooper func_append delfiles " $export_symbols $output_objdir/$libname.filter" 10102*132f818dSEnji Cooper export_symbols=$output_objdir/$libname.def 10103*132f818dSEnji Cooper $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols 10104*132f818dSEnji Cooper fi 10105*132f818dSEnji Cooper 10106*132f818dSEnji Cooper tmp_deplibs= 10107*132f818dSEnji Cooper for test_deplib in $deplibs; do 10108*132f818dSEnji Cooper case " $convenience " in 10109*132f818dSEnji Cooper *" $test_deplib "*) ;; 10110*132f818dSEnji Cooper *) 10111*132f818dSEnji Cooper func_append tmp_deplibs " $test_deplib" 10112*132f818dSEnji Cooper ;; 10113*132f818dSEnji Cooper esac 10114*132f818dSEnji Cooper done 10115*132f818dSEnji Cooper deplibs=$tmp_deplibs 10116*132f818dSEnji Cooper 10117*132f818dSEnji Cooper if test -n "$convenience"; then 10118*132f818dSEnji Cooper if test -n "$whole_archive_flag_spec" && 10119*132f818dSEnji Cooper test yes = "$compiler_needs_object" && 10120*132f818dSEnji Cooper test -z "$libobjs"; then 10121*132f818dSEnji Cooper # extract the archives, so we have objects to list. 10122*132f818dSEnji Cooper # TODO: could optimize this to just extract one archive. 10123*132f818dSEnji Cooper whole_archive_flag_spec= 10124*132f818dSEnji Cooper fi 10125*132f818dSEnji Cooper if test -n "$whole_archive_flag_spec"; then 10126*132f818dSEnji Cooper save_libobjs=$libobjs 10127*132f818dSEnji Cooper eval libobjs=\"\$libobjs $whole_archive_flag_spec\" 10128*132f818dSEnji Cooper test "X$libobjs" = "X " && libobjs= 10129*132f818dSEnji Cooper else 10130*132f818dSEnji Cooper gentop=$output_objdir/${outputname}x 10131*132f818dSEnji Cooper func_append generated " $gentop" 10132*132f818dSEnji Cooper 10133*132f818dSEnji Cooper func_extract_archives $gentop $convenience 10134*132f818dSEnji Cooper func_append libobjs " $func_extract_archives_result" 10135*132f818dSEnji Cooper test "X$libobjs" = "X " && libobjs= 10136*132f818dSEnji Cooper fi 10137*132f818dSEnji Cooper fi 10138*132f818dSEnji Cooper 10139*132f818dSEnji Cooper if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then 10140*132f818dSEnji Cooper eval flag=\"$thread_safe_flag_spec\" 10141*132f818dSEnji Cooper func_append linker_flags " $flag" 10142*132f818dSEnji Cooper fi 10143*132f818dSEnji Cooper 10144*132f818dSEnji Cooper # Make a backup of the uninstalled library when relinking 10145*132f818dSEnji Cooper if test relink = "$opt_mode"; then 10146*132f818dSEnji Cooper $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? 10147*132f818dSEnji Cooper fi 10148*132f818dSEnji Cooper 10149*132f818dSEnji Cooper # Do each of the archive commands. 10150*132f818dSEnji Cooper if test yes = "$module" && test -n "$module_cmds"; then 10151*132f818dSEnji Cooper if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then 10152*132f818dSEnji Cooper eval test_cmds=\"$module_expsym_cmds\" 10153*132f818dSEnji Cooper cmds=$module_expsym_cmds 10154*132f818dSEnji Cooper else 10155*132f818dSEnji Cooper eval test_cmds=\"$module_cmds\" 10156*132f818dSEnji Cooper cmds=$module_cmds 10157*132f818dSEnji Cooper fi 10158*132f818dSEnji Cooper else 10159*132f818dSEnji Cooper if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then 10160*132f818dSEnji Cooper eval test_cmds=\"$archive_expsym_cmds\" 10161*132f818dSEnji Cooper cmds=$archive_expsym_cmds 10162*132f818dSEnji Cooper else 10163*132f818dSEnji Cooper eval test_cmds=\"$archive_cmds\" 10164*132f818dSEnji Cooper cmds=$archive_cmds 10165*132f818dSEnji Cooper fi 10166*132f818dSEnji Cooper fi 10167*132f818dSEnji Cooper 10168*132f818dSEnji Cooper if test : != "$skipped_export" && 10169*132f818dSEnji Cooper func_len " $test_cmds" && 10170*132f818dSEnji Cooper len=$func_len_result && 10171*132f818dSEnji Cooper test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then 10172*132f818dSEnji Cooper : 10173*132f818dSEnji Cooper else 10174*132f818dSEnji Cooper # The command line is too long to link in one step, link piecewise 10175*132f818dSEnji Cooper # or, if using GNU ld and skipped_export is not :, use a linker 10176*132f818dSEnji Cooper # script. 10177*132f818dSEnji Cooper 10178*132f818dSEnji Cooper # Save the value of $output and $libobjs because we want to 10179*132f818dSEnji Cooper # use them later. If we have whole_archive_flag_spec, we 10180*132f818dSEnji Cooper # want to use save_libobjs as it was before 10181*132f818dSEnji Cooper # whole_archive_flag_spec was expanded, because we can't 10182*132f818dSEnji Cooper # assume the linker understands whole_archive_flag_spec. 10183*132f818dSEnji Cooper # This may have to be revisited, in case too many 10184*132f818dSEnji Cooper # convenience libraries get linked in and end up exceeding 10185*132f818dSEnji Cooper # the spec. 10186*132f818dSEnji Cooper if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then 10187*132f818dSEnji Cooper save_libobjs=$libobjs 10188*132f818dSEnji Cooper fi 10189*132f818dSEnji Cooper save_output=$output 10190*132f818dSEnji Cooper func_basename "$output" 10191*132f818dSEnji Cooper output_la=$func_basename_result 10192*132f818dSEnji Cooper 10193*132f818dSEnji Cooper # Clear the reloadable object creation command queue and 10194*132f818dSEnji Cooper # initialize k to one. 10195*132f818dSEnji Cooper test_cmds= 10196*132f818dSEnji Cooper concat_cmds= 10197*132f818dSEnji Cooper objlist= 10198*132f818dSEnji Cooper last_robj= 10199*132f818dSEnji Cooper k=1 10200*132f818dSEnji Cooper 10201*132f818dSEnji Cooper if test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then 10202*132f818dSEnji Cooper output=$output_objdir/$output_la.lnk 10203*132f818dSEnji Cooper func_verbose "creating linker input file list: $output" 10204*132f818dSEnji Cooper : > $output 10205*132f818dSEnji Cooper set x $save_libobjs 10206*132f818dSEnji Cooper shift 10207*132f818dSEnji Cooper firstobj= 10208*132f818dSEnji Cooper if test yes = "$compiler_needs_object"; then 10209*132f818dSEnji Cooper firstobj="$1 " 10210*132f818dSEnji Cooper shift 10211*132f818dSEnji Cooper fi 10212*132f818dSEnji Cooper for obj 10213*132f818dSEnji Cooper do 10214*132f818dSEnji Cooper func_to_tool_file "$obj" 10215*132f818dSEnji Cooper $ECHO "$func_to_tool_file_result" >> $output 10216*132f818dSEnji Cooper done 10217*132f818dSEnji Cooper func_append delfiles " $output" 10218*132f818dSEnji Cooper func_to_tool_file "$output" 10219*132f818dSEnji Cooper output=$firstobj\"$file_list_spec$func_to_tool_file_result\" 10220*132f818dSEnji Cooper elif test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then 10221*132f818dSEnji Cooper output=$output_objdir/$output_la.lnkscript 10222*132f818dSEnji Cooper func_verbose "creating GNU ld script: $output" 10223*132f818dSEnji Cooper echo 'INPUT (' > $output 10224*132f818dSEnji Cooper for obj in $save_libobjs 10225*132f818dSEnji Cooper do 10226*132f818dSEnji Cooper func_to_tool_file "$obj" 10227*132f818dSEnji Cooper $ECHO "$func_to_tool_file_result" >> $output 10228*132f818dSEnji Cooper done 10229*132f818dSEnji Cooper echo ')' >> $output 10230*132f818dSEnji Cooper func_append delfiles " $output" 10231*132f818dSEnji Cooper func_to_tool_file "$output" 10232*132f818dSEnji Cooper output=$func_to_tool_file_result 10233*132f818dSEnji Cooper else 10234*132f818dSEnji Cooper if test -n "$save_libobjs"; then 10235*132f818dSEnji Cooper func_verbose "creating reloadable object files..." 10236*132f818dSEnji Cooper output=$output_objdir/$output_la-$k.$objext 10237*132f818dSEnji Cooper eval test_cmds=\"$reload_cmds\" 10238*132f818dSEnji Cooper func_len " $test_cmds" 10239*132f818dSEnji Cooper len0=$func_len_result 10240*132f818dSEnji Cooper len=$len0 10241*132f818dSEnji Cooper 10242*132f818dSEnji Cooper # Loop over the list of objects to be linked. 10243*132f818dSEnji Cooper for obj in $save_libobjs 10244*132f818dSEnji Cooper do 10245*132f818dSEnji Cooper func_len " $obj" 10246*132f818dSEnji Cooper func_arith $len + $func_len_result 10247*132f818dSEnji Cooper len=$func_arith_result 10248*132f818dSEnji Cooper if test -z "$objlist" || 10249*132f818dSEnji Cooper test "$len" -lt "$max_cmd_len"; then 10250*132f818dSEnji Cooper func_append objlist " $obj" 10251*132f818dSEnji Cooper else 10252*132f818dSEnji Cooper # The command $test_cmds is almost too long, add a 10253*132f818dSEnji Cooper # command to the queue. 10254*132f818dSEnji Cooper if test 1 -eq "$k"; then 10255*132f818dSEnji Cooper # The first file doesn't have a previous command to add. 10256*132f818dSEnji Cooper reload_objs=$objlist 10257*132f818dSEnji Cooper eval concat_cmds=\"$reload_cmds\" 10258*132f818dSEnji Cooper else 10259*132f818dSEnji Cooper # All subsequent reloadable object files will link in 10260*132f818dSEnji Cooper # the last one created. 10261*132f818dSEnji Cooper reload_objs="$objlist $last_robj" 10262*132f818dSEnji Cooper eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" 10263*132f818dSEnji Cooper fi 10264*132f818dSEnji Cooper last_robj=$output_objdir/$output_la-$k.$objext 10265*132f818dSEnji Cooper func_arith $k + 1 10266*132f818dSEnji Cooper k=$func_arith_result 10267*132f818dSEnji Cooper output=$output_objdir/$output_la-$k.$objext 10268*132f818dSEnji Cooper objlist=" $obj" 10269*132f818dSEnji Cooper func_len " $last_robj" 10270*132f818dSEnji Cooper func_arith $len0 + $func_len_result 10271*132f818dSEnji Cooper len=$func_arith_result 10272*132f818dSEnji Cooper fi 10273*132f818dSEnji Cooper done 10274*132f818dSEnji Cooper # Handle the remaining objects by creating one last 10275*132f818dSEnji Cooper # reloadable object file. All subsequent reloadable object 10276*132f818dSEnji Cooper # files will link in the last one created. 10277*132f818dSEnji Cooper test -z "$concat_cmds" || concat_cmds=$concat_cmds~ 10278*132f818dSEnji Cooper reload_objs="$objlist $last_robj" 10279*132f818dSEnji Cooper eval concat_cmds=\"\$concat_cmds$reload_cmds\" 10280*132f818dSEnji Cooper if test -n "$last_robj"; then 10281*132f818dSEnji Cooper eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" 10282*132f818dSEnji Cooper fi 10283*132f818dSEnji Cooper func_append delfiles " $output" 10284*132f818dSEnji Cooper 10285*132f818dSEnji Cooper else 10286*132f818dSEnji Cooper output= 10287*132f818dSEnji Cooper fi 10288*132f818dSEnji Cooper 10289*132f818dSEnji Cooper ${skipped_export-false} && { 10290*132f818dSEnji Cooper func_verbose "generating symbol list for '$libname.la'" 10291*132f818dSEnji Cooper export_symbols=$output_objdir/$libname.exp 10292*132f818dSEnji Cooper $opt_dry_run || $RM $export_symbols 10293*132f818dSEnji Cooper libobjs=$output 10294*132f818dSEnji Cooper # Append the command to create the export file. 10295*132f818dSEnji Cooper test -z "$concat_cmds" || concat_cmds=$concat_cmds~ 10296*132f818dSEnji Cooper eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" 10297*132f818dSEnji Cooper if test -n "$last_robj"; then 10298*132f818dSEnji Cooper eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" 10299*132f818dSEnji Cooper fi 10300*132f818dSEnji Cooper } 10301*132f818dSEnji Cooper 10302*132f818dSEnji Cooper test -n "$save_libobjs" && 10303*132f818dSEnji Cooper func_verbose "creating a temporary reloadable object file: $output" 10304*132f818dSEnji Cooper 10305*132f818dSEnji Cooper # Loop through the commands generated above and execute them. 10306*132f818dSEnji Cooper save_ifs=$IFS; IFS='~' 10307*132f818dSEnji Cooper for cmd in $concat_cmds; do 10308*132f818dSEnji Cooper IFS=$save_ifs 10309*132f818dSEnji Cooper $opt_quiet || { 10310*132f818dSEnji Cooper func_quote_arg expand,pretty "$cmd" 10311*132f818dSEnji Cooper eval "func_echo $func_quote_arg_result" 10312*132f818dSEnji Cooper } 10313*132f818dSEnji Cooper $opt_dry_run || eval "$cmd" || { 10314*132f818dSEnji Cooper lt_exit=$? 10315*132f818dSEnji Cooper 10316*132f818dSEnji Cooper # Restore the uninstalled library and exit 10317*132f818dSEnji Cooper if test relink = "$opt_mode"; then 10318*132f818dSEnji Cooper ( cd "$output_objdir" && \ 10319*132f818dSEnji Cooper $RM "${realname}T" && \ 10320*132f818dSEnji Cooper $MV "${realname}U" "$realname" ) 10321*132f818dSEnji Cooper fi 10322*132f818dSEnji Cooper 10323*132f818dSEnji Cooper exit $lt_exit 10324*132f818dSEnji Cooper } 10325*132f818dSEnji Cooper done 10326*132f818dSEnji Cooper IFS=$save_ifs 10327*132f818dSEnji Cooper 10328*132f818dSEnji Cooper if test -n "$export_symbols_regex" && ${skipped_export-false}; then 10329*132f818dSEnji Cooper func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' 10330*132f818dSEnji Cooper func_show_eval '$MV "${export_symbols}T" "$export_symbols"' 10331*132f818dSEnji Cooper fi 10332*132f818dSEnji Cooper fi 10333*132f818dSEnji Cooper 10334*132f818dSEnji Cooper ${skipped_export-false} && { 10335*132f818dSEnji Cooper if test -n "$export_symbols" && test -n "$include_expsyms"; then 10336*132f818dSEnji Cooper tmp_export_symbols=$export_symbols 10337*132f818dSEnji Cooper test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols 10338*132f818dSEnji Cooper $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' 10339*132f818dSEnji Cooper fi 10340*132f818dSEnji Cooper 10341*132f818dSEnji Cooper if test -n "$orig_export_symbols"; then 10342*132f818dSEnji Cooper # The given exports_symbols file has to be filtered, so filter it. 10343*132f818dSEnji Cooper func_verbose "filter symbol list for '$libname.la' to tag DATA exports" 10344*132f818dSEnji Cooper # FIXME: $output_objdir/$libname.filter potentially contains lots of 10345*132f818dSEnji Cooper # 's' commands, which not all seds can handle. GNU sed should be fine 10346*132f818dSEnji Cooper # though. Also, the filter scales superlinearly with the number of 10347*132f818dSEnji Cooper # global variables. join(1) would be nice here, but unfortunately 10348*132f818dSEnji Cooper # isn't a blessed tool. 10349*132f818dSEnji Cooper $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter 10350*132f818dSEnji Cooper func_append delfiles " $export_symbols $output_objdir/$libname.filter" 10351*132f818dSEnji Cooper export_symbols=$output_objdir/$libname.def 10352*132f818dSEnji Cooper $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols 10353*132f818dSEnji Cooper fi 10354*132f818dSEnji Cooper } 10355*132f818dSEnji Cooper 10356*132f818dSEnji Cooper libobjs=$output 10357*132f818dSEnji Cooper # Restore the value of output. 10358*132f818dSEnji Cooper output=$save_output 10359*132f818dSEnji Cooper 10360*132f818dSEnji Cooper if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then 10361*132f818dSEnji Cooper eval libobjs=\"\$libobjs $whole_archive_flag_spec\" 10362*132f818dSEnji Cooper test "X$libobjs" = "X " && libobjs= 10363*132f818dSEnji Cooper fi 10364*132f818dSEnji Cooper # Expand the library linking commands again to reset the 10365*132f818dSEnji Cooper # value of $libobjs for piecewise linking. 10366*132f818dSEnji Cooper 10367*132f818dSEnji Cooper # Do each of the archive commands. 10368*132f818dSEnji Cooper if test yes = "$module" && test -n "$module_cmds"; then 10369*132f818dSEnji Cooper if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then 10370*132f818dSEnji Cooper cmds=$module_expsym_cmds 10371*132f818dSEnji Cooper else 10372*132f818dSEnji Cooper cmds=$module_cmds 10373*132f818dSEnji Cooper fi 10374*132f818dSEnji Cooper else 10375*132f818dSEnji Cooper if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then 10376*132f818dSEnji Cooper cmds=$archive_expsym_cmds 10377*132f818dSEnji Cooper else 10378*132f818dSEnji Cooper cmds=$archive_cmds 10379*132f818dSEnji Cooper fi 10380*132f818dSEnji Cooper fi 10381*132f818dSEnji Cooper fi 10382*132f818dSEnji Cooper 10383*132f818dSEnji Cooper if test -n "$delfiles"; then 10384*132f818dSEnji Cooper # Append the command to remove temporary files to $cmds. 10385*132f818dSEnji Cooper eval cmds=\"\$cmds~\$RM $delfiles\" 10386*132f818dSEnji Cooper fi 10387*132f818dSEnji Cooper 10388*132f818dSEnji Cooper # Add any objects from preloaded convenience libraries 10389*132f818dSEnji Cooper if test -n "$dlprefiles"; then 10390*132f818dSEnji Cooper gentop=$output_objdir/${outputname}x 10391*132f818dSEnji Cooper func_append generated " $gentop" 10392*132f818dSEnji Cooper 10393*132f818dSEnji Cooper func_extract_archives $gentop $dlprefiles 10394*132f818dSEnji Cooper func_append libobjs " $func_extract_archives_result" 10395*132f818dSEnji Cooper test "X$libobjs" = "X " && libobjs= 10396*132f818dSEnji Cooper fi 10397*132f818dSEnji Cooper 10398*132f818dSEnji Cooper save_ifs=$IFS; IFS='~' 10399*132f818dSEnji Cooper for cmd in $cmds; do 10400*132f818dSEnji Cooper IFS=$sp$nl 10401*132f818dSEnji Cooper eval cmd=\"$cmd\" 10402*132f818dSEnji Cooper IFS=$save_ifs 10403*132f818dSEnji Cooper $opt_quiet || { 10404*132f818dSEnji Cooper func_quote_arg expand,pretty "$cmd" 10405*132f818dSEnji Cooper eval "func_echo $func_quote_arg_result" 10406*132f818dSEnji Cooper } 10407*132f818dSEnji Cooper $opt_dry_run || eval "$cmd" || { 10408*132f818dSEnji Cooper lt_exit=$? 10409*132f818dSEnji Cooper 10410*132f818dSEnji Cooper # Restore the uninstalled library and exit 10411*132f818dSEnji Cooper if test relink = "$opt_mode"; then 10412*132f818dSEnji Cooper ( cd "$output_objdir" && \ 10413*132f818dSEnji Cooper $RM "${realname}T" && \ 10414*132f818dSEnji Cooper $MV "${realname}U" "$realname" ) 10415*132f818dSEnji Cooper fi 10416*132f818dSEnji Cooper 10417*132f818dSEnji Cooper exit $lt_exit 10418*132f818dSEnji Cooper } 10419*132f818dSEnji Cooper done 10420*132f818dSEnji Cooper IFS=$save_ifs 10421*132f818dSEnji Cooper 10422*132f818dSEnji Cooper # Restore the uninstalled library and exit 10423*132f818dSEnji Cooper if test relink = "$opt_mode"; then 10424*132f818dSEnji Cooper $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? 10425*132f818dSEnji Cooper 10426*132f818dSEnji Cooper if test -n "$convenience"; then 10427*132f818dSEnji Cooper if test -z "$whole_archive_flag_spec"; then 10428*132f818dSEnji Cooper func_show_eval '${RM}r "$gentop"' 10429*132f818dSEnji Cooper fi 10430*132f818dSEnji Cooper fi 10431*132f818dSEnji Cooper 10432*132f818dSEnji Cooper exit $EXIT_SUCCESS 10433*132f818dSEnji Cooper fi 10434*132f818dSEnji Cooper 10435*132f818dSEnji Cooper # Create links to the real library. 10436*132f818dSEnji Cooper for linkname in $linknames; do 10437*132f818dSEnji Cooper if test "$realname" != "$linkname"; then 10438*132f818dSEnji Cooper func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' 10439*132f818dSEnji Cooper fi 10440*132f818dSEnji Cooper done 10441*132f818dSEnji Cooper 10442*132f818dSEnji Cooper # If -module or -export-dynamic was specified, set the dlname. 10443*132f818dSEnji Cooper if test yes = "$module" || test yes = "$export_dynamic"; then 10444*132f818dSEnji Cooper # On all known operating systems, these are identical. 10445*132f818dSEnji Cooper dlname=$soname 10446*132f818dSEnji Cooper fi 10447*132f818dSEnji Cooper fi 10448*132f818dSEnji Cooper ;; 10449*132f818dSEnji Cooper 10450*132f818dSEnji Cooper obj) 10451*132f818dSEnji Cooper if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then 10452*132f818dSEnji Cooper func_warning "'-dlopen' is ignored for objects" 10453*132f818dSEnji Cooper fi 10454*132f818dSEnji Cooper 10455*132f818dSEnji Cooper case " $deplibs" in 10456*132f818dSEnji Cooper *\ -l* | *\ -L*) 10457*132f818dSEnji Cooper func_warning "'-l' and '-L' are ignored for objects" ;; 10458*132f818dSEnji Cooper esac 10459*132f818dSEnji Cooper 10460*132f818dSEnji Cooper test -n "$rpath" && \ 10461*132f818dSEnji Cooper func_warning "'-rpath' is ignored for objects" 10462*132f818dSEnji Cooper 10463*132f818dSEnji Cooper test -n "$xrpath" && \ 10464*132f818dSEnji Cooper func_warning "'-R' is ignored for objects" 10465*132f818dSEnji Cooper 10466*132f818dSEnji Cooper test -n "$vinfo" && \ 10467*132f818dSEnji Cooper func_warning "'-version-info' is ignored for objects" 10468*132f818dSEnji Cooper 10469*132f818dSEnji Cooper test -n "$release" && \ 10470*132f818dSEnji Cooper func_warning "'-release' is ignored for objects" 10471*132f818dSEnji Cooper 10472*132f818dSEnji Cooper case $output in 10473*132f818dSEnji Cooper *.lo) 10474*132f818dSEnji Cooper test -n "$objs$old_deplibs" && \ 10475*132f818dSEnji Cooper func_fatal_error "cannot build library object '$output' from non-libtool objects" 10476*132f818dSEnji Cooper 10477*132f818dSEnji Cooper libobj=$output 10478*132f818dSEnji Cooper func_lo2o "$libobj" 10479*132f818dSEnji Cooper obj=$func_lo2o_result 10480*132f818dSEnji Cooper ;; 10481*132f818dSEnji Cooper *) 10482*132f818dSEnji Cooper libobj= 10483*132f818dSEnji Cooper obj=$output 10484*132f818dSEnji Cooper ;; 10485*132f818dSEnji Cooper esac 10486*132f818dSEnji Cooper 10487*132f818dSEnji Cooper # Delete the old objects. 10488*132f818dSEnji Cooper $opt_dry_run || $RM $obj $libobj 10489*132f818dSEnji Cooper 10490*132f818dSEnji Cooper # Objects from convenience libraries. This assumes 10491*132f818dSEnji Cooper # single-version convenience libraries. Whenever we create 10492*132f818dSEnji Cooper # different ones for PIC/non-PIC, this we'll have to duplicate 10493*132f818dSEnji Cooper # the extraction. 10494*132f818dSEnji Cooper reload_conv_objs= 10495*132f818dSEnji Cooper gentop= 10496*132f818dSEnji Cooper # if reload_cmds runs $LD directly, get rid of -Wl from 10497*132f818dSEnji Cooper # whole_archive_flag_spec and hope we can get by with turning comma 10498*132f818dSEnji Cooper # into space. 10499*132f818dSEnji Cooper case $reload_cmds in 10500*132f818dSEnji Cooper *\$LD[\ \$]*) wl= ;; 10501*132f818dSEnji Cooper esac 10502*132f818dSEnji Cooper if test -n "$convenience"; then 10503*132f818dSEnji Cooper if test -n "$whole_archive_flag_spec"; then 10504*132f818dSEnji Cooper eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" 10505*132f818dSEnji Cooper test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` 10506*132f818dSEnji Cooper reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags 10507*132f818dSEnji Cooper else 10508*132f818dSEnji Cooper gentop=$output_objdir/${obj}x 10509*132f818dSEnji Cooper func_append generated " $gentop" 10510*132f818dSEnji Cooper 10511*132f818dSEnji Cooper func_extract_archives $gentop $convenience 10512*132f818dSEnji Cooper reload_conv_objs="$reload_objs $func_extract_archives_result" 10513*132f818dSEnji Cooper fi 10514*132f818dSEnji Cooper fi 10515*132f818dSEnji Cooper 10516*132f818dSEnji Cooper # If we're not building shared, we need to use non_pic_objs 10517*132f818dSEnji Cooper test yes = "$build_libtool_libs" || libobjs=$non_pic_objects 10518*132f818dSEnji Cooper 10519*132f818dSEnji Cooper # Create the old-style object. 10520*132f818dSEnji Cooper reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs 10521*132f818dSEnji Cooper 10522*132f818dSEnji Cooper output=$obj 10523*132f818dSEnji Cooper func_execute_cmds "$reload_cmds" 'exit $?' 10524*132f818dSEnji Cooper 10525*132f818dSEnji Cooper # Exit if we aren't doing a library object file. 10526*132f818dSEnji Cooper if test -z "$libobj"; then 10527*132f818dSEnji Cooper if test -n "$gentop"; then 10528*132f818dSEnji Cooper func_show_eval '${RM}r "$gentop"' 10529*132f818dSEnji Cooper fi 10530*132f818dSEnji Cooper 10531*132f818dSEnji Cooper exit $EXIT_SUCCESS 10532*132f818dSEnji Cooper fi 10533*132f818dSEnji Cooper 10534*132f818dSEnji Cooper test yes = "$build_libtool_libs" || { 10535*132f818dSEnji Cooper if test -n "$gentop"; then 10536*132f818dSEnji Cooper func_show_eval '${RM}r "$gentop"' 10537*132f818dSEnji Cooper fi 10538*132f818dSEnji Cooper 10539*132f818dSEnji Cooper # Create an invalid libtool object if no PIC, so that we don't 10540*132f818dSEnji Cooper # accidentally link it into a program. 10541*132f818dSEnji Cooper # $show "echo timestamp > $libobj" 10542*132f818dSEnji Cooper # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? 10543*132f818dSEnji Cooper exit $EXIT_SUCCESS 10544*132f818dSEnji Cooper } 10545*132f818dSEnji Cooper 10546*132f818dSEnji Cooper if test -n "$pic_flag" || test default != "$pic_mode"; then 10547*132f818dSEnji Cooper # Only do commands if we really have different PIC objects. 10548*132f818dSEnji Cooper reload_objs="$libobjs $reload_conv_objs" 10549*132f818dSEnji Cooper output=$libobj 10550*132f818dSEnji Cooper func_execute_cmds "$reload_cmds" 'exit $?' 10551*132f818dSEnji Cooper fi 10552*132f818dSEnji Cooper 10553*132f818dSEnji Cooper if test -n "$gentop"; then 10554*132f818dSEnji Cooper func_show_eval '${RM}r "$gentop"' 10555*132f818dSEnji Cooper fi 10556*132f818dSEnji Cooper 10557*132f818dSEnji Cooper exit $EXIT_SUCCESS 10558*132f818dSEnji Cooper ;; 10559*132f818dSEnji Cooper 10560*132f818dSEnji Cooper prog) 10561*132f818dSEnji Cooper case $host in 10562*132f818dSEnji Cooper *cygwin*) func_stripname '' '.exe' "$output" 10563*132f818dSEnji Cooper output=$func_stripname_result.exe;; 10564*132f818dSEnji Cooper esac 10565*132f818dSEnji Cooper test -n "$vinfo" && \ 10566*132f818dSEnji Cooper func_warning "'-version-info' is ignored for programs" 10567*132f818dSEnji Cooper 10568*132f818dSEnji Cooper test -n "$release" && \ 10569*132f818dSEnji Cooper func_warning "'-release' is ignored for programs" 10570*132f818dSEnji Cooper 10571*132f818dSEnji Cooper $preload \ 10572*132f818dSEnji Cooper && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ 10573*132f818dSEnji Cooper && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." 10574*132f818dSEnji Cooper 10575*132f818dSEnji Cooper case $host in 10576*132f818dSEnji Cooper *-*-rhapsody* | *-*-darwin1.[012]) 10577*132f818dSEnji Cooper # On Rhapsody replace the C library is the System framework 10578*132f818dSEnji Cooper compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` 10579*132f818dSEnji Cooper finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` 10580*132f818dSEnji Cooper ;; 10581*132f818dSEnji Cooper esac 10582*132f818dSEnji Cooper 10583*132f818dSEnji Cooper case $host in 10584*132f818dSEnji Cooper *-*-darwin*) 10585*132f818dSEnji Cooper # Don't allow lazy linking, it breaks C++ global constructors 10586*132f818dSEnji Cooper # But is supposedly fixed on 10.4 or later (yay!). 10587*132f818dSEnji Cooper if test CXX = "$tagname"; then 10588*132f818dSEnji Cooper case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10589*132f818dSEnji Cooper 10.[0123]) 10590*132f818dSEnji Cooper func_append compile_command " $wl-bind_at_load" 10591*132f818dSEnji Cooper func_append finalize_command " $wl-bind_at_load" 10592*132f818dSEnji Cooper ;; 10593*132f818dSEnji Cooper esac 10594*132f818dSEnji Cooper fi 10595*132f818dSEnji Cooper # Time to change all our "foo.ltframework" stuff back to "-framework foo" 10596*132f818dSEnji Cooper compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 10597*132f818dSEnji Cooper finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 10598*132f818dSEnji Cooper ;; 10599*132f818dSEnji Cooper esac 10600*132f818dSEnji Cooper 10601*132f818dSEnji Cooper 10602*132f818dSEnji Cooper # move library search paths that coincide with paths to not yet 10603*132f818dSEnji Cooper # installed libraries to the beginning of the library search list 10604*132f818dSEnji Cooper new_libs= 10605*132f818dSEnji Cooper for path in $notinst_path; do 10606*132f818dSEnji Cooper case " $new_libs " in 10607*132f818dSEnji Cooper *" -L$path/$objdir "*) ;; 10608*132f818dSEnji Cooper *) 10609*132f818dSEnji Cooper case " $compile_deplibs " in 10610*132f818dSEnji Cooper *" -L$path/$objdir "*) 10611*132f818dSEnji Cooper func_append new_libs " -L$path/$objdir" ;; 10612*132f818dSEnji Cooper esac 10613*132f818dSEnji Cooper ;; 10614*132f818dSEnji Cooper esac 10615*132f818dSEnji Cooper done 10616*132f818dSEnji Cooper for deplib in $compile_deplibs; do 10617*132f818dSEnji Cooper case $deplib in 10618*132f818dSEnji Cooper -L*) 10619*132f818dSEnji Cooper case " $new_libs " in 10620*132f818dSEnji Cooper *" $deplib "*) ;; 10621*132f818dSEnji Cooper *) func_append new_libs " $deplib" ;; 10622*132f818dSEnji Cooper esac 10623*132f818dSEnji Cooper ;; 10624*132f818dSEnji Cooper *) func_append new_libs " $deplib" ;; 10625*132f818dSEnji Cooper esac 10626*132f818dSEnji Cooper done 10627*132f818dSEnji Cooper compile_deplibs=$new_libs 10628*132f818dSEnji Cooper 10629*132f818dSEnji Cooper 10630*132f818dSEnji Cooper func_append compile_command " $compile_deplibs" 10631*132f818dSEnji Cooper func_append finalize_command " $finalize_deplibs" 10632*132f818dSEnji Cooper 10633*132f818dSEnji Cooper if test -n "$rpath$xrpath"; then 10634*132f818dSEnji Cooper # If the user specified any rpath flags, then add them. 10635*132f818dSEnji Cooper for libdir in $rpath $xrpath; do 10636*132f818dSEnji Cooper # This is the magic to use -rpath. 10637*132f818dSEnji Cooper case "$finalize_rpath " in 10638*132f818dSEnji Cooper *" $libdir "*) ;; 10639*132f818dSEnji Cooper *) func_append finalize_rpath " $libdir" ;; 10640*132f818dSEnji Cooper esac 10641*132f818dSEnji Cooper done 10642*132f818dSEnji Cooper fi 10643*132f818dSEnji Cooper 10644*132f818dSEnji Cooper # Now hardcode the library paths 10645*132f818dSEnji Cooper rpath= 10646*132f818dSEnji Cooper hardcode_libdirs= 10647*132f818dSEnji Cooper for libdir in $compile_rpath $finalize_rpath; do 10648*132f818dSEnji Cooper if test -n "$hardcode_libdir_flag_spec"; then 10649*132f818dSEnji Cooper if test -n "$hardcode_libdir_separator"; then 10650*132f818dSEnji Cooper if test -z "$hardcode_libdirs"; then 10651*132f818dSEnji Cooper hardcode_libdirs=$libdir 10652*132f818dSEnji Cooper else 10653*132f818dSEnji Cooper # Just accumulate the unique libdirs. 10654*132f818dSEnji Cooper case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in 10655*132f818dSEnji Cooper *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) 10656*132f818dSEnji Cooper ;; 10657*132f818dSEnji Cooper *) 10658*132f818dSEnji Cooper func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" 10659*132f818dSEnji Cooper ;; 10660*132f818dSEnji Cooper esac 10661*132f818dSEnji Cooper fi 10662*132f818dSEnji Cooper else 10663*132f818dSEnji Cooper eval flag=\"$hardcode_libdir_flag_spec\" 10664*132f818dSEnji Cooper func_append rpath " $flag" 10665*132f818dSEnji Cooper fi 10666*132f818dSEnji Cooper elif test -n "$runpath_var"; then 10667*132f818dSEnji Cooper case "$perm_rpath " in 10668*132f818dSEnji Cooper *" $libdir "*) ;; 10669*132f818dSEnji Cooper *) func_append perm_rpath " $libdir" ;; 10670*132f818dSEnji Cooper esac 10671*132f818dSEnji Cooper fi 10672*132f818dSEnji Cooper case $host in 10673*132f818dSEnji Cooper *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) 10674*132f818dSEnji Cooper testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` 10675*132f818dSEnji Cooper case :$dllsearchpath: in 10676*132f818dSEnji Cooper *":$libdir:"*) ;; 10677*132f818dSEnji Cooper ::) dllsearchpath=$libdir;; 10678*132f818dSEnji Cooper *) func_append dllsearchpath ":$libdir";; 10679*132f818dSEnji Cooper esac 10680*132f818dSEnji Cooper case :$dllsearchpath: in 10681*132f818dSEnji Cooper *":$testbindir:"*) ;; 10682*132f818dSEnji Cooper ::) dllsearchpath=$testbindir;; 10683*132f818dSEnji Cooper *) func_append dllsearchpath ":$testbindir";; 10684*132f818dSEnji Cooper esac 10685*132f818dSEnji Cooper ;; 10686*132f818dSEnji Cooper esac 10687*132f818dSEnji Cooper done 10688*132f818dSEnji Cooper # Substitute the hardcoded libdirs into the rpath. 10689*132f818dSEnji Cooper if test -n "$hardcode_libdir_separator" && 10690*132f818dSEnji Cooper test -n "$hardcode_libdirs"; then 10691*132f818dSEnji Cooper libdir=$hardcode_libdirs 10692*132f818dSEnji Cooper eval rpath=\" $hardcode_libdir_flag_spec\" 10693*132f818dSEnji Cooper fi 10694*132f818dSEnji Cooper compile_rpath=$rpath 10695*132f818dSEnji Cooper 10696*132f818dSEnji Cooper rpath= 10697*132f818dSEnji Cooper hardcode_libdirs= 10698*132f818dSEnji Cooper for libdir in $finalize_rpath; do 10699*132f818dSEnji Cooper if test -n "$hardcode_libdir_flag_spec"; then 10700*132f818dSEnji Cooper if test -n "$hardcode_libdir_separator"; then 10701*132f818dSEnji Cooper if test -z "$hardcode_libdirs"; then 10702*132f818dSEnji Cooper hardcode_libdirs=$libdir 10703*132f818dSEnji Cooper else 10704*132f818dSEnji Cooper # Just accumulate the unique libdirs. 10705*132f818dSEnji Cooper case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in 10706*132f818dSEnji Cooper *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) 10707*132f818dSEnji Cooper ;; 10708*132f818dSEnji Cooper *) 10709*132f818dSEnji Cooper func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" 10710*132f818dSEnji Cooper ;; 10711*132f818dSEnji Cooper esac 10712*132f818dSEnji Cooper fi 10713*132f818dSEnji Cooper else 10714*132f818dSEnji Cooper eval flag=\"$hardcode_libdir_flag_spec\" 10715*132f818dSEnji Cooper func_append rpath " $flag" 10716*132f818dSEnji Cooper fi 10717*132f818dSEnji Cooper elif test -n "$runpath_var"; then 10718*132f818dSEnji Cooper case "$finalize_perm_rpath " in 10719*132f818dSEnji Cooper *" $libdir "*) ;; 10720*132f818dSEnji Cooper *) func_append finalize_perm_rpath " $libdir" ;; 10721*132f818dSEnji Cooper esac 10722*132f818dSEnji Cooper fi 10723*132f818dSEnji Cooper done 10724*132f818dSEnji Cooper # Substitute the hardcoded libdirs into the rpath. 10725*132f818dSEnji Cooper if test -n "$hardcode_libdir_separator" && 10726*132f818dSEnji Cooper test -n "$hardcode_libdirs"; then 10727*132f818dSEnji Cooper libdir=$hardcode_libdirs 10728*132f818dSEnji Cooper eval rpath=\" $hardcode_libdir_flag_spec\" 10729*132f818dSEnji Cooper fi 10730*132f818dSEnji Cooper finalize_rpath=$rpath 10731*132f818dSEnji Cooper 10732*132f818dSEnji Cooper if test -n "$libobjs" && test yes = "$build_old_libs"; then 10733*132f818dSEnji Cooper # Transform all the library objects into standard objects. 10734*132f818dSEnji Cooper compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` 10735*132f818dSEnji Cooper finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` 10736*132f818dSEnji Cooper fi 10737*132f818dSEnji Cooper 10738*132f818dSEnji Cooper func_generate_dlsyms "$outputname" "@PROGRAM@" false 10739*132f818dSEnji Cooper 10740*132f818dSEnji Cooper # template prelinking step 10741*132f818dSEnji Cooper if test -n "$prelink_cmds"; then 10742*132f818dSEnji Cooper func_execute_cmds "$prelink_cmds" 'exit $?' 10743*132f818dSEnji Cooper fi 10744*132f818dSEnji Cooper 10745*132f818dSEnji Cooper wrappers_required=: 10746*132f818dSEnji Cooper case $host in 10747*132f818dSEnji Cooper *cegcc* | *mingw32ce*) 10748*132f818dSEnji Cooper # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. 10749*132f818dSEnji Cooper wrappers_required=false 10750*132f818dSEnji Cooper ;; 10751*132f818dSEnji Cooper *cygwin* | *mingw* | *windows* ) 10752*132f818dSEnji Cooper test yes = "$build_libtool_libs" || wrappers_required=false 10753*132f818dSEnji Cooper ;; 10754*132f818dSEnji Cooper *) 10755*132f818dSEnji Cooper if test no = "$need_relink" || test yes != "$build_libtool_libs"; then 10756*132f818dSEnji Cooper wrappers_required=false 10757*132f818dSEnji Cooper fi 10758*132f818dSEnji Cooper ;; 10759*132f818dSEnji Cooper esac 10760*132f818dSEnji Cooper $wrappers_required || { 10761*132f818dSEnji Cooper # Replace the output file specification. 10762*132f818dSEnji Cooper compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` 10763*132f818dSEnji Cooper link_command=$compile_command$compile_rpath 10764*132f818dSEnji Cooper 10765*132f818dSEnji Cooper # We have no uninstalled library dependencies, so finalize right now. 10766*132f818dSEnji Cooper exit_status=0 10767*132f818dSEnji Cooper func_show_eval "$link_command" 'exit_status=$?' 10768*132f818dSEnji Cooper 10769*132f818dSEnji Cooper if test -n "$postlink_cmds"; then 10770*132f818dSEnji Cooper func_to_tool_file "$output" 10771*132f818dSEnji Cooper postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` 10772*132f818dSEnji Cooper func_execute_cmds "$postlink_cmds" 'exit $?' 10773*132f818dSEnji Cooper fi 10774*132f818dSEnji Cooper 10775*132f818dSEnji Cooper # Delete the generated files. 10776*132f818dSEnji Cooper if test -f "$output_objdir/${outputname}S.$objext"; then 10777*132f818dSEnji Cooper func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' 10778*132f818dSEnji Cooper fi 10779*132f818dSEnji Cooper 10780*132f818dSEnji Cooper exit $exit_status 10781*132f818dSEnji Cooper } 10782*132f818dSEnji Cooper 10783*132f818dSEnji Cooper if test -n "$compile_shlibpath$finalize_shlibpath"; then 10784*132f818dSEnji Cooper compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" 10785*132f818dSEnji Cooper fi 10786*132f818dSEnji Cooper if test -n "$finalize_shlibpath"; then 10787*132f818dSEnji Cooper finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" 10788*132f818dSEnji Cooper fi 10789*132f818dSEnji Cooper 10790*132f818dSEnji Cooper compile_var= 10791*132f818dSEnji Cooper finalize_var= 10792*132f818dSEnji Cooper if test -n "$runpath_var"; then 10793*132f818dSEnji Cooper if test -n "$perm_rpath"; then 10794*132f818dSEnji Cooper # We should set the runpath_var. 10795*132f818dSEnji Cooper rpath= 10796*132f818dSEnji Cooper for dir in $perm_rpath; do 10797*132f818dSEnji Cooper func_append rpath "$dir:" 10798*132f818dSEnji Cooper done 10799*132f818dSEnji Cooper compile_var="$runpath_var=\"$rpath\$$runpath_var\" " 10800*132f818dSEnji Cooper fi 10801*132f818dSEnji Cooper if test -n "$finalize_perm_rpath"; then 10802*132f818dSEnji Cooper # We should set the runpath_var. 10803*132f818dSEnji Cooper rpath= 10804*132f818dSEnji Cooper for dir in $finalize_perm_rpath; do 10805*132f818dSEnji Cooper func_append rpath "$dir:" 10806*132f818dSEnji Cooper done 10807*132f818dSEnji Cooper finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " 10808*132f818dSEnji Cooper fi 10809*132f818dSEnji Cooper fi 10810*132f818dSEnji Cooper 10811*132f818dSEnji Cooper if test yes = "$no_install"; then 10812*132f818dSEnji Cooper # We don't need to create a wrapper script. 10813*132f818dSEnji Cooper link_command=$compile_var$compile_command$compile_rpath 10814*132f818dSEnji Cooper # Replace the output file specification. 10815*132f818dSEnji Cooper link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` 10816*132f818dSEnji Cooper # Delete the old output file. 10817*132f818dSEnji Cooper $opt_dry_run || $RM $output 10818*132f818dSEnji Cooper # Link the executable and exit 10819*132f818dSEnji Cooper func_show_eval "$link_command" 'exit $?' 10820*132f818dSEnji Cooper 10821*132f818dSEnji Cooper if test -n "$postlink_cmds"; then 10822*132f818dSEnji Cooper func_to_tool_file "$output" 10823*132f818dSEnji Cooper postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` 10824*132f818dSEnji Cooper func_execute_cmds "$postlink_cmds" 'exit $?' 10825*132f818dSEnji Cooper fi 10826*132f818dSEnji Cooper 10827*132f818dSEnji Cooper exit $EXIT_SUCCESS 10828*132f818dSEnji Cooper fi 10829*132f818dSEnji Cooper 10830*132f818dSEnji Cooper case $hardcode_action,$fast_install in 10831*132f818dSEnji Cooper relink,*) 10832*132f818dSEnji Cooper # Fast installation is not supported 10833*132f818dSEnji Cooper link_command=$compile_var$compile_command$compile_rpath 10834*132f818dSEnji Cooper relink_command=$finalize_var$finalize_command$finalize_rpath 10835*132f818dSEnji Cooper 10836*132f818dSEnji Cooper func_warning "this platform does not like uninstalled shared libraries" 10837*132f818dSEnji Cooper func_warning "'$output' will be relinked during installation" 10838*132f818dSEnji Cooper ;; 10839*132f818dSEnji Cooper *,yes) 10840*132f818dSEnji Cooper link_command=$finalize_var$compile_command$finalize_rpath 10841*132f818dSEnji Cooper relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` 10842*132f818dSEnji Cooper ;; 10843*132f818dSEnji Cooper *,no) 10844*132f818dSEnji Cooper link_command=$compile_var$compile_command$compile_rpath 10845*132f818dSEnji Cooper relink_command=$finalize_var$finalize_command$finalize_rpath 10846*132f818dSEnji Cooper ;; 10847*132f818dSEnji Cooper *,needless) 10848*132f818dSEnji Cooper link_command=$finalize_var$compile_command$finalize_rpath 10849*132f818dSEnji Cooper relink_command= 10850*132f818dSEnji Cooper ;; 10851*132f818dSEnji Cooper esac 10852*132f818dSEnji Cooper 10853*132f818dSEnji Cooper # Replace the output file specification. 10854*132f818dSEnji Cooper link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` 10855*132f818dSEnji Cooper 10856*132f818dSEnji Cooper # Delete the old output files. 10857*132f818dSEnji Cooper $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname 10858*132f818dSEnji Cooper 10859*132f818dSEnji Cooper func_show_eval "$link_command" 'exit $?' 10860*132f818dSEnji Cooper 10861*132f818dSEnji Cooper if test -n "$postlink_cmds"; then 10862*132f818dSEnji Cooper func_to_tool_file "$output_objdir/$outputname" 10863*132f818dSEnji Cooper postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` 10864*132f818dSEnji Cooper func_execute_cmds "$postlink_cmds" 'exit $?' 10865*132f818dSEnji Cooper fi 10866*132f818dSEnji Cooper 10867*132f818dSEnji Cooper # Now create the wrapper script. 10868*132f818dSEnji Cooper func_verbose "creating $output" 10869*132f818dSEnji Cooper 10870*132f818dSEnji Cooper # Quote the relink command for shipping. 10871*132f818dSEnji Cooper if test -n "$relink_command"; then 10872*132f818dSEnji Cooper # Preserve any variables that may affect compiler behavior 10873*132f818dSEnji Cooper for var in $variables_saved_for_relink; do 10874*132f818dSEnji Cooper if eval test -z \"\${$var+set}\"; then 10875*132f818dSEnji Cooper relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" 10876*132f818dSEnji Cooper elif eval var_value=\$$var; test -z "$var_value"; then 10877*132f818dSEnji Cooper relink_command="$var=; export $var; $relink_command" 10878*132f818dSEnji Cooper else 10879*132f818dSEnji Cooper func_quote_arg pretty "$var_value" 10880*132f818dSEnji Cooper relink_command="$var=$func_quote_arg_result; export $var; $relink_command" 10881*132f818dSEnji Cooper fi 10882*132f818dSEnji Cooper done 10883*132f818dSEnji Cooper func_quote eval cd "`pwd`" 10884*132f818dSEnji Cooper func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)" 10885*132f818dSEnji Cooper relink_command=$func_quote_arg_unquoted_result 10886*132f818dSEnji Cooper fi 10887*132f818dSEnji Cooper 10888*132f818dSEnji Cooper # Only actually do things if not in dry run mode. 10889*132f818dSEnji Cooper $opt_dry_run || { 10890*132f818dSEnji Cooper # win32 will think the script is a binary if it has 10891*132f818dSEnji Cooper # a .exe suffix, so we strip it off here. 10892*132f818dSEnji Cooper case $output in 10893*132f818dSEnji Cooper *.exe) func_stripname '' '.exe' "$output" 10894*132f818dSEnji Cooper output=$func_stripname_result ;; 10895*132f818dSEnji Cooper esac 10896*132f818dSEnji Cooper # test for cygwin because mv fails w/o .exe extensions 10897*132f818dSEnji Cooper case $host in 10898*132f818dSEnji Cooper *cygwin*) 10899*132f818dSEnji Cooper exeext=.exe 10900*132f818dSEnji Cooper func_stripname '' '.exe' "$outputname" 10901*132f818dSEnji Cooper outputname=$func_stripname_result ;; 10902*132f818dSEnji Cooper *) exeext= ;; 10903*132f818dSEnji Cooper esac 10904*132f818dSEnji Cooper case $host in 10905*132f818dSEnji Cooper *cygwin* | *mingw* | windows* ) 10906*132f818dSEnji Cooper func_dirname_and_basename "$output" "" "." 10907*132f818dSEnji Cooper output_name=$func_basename_result 10908*132f818dSEnji Cooper output_path=$func_dirname_result 10909*132f818dSEnji Cooper cwrappersource=$output_path/$objdir/lt-$output_name.c 10910*132f818dSEnji Cooper cwrapper=$output_path/$output_name.exe 10911*132f818dSEnji Cooper $RM $cwrappersource $cwrapper 10912*132f818dSEnji Cooper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 10913*132f818dSEnji Cooper 10914*132f818dSEnji Cooper func_emit_cwrapperexe_src > $cwrappersource 10915*132f818dSEnji Cooper 10916*132f818dSEnji Cooper # The wrapper executable is built using the $host compiler, 10917*132f818dSEnji Cooper # because it contains $host paths and files. If cross- 10918*132f818dSEnji Cooper # compiling, it, like the target executable, must be 10919*132f818dSEnji Cooper # executed on the $host or under an emulation environment. 10920*132f818dSEnji Cooper $opt_dry_run || { 10921*132f818dSEnji Cooper $LTCC $LTCFLAGS -o $cwrapper $cwrappersource 10922*132f818dSEnji Cooper $STRIP $cwrapper 10923*132f818dSEnji Cooper } 10924*132f818dSEnji Cooper 10925*132f818dSEnji Cooper # Now, create the wrapper script for func_source use: 10926*132f818dSEnji Cooper func_ltwrapper_scriptname $cwrapper 10927*132f818dSEnji Cooper $RM $func_ltwrapper_scriptname_result 10928*132f818dSEnji Cooper trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 10929*132f818dSEnji Cooper $opt_dry_run || { 10930*132f818dSEnji Cooper # note: this script will not be executed, so do not chmod. 10931*132f818dSEnji Cooper if test "x$build" = "x$host"; then 10932*132f818dSEnji Cooper $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result 10933*132f818dSEnji Cooper else 10934*132f818dSEnji Cooper func_emit_wrapper no > $func_ltwrapper_scriptname_result 10935*132f818dSEnji Cooper fi 10936*132f818dSEnji Cooper } 10937*132f818dSEnji Cooper ;; 10938*132f818dSEnji Cooper * ) 10939*132f818dSEnji Cooper $RM $output 10940*132f818dSEnji Cooper trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 10941*132f818dSEnji Cooper 10942*132f818dSEnji Cooper func_emit_wrapper no > $output 10943*132f818dSEnji Cooper chmod +x $output 10944*132f818dSEnji Cooper ;; 10945*132f818dSEnji Cooper esac 10946*132f818dSEnji Cooper } 10947*132f818dSEnji Cooper exit $EXIT_SUCCESS 10948*132f818dSEnji Cooper ;; 10949*132f818dSEnji Cooper esac 10950*132f818dSEnji Cooper 10951*132f818dSEnji Cooper # See if we need to build an old-fashioned archive. 10952*132f818dSEnji Cooper for oldlib in $oldlibs; do 10953*132f818dSEnji Cooper 10954*132f818dSEnji Cooper case $build_libtool_libs in 10955*132f818dSEnji Cooper convenience) 10956*132f818dSEnji Cooper oldobjs="$libobjs_save $symfileobj" 10957*132f818dSEnji Cooper addlibs=$convenience 10958*132f818dSEnji Cooper build_libtool_libs=no 10959*132f818dSEnji Cooper ;; 10960*132f818dSEnji Cooper module) 10961*132f818dSEnji Cooper oldobjs=$libobjs_save 10962*132f818dSEnji Cooper addlibs=$old_convenience 10963*132f818dSEnji Cooper build_libtool_libs=no 10964*132f818dSEnji Cooper ;; 10965*132f818dSEnji Cooper *) 10966*132f818dSEnji Cooper oldobjs="$old_deplibs $non_pic_objects" 10967*132f818dSEnji Cooper $preload && test -f "$symfileobj" \ 10968*132f818dSEnji Cooper && func_append oldobjs " $symfileobj" 10969*132f818dSEnji Cooper addlibs=$old_convenience 10970*132f818dSEnji Cooper ;; 10971*132f818dSEnji Cooper esac 10972*132f818dSEnji Cooper 10973*132f818dSEnji Cooper if test -n "$addlibs"; then 10974*132f818dSEnji Cooper gentop=$output_objdir/${outputname}x 10975*132f818dSEnji Cooper func_append generated " $gentop" 10976*132f818dSEnji Cooper 10977*132f818dSEnji Cooper func_extract_archives $gentop $addlibs 10978*132f818dSEnji Cooper func_append oldobjs " $func_extract_archives_result" 10979*132f818dSEnji Cooper fi 10980*132f818dSEnji Cooper 10981*132f818dSEnji Cooper # Do each command in the archive commands. 10982*132f818dSEnji Cooper if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then 10983*132f818dSEnji Cooper cmds=$old_archive_from_new_cmds 10984*132f818dSEnji Cooper else 10985*132f818dSEnji Cooper 10986*132f818dSEnji Cooper # Add any objects from preloaded convenience libraries 10987*132f818dSEnji Cooper if test -n "$dlprefiles"; then 10988*132f818dSEnji Cooper gentop=$output_objdir/${outputname}x 10989*132f818dSEnji Cooper func_append generated " $gentop" 10990*132f818dSEnji Cooper 10991*132f818dSEnji Cooper func_extract_archives $gentop $dlprefiles 10992*132f818dSEnji Cooper func_append oldobjs " $func_extract_archives_result" 10993*132f818dSEnji Cooper fi 10994*132f818dSEnji Cooper 10995*132f818dSEnji Cooper # POSIX demands no paths to be encoded in archives. We have 10996*132f818dSEnji Cooper # to avoid creating archives with duplicate basenames if we 10997*132f818dSEnji Cooper # might have to extract them afterwards, e.g., when creating a 10998*132f818dSEnji Cooper # static archive out of a convenience library, or when linking 10999*132f818dSEnji Cooper # the entirety of a libtool archive into another (currently 11000*132f818dSEnji Cooper # not supported by libtool). 11001*132f818dSEnji Cooper if (for obj in $oldobjs 11002*132f818dSEnji Cooper do 11003*132f818dSEnji Cooper func_basename "$obj" 11004*132f818dSEnji Cooper $ECHO "$func_basename_result" 11005*132f818dSEnji Cooper done | sort | sort -uc >/dev/null 2>&1); then 11006*132f818dSEnji Cooper : 11007*132f818dSEnji Cooper else 11008*132f818dSEnji Cooper echo "copying selected object files to avoid basename conflicts..." 11009*132f818dSEnji Cooper gentop=$output_objdir/${outputname}x 11010*132f818dSEnji Cooper func_append generated " $gentop" 11011*132f818dSEnji Cooper func_mkdir_p "$gentop" 11012*132f818dSEnji Cooper save_oldobjs=$oldobjs 11013*132f818dSEnji Cooper oldobjs= 11014*132f818dSEnji Cooper counter=1 11015*132f818dSEnji Cooper for obj in $save_oldobjs 11016*132f818dSEnji Cooper do 11017*132f818dSEnji Cooper func_basename "$obj" 11018*132f818dSEnji Cooper objbase=$func_basename_result 11019*132f818dSEnji Cooper case " $oldobjs " in 11020*132f818dSEnji Cooper " ") oldobjs=$obj ;; 11021*132f818dSEnji Cooper *[\ /]"$objbase "*) 11022*132f818dSEnji Cooper while :; do 11023*132f818dSEnji Cooper # Make sure we don't pick an alternate name that also 11024*132f818dSEnji Cooper # overlaps. 11025*132f818dSEnji Cooper newobj=lt$counter-$objbase 11026*132f818dSEnji Cooper func_arith $counter + 1 11027*132f818dSEnji Cooper counter=$func_arith_result 11028*132f818dSEnji Cooper case " $oldobjs " in 11029*132f818dSEnji Cooper *[\ /]"$newobj "*) ;; 11030*132f818dSEnji Cooper *) if test ! -f "$gentop/$newobj"; then break; fi ;; 11031*132f818dSEnji Cooper esac 11032*132f818dSEnji Cooper done 11033*132f818dSEnji Cooper func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" 11034*132f818dSEnji Cooper func_append oldobjs " $gentop/$newobj" 11035*132f818dSEnji Cooper ;; 11036*132f818dSEnji Cooper *) func_append oldobjs " $obj" ;; 11037*132f818dSEnji Cooper esac 11038*132f818dSEnji Cooper done 11039*132f818dSEnji Cooper fi 11040*132f818dSEnji Cooper func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 11041*132f818dSEnji Cooper tool_oldlib=$func_to_tool_file_result 11042*132f818dSEnji Cooper eval cmds=\"$old_archive_cmds\" 11043*132f818dSEnji Cooper 11044*132f818dSEnji Cooper func_len " $cmds" 11045*132f818dSEnji Cooper len=$func_len_result 11046*132f818dSEnji Cooper if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then 11047*132f818dSEnji Cooper cmds=$old_archive_cmds 11048*132f818dSEnji Cooper elif test -n "$archiver_list_spec"; then 11049*132f818dSEnji Cooper func_verbose "using command file archive linking..." 11050*132f818dSEnji Cooper for obj in $oldobjs 11051*132f818dSEnji Cooper do 11052*132f818dSEnji Cooper func_to_tool_file "$obj" 11053*132f818dSEnji Cooper $ECHO "$func_to_tool_file_result" 11054*132f818dSEnji Cooper done > $output_objdir/$libname.libcmd 11055*132f818dSEnji Cooper func_to_tool_file "$output_objdir/$libname.libcmd" 11056*132f818dSEnji Cooper oldobjs=" $archiver_list_spec$func_to_tool_file_result" 11057*132f818dSEnji Cooper cmds=$old_archive_cmds 11058*132f818dSEnji Cooper else 11059*132f818dSEnji Cooper # the command line is too long to link in one step, link in parts 11060*132f818dSEnji Cooper func_verbose "using piecewise archive linking..." 11061*132f818dSEnji Cooper save_RANLIB=$RANLIB 11062*132f818dSEnji Cooper RANLIB=: 11063*132f818dSEnji Cooper objlist= 11064*132f818dSEnji Cooper concat_cmds= 11065*132f818dSEnji Cooper save_oldobjs=$oldobjs 11066*132f818dSEnji Cooper oldobjs= 11067*132f818dSEnji Cooper # Is there a better way of finding the last object in the list? 11068*132f818dSEnji Cooper for obj in $save_oldobjs 11069*132f818dSEnji Cooper do 11070*132f818dSEnji Cooper last_oldobj=$obj 11071*132f818dSEnji Cooper done 11072*132f818dSEnji Cooper eval test_cmds=\"$old_archive_cmds\" 11073*132f818dSEnji Cooper func_len " $test_cmds" 11074*132f818dSEnji Cooper len0=$func_len_result 11075*132f818dSEnji Cooper len=$len0 11076*132f818dSEnji Cooper for obj in $save_oldobjs 11077*132f818dSEnji Cooper do 11078*132f818dSEnji Cooper func_len " $obj" 11079*132f818dSEnji Cooper func_arith $len + $func_len_result 11080*132f818dSEnji Cooper len=$func_arith_result 11081*132f818dSEnji Cooper func_append objlist " $obj" 11082*132f818dSEnji Cooper if test "$len" -lt "$max_cmd_len"; then 11083*132f818dSEnji Cooper : 11084*132f818dSEnji Cooper else 11085*132f818dSEnji Cooper # the above command should be used before it gets too long 11086*132f818dSEnji Cooper oldobjs=$objlist 11087*132f818dSEnji Cooper if test "$obj" = "$last_oldobj"; then 11088*132f818dSEnji Cooper RANLIB=$save_RANLIB 11089*132f818dSEnji Cooper fi 11090*132f818dSEnji Cooper test -z "$concat_cmds" || concat_cmds=$concat_cmds~ 11091*132f818dSEnji Cooper eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" 11092*132f818dSEnji Cooper objlist= 11093*132f818dSEnji Cooper len=$len0 11094*132f818dSEnji Cooper fi 11095*132f818dSEnji Cooper done 11096*132f818dSEnji Cooper RANLIB=$save_RANLIB 11097*132f818dSEnji Cooper oldobjs=$objlist 11098*132f818dSEnji Cooper if test -z "$oldobjs"; then 11099*132f818dSEnji Cooper eval cmds=\"\$concat_cmds\" 11100*132f818dSEnji Cooper else 11101*132f818dSEnji Cooper eval cmds=\"\$concat_cmds~\$old_archive_cmds\" 11102*132f818dSEnji Cooper fi 11103*132f818dSEnji Cooper fi 11104*132f818dSEnji Cooper fi 11105*132f818dSEnji Cooper func_execute_cmds "$cmds" 'exit $?' 11106*132f818dSEnji Cooper done 11107*132f818dSEnji Cooper 11108*132f818dSEnji Cooper test -n "$generated" && \ 11109*132f818dSEnji Cooper func_show_eval "${RM}r$generated" 11110*132f818dSEnji Cooper 11111*132f818dSEnji Cooper # Now create the libtool archive. 11112*132f818dSEnji Cooper case $output in 11113*132f818dSEnji Cooper *.la) 11114*132f818dSEnji Cooper old_library= 11115*132f818dSEnji Cooper test yes = "$build_old_libs" && old_library=$libname.$libext 11116*132f818dSEnji Cooper func_verbose "creating $output" 11117*132f818dSEnji Cooper 11118*132f818dSEnji Cooper # Preserve any variables that may affect compiler behavior 11119*132f818dSEnji Cooper for var in $variables_saved_for_relink; do 11120*132f818dSEnji Cooper if eval test -z \"\${$var+set}\"; then 11121*132f818dSEnji Cooper relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" 11122*132f818dSEnji Cooper elif eval var_value=\$$var; test -z "$var_value"; then 11123*132f818dSEnji Cooper relink_command="$var=; export $var; $relink_command" 11124*132f818dSEnji Cooper else 11125*132f818dSEnji Cooper func_quote_arg pretty,unquoted "$var_value" 11126*132f818dSEnji Cooper relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command" 11127*132f818dSEnji Cooper fi 11128*132f818dSEnji Cooper done 11129*132f818dSEnji Cooper # Quote the link command for shipping. 11130*132f818dSEnji Cooper func_quote eval cd "`pwd`" 11131*132f818dSEnji Cooper relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" 11132*132f818dSEnji Cooper func_quote_arg pretty,unquoted "$relink_command" 11133*132f818dSEnji Cooper relink_command=$func_quote_arg_unquoted_result 11134*132f818dSEnji Cooper if test yes = "$hardcode_automatic"; then 11135*132f818dSEnji Cooper relink_command= 11136*132f818dSEnji Cooper fi 11137*132f818dSEnji Cooper 11138*132f818dSEnji Cooper # Only create the output if not a dry run. 11139*132f818dSEnji Cooper $opt_dry_run || { 11140*132f818dSEnji Cooper for installed in no yes; do 11141*132f818dSEnji Cooper if test yes = "$installed"; then 11142*132f818dSEnji Cooper if test -z "$install_libdir"; then 11143*132f818dSEnji Cooper break 11144*132f818dSEnji Cooper fi 11145*132f818dSEnji Cooper output=$output_objdir/${outputname}i 11146*132f818dSEnji Cooper # Replace all uninstalled libtool libraries with the installed ones 11147*132f818dSEnji Cooper newdependency_libs= 11148*132f818dSEnji Cooper for deplib in $dependency_libs; do 11149*132f818dSEnji Cooper case $deplib in 11150*132f818dSEnji Cooper *.la) 11151*132f818dSEnji Cooper func_basename "$deplib" 11152*132f818dSEnji Cooper name=$func_basename_result 11153*132f818dSEnji Cooper func_resolve_sysroot "$deplib" 11154*132f818dSEnji Cooper eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` 11155*132f818dSEnji Cooper test -z "$libdir" && \ 11156*132f818dSEnji Cooper func_fatal_error "'$deplib' is not a valid libtool archive" 11157*132f818dSEnji Cooper func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" 11158*132f818dSEnji Cooper ;; 11159*132f818dSEnji Cooper -L*) 11160*132f818dSEnji Cooper func_stripname -L '' "$deplib" 11161*132f818dSEnji Cooper func_replace_sysroot "$func_stripname_result" 11162*132f818dSEnji Cooper func_append newdependency_libs " -L$func_replace_sysroot_result" 11163*132f818dSEnji Cooper ;; 11164*132f818dSEnji Cooper -R*) 11165*132f818dSEnji Cooper func_stripname -R '' "$deplib" 11166*132f818dSEnji Cooper func_replace_sysroot "$func_stripname_result" 11167*132f818dSEnji Cooper func_append newdependency_libs " -R$func_replace_sysroot_result" 11168*132f818dSEnji Cooper ;; 11169*132f818dSEnji Cooper *) func_append newdependency_libs " $deplib" ;; 11170*132f818dSEnji Cooper esac 11171*132f818dSEnji Cooper done 11172*132f818dSEnji Cooper dependency_libs=$newdependency_libs 11173*132f818dSEnji Cooper newdlfiles= 11174*132f818dSEnji Cooper 11175*132f818dSEnji Cooper for lib in $dlfiles; do 11176*132f818dSEnji Cooper case $lib in 11177*132f818dSEnji Cooper *.la) 11178*132f818dSEnji Cooper func_basename "$lib" 11179*132f818dSEnji Cooper name=$func_basename_result 11180*132f818dSEnji Cooper eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` 11181*132f818dSEnji Cooper test -z "$libdir" && \ 11182*132f818dSEnji Cooper func_fatal_error "'$lib' is not a valid libtool archive" 11183*132f818dSEnji Cooper func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" 11184*132f818dSEnji Cooper ;; 11185*132f818dSEnji Cooper *) func_append newdlfiles " $lib" ;; 11186*132f818dSEnji Cooper esac 11187*132f818dSEnji Cooper done 11188*132f818dSEnji Cooper dlfiles=$newdlfiles 11189*132f818dSEnji Cooper newdlprefiles= 11190*132f818dSEnji Cooper for lib in $dlprefiles; do 11191*132f818dSEnji Cooper case $lib in 11192*132f818dSEnji Cooper *.la) 11193*132f818dSEnji Cooper # Only pass preopened files to the pseudo-archive (for 11194*132f818dSEnji Cooper # eventual linking with the app. that links it) if we 11195*132f818dSEnji Cooper # didn't already link the preopened objects directly into 11196*132f818dSEnji Cooper # the library: 11197*132f818dSEnji Cooper func_basename "$lib" 11198*132f818dSEnji Cooper name=$func_basename_result 11199*132f818dSEnji Cooper eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` 11200*132f818dSEnji Cooper test -z "$libdir" && \ 11201*132f818dSEnji Cooper func_fatal_error "'$lib' is not a valid libtool archive" 11202*132f818dSEnji Cooper func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" 11203*132f818dSEnji Cooper ;; 11204*132f818dSEnji Cooper esac 11205*132f818dSEnji Cooper done 11206*132f818dSEnji Cooper dlprefiles=$newdlprefiles 11207*132f818dSEnji Cooper else 11208*132f818dSEnji Cooper newdlfiles= 11209*132f818dSEnji Cooper for lib in $dlfiles; do 11210*132f818dSEnji Cooper case $lib in 11211*132f818dSEnji Cooper [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; 11212*132f818dSEnji Cooper *) abs=`pwd`"/$lib" ;; 11213*132f818dSEnji Cooper esac 11214*132f818dSEnji Cooper func_append newdlfiles " $abs" 11215*132f818dSEnji Cooper done 11216*132f818dSEnji Cooper dlfiles=$newdlfiles 11217*132f818dSEnji Cooper newdlprefiles= 11218*132f818dSEnji Cooper for lib in $dlprefiles; do 11219*132f818dSEnji Cooper case $lib in 11220*132f818dSEnji Cooper [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; 11221*132f818dSEnji Cooper *) abs=`pwd`"/$lib" ;; 11222*132f818dSEnji Cooper esac 11223*132f818dSEnji Cooper func_append newdlprefiles " $abs" 11224*132f818dSEnji Cooper done 11225*132f818dSEnji Cooper dlprefiles=$newdlprefiles 11226*132f818dSEnji Cooper fi 11227*132f818dSEnji Cooper $RM $output 11228*132f818dSEnji Cooper # place dlname in correct position for cygwin 11229*132f818dSEnji Cooper # In fact, it would be nice if we could use this code for all target 11230*132f818dSEnji Cooper # systems that can't hard-code library paths into their executables 11231*132f818dSEnji Cooper # and that have no shared library path variable independent of PATH, 11232*132f818dSEnji Cooper # but it turns out we can't easily determine that from inspecting 11233*132f818dSEnji Cooper # libtool variables, so we have to hard-code the OSs to which it 11234*132f818dSEnji Cooper # applies here; at the moment, that means platforms that use the PE 11235*132f818dSEnji Cooper # object format with DLL files. See the long comment at the top of 11236*132f818dSEnji Cooper # tests/bindir.at for full details. 11237*132f818dSEnji Cooper tdlname=$dlname 11238*132f818dSEnji Cooper case $host,$output,$installed,$module,$dlname in 11239*132f818dSEnji Cooper *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *windows*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) 11240*132f818dSEnji Cooper # If a -bindir argument was supplied, place the dll there. 11241*132f818dSEnji Cooper if test -n "$bindir"; then 11242*132f818dSEnji Cooper func_relative_path "$install_libdir" "$bindir" 11243*132f818dSEnji Cooper tdlname=$func_relative_path_result/$dlname 11244*132f818dSEnji Cooper else 11245*132f818dSEnji Cooper # Otherwise fall back on heuristic. 11246*132f818dSEnji Cooper tdlname=../bin/$dlname 11247*132f818dSEnji Cooper fi 11248*132f818dSEnji Cooper ;; 11249*132f818dSEnji Cooper esac 11250*132f818dSEnji Cooper $ECHO > $output "\ 11251*132f818dSEnji Cooper# $outputname - a libtool library file 11252*132f818dSEnji Cooper# Generated by $PROGRAM (GNU $PACKAGE) $VERSION 11253*132f818dSEnji Cooper# 11254*132f818dSEnji Cooper# Please DO NOT delete this file! 11255*132f818dSEnji Cooper# It is necessary for linking the library. 11256*132f818dSEnji Cooper 11257*132f818dSEnji Cooper# The name that we can dlopen(3). 11258*132f818dSEnji Cooperdlname='$tdlname' 11259*132f818dSEnji Cooper 11260*132f818dSEnji Cooper# Names of this library. 11261*132f818dSEnji Cooperlibrary_names='$library_names' 11262*132f818dSEnji Cooper 11263*132f818dSEnji Cooper# The name of the static archive. 11264*132f818dSEnji Cooperold_library='$old_library' 11265*132f818dSEnji Cooper 11266*132f818dSEnji Cooper# Linker flags that cannot go in dependency_libs. 11267*132f818dSEnji Cooperinherited_linker_flags='$new_inherited_linker_flags' 11268*132f818dSEnji Cooper 11269*132f818dSEnji Cooper# Libraries that this one depends upon. 11270*132f818dSEnji Cooperdependency_libs='$dependency_libs' 11271*132f818dSEnji Cooper 11272*132f818dSEnji Cooper# Names of additional weak libraries provided by this library 11273*132f818dSEnji Cooperweak_library_names='$weak_libs' 11274*132f818dSEnji Cooper 11275*132f818dSEnji Cooper# Version information for $libname. 11276*132f818dSEnji Coopercurrent=$current 11277*132f818dSEnji Cooperage=$age 11278*132f818dSEnji Cooperrevision=$revision 11279*132f818dSEnji Cooper 11280*132f818dSEnji Cooper# Is this an already installed library? 11281*132f818dSEnji Cooperinstalled=$installed 11282*132f818dSEnji Cooper 11283*132f818dSEnji Cooper# Should we warn about portability when linking against -modules? 11284*132f818dSEnji Coopershouldnotlink=$module 11285*132f818dSEnji Cooper 11286*132f818dSEnji Cooper# Files to dlopen/dlpreopen 11287*132f818dSEnji Cooperdlopen='$dlfiles' 11288*132f818dSEnji Cooperdlpreopen='$dlprefiles' 11289*132f818dSEnji Cooper 11290*132f818dSEnji Cooper# Directory that this library needs to be installed in: 11291*132f818dSEnji Cooperlibdir='$install_libdir'" 11292*132f818dSEnji Cooper if test no,yes = "$installed,$need_relink"; then 11293*132f818dSEnji Cooper $ECHO >> $output "\ 11294*132f818dSEnji Cooperrelink_command=\"$relink_command\"" 11295*132f818dSEnji Cooper fi 11296*132f818dSEnji Cooper done 11297*132f818dSEnji Cooper } 11298*132f818dSEnji Cooper 11299*132f818dSEnji Cooper # Do a symbolic link so that the libtool archive can be found in 11300*132f818dSEnji Cooper # LD_LIBRARY_PATH before the program is installed. 11301*132f818dSEnji Cooper func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' 11302*132f818dSEnji Cooper ;; 11303*132f818dSEnji Cooper esac 11304*132f818dSEnji Cooper exit $EXIT_SUCCESS 11305*132f818dSEnji Cooper} 11306*132f818dSEnji Cooper 11307*132f818dSEnji Cooperif test link = "$opt_mode" || test relink = "$opt_mode"; then 11308*132f818dSEnji Cooper func_mode_link ${1+"$@"} 11309*132f818dSEnji Cooperfi 11310*132f818dSEnji Cooper 11311*132f818dSEnji Cooper 11312*132f818dSEnji Cooper# func_mode_uninstall arg... 11313*132f818dSEnji Cooperfunc_mode_uninstall () 11314*132f818dSEnji Cooper{ 11315*132f818dSEnji Cooper $debug_cmd 11316*132f818dSEnji Cooper 11317*132f818dSEnji Cooper RM=$nonopt 11318*132f818dSEnji Cooper files= 11319*132f818dSEnji Cooper rmforce=false 11320*132f818dSEnji Cooper exit_status=0 11321*132f818dSEnji Cooper 11322*132f818dSEnji Cooper # This variable tells wrapper scripts just to set variables rather 11323*132f818dSEnji Cooper # than running their programs. 11324*132f818dSEnji Cooper libtool_install_magic=$magic 11325*132f818dSEnji Cooper 11326*132f818dSEnji Cooper for arg 11327*132f818dSEnji Cooper do 11328*132f818dSEnji Cooper case $arg in 11329*132f818dSEnji Cooper -f) func_append RM " $arg"; rmforce=: ;; 11330*132f818dSEnji Cooper -*) func_append RM " $arg" ;; 11331*132f818dSEnji Cooper *) func_append files " $arg" ;; 11332*132f818dSEnji Cooper esac 11333*132f818dSEnji Cooper done 11334*132f818dSEnji Cooper 11335*132f818dSEnji Cooper test -z "$RM" && \ 11336*132f818dSEnji Cooper func_fatal_help "you must specify an RM program" 11337*132f818dSEnji Cooper 11338*132f818dSEnji Cooper rmdirs= 11339*132f818dSEnji Cooper 11340*132f818dSEnji Cooper for file in $files; do 11341*132f818dSEnji Cooper func_dirname "$file" "" "." 11342*132f818dSEnji Cooper dir=$func_dirname_result 11343*132f818dSEnji Cooper if test . = "$dir"; then 11344*132f818dSEnji Cooper odir=$objdir 11345*132f818dSEnji Cooper else 11346*132f818dSEnji Cooper odir=$dir/$objdir 11347*132f818dSEnji Cooper fi 11348*132f818dSEnji Cooper func_basename "$file" 11349*132f818dSEnji Cooper name=$func_basename_result 11350*132f818dSEnji Cooper test uninstall = "$opt_mode" && odir=$dir 11351*132f818dSEnji Cooper 11352*132f818dSEnji Cooper # Remember odir for removal later, being careful to avoid duplicates 11353*132f818dSEnji Cooper if test clean = "$opt_mode"; then 11354*132f818dSEnji Cooper case " $rmdirs " in 11355*132f818dSEnji Cooper *" $odir "*) ;; 11356*132f818dSEnji Cooper *) func_append rmdirs " $odir" ;; 11357*132f818dSEnji Cooper esac 11358*132f818dSEnji Cooper fi 11359*132f818dSEnji Cooper 11360*132f818dSEnji Cooper # Don't error if the file doesn't exist and rm -f was used. 11361*132f818dSEnji Cooper if { test -L "$file"; } >/dev/null 2>&1 || 11362*132f818dSEnji Cooper { test -h "$file"; } >/dev/null 2>&1 || 11363*132f818dSEnji Cooper test -f "$file"; then 11364*132f818dSEnji Cooper : 11365*132f818dSEnji Cooper elif test -d "$file"; then 11366*132f818dSEnji Cooper exit_status=1 11367*132f818dSEnji Cooper continue 11368*132f818dSEnji Cooper elif $rmforce; then 11369*132f818dSEnji Cooper continue 11370*132f818dSEnji Cooper fi 11371*132f818dSEnji Cooper 11372*132f818dSEnji Cooper rmfiles=$file 11373*132f818dSEnji Cooper 11374*132f818dSEnji Cooper case $name in 11375*132f818dSEnji Cooper *.la) 11376*132f818dSEnji Cooper # Possibly a libtool archive, so verify it. 11377*132f818dSEnji Cooper if func_lalib_p "$file"; then 11378*132f818dSEnji Cooper func_source $dir/$name 11379*132f818dSEnji Cooper 11380*132f818dSEnji Cooper # Delete the libtool libraries and symlinks. 11381*132f818dSEnji Cooper for n in $library_names; do 11382*132f818dSEnji Cooper func_append rmfiles " $odir/$n" 11383*132f818dSEnji Cooper done 11384*132f818dSEnji Cooper test -n "$old_library" && func_append rmfiles " $odir/$old_library" 11385*132f818dSEnji Cooper 11386*132f818dSEnji Cooper case $opt_mode in 11387*132f818dSEnji Cooper clean) 11388*132f818dSEnji Cooper case " $library_names " in 11389*132f818dSEnji Cooper *" $dlname "*) ;; 11390*132f818dSEnji Cooper *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; 11391*132f818dSEnji Cooper esac 11392*132f818dSEnji Cooper test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" 11393*132f818dSEnji Cooper ;; 11394*132f818dSEnji Cooper uninstall) 11395*132f818dSEnji Cooper if test -n "$library_names"; then 11396*132f818dSEnji Cooper # Do each command in the postuninstall commands. 11397*132f818dSEnji Cooper func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' 11398*132f818dSEnji Cooper fi 11399*132f818dSEnji Cooper 11400*132f818dSEnji Cooper if test -n "$old_library"; then 11401*132f818dSEnji Cooper # Do each command in the old_postuninstall commands. 11402*132f818dSEnji Cooper func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' 11403*132f818dSEnji Cooper fi 11404*132f818dSEnji Cooper # FIXME: should reinstall the best remaining shared library. 11405*132f818dSEnji Cooper ;; 11406*132f818dSEnji Cooper esac 11407*132f818dSEnji Cooper fi 11408*132f818dSEnji Cooper ;; 11409*132f818dSEnji Cooper 11410*132f818dSEnji Cooper *.lo) 11411*132f818dSEnji Cooper # Possibly a libtool object, so verify it. 11412*132f818dSEnji Cooper if func_lalib_p "$file"; then 11413*132f818dSEnji Cooper 11414*132f818dSEnji Cooper # Read the .lo file 11415*132f818dSEnji Cooper func_source $dir/$name 11416*132f818dSEnji Cooper 11417*132f818dSEnji Cooper # Add PIC object to the list of files to remove. 11418*132f818dSEnji Cooper if test -n "$pic_object" && test none != "$pic_object"; then 11419*132f818dSEnji Cooper func_append rmfiles " $dir/$pic_object" 11420*132f818dSEnji Cooper fi 11421*132f818dSEnji Cooper 11422*132f818dSEnji Cooper # Add non-PIC object to the list of files to remove. 11423*132f818dSEnji Cooper if test -n "$non_pic_object" && test none != "$non_pic_object"; then 11424*132f818dSEnji Cooper func_append rmfiles " $dir/$non_pic_object" 11425*132f818dSEnji Cooper fi 11426*132f818dSEnji Cooper fi 11427*132f818dSEnji Cooper ;; 11428*132f818dSEnji Cooper 11429*132f818dSEnji Cooper *) 11430*132f818dSEnji Cooper if test clean = "$opt_mode"; then 11431*132f818dSEnji Cooper noexename=$name 11432*132f818dSEnji Cooper case $file in 11433*132f818dSEnji Cooper *.exe) 11434*132f818dSEnji Cooper func_stripname '' '.exe' "$file" 11435*132f818dSEnji Cooper file=$func_stripname_result 11436*132f818dSEnji Cooper func_stripname '' '.exe' "$name" 11437*132f818dSEnji Cooper noexename=$func_stripname_result 11438*132f818dSEnji Cooper # $file with .exe has already been added to rmfiles, 11439*132f818dSEnji Cooper # add $file without .exe 11440*132f818dSEnji Cooper func_append rmfiles " $file" 11441*132f818dSEnji Cooper ;; 11442*132f818dSEnji Cooper esac 11443*132f818dSEnji Cooper # Do a test to see if this is a libtool program. 11444*132f818dSEnji Cooper if func_ltwrapper_p "$file"; then 11445*132f818dSEnji Cooper if func_ltwrapper_executable_p "$file"; then 11446*132f818dSEnji Cooper func_ltwrapper_scriptname "$file" 11447*132f818dSEnji Cooper relink_command= 11448*132f818dSEnji Cooper func_source $func_ltwrapper_scriptname_result 11449*132f818dSEnji Cooper func_append rmfiles " $func_ltwrapper_scriptname_result" 11450*132f818dSEnji Cooper else 11451*132f818dSEnji Cooper relink_command= 11452*132f818dSEnji Cooper func_source $dir/$noexename 11453*132f818dSEnji Cooper fi 11454*132f818dSEnji Cooper 11455*132f818dSEnji Cooper # note $name still contains .exe if it was in $file originally 11456*132f818dSEnji Cooper # as does the version of $file that was added into $rmfiles 11457*132f818dSEnji Cooper func_append rmfiles " $odir/$name $odir/${name}S.$objext" 11458*132f818dSEnji Cooper if test yes = "$fast_install" && test -n "$relink_command"; then 11459*132f818dSEnji Cooper func_append rmfiles " $odir/lt-$name" 11460*132f818dSEnji Cooper fi 11461*132f818dSEnji Cooper if test "X$noexename" != "X$name"; then 11462*132f818dSEnji Cooper func_append rmfiles " $odir/lt-$noexename.c" 11463*132f818dSEnji Cooper fi 11464*132f818dSEnji Cooper fi 11465*132f818dSEnji Cooper fi 11466*132f818dSEnji Cooper ;; 11467*132f818dSEnji Cooper esac 11468*132f818dSEnji Cooper func_show_eval "$RM $rmfiles" 'exit_status=1' 11469*132f818dSEnji Cooper done 11470*132f818dSEnji Cooper 11471*132f818dSEnji Cooper # Try to remove the $objdir's in the directories where we deleted files 11472*132f818dSEnji Cooper for dir in $rmdirs; do 11473*132f818dSEnji Cooper if test -d "$dir"; then 11474*132f818dSEnji Cooper func_show_eval "rmdir $dir >/dev/null 2>&1" 11475*132f818dSEnji Cooper fi 11476*132f818dSEnji Cooper done 11477*132f818dSEnji Cooper 11478*132f818dSEnji Cooper exit $exit_status 11479*132f818dSEnji Cooper} 11480*132f818dSEnji Cooper 11481*132f818dSEnji Cooperif test uninstall = "$opt_mode" || test clean = "$opt_mode"; then 11482*132f818dSEnji Cooper func_mode_uninstall ${1+"$@"} 11483*132f818dSEnji Cooperfi 11484*132f818dSEnji Cooper 11485*132f818dSEnji Coopertest -z "$opt_mode" && { 11486*132f818dSEnji Cooper help=$generic_help 11487*132f818dSEnji Cooper func_fatal_help "you must specify a MODE" 11488*132f818dSEnji Cooper} 11489*132f818dSEnji Cooper 11490*132f818dSEnji Coopertest -z "$exec_cmd" && \ 11491*132f818dSEnji Cooper func_fatal_help "invalid operation mode '$opt_mode'" 11492*132f818dSEnji Cooper 11493*132f818dSEnji Cooperif test -n "$exec_cmd"; then 11494*132f818dSEnji Cooper eval exec "$exec_cmd" 11495*132f818dSEnji Cooper exit $EXIT_FAILURE 11496*132f818dSEnji Cooperfi 11497*132f818dSEnji Cooper 11498*132f818dSEnji Cooperexit $exit_status 11499*132f818dSEnji Cooper 11500*132f818dSEnji Cooper 11501*132f818dSEnji Cooper# The TAGs below are defined such that we never get into a situation 11502*132f818dSEnji Cooper# where we disable both kinds of libraries. Given conflicting 11503*132f818dSEnji Cooper# choices, we go for a static library, that is the most portable, 11504*132f818dSEnji Cooper# since we can't tell whether shared libraries were disabled because 11505*132f818dSEnji Cooper# the user asked for that or because the platform doesn't support 11506*132f818dSEnji Cooper# them. This is particularly important on AIX, because we don't 11507*132f818dSEnji Cooper# support having both static and shared libraries enabled at the same 11508*132f818dSEnji Cooper# time on that platform, so we default to a shared-only configuration. 11509*132f818dSEnji Cooper# If a disable-shared tag is given, we'll fallback to a static-only 11510*132f818dSEnji Cooper# configuration. But we'll never go from static-only to shared-only. 11511*132f818dSEnji Cooper 11512*132f818dSEnji Cooper# ### BEGIN LIBTOOL TAG CONFIG: disable-shared 11513*132f818dSEnji Cooperbuild_libtool_libs=no 11514*132f818dSEnji Cooperbuild_old_libs=yes 11515*132f818dSEnji Cooper# ### END LIBTOOL TAG CONFIG: disable-shared 11516*132f818dSEnji Cooper 11517*132f818dSEnji Cooper# ### BEGIN LIBTOOL TAG CONFIG: disable-static 11518*132f818dSEnji Cooperbuild_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` 11519*132f818dSEnji Cooper# ### END LIBTOOL TAG CONFIG: disable-static 11520*132f818dSEnji Cooper 11521*132f818dSEnji Cooper# Local Variables: 11522*132f818dSEnji Cooper# mode:shell-script 11523*132f818dSEnji Cooper# sh-indentation:2 11524*132f818dSEnji Cooper# End: 11525