[PATCH 0/5] let make flexible for multiple host

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Dave,

This patch set will make configure or build flexible for host environment,
in particular dealing with cross compiler.
Please consider about this proposal.

patch#1:
 By declaring tables about target and host relationships,
 cleanup corresponding code and the new build combination will be
 adapted briefly.

Remaining patches:
 Try to relieve cross compiler burden by using explicit host_cross option.
 I'm using cross compiler environ host=x86 for target=ppc,
 and might attempt target=<another arch> in the near future.
 I stocked private patches to accomplish cross compiling
 but I'd like to discard them permanently with your agreement.

Thanks,
Toshi

Toshikazu Nakayama (5):
  configure: retake the way of host compiler detection
  Makefile: wrap cc, gcc and ar with common make valiables
  make: add host_cross option
  build_data: handle CC valiable
  configure: handle cross compile with target=ppc host_cross=x86

 Makefile            |  144 +++++++++--------
 configure.c         |  441 ++++++++++++++++++++++-----------------------------
 extensions/Makefile |   10 +-
 extensions/sial.mk  |    6 +-
 extensions/snap.mk  |    6 +-
 5 files changed, 289 insertions(+), 318 deletions(-)






Date: Mon, 16 Apr 2012 17:42:05 +0900
Subject: [PATCH 1/5] configure: retake the way of host compiler detection

When make crash with target=[TARGET] option at different host environs,
configure will detect TARGET from the new target and host tables which
declare according by current build cases.

This way can provide easier way for new relationship supports between
host and target just by adding corresponding table entry.

Signed-off-by: Toshikazu Nakayama <nakayama.ts@xxxxxxxxxxxxxx>
---
 configure.c |  406 ++++++++++++++++++++++++-----------------------------------
 1 files changed, 163 insertions(+), 243 deletions(-)

diff --git a/configure.c b/configure.c
index 41ecbcb..63d3244 100755
--- a/configure.c
+++ b/configure.c
@@ -112,35 +112,84 @@ char *get_extra_flags(char *);
 #define X86_64  8
 #define ARM	9
 
-#define TARGET_X86    "TARGET=X86"
-#define TARGET_ALPHA  "TARGET=ALPHA"
-#define TARGET_PPC    "TARGET=PPC"
-#define TARGET_IA64   "TARGET=IA64"
-#define TARGET_S390   "TARGET=S390"
-#define TARGET_S390X  "TARGET=S390X"
-#define TARGET_PPC64  "TARGET=PPC64"
-#define TARGET_X86_64 "TARGET=X86_64"
-#define TARGET_ARM    "TARGET=ARM"
-
-#define TARGET_CFLAGS_X86    "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
-#define TARGET_CFLAGS_ALPHA  "TARGET_CFLAGS="
-#define TARGET_CFLAGS_PPC    "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
-#define TARGET_CFLAGS_IA64   "TARGET_CFLAGS="
-#define TARGET_CFLAGS_S390   "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
-#define TARGET_CFLAGS_S390X  "TARGET_CFLAGS="
-#define TARGET_CFLAGS_PPC64  "TARGET_CFLAGS=-m64"
-#define TARGET_CFLAGS_X86_64 "TARGET_CFLAGS="
-#define TARGET_CFLAGS_ARM            "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
-#define TARGET_CFLAGS_ARM_ON_X86     "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
-#define TARGET_CFLAGS_ARM_ON_X86_64  "TARGET_CFLAGS=-m32 -D_FILE_OFFSET_BITS=64"
-#define TARGET_CFLAGS_X86_ON_X86_64  "TARGET_CFLAGS=-m32 -D_FILE_OFFSET_BITS=64"
-#define TARGET_CFLAGS_PPC_ON_PPC64   "TARGET_CFLAGS=-m32 -D_FILE_OFFSET_BITS=64 -fPIC"
-
-#define GDB_TARGET_DEFAULT        "GDB_CONF_FLAGS="
-#define GDB_TARGET_ARM_ON_X86     "GDB_CONF_FLAGS=--target=arm-elf-linux"
-#define GDB_TARGET_ARM_ON_X86_64  "GDB_CONF_FLAGS=--target=arm-elf-linux CFLAGS=-m32"
-#define GDB_TARGET_X86_ON_X86_64  "GDB_CONF_FLAGS=--target=i686-pc-linux-gnu CFLAGS=-m32"
-#define GDB_TARGET_PPC_ON_PPC64   "GDB_CONF_FLAGS=--target=ppc-elf-linux CFLAGS=-m32"
+static struct host_table {
+	int host;
+	const char *cflags;		/* TARGET_CFLAGS */
+	const char *gdb_conf_flags;	/* GDB_CONF_FLAGS */
+} arm[] = {
+	{
+		.host = X86,
+		.cflags = "-D_FILE_OFFSET_BITS=64",
+		.gdb_conf_flags = "--target=arm-elf-linux",
+	},
+	{
+		.host = X86_64,
+		.cflags = "-m32 -D_FILE_OFFSET_BITS=64",
+		.gdb_conf_flags = "--target=arm-elf-linux CFLAGS=-m32",
+	},
+}, x86[] = {
+	{
+		.host = X86_64,
+		.cflags = "-m32 -D_FILE_OFFSET_BITS=64",
+		.gdb_conf_flags = "--target=i686-pc-linux-gnu CFLAGS=-m32",
+	},
+}, ppc[] = {
+	{
+		.host = PPC64,
+		.cflags = "-m32 -D_FILE_OFFSET_BITS=64 -fPIC",
+		.gdb_conf_flags = "--target=ppc-elf-linux CFLAGS=-m32",
+	}
+};
+
+static struct target_table {
+	char *target;			/* TARGET alias */
+	const char *cflags;		/* TARGET_CFLAGS default */
+	const char *gdb_conf_flags;	/* GDB_CONF_FLAGS default */
+	struct host_table *hosts, *host;
+	int num_hosts;
+} target_arch[] = {
+	{
+		.target = "UNKNOWN",
+	},
+	{
+		.target = "X86",
+		.cflags = "-D_FILE_OFFSET_BITS=64",
+		.hosts = x86,
+		.num_hosts = (sizeof(x86)/sizeof(struct host_table)),
+	},
+	{
+		.target = "ALPHA",
+	},
+	{
+		.target = "PPC",
+		.cflags = "-D_FILE_OFFSET_BITS=64",
+		.hosts = ppc,
+		.num_hosts = (sizeof(ppc)/sizeof(struct host_table)),
+	},
+	{
+		.target = "IA64",
+	},
+	{
+		.target = "S390",
+		.cflags = "-D_FILE_OFFSET_BITS=64",
+	},
+	{
+		.target = "S39X",
+	},
+	{
+		.target = "PPC64",
+		.cflags = "-m64",
+	},
+	{
+		.target = "X86_64",
+	},
+	{
+		.target = "ARM",
+		.cflags = "-D_FILE_OFFSET_BITS=64",
+		.hosts = arm,
+		.num_hosts = (sizeof(arm)/sizeof(struct host_table)),
+	},
+};
 
 /*
  *  The original plan was to allow the use of a particular version
@@ -313,6 +362,7 @@ get_current_configuration(struct supported_gdb_version *sp)
 	FILE *fp;
 	static char buf[512];
 	char *p;
+	int i, host, target;
 
 #ifdef __alpha__
         target_data.target = ALPHA;
@@ -349,39 +399,40 @@ get_current_configuration(struct supported_gdb_version *sp)
 	 */
 	target_data.host = target_data.target;
 
