changeset 21247:7be239ae42c8

merge sparse-mk-ops.awk and mk-ops.awk scripts * mx-ops.awk: Merge with sparse-mk-ops.awk. Generate a single output file at a time and always write to stdout. * sparse-mk-ops.awk: Delete. * liboctave/module.mk, liboctave/operators/module.mk: Adapt rules. * liboctave/operators/config-ops.sh: Update for modified mk-ops.awk script. * mx-ops, smx-ops, vx-ops: Improve comments.
author John W. Eaton <jwe@octave.org>
date Thu, 11 Feb 2016 02:36:54 -0500
parents 101489515a70
children 5ddc9b61a0c4
files liboctave/module.mk liboctave/operators/config-ops.sh liboctave/operators/mk-ops.awk liboctave/operators/module.mk liboctave/operators/mx-ops liboctave/operators/smx-ops liboctave/operators/sparse-mk-ops.awk liboctave/operators/vx-ops
diffstat 8 files changed, 336 insertions(+), 423 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/module.mk	Wed Feb 10 17:42:51 2016 -0800
+++ b/liboctave/module.mk	Thu Feb 11 02:36:54 2016 -0500
@@ -23,15 +23,12 @@
 octlib_LTLIBRARIES += liboctave/liboctave.la
 
 BUILT_INCS = \
-  liboctave/operators/mx-ops.h \
-  liboctave/operators/smx-ops.h \
-  liboctave/operators/vx-ops.h \
-  $(LIBOCTAVE_OPT_INC) \
-  $(MX_OP_INC) \
-  $(VX_OP_INC) \
-  $(SMX_OP_INC)
+  $(BUILT_LIBOCTAVE_OPERATORS_INC) \
+  $(LIBOCTAVE_OPT_INC)
 
-BUILT_SOURCES += $(BUILT_INCS)
+BUILT_SOURCES += \
+  $(BUILT_INCS) \
+  $(BUILT_LIBOCTAVE_OPERATORS_SOURCES)
 
 octinclude_HEADERS += \
   $(ARRAY_INC) \
@@ -43,8 +40,7 @@
   $(OTHER_INC) \
   $(LIBOCTAVE_TEMPLATE_SRC)
 
-nodist_octinclude_HEADERS += \
-  $(BUILT_INCS)
+nodist_octinclude_HEADERS += $(BUILT_INCS)
 
 ## C++ files that are #included, not compiled
 OTHER_INC =
--- a/liboctave/operators/config-ops.sh	Wed Feb 10 17:42:51 2016 -0800
+++ b/liboctave/operators/config-ops.sh	Thu Feb 11 02:36:54 2016 -0500
@@ -27,13 +27,12 @@
 liboctave_dir="$top_srcdir/liboctave/operators"
 
 mk_ops="$liboctave_dir/mk-ops.awk"
-sparse_mk_ops="$liboctave_dir/sparse-mk-ops.awk"
 
 case "$obj_type" in
   vx | all)
     case "$src_type" in
       inc | all)
-        VX_INC=$($AWK -f $mk_ops prefix=vx list_h_files=1 $liboctave_dir/vx-ops)
+        VX_INC=$($AWK -f $mk_ops -v prefix=vx -v list_h_files=1 $liboctave_dir/vx-ops)
         echo "VX_OP_INC = $VX_INC" > $liboctave_dir/vx-op-inc.mk-t
         $move_if_change $liboctave_dir/vx-op-inc.mk-t $liboctave_dir/vx-op-inc.mk
       ;;
@@ -45,7 +44,7 @@
   vx | all)
     case "$src_type" in
       src | all)
-        VX_SRC=$($AWK -f $mk_ops prefix=vx list_cc_files=1 $liboctave_dir/vx-ops)
+        VX_SRC=$($AWK -f $mk_ops -v prefix=vx -v list_cc_files=1 $liboctave_dir/vx-ops)
         echo "VX_OP_SRC = $VX_SRC" > $liboctave_dir/vx-op-src.mk-t
         $move_if_change $liboctave_dir/vx-op-src.mk-t $liboctave_dir/vx-op-src.mk
       ;;
@@ -57,7 +56,7 @@
   mx | all)
     case "$src_type" in
       inc | all)
-        MX_INC=$($AWK -f $mk_ops prefix=mx list_h_files=1 $liboctave_dir/mx-ops)
+        MX_INC=$($AWK -f $mk_ops -v prefix=mx -v list_h_files=1 $liboctave_dir/mx-ops)
         echo "MX_OP_INC = $MX_INC" > $liboctave_dir/mx-op-inc.mk-t
         $move_if_change $liboctave_dir/mx-op-inc.mk-t $liboctave_dir/mx-op-inc.mk
       ;;
@@ -69,7 +68,7 @@
   mx | all)
     case "$src_type" in
       src | all)
-        MX_SRC=$($AWK -f $mk_ops prefix=mx list_cc_files=1 $liboctave_dir/mx-ops)
+        MX_SRC=$($AWK -f $mk_ops -v prefix=mx -v list_cc_files=1 $liboctave_dir/mx-ops)
         echo "MX_OP_SRC = $MX_SRC" > $liboctave_dir/mx-op-src.mk-t
         $move_if_change $liboctave_dir/mx-op-src.mk-t $liboctave_dir/mx-op-src.mk
       ;;
