| # 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 [ | 
 |     "accelerate_sparse.cc", | 
 |     "array_utils.cc", | 
 |     "block_evaluate_preparer.cc", | 
 |     "block_jacobi_preconditioner.cc", | 
 |     "block_jacobian_writer.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", | 
 |     "context.cc", | 
 |     "context_impl.cc", | 
 |     "coordinate_descent_minimizer.cc", | 
 |     "corrector.cc", | 
 |     "cost_function.cc", | 
 |     "covariance.cc", | 
 |     "covariance_impl.cc", | 
 |     "dense_cholesky.cc", | 
 |     "dense_normal_cholesky_solver.cc", | 
 |     "dense_qr.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", | 
 |     "evaluation_callback.cc", | 
 |     "evaluator.cc", | 
 |     "file.cc", | 
 |     "first_order_function.cc", | 
 |     "float_suitesparse.cc", | 
 |     "function_sample.cc", | 
 |     "gradient_checker.cc", | 
 |     "gradient_checking_cost_function.cc", | 
 |     "gradient_problem.cc", | 
 |     "gradient_problem_solver.cc", | 
 |     "implicit_schur_complement.cc", | 
 |     "inner_product_computer.cc", | 
 |     "is_close.cc", | 
 |     "iteration_callback.cc", | 
 |     "iterative_refiner.cc", | 
 |     "iterative_schur_complement_solver.cc", | 
 |     "levenberg_marquardt_strategy.cc", | 
 |     "line_search.cc", | 
 |     "line_search_direction.cc", | 
 |     "line_search_minimizer.cc", | 
 |     "line_search_preprocessor.cc", | 
 |     "linear_least_squares_problems.cc", | 
 |     "linear_operator.cc", | 
 |     "linear_solver.cc", | 
 |     "loss_function.cc", | 
 |     "low_rank_inverse_hessian.cc", | 
 |     "manifold.cc", | 
 |     "minimizer.cc", | 
 |     "normal_prior.cc", | 
 |     "parallel_for_cxx.cc", | 
 |     "parallel_for_nothreads.cc", | 
 |     "parallel_for_openmp.cc", | 
 |     "parallel_utils.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", | 
 |     "stringprintf.cc", | 
 |     "subset_preconditioner.cc", | 
 |     "suitesparse.cc", | 
 |     "thread_pool.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", | 
 | ]] | 
 |  | 
 | # 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, | 
 |                   restrict_schur_specializations=False): | 
 |     # 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' | 
 |  | 
 |     # 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 + schur_sources + 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 and export, since the | 
 |             # Bazel-based build does not generate a | 
 |             # config.h/export.h. This is fine, since Bazel properly | 
 |             # handles propagating -D defines to dependent targets. | 
 |             native.glob([ | 
 |                 "config/ceres/internal/config.h", | 
 |                 "config/ceres/internal/export.h", | 
 |             ]), | 
 |         copts = [ | 
 |             "-I" + internal, | 
 |             "-Wno-sign-compare", | 
 |  | 
 |             # Disable warnings about deprecated interfaces while we are | 
 |             # transitioning from LocalParameterization to Manifolds. | 
 |             "-Wno-deprecated-declarations", | 
 |         ] + schur_eliminator_copts, | 
 |  | 
 |         # 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. | 
 |         # https://github.com/ceres-solver/ceres-solver/issues/396 | 
 |         defines = [ | 
 |             "CERES_EXPORT=", | 
 |             "CERES_NO_ACCELERATE_SPARSE", | 
 |             "CERES_NO_CHOLMOD_PARTITION", | 
 |             "CERES_NO_CUDA", | 
 |             "CERES_NO_EIGEN_METIS", | 
 |             "CERES_NO_EXPORT=", | 
 |             "CERES_NO_LAPACK", | 
 |             "CERES_NO_SUITESPARSE", | 
 |             "CERES_USE_CXX_THREADS", | 
 |             "CERES_USE_EIGEN_SPARSE", | 
 |         ], | 
 |         includes = [ | 
 |             "config", | 
 |             "include", | 
 |         ], | 
 |         visibility = ["//visibility:public"], | 
 |         deps = [ | 
 |             "@com_gitlab_libeigen_eigen//:eigen", | 
 |             "@com_github_google_glog//:glog", | 
 |         ], | 
 |     ) |