+	/*
+	 * Check the requirements for host and target.
+	 */
+	host = target_data.host;
 	if (target_data.target_as_param) {
-		if ((target_data.target == X86 || target_data.target == X86_64) &&
-		    (name_to_target((char *)target_data.target_as_param) == ARM)) {
-			/* 
-			 *  Debugging of ARM core files supported on X86, and on
-			 *  X86_64 when built as a 32-bit executable.
-			 */
-			target_data.target = ARM;
-		} else if ((target_data.target == X86_64) &&
-			(name_to_target((char *)target_data.target_as_param) == X86)) {
+		target = name_to_target((char *)target_data.target_as_param);
+		if (target != host) {
+			for (i = 0; i < target_arch[target].num_hosts; i++)
+				if (target_arch[target].hosts[i].host == host)
+					break;
+			if (i == target_arch[target].num_hosts) {
+				fprintf(stderr,
+					"\ntarget=%s is not supported on the "
+					"%s host architecture\n\n",
+					target_data.target_as_param,
+					target_to_name(host));
+				exit(1);
+			}
 			/*
-			 *  Build an X86 crash binary on an X86_64 host.
+			 * target can build at this host.
 			 */
-			target_data.target = X86;
-		} else if ((target_data.target == PPC64) &&
-			(name_to_target((char *)target_data.target_as_param) == PPC)) {
+			target_data.target = target;
+			target_arch[target].host =
+						&target_arch[target].hosts[i];
+		} else { /* target == host */
+			if (target_data.initial_gdb_target != UNKNOWN &&
+			    host != target_data.initial_gdb_target)
+				arch_mismatch(sp);
 			/*
-			 *  Build an PPC crash binary on an PPC64 host.
+			 * target can build.
 			 */
-			target_data.target = PPC;
-		} else if (name_to_target((char *)target_data.target_as_param) ==
-			target_data.host) {
-			if ((target_data.initial_gdb_target != UNKNOWN) &&
-			    (target_data.host != target_data.initial_gdb_target))
-				arch_mismatch(sp);
-		} else {
-			fprintf(stderr,
-			    "\ntarget=%s is not supported on the %s host architecture\n\n",
-				target_data.target_as_param,
-				target_to_name(target_data.host));
-			exit(1);
+			target_data.target = target;
 		}
-        }
+	}
 
 	/*
 	 *  Impose implied (sticky) target if an initial build has been
@@ -389,39 +440,21 @@ get_current_configuration(struct supported_gdb_version *sp)
 	 */
 	if (target_data.initial_gdb_target && 
 	    (target_data.target != target_data.initial_gdb_target)) {
-		if ((target_data.initial_gdb_target == ARM) &&
-		    (target_data.target != ARM)) {
-			if ((target_data.target == X86) || 
-			    (target_data.target == X86_64))
-				target_data.target = ARM;
-			else
-				arch_mismatch(sp);
-		}
-		if ((target_data.target == ARM) &&
-		    (target_data.initial_gdb_target != ARM))
-			arch_mismatch(sp);
-
-		if ((target_data.initial_gdb_target == X86) &&
-		    (target_data.target != X86)) {
-			if (target_data.target == X86_64) 
-				target_data.target = X86;
-			else
-				arch_mismatch(sp);
-		}
-		if ((target_data.target == X86) &&
-		    (target_data.initial_gdb_target != X86))
-			arch_mismatch(sp);
-
-		if ((target_data.initial_gdb_target == PPC) &&
-		    (target_data.target != PPC)) {
-			if (target_data.target == PPC64) 
-				target_data.target = PPC;
-			else
-				arch_mismatch(sp);
-		}
-		if ((target_data.target == PPC) &&
-		    (target_data.initial_gdb_target != PPC))
+		/*
+		 * If make split target= option, check previous setup and
+		 * rebuild with previous target.
+		 */
+		target = target_data.initial_gdb_target;
+		for (i = 0; i < target_arch[target].num_hosts; i++)
+			if (target_arch[target].hosts[i].host == host)
+				break;
+		if (i == target_arch[target].num_hosts)
 			arch_mismatch(sp);
+		/*
+		 * initial target can build at this host.
+		 */
+		target_data.target = target;
+		target_arch[target].host = &target_arch[target].hosts[i];
 	}
 
         if ((fp = fopen("Makefile", "r")) == NULL) {
@@ -497,36 +530,9 @@ show_configuration(void)
 	if (target_data.flags & QUIET)
 		return;
 
-	switch (target_data.target)
-	{
-	case X86:    
-		printf("TARGET: X86\n");
-		break;
-	case ALPHA: 
-		printf("TARGET: ALPHA\n");
-		break;
-	case PPC:    
-		printf("TARGET: PPC\n");
-		break;
-	case IA64:   
-		printf("TARGET: IA64\n");
-		break;
-	case S390:
-		printf("TARGET: S390\n");
-		break;
-	case S390X:
-		printf("TARGET: S390X\n");
-		break;
-	case PPC64:
-		printf("TARGET: PPC64\n");
-		break;
-	case X86_64:
-		printf("TARGET: X86_64\n");
-		break;
-	case ARM:
-		printf("TARGET: ARM\n");
-		break;
-	}
+	if (target_data.target <
+	    sizeof(target_arch) / sizeof(struct target_table))
+		printf("TARGET: %s\n", target_arch[target_data.target].target);
 
 	if (strlen(target_data.program)) {
 		for (i = 0; i < (strlen("TARGET")-strlen(target_data.program)); 
@@ -548,70 +554,31 @@ build_configure(struct supported_gdb_version *sp)
 {
 	FILE *fp1, *fp2;
 	char buf[512];
-	char *target;
-	char *target_CFLAGS;
-	char *gdb_conf_flags;
+	char target[128];
+	char target_CFLAGS[128];
+	char gdb_conf_flags[128];
 	char *ldflags;
 	char *cflags;
 
 	get_current_configuration(sp);
 
-	target = target_CFLAGS = NULL;
-
-	gdb_conf_flags = GDB_TARGET_DEFAULT;
-	switch (target_data.target)
-	{
-	case X86:
-		target = TARGET_X86;
-		if (target_data.host == X86_64) {
-                        target_CFLAGS = TARGET_CFLAGS_X86_ON_X86_64;
-			gdb_conf_flags = GDB_TARGET_X86_ON_X86_64;
-		} else
-			target_CFLAGS = TARGET_CFLAGS_X86;
-		break;
-	case ALPHA:
-		target = TARGET_ALPHA;
-		target_CFLAGS = TARGET_CFLAGS_ALPHA;
-		break;
-	case PPC:
-		target = TARGET_PPC;
-		if (target_data.host == PPC64) {
-                        target_CFLAGS = TARGET_CFLAGS_PPC_ON_PPC64;
-			gdb_conf_flags = GDB_TARGET_PPC_ON_PPC64;
-		} else
-			target_CFLAGS = TARGET_CFLAGS_PPC;
-		break;
-	case IA64:
-		target = TARGET_IA64;
-                target_CFLAGS = TARGET_CFLAGS_IA64;
-		break;
-	case S390:
-		target = TARGET_S390;
-		target_CFLAGS = TARGET_CFLAGS_S390;
-		break;
-	case S390X:
-		target = TARGET_S390X;
-		target_CFLAGS = TARGET_CFLAGS_S390X;
-		break;
-	case PPC64:
-                target = TARGET_PPC64;
-                target_CFLAGS = TARGET_CFLAGS_PPC64;
-                break;
-	case X86_64:
-                target = TARGET_X86_64;
-                target_CFLAGS = TARGET_CFLAGS_X86_64;
-                break;
-	case ARM:
-                target = TARGET_ARM;
-                if (target_data.host == X86) {
-                        target_CFLAGS = TARGET_CFLAGS_ARM_ON_X86;
-			gdb_conf_flags = GDB_TARGET_ARM_ON_X86;
-                } else if (target_data.host == X86_64) {
-                        target_CFLAGS = TARGET_CFLAGS_ARM_ON_X86_64;
-			gdb_conf_flags = GDB_TARGET_ARM_ON_X86_64;
-		} else
-                        target_CFLAGS = TARGET_CFLAGS_ARM;
-                break;
+	sprintf(target, "TARGET=%s", target_arch[target_data.target].target);
+	if (target_arch[target_data.target].host != NULL) {
+		sprintf(target_CFLAGS, "TARGET_CFLAGS=%s",
+			(target_arch[target_data.target].host->cflags) ?
+			target_arch[target_data.target].host->cflags :
+			"");
+		sprintf(gdb_conf_flags, "GDB_CONF_FLAGS=%s",
+			(target_arch[target_data.target].host->gdb_conf_flags)
+			? target_arch[target_data.target].host->gdb_conf_flags
+			: "");
+	} else {
+		sprintf(target_CFLAGS, "TARGET_CFLAGS=%s",
+			(target_arch[target_data.target].cflags) ?
+			target_arch[target_data.target].cflags : "");
+		sprintf(gdb_conf_flags, "GDB_CONF_FLAGS=%s",
+			(target_arch[target_data.target].gdb_conf_flags) ?
+			target_arch[target_data.target].gdb_conf_flags : "");
 	}
 
 	ldflags = get_extra_flags("LDFLAGS.extra");
@@ -1377,6 +1344,7 @@ set_initial_target(struct supported_gdb_version *sp)
 	FILE *fp;
 	char crash_target[512];
 	char buf[512];
+	int i;
 
 	target_data.initial_gdb_target = UNKNOWN;
 
@@ -1408,41 +1376,19 @@ set_initial_target(struct supported_gdb_version *sp)
 
 	fclose(fp);
 
-	if (strncmp(buf, "X86_64", strlen("X86_64")) == 0) 
-		target_data.initial_gdb_target = X86_64;
-	else if (strncmp(buf, "X86", strlen("X86")) == 0) 
-		target_data.initial_gdb_target = X86;
-	else if (strncmp(buf, "ALPHA", strlen("ALPHA")) == 0)
-		target_data.initial_gdb_target = ALPHA;
-	else if (strncmp(buf, "PPC64", strlen("PPC64")) == 0)
-		target_data.initial_gdb_target = PPC64;
-	else if (strncmp(buf, "PPC", strlen("PPC")) == 0)
-		target_data.initial_gdb_target = PPC;
-	else if (strncmp(buf, "IA64", strlen("IA64")) == 0)
-		target_data.initial_gdb_target = IA64;
-	else if (strncmp(buf, "S390X", strlen("S390X")) == 0)
-		target_data.initial_gdb_target = S390X;
-	else if (strncmp(buf, "S390", strlen("S390")) == 0)
-		target_data.initial_gdb_target = S390;
-	else if (strncmp(buf, "ARM", strlen("ARM")) == 0)
-		target_data.initial_gdb_target = ARM;
+	for (i = 0; i < sizeof(target_arch) / sizeof(struct target_table); i++)
+		if (strncmp(buf, target_arch[i].target,
+			    strlen(target_arch[i].target)) == 0) {
+			target_data.initial_gdb_target = i;
+			break;
+		}
 }
 
 char *
 target_to_name(int target)
 {
-	switch (target)
-	{
-	case X86:    return("X86");
-	case ALPHA:  return("ALPHA");
-	case PPC:    return("PPC");
-	case IA64:   return("IA64");
-	case S390:   return("S390");
-	case S390X:  return("S390X");
-	case PPC64:  return("PPC64");
-	case X86_64: return("X86_64");
-	case ARM:    return("ARM"); 
-	}
+	if (target < sizeof(target_arch) / sizeof(struct target_table))
+		return target_arch[target].target;
 
 	return "UNKNOWN";
 }
@@ -1450,42 +1396,16 @@ target_to_name(int target)
 int
 name_to_target(char *name)
 {
-	if (strncmp(name, "X86_64", strlen("X86_64")) == 0)
-                return X86_64;
-	else if (strncmp(name, "x86_64", strlen("x86_64")) == 0)
-                return X86_64;
-        else if (strncmp(name, "X86", strlen("X86")) == 0)
-                return X86;
-        else if (strncmp(name, "x86", strlen("x86")) == 0)
-                return X86;
-        else if (strncmp(name, "ALPHA", strlen("ALPHA")) == 0)
-                return ALPHA;
-        else if (strncmp(name, "alpha", strlen("alpha")) == 0)
-                return ALPHA;
-        else if (strncmp(name, "PPC64", strlen("PPC64")) == 0)
-                return PPC64;
-        else if (strncmp(name, "ppc64", strlen("ppc64")) == 0)
-                return PPC64;
-        else if (strncmp(name, "PPC", strlen("PPC")) == 0)
-                return PPC;
-        else if (strncmp(name, "ppc", strlen("ppc")) == 0)
-                return PPC;
-        else if (strncmp(name, "IA64", strlen("IA64")) == 0)
-                return IA64;
-        else if (strncmp(name, "ia64", strlen("ia64")) == 0)
-                return IA64;
-        else if (strncmp(name, "S390X", strlen("S390X")) == 0)
-                return S390X;
-        else if (strncmp(name, "s390x", strlen("s390x")) == 0)
-                return S390X;
-        else if (strncmp(name, "S390", strlen("S390")) == 0)
-                return S390;
-        else if (strncmp(name, "s390", strlen("s390")) == 0)
-                return S390;
-        else if (strncmp(name, "ARM", strlen("ARM")) == 0)
-                return ARM;
-        else if (strncmp(name, "arm", strlen("arm")) == 0)
-                return ARM;
+	int i;
+	char buf[128];
+
+	for (i = 0; i < sizeof(target_arch) / sizeof(struct target_table); i++)
+		if (target_arch[i].target &&
+		    (strncmp(name, target_arch[i].target,
+			strlen(target_arch[i].target)) == 0) ||
+		     strncmp(name, lower_case(target_arch[i].target, buf),
+			strlen(lower_case(target_arch[i].target, buf)) == 0))
+			return i;
 
 	return UNKNOWN;
 }
-- 
1.7.0.4


Date: Mon, 24 Oct 2011 18:14:10 +0900
Subject: [PATCH 2/5] Makefile: wrap cc, gcc and ar with common make variables

By this variables, cross-compiler can be adapted into crash build
and also, don't hurt existing build targets.

CC or AR must be guaranteed by cross environ.

A configure.c is still compiled with host native compiler
because this need to run before crash compile.

Signed-off-by: Toshikazu Nakayama <nakayama.ts@xxxxxxxxxxxxxx>
---
 Makefile            |  124 +++++++++++++++++++++++++++------------------------
 extensions/Makefile |   10 +++-
 extensions/sial.mk  |    6 ++-
 extensions/snap.mk  |    6 ++-
 4 files changed, 82 insertions(+), 64 deletions(-)

diff --git a/Makefile b/Makefile
index 6f63128..e7e468e 100644
--- a/Makefile
+++ b/Makefile
@@ -31,6 +31,12 @@ ifeq (${TARGET}, PPC64)
 CONF_FLAGS = -m64
 endif
 
+ifeq ($(CC), )
+CC = cc
+endif
+ifeq ($(AR), )
+AR = ar
+endif
 #
 # GDB, GDB_FILES, GDB_OFILES and GDB_PATCH_FILES will be configured automatically by configure 
 #
@@ -274,7 +280,7 @@ gdb_patch:
 		patch -p0 < ${GDB}.patch; fi
 
 library: make_build_data ${OBJECT_FILES}
-	ar -rs ${PROGRAM}lib.a ${OBJECT_FILES}
+	$(AR) -rs ${PROGRAM}lib.a ${OBJECT_FILES}
 
 gdb: force
 	rm -f ${GDB_OFILES}
@@ -297,7 +303,7 @@ do_clean:
 	@(cd memory_driver; make --no-print-directory -i clean)
 
 make_build_data: force
-	cc -c ${CRASH_CFLAGS} build_data.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} build_data.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 install:
 	/usr/bin/install ${PROGRAM} ${INSTALLDIR}
@@ -319,171 +325,171 @@ nowarn: make_configure
 	@make --no-print-directory gdb_merge
 
 main.o: ${GENERIC_HFILES} main.c
-	cc -c ${CRASH_CFLAGS} main.c ${WARNING_OPTIONS} ${WARNING_ERROR} 
+	$(CC) -c ${CRASH_CFLAGS} main.c ${WARNING_OPTIONS} ${WARNING_ERROR} 
 
 cmdline.o: ${GENERIC_HFILES} cmdline.c
-	cc -c ${CRASH_CFLAGS} cmdline.c -I${READLINE_DIRECTORY} ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} cmdline.c -I${READLINE_DIRECTORY} ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 tools.o: ${GENERIC_HFILES} tools.c
-	cc -c ${CRASH_CFLAGS} tools.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} tools.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 global_data.o: ${GENERIC_HFILES} global_data.c
-	cc -c ${CRASH_CFLAGS} global_data.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} global_data.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 symbols.o: ${GENERIC_HFILES} symbols.c
-	cc -c ${CRASH_CFLAGS} symbols.c -I${BFD_DIRECTORY} -I${GDB_INCLUDE_DIRECTORY} ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} symbols.c -I${BFD_DIRECTORY} -I${GDB_INCLUDE_DIRECTORY} ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 filesys.o: ${GENERIC_HFILES} filesys.c
-	cc -c ${CRASH_CFLAGS} filesys.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} filesys.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 help.o: ${GENERIC_HFILES} help.c
-	cc -c ${CRASH_CFLAGS} help.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} help.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 memory.o: ${GENERIC_HFILES} memory.c
-	cc -c ${CRASH_CFLAGS} memory.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} memory.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 test.o: ${GENERIC_HFILES} test.c
-	cc -c ${CRASH_CFLAGS} test.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} test.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 task.o: ${GENERIC_HFILES} task.c
-	cc -c ${CRASH_CFLAGS} task.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} task.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 kernel.o: ${GENERIC_HFILES} kernel.c
-	cc -c ${CRASH_CFLAGS} kernel.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} kernel.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 gdb_interface.o: ${GENERIC_HFILES} gdb_interface.c
-	cc -c ${CRASH_CFLAGS} gdb_interface.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} gdb_interface.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 va_server.o: ${MCORE_HFILES} va_server.c
-	cc -c ${CRASH_CFLAGS} va_server.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} va_server.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 va_server_v1.o: ${MCORE_HFILES} va_server_v1.c
-	cc -c ${CRASH_CFLAGS} va_server_v1.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} va_server_v1.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 lkcd_common.o: ${GENERIC_HFILES} ${LKCD_DUMP_HFILES} lkcd_common.c
-	cc -c ${CRASH_CFLAGS} lkcd_common.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} lkcd_common.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 lkcd_v1.o: ${GENERIC_HFILES} ${LKCD_DUMP_HFILES} lkcd_v1.c
-	cc -c ${CRASH_CFLAGS} lkcd_v1.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} lkcd_v1.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 lkcd_v2_v3.o: ${GENERIC_HFILES} ${LKCD_DUMP_HFILES} lkcd_v2_v3.c
-	cc -c ${CRASH_CFLAGS} lkcd_v2_v3.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} lkcd_v2_v3.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 lkcd_v5.o: ${GENERIC_HFILES} ${LKCD_DUMP_HFILES} lkcd_v5.c
-	cc -c ${CRASH_CFLAGS} lkcd_v5.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} lkcd_v5.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 lkcd_v7.o: ${GENERIC_HFILES} ${LKCD_DUMP_HFILES} lkcd_v7.c
-	cc -c ${CRASH_CFLAGS} lkcd_v7.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} lkcd_v7.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 lkcd_v8.o: ${GENERIC_HFILES} ${LKCD_DUMP_HFILES} lkcd_v8.c
-	cc -c ${CRASH_CFLAGS} lkcd_v8.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} lkcd_v8.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 net.o: ${GENERIC_HFILES} net.c
-	cc -c ${CRASH_CFLAGS} net.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} net.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 dev.o: ${GENERIC_HFILES} dev.c
-	cc -c ${CRASH_CFLAGS} dev.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} dev.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 # remote.c functionality has been deprecated
 remote.o: ${GENERIC_HFILES} remote.c
