Almost complete rewrite of the archive code (except for the Makefile parsing

part). Archive handling was broken at least since the move from BSD ar/ranlib
to GNU binutils because of the different archive format. This rewrite fixes
this by making make to carry around the defines for all formats (it supports)
so it can support all of them independent of the actually used one. The
supported formats are: traditional BSD (this seems to come from V7 at least,
short names only and __.SYMDEF), BSD4.4 (long names with #1/ and __.SYMDEF)
and SysV (extra name table and //). The only format not supported are broken
traditional archives where the member names are truncated to 15 characters.

Errors in the archive are not ignored anymore, but cause make to stop with
an error message. The command line option -A causes these errors to become
non-fatal. This is almost compatible with previous usage except for the
error message printed in any case.

Use a type-safe intrusive list for the archive cache.

Reviewed by:	Max Okumoto <okumoto@ucsd.edu> (without new error handling)
This commit is contained in:
Hartmut Brandt 2005-03-31 11:35:56 +00:00
parent ae6bff540a
commit 5e0a7a4450
3 changed files with 520 additions and 451 deletions

File diff suppressed because it is too large Load Diff

View File

@ -47,6 +47,9 @@ struct GNode;
struct Lst;
struct Path;
/* archive errors are fatal */
extern Boolean arch_fatal;
ReturnStatus Arch_ParseArchive(char **, struct Lst *, struct GNode *);
void Arch_Touch(struct GNode *);
void Arch_TouchLib(struct GNode *);
@ -54,6 +57,5 @@ int Arch_MTime(struct GNode *);
int Arch_MemMTime(struct GNode *);
void Arch_FindLib(struct GNode *, struct Path *);
Boolean Arch_LibOODate(struct GNode *);
void Arch_Init(void);
#endif /* arch_h_488adf7a */

View File

@ -188,9 +188,14 @@ MainParseArgs(int argc, char **argv)
int c;
optind = 1; /* since we're called more than once */
#define OPTFLAGS "BC:D:E:I:PSV:Xd:ef:ij:km:nqrstv"
#define OPTFLAGS "ABC:D:E:I:PSV:Xd:ef:ij:km:nqrstv"
rearg: while((c = getopt(argc, argv, OPTFLAGS)) != -1) {
switch(c) {
case 'A':
arch_fatal = FALSE;
MFLAGS_append("-A", NULL);
break;
case 'C':
if (chdir(optarg) == -1)
err(1, "chdir %s", optarg);
@ -718,10 +723,9 @@ main(int argc, char **argv)
compatMake = TRUE;
/*
* Initialize archive, target and suffix modules in preparation for
* Initialize target and suffix modules in preparation for
* parsing the makefile(s)
*/
Arch_Init();
Targ_Init();
Suff_Init();