diff --git a/src/build/Common.gmake b/src/build/Common.gmake
index 7180d7dad715617ef4e2698aacad108eb2de7524..adececc56a61ba2ddee4b17c8cbc26d5a5fb6a20 100644
--- a/src/build/Common.gmake
+++ b/src/build/Common.gmake
@@ -68,6 +68,7 @@
 #  OBJODIR			- Object output dir										#
 #  LIBODIR			- Library output dir									#
 #  EXEODIR			- Executable output dir									#
+#  SRCODIR			- Source code output dir								#
 #  DEBUG			- Set for debug builds									#
 #  RELEASE			- Set for release builds								#
 #					  One of DEBUG or RELEASE is always set!				#
@@ -273,6 +274,7 @@ LIBODIR :=	$(CCPRE).$(machine).lib.$(BUILDPATH)
 OBJODIR :=	$(CCPRE).$(machine).obj.$(BUILDPATH)
 MTOBJODIR :=	$(CCPRE).$(machine).obj.$(BUILDPATH)-mt
 EXEODIR :=	$(CCPRE).$(machine).exe.$(BUILDPATH)
+SRCODIR :=	$(CCPRE).$(machine).src.$(BUILDPATH)
 LDFLAGS	+=	-L$(LIBODIR)
 
 ifeq ($(os),openbsd)
@@ -487,6 +489,7 @@ depend:
 	$(QUIET)$(DELETE) $(MTOBJODIR)/.depend
 	$(QUIET)$(DELETE) $(LIBODIR)/.depend
 	$(QUIET)$(DELETE) $(EXEODIR)/.depend
+	$(QUIET)$(DELETE) $(SRCODIR)/.depend
 	$(QUIET)$(MAKE) BUILD_DEPENDS=FORCE
 
 FORCE:
@@ -495,10 +498,12 @@ FORCE:
 -include $(OBJODIR)/.depend
 -include $(LIBODIR)/.depend
 -include $(EXEODIR)/.depend