-	@cc -c ${CRASH_CFLAGS} remote.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} remote.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 remote_daemon.o: ${GENERIC_HFILES} remote.c
-	cc -c ${CRASH_CFLAGS} -DDAEMON remote.c -o remote_daemon.o ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} -DDAEMON remote.c -o remote_daemon.o ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 x86.o: ${GENERIC_HFILES} ${REDHAT_HFILES} x86.c
-	cc -c ${CRASH_CFLAGS} x86.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} x86.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 alpha.o: ${GENERIC_HFILES} alpha.c
-	cc -c ${CRASH_CFLAGS} alpha.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} alpha.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 ppc.o: ${GENERIC_HFILES} ppc.c
-	cc -c ${CRASH_CFLAGS} ppc.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} ppc.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 ia64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} ia64.c
-	cc -c ${CRASH_CFLAGS} ia64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} ia64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 ppc64.o: ${GENERIC_HFILES} ppc64.c
-	cc -c ${CRASH_CFLAGS} ppc64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} ppc64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 x86_64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} x86_64.c
-	cc -c ${CRASH_CFLAGS} x86_64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} x86_64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 arm.o: ${GENERIC_HFILES} ${REDHAT_HFILES} arm.c
-	cc -c ${CRASH_CFLAGS} arm.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} arm.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 s390.o: ${GENERIC_HFILES} ${IBM_HFILES} s390.c
-	cc -c ${CRASH_CFLAGS} s390.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} s390.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 s390x.o: ${GENERIC_HFILES} ${IBM_HFILES} s390x.c
-	cc -c ${CRASH_CFLAGS} s390x.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} s390x.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 s390dbf.o: ${GENERIC_HFILES} ${IBM_HFILES} s390dbf.c
-	cc -c ${CRASH_CFLAGS} s390dbf.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} s390dbf.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 s390_dump.o: ${GENERIC_HFILES} ${IBM_HFILES} s390_dump.c
-	cc -c ${CRASH_CFLAGS} s390_dump.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} s390_dump.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 netdump.o: ${GENERIC_HFILES} ${REDHAT_HFILES} netdump.c
-	cc -c ${CRASH_CFLAGS} netdump.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} netdump.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 netdump_daemon.o: ${GENERIC_HFILES} ${REDHAT_HFILES} netdump.c
-	cc -c ${CRASH_CFLAGS} -DDAEMON netdump.c -o netdump_daemon.o ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} -DDAEMON netdump.c -o netdump_daemon.o ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 diskdump.o: ${GENERIC_HFILES} ${REDHAT_HFILES} diskdump.c
-	cc -c ${CRASH_CFLAGS} diskdump.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} diskdump.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 makedumpfile.o: ${GENERIC_HFILES} ${REDHAT_HFILES} makedumpfile.c
-	cc -c ${CRASH_CFLAGS} makedumpfile.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} makedumpfile.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 xendump.o: ${GENERIC_HFILES} ${REDHAT_HFILES} xendump.c
-	cc -c ${CRASH_CFLAGS} xendump.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} xendump.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 kvmdump.o: ${GENERIC_HFILES} ${REDHAT_HFILES} kvmdump.c
-	cc -c ${CRASH_CFLAGS} kvmdump.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} kvmdump.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 qemu.o: ${GENERIC_HFILES} ${REDHAT_HFILES} qemu.c
-	cc -c ${CRASH_CFLAGS} qemu.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} qemu.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 qemu-load.o: ${GENERIC_HFILES} ${REDHAT_HFILES} qemu-load.c
-	cc -c ${CRASH_CFLAGS} qemu-load.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} qemu-load.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 sadump.o: ${GENERIC_HFILES} ${SADUMP_HFILES} sadump.c
-	cc -c ${CRASH_CFLAGS} sadump.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} sadump.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 extensions.o: ${GENERIC_HFILES} extensions.c
-	cc -c ${CRASH_CFLAGS} extensions.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} extensions.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 lkcd_x86_trace.o: ${GENERIC_HFILES} ${LKCD_TRACE_HFILES} lkcd_x86_trace.c 
-	cc -c ${CRASH_CFLAGS} lkcd_x86_trace.c -DREDHAT ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} lkcd_x86_trace.c -DREDHAT ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 unwind_x86_32_64.o: ${GENERIC_HFILES} ${UNWIND_HFILES} unwind_x86_32_64.c
-	cc -c ${CRASH_CFLAGS} unwind_x86_32_64.c -o unwind_x86_32_64.o ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} unwind_x86_32_64.c -o unwind_x86_32_64.o ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 unwind_arm.o: ${GENERIC_HFILES} ${UNWIND_HFILES} unwind_arm.c
-	cc -c ${CRASH_CFLAGS} unwind_arm.c -o unwind_arm.o ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} unwind_arm.c -o unwind_arm.o ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 unwind_v1.o: ${GENERIC_HFILES} ${UNWIND_HFILES} unwind.c unwind_decoder.c
-	cc -c ${CRASH_CFLAGS} unwind.c -DREDHAT -DUNWIND_V1 -o unwind_v1.o ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} unwind.c -DREDHAT -DUNWIND_V1 -o unwind_v1.o ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 unwind_v2.o: ${GENERIC_HFILES} ${UNWIND_HFILES} unwind.c unwind_decoder.c
-	cc -c ${CRASH_CFLAGS} unwind.c -DREDHAT -DUNWIND_V2 -o unwind_v2.o ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} unwind.c -DREDHAT -DUNWIND_V2 -o unwind_v2.o ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 unwind_v3.o: ${GENERIC_HFILES} ${UNWIND_HFILES} unwind.c unwind_decoder.c
-	cc -c ${CRASH_CFLAGS} unwind.c -DREDHAT -DUNWIND_V3 -o unwind_v3.o ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} unwind.c -DREDHAT -DUNWIND_V3 -o unwind_v3.o ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 lkcd_fix_mem.o: ${GENERIC_HFILES} ${LKCD_HFILES} lkcd_fix_mem.c
-	cc -c ${CRASH_CFLAGS} lkcd_fix_mem.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} lkcd_fix_mem.c -DMCLX ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 xen_hyper.o: ${GENERIC_HFILES} xen_hyper.c
-	cc -c ${CRASH_CFLAGS} xen_hyper.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} xen_hyper.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 xen_hyper_command.o: ${GENERIC_HFILES} xen_hyper_command.c
-	cc -c ${CRASH_CFLAGS} xen_hyper_command.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} xen_hyper_command.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 xen_hyper_global_data.o: ${GENERIC_HFILES} xen_hyper_global_data.c
-	cc -c ${CRASH_CFLAGS} xen_hyper_global_data.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} xen_hyper_global_data.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 xen_hyper_dump_tables.o: ${GENERIC_HFILES} xen_hyper_dump_tables.c
-	cc -c ${CRASH_CFLAGS} xen_hyper_dump_tables.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+	$(CC) -c ${CRASH_CFLAGS} xen_hyper_dump_tables.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
 ${PROGRAM}: force
 	@make --no-print-directory all
