Index: /trunk/psModules/configure.ac
===================================================================
--- /trunk/psModules/configure.ac	(revision 11249)
+++ /trunk/psModules/configure.ac	(revision 11250)
@@ -99,4 +99,11 @@
 AC_CHECK_PROG([doxygen], [doxygen], [true], [false])
 AM_CONDITIONAL(DOXYGEN, test x$doxygen = xtrue)
+
+dnl ------------------------------------------------------------
+
+AC_PATH_PROG([ERRORCODES], [psParseErrorCodes], [missing])
+if test "$ERRORCODES" = "missing" ; then
+  AC_MSG_ERROR([psParseErrorCodes is required])
+fi
 
 dnl ------------------ kapa,libkapa options -------------------------
Index: /trunk/psModules/src/config/Makefile.am
===================================================================
--- /trunk/psModules/src/config/Makefile.am	(revision 11249)
+++ /trunk/psModules/src/config/Makefile.am	(revision 11250)
@@ -7,5 +7,6 @@
     pmConfigRecipes.c \
     pmConfigCamera.c \
-    pmVersion.c
+    pmVersion.c \
+    pmErrorCodes.c
 
 pkginclude_HEADERS = \
@@ -13,5 +14,16 @@
     pmConfigRecipes.h \
     pmConfigCamera.h \
-    pmVersion.h
+    pmVersion.h \
+    pmErrorCodes.h
 
 CLEANFILES = *~
+
+# Error codes.
+BUILT_SOURCES = pmErrorCodes.h pmErrorCodes.c
+CLEANFILES = pmErrorCodes.h pmErrorCodes.c
+
+pmErrorCodes.h : pmErrorCodes.dat pmErrorCodes.h.in
+	$(ERRORCODES) --data=pmErrorCodes.dat --outdir=. pmErrorCodes.h
+
+pmErrorCodes.c : pmErrorCodes.dat pmErrorCodes.c.in pmErrorCodes.h
+	$(ERRORCODES) --data=pmErrorCodes.dat --outdir=. pmErrorCodes.c
Index: /trunk/psModules/src/config/pmErrorCodes.c.in
===================================================================
--- /trunk/psModules/src/config/pmErrorCodes.c.in	(revision 11250)
+++ /trunk/psModules/src/config/pmErrorCodes.c.in	(revision 11250)
@@ -0,0 +1,26 @@
+/*
+ * The line
+    { PM_ERR_$X{ErrorCode}, "$X{ErrorDescription}"},
+ * (without the Xs)
+ * will be replaced by values from errorCodes.dat
+ */
+#include "pslib.h"
+#include "pmErrorCodes.h"
+
+void pmErrorRegister(void)
+{
+    static psErrorDescription errors[] = {
+       { PM_ERR_BASE, "First value we use; lower values belong to psLib" },
+       { PM_ERR_${ErrorCode}, "${ErrorDescription}"},
+    };
+    static int nerror = PM_ERR_NERROR - PM_ERR_BASE; // number of values in enum
+
+    for (int i = 0; i < nerror; i++) {
+       psErrorDescription *tmp = psAlloc(sizeof(psErrorDescription));
+       p_psMemSetPersistent(tmp, true);
+       *tmp = errors[i];
+       psErrorRegister(tmp, 1);
+       psFree(tmp);			/* it's on the internal list */
+    }
+    nerror = 0;			                // don't register more than once
+}
Index: /trunk/psModules/src/config/pmErrorCodes.dat
===================================================================
--- /trunk/psModules/src/config/pmErrorCodes.dat	(revision 11250)
+++ /trunk/psModules/src/config/pmErrorCodes.dat	(revision 11250)
@@ -0,0 +1,18 @@
+#
+# This file is used to generate psphotErrorClasses.h
+#
+BASE = 512		First value we use; lower values belong to psLib
+UNKNOWN			Unknown PM error code
+PHOTOM			Problem in photometry
+ASTROM			Problem in astrometry
+CAMERA			Problem in camera
+CONCEPTS		Problem in concepts
+IMCOMBINE		Problem in imcombine
+OBJECTS			Problem in objects
+SKY			Problem in sky
+# these errors correspond to standard exit conditions
+ARGUMENTS               Incorrect arguments
+SYS                     System error
+CONFIG                  Problem in configure files
+PROG                    Programming error
+DATA                    invalid data
Index: /trunk/psModules/src/config/pmErrorCodes.h.in
===================================================================
--- /trunk/psModules/src/config/pmErrorCodes.h.in	(revision 11250)
+++ /trunk/psModules/src/config/pmErrorCodes.h.in	(revision 11250)
@@ -0,0 +1,18 @@
+#if !defined(PM_ERROR_CODES_H)
+#define PM_ERROR_CODES_H
+/*
+ * The line
+ *  PM_ERR_$X{ErrorCode},
+ * (without the X)
+ *
+ * will be replaced by values from errorCodes.dat
+ */
+typedef enum {
+    PM_ERR_BASE = 512,
+    PM_ERR_${ErrorCode},
+    PM_ERR_NERROR
+} pmErrorCode;
+
+void pmErrorRegister(void);
+
+#endif
