Create ceres_library() and use to provide :ceres

This doesn't add any configurability to ceres_library() yet, but it
does correctly determine the include path for use with -I, allowing
this to be used as a dependency from other workspaces.

Change-Id: I223b6e63c2ea82ab7f552337f78fffd54f20b0e0
diff --git a/BUILD b/BUILD
index e9468c1..5a2c44a 100644
--- a/BUILD
+++ b/BUILD
@@ -31,197 +31,9 @@
 # These are Bazel rules to build Ceres. It's currently in Alpha state, and does
 # not support parameterization around threading choice or sparse backends.
 
-CERES_SRCS = ["internal/ceres/" + filename for filename in [
-    "array_utils.cc",
-    "blas.cc",
-    "block_evaluate_preparer.cc",
-    "block_jacobian_writer.cc",
-    "block_jacobi_preconditioner.cc",
-    "block_random_access_dense_matrix.cc",
-    "block_random_access_diagonal_matrix.cc",
-    "block_random_access_matrix.cc",
-    "block_random_access_sparse_matrix.cc",
-    "block_sparse_matrix.cc",
-    "block_structure.cc",
-    "c_api.cc",
-    "callbacks.cc",
-    "canonical_views_clustering.cc",
-    "cgnr_solver.cc",
-    "compressed_col_sparse_matrix_utils.cc",
-    "compressed_row_jacobian_writer.cc",
-    "compressed_row_sparse_matrix.cc",
-    "conditioned_cost_function.cc",
-    "conjugate_gradients_solver.cc",
-    "coordinate_descent_minimizer.cc",
-    "corrector.cc",
-    "covariance.cc",
-    "covariance_impl.cc",
-    "dense_normal_cholesky_solver.cc",
-    "dense_qr_solver.cc",
-    "dense_sparse_matrix.cc",
-    "detect_structure.cc",
-    "dogleg_strategy.cc",
-    "dynamic_compressed_row_jacobian_writer.cc",
-    "dynamic_compressed_row_sparse_matrix.cc",
-    "dynamic_sparse_normal_cholesky_solver.cc",
-    "eigensparse.cc",
-    "evaluator.cc",
-    "file.cc",
-    "function_sample.cc",
-    "gradient_checker.cc",
-    "gradient_checking_cost_function.cc",
-    "gradient_problem.cc",
-    "gradient_problem_solver.cc",
-    "is_close.cc",
-    "implicit_schur_complement.cc",
-    "inner_product_computer.cc",
-    "iterative_schur_complement_solver.cc",
-    "lapack.cc",
-    "levenberg_marquardt_strategy.cc",
-    "line_search.cc",
-    "line_search_direction.cc",
-    "line_search_minimizer.cc",
-    "linear_least_squares_problems.cc",
-    "linear_operator.cc",
-    "line_search_preprocessor.cc",
-    "linear_solver.cc",
-    "local_parameterization.cc",
-    "loss_function.cc",
-    "low_rank_inverse_hessian.cc",
-    "minimizer.cc",
-    "normal_prior.cc",
-    "parameter_block_ordering.cc",
-    "partitioned_matrix_view.cc",
-    "polynomial.cc",
-    "preconditioner.cc",
-    "preprocessor.cc",
-    "problem.cc",
-    "problem_impl.cc",
-    "program.cc",
-    "reorder_program.cc",
-    "residual_block.cc",
-    "residual_block_utils.cc",
-    "schur_complement_solver.cc",
-    "schur_eliminator.cc",
-    "schur_jacobi_preconditioner.cc",
-    "schur_templates.cc",
-    "scratch_evaluate_preparer.cc",
-    "single_linkage_clustering.cc",
-    "solver.cc",
-    "solver_utils.cc",
-    "sparse_cholesky.cc",
-    "sparse_matrix.cc",
-    "sparse_normal_cholesky_solver.cc",
-    "split.cc",
-    "stringprintf.cc",
-    "suitesparse.cc",
-    "thread_token_provider.cc",
-    "triplet_sparse_matrix.cc",
-    "trust_region_minimizer.cc",
-    "trust_region_preprocessor.cc",
-    "trust_region_step_evaluator.cc",
-    "trust_region_strategy.cc",
-    "types.cc",
-    "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",
-]]
+load("//:bazel/ceres.bzl", "ceres_library")
 
-# TODO(keir): This should get converted into a Skylark function that can
-# 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.
-cc_library(
-    name = "ceres",
-
-    # Internal sources, options, and dependencies.
-    srcs = CERES_SRCS + glob([
-        "include/ceres/internal/*.h",
-    ]) + glob([
-        "internal/ceres/*.h",
-    ]),
-
-    # These headers are made available to other targets.
-    hdrs =
-        glob(["include/ceres/*.h"]) + glob([
-            "include/ceres/internal/*.h",
-        ]) +
-
-        # This is an empty config, since the Bazel-based build does not
-        # generate a config.h from config.h.in. This is fine, since Bazel
-        # properly handles propagating -D defines to dependent targets.
-        glob([
-            "config/ceres/internal/config.h",
-        ]),
-    copts = [
-        "-Iinternal",
-        "-Wno-sign-compare",
-    ],
-
-    # These include directories and defines are propagated to other targets
-    # depending on Ceres.
-    # TODO(keir): These defines are placeholders for now to facilitate getting
-    # started with a Bazel build. However, these should become configurable as
-    # part of a Skylark Ceres target macro.
-    defines = [
-        "CERES_NO_SUITESPARSE",
-        "CERES_NO_CXSPARSE",
-        "CERES_NO_THREADS",
-        "CERES_NO_LAPACK",
-        "CERES_STD_UNORDERED_MAP",
-    ],
-    includes = [
-        "config",
-        "include",
-    ],
-    visibility = ["//visibility:public"],
-    deps = [
-        "@com_github_eigen_eigen//:eigen",
-        "@com_github_google_glog//:glog",
-    ],
-)
+ceres_library(name = "ceres")
 
 cc_library(
     name = "test_util",