@@ -499,7 +505,7 @@ ${PROGRAM}d: daemon_deprecated make_configure
 	@make --no-print-directory daemon 
 
 daemon: ${DAEMON_OBJECT_FILES}
-	cc ${LDFLAGS} -o ${PROGRAM}d ${DAEMON_OBJECT_FILES} build_data.o -lz 
+	$(CC) ${LDFLAGS} -o ${PROGRAM}d ${DAEMON_OBJECT_FILES} build_data.o -lz 
 
 files: make_configure
 	@./configure -q -b
diff --git a/extensions/Makefile b/extensions/Makefile
index 17d4668..c5d04b1 100644
--- a/extensions/Makefile
+++ b/extensions/Makefile
@@ -22,7 +22,11 @@
 # the "standard" compile line.  If that compile line does not 
 # suffice, create a .mk file with the same prefix as the .c file,
 # and that makefile will be invoked. 
-# 
+#
+ 
+ifeq ($(CC), )
+CC = gcc
+endif
 
 CONTRIB_SO := $(patsubst %.c,%.so,$(wildcard *.c))
 
@@ -36,8 +40,8 @@ $(CONTRIB_SO): %.so: %.c defs.h
 	@if [ -f $*.mk ]; then \
 		make -f $*.mk; \
 	else \
