| # static.at -- test flags for sysrooting -*- Autotest -*- |
| # |
| # Copyright (C) 2009, 2011-2019, 2021-2025 Free Software Foundation, |
| # Inc. |
| # Written by Paolo Bonzini, 2009 |
| # |
| # 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/>. |
| #### |
| |
| m4_define([SYSROOT_TEST], [ |
| AT_SETUP([$1]) |
| AT_KEYWORDS([libtool sysroot]) |
| |
| gcc_sysroot=`$CC --print-sysroot 2> /dev/null` |
| if test $? != 0; then |
| gcc_sysroot= |
| fi |
| AT_CHECK([test -n "$gcc_sysroot" || exit 77]) |
| |
| # Detect installation prefix for the compiler |
| prefix= |
| for i in crt0.o crt1.o crt2.o crti.o; do |
| j=`$CC --print-file-name $i 2> /dev/null` |
| test $? = 0 || continue |
| case $j in |
| $gcc_sysroot*/lib/$i) |
| prefix=`echo "$j" | $SED "s|^$gcc_sysroot\\(.*\\)/lib/$i\$|\\1|"` |
| break ;; |
| esac |
| done |
| AT_CHECK([test -n "$prefix" || exit 77]) |
| |
| sysroot=`pwd`/sys-root |
| |
| # difficult to use AS_DIRNAME inside the AT_CHECK macro, so |
| # encapsulate as a shell function. |
| local_dirname() { |
| AS_DIRNAME(["$[]1"]) |
| } |
| |
| AT_CHECK([ |
| (cd "$gcc_sysroot" && find ".$prefix/bin" ".$prefix/include" ".$prefix/lib" \! -type d) | \ |
| while read file; do |
| dir=`local_dirname "$sysroot/$file"` |
| test -d "$dir" || mkdir -p "$dir" |
| rm -f "$sysroot/$file" |
| ln -s "$gcc_sysroot/$file" "$sysroot/$file" || \ |
| cp "$gcc_sysroot/$file" "$sysroot/$file" |
| done]) |
| |
| LDFLAGS="$LDFLAGS --sysroot=$sysroot -no-undefined" |
| configure_options="$configure_options --with-sysroot=$sysroot --prefix=$prefix" |
| |
| #??? |
| if test PATH = "$shlibpath_var"; then |
| configure_options="$configure_options --libdir=/$prefix/bin" |
| fi |
| |
| AT_CHECK([mkdir lib1 lib2 prog]) |
| |
| # Build and install package 1. |
| AT_DATA([lib1/configure.ac], |
| [[AC_INIT([lib1], [1.0]) |
| AM_INIT_AUTOMAKE([foreign]) |
| AC_PROG_CC |
| AC_CONFIG_SRCDIR([lib1.c]) |
| LT_INIT |
| AC_OUTPUT(Makefile) |
| ]]) |
| |
| AT_DATA([lib1/Makefile.am], |
| [[lib_LTLIBRARIES = lib1.la |
| lib1_la_SOURCES = lib1.c |
| lib1_la_LDFLAGS = -rpath $(libdir) |
| ]]) |
| |
| AT_DATA([lib1/lib1.c], |
| [[#include <string.h> |
| #include <stdlib.h> |
| char *f(const char *s) |
| { |
| return strdup (s); |
| } |
| ]]) |
| |
| cd lib1 |
| LT_AT_BOOTSTRAP([], [-I $abs_top_srcdir/libltdl/m4], [ignore], |
| [--add-missing], [], [], [all]) |
| |
| AT_CHECK([$MAKE install DESTDIR=$sysroot], [0], [ignore], [ignore]) |
| AT_CHECK([test -f "$sysroot/$prefix/lib/lib1.la"]) |
| AT_CHECK([$GREP -F "$sysroot" "$sysroot/$prefix/lib/lib1.la"], [1]) |
| cd .. |
| |
| # Build and install package 2. |
| AT_DATA([lib2/configure.ac], |
| [[AC_INIT([lib2], [1.0]) |
| AM_INIT_AUTOMAKE([foreign]) |
| AC_PROG_CC |
| AC_CONFIG_SRCDIR([lib2.c]) |
| LT_INIT |
| sysroot=$with_sysroot |
| AC_SUBST([sysroot]) |
| AC_OUTPUT(Makefile) |
| ]]) |
| |
| AT_DATA([lib2/Makefile.am], |
| [[lib_LTLIBRARIES = lib2.la |
| lib2_la_SOURCES = lib2.c |
| lib2_la_LDFLAGS = -rpath $(libdir) |
| lib2_la_LIBADD = $2]1[$3 |
| ]]) |
| |
| AT_DATA([lib2/lib2.c], |
| [[#include <stdio.h> |
| #include <string.h> |
| #include <stdlib.h> |
| extern char *f(const char *s); |
| char *g(const char *s) |
| { |
| char *q = f(s); |
| puts (q); |
| return q; |
| } |
| ]]) |
| |
| cd lib2 |
| LT_AT_BOOTSTRAP([], [-I $abs_top_srcdir/libltdl/m4], [ignore], |
| [--add-missing], [], [], [all]) |
| |
| AT_CHECK([$MAKE install DESTDIR=$sysroot], [0], [ignore], [ignore]) |
| AT_CHECK([test -f "$sysroot/$prefix/lib/lib2.la"]) |
| AT_CHECK([$GREP -F "$sysroot" "$sysroot/$prefix/lib/lib2.la"], [1]) |
| cd .. |
| |
| # Build and install a program. |
| AT_DATA([prog/configure.ac], |
| [[AC_INIT([prog], [1.0]) |
| AM_INIT_AUTOMAKE([foreign]) |
| AC_PROG_CC |
| AC_CONFIG_SRCDIR([prog.c]) |
| LT_INIT |
| sysroot=$with_sysroot |
| AC_SUBST([sysroot]) |
| AC_OUTPUT(Makefile) |
| ]]) |
| |
| AT_DATA([prog/Makefile.am], |
| [[bin_PROGRAMS = prog |
| prog_SOURCES = prog.c |
| prog_LDADD = $2]2[$3 |
| ]]) |
| |
| AT_DATA([prog/prog.c], |
| [[#include <stdio.h> |
| #include <string.h> |
| #include <stdlib.h> |
| extern char *g(const char *s); |
| int main() |
| { |
| char *q = g("hello world"); |
| free (q); |
| return 0; |
| } |
| ]]) |
| |
| cd prog |
| LT_AT_BOOTSTRAP([], [-I $abs_top_srcdir/libltdl/m4], [ignore], |
| [--add-missing], [], [], [all]) |
| |
| AT_CHECK([$MAKE install DESTDIR=$sysroot], [0], [ignore], [ignore]) |
| AT_CHECK([test -f "$sysroot/$prefix/bin/prog$EXEEXT"]) |
| AT_CHECK([$GREP -F "$sysroot" "$sysroot/$prefix/bin/prog$EXEEXT"], [1]) |
| AT_CHECK([$GREP "'.*=" $sysroot/$prefix/lib/lib2.la], [0], [ignore]) |
| AT_CHECK([./libtool --mode=finish $sysroot/$prefix/lib/lib@<:@12@:>@.la], [0], [ignore]) |
| AT_CHECK([$GREP "'.*=" $sysroot/$prefix/lib/lib@<:@12@:>@.la], [1]) |
| |
| # missing tests |
| # 1) pass absolute .la files |
| # 2) pass absolute -L |
| # 2) pass relative .la files |
| |
| cd .. |
| AT_CLEANUP |
| ]) |
| |
| AT_BANNER([sysroot tests]) |
| SYSROOT_TEST([-L=.../lib -l], [-L=$(libdir) -l], []) |
| SYSROOT_TEST([-L SYSROOT/.../lib -l], [-L$(sysroot)$(libdir) -l], []) |
| SYSROOT_TEST([SYSROOT/.../*.la], [$(sysroot)$(libdir)/lib], [.la]) |
| |
| dnl This one does not make sense. |
| dnl SYSROOT_TEST([=.../*.la], [=$(libdir)/lib], [.la]) |