+-include $(SRCODIR)/.depend
 -include $(MTOBJODIR)/*.d
 -include $(OBJODIR)/*.d
 -include $(LIBODIR)/*.d
 -include $(EXEODIR)/*.d
+-include $(SRCODIR)/*.d
 
 $(XPDEV_LIB): xpdev
 xpdev:
diff --git a/src/build/rules.mk b/src/build/rules.mk
index 6c5aaabee0b80d96f642eea70e84b6ff7f6ca165..684b81d6a74ec906bdd4a91bfaaacc3032eafe7e 100644
--- a/src/build/rules.mk
+++ b/src/build/rules.mk
@@ -16,6 +16,9 @@ $(LIBODIR):
 $(EXEODIR):
 	$(QUIET)$(IFNOTEXIST) mkdir $(EXEODIR)
 
+$(SRCODIR):
+	$(QUIET)$(IFNOTEXIST) mkdir $(SRCODIR)
+
 clean:
 clean:
 	@echo Deleting $(OBJODIR)$(DIRSEP)
@@ -26,3 +29,5 @@ clean:
 	-$(QUIET)$(DELETE) $(LIBODIR)$(DIRSEP)*
 	@echo Deleting $(EXEODIR)$(DIRSEP)
 	-$(QUIET)$(DELETE) $(EXEODIR)$(DIRSEP)*
+	@echo Deleting $(SRCODIR)$(DIRSEP)
+	-$(QUIET)$(DELETE) $(SRCODIR)$(DIRSEP)*
diff --git a/src/conio/Common.make b/src/conio/Common.make
index 9ce1653e2f728f2c044ac4f62b8becca80953a21..b9d627dd25caba969b2fa3b8612ec15c7ad8c3fd 100644
--- a/src/conio/Common.make
+++ b/src/conio/Common.make
@@ -1,5 +1,5 @@
 CIOLIB-MT	=	$(CIOLIB_SRC)$(DIRSEP)$(LIBODIR)$(DIRSEP)$(LIBPREFIX)ciolib_mt$(LIBFILE)
 
-CIOLIB-MT_CFLAGS	=	-I$(CIOLIB_SRC)
+CIOLIB-MT_CFLAGS	=	-I$(CIOLIB_SRC) -I$(CIOLIB_SRC)$(DIRSEP)$(SRCODIR)
 CIOLIB-MT_LDFLAGS	=	-L$(CIOLIB_SRC)$(DIRSEP)$(LIBODIR)
 CIOLIB-MT_LIBS		=	$(UL_PRE)ciolib_mt$(UL_SUF)
diff --git a/src/conio/GNUmakefile b/src/conio/GNUmakefile
index 82e045acbc9f43a535999df5204e0f31d4b05182..c0726a1c81ae118d43d678b13b4338aff512f6e2 100644
--- a/src/conio/GNUmakefile
+++ b/src/conio/GNUmakefile
@@ -3,6 +3,7 @@ SRC_ROOT = ..
 include $(SRC_ROOT)/build/Common.gmake	# defines clean and output directory rules
 
 CFLAGS += $(XPDEV-MT_CFLAGS) $(HASH_CFLAGS) $(ENCODE_CFLAGS) $(CIOLIB-MT_CFLAGS)
+VPATH = $(SRCODIR)
 
 ifeq ($(os),win32)
  ifndef WITHOUT_GDI
@@ -48,7 +49,8 @@ endif
 
 
 # CIOLIB Library Link Rule
-$(CIOLIB-MT_BUILD): $(MTOBJODIR) $(OBJS) $(CIOLIB_INTERPOLATE_TARGET)
+$(CIOLIB-MT_BUILD): $(MTOBJODIR) $(OBJS) $(CIOLIB_INTERPOLATE_TARGET) $(MTOBJODIR)$(DIRSEP)rgbmap$(OFILE)
+
 	@echo Creating $@ ...
 	$(QUIET)$(AR) rc $@ $(OBJS)
 	$(QUIET)$(RANLIB) $@
@@ -69,13 +71,13 @@ endif
 
 $(EXEODIR)$(DIRSEP)genmap$(EXEFILE): $(EXEODIR)
 
-rgbmap.s: $(EXEODIR)$(DIRSEP)genmap$(EXEFILE)
+$(SRCODIR)$(DIRSEP)rgbmap.s: $(EXEODIR)$(DIRSEP)genmap$(EXEFILE) $(SRCODIR)
 	@echo Creating $@...
-	$(QUIET)$(EXEODIR)$(DIRSEP)genmap$(EXEFILE) $(os)
+	$(QUIET)$(EXEODIR)$(DIRSEP)genmap$(EXEFILE) $(os) $(SRCODIR)
 
-rgbmap.h: rgbmap.s
+$(SRCODIR)$(DIRSEP)rgbmap.h: $(SRCODIR)$(DIRSEP)rgbmap.s
 
-$(MTOBJODIR)$(DIRSEP)rgbmap$(OFILE): rgbmap.s rgbmap.h
+$(MTOBJODIR)$(DIRSEP)rgbmap$(OFILE): $(SRCODIR)$(DIRSEP)rgbmap.s $(SRCODIR)$(DIRSEP)rgbmap.h
 
 $(EXEODIR)$(DIRSEP)genmap$(EXEFILE): genmap.c
 	@echo Compiling $@...
diff --git a/src/conio/genmap.c b/src/conio/genmap.c
index ef71103749cdd4047e4671c3b01cd56cd76d74ed..150aed5c9ff468d910d3e0ab3e47f8bf8641a9fe 100644
--- a/src/conio/genmap.c
+++ b/src/conio/genmap.c
@@ -1,4 +1,5 @@
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <inttypes.h>
 
@@ -56,12 +57,22 @@ init_r2y(void)
 int
 main(int argc, char **argv)
 {
-	FILE *s = fopen("rgbmap.s", "w");
-	FILE *h = fopen("rgbmap.h", "w");
-	FILE *r = fopen("r2y.bin", "wb");
-	FILE *y = fopen("y2r.bin", "wb");
+	FILE *s, *h, *r, *y;
+	char path[1024];
 	char *mangle = "";
 
+	if (argc != 3) {
+		fprintf(stderr, "Usage: %s <os> <path>\n", argv[0]);
+		return EXIT_FAILURE;
+	}
+	sprintf(path, "%s/rgbmap.s", argv[2]);
+	s = fopen(path, "w");
+	sprintf(path, "%s/rgbmap.h", argv[2]);
+	h = fopen(path, "w");
+	sprintf(path, "%s/r2y.bin", argv[2]);
+	r = fopen(path, "wb");
+	sprintf(path, "%s/y2r.bin", argv[2]);
+	y = fopen(path, "wb");
 	init_r2y();
 	if (argc > 1 && strcmp(argv[1], "win32") == 0)
 		mangle = "_";
@@ -91,5 +102,5 @@ main(int argc, char **argv)
 	fclose(h);
 	fclose(r);
 	fclose(y);
-	return 0;
+	return EXIT_SUCCESS;
 }