Index: driver/cfa.cc
===================================================================
--- driver/cfa.cc	(revision df8b87cd9365d6524523f96a72d7c7b83f13b735)
+++ driver/cfa.cc	(revision bbfd0e08bed66db0dd7f0435baca11031a2d4e96)
@@ -84,4 +84,8 @@
         return false;
 } //dirExists
+
+static inline string dir(const string & path) {
+	return path.substr(0, path.find_last_of('/'));
+}
 
 
@@ -119,4 +123,5 @@
 	bool m64 = false;                                    // -m64 flag
 	bool intree = false;
+	bool disttree = false;
 
 	const char *args[argc + 100];						// cfa command line values, plus some space for additional flags
@@ -178,4 +183,6 @@
 			} else if ( arg == "-in-tree" ) {
 				intree = true;
+			} else if ( arg == "-dist-tree" ) {
+				disttree = true;
 			} else if ( arg == "-compiler" ) {
 				// use the user specified compiler
@@ -372,17 +379,29 @@
 	string libdir = libbase + arch + "-" + config;
 
-	if ( ! nolib && ! dirExists( libdir ) ) {
-		cerr << argv[0] << " internal error, configuration " << config << " not installed." << endl;
-		cerr << "Was looking for " << libdir << endl;
-		libdir = libbase + arch + "-" + "nolib";
-	} // if
-
-	if ( ! dirExists( libdir ) ) {
-		cerr << argv[0] << " internal error, cannot find prelude directory." << endl;
-		cerr << "Was looking for " << libdir << endl;
-		exit( EXIT_FAILURE );
-	} // if
-
-	args[nargs] = ( *new string( string("-D__CFA_FLAG__=--prelude-dir=" ) + libdir + (intree ? "/prelude" : "")) ).c_str();
+	if (!disttree) {
+		if ( ! nolib && ! dirExists( libdir ) ) {
+			cerr << argv[0] << " internal error, configuration " << config << " not installed." << endl;
+			cerr << "Was looking for " << libdir << endl;
+			for(int i = 1; i < argc; i++) {
+				cerr << argv[i] << " ";
+			}
+			cerr << endl;
+			libdir = libbase + arch + "-" + "nolib";
+		} // if
+
+		if ( ! dirExists( libdir ) ) {
+			cerr << argv[0] << " internal error, cannot find prelude directory." << endl;
+			cerr << "Was looking for " << libdir << endl;
+			exit( EXIT_FAILURE );
+		} // if
+	} // if
+
+	if(disttree) {
+		args[nargs] = ( *new string( string("-D__CFA_FLAG__=--prelude-dir=" ) + dir(argv[0])) ).c_str();
+	} else if(intree) {
+		args[nargs] = ( *new string( string("-D__CFA_FLAG__=--prelude-dir=" ) + libdir + "/prelude") ).c_str();
+	} else {
+		args[nargs] = ( *new string( string("-D__CFA_FLAG__=--prelude-dir=" ) + libdir) ).c_str();
+	}
 	nargs += 1;
 
@@ -473,5 +492,12 @@
 
 	if ( Bprefix.length() == 0 ) {
-		Bprefix = ! intree ? installlibdir : srcdriverdir;
+		if(disttree) {
+			Bprefix = dir(argv[0]);
+		} else if(intree) {
+			Bprefix = srcdriverdir;
+		} else {
+			Bprefix = installlibdir;
+		}
+
 		if ( Bprefix[Bprefix.length() - 1] != '/' ) Bprefix += '/';
 		args[nargs] = ( *new string( string("-D__GCC_BPREFIX__=") + Bprefix ) ).c_str();