@@ -81,7 +80,7 @@
   smx | all)
     case "$src_type" in
       inc | all)
-        SMX_INC=$($AWK -f $sparse_mk_ops prefix=smx list_h_files=1 $liboctave_dir/smx-ops)
+        SMX_INC=$($AWK -f $mk_ops -v prefix=smx -v list_h_files=1 $liboctave_dir/smx-ops)
         echo "SMX_OP_INC = $SMX_INC" > $liboctave_dir/smx-op-inc.mk-t
         $move_if_change $liboctave_dir/smx-op-inc.mk-t $liboctave_dir/smx-op-inc.mk
       ;;
@@ -93,7 +92,7 @@
   smx | all)
     case "$src_type" in
       src | all)
-        SMX_SRC=$($AWK -f $sparse_mk_ops prefix=smx list_cc_files=1 $liboctave_dir/smx-ops)
+        SMX_SRC=$($AWK -f $mk_ops -v prefix=smx -v list_cc_files=1 $liboctave_dir/smx-ops)
         echo "SMX_OP_SRC = $SMX_SRC" > $liboctave_dir/smx-op-src.mk-t
         $move_if_change $liboctave_dir/smx-op-src.mk-t $liboctave_dir/smx-op-src.mk
       ;;
--- a/liboctave/operators/mk-ops.awk	Wed Feb 10 17:42:51 2016 -0800
+++ b/liboctave/operators/mk-ops.awk	Thu Feb 11 02:36:54 2016 -0500
@@ -19,25 +19,69 @@
 BEGIN {
   declare_types = 0;
   generate_ops = 0;
+  op_class = "";
+  sparse = 0;
   ntypes = 0;
-} {
-  if (NR == 1 && make_inclusive_header)
+  make_inclusive_header = 0;
+  make_header = 0;
+  make_source = 0;
+
+  if (build_file)
     {
-      print "// DO NOT EDIT -- generated by mk-ops";
-      tmp = make_inclusive_header;
-      gsub (/[\.-]/, "_", tmp);
-      printf ("#if ! defined (octave_%s)\n", tmp);
-      printf ("#define octave_%s 1\n", tmp);
-      print "#include \"octave-config.h\"";
+      if (build_file == "mx-ops.h" || build_file == "smx-ops.h" || build_file == "vx-ops.h")
+        {
+          make_inclusive_header = 1;
+
+          print "// DO NOT EDIT -- generated by mk-ops.awk";
+          tmp = build_file;
+          prefix = substr (tmp, 1, index (tmp, "-")-1);
+          gsub (/[\.-]/, "_", tmp);
+          printf ("#if ! defined (octave_%s)\n", tmp);
+          printf ("#define octave_%s 1\n", tmp);
+          print "#include \"octave-config.h\"";
+        }
+      else
+        {
+          if (match (build_file, /\.h$/))
+            {
+              make_header = 1;
+
+              tmp = substr (build_file, 1, length (build_file)-2);
+            }
+          else if (match (build_file, /\.cc$/))
+            {
+              make_source = 1;
+
+              tmp = substr (build_file, 1, length (build_file)-3);
+            }
+
+          prefix = substr (tmp, 1, index (tmp, "-")-1);
+          tmp = substr (tmp, index (tmp, "-")+1);
+          lhs_arg = substr (tmp, 1, index (tmp, "-")-1);
+          rhs_arg = substr (tmp, index (tmp, "-")+1);
+        }
     }
 }
 /^#/ {
   if ($2 == "types")
     declare_types = 1;
