orgass+@rchland.ibm.com (Dick Orgass) (05/03/91)
The ar command for AIX PS/2 is restricted to file names whose length is
less than or equal to 14 characters. Name truncation occurs while a
file is added and a new file whose name matches an old file in the first
14 characters replaces the old file even if the name is different beyond
the first 14 characters.
I never saw the problem when working with the SRC distribution; this may
reflect the fact that there are no files whose names are too long.
A small C program, fixobjs.c, is attached. Using this program, it's
possible to build Modula-3 libraries when there are files whose names
fail to satisfy the 14 character name restriction.
An example of a make file fragment to use this program to create a
library follows. In this example, the make macro INTOBJS contains a
list of the .io files that are to be placed into the library and MODOBJS
contains a list of .mo files to be placed in the library. Finally,
EXTOBJS contains a list of plain .o files to be placed in the library.
The value of AR is the program ar, typically /bin/ar and the value of
ARFLAGS is the options to be passed to ar.
liboli.a: $(INTOBJS) $(MODOBJS) $(EXTOBJS)
-rm -f liboli.a liboli.ma fixints fixmods
ls *.io | fixobjs -i > fixints
chmod +x fixints
fixints
$(AR) $(ARFLAGS) liboli.a `ls I*.o`
ls *.mo | fixobjs -m > fixmods
chmod +x fixmods
fixmods
$(AR) $(ARFLAGS) liboli.a `ls M*.o`
$(AR) $(ARFLAGS) liboli.a $(EXTOBJS)
-rm -f fixobjs fixmods I*.o M*.o
liboli.ma: liboli.a
$(M3AR) liboli.a
Of course, liboli.ma appears in the list of dependencies of all.
Dick
------------------- fixobjs.c -----------------------
/* File fixobjs.c created by Dick Orgass at 12:32:20 on Wed May 1 1991. */
/* Copyright (C) by IBM Corporation, 1991. */
#include <stdio.h>
#include <sys/dir.h>
extern char *strchr(char*, char);
#define private static
private char ibmid[] = "Copyright(c) by IBM Corporation, 1991.";
private char rcsHeader[] = "$Header$";
private char rcsRevision[] = "$Revision$";
private char rcsDate[] = "$Date$";
private void error() {
printf("%s: Must specify exactly one of -i or -m.\n");
exit(1);
}
void main (int argc, char **argv) {
int fileNumber = 0;
char leadingChar;
char buff[MAXNAMLEN] = {'\0'};
char *tmp;
if ((argc == 1) || (argc > 2)) error();
if (argv[1][0] != '-') error();
switch (argv[1][1]) {
case 'i':
leadingChar = 'I';
break;
case 'm':
leadingChar = 'M';
break;
default:
error();
}
printf("#! /bin/csh\n");
while (TRUE) {
if (fgets(buff, sizeof(buff), stdin) == NULL) break;
tmp = strchr(buff, '\n');
*tmp = '\0';
printf("ln -s %s %c%.5d.o\n", buff, leadingChar, fileNumber);
fileNumber++;
}
}
/*
<date> by <name>
Brief description of the change and why it was made.
$Log$
*/
----------------------- End ---------------------------