| # libtool.at -- basic libtool operation tests -*- Autotest -*- |
| # |
| # Copyright (C) 2003-2005, 2008, 2011-2019, 2021-2025 Free Software |
| # Foundation, Inc. |
| # Written by Gary V. Vaughan, 2003 |
| # |
| # This file is part of GNU Libtool. |
| # |
| # GNU Libtool is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU General Public License as |
| # published by the Free Software Foundation; either version 2 of |
| # the License, or (at your option) any later version. |
| # |
| # GNU Libtool is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with GNU Libtool. If not, see <https://www.gnu.org/licenses/>. |
| #### |
| |
| AT_BANNER([Basic libtool operation.]) |
| |
| |
| ## ------------------ ## |
| ## Check help output. ## |
| ## ------------------ ## |
| |
| AT_SETUP([check help output]) |
| |
| AT_CHECK([$LIBTOOL --help], [0], [stdout], [stderr]) |
| AT_CHECK([$GREP '^Usage:' stdout stderr], [0], [ignore]) |
| |
| AT_CHECK([$LIBTOOL --mode=link --help], [0], [stdout], [stderr]) |
| AT_CHECK([$GREP '^Usage:' stdout stderr], [0], [ignore]) |
| |
| AT_CLEANUP |
| |
| |
| ## ------------------- ## |
| ## No mode diagnostic. ## |
| ## ------------------- ## |
| |
| AT_SETUP([diagnose no mode specified]) |
| |
| AT_CHECK([$LIBTOOL], [1], [ignore], [stderr]) |
| AT_CHECK([$GREP 'you must specify a MODE' stderr], [0], [ignore]) |
| |
| AT_CLEANUP |
| |
| |
| ## ----------------------------------- ## |
| ## Shell meta-characters in filenames. ## |
| ## ----------------------------------- ## |
| |
| AT_SETUP([quote shell meta-characters in filenames]) |
| |
| eval `$LIBTOOL --config | $GREP '^wl='` |
| |
| # Do the torture test. |
| for mode in compile link install; do |
| |
| # Unfortunately, without an array data type, it is nearly impossible |
| # to protect libtool from metacharacters in filenames. So, we just |
| # try metacharacters in the options it needs to pass to other programs. |
| |
| # preargs and postargs need to go through libtool unmodified. |
| case $mode in |
| compile) |
| preargs="$CC -c" |
| preflag= |
| match_preflag= |
| flag=-DVAR= |
| postargs=foo.c |
| ;; |
| |
| link) |
| preargs="$CC -o hell -g -O" |
| preflag=-Wl, |
| match_preflag=$wl |
| flag=-someflag= |
| postargs=foo.o |
| ;; |
| |
| install) |
| preargs="install -c" |
| preflag= |
| match_preflag= |
| flag=--something= |
| postargs="hell /usr/local/bin/hell" |
| ;; |
| esac |
| |
| |
| # Trivial... |
| |
| AT_CHECK([$LIBTOOL -n --mode=$mode $preargs $preflag"$flag:test" $postargs], |
| [0], [stdout]) |
| # We must not attempt to match $preargs in the output, because libtool |
| # may modify them. For example, on Cygwin, 'libtool --mode=link gcc -o |
| # foo foo.o' becomes 'gcc -o foo.exe foo.o'. |
| AT_CHECK([$GREP "$mode:.*$match_preflag$flag:test " stdout], [0], [ignore]) |
| |
| |
| # Non-trivial... |
| |
| # Backslash needs to be double-escaped: one escape is stripped as the shell |
| # collects arguments for grep (\\\\\\\\ => \\\\), and then another escape |
| # is stripped by grep itself (\\\\ => \\) before the resulting expression is |
| # matched (grepping for \\ matches \): |
| AT_CHECK([$LIBTOOL -n --mode=$mode $preargs $preflag"$flag\\:test\\" $postargs], |
| [0], [stdout]) |
| # NOTE: we use "..."'"'"..." to insert a literal quote into the expression |
| # because "...\"..." is not expanded consistently by all shells. |
| AT_CHECK([$GREP "$mode:.*$match_preflag"'"\{0,1\}'"$flag\\\\\\\\:test\\\\\\\\"'"\{0,1\} ' stdout], |
| [0], [ignore]) |
| |
| # Shell metacharacters that should be backslashified by libtool. |
| for mchar in \" \` \$; do |
| AT_CHECK([$LIBTOOL -n --mode=$mode $preargs $preflag"$flag$mchar:test$mchar" $postargs], |
| [0], [stdout]) |
| AT_CHECK([$GREP "$mode:.*$match_preflag"'"'"\{0,1\}$flag\\\\$mchar:test\\\\$mchar"'"'"\{0,1\} " stdout], [0], [ignore]) |
| done |
| |
| # Shell metacharacters that should be double quoted by libtool, and need |
| # backslash escaping for input to grep. |
| for mchar in "@<:@" "^" "*"; do |
| |
| AT_CHECK([$LIBTOOL -n --mode=$mode $preargs $preflag"$flag$mchar:test$mchar" $postargs], |
| [0], [stdout]) |
| AT_CHECK([$GREP "$mode:.*$match_preflag\"$flag\\$mchar:test\\$mchar\" " stdout], [0], [ignore]) |
| done |
| |
| # Metacharacters that should be double quoted by libtool, but which are |
| # not special to grep (NOTE: Some of these ARE special to $EGREP!!). |
| for mchar in "~" "#" "&" "(" ")" "@:>@" "{" "}" "|" ";" "<" ">" "?" "'" " " " "; do |
| |
| AT_CHECK([$LIBTOOL -n --mode=$mode $preargs $preflag"$flag$mchar:test$mchar" $postargs], |
| [0], [stdout]) |
| AT_CHECK([$GREP "$mode:.*$match_preflag\"$flag$mchar:test$mchar\" " stdout], [0], [ignore]) |
| done |
| done |
| |
| AT_CLEANUP |
| |
| |
| ## -------------------------- ## |
| ## Transform source suffices. ## |
| ## -------------------------- ## |
| |
| AT_SETUP([transform source suffices]) |
| |
| # Extensions taken from the ones that Automake recognizes, plus Objective C, |
| # and GNU Ada. Also test that multiple dots are handled correctly. |
| extensions="C F S ada adb ads asm c c++ cc cpp cxx f f90 F90 f95 F95 f03 F03 for go m s sx ada.ada" |
| bad_names=foo. |
| |
| for ext in $extensions; do |
| # Try a sample compile command. |
| AT_CHECK([$LIBTOOL -n --mode=compile compiler -c foo.$ext], |
| [1], [ignore], [stderr]) |
| AT_CHECK([$GREP 'cannot' stderr], [1], [ignore]) |
| done |
| |
| # Make sure that invalid suffixes are not recognized. |
| for name in $bad_names; do |
| AT_CHECK([$LIBTOOL -n --mode=compile compiler -c $name], |
| [1], [ignore], [stderr]) |
| AT_CHECK([$GREP 'cannot' stderr], [0], [ignore]) |
| done |
| |
| AT_CLEANUP |
| |
| |
| ## --------------------- ## |
| ## Check link operation. ## |
| ## --------------------- ## |
| |
| AT_SETUP([check link mode operation]) |
| |
| AT_CHECK([$LIBTOOL -n --mode=link $CC -o gettext ../lib/libnlsut.a], [0], [stdout]) |
| AT_CHECK([$EGREP '../lib/libnlsut.a' stdout], [0], [ignore]) |
| |
| |
| AT_DATA([hell.lo], |
| [[# Generated by libtool |
| pic_object=none |
| non_pic_object=hell.o |
| ]]) |
| |
| AT_CHECK([$LIBTOOL -n --mode=link $CC -o something foo.o hell.lo], [0], [stdout], [ignore]) |
| AT_CHECK([$FGREP '.lo ' stdout], [1], [ignore]) |
| |
| AT_CLEANUP |
| |
| |
| ## -------------------------------- ## |
| ## Check objectlist file operation. ## |
| ## -------------------------------- ## |
| |
| AT_SETUP([check objectlist file operation]) |
| |
| AT_CHECK([$LIBTOOL -n --mode=link $CC -objectlist nonexistent], [1], [ignore], [stderr]) |
| AT_CHECK([$GREP 'nonexistent' stderr], [0], [ignore]) |
| |
| AT_CLEANUP |
| |
| |
| ## --------------------------------- ## |
| ## Check LT_SUPPORTED_TAG interface. ## |
| ## --------------------------------- ## |
| |
| AT_SETUP([test LT_SUPPORTED_TAG interface]) |
| |
| AT_CHECK([test no != "$AUTOCONF" || exit 77]) |
| |
| cp $abs_top_srcdir/aclocal.m4 ./aclocal.m4 |
| cp $abs_top_srcdir/configure.ac ./configure.ac |
| cp -r $abs_top_srcdir/build-aux ./build-aux |
| cp -r $abs_top_srcdir/m4 ./m4 |
| |
| # Retrieve the list of tags supported by our main libtool script. |
| traced_tags=`$AUTOCONF --trace 'LT_SUPPORTED_TAG:$1'` |
| AT_CHECK([test -n "$traced_tags"]) |
| |
| # Ensure each of them is accepted by --tag. |
| # (We do some useless operation like erasing an empty file, because |
| # we are just interested in whether --tag accepts the tag or not.) |
| for tag in $traced_tags; do |
| AT_CHECK([$LIBTOOL -n --mode=link --tag=$tag compiler -o liba.la foo.lo], |
| [], [ignore], [stderr]) |
| AT_CHECK([$GREP 'ignoring unknown tag' stderr], [1], [ignore]) |
| done |
| |
| # Ensure the above command would have failed for unknown tags |
| AT_CHECK([$LIBTOOL -n --mode=link --tag=UnKnOwN compiler -o liba.la foo.lo], |
| [], [ignore], [stderr]) |
| AT_CHECK([$GREP 'ignoring unknown tag' stderr], [0], [ignore]) |
| |
| AT_CLEANUP |
| |
| ## -------------------- ## |
| ## Silence LT warnings. ## |
| ## -------------------- ## |
| |
| AT_SETUP([test silencing warnings]) |
| |
| AT_DATA([x.cpp], |
| [[ |
| void f(int *p) { *p = 21; } |
| ]]) |
| |
| AT_CHECK([$LIBTOOL --mode=compile --tag=CXX $CXX -c x.cpp], [0], [stdout], [stderr]) |
| |
| AT_CHECK([$LIBTOOL --no-warnings --mode=link --tag=CXX $CXX -o libx.la -no-canonical-prefixes -R /usr/lib64/ -version-info 0:0:0 x.lo], [0], [stdout], [stderr]) |
| |
| AT_CHECK([$GREP -- 'warning' stderr], [1], [ignore]) |
| |
| AT_CLEANUP |