-  else if ($2 == "ops")
+  else if ($3 == "operators")
     {
+      op_class = $2;
       generate_ops = 1;
       declare_types = 0;
+
+      if (op_class == "vector")
+        sparse = 0;
+      else if (op_class == "full-matrix")
+        sparse = 0;
+      else if (op_class == "sparse-matrix")
+        sparse = 1;
+      else
+        {
+          printf ("unrecognized object type: %s", op_class);
+          exit (1);
+        }
     }
   next;
 } {
@@ -63,21 +107,27 @@
     }
   else if (generate_ops)
     {
-      if (NF >= 4)
+      if (NF >= 4 || (sparse && NF >= 5))
         {
-          result_tag = $1;
-          lhs_tag = $2;
-          rhs_tag = $3;
-          op_type = $4;
+          n = 0;
+
+          result_tag_1 = $(++n);
+          if (sparse)
+            result_tag_2 = $(++n);
+          lhs_tag = $(++n);
+          rhs_tag = $(++n);
+          op_type = $(++n);
 
           bin_ops = index (op_type, "B") != 0;
           cmp_ops = index (op_type, "C") != 0;
+          eqne_ops = index (op_type, "E") != 0;
           bool_ops = index (op_type, "L") != 0;
 
-          n = 4;
-
-          lhs_conv = cmp_ops ? $(++n) : "";
-          rhs_conv = cmp_ops ? $(++n) : "";
+          if (cmp_ops)
+            {
+              lhs_conv = $(++n);
+              rhs_conv = $(++n);
+            }
 
           if (lhs_conv == "NONE")
             lhs_conv = "";
@@ -110,129 +160,223 @@
               next;
             }
 
+          if (lhs_arg != lhs_tag || rhs_arg != rhs_tag)
+            next;
+
           h_guard = sprintf ("octave_%s_%s_%s_h", prefix, lhs_tag, rhs_tag);
 
-          result_num = rev_tag[result_tag];
+          result_num_1 = rev_tag[result_tag_1];
+          if (sparse)
+            result_num_2 = rev_tag[result_tag_2];
           lhs_num = rev_tag[lhs_tag];
           rhs_num = rev_tag[rhs_tag];
 
-          result_type = type[result_num];
+          result_type_1 = type[result_num_1];
+          if (sparse)
+            result_type_2 = type[result_num_2];
           lhs_type = type[lhs_num];
           rhs_type = type[rhs_num];
 
           lhs_core_type = core_type[lhs_num];
           rhs_core_type = core_type[rhs_num];
 
-          result_scalar_zero_val = scalar_zero_val[result_num];
+          result_scalar_zero_val_1 = scalar_zero_val[result_num_1];
+          if (sparse)
+            result_scalar_zero_val_2 = scalar_zero_val[result_num_2];
           lhs_scalar_zero_val = scalar_zero_val[lhs_num];
           rhs_scalar_zero_val = scalar_zero_val[rhs_num];
 
-          result_header = header[result_num];
+          result_header_1 = header[result_num_1];
+          if (sparse)
+            result_header_2 = header[result_num_2];
           lhs_header = header[lhs_num];
           rhs_header = header[rhs_num];
 
           lhs_class = class[lhs_num];
           rhs_class = class[rhs_num];
 
-          print "// DO NOT EDIT -- generated by mk-ops" > h_file;
-
-          printf ("#if ! defined (%s)\n", h_guard) >> h_file;
-          printf ("#define %s 1\n", h_guard) >> h_file;
-          print "#include \"octave-config.h\"" >> h_file;
-
-          if (result_header)
-            {
-              if (result_fwd_decl_ok)
-                printf ("class %s\n", result_type) >> h_file;
-              else
-                printf ("#include \"%s\"\n", result_header) >> h_file;
-            }
-
-          if (lhs_header && ! (lhs_header == result_header))
-            {
-              if (result_fwd_decl_ok)
-                printf ("class %s\n", lhs_type) >> h_file;
-              else
-                printf ("#include \"%s\"\n", lhs_header) >> h_file;
-            }
-
-          if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header))
+          if (make_header)
             {
-              if (result_fwd_decl_ok)
-                printf ("class %s\n", rhs_type) >> h_file;
-              else
-                printf ("#include \"%s\"\n", rhs_header) >> h_file;
-            }
+              print "// DO NOT EDIT -- generated by mk-ops.awk";
+
+              printf ("#if ! defined (%s)\n", h_guard);
+              printf ("#define %s 1\n", h_guard);
+              print "#include \"octave-config.h\"";
+
+              if (result_header_1)
+                {
+                  if (result_fwd_decl_ok)
+                    printf ("class %s\n", result_type_1);
+                  else
+                    printf ("#include \"%s\"\n", result_header_1);
+                }
 
-          printf ("#include \"mx-op-decl.h\"\n") >> h_file;
+              if (result_header_2 && ! (result_header_2 == result_header_1))
+                {
+                  if (result_fwd_decl_ok)
+                    printf ("class %s\n", result_type_2);
+                  else
+                    printf ("#include \"%s\"\n", result_header_2);
+                }
 
-          if (bin_ops)
-            printf ("%s%s_BIN_OP_DECLS (%s, %s, %s, OCTAVE_API)\n", lhs_class,
-                    rhs_class, result_type, lhs_type, rhs_type) >> h_file
+              if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2))
+                {
+                  if (result_fwd_decl_ok)
+                    printf ("class %s\n", lhs_type);
+                  else
+                    printf ("#include \"%s\"\n", lhs_header);
+                }
+
+              if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_header == result_header_2))
+                {
+                  if (result_fwd_decl_ok)
+                    printf ("class %s\n", rhs_type);
+                  else
+                    printf ("#include \"%s\"\n", rhs_header);
+                }
 
-          if (cmp_ops)
-            printf ("%s%s_CMP_OP_DECLS (%s, %s, OCTAVE_API)\n", lhs_class,
-                    rhs_class, lhs_type, rhs_type) >> h_file
+              if (sparse)
+                {
+                  ## FIXME: it might be nice to only include the declarations
+                  ## of the operators that are actually needed instead of
+                  ## including all of them.
+                  printf ("#include \"mx-ops.h\"\n");
+                  printf ("#include \"Sparse-op-defs.h\"\n");
+                }
+              else
+                printf ("#include \"mx-op-decl.h\"\n");
+
+              if (bin_ops)
+                {
+                  if (sparse)
+                    printf ("SPARSE_%s%s_BIN_OP_DECLS (%s, %s, %s, %s, OCTAVE_API)\n",
+                            lhs_class, rhs_class, result_type_1, result_type_2,
+                            lhs_type, rhs_type);
+                  else
+                    printf ("%s%s_BIN_OP_DECLS (%s, %s, %s, OCTAVE_API)\n",
+                            lhs_class, rhs_class, result_type_1, lhs_type,
+                            rhs_type);
+                }
 
-          if (bool_ops)
-            printf ("%s%s_BOOL_OP_DECLS (%s, %s, OCTAVE_API)\n", lhs_class,
-                    rhs_class, lhs_type, rhs_type) >> h_file
-
+              if (cmp_ops)
+                {
+                  if (sparse)
+                    printf ("SPARSE_%s%s_CMP_OP_DECLS (%s, %s, OCTAVE_API)\n",
+                            lhs_class, rhs_class, lhs_type, rhs_type);
+                  else
+                    printf ("%s%s_CMP_OP_DECLS (%s, %s, OCTAVE_API)\n",
+                            lhs_class, rhs_class, lhs_type, rhs_type);
+                }
 
-          print "#endif" >> h_file;
+              if (eqne_ops)
+                {
+                  if (sparse)
+                    printf ("SPARSE_%s%s_EQNE_OP_DECLS (%s, %s, OCTAVE_API)\n",
+                            lhs_class, rhs_class, lhs_type, rhs_type);
+                }
 
-          close (h_file);
-
+              if (bool_ops)
+                {
+                  if (sparse)
+                    printf ("SPARSE_%s%s_BOOL_OP_DECLS (%s, %s, OCTAVE_API)\n",
+                            lhs_class, rhs_class, lhs_type, rhs_type);
+                  else
+                    printf ("%s%s_BOOL_OP_DECLS (%s, %s, OCTAVE_API)\n",
+                            lhs_class, rhs_class, lhs_type, rhs_type);
+                }
 
-          print "// DO NOT EDIT -- generated by mk-ops" > cc_file;
+              print "#endif";
 
-          print "#ifdef HAVE_CONFIG_H" >> cc_file;
-          print "#include <config.h>" >> cc_file;
-          print "#endif" >> cc_file;
+              exit (0);
+            }
+          else if (make_source)
+            {
+              print "// DO NOT EDIT -- generated by mk-ops.awk";
 
-          print "#include \"Array-util.h\"" >> cc_file;
+              print "#ifdef HAVE_CONFIG_H";
+              print "#  include <config.h>";
+              print "#endif";
 
-          printf ("#include \"%s\"\n", h_file) >> cc_file;
+              print "#include \"Array-util.h\"";
 
-          printf ("#include \"mx-op-defs.h\"\n") >> cc_file;
+              printf ("#include \"%s\"\n", h_file);
 
-          for (i in bool_headers)
-            {
-              printf ("#include \"%s\"\n", bool_headers[i]) >> cc_file;
-              delete bool_headers[i];
-            }
+              if (! sparse)
+                printf ("#include \"mx-op-defs.h\"\n");
+
+              for (i in bool_headers)
+                {
+                  printf ("#include \"%s\"\n", bool_headers[i]);
+                  delete bool_headers[i];
+                }
 
-          if (result_header)
-            printf ("#include \"%s\"\n", result_header) >> cc_file;
+              if (result_header_1)
+                printf ("#include \"%s\"\n", result_header_1);
+
+              if (result_header_2 && ! (result_header_2 == result_header_1))
+                printf ("#include \"%s\"\n", result_header_2);
 
-          if (lhs_header && ! (lhs_header == result_header))
-            printf ("#include \"%s\"\n", lhs_header) >> cc_file;
+              if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2))
+                printf ("#include \"%s\"\n", lhs_header);
+
+              if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_heaer == result_header_2))
+                printf ("#include \"%s\"\n", rhs_header);
 
-          if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header))
-            printf ("#include \"%s\"\n", rhs_header) >> cc_file;
+              if (bin_ops)
+                {
+                  if (sparse)
+                    printf ("SPARSE_%s%s_BIN_OPS (%s, %s, %s, %s)\n",
+                            lhs_class, rhs_class, result_type_1,
+                            result_type_2, lhs_type, rhs_type);
+                  else
+                    {
+                      if ((lhs_class == "DM" && rhs_class == "M") || (lhs_class == "M" && rhs_class == "DM"))
+                        printf ("%s%s_BIN_OPS (%s, %s, %s, %s)\n",
+                                lhs_class, rhs_class, result_type_1,
+                                lhs_type, rhs_type, result_scalar_zero_val_1);
+                      else
+                        printf ("%s%s_BIN_OPS (%s, %s, %s)\n",
+                                lhs_class, rhs_class, result_type_1,
+                                lhs_type, rhs_type);
+                    }
+                }
 
-          if (bin_ops)
-            {
-              if ((lhs_class == "DM" && rhs_class == "M") || (lhs_class == "M" && rhs_class == "DM"))
-                printf ("%s%s_BIN_OPS (%s, %s, %s, %s)\n",
-                        lhs_class, rhs_class, result_type,
-                        lhs_type, rhs_type, result_scalar_zero_val) >> cc_file
-              else
-                printf ("%s%s_BIN_OPS (%s, %s, %s)\n",
-                        lhs_class, rhs_class, result_type,
-                        lhs_type, rhs_type) >> cc_file
+              if (cmp_ops)
+                {
+                  if (sparse)
+                    printf ("SPARSE_%s%s_CMP_OPS (%s, %s, %s, %s, %s, %s)\n",
+                            lhs_class, rhs_class, lhs_type,
+                            lhs_scalar_zero_val, lhs_conv, rhs_type,
+                            rhs_scalar_zero_val, rhs_conv);
+                  else
+                    printf ("%s%s_CMP_OPS (%s, %s)\n",
+                            lhs_class, rhs_class, lhs_type, rhs_type);
+                }
+
+              if (eqne_ops)
+                {
+                  if (sparse)
+                    printf ("SPARSE_%s%s_EQNE_OPS (%s, %s, %s, %s, %s, %s)\n",
+                            lhs_class, rhs_class, lhs_type,
+                            lhs_scalar_zero_val, lhs_conv, rhs_type,
+                            rhs_scalar_zero_val, rhs_conv);
+
+                  ## No separate eqne ops for full-matrix or vector.
+                }
+
+              if (bool_ops)
+                {
+                  if (sparse)
+                    printf ("SPARSE_%s%s_BOOL_OPS2 (%s, %s, %s, %s)\n",
+                            lhs_class, rhs_class, lhs_type, rhs_type,
+                            lhs_scalar_zero_val, rhs_scalar_zero_val);
+                  else
+                    printf ("%s%s_BOOL_OPS (%s, %s)\n", lhs_class, rhs_class,
+                            lhs_type, rhs_type);
+                }
+
+              exit (0);
             }
-
-          if (cmp_ops)
-             printf ("%s%s_CMP_OPS (%s, %s)\n",
-                     lhs_class, rhs_class, lhs_type, rhs_type) >> cc_file
-
-          if (bool_ops)
-            printf ("%s%s_BOOL_OPS (%s, %s)\n", lhs_class, rhs_class,
-                    lhs_type, rhs_type) >> cc_file
-
-
-          close (cc_file);
         }
       else
         printf ("skipping line %d: %s\n", NR, $0);
--- a/liboctave/operators/module.mk	Wed Feb 10 17:42:51 2016 -0800
+++ b/liboctave/operators/module.mk	Thu Feb 11 02:36:54 2016 -0500
@@ -11,6 +11,33 @@
   $(VX_OP_SRC) \
   $(SMX_OP_SRC)
 
+BUILT_LIBOCTAVE_OPERATORS_INC = \
+  liboctave/operators/mx-ops.h \
+  liboctave/operators/smx-ops.h \
+  liboctave/operators/vx-ops.h \
+  $(MX_OP_INC) \
+  $(VX_OP_INC) \
+  $(SMX_OP_INC)
+
+BUILT_LIBOCTAVE_OPERATORS_FILES = \
+  $(BUILT_LIBOCTAVE_OPERATORS_SOURCES) \
+  $(BUILT_LIBOCTAVE_OPERATORS_INC)
+
+BUILT_FULL_MATRIX_OPERATORS_FILES = \
+  liboctave/operators/mx-ops.h \
+  $(MX_OP_INC) \
+  $(MX_OP_SRC)
+
+BUILT_SPARSE_MATRIX_OPERATORS_FILES = \
+  liboctave/operators/smx-ops.h \
+  $(SMX_OP_INC) \
+  $(SMX_OP_SRC)
+
+BUILT_VECTOR_OPERATORS_FILES = \
+  liboctave/operators/vx-ops.h \
+  $(VX_OP_INC) \
+  $(VX_OP_SRC)
+
 LIBOCTAVE_OPERATORS_INC = \
   liboctave/operators/mx-base.h \
   liboctave/operators/mx-defs.h \
@@ -28,38 +55,24 @@
 LIBOCTAVE_TEMPLATE_SRC += \
   liboctave/operators/mx-inlines.cc
 
+## Special rules for sources which must be built before rest of compilation.
+
 OP_SRCDIR = $(abs_top_srcdir)/liboctave/operators
 
-define run-mx-ops
-  ( cd liboctave/operators; \
-    $(AWK) -f $(OP_SRCDIR)/$(2)mk-ops.awk prefix=$(1) $(OP_SRCDIR)/$(1)-ops \
-  )
+define run-mk-ops
+  rm -f $@-t $@ && \
+  $(AWK) -f $(OP_SRCDIR)/mk-ops.awk -v build_file=$(notdir $@) $< > $@-t && \
+  mv $@-t $@
 endef
 
-## Special rules for sources which must be built before rest of compilation.
-$(VX_OP_INC) $(VX_OP_SRC) : liboctave/operators/mk-ops.awk liboctave/operators/vx-ops
-	$(AM_V_GEN)$(call run-mx-ops,vx)
-
-$(MX_OP_INC) $(MX_OP_SRC) : liboctave/operators/mk-ops.awk liboctave/operators/mx-ops
-	$(AM_V_GEN)$(call run-mx-ops,mx)
-
-$(SMX_OP_INC) $(SMX_OP_SRC) : liboctave/operators/sparse-mk-ops.awk liboctave/operators/smx-ops
-	$(AM_V_GEN)$(call run-mx-ops,smx,sparse-)
+$(BUILT_FULL_MATRIX_OPERATORS_FILES): liboctave/operators/mx-ops liboctave/operators/mk-ops.awk
+	$(AM_V_GEN)$(run-mk-ops)
 
-define run-mx-ops-inclusive
-  rm -f $@-t $@ && \
-  $(AWK) -f $(OP_SRCDIR)/$(notdir $<) prefix=$(patsubst %-ops.h,%,$(notdir $@)) make_inclusive_header=$(notdir $@) $(OP_SRCDIR)/$(basename $(notdir $@)) > $@-t && \
-	mv $@-t $@
-endef
+$(BUILT_SPARSE_MATRIX_OPERATORS_FILES): liboctave/operators/smx-ops liboctave/operators/mk-ops.awk
+	$(AM_V_GEN)$(run-mk-ops)
 
-liboctave/operators/vx-ops.h : liboctave/operators/mk-ops.awk liboctave/operators/vx-ops
-	$(AM_V_GEN)$(run-mx-ops-inclusive)
-
-liboctave/operators/mx-ops.h : liboctave/operators/mk-ops.awk liboctave/operators/mx-ops
-	$(AM_V_GEN)$(run-mx-ops-inclusive)
-
-liboctave/operators/smx-ops.h : liboctave/operators/sparse-mk-ops.awk liboctave/operators/smx-ops
-	$(AM_V_GEN)$(run-mx-ops-inclusive)
+$(BUILT_VECTOR_OPERATORS_FILES): liboctave/operators/vx-ops liboctave/operators/mk-ops.awk
+	$(AM_V_GEN)$(run-mk-ops)
 
 noinst_LTLIBRARIES += liboctave/operators/liboperators.la
 
@@ -78,9 +91,8 @@
 liboctave_EXTRA_DIST += \
   liboctave/operators/config-ops.sh \
   liboctave/operators/mk-ops.awk \
-  liboctave/operators/mx-ops \
-  liboctave/operators/sparse-mk-ops.awk \
-  liboctave/operators/smx-ops \
-  liboctave/operators/vx-ops
+  liboctave/operators/mx-ops.cfg \
+  liboctave/operators/smx-ops.cfg \
+  liboctave/operators/vx-ops.cfg
 
 liboctave_DISTCLEANFILES += $(BUILT_LIBOCTAVE_OPERATORS_SOURCES)
--- a/liboctave/operators/mx-ops	Wed Feb 10 17:42:51 2016 -0800
+++ b/liboctave/operators/mx-ops	Thu Feb 11 02:36:54 2016 -0500
@@ -74,14 +74,16 @@
 i64nda int64NDArray ND int64NDArray.h YES octave_int64::zero int64_t
 ui64nda uint64NDArray ND uint64NDArray.h YES octave_uint64::zero uint64_t
 pm PermMatrix PM PermMatrix.h YES static_cast<octave_idx_type>(0)
-# ops
+#
+# full-matrix operators
+#
 # result_t lhs_t rhs_t op-type lhs_conv rhs_conv headers ...
 #
 # op-type is one of
 #
-#  B: binary ops, + - * /
-#  C: comparison ops, < <= == != >= >
-#  L: logical ops, & |
+#   B: binary ops, + - * /
+#   C: comparison ops, < <= == != >= >
+#   L: logical ops, & |
 #
 cdm cdm dm B
 cdm dm cdm B
--- a/liboctave/operators/smx-ops	Wed Feb 10 17:42:51 2016 -0800
+++ b/liboctave/operators/smx-ops	Thu Feb 11 02:36:54 2016 -0500
@@ -38,15 +38,17 @@
 cs Complex S oct-cmplx.h NO 0.0
 m Matrix M dMatrix.h YES 0.0
 cm ComplexMatrix M CMatrix.h YES 0.0
-# ops
+#
+# sparse-matrix operators
+#
 # result_t_1 result_t_2 lhs_t rhs_t op-type lhs_conv rhs_conv headers ...
 #
 # op-type is one of
 #
-#  B: binary ops, + - * /
-#  C: comparison ops, < <= == != >= >
-#  E: == != (Only one of C or E can be used!!)
-#  L: logical ops, & |
+#   B: binary ops, + - * /
+#   C: comparison ops, < <= == != >= >
+#   E: == != (Only one of C or E can be used!!)
+#   L: logical ops, & |
 #
 cm scm sm cs BCL NONE real boolSparse.h
 cm scm cs sm BCL real NONE boolSparse.h
--- a/liboctave/operators/sparse-mk-ops.awk	Wed Feb 10 17:42:51 2016 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,263 +0,0 @@
-# Copyright (C) 2004-2015 John W. Eaton
-#
-# This file is part of Octave.
-#
-# Octave is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 3 of the License, or (at
-# your option) any later version.
-#
-# Octave is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-# for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Octave; see the file COPYING.  If not, see
-# <http://www.gnu.org/licenses/>.
-
-BEGIN {
-  declare_types = 0;
-  generate_ops = 0;
-  ntypes = 0;
-} {
-  if (NR == 1 && make_inclusive_header)
-    {
-      print "// DO NOT EDIT -- generated by sparse-mk-ops";
-      tmp = make_inclusive_header;
-      gsub (/[\.-]/, "_", tmp);
-      printf ("#if ! defined (octave_%s)\n", tmp);
-      printf ("#define octave_%s 1\n", tmp);
-      print "#include \"octave-config.h\"";
-    }
-}
-/^#/ {
-  if ($2 == "types")
-    declare_types = 1;
-  else if ($2 == "ops")
-    {
-      generate_ops = 1;
-      declare_types = 0;
-    }
-  next;
-} {
-  if (declare_types)
-    {
-      ntypes++;
-
-      if (NF == 6)
-        {
-          scalar_zero_val[ntypes] = $6;
-          fwd_decl_ok[ntypes] = $5 == "YES";
-          header[ntypes] = $4 == "NONE" ? "" : $4;
-          class[ntypes] = $3;
-          type[ntypes] = $2;
-          tag[ntypes] = $1;
-          rev_tag[$1] = ntypes;
-        }
-      else
-        printf ("skipping line %d: %s\n", NR, $0);
-    }
-  else if (generate_ops)
-    {
-      if (NF >= 5)
-        {
-          result_tag_1 = $1;
-          result_tag_2 = $2;
-          lhs_tag = $3;
-          rhs_tag = $4;
-          op_type = $5;
-
-          bin_ops = index (op_type, "B") != 0;
-          cmp_ops = index (op_type, "C") != 0;
-          eqne_ops = index (op_type, "E") != 0;
-          bool_ops = index (op_type, "L") != 0;
-
-          n = 5;
-
-          lhs_conv = cmp_ops ? $(++n) : "";
-          rhs_conv = cmp_ops ? $(++n) : "";
-
-          if (lhs_conv == "NONE")
-            lhs_conv = "";
-
-          if (rhs_conv == "NONE")
-            rhs_conv = "";
-
-          k = 0
-          while (NF > n)
-            bool_headers[k++] = $(++n);
-
-          cc_file = sprintf ("%s-%s-%s.cc", prefix, lhs_tag, rhs_tag);
-          h_file = sprintf ("%s-%s-%s.h", prefix, lhs_tag, rhs_tag);
-
-          if (list_cc_files)
-            {
-              printf (" liboctave/operators/%s", cc_file);
-              next;
-            }
-
-          if (list_h_files)
-            {
-              printf (" liboctave/operators/%s", h_file);
-              next;
-            }
-
-          if (make_inclusive_header)
-            {
-              printf ("#include \"%s\"\n", h_file);
-              next;
-            }
-
-          h_guard = sprintf ("octave_%s_%s_%s_h", prefix, lhs_tag, rhs_tag);
-
-          result_num_1 = rev_tag[result_tag_1];
-          result_num_2 = rev_tag[result_tag_2];
-          lhs_num = rev_tag[lhs_tag];
-          rhs_num = rev_tag[rhs_tag];
-
-          result_type_1 = type[result_num_1];
-          result_type_2 = type[result_num_2];
-          lhs_type = type[lhs_num];
-          rhs_type = type[rhs_num];
-
-          result_scalar_zero_val_1 = scalar_zero_val[result_num_1];
-          result_scalar_zero_val_2 = scalar_zero_val[result_num_2];
-          lhs_scalar_zero_val = scalar_zero_val[lhs_num];
-          rhs_scalar_zero_val = scalar_zero_val[rhs_num];
-
-          result_header_1 = header[result_num_1];
-          result_header_2 = header[result_num_2];
-          lhs_header = header[lhs_num];
-          rhs_header = header[rhs_num];
-
-          lhs_class = class[lhs_num];
-          rhs_class = class[rhs_num];
-
-          print "// DO NOT EDIT -- generated by sparse-mk-ops" > h_file;
-
-          printf ("#if ! defined (%s)\n", h_guard) >> h_file;
-          printf ("#define %s 1\n", h_guard) >> h_file;
-          print "#include \"octave-config.h\"" >> h_file;
-
-          if (result_header_1)
-            {
-              if (result_fwd_decl_ok)
-                printf ("class %s\n", result_type_1) >> h_file;
-              else
-                printf ("#include \"%s\"\n", result_header_1) >> h_file;
-            }
-
-          if (result_header_2 && ! (result_header_2 == result_header_1))
-            {
-              if (result_fwd_decl_ok)
-                printf ("class %s\n", result_type_2) >> h_file;
-              else
-                printf ("#include \"%s\"\n", result_header_2) >> h_file;
-            }
-
-          if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2))
-            {
-              if (result_fwd_decl_ok)
-                printf ("class %s\n", lhs_type) >> h_file;
-              else
-                printf ("#include \"%s\"\n", lhs_header) >> h_file;
-            }
-
-          if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_header == result_header_2))
-            {
-              if (result_fwd_decl_ok)
-                printf ("class %s\n", rhs_type) >> h_file;
-              else
-                printf ("#include \"%s\"\n", rhs_header) >> h_file;
-            }
-
-          ## FIXME: it might be nice to only include the declarations
-          ## of the operators that are actually needed instead of
-          ## including all of them.
-          printf ("#include \"mx-ops.h\"\n") >> h_file;
-          printf ("#include \"Sparse-op-defs.h\"\n") >> h_file;
-
-          if (bin_ops)
-            printf ("SPARSE_%s%s_BIN_OP_DECLS (%s, %s, %s, %s, OCTAVE_API)\n", lhs_class,
-                    rhs_class, result_type_1, result_type_2, lhs_type,
-                    rhs_type) >> h_file
-
-          if (cmp_ops)
-            printf ("SPARSE_%s%s_CMP_OP_DECLS (%s, %s, OCTAVE_API)\n", lhs_class,
-                    rhs_class, lhs_type, rhs_type) >> h_file
-
-          if (eqne_ops)
-            printf ("SPARSE_%s%s_EQNE_OP_DECLS (%s, %s, OCTAVE_API)\n", lhs_class,
-                    rhs_class, lhs_type, rhs_type) >> h_file
-
-          if (bool_ops)
-            printf ("SPARSE_%s%s_BOOL_OP_DECLS (%s, %s, OCTAVE_API)\n", lhs_class,
-                    rhs_class, lhs_type, rhs_type) >> h_file
-
-
-          print "#endif" >> h_file;
-
-          close (h_file);
-
-
-          print "// DO NOT EDIT -- generated by sparse-mk-ops" > cc_file;
-
-          ## print "#ifdef HAVE_CONFIG_H" >> cc_file;
-          print "#include <config.h>" >> cc_file;
-          ## print "#endif" >> cc_file;
-
-          print "#include \"Array-util.h\"" >> cc_file;
-          print "#include \"quit.h\"" >> cc_file;
-
-          printf ("#include \"%s\"\n", h_file) >> cc_file;
-
-          for (i in bool_headers)
-            {
-              printf ("#include \"%s\"\n", bool_headers[i]) >> cc_file;
-              delete bool_headers[i];
-            }
-
-          if (result_header_1)
-            printf ("#include \"%s\"\n", result_header_1) >> cc_file;
-
-          if (result_header_2 && ! (result_header_2 == result_header_1))
-            printf ("#include \"%s\"\n", result_header_2) >> cc_file;
-
-          if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2))
-            printf ("#include \"%s\"\n", lhs_header) >> cc_file;
-
-          if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_heaer == result_header_2))
-            printf ("#include \"%s\"\n", rhs_header) >> cc_file;
-
-          if (bin_ops)
-            printf ("SPARSE_%s%s_BIN_OPS (%s, %s, %s, %s)\n", lhs_class,
-                    rhs_class, result_type_1, result_type_2, lhs_type,
-                    rhs_type) >> cc_file
-
-          if (cmp_ops)
-            printf ("SPARSE_%s%s_CMP_OPS (%s, %s, %s, %s, %s, %s)\n",
-                    lhs_class, rhs_class, lhs_type, lhs_scalar_zero_val,
-                    lhs_conv, rhs_type, rhs_scalar_zero_val, rhs_conv) >> cc_file
-
-          if (eqne_ops)
-            printf ("SPARSE_%s%s_EQNE_OPS (%s, %s, %s, %s, %s, %s)\n",
-                    lhs_class, rhs_class, lhs_type, lhs_scalar_zero_val,
-                    lhs_conv, rhs_type, rhs_scalar_zero_val, rhs_conv) >> cc_file
-
-          if (bool_ops)
-            printf ("SPARSE_%s%s_BOOL_OPS2 (%s, %s, %s, %s)\n", lhs_class,
-                    rhs_class, lhs_type, rhs_type, lhs_scalar_zero_val,
-                    rhs_scalar_zero_val) >> cc_file
-
-
-          close (cc_file);
-        }
-      else
-        printf ("skipping line %d: %s\n", NR, $0);
-    }
-}
-END {
-  if (make_inclusive_header)
-    print "#endif";
-}
--- a/liboctave/operators/vx-ops	Wed Feb 10 17:42:51 2016 -0800
+++ b/liboctave/operators/vx-ops	Thu Feb 11 02:36:54 2016 -0500
@@ -20,6 +20,14 @@
 # rebuild the source file lists for Make.
 
 # types
+#
+# key typename object-type header fwd-decl-ok scalar-zero
+#
+# object-type is one of
+#
+#   S:  scalar
+#   V:  vector
+#
 ccv ComplexColumnVector V CColVector.h YES 0.0
 crv ComplexRowVector V CRowVector.h YES 0.0
 cs Complex S oct-cmplx.h NO 0.0
@@ -32,7 +40,20 @@
 fcv FloatColumnVector V fColVector.h YES 0.0
 frv FloatRowVector V fRowVector.h YES 0.0
 fs float S NONE NO 0.0
-# ops
+#
+# vector operators
+#
+# result_t lhs_t rhs_t op-type
+#
+# op-type is one of
+#
+#   B: binary ops, + - * /
+#   C: comparison ops, < <= == != >= >
+#   E: == != (Only one of C or E can be used!!)
+#   L: logical ops, & |
+#
+# though we are currently defining only binary ops for vectors.
+#
 ccv ccv cv B
 ccv ccv s B
 crv crv rv B