[comp.sys.hp] Adding -Llibrarydir to 9000/300's cc

gregc@degas.Berkeley.EDU (Greg Couch) (02/19/88)

The following program is a "wrapper" around /bin/cc which adds the
-Llibrarydir flag by stripping the -Llibrarydir entries and constructing
a LPATH environment variable for ld (an undocumented feature).  This
has been tested on HP-UX 5.5 and 6.01 on a 9000/320 and a 9000/350
respectively.

This program was written so we could keep our BSD makefiles and HP-UX
makefiles identical.  The next step is to rewrite the lint script to
understand the -Llibrarydir flag.

	- Greg Couch
	gregc@degas.Berkeley.EDU

----
/*
 *	Greg Couch, UC Berkeley Unigrafix Group, February 1988
 *
 *	HP-UX's cc and ld on the 9000/300 series don't understand
 *	the -Llibrarydir flag.  Ld does, however, have an undocumented
 *	feature that will do library search paths - a LPATH environment
 *	variable.
 *
 *	Thus this program is a wrapper around /bin/cc which puts
 *	-Llibrarydir parameters into the LPATH environment variable.
 *	It is a C program rather than a shell script because it is
 *	called very often in our development environment.  It might
 * 	even pay to make this program sticky.
 *
 *	There are two recommend ways to install this, either install
 *	this as cc in /usr/local/bin or /usr/contrib/bin, or move
 *	/bin/cc to /lib/cc and install this as /bin/cc (with REAL_CC
 *	changed to /lib/cc below).
 */

# include	<sys/param.h>

extern	int	errno;

# define	REAL_CC		"/bin/cc"
# define	LPATH		"LPATH"
# define	LEN_LPATH	5
# define	DEFAULT_LPATH	"/lib:/usr/lib"

char	lpath[NCARGS/2];

# define	append(str)	{ for (s = str; *s; *lp++ = *s++) continue; }

main(argc, argv)
	int	argc;
	char	**argv;
{
	register char	*lp, *s;
	register int	i, j;

	lp = lpath;
	append(LPATH);
	*lp++ = '=';
	for (i = j = 0; i < argc; i++) {
		if (argv[i][0] != '-' || argv[i][1] != 'L')
			argv[j++] = argv[i];
		else {
			append(&argv[i][2]);	/* -Llibrarydir */
			*lp++ = ':';
		}
	}
	argv[j] = NULL;
	if (lpath[LEN_LPATH + 1] != '\0') {
		append(DEFAULT_LPATH);
		putenv(lpath);
	}
	execv(REAL_CC, argv);
	/* perror("exec /bin/cc");		/* brings in too much code!! */
	return errno;
}