Support disabling Schur specializations in Bazel build

Change-Id: If72bcd9f19ba4b44482b267e45fb2355b1a93ff0
diff --git a/BUILD b/BUILD
index 5a2c44a..7ae9d21 100644
--- a/BUILD
+++ b/BUILD
@@ -33,7 +33,8 @@
 
 load("//:bazel/ceres.bzl", "ceres_library")
 
-ceres_library(name = "ceres")
+ceres_library(name = "ceres",
+              restrict_schur_specializations=False)
 
 cc_library(
     name = "test_util",
diff --git a/bazel/ceres.bzl b/bazel/ceres.bzl
index 88dface..833c937 100644
--- a/bazel/ceres.bzl
+++ b/bazel/ceres.bzl
@@ -122,54 +122,12 @@
     "visibility_based_preconditioner.cc",
     "visibility.cc",
     "wall_time.cc",
-    "generated/schur_eliminator_d_d_d.cc",
-    "generated/schur_eliminator_2_2_2.cc",
-    "generated/schur_eliminator_2_2_3.cc",
-    "generated/schur_eliminator_2_2_4.cc",
-    "generated/schur_eliminator_2_2_d.cc",
-    "generated/schur_eliminator_2_3_3.cc",
-    "generated/schur_eliminator_2_3_4.cc",
-    "generated/schur_eliminator_2_3_6.cc",
-    "generated/schur_eliminator_2_3_9.cc",
-    "generated/schur_eliminator_2_3_d.cc",
-    "generated/schur_eliminator_2_4_3.cc",
-    "generated/schur_eliminator_2_4_4.cc",
-    "generated/schur_eliminator_2_4_6.cc",
-    "generated/schur_eliminator_2_4_8.cc",
-    "generated/schur_eliminator_2_4_9.cc",
-    "generated/schur_eliminator_2_4_d.cc",
-    "generated/schur_eliminator_2_d_d.cc",
-    "generated/schur_eliminator_4_4_2.cc",
-    "generated/schur_eliminator_4_4_3.cc",
-    "generated/schur_eliminator_4_4_4.cc",
-    "generated/schur_eliminator_4_4_d.cc",
-    "generated/partitioned_matrix_view_d_d_d.cc",
-    "generated/partitioned_matrix_view_2_2_2.cc",
-    "generated/partitioned_matrix_view_2_2_3.cc",
-    "generated/partitioned_matrix_view_2_2_4.cc",
-    "generated/partitioned_matrix_view_2_2_d.cc",
-    "generated/partitioned_matrix_view_2_3_3.cc",
-    "generated/partitioned_matrix_view_2_3_4.cc",
-    "generated/partitioned_matrix_view_2_3_6.cc",
-    "generated/partitioned_matrix_view_2_3_9.cc",
-    "generated/partitioned_matrix_view_2_3_d.cc",
-    "generated/partitioned_matrix_view_2_4_3.cc",
-    "generated/partitioned_matrix_view_2_4_4.cc",
-    "generated/partitioned_matrix_view_2_4_6.cc",
-    "generated/partitioned_matrix_view_2_4_8.cc",
-    "generated/partitioned_matrix_view_2_4_9.cc",
-    "generated/partitioned_matrix_view_2_4_d.cc",
-    "generated/partitioned_matrix_view_2_d_d.cc",
-    "generated/partitioned_matrix_view_4_4_2.cc",
-    "generated/partitioned_matrix_view_4_4_3.cc",
-    "generated/partitioned_matrix_view_4_4_4.cc",
-    "generated/partitioned_matrix_view_4_4_d.cc",
 ]]
 
 # TODO(rodrigoq): add support to configure Ceres into various permutations,
 # like SuiteSparse or not, threading or not, glog or not, and so on.
 # See https://github.com/ceres-solver/ceres-solver/issues/335.
-def ceres_library(name):
+def ceres_library(name, restrict_schur_specializations=False):
     # The path to internal/ depends on whether Ceres is the main workspace or
     # an external repository.
     if native.repository_name() != '@':
@@ -177,11 +135,23 @@
     else:
         internal = 'internal'
 
+    # The fixed-size Schur eliminator template instantiations incur a large
+    # binary size penalty, and are slow to compile, so support disabling them.
+    schur_eliminator_copts = []
+    if restrict_schur_specializations:
+        schur_eliminator_copts.append("-DCERES_RESTRICT_SCHUR_SPECIALIZATION")
+        schur_sources = [
+            "internal/ceres/generated/schur_eliminator_d_d_d.cc",
+            "internal/ceres/generated/partitioned_matrix_view_d_d_d.cc",
+        ]
+    else:
+        schur_sources = native.glob(["internal/ceres/generated/*.cc"])
+
     native.cc_library(
         name = name,
 
         # Internal sources, options, and dependencies.
-        srcs = CERES_SRCS + native.glob([
+        srcs = CERES_SRCS + schur_sources + native.glob([
             "include/ceres/internal/*.h",
         ]) + native.glob([
             "internal/ceres/*.h",
@@ -202,7 +172,7 @@
         copts = [
             "-I" + internal,
             "-Wno-sign-compare",
-        ],
+        ] + schur_eliminator_copts,
 
         # These include directories and defines are propagated to other targets
         # depending on Ceres.