-		echo "gcc -Wall -nostartfiles -shared -rdynamic -o $@ $*.c -fPIC -D$(TARGET) $(TARGET_CFLAGS) $(GDB_FLAGS)"; \
-		gcc -Wall -nostartfiles -shared -rdynamic -o $@ $*.c -fPIC -D$(TARGET) $(TARGET_CFLAGS) $(GDB_FLAGS); \
+		echo "$(CC) -Wall -nostartfiles -shared -rdynamic -o $@ $*.c -fPIC -D$(TARGET) $(TARGET_CFLAGS) $(GDB_FLAGS)"; \
+		$(CC) -Wall -nostartfiles -shared -rdynamic -o $@ $*.c -fPIC -D$(TARGET) $(TARGET_CFLAGS) $(GDB_FLAGS); \
 	fi
 
 clean:
diff --git a/extensions/sial.mk b/extensions/sial.mk
index f6be13f..3cb2b0a 100644
--- a/extensions/sial.mk
+++ b/extensions/sial.mk
@@ -9,6 +9,10 @@
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 
+ifeq ($(CC), )
+CC = gcc
+endif
+
 ifeq ($(TARGET), PPC64)
         TARGET_FLAGS = -D$(TARGET) -m64
 else
@@ -27,7 +31,7 @@ lib-sial:
 	cd libsial && make
         
 sial.so: ../defs.h sial.c lib-sial
-	gcc -g -I.. -Ilibsial -I../$(GDB)/bfd -I../$(GDB)/include -I../$(GDB)/gdb -I../$(GDB)/gdb/config -I../$(GDB)/gdb/common -I../$(GDB) -nostartfiles -shared -rdynamic -o sial.so sial.c -fPIC $(TARGET_FLAGS) $(GDB_FLAGS) -Llibsial -lsial 
+	$(CC) -g -I.. -Ilibsial -I../$(GDB)/bfd -I../$(GDB)/include -I../$(GDB)/gdb -I../$(GDB)/gdb/config -I../$(GDB)/gdb/common -I../$(GDB) -nostartfiles -shared -rdynamic -o sial.so sial.c -fPIC $(TARGET_FLAGS) $(GDB_FLAGS) -Llibsial -lsial 
 
 clean:
 	cd libsial && make clean
diff --git a/extensions/snap.mk b/extensions/snap.mk
index 8b48078..69df3e8 100644
--- a/extensions/snap.mk
+++ b/extensions/snap.mk
@@ -13,6 +13,10 @@
 # GNU General Public License for more details.
 #
 
+ifeq ($(CC), )
+CC = gcc
+endif
+
 ifeq ($(shell arch), i686)
   TARGET=X86
   TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64
@@ -43,4 +47,4 @@ endif
 all: snap.so
 	
 snap.so: $(INCDIR)/defs.h snap.c 
-	gcc -Wall -I$(INCDIR) -nostartfiles -shared -rdynamic -o snap.so snap.c -fPIC -D$(TARGET) $(TARGET_CFLAGS) $(GDB_FLAGS)
+	$(CC) -Wall -I$(INCDIR) -nostartfiles -shared -rdynamic -o snap.so snap.c -fPIC -D$(TARGET) $(TARGET_CFLAGS) $(GDB_FLAGS)
-- 
1.7.0.4


Date: Mon, 16 Apr 2012 19:10:19 +0900
Subject: [PATCH 3/5] make: add host_cross option

When make crash with cross compiler, must set host_cross option.

A member host_table.is_cross is implying whether host compiler is
for cross build or not according by new option.
Example in ARM case, target is x86 binary and may emulating arm's crash,
not wants cross compiler.
Although this is depending on compiler itself,
have to take care of possible differences in both CFLAGS.
Thus add explicit member.

Signed-off-by: Toshikazu Nakayama <nakayama.ts@xxxxxxxxxxxxxx>
---
 Makefile    |   20 ++++++++++++++------
 configure.c |   21 +++++++++++++++++----
 2 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/Makefile b/Makefile
index e7e468e..6bb1a5f 100644
--- a/Makefile
+++ b/Makefile
@@ -246,11 +246,19 @@ ifneq ($(target),)
 CONF_TARGET_FLAG="-t$(target)"
 endif
 
+# host_cross could be set on command line when invoking cross compiler.
+# Like: make target=ARM host_cross=X86
+# otherwise host will be the same as the build
+ifneq ($(host_cross),)
+CONF_HOST_FLAG="-h$(host_cross)"
+endif
+
 # To build the extensions library by default, uncomment the third command
 # line below.  Otherwise they can be built by entering "make extensions".
 
 all: make_configure
-	@./configure ${CONF_TARGET_FLAG} -p "RPMPKG=${RPMPKG}" -b
+	@./configure ${CONF_TARGET_FLAG} ${CONF_HOST_FLAG} \
+		-p "RPMPKG=${RPMPKG}" -b
 	@make --no-print-directory gdb_merge
 #	@make --no-print-directory extensions
 
@@ -294,7 +302,7 @@ make_configure: force
 	@cc ${CONF_FLAGS} -o configure configure.c ${WARNING_ERROR} ${WARNING_OPTIONS}
 
 clean: make_configure
-	@./configure ${CONF_TARGET_FLAG} -q -b
+	@./configure ${CONF_TARGET_FLAG} ${CONF_HOST_FLAG} -q -b
 	@make --no-print-directory do_clean
 
 do_clean:
@@ -313,15 +321,15 @@ unconfig: make_configure
 	@./configure -u
 
 warn: make_configure
-	@./configure ${CONF_TARGET_FLAG} -w -b
+	@./configure ${CONF_TARGET_FLAG} ${CONF_HOST_FLAG} -w -b
 	@make --no-print-directory gdb_merge
 
 Warn: make_configure
-	@./configure ${CONF_TARGET_FLAG} -W -b
+	@./configure ${CONF_TARGET_FLAG} ${CONF_HOST_FLAG} -W -b
 	@make --no-print-directory gdb_merge
 
 nowarn: make_configure
-	@./configure ${CONF_TARGET_FLAG} -n -b
+	@./configure ${CONF_TARGET_FLAG} ${CONF_HOST_FLAG} -n -b
 	@make --no-print-directory gdb_merge
 
 main.o: ${GENERIC_HFILES} main.c
@@ -611,7 +619,7 @@ dis:
 	objdump --disassemble --line-numbers ${PROGRAM} > ${PROGRAM}.dis
 
 extensions: make_configure
-	@./configure ${CONF_TARGET_FLAG} -q -b
+	@./configure ${CONF_TARGET_FLAG} ${CONF_HOST_FLAG} -q -b
 	@make --no-print-directory do_extensions
 
 do_extensions:
diff --git a/configure.c b/configure.c
index 63d3244..18b1fb3 100755
--- a/configure.c
+++ b/configure.c
@@ -116,6 +116,7 @@ static struct host_table {
 	int host;
 	const char *cflags;		/* TARGET_CFLAGS */
 	const char *gdb_conf_flags;	/* GDB_CONF_FLAGS */
+	int is_cross;
 } arm[] = {
 	{
 		.host = X86,
@@ -279,6 +280,7 @@ struct target_data {
 	char release[MAXSTRLEN];
 	struct stat statbuf;
 	const char *target_as_param;
+	const char *host_as_param;
 } target_data = { 0 }; 
 
 int
@@ -289,7 +291,7 @@ main(int argc, char **argv)
 
 	sp = setup_gdb_defaults();
 
-	while ((c = getopt(argc, argv, "gsqnWwubdr:p:P:t:")) > 0) {
+	while ((c = getopt(argc, argv, "gsqnWwubdr:p:P:t:h:")) > 0) {
 		switch (c) {
 		case 'q':
 			target_data.flags |= QUIET;
@@ -325,6 +327,9 @@ main(int argc, char **argv)
 		case 't':
 			target_data.target_as_param = optarg;
 			break;
+		case 'h':
+			target_data.host_as_param = optarg;
+			break;
 		}
 	}
 
@@ -362,7 +367,7 @@ get_current_configuration(struct supported_gdb_version *sp)
 	FILE *fp;
 	static char buf[512];
 	char *p;
-	int i, host, target;
+	int i, host, target, is_cross;
 
 #ifdef __alpha__
         target_data.target = ALPHA;
@@ -402,12 +407,20 @@ get_current_configuration(struct supported_gdb_version *sp)
 	/*
 	 * Check the requirements for host and target.
 	 */
-	host = target_data.host;
+	if (target_data.host_as_param) { /* cross compiler */
+		host = name_to_target((char *)target_data.host_as_param);
+		is_cross = TRUE;
+	} else {
+		host = target_data.host;
+		is_cross = FALSE;
+	}
 	if (target_data.target_as_param) {
 		target = name_to_target((char *)target_data.target_as_param);
 		if (target != host) {
 			for (i = 0; i < target_arch[target].num_hosts; i++)
-				if (target_arch[target].hosts[i].host == host)
+				if (target_arch[target].hosts[i].host == host &&
+				    target_arch[target].hosts[i].is_cross ==
+					is_cross)
 					break;
 			if (i == target_arch[target].num_hosts) {
 				fprintf(stderr,
-- 
1.7.0.4


Date: Tue, 17 Apr 2012 10:40:42 +0900
Subject: [PATCH 4/5] build_data: handle CC variable

Try getenv("CC") and if variable is set, do $(CC) --version instead of
gcc --version.

Signed-off-by: Toshikazu Nakayama <nakayama.ts@xxxxxxxxxxxxxx>
---
 configure.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/configure.c b/configure.c
index 18b1fb3..3883e81 100755
--- a/configure.c
+++ b/configure.c
@@ -1096,9 +1096,10 @@ count_chars(char *s, char c)
 void
 make_build_data(char *target)
 {
-        char *p;
+        char *p, *gcc;
         char hostname[MAXSTRLEN];
 	char progname[MAXSTRLEN];
+	char gccname[MAXSTRLEN];
 	char inbuf1[MAXSTRLEN];
 	char inbuf2[MAXSTRLEN];
 	char inbuf3[MAXSTRLEN];
@@ -1108,7 +1109,13 @@ make_build_data(char *target)
 
         fp1 = popen("date", "r");
         fp2 = popen("id", "r");
-	fp3 = popen("gcc --version", "r");
+	gcc = getenv("CC");
+	if (gcc == NULL)
+		fp3 = popen("gcc --version", "r");
+	else {
+		sprintf(gccname, "%s --version", gcc);
+		fp3 = popen(gccname, "r");
+	}
 
 	if ((fp4 = fopen("build_data.c", "w")) == NULL) {
 		perror("build_data.c");
-- 
1.7.0.4


Date: Mon, 16 Apr 2012 19:13:56 +0900
Subject: [PATCH 5/5] configure: handle cross compile with target=ppc host_cross=x86

By configuring gdb with --host=i686-pc-linux-gnu --target=powerpc-elf-linux,
gdb can generate powerpc target.
The cross build environs must be provided by private toolchain.

Signed-off-by: Toshikazu Nakayama <nakayama.ts@xxxxxxxxxxxxxx>
---
 configure.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/configure.c b/configure.c
index 3883e81..4b63294 100755
--- a/configure.c
+++ b/configure.c
@@ -139,7 +139,14 @@ static struct host_table {
 		.host = PPC64,
 		.cflags = "-m32 -D_FILE_OFFSET_BITS=64 -fPIC",
 		.gdb_conf_flags = "--target=ppc-elf-linux CFLAGS=-m32",
-	}
+	},
+	{
+		.host = X86,
+		.cflags = "-D_FILE_OFFSET_BITS=64",
+		.gdb_conf_flags = "--host=i686-pc-linux-gnu "
+				  "--target=powerpc-elf-linux",
+		.is_cross = TRUE,
+	},
 };
 
 static struct target_table {
-- 
1.7.0.4


--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/crash-utility

[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux