Clean up OpenVMS support.

This avoids cluttering the source code with VMS-specific changes.

* include/freetype/internal/ftcalc.h [__VMS], src/base/ftcalc.c
  [vms_auto64_source]: Remove.

* builds/vms/patch_ftcalc.sed: New file.

* vms_make.com: Change macro definitions while this script is running; we
  use `GNU sed` to inject the necessary preprocessor code on the fly.
diff --git a/builds/vms/patch_ftcalc.sed b/builds/vms/patch_ftcalc.sed
new file mode 100644
index 0000000..7917418
--- /dev/null
+++ b/builds/vms/patch_ftcalc.sed
@@ -0,0 +1,4 @@
+/^# *undef FT_MulFix/ a\
+#  ifdef vms_auto64_source\
+#    define FT_MulFix FT_MulFix64__\
+#  endif
diff --git a/include/freetype/internal/ftcalc.h b/include/freetype/internal/ftcalc.h
index c6a79fb..dd33c56 100644
--- a/include/freetype/internal/ftcalc.h
+++ b/include/freetype/internal/ftcalc.h
@@ -100,12 +100,6 @@
   }
 
 
-#ifdef __VMS
-#  ifdef FT_MulFix
-#    undef FT_MulFix
-#  endif
-#endif
-
 #define FT_MulFix( a, b )  FT_MulFix_64( a, b )
 
 #elif !defined( FT_CONFIG_OPTION_NO_ASSEMBLER )
diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c
index b5e2cba..c30f132 100644
--- a/src/base/ftcalc.c
+++ b/src/base/ftcalc.c
@@ -41,9 +41,6 @@
   /* cancel inlining macro from internal/ftcalc.h */
 #ifdef FT_MulFix
 #  undef FT_MulFix
-#  ifdef vms_auto64_source
-#    define FT_MulFix FT_MulFix64__
-#  endif
 #endif
 
 
diff --git a/vms_make.com b/vms_make.com
index 805a0d9..92b34c4 100644
--- a/vms_make.com
+++ b/vms_make.com
@@ -480,21 +480,22 @@
 	cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c
 	pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl:
 	mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map
-	cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\
+	cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3,MACROREDEF))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\
 	$(MMS$TARGET_NAME)_64.c
-	clang $(CXXFLAGS) -o $(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c
+	clang $(CXXFLAGS) -Wno-macro-redefined\
+	-o $(MMS$TARGET_NAME)_64_cxx.obj $(MMS$TARGET_NAME)_64.c
 	delete $(MMS$TARGET_NAME)_64.c;*
 .else
 .c.obj :
 	cc$(CFLAGS)/warn=noinfo/point=32/list/show=all $(MMS$TARGET_NAME).c
 	pipe link/map/full/exec=nl: $(MMS$TARGET_NAME).obj | copy sys$input nl:
 	mc sys$library:vms_auto64 $(MMS$TARGET_NAME).map
-	cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\
+	cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3,MACROREDEF))/point=64/obj=$(MMS$TARGET_NAME)_64.obj\
 	$(MMS$TARGET_NAME)_64.c
 	delete $(MMS$TARGET_NAME)_64.c;*
 .endif
 
-OBJS=ftbase.obj,\
+OBJS=ftbase_vms.obj,\
      ftbbox.obj,\
      ftbdf.obj,\
      ftbitmap.obj,\
@@ -511,7 +512,7 @@
      fttype1.obj,\
      ftwinfnt.obj,ftpatent.obj,ftgxval.obj,ftotval.obj
 
-OBJS64=ftbase_64.obj,\
+OBJS64=ftbase_vms_64.obj,\
      ftbbox_64.obj,\
      ftbdf_64.obj,\
      ftbitmap_64.obj,\
@@ -528,7 +529,7 @@
      fttype1_64.obj,\
      ftwinfnt_64.obj,ftpatent_64.obj,ftgxval_64.obj,ftotval_64.obj
 
-OBJSCXX=ftbase_cxx.obj,\
+OBJSCXX=ftbase_vms_cxx.obj,\
      ftbbox_cxx.obj,\
      ftbdf_cxx.obj,\
      ftbitmap_cxx.obj,\
@@ -545,7 +546,7 @@
      fttype1_cxx.obj,\
      ftwinfnt_cxx.obj,ftpatent_cxx.obj,ftgxval_cxx.obj,ftotval_cxx.obj
 
-OBJSCXX32=ftbase_cxx32.obj,\
+OBJSCXX32=ftbase_vms_cxx32.obj,\
      ftbbox_cxx32.obj,\
      ftbdf_cxx32.obj,\
      ftbitmap_cxx32.obj,\
@@ -571,10 +572,37 @@
 	library [--.lib]freetype_cxx.olb $(OBJS64)
 .endif
 
-ftbase.obj : ftbase.c ftadvanc.c ftcalc.c ftcolor.c ftdbgmem.c fterrors.c\
+.ifdef X86
+ftbase_vms.obj : ftbase.c ftadvanc.c ftcalc.c_vms ftcolor.c ftdbgmem.c fterrors.c\
 	ftfntfmt.c ftgloadr.c fthash.c ftlcdfil.c ftmac.c ftobjs.c ftoutln.c\
 	ftpsprop.c ftrfork.c ftsnames.c ftstream.c fttrigon.c ftutil.c
+	pipe gsed -e "s/ftcalc.c/ftcalc.c_vms/" < ftbase.c > ftbase_vms.c
+	clang $(CXXFLAGS) -pointer-size=32 -o ftbase_vms_cxx32.obj ftbase_vms.c
+	clang $(CXXFLAGS) -o ftbase_vms_cxx.obj ftbase_vms.c
+	cc$(CFLAGS)/warn=noinfo/point=32/list/show=all ftbase_vms.c
+	pipe link/map/full/exec=nl: ftbase_vms.obj | copy sys$input nl:
+	mc sys$library:vms_auto64 ftbase_vms.map
+	cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3,MACROREDEF))/point=64/obj=ftbase_vms_64.obj\
+	ftbase_vms_64.c
+	clang $(CXXFLAGS) -Wno-macro-redefined\
+	-o ftbase_vms_64_cxx.obj ftbase_vms_64.c
+	delete ftbase_vms_64.c;*
+.else
+ftbase_vms.obj : ftbase.c ftadvanc.c ftcalc.c_vms ftcolor.c ftdbgmem.c fterrors.c\
+	ftfntfmt.c ftgloadr.c fthash.c ftlcdfil.c ftmac.c ftobjs.c ftoutln.c\
+	ftpsprop.c ftrfork.c ftsnames.c ftstream.c fttrigon.c ftutil.c
+	pipe gsed -e "s/ftcalc.c/ftcalc.c_vms/" < ftbase.c > ftbase_vms.c
+	cc$(CFLAGS)/warn=noinfo/point=32/list/show=all ftbase_vms.c
+	pipe link/map/full/exec=nl: ftbase_vms.obj | copy sys$input nl:
+	mc sys$library:vms_auto64 ftbase_vms.map
+	cc$(CFLAGS)/warn=(noinfo,disable=(MAYLOSEDATA3,MACROREDEF))/point=64/obj=ftbase_vms_64.obj\
+	ftbase_vms_64.c
+	delete ftbase_vms_64.c;*
+	delete ftbase_vms.c;*
+.endif
 
+ftcalc.c_vms : ftcalc.c
+	pipe gsed -f [--.builds.vms]patch_ftcalc.sed < ftcalc.c > ftcalc.c_vms
 
 # EOF
 $ eod
@@ -2158,9 +2186,9 @@
 $       write sys$output "Unsupported compiler choice ''cc_com' ignored"
 $       write sys$output "Use DECC, VAXC, or GNUC instead"
 $     else
-$     	if cc_com .eqs. "DECC" then its_decc = true
-$     	if cc_com .eqs. "VAXC" then its_vaxc = true
-$     	if cc_com .eqs. "GNUC" then its_gnuc = true
+$       if cc_com .eqs. "DECC" then its_decc = true
+$       if cc_com .eqs. "VAXC" then its_vaxc = true
+$       if cc_com .eqs. "GNUC" then its_gnuc = true
 $     endif
 $   endif
 $   if f$locate("MAKE=",cparm) .lt. f$length(cparm)