📄 ltmain.sh
字号:
# Parse the version information argument.
IFS="${IFS= }"; save_ifs="$IFS"; IFS=':'
set dummy $vinfo
IFS="$save_ifs"
if test -n "$5"; then
$echo "$modename: too many parameters to \`-version-info'" 1>&2
$echo "$help" 1>&2
exit 1
fi
test -n "$2" && current="$2"
test -n "$3" && revision="$3"
test -n "$4" && age="$4"
# Check that each of the things are valid numbers.
case "$current" in
0 | [1-9] | [1-9][0-9]*) ;;
*)
$echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
$echo "$modename: \`$vinfo' is not valid version information" 1>&2
exit 1
;;
esac
case "$revision" in
0 | [1-9] | [1-9][0-9]*) ;;
*)
$echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
$echo "$modename: \`$vinfo' is not valid version information" 1>&2
exit 1
;;
esac
case "$age" in
0 | [1-9] | [1-9][0-9]*) ;;
*)
$echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
$echo "$modename: \`$vinfo' is not valid version information" 1>&2
exit 1
;;
esac
if test $age -gt $current; then
$echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
$echo "$modename: \`$vinfo' is not valid version information" 1>&2
exit 1
fi
# Calculate the version variables.
version_vars="version_type current age revision"
case "$version_type" in
none) ;;
linux)
version_vars="$version_vars major versuffix"
major=`expr $current - $age`
versuffix="$major.$age.$revision"
;;
osf)
version_vars="$version_vars versuffix verstring"
major=`expr $current - $age`
versuffix="$current.$age.$revision"
verstring="$versuffix"
# Add in all the interfaces that we are compatible with.
loop=$age
while test $loop != 0; do
iface=`expr $current - $loop`
loop=`expr $loop - 1`
verstring="$verstring:${iface}.0"
done
# Make executables depend on our current version.
verstring="$verstring:${current}.0"
;;
sunos)
version_vars="$version_vars major versuffix"
major="$current"
versuffix="$current.$revision"
;;
*)
$echo "$modename: unknown library version type \`$version_type'" 1>&2
echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
exit 1
;;
esac
# Create the output directory, or remove our outputs if we need to.
if test -d $objdir; then
$show "$rm $objdir/$output $objdir/$libname.* $objdir/${libname}${release}.*"
$run $rm $objdir/$output $objdir/$libname.* $objdir/${libname}${release}.*
else
$show "$mkdir $objdir"
$run $mkdir $objdir
status=$?
if test $status -eq 0 || test -d $objdir; then :
else
exit $status
fi
fi
# Check to see if the archive will have undefined symbols.
if test "$allow_undefined" = yes; then
if test "$allow_undefined_flag" = unsupported; then
$echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
build_libtool_libs=no
build_old_libs=yes
fi
else
# Don't allow undefined symbols.
allow_undefined_flag="$no_undefined_flag"
fi
# Add libc to deplibs on all systems.
dependency_libs="$deplibs"
deplibs="$deplibs -lc"
if test "$build_libtool_libs" = yes; then
# Get the real and link names of the library.
eval library_names=\"$library_names_spec\"
set dummy $library_names
realname="$2"
shift; shift
if test -n "$soname_spec"; then
eval soname=\"$soname_spec\"
else
soname="$realname"
fi
lib="$objdir/$realname"
for link
do
linknames="$linknames $link"
done
# Use standard objects if they are PIC.
test -z "$pic_flag" && libobjs=`$echo "X$libobjs " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//g'`
# Do each of the archive commands.
eval cmds=\"$archive_cmds\"
IFS="${IFS= }"; save_ifs="$IFS"; IFS=';'
for cmd in $cmds; do
IFS="$save_ifs"
$show "$cmd"
$run eval "$cmd" || exit $?
done
IFS="$save_ifs"
# Create links to the real library.
for linkname in $linknames; do
$show "(cd $objdir && $LN_S $realname $linkname)"
$run eval '(cd $objdir && $LN_S $realname $linkname)' || exit $?
done
# If -export-dynamic was specified, set the dlname.
if test "$export_dynamic" = yes; then
# On all known operating systems, these are identical.
dlname="$soname"
fi
fi
# Now set the variables for building old libraries.
oldlib="$objdir/$libname.a"
;;
*.lo | *.o)
if test -n "$link_against_libtool_libs"; then
$echo "$modename: error: cannot link libtool libraries into reloadable objects" 1>&2
exit 1
fi
if test -n "$deplibs"; then
$echo "$modename: warning: \`-l' and \`-L' are ignored while creating objects" 1>&2
fi
if test -n "$dlfiles$dlprefiles"; then
$echo "$modename: warning: \`-dlopen' is ignored while creating objects" 1>&2
# Nullify the symbol file.
compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
fi
if test -n "$rpath"; then
$echo "$modename: warning: \`-rpath' is ignored while creating objects" 1>&2
fi
if test -n "$vinfo"; then
$echo "$modename: warning: \`-version-info' is ignored while creating objects" 1>&2
fi
if test -n "$release"; then
$echo "$modename: warning: \`-release' is ignored while creating objects" 1>&2
fi
case "$output" in
*.lo)
if test -n "$objs"; then
$echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
exit 1
fi
libobj="$output"
obj=`$echo "X$output" | $Xsed -e 's/\.lo$/.o/'`
;;
*)
libobj=
obj="$output"
;;
esac
# Delete the old objects.
$run $rm $obj $libobj
# Create the old-style object.
reload_objs="$objs"`$echo "X$libobjs " | $Xsed -e 's/[^ ]*\.a //g' -e 's/\.lo /.o /g' -e 's/ $//g'`
output="$obj"
eval cmds=\"$reload_cmds\"
IFS="${IFS= }"; save_ifs="$IFS"; IFS=';'
for cmd in $cmds; do
IFS="$save_ifs"
$show "$cmd"
$run eval "$cmd" || exit $?
done
IFS="$save_ifs"
# Exit if we aren't doing a library object file.
test -z "$libobj" && exit 0
if test "$build_libtool_libs" != yes; then
# Create an invalid libtool object if no PIC, so that we don't
# accidentally link it into a program.
$show "echo timestamp > $libobj"
$run eval "echo timestamp > $libobj" || exit $?
exit 0
fi
if test -n "$pic_flag"; then
# Only do commands if we really have different PIC objects.
reload_objs="$libobjs"
output="$libobj"
eval cmds=\"$reload_cmds\"
IFS="${IFS= }"; save_ifs="$IFS"; IFS=';'
for cmd in $cmds; do
IFS="$save_ifs"
$show "$cmd"
$run eval "$cmd" || exit $?
done
IFS="$save_ifs"
else
# Just create a symlink.
$show "$LN_S $obj $libobj"
$run $LN_S $obj $libobj || exit 1
fi
exit 0
;;
*)
if test -n "$vinfo"; then
$echo "$modename: warning: \`-version-info' is ignored while linking programs" 1>&2
fi
if test -n "$release"; then
$echo "$modename: warning: \`-release' is ignored while creating objects" 1>&2
fi
if test -n "$rpath"; then
# If the user specified any rpath flags, then add them.
for libdir in $rpath; do
if test -n "$hardcode_libdir_flag_spec"; then
if test -n "$hardcode_libdir_separator"; then
if test -z "$hardcode_libdirs"; then
# Put the magic libdir with the hardcode flag.
hardcode_libdirs="$libdir"
libdir="@HARDCODE_LIBDIRS@"
else
# Just accumulate the unique libdirs.
case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
*"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
;;
*)
hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
;;
esac
libdir=
fi
fi
if test -n "$libdir"; then
eval flag=\"$hardcode_libdir_flag_spec\"
compile_command="$compile_command $flag"
finalize_command="$finalize_command $flag"
fi
elif test -n "$runpath_var"; then
case "$perm_rpath " in
*" $libdir "*) ;;
*) perm_rpath="$perm_rpath $libdir" ;;
esac
fi
done
fi
# Substitute the hardcoded libdirs into the compile commands.
if test -n "$hardcode_libdir_separator"; then
compile_command=`$echo "X$compile_command" | $Xsed -e "s%@HARDCODE_LIBDIRS@%$hardcode_libdirs%g"`
finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@HARDCODE_LIBDIRS@%$hardcode_libdirs%g"`
fi
if test -n "$libobjs" && test "$build_old_libs" = yes; then
# Transform all the library objects into standard objects.
compile_command=`$echo "X$compile_command " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//'`
finalize_command=`$echo "X$finalize_command " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//'`
fi
if test "$export_dynamic" = yes && test -n "$NM" && test -n "$global_symbol_pipe"; then
dlsyms="${output}S.c"
else
dlsyms=
fi
if test -n "$dlsyms"; then
# Add our own program objects to the preloaded list.
dlprefiles=`$echo "X$objs$dlprefiles " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//'`
# Discover the nlist of each of the dlfiles.
nlist="$objdir/${output}.nm"
if test -d $objdir; then
$show "$rm $nlist ${nlist}T"
$run $rm "$nlist" "${nlist}T"
else
$show "$mkdir $objdir"
$run $mkdir $objdir
status=$?
if test $status -eq 0 || test -d $objdir; then :
else
exit $status
fi
fi
for arg in $dlprefiles; do
$show "extracting global C symbols from \`$arg'"
$run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
done
# Parse the name list into a source file.
$show "creating $objdir/$dlsyms"
if test -z "$run"; then
# Make sure we at least have an empty file.
test -f "$nlist" || : > "$nlist"
# Try sorting and uniquifying the output.
if sort "$nlist" | uniq > "$nlist"T; then
mv -f "$nlist"T "$nlist"
wcout=`wc "$nlist" 2>/dev/null`
count=`echo "X$wcout" | $Xsed -e 's/^[ ]*\([0-9][0-9]*\).*$/\1/'`
(test "$count" -ge 0) 2>/dev/null || count=-1
else
$rm "$nlist"T
count=-1
fi
case "$dlsyms" in
"") ;;
*.c)
$echo > "$objdir/$dlsyms" "\
/* $dlsyms - symbol resolution table for \`$output' dlsym emulation. */
/* Generated by $PROGRAM - GNU $PACKAGE $VERSION */
#ifdef __cplusplus
extern \"C\" {
#endif
/* Prevent the only kind of declaration conflicts we can make. */
#define dld_preloaded_symbol_count some_other_symbol
#define dld_preloaded_symbols some_other_symbol
/* External symbol declarations for the compiler. */\
"
if test -f "$nlist"; then
sed -e 's/^.* \(.*\)$/extern char \1;/' < "$nlist" >> "$objdir/$dlsyms"
else
echo '/* NONE */' >> "$objdir/$dlsyms"
fi
$echo >> "$objdir/$dlsyms" "\
#undef dld_preloaded_symbol_count
#undef dld_preloaded_symbols
#if defined (__STDC__) && __STDC__
# define __ptr_t void *
#else
# define __ptr_t char *
#endif
/* The number of symbols in dld_preloaded_symbols, -1 if unsorted. */
int dld_preloaded_symbol_count = $count;
/* The mapping between symbol names and symbols. */
struct {
char *name;
__ptr_t address;
}
dld_preloaded_symbols[] =
{\
"
if test -f "$nlist"; then
sed 's/^\(.*\) \(.*\)$/ {"\1", (__ptr_t) \&\2},/' < "$nlist" >> "$objdir/$dlsyms"
fi
$echo >> "$objdir/$dlsyms" "\
{0, (__ptr_t) 0}
};
#ifdef __cplusplus
}
#endif\
"
;;
*)
$echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
exit 1
;;
esac
fi
# Now compile the dynamic symbol file.
$show "(cd $objdir && $CC -c$no_builtin_flag \"$dlsyms\")"
$run eval '(cd $objdir && $CC -c$no_builtin_flag "$dlsyms")' || exit $?
# Transform the symbol file into the correct name.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -