changeset 937:f2b4d7297c9d

Largeish cleanup of ccwrap.c. Remove lots of uclibc-isms, put rawcc in tools/bin.
author Rob Landley <rob@landley.net>
date Fri, 18 Dec 2009 03:38:21 -0600
parents eb7e1087f0ee
children 609bc05b0d6a
files root-filesystem.sh sources/sections/ccwrap.sh sources/sections/gcc.sh sources/toys/ccwrap.c
diffstat 4 files changed, 113 insertions(+), 116 deletions(-) [+]
line wrap: on
line diff
--- a/root-filesystem.sh	Fri Dec 18 03:36:12 2009 -0600
+++ b/root-filesystem.sh	Fri Dec 18 03:38:21 2009 -0600
@@ -78,7 +78,7 @@
 # Tell future packages to link against the libraries in the new root filesystem,
 # rather than the ones in the cross compiler directory.
 
-export "$(echo $ARCH | sed 's/-/_/g')"_WRAPPER_TOPDIR="$ROOT_TOPDIR"
+export "$(echo $ARCH | sed 's/-/_/g')"_CCWRAP_TOPDIR="$ROOT_TOPDIR"
 
 STAGE_DIR="$ROOT_TOPDIR" build_section uClibc++
 
--- a/sources/sections/ccwrap.sh	Fri Dec 18 03:36:12 2009 -0600
+++ b/sources/sections/ccwrap.sh	Fri Dec 18 03:38:21 2009 -0600
@@ -3,11 +3,11 @@
 # Which compiler do we build the wrapper with?
 
 TEMP="${FROM_ARCH}-cc"
-[ -z "$FROM_ARCH" ] && TEMP="$CC" || LIBTYPE="-DGIMME_AN_S"
+[ -z "$FROM_ARCH" ] && TEMP="$CC" || LIBTYPE="-DGIMME_AN_S=1"
 
 # Copy compiler binaries (if not already present)
 
-if [ ! -e "$STAGE_DIR/bin/${PROGRAM_PREFIX}"rawcc ]
+if false
 then
   # Populate the wrapper directories (unfinished)
 
@@ -17,10 +17,10 @@
 
   mkdir -p "$STAGE_DIR/bin" || dienow
   path_search "$PATH" "${PROGRAM_PREFIX}*" \
-    'cp "$DIR/$FILE" "$STAGE_DIR/bin/$FILE"' | dot_progress
+    'cp "$DIR/$FILE" "$STAGE_DIR/bin/$FILE"' | dotprogress
 
-  mv "$STAGE_DIR/bin/${PROGRAM_PREFIX}"{cc,rawcc} ||
-  mv "$STAGE_DIR/bin/${PROGRAM_PREFIX}"{gcc,rawcc} || dienow
+  mv "$STAGE_DIR/"{bin/"${PROGRAM_PREFIX}"cc,tools/bin/cc} ||
+  mv "$STAGE_DIR/"{bin/"${PROGRAM_PREFIX}"gcc,tools/bin/cc} || dienow
   ln -sf "${PROGRAM_PREFIX}cc" "$STAGE_DIR/bin/${PROGRAM_PREFIX}gcc" || dienow
 
   # populate include
@@ -49,8 +49,7 @@
 
 # Build wrapper binary
 
+echo "$TEMP" "$SOURCES/toys/ccwrap.c" -Os $CFLAGS \
+  -o "$STAGE_DIR/bin/${PROGRAM_PREFIX}cc" $LIBTYPE $STATIC_FLAGS || dienow
 "$TEMP" "$SOURCES/toys/ccwrap.c" -Os $CFLAGS \
-  -o "$STAGE_DIR/bin/${PROGRAM_PREFIX}cc" $LIBTYPE $STATIC_FLAGS \
-  -DGCC_UNWRAPPED_NAME='"'"${PROGRAM_PREFIX}rawcc"'"' || dienow
-
-# PACKAGE=gcc cleanup build-gcc "${STAGE_DIR}"/{lib/gcc,{libexec/gcc,gcc/lib}/install-tools,bin/${ARCH}-unknown-*}
+  -o "$STAGE_DIR/bin/${PROGRAM_PREFIX}cc" $LIBTYPE $STATIC_FLAGS || dienow
--- a/sources/sections/gcc.sh	Fri Dec 18 03:36:12 2009 -0600
+++ b/sources/sections/gcc.sh	Fri Dec 18 03:38:21 2009 -0600
@@ -108,23 +108,22 @@
 
 # Prepare for ccwrap
 
-mv "$STAGE_DIR/bin/${PROGRAM_PREFIX}"{gcc,rawcc} &&
-ln -s "${PROGRAM_PREFIX}cc" "$STAGE_DIR/bin/${PROGRAM_PREFIX}gcc" &&
+mv "$STAGE_DIR/bin/${PROGRAM_PREFIX}gcc" "$STAGE_DIR/tools/bin/cc" &&
+ln -sf "${PROGRAM_PREFIX}cc" "$STAGE_DIR/bin/${PROGRAM_PREFIX}gcc" &&
+ln -s cc "$STAGE_DIR/tools/bin/rawcc" &&
 
 # Wrap C++ too.
 
-mv "$STAGE_DIR/bin/${PROGRAM_PREFIX}"{g++,raw++} &&
-rm -f "$STAGE_DIR/bin/${PROGRAM_PREFIX}c++" &&
-ln -s "${PROGRAM_PREFIX}cc" "$STAGE_DIR/bin/${PROGRAM_PREFIX}g++" &&
-ln -s "${PROGRAM_PREFIX}cc" "$STAGE_DIR/bin/${PROGRAM_PREFIX}c++" || dienow
+mv "$STAGE_DIR/bin/${PROGRAM_PREFIX}g++" "$STAGE_DIR/tools/bin/c++" &&
+ln -sf "${PROGRAM_PREFIX}cc" "$STAGE_DIR/bin/${PROGRAM_PREFIX}g++" &&
+ln -sf "${PROGRAM_PREFIX}cc" "$STAGE_DIR/bin/${PROGRAM_PREFIX}c++" &&
+ln -s c++ "$STAGE_DIR/tools/bin/raw++" || dienow
 
 # Make sure "tools" has everything distccd needs.
 
 cd "$STAGE_DIR/tools" || dienow
-ln -s ../../bin/${PROGRAM_PREFIX}rawcc "$STAGE_DIR/tools/bin/gcc" 2>/dev/null
-ln -s ../../bin/${PROGRAM_PREFIX}rawcc "$STAGE_DIR/tools/bin/cc" 2>/dev/null
-ln -s ../../bin/${PROGRAM_PREFIX}raw++ "$STAGE_DIR/tools/bin/g++" 2>/dev/null
-ln -s ../../bin/${PROGRAM_PREFIX}raw++ "$STAGE_DIR/tools/bin/c++" 2>/dev/null
+ln -s cc "$STAGE_DIR/tools/bin/gcc" 2>/dev/null
+ln -s c++ "$STAGE_DIR/tools/bin/g++" 2>/dev/null
 
 rm -rf "${STAGE_DIR}"/{lib/gcc,libexec/gcc/install-tools,bin/${ARCH}-unknown-*}
 
--- a/sources/toys/ccwrap.c	Fri Dec 18 03:36:12 2009 -0600
+++ b/sources/toys/ccwrap.c	Fri Dec 18 03:38:21 2009 -0600
@@ -4,14 +4,14 @@
  * Copyright (C) 2002-2003 Erik Andersen
  * Copyright (C) 2006-2009 Rob Landley <rob@landley.net>
  *
- * Wrapper to use uClibc with gcc, and make gcc relocatable.
+ * Wrapper to use make a C compiler relocatable.
  *
  * Licensed under GPLv2.
  */
 
-#ifndef GCC_UNWRAPPED_NAME
-#error You forgot -DGCC_UNWRAPPED_NAME='"'$PREFIX-rawgcc'"'
-#else
+// No, we don't need to check the return value from asprintf().
+
+#undef _FORTIFY_SOURCE
 
 #define _GNU_SOURCE
 #include <alloca.h>
@@ -40,17 +40,6 @@
 
 // #define GIMME_AN_S for wrapper to support --enable-shared toolchain.
 
