Subject: bin/3482: [dM] make botches library OODness
To: None <gnats-bugs@gnats.netbsd.org>
From: der Mouse <mouse@Rodents.Montreal.QC.CA>
List: netbsd-bugs
Date: 04/13/1997 09:39:24
>Number:         3482
>Category:       bin
>Synopsis:       [dM] make botches library OODness
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    bin-bug-people (Utility Bug People)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sun Apr 13 06:50:04 1997
>Last-Modified:
>Originator:     der Mouse
>Organization:
	Dis-
>Release:        1.2_BETA, partially present in -current
>Environment:
	Any (noticed on a Sun-3/260)
>Description:
	make(1) (incorrectly) thinks that any .a archive file without a
	table-of-contents is out of date.  In some releases, any .a
	file is assumed to be an archive.
>How-To-Repeat:
	Extract this sharchive, creating a subdirectory maketest.  Then

	% cd maketest
	% make lib.a			# This run is correct
	cc -O  -c foo.c
	cc -O  -c bar.c
	ar rv lib.a foo.o bar.o
	ar: creating archive lib.a
	a - foo.o
	a - bar.o
	% make lib.a			# This run demonstrates the bug
	ar rv lib.a foo.o bar.o
	ar: creating archive lib.a
	a - foo.o
	a - bar.o
	% 

	Redoing the make commands with "-d m" indicates where the bug
	is; make decides lib.a is an archive library, looks for a
	table-of-contents, doesn't find it, and incorrectly decides
	that the archive is therefore out-of-date.

	In 1.2_BETA, make appears to be basing its decision that lib.a
	is an archive library on the name alone.  Changing the Makefile
	command from "ar rv lib.a foo.o bar.o" to "cat foo.o bar.o >
	lib.a" does not affect the misbehavior.  In -current, this is
	not true; make behaves correctly when lib.a is not an archive
	library.

	#! /bin/sh
	#
	# Shar: Shell Archiver
	#
	# This archive created Sun Apr 13 09:17:26 1997
	# Run this through sh to create:
	#	maketest/
	#	maketest/Makefile
	#	maketest/foo.c
	#	maketest/bar.c
	mkdir maketest>/dev/null 2>&1
	echo x - maketest/Makefile \(44 characters\)
	sed 's/^X//' > maketest/Makefile << \EOF
	Xlib.a: foo.o bar.o
	X	ar rv lib.a foo.o bar.o
	EOF
	if test 44 -ne "`wc -c < maketest/Makefile`"
	then
	echo shar: error transmitting maketest/Makefile \(should have been 44 characters\)
	fi
	echo x - maketest/foo.c \(16 characters\)
	sed 's/^X//' > maketest/foo.c << \EOF
	Xint foovar = 1;
	EOF
	if test 16 -ne "`wc -c < maketest/foo.c`"
	then
	echo shar: error transmitting maketest/foo.c \(should have been 16 characters\)
	fi
	echo x - maketest/bar.c \(16 characters\)
	sed 's/^X//' > maketest/bar.c << \EOF
	Xint barvar = 1;
	EOF
	if test 16 -ne "`wc -c < maketest/bar.c`"
	then
	echo shar: error transmitting maketest/bar.c \(should have been 16 characters\)
	fi
	exit 0
	# end of shell archive

>Fix:
	Presumably, yank the code that gratuitously (and incorrectly)
	assumes that any archive without a table of contents is
	out-of-date! In arch.c, Arch_LibOODate, there is code which
	specifically declares that an archive library with no TOC is
	out of date.  I claim this code should be yanked; a missing TOC
	is not the same as an out-of-date TOC - and I'm not sure even
	the latter is reason to consider a library out-of-date for
	make's purposes.  IMO make should be basing its actions on what
	is declared in the Makefile (and related files, eg, sys.mk),
	not on assumptions about how the files named therein are being
	used (eg, "this is an archive library, therefore we will assume
	it is being used to archive .o files and needs a TOC").

					der Mouse

			       mouse@rodents.montreal.qc.ca
		     7D C8 61 52 5D E7 2D 39  4E F1 31 3E E8 B3 27 4B
>Audit-Trail:
>Unformatted: