Index: configure
===================================================================
--- configure	(revision bf71cfdb7285490eee552b461158846f626cc52f)
+++ configure	(revision 25a9b5adefaebb173fab189e8ba954167858e6b7)
@@ -3388,4 +3388,19 @@
 
 
+cat >>confdefs.h <<_ACEOF
+#define TOP_SRCDIR "$ac_pwd/$ac_confdir/"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define TOP_BUILDDIR "$ac_pwd/"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PRELUDE_BUILDDIR "$ac_pwd/libcfa/prelude/"
+_ACEOF
+
+
 # Flag variables needed to build in tree
 LIBCFA_SRC='$(top_srcdir)/libcfa/src'
Index: configure.ac
===================================================================
--- configure.ac	(revision bf71cfdb7285490eee552b461158846f626cc52f)
+++ configure.ac	(revision 25a9b5adefaebb173fab189e8ba954167858e6b7)
@@ -178,4 +178,7 @@
 AC_SUBST(CFACC)
 AC_SUBST(CFACPP)
+AC_DEFINE_UNQUOTED(TOP_SRCDIR, "$ac_pwd/$ac_confdir/", [Top src directory])
+AC_DEFINE_UNQUOTED(TOP_BUILDDIR, "$ac_pwd/", [Top build directory])
+AC_DEFINE_UNQUOTED(PRELUDE_BUILDDIR, "$ac_pwd/libcfa/prelude/", [Directory where the prelude files are built])
 
 # Flag variables needed to build in tree
Index: src/config.h.in
===================================================================
--- src/config.h.in	(revision bf71cfdb7285490eee552b461158846f626cc52f)
+++ src/config.h.in	(revision 25a9b5adefaebb173fab189e8ba954167858e6b7)
@@ -141,4 +141,7 @@
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
+
+/* Directory where the prelude files are built */
+#undef PRELUDE_BUILDDIR
 
 /* If using the C implementation of alloca, define if you know the
@@ -152,4 +155,10 @@
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
+
+/* Top build directory */
+#undef TOP_BUILDDIR
+
+/* Top src directory */
+#undef TOP_SRCDIR
 
 /* Version number of package */
Index: src/main.cc
===================================================================
--- src/main.cc	(revision bf71cfdb7285490eee552b461158846f626cc52f)
+++ src/main.cc	(revision 25a9b5adefaebb173fab189e8ba954167858e6b7)
@@ -208,10 +208,10 @@
 
 			// Read to gcc builtins, if not generating the cfa library
-			FILE * gcc_builtins = fopen( libcfap | treep ? "../prelude/gcc-builtins.cf" : CFA_LIBDIR "/gcc-builtins.cf", "r" );
+			FILE * gcc_builtins = fopen( libcfap | treep ? PRELUDE_BUILDDIR "/gcc-builtins.cf" : CFA_LIBDIR "/gcc-builtins.cf", "r" );
 			assertf( gcc_builtins, "cannot open gcc-builtins.cf\n" );
 			parse( gcc_builtins, LinkageSpec::Compiler );
 
 			// read the extra prelude in, if not generating the cfa library
-			FILE * extras = fopen( libcfap | treep ? "../prelude/extras.cf" : CFA_LIBDIR "/extras.cf", "r" );
+			FILE * extras = fopen( libcfap | treep ? PRELUDE_BUILDDIR "/extras.cf" : CFA_LIBDIR "/extras.cf", "r" );
 			assertf( extras, "cannot open extras.cf\n" );
 			parse( extras, LinkageSpec::BuiltinC );
@@ -219,10 +219,10 @@
 			if ( ! libcfap ) {
 				// read the prelude in, if not generating the cfa library
-				FILE * prelude = fopen( treep ? "../prelude/prelude.cf" : CFA_LIBDIR "/prelude.cf", "r" );
+				FILE * prelude = fopen( treep ? PRELUDE_BUILDDIR "/prelude.cf" : CFA_LIBDIR "/prelude.cf", "r" );
 				assertf( prelude, "cannot open prelude.cf\n" );
 				parse( prelude, LinkageSpec::Intrinsic );
 
 				// Read to cfa builtins, if not generating the cfa library
-				FILE * builtins = fopen( libcfap | treep ? "../prelude/builtins.cf" : CFA_LIBDIR "/builtins.cf", "r" );
+				FILE * builtins = fopen( libcfap | treep ? PRELUDE_BUILDDIR "/builtins.cf" : CFA_LIBDIR "/builtins.cf", "r" );
 				assertf( builtins, "cannot open builtins.cf\n" );
 				parse( builtins, LinkageSpec::BuiltinCFA );
@@ -348,5 +348,5 @@
 		PASS( "codegen", CodeGen::generate( translationUnit, *output, ! noprotop, prettycodegenp, true, linemarks ) );
 
-		CodeGen::FixMain::fix( *output, treep ? "../prelude/bootloader.c" : CFA_LIBDIR "/bootloader.c" );
+		CodeGen::FixMain::fix( *output, treep ? PRELUDE_BUILDDIR "/bootloader.c" : CFA_LIBDIR "/bootloader.c" );
 		if ( output != &cout ) {
 			delete output;
Index: tests/Makefile.in
===================================================================
--- tests/Makefile.in	(revision bf71cfdb7285490eee552b461158846f626cc52f)
+++ tests/Makefile.in	(revision 25a9b5adefaebb173fab189e8ba954167858e6b7)
@@ -313,6 +313,6 @@
 # however, here it is more complicated because it must match the dependencies based on how
 # they are generated by gcc
-headers = $(shell find $(top_srcdir)/src/libcfa -type f ! -name "*.*")
-headers_real = $(shell realpath --relative-to=$(top_srcdir)/src/libcfa $(headers))
+headers = $(shell find $(top_srcdir)/libcfa/src -type f ! -name "*.*")
+headers_real = $(shell realpath --relative-to=$(top_srcdir)/libcfa/src $(headers))
 headers_deps = $(addprefix %/, $(headers_real))
 all: all-am
