diff options
Diffstat (limited to 'extra/gcc-uClibc/gcc-uClibc.c')
| -rw-r--r-- | extra/gcc-uClibc/gcc-uClibc.c | 129 | 
1 files changed, 129 insertions, 0 deletions
diff --git a/extra/gcc-uClibc/gcc-uClibc.c b/extra/gcc-uClibc/gcc-uClibc.c new file mode 100644 index 000000000..f783cd7bd --- /dev/null +++ b/extra/gcc-uClibc/gcc-uClibc.c @@ -0,0 +1,129 @@ + +/* + * Copyright (C) 2000 Manuel Novoa III + * + * This is a crude wrapper to use uClibc with gcc. + * It was originally written to work around ./configure for ext2fs-utils. + * It certainly can be improved, but it works for me in the normal cases. + * + * TODO: + * Check/modify gcc-specific environment variables? + */ + +#ifdef DEBUG +#include <stdio.h> +#endif + +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "gcc-uClibc.h" + +#define UCLIBC_START UCLIBC_DIR"sysdeps/linux/"TARGET_ARCH"/_start.o" +#define UCLIBC_START_G UCLIBC_START +#define UCLIBC_LIB UCLIBC_DIR"libc.a" +#if 1 +#define UCLIBC_LIB_G UCLIBC_LIB +#else +#define UCLIBC_LIB_G UCLIBC_DIR"libc.a-debug" +#endif +#define UCLIBC_INC "-I"UCLIBC_DIR"include/" + +static char nostdinc[] = "-nostdinc"; +static char nostartfiles[] = "-nostartfiles"; +static char nodefaultlibs[] = "-nodefaultlibs"; +static char nostdlib[] = "-nostdlib"; + +int main(int argc, char **argv) +{ +	int debugging = 0, linking = 1; +	int use_stdinc = 1, use_start = 1, use_stdlib = 1; +	int i, j; +	int source_count; +	char ** gcc_argv; + +	source_count = 0; + +	for ( i = 1 ; i < argc ; i++ ) { +		if (argv[i][0] == '-') { /* option */ +			switch (argv[i][1]) { +				case 'c': +				case 'S': +				case 'E': +				case 'r': +					if (argv[i][2] == 0) linking = 0; +					break; +				case 'g': +					if (argv[i][2] == 0) debugging = 1; +					break; +				case 'n': +					if (strcmp(nostdinc,argv[i]) == 0) { +						use_stdinc = 0; +					} else if (strcmp(nostartfiles,argv[i]) == 0) { +						use_start = 0; +					} else if (strcmp(nodefaultlibs,argv[i]) == 0) { +						use_stdlib = 0; +					} else if (strcmp(nostdlib,argv[i]) == 0) { +						use_start = 0; +						use_stdlib = 0; +					} + +			} +		} else {				/* assume it is an existing source file */ +			++source_count; +		} +	} + +#if 1 +	gcc_argv = __builtin_alloca(sizeof(char*) * (argc + 20)); +#else +	if (!(gcc_argv = malloc(sizeof(char) * (argc + 20)))) { +		return EXIT_FAILURE; +	} +#endif + +	i = 0; +	gcc_argv[i++] = GCC_BIN; +	for ( j = 1 ; j < argc ; j++ ) { +		gcc_argv[i++] = argv[j]; +	} +	if (use_stdinc) { +		gcc_argv[i++] = nostdinc; +		gcc_argv[i++] = UCLIBC_INC; +		gcc_argv[i++] = GCC_INCDIR; +	} +	if (linking && source_count) { +		gcc_argv[i++] = "-static"; +		if (use_start) { +			if (debugging) { +				gcc_argv[i++] = UCLIBC_START_G; +			} else { +				gcc_argv[i++] = UCLIBC_START; +			} +		} +		if (use_stdlib) { +			gcc_argv[i++] = "-nostdlib"; +			if (debugging) { +				gcc_argv[i++] = UCLIBC_LIB_G; +			} else { +				gcc_argv[i++] = UCLIBC_LIB; +			} +			gcc_argv[i++] = GCC_LIB; +		} +	} +	gcc_argv[i++] = NULL; + +#ifdef DEBUG +	for ( j = 0 ; gcc_argv[j] ; j++ ) { +		printf("arg[%2i] = %s\n", j, gcc_argv[j]); +	} +	return EXIT_SUCCESS; +#else +	return execvp(GCC_BIN, gcc_argv); +#endif +} +   + +   +    | 
