# libtool.at -- basic libtool operation tests -*- Autotest -*- # # Copyright (C) 2003-2005, 2008, 2011-2019, 2021-2024 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 . #### 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