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",
diff --git a/bazel/ceres.bzl b/bazel/ceres.bzl new file mode 100644 index 0000000..88dface --- /dev/null +++ b/bazel/ceres.bzl
@@ -0,0 +1,228 @@ +# Ceres Solver - A fast non-linear least squares minimizer +# Copyright 2018 Google Inc. All rights reserved. +# http://ceres-solver.org/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of Google Inc. nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# Support for building Ceres Solver with a specific configuration. + +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", +]] + +# 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): + # The path to internal/ depends on whether Ceres is the main workspace or + # an external repository. + if native.repository_name() != '@': + internal = 'external/%s/internal' % native.repository_name().lstrip('@') + else: + internal = 'internal' + + native.cc_library( + name = name, + + # Internal sources, options, and dependencies. + srcs = CERES_SRCS + native.glob([ + "include/ceres/internal/*.h", + ]) + native.glob([ + "internal/ceres/*.h", + ]), + + # These headers are made available to other targets. + hdrs = + native.glob(["include/ceres/*.h"]) + native.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. + native.glob([ + "config/ceres/internal/config.h", + ]), + copts = [ + "-I" + internal, + "-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", + ], + )