-#ifdef GIMME_AN_S
-#define ADD_GCC_S() \
-	do { \
-		if (!use_static_linking) \
-			gcc_argv[argcnt++] = "-Wl,--as-needed,-lgcc_s,--no-as-needed"; \
-		else gcc_argv[argcnt++] = "-lgcc_eh"; \
-	} while (0);
-#else
-#define ADD_GCC_S() gcc_argv[argcnt++] = "-lgcc_eh"
-#endif
-
 // Confirm that a regular file exists, and (optionally) has the executable bit.
 int is_file(char *filename, int has_exe)
 {
@@ -109,16 +98,20 @@
 	return NULL;
 }
 
+#ifndef GIMME_AN_S
+#define GIMME_AN_S 0
+#endif
+
 int main(int argc, char **argv)
 {
-	int linking = 1, use_static_linking = 0;
+	int linking = 1, use_static_linking = 0, use_shared_libgcc = GIMME_AN_S;
 	int use_stdinc = 1, use_start = 1, use_stdlib = 1, use_shared = 0;
 	int source_count = 0, verbose = 0;
 	int i, argcnt, liblen, lplen;
-	char **gcc_argv, **libraries, **libpath;
+	char **cc_argv, **libraries, **libpath;
 	char *dlstr, *devprefix;
 	char *cc, *toolprefix;
-	char *debug_wrapper=getenv("WRAPPER_DEBUG");
+	char *debug_wrapper=getenv("CCWRAP_DEBUG");
 
 	// For C++
 
@@ -130,13 +123,13 @@
 
 	if(debug_wrapper) {
 		fprintf(stderr,"incoming: ");
-		for(gcc_argv=argv;*gcc_argv;gcc_argv++)
-			fprintf(stderr,"%s ",*gcc_argv);
+		for(cc_argv=argv;*cc_argv;cc_argv++)
+			fprintf(stderr,"%s ",*cc_argv);
 		fprintf(stderr,"\n\n");
 	}
 
 	// Allocate space for new command line
-	gcc_argv = alloca(sizeof(char*) * (argc + 128));
+	cc_argv = alloca(sizeof(char*) * (argc + 128));
 
 	// What directory is the wrapper script in?
 	if(!(topdir = find_in_path(getenv("PATH"), argv[0], 1))) {
@@ -151,7 +144,7 @@
 		sprintf(temp,"PATH=%s:%s/../tools/bin:%s",topdir,topdir,path);
 		putenv(temp);
 
-		// The directory above the wrapper script should have include, gcc,
+		// The directory above the wrapper script should have include, cc,
 		// and lib directories.  However, the script could have a symlink
 		// pointing to its directory (ala /bin -> /usr/bin), so append ".."
 		// instead of trucating the path.
@@ -160,8 +153,8 @@
 
 	// What's the name of the C compiler we're wrapping?  (It may have a
 	// cross-prefix.)
-	cc = getenv("WRAPPER_CC");
-	if (!cc) cc = GCC_UNWRAPPED_NAME;
+	cc = getenv("CCWRAP_CC");
+	if (!cc) cc = "rawcc";
 
 	// Check end of name, since there could be a cross-prefix on the thing
 	toolprefix = strrchr(argv[0], '/');
@@ -186,10 +179,10 @@
 		use_nostdinc_plus = 1;
 	}
 
-	devprefix = getenv("WRAPPER_TOPDIR");
+	devprefix = getenv("CCWRAP_TOPDIR");
 	if (!devprefix) {
 		char *temp, *temp2;
-		xasprintf(&temp, "%.*sWRAPPER_TOPDIR", prefixlen, toolprefix);
+		asprintf(&temp, "%.*sCCWRAP_TOPDIR", prefixlen, toolprefix);
 		temp2 = temp;
 		while (*temp2) {
 			if (*temp2 == '-') *temp2='_';
@@ -201,9 +194,9 @@
 
 
 	// Figure out where the dynamic linker is.
-	dlstr = getenv("UCLIBC_DYNAMIC_LINKER");
+	dlstr = getenv("CCWRAP_DYNAMIC_LINKER");
 	if (!dlstr) dlstr = "/lib/ld-uClibc.so.0";
-	xasprintf(&dlstr, "-Wl,--dynamic-linker,%s", dlstr);
+	asprintf(&dlstr, "-Wl,--dynamic-linker,%s", dlstr);
 
 	liblen = 0;
 	libraries = alloca(sizeof(char*) * (argc));
@@ -213,7 +206,7 @@
 	libpath = alloca(sizeof(char*) * (argc));
 	libpath[lplen] = 0;
 
-	// Parse the incoming gcc arguments.
+	// Parse the incoming compiler arguments.
 
 	for (i=1; i<argc; i++) {
 		if (argv[i][0] == '-' && argv[i][1]) { /* option */
@@ -274,7 +267,14 @@
 					break;
 
 				case 's':
-					if (!strcmp(argv[i],"-static")) use_static_linking = 1;
+					if (!strcmp(argv[i],"-static")) {
+						use_static_linking = 1;
+						use_shared_libgcc=0;
+					}
+					if (!strcmp(argv[i],"-static-libgcc"))
+						use_shared_libgcc = 0;
+					if (!strcmp(argv[i],"-shared-libgcc"))
+						use_shared_libgcc = 1;
 					if (!strcmp("-shared",argv[i])) {
 						use_start = 0;
 						use_shared = 1;
@@ -284,14 +284,15 @@
 				case 'W':		/* -static could be passed directly to ld */
 					if (!strncmp("-Wl,",argv[i],4)) {
 						char *temp = strstr(argv[i], ",-static");
-						if (temp && (!temp[7] || temp[7]==','))
+						if (temp && (!temp[7] || temp[7]==',')) {
 							use_static_linking = 1;
+							use_shared_libgcc=0;
+						}
 						if (strstr(argv[i],"--dynamic-linker")) dlstr = 0;
 					}
 					break;
 
-                case 'p':
-wow_this_sucks:
+				case 'p':
 					if (!strncmp("-print-",argv[i],7)) {
 						char *temp, *temp2;
 						int itemp, showall = 0;
@@ -315,19 +316,19 @@
 						// Find this entry in the library path.
 						for(itemp=0;;itemp++) {
 							if (itemp == lplen)
-								xasprintf(&temp, "%s/cc/lib/%s", devprefix,
+								asprintf(&temp, "%s/cc/lib/%s", devprefix,
 									temp2);
 							else if (itemp == lplen+1)
-								xasprintf(&temp, "%s/lib/%s", devprefix, temp2);
+								asprintf(&temp, "%s/lib/%s", devprefix, temp2);
 
 							// This is so "include" finds the cc internal
 							// include dir.  The uClibc build needs this.
 							else if (itemp == lplen+2)
-								xasprintf(&temp, "%s/cc/%s", devprefix, temp2);
+								asprintf(&temp, "%s/cc/%s", devprefix, temp2);
 							else if (itemp == lplen+3) {
 								temp = temp2;
 								break;
-							} else xasprintf(&temp, "%s/%s", libpath[itemp],
+							} else asprintf(&temp, "%s/%s", libpath[itemp],
 											temp2);
 
 							if (debug_wrapper)
@@ -354,24 +355,13 @@
 				// --longopts
 
 				case '-':
-					if (!strncmp(argv[i],"--print-",8)) {
+					if (!strncmp(argv[i],"--print-",8)
+						|| !strncmp(argv[1],"--static",8))
+					{
 						argv[i]++;
-						goto wow_this_sucks;
-					} else if (!strcmp(argv[i], "--static")) {
-						use_static_linking = 1;
-						argv[i] = 0;
-					} else if (!strcmp("--version", argv[i])) {
-						printf("uClibc ");
-						fflush(stdout);
-						break;
-					} else if (!strcmp("--uclibc-cc", argv[i]) && argv[i+1]) {
-						cc = argv[i + 1];
-						argv[i] = 0;
-						argv[i + 1] = 0;
-					} else if (!strncmp ("--uclibc-cc=", argv[i], 12)) {
-						cc = argv[i] + 12;
-						argv[i] = 0;
-					} else if (!strcmp("--uclibc-no-ctors", argv[i])) {
+						i--;
+						continue;
+					} else if (!strcmp("--no-ctors", argv[i])) {
 						ctor_dtor = 0;
 						argv[i] = 0;
 					}
@@ -383,100 +373,109 @@
 
 	argcnt = 0;
 
-	gcc_argv[argcnt++] = cpp ? cpp : cc;
+	cc_argv[argcnt++] = cpp ? cpp : cc;
 
-	if (cpp) gcc_argv[argcnt++] = "-fno-use-cxa-atexit";
+	if (cpp) cc_argv[argcnt++] = "-fno-use-cxa-atexit";
 
 	if (linking && source_count) {
 //#if defined HAS_ELF && ! defined HAS_MMU
-//		gcc_argv[argcnt++] = "-Wl,-elf2flt";
+//		cc_argv[argcnt++] = "-Wl,-elf2flt";
 //#endif
-		gcc_argv[argcnt++] = nostdlib;
-		if (use_static_linking) gcc_argv[argcnt++] = "-static";
-		else if (dlstr) gcc_argv[argcnt++] = dlstr;
+		cc_argv[argcnt++] = nostdlib;
+		if (use_static_linking) cc_argv[argcnt++] = "-static";
+		else if (dlstr) cc_argv[argcnt++] = dlstr;
 		for (i=0; i<lplen; i++)
-			if (libpath[i]) gcc_argv[argcnt++] = libpath[i];
+			if (libpath[i]) cc_argv[argcnt++] = libpath[i];
 
 		// just to be safe:
-		xasprintf(gcc_argv+(argcnt++), "-Wl,-rpath-link,%s/lib", devprefix);
+		asprintf(cc_argv+(argcnt++), "-Wl,-rpath-link,%s/lib", devprefix);
 
 
-		xasprintf(gcc_argv+(argcnt++), "-L%s/lib", devprefix);
-		xasprintf(gcc_argv+(argcnt++), "-L%s/cc/lib", devprefix);
+		asprintf(cc_argv+(argcnt++), "-L%s/lib", devprefix);
+		asprintf(cc_argv+(argcnt++), "-L%s/cc/lib", devprefix);
 	}
 	if (use_stdinc && source_count) {
-		gcc_argv[argcnt++] = nostdinc;
+		cc_argv[argcnt++] = nostdinc;
 
 		if (cpp) {
-			if (use_nostdinc_plus) gcc_argv[argcnt++] = nostdinc_plus;
-			gcc_argv[argcnt++] = "-isystem";
-			xasprintf(gcc_argv+(argcnt++), "%s/c++/include", devprefix);
+			if (use_nostdinc_plus) cc_argv[argcnt++] = nostdinc_plus;
+			cc_argv[argcnt++] = "-isystem";
+			asprintf(cc_argv+(argcnt++), "%s/c++/include", devprefix);
 		}
 
-		gcc_argv[argcnt++] = "-isystem";
-		xasprintf(gcc_argv+(argcnt++), "%s/include", devprefix);
-		gcc_argv[argcnt++] = "-isystem";
-		xasprintf(gcc_argv+(argcnt++), "%s/cc/include", devprefix);
+		cc_argv[argcnt++] = "-isystem";
+		asprintf(cc_argv+(argcnt++), "%s/include", devprefix);
+		cc_argv[argcnt++] = "-isystem";
+		asprintf(cc_argv+(argcnt++), "%s/cc/include", devprefix);
 	}
 
-	gcc_argv[argcnt++] = "-U__nptl__";
+	cc_argv[argcnt++] = "-U__nptl__";
 
 	if (linking && source_count) {
 
 		if (profile)
-			xasprintf(gcc_argv+(argcnt++), "%s/lib/gcrt1.o", devprefix);
+			asprintf(cc_argv+(argcnt++), "%s/lib/gcrt1.o", devprefix);
 
 		if (ctor_dtor) {
-			xasprintf(gcc_argv+(argcnt++), "%s/lib/crti.o", devprefix);
-			xasprintf(gcc_argv+(argcnt++), "%s/cc/lib/crtbegin%s", devprefix,
+			asprintf(cc_argv+(argcnt++), "%s/lib/crti.o", devprefix);
+			asprintf(cc_argv+(argcnt++), "%s/cc/lib/crtbegin%s", devprefix,
 					use_shared ? "S.o" : use_static_linking ? "T.o" : ".o");
 		}
 		if (use_start && !profile)
-			xasprintf(gcc_argv+(argcnt++), "%s/lib/crt1.o", devprefix);
+			asprintf(cc_argv+(argcnt++), "%s/lib/crt1.o", devprefix);
 
 		// Add remaining unclaimed arguments.
 
-		for (i=1; i<argc; i++) if (argv[i]) gcc_argv[argcnt++] = argv[i];
+		for (i=1; i<argc; i++) if (argv[i]) cc_argv[argcnt++] = argv[i];
 
 		if (use_stdlib) {
-			//gcc_argv[argcnt++] = "-Wl,--start-group";
-			gcc_argv[argcnt++] = "-lgcc";
-			ADD_GCC_S();
+			//cc_argv[argcnt++] = "-Wl,--start-group";
+			if (!use_static_linking && use_shared_libgcc)
+				cc_argv[argcnt++] = "-Wl,--as-needed,-lgcc_s,--no-as-needed";
+			else {
+				cc_argv[argcnt++] = "-lgcc";
+				cc_argv[argcnt++] = "-lgcc_eh";
+			}
 		}
 		for (i = 0 ; i < liblen ; i++)
-			if (libraries[i]) gcc_argv[argcnt++] = libraries[i];
+			if (libraries[i]) cc_argv[argcnt++] = libraries[i];
 		if (use_stdlib) {
 			if (cpp) {
-				gcc_argv[argcnt++] = "-lstdc++";
-				gcc_argv[argcnt++] = "-lm";
+				cc_argv[argcnt++] = "-lstdc++";
+				cc_argv[argcnt++] = "-lm";
 			}
-			gcc_argv[argcnt++] = "-lc";
-			gcc_argv[argcnt++] = "-lgcc";
-			ADD_GCC_S();
-			//gcc_argv[argcnt++] = "-Wl,--end-group";
+			cc_argv[argcnt++] = "-lc";
+
+			if (!use_static_linking && use_shared_libgcc)
+				cc_argv[argcnt++] = "-Wl,--as-needed,-lgcc_s,--no-as-needed";
+			else {
+				cc_argv[argcnt++] = "-lgcc";
+				cc_argv[argcnt++] = "-lgcc_eh";
+			}
+				
+			//cc_argv[argcnt++] = "-Wl,--end-group";
 		}
 		if (ctor_dtor) {
-			xasprintf(gcc_argv+(argcnt++), "%s/cc/lib/crtend%s", devprefix,
+			asprintf(cc_argv+(argcnt++), "%s/cc/lib/crtend%s", devprefix,
 					use_shared ? "S.o" : ".o");
-			xasprintf(gcc_argv+(argcnt++), "%s/lib/crtn.o", devprefix);
+			asprintf(cc_argv+(argcnt++), "%s/lib/crtn.o", devprefix);
 		}
-	} else for (i=1; i<argc; i++) if (argv[i]) gcc_argv[argcnt++] = argv[i];
+	} else for (i=1; i<argc; i++) if (argv[i]) cc_argv[argcnt++] = argv[i];
 
-	gcc_argv[argcnt++] = NULL;
+	cc_argv[argcnt++] = NULL;
 
 	if (verbose) {
-		for (i=0; gcc_argv[i]; i++) printf("arg[%2i] = %s\n", i, gcc_argv[i]);
+		for (i=0; cc_argv[i]; i++) printf("arg[%2i] = %s\n", i, cc_argv[i]);
 		fflush(stdout);
 	}
 
 	if (debug_wrapper) {
 		fprintf(stderr, "outgoing: ");
-		for (i=0; gcc_argv[i]; i++) fprintf(stderr, "%s ",gcc_argv[i]);
+		for (i=0; cc_argv[i]; i++) fprintf(stderr, "%s ",cc_argv[i]);
 		fprintf(stderr, "\n\n");
 	}
 
-	execvp(gcc_argv[0], gcc_argv);
+	execvp(cc_argv[0], cc_argv);
 	fprintf(stderr, "%s: %s\n", cpp ? cpp : cc, strerror(errno));
 	exit(EXIT_FAILURE);
 }
-#endif