[uClibc]gcc wrapper patch

Michael E Brown mebrown at michaels-house.net
Sat Jan 5 20:48:45 UTC 2002


Attached is a small patch which adds support to set DEVEL_PREFIX and
BUILD_DIR at runtime instead of having to recompile the wrapper. As far as
I know, no existing behaviour is changed by this patch.
--
Michael Brown
-------------- next part --------------
diff -ruP uClibc/extra/gcc-uClibc/gcc-uClibc.c uClibc-meb/extra/gcc-uClibc/gcc-uClibc.c
--- uClibc/extra/gcc-uClibc/gcc-uClibc.c	Thu Dec 20 04:31:15 2001
+++ uClibc-meb/extra/gcc-uClibc/gcc-uClibc.c	Wed Jan  2 15:55:27 2002
@@ -77,30 +77,7 @@
 
 #include "gcc-uClibc.h"
 
-static char *rpath_link[] = {
-	"-Wl,-rpath-link,"UCLIBC_DEVEL_PREFIX"/lib",
-	"-Wl,-rpath-link,"UCLIBC_BUILD_DIR"/lib"
-};
-
-static char *rpath[] = {
-	"-Wl,-rpath,"UCLIBC_DEVEL_PREFIX"/lib",
-	"-Wl,-rpath,"UCLIBC_BUILD_DIR"/lib"
-};
-
-static char *uClibc_inc[] = {
-	"-I"UCLIBC_DEVEL_PREFIX"/include/",
-	"-I"UCLIBC_BUILD_DIR"/include/"
-};
-
-static char *crt0_path[] = {
-	UCLIBC_DEVEL_PREFIX"/lib/crt0.o",
-	UCLIBC_BUILD_DIR"/lib/crt0.o"
-};
-
-static char *lib_path[] = {
-	"-L"UCLIBC_DEVEL_PREFIX"/lib",
-	"-L"UCLIBC_BUILD_DIR"/lib"
-};
+char * mebcat( char *a, char *b, char *c) ;
 
 static char *usr_lib_path = "-L"UCLIBC_DEVEL_PREFIX"/lib";
 
@@ -118,8 +95,45 @@
 	int i, j;
 	char ** gcc_argv;
 	char *dlstr;
+	char *incstr;
+	char *devprefix;
+	char *builddir;
+	char *libstr;
 	char *build_dlstr;
 	char *ep;
+	char *rpath_link[2];
+	char *rpath[2];
+	char *uClibc_inc[2];
+	char *crt0_path[2];
+	char *lib_path[2];
+
+	devprefix = getenv("UCLIBC_DEVEL_PREFIX");
+	if (!devprefix) {
+		devprefix = UCLIBC_DEVEL_PREFIX;
+	}
+
+	builddir = getenv("UCLIBC_BUILD_DIR");
+	if (!builddir) {
+		builddir = UCLIBC_BUILD_DIR;
+	}
+
+	incstr = getenv("UCLIBC_GCC_INC");
+	libstr = getenv("UCLIBC_GCC_LIB");
+
+	rpath_link[0] = mebcat("-Wl,-rpath-link,", devprefix, "/lib");
+	rpath_link[1] = mebcat("-Wl,-rpath-link,", builddir, "/lib");
+
+	rpath[0] = mebcat("-Wl,-rpath,", devprefix, "/lib");
+	rpath[1] = mebcat("-Wl,-rpath,", builddir, "/lib");
+
+	uClibc_inc[0] = mebcat("-I", devprefix, "/include/");
+	uClibc_inc[1] = mebcat("-I", builddir, "/include/");
+
+	crt0_path[0] = mebcat("", devprefix, "/lib/crt0.o");
+	crt0_path[1] = mebcat("", builddir, "/lib/crt0.o");
+
+	lib_path[0] = mebcat("-L", devprefix, "/lib");
+	lib_path[1] = mebcat("-L", builddir, "/lib");
 
 	build_dlstr = "-Wl,--dynamic-linker," BUILD_DYNAMIC_LINKER;
 	dlstr = getenv("UCLIBC_GCC_DLOPT");
@@ -218,6 +232,8 @@
 		gcc_argv[i++] = nostdinc;
 		gcc_argv[i++] = uClibc_inc[use_build_dir];
 		gcc_argv[i++] = GCC_INCDIR;
+		if( incstr )
+			gcc_argv[i++] = incstr;
 	}
 
 	if (linking && source_count) {
@@ -232,6 +248,8 @@
 			}
 		}
 		gcc_argv[i++] = rpath_link[use_build_dir]; /* just to be safe */
+		if( libstr )
+			gcc_argv[i++] = libstr;
 		gcc_argv[i++] = lib_path[use_build_dir];
 		if (!use_build_dir) {
 			gcc_argv[i++] = usr_lib_path;
@@ -255,4 +273,17 @@
 	}
 
 	return execvp(GCC_BIN, gcc_argv);
+	//no need to free memory from mebcat because we never return... 
+}
+
+char * mebcat( char *a, char *b, char *c) {
+	int len = 0;
+	char *ret = NULL;
+
+	len = strlen(a) + strlen(b) + strlen(c) + 1;
+	ret = (char *)calloc( len, sizeof(char) );
+	strncpy(ret, a, len);
+	strncpy(ret + strlen(a), b, len - strlen(a));
+	strncpy(ret + strlen(a) + strlen(b), c, len - strlen(a) - strlen(b));
+	return ret;
 }


More information about the uClibc mailing list