1#! /bin/sh 2# Copyright (C) 2002-2021 Free Software Foundation, Inc. 3# 4# This program is free software; you can redistribute it and/or modify 5# it under the terms of the GNU General Public License as published by 6# the Free Software Foundation; either version 2, or (at your option) 7# any later version. 8# 9# This program is distributed in the hope that it will be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12# GNU General Public License for more details. 13# 14# You should have received a copy of the GNU General Public License 15# along with this program. If not, see <https://www.gnu.org/licenses/>. 16 17# Test for PR 307: depcomp with depmode=dashmstdout libtool race condition 18# Report from Laurent Morichetti. 19# (Also exercises check_LTLIBRARIES.) 20# 21# == Report == 22# The dashmstdout depmode calls libtool in parallel to generate the 23# dependencies (with -M flag) and to build the objfile (both have 24# --mode=compile and -o). 25# The process with 'libtool --mode=compile .* -M' can corrupt the objfile 26# as none is generated by the compiler. Since --mode=compile and -o are 27# set libtool assumes that a objfile should be generated and will execute 28# invalid $mv & $LN_S. 29# 30# == Fix == 31# Now 'depcomp' never compute dependencies in the background, as this can 32# cause races with libtool. Compute the dependencies after the actual 33# compilation. 34 35required='libtoolize gcc' 36. test-init.sh 37 38cat >> configure.ac << 'END' 39AC_PROG_CC 40AM_PROG_AR 41AC_PROG_LIBTOOL 42AC_OUTPUT 43END 44 45cat > Makefile.am << 'END' 46check_LTLIBRARIES = librace.la 47librace_la_SOURCES = a.c b.c c.c d.c e.c f.c g.c h.c 48 49# Make sure the dependencies are updated. 50check-local: 51 for i in $(librace_la_SOURCES:.c=.Plo); do \ 52 echo "checking ./$(DEPDIR)/$$i"; \ 53 grep 'foo\.h' ./$(DEPDIR)/$$i >tst || exit 1; \ 54 test `wc -l <tst` -eq 2 || exit 1; \ 55 done 56END 57 58: >foo.h 59 60for i in a b c d e f g h; do 61 unindent >$i.c <<EOF 62 #include "foo.h" 63 int $i () { return 0; } 64EOF 65done 66 67libtoolize --force 68$ACLOCAL 69$AUTOCONF 70$AUTOMAKE -a 71 72# Sanity check: make sure the variable we are attempting to force 73# is indeed used by configure. 74grep am_cv_CC_dependencies_compiler_type configure 75 76./configure am_cv_CC_dependencies_compiler_type=dashmstdout 77 78$MAKE 79test -f librace.la && exit 1 80$MAKE check 81 82# The failure we check usually occurs during the above build, 83# with an output such as: 84# 85# mv -f .libs/f.lo f.lo 86# mv: cannot stat '.libs/f.lo': No such file or directory 87# 88# (This may happen on 'f' or on some other files.) 89 90test -f librace.la 91test -f tst # A proof that check-local was run. 92 93: 94