--- a/Makefile
+++ b/Makefile
@@ -7,6 +7,7 @@ NO_SELECT = 0
 
 # libpq config
 PG_CONFIG = pg_config
+PQINCSERVER = $(shell $(PG_CONFIG) --includedir-server)
 PQINC = $(shell $(PG_CONFIG) --includedir)
 PQLIB = $(shell $(PG_CONFIG) --libdir)
 
@@ -21,7 +22,9 @@ SRCS = src/cluster.c src/execute.c src/f
 OBJS = src/scanner.o src/parser.tab.o $(SRCS:.c=.o)
 DATA_built = plproxy.sql
 EXTRA_CLEAN = src/scanner.[ch] src/parser.tab.[ch] plproxy.sql.in
-PG_CPPFLAGS = -I$(PQINC) -DNO_SELECT=$(NO_SELECT)
+# Server include must come before client include, because there could
+# be mismatching libpq-dev and postgresql-server-dev installed.
+PG_CPPFLAGS = -I$(PQINCSERVER) -I$(PQINC) -DNO_SELECT=$(NO_SELECT) -I$(VPATH)/src
 SHLIB_LINK = -L$(PQLIB) -lpq
 
 TARNAME = plproxy-$(PLPROXY_VERSION)
@@ -67,10 +70,14 @@ src/scanner.o: src/parser.tab.h
 src/parser.tab.h: src/parser.tab.c
 
 src/parser.tab.c: src/parser.y
-	cd src; $(BISON) -d parser.y
+	test -d src || mkdir src
+	test -e src/parser.y || ln -s $(VPATH)/src/parser.y src
+	$(BISON) -b src/parser -d src/parser.y
 
 src/scanner.c: src/scanner.l
-	cd src; $(FLEX) -oscanner.c scanner.l
+	test -d src || mkdir src
+	test -e src/scanner.l || ln -s $(VPATH)/src/scanner.l src
+	$(FLEX) -osrc/scanner.c src/scanner.l
 
 plproxy.sql.in: $(PLPROXY_SQL)
 	cat $^ > $@
