Commit Graph

43 Commits

Author SHA1 Message Date
Alex Stewart 8d3e64dd5e Use modern-style Eigen3 CMake variables
Change-Id: I4c14aa54552b3f718dff90eb397cb030aeb6ecd4
2021-11-16 19:51:06 +00:00
Alex Stewart 7d3ffcb423 Remove forced CONFIG from find_package(Eigen3)
- Ceres will fail to configure if Eigen3::Eigen target is not found, and
  the minimum required Eigen version specified (3.3) exports Eigen as
  a CMake package and this is reflected in the default Ubuntu 18.04
  packages.
- This permits users to specify their own Eigen3 detection should they
  choose to do so, but they must do so via an imported target.

Change-Id: I5edff117c8001770004f49012ac1ae63b66ec9c1
2020-08-04 21:16:25 +00:00
Alex Stewart aa1abbc578 Replace use of GFLAGS_LIBRARIES with export gflags target
- As our minimum required version of gflags (2.2) exports itself as
  a CMake package and this is the case for the default 18.04 package
  we can use the gflags target directly.
- Replaces forced use of CONFIG in find_package(gflags) with a check
  that the gflags imported target exists to avoid ambiguity with
  libgflags if installed in a default location.  This permits users to
  override the gflags detection should they so choose, provided that
  they do so via an imported target.
- Also removes some previously removed legacy GLAGS_ vars from the
  installation docs.

Change-Id: I015f5a751e5b22f956bbf9df692e63a6825c9f0d
2020-08-04 21:15:51 +00:00
Alex Stewart cca93fed63 Bypass Ceres' FindGlog.cmake in CeresConfig.cmake if possible
- If the version of glog detected and used to build Ceres was built with
  CMake (i.e. Config mode) then we now use Config mode directly in
  CeresConfig.cmake and do not install Ceres' FindGlog.cmake module.
- This has the benefit of removing any hard-coded paths from
  CeresConfig.cmake provided that all dependencies were also built with
  CMake.

Change-Id: I85af8a953fd6d300e8bc0cdeb0b3636fec182f68
2020-05-25 17:20:12 +00:00
Alex Stewart b70687fcc8 Add namespace qualified Ceres::ceres CMake target
- This reflects modern CMake style, and also provides a measure of
  protection against missing find_package() imports in downstream
  clients resulting in linker errors when 'ceres' matches the compiled
  library and not the imported target.
- The original 'ceres' target remains, as a local imported interface
  target created by CeresConfig for backwards compatibility.

Change-Id: Ie9ed8de9b7059bc0cae1ae5002bb94d8fe617188
2020-05-25 17:16:27 +00:00
Alastair Harrison 27b717951b Respect FIND_QUIETLY flag in cmake config file
Ensure that Ceres does not print any log messages when somebody has
used 'find_package(Ceres QUIET)' in their CMake project.

Change-Id: Id6b68859cc8a5857f3fa78f29736cb82fd5a0943
2020-05-15 10:10:12 +01:00
Darius Rueckert e9eb76f8ef Remove AutodiffCodegen CMake integration
Change-Id: I403597540df8429378336626b8f748b7821fe6f5
2020-04-06 11:11:43 +02:00
Darius Rueckert 90799e29e1 Fix install and unnecessary string copy
- Fix the following issue when running "make install"
  https://github.com/ceres-solver/ceres-solver/issues/527

- Fix error that CeresCodeGeneration.cmake was not found
  after instalation. Issue:
  https://github.com/ceres-solver/ceres-solver/issues/561

- Removes the unnecessary string copy during code generation

Change-Id: I01963d01da6a9c4557aad6f89831647c1a149e38
2020-02-14 13:11:15 +01:00
Darius Rueckert 032d5844c2 AutoDiff Code Generation - CMake Integration
This patch integrates the code generation module into the build
system. All depenendcies are tracked through CMake targets.
Modifying the cost functor will automatically trigger code
re-generation.

All this functionality is defined in the CMake function
ceres_generate_cost_function_implementation_for_functor
in CeresCodeGeneration.cmake. A hello world usage example
is included in examples/CMakeLists.txt.

Change-Id: I23b8b6698d1ea51cf3d788a47afcf39f8c5ce327
2020-02-13 13:57:14 +01:00
Alex Stewart 4655f2549c Use find_package() instead of find_dependency() in CeresConfig.cmake
- Revert to original usage for compatibility with the stated minimum
  required CMake version: 3.5

Change-Id: Ifb15f97a1d8e9cc5742564bc22a8761840c08e06
2019-12-13 11:56:06 +00:00
NeroBurner a548766d14 Use glfags target
Update the usage of Google Flags (gflags) library the same way Glog
updated it [1]. This pushes the minimum required gflags version to
v2.2.0.

Remove the ceres specific define of CERES_GFLAGS_NAMESPACE and directly
use GFLAGS_NAMESPACE defined in gflags/gflags_declare.h [2].

In CeresConfig.cmake the hard coded paths for gflags are ommited.
Instead we rely on the gflagsConfig file to get closer to a relocatable
CeresConfig.cmake.
Furthermore use the find_dependency() [4] cmake function specifically
created for cmake-config files.

This change builds upon the explicit PUBLIC/PRIVATE link change [3].

[1] https://github.com/google/glog/pull/199
[2] https://github.com/gflags/gflags/blob/d9b184bd0026b16bb4c2fded75d56fb2cce50d66/src/gflags_declare.h.in#L43
[3] https://ceres-solver-review.googlesource.com/c/ceres-solver/+/16220
[4] https://cmake.org/cmake/help/latest/module/CMakeFindDependencyMacro.html

Change-Id: I9861a2699f2702bf1a5e99d07863a7e6639b7c39
2019-12-12 14:00:59 +00:00
NeroBurner 33dd469a53 Use Eigen3::Eigen target
Since version 3.3 Eigen provides Eigen3Config.cmake with the imported
target Eigen3::Eigen. [1]
Use this imported target as descibed in Eigen-Wiki [2]

In the CeresConfig file improve relocatability by removing absolute
paths to the compiled dependencies. Instead find the used Eigen3::Eigen.
Furthermore use the find_dependency() [4] CMake function instead of the
find_package() call in CeresConfig.

This commit relies on all targets to be explicitly linked private or
public as done in the the change [3]

[1] https://bitbucket.org/eigen/eigen/pull-requests/257/cmake-imported-target-take-2/diff
[2] https://eigen.tuxfamily.org/dox/TopicCMakeGuide.html
[3] https://ceres-solver-review.googlesource.com/c/ceres-solver/+/16220
[4] https://cmake.org/cmake/help/latest/module/CMakeFindDependencyMacro.html

Change-Id: I44f44a089083f7169bcf430b59775242e4eb72d1
2019-12-12 14:56:00 +01:00
Alex Stewart 1084c5460a Quote all configure-expanded paths
- Required when the paths may include whitespace or special characters.

Change-Id: I573b4cabf5681bcbe7a545afe4acf9e9f61433e8
2019-11-25 20:26:28 +00:00
Alex Stewart 402a2e4b6d Import Threads::Threads CMake target in CeresConfig.cmake
- Required now that Threads is a public dependency for Ceres and so
  Threads::Threads will appear in the dependency list for the Ceres
  target and so must be defined when Ceres itself is imported.

Change-Id: Ia5f8ea16e8f24cf0158f40e1fc8d3962106459a6
2018-08-23 09:22:22 +01:00
Alex Stewart 2166bad133 Replace include_directories() with target_include_directories().
- Now that we require CMake >= 3.x, we can roll the definition of the
  include directories for clients linking against Ceres into the
  exported Ceres CMake target via target_include_directories().
- This removes the requirement for CERES_INCLUDE_DIRS.

Change-Id: Ibe3bbf796339871d66138fc9520053d1766f09a8
2018-07-02 12:15:13 +01:00
Alex Stewart af77d3e676 Fix exported gflags include path.
- In practice, this was not causing any errors, as
  GFLAGS_INCLUDE_DIR_HINTS is set from GFLAGS_INCLUDE_DIRS so the two
  would have been equivalent, but we should nonetheless be using the
  one set after the find_package() call.
- Note that this would only have been active for older gflags versions
  that were not built with CMake.

Change-Id: Ie54145f522c974b7685052aafb1d2f6055d22337
2018-04-03 18:07:43 +01:00
Alex Stewart 282b8b5f35 Require >= C++11 & CMake >= 3.5 when building Ceres.
- Removes CXX11 option, and all associate paraphernalia.  Ceres now
  requires a compiler with full >= C++11 support.  In MSVC terms this
  means >= 2013 Release 4.
- This deprecates the use of CERES_STD_UNORDERED_MAP and CERES_USE_CXX11
  as they will now always be defined.  They will be removed from the
  source in a future CL.
- For clients with CMake >= 3.8 we propagate via the exported/installed
  Ceres target the CXX version that was specified when Ceres was built.
  For versions < 3.8 (but >= 3.5) we specify the CXX features currently
  used in the Ceres public API.

Change-Id: I535b545b10156e4426659c270a4a0649e071df0e
2018-03-29 09:32:59 +01:00
Alex Stewart f58eacf082 Fix suppression of C++11 propagation warning.
- Since the update to optionally use target_compile_features(), the
  warning about Ceres propagating C++11 compile flag requirements to
  clients was suppressed dependent upon the compiler option selected by
  CMake to satisfy the C++11 requirements for Ceres (e.g. if using
  -std=gnu++11 instead of -std=c++11).
- Now we display the warning for all CMake versions where any C++11
  related flags can be exported in the Ceres target (CMake >= 2.8.12)
  if Ceres was compiled with the CXX11 option enabled.

Change-Id: I5cb91e773fc7c41996b5eabadcaa295ebd7de4f7
2017-08-09 14:58:34 +01:00
Taylor Braun-Jones e6c14a4e3c Fix cmake error from CeresConfig.cmake when Ceres not found
Change-Id: I944c950ecfcb23d4c49b2b4f98852a99913f2f8b
2017-07-06 09:31:30 -04:00
Alex Stewart 74df65b142 Optionally use exported Eigen CMake configuration if available.
- Updates FindEigen.cmake to default to an installed Eigen CMake
  Configuration if available, otherwise falls back to previous behaviour
  of searching for Eigen components.
- This mimics the behaviour of FindGflags.cmake & FindGlog.cmake.

Change-Id: Ifce948d554a0135ce1a0c443267c0230e516f14b
2017-04-19 16:16:27 +01:00
Alex Stewart af3b9394ea Fix search path for miniglog headers when Ceres is exported.
- When Ceres is exported (rather than installed), the miniglog headers
  still reside in the internal Ceres source directory, not the public
  headers directory.

Change-Id: Ia54eb7f8bb0cd24c0112a715a739c15247bc9239
2017-03-09 18:19:16 +00:00
Alex Stewart 523e397be2 Fix missing gflags imported target definition in CeresConfig.cmake
- If gflags was built & exported with CMake but glog was not, but both
  were found then as we now make gflags a public dependency of Ceres if
  both it and glog are found, the *name* of the exported gflags CMake
  target (gflags-shared or similar) will appear in CERES_LIBRARIES.
- However, as imported targets are not re-exported, this results in a
  linker error when compiling client code, as the name of the exported
  gflags target is not known to CMake, it assumes it is a library name,
  which it is not.
- Confusingly, if glog was built with CMake, this problem would not
  occur, as in that case glog’s CMake target would bring in gflags’.
- Now we explicitly call find_package(Gflags) in CeresConfig.cmake if
  Ceres was built with gflags as a public dependency (via glog).

Change-Id: I5cc9483a1fae50f4e9e3a8fbba491b645fd45db6
2016-11-21 11:56:19 +00:00
Alex Stewart 9843f32803 Report Ceres compile options as components in find_package().
- Users can now specify particular components from Ceres, such as
  SuiteSparse support) that must be present in a detected version of
  Ceres in order for it to be reported as found by find_package().
- This allows users to specify for example that they require a version
  of Ceres with SuiteSparse support at configure time, rather than
  finding out only at run time that Ceres was not compiled with the
  options they require.
- The list of available components are built directly from the Ceres
  compile options.
- The meta-module SparseLinearAlgebraLibrary is present if at least
  one sparse linear algebra backend is available.

Change-Id: I65f1ddfd7697e6dd25bb4ac7e54f5097d3ca6266
2016-04-10 17:27:26 +00:00
Alex Stewart 1936d47e21 Revert increased inline threshold (iff Clang) to exported Ceres target.
- Increasing the inline threshold results in very variable performance
  improvements, and could potentially confuse users if they are trying
  to set the inline threshold themselves.
- As such, we no longer export our inline threshold configuration for
  Clang, but instead document how to change it in the FAQs.

Change-Id: I88e2e0001e4586ba2718535845ed1e4b1a5b72bc
2015-09-08 23:27:42 +01:00
Alex Stewart 0e8264cc47 Add increased inline threshold (iff Clang) to exported Ceres target.
- When compiled with Clang, Ceres and all of the examples are compiled
  with an increased inlining-threshold, as the default value can result
  in poor Eigen performance.
- Previously, client code using Ceres would typically not use an
  increased inlining-threshold (unless the user has specifically added
  it themselves).  However, increasing the inlining threshold can result
  in significant performance improvements in auto-diffed CostFunctions.
- This patch adds the inlining-threshold flags to the interface flags
  for the Ceres CMake target s/t any client code using Ceres (via
  CMake), and compiled with Clang, will now be compiled with the same
  increased inlining threshold as used by Ceres itself.

Change-Id: I31e8f1abfda140d22e85bb48aa57f028a68a415e
2015-09-02 19:37:01 +01:00
Alex Stewart cc8d47aabb Update all CMake to lowercase function name style.
- Updated to new CMake style where function names are all lowercase,
  this will be backwards compatible as CMake function names are
  case insensitive.
- Updated using Emacs' M-x unscreamify-cmake-buffer.

Change-Id: If7219816f560270e59212813aeb021353a64a0e2
2015-08-09 15:18:42 +01:00
Alex Stewart 5a48b92123 Export Ceres build directory into local CMake package registry.
- Optionally use CMake's export() functionality to export the Ceres
  build directory as a package into the local CMake package registry.
- This enables the detection & use of Ceres from CMake *without*
  requiring that Ceres be installed.

Change-Id: Ib5a7588446f490e1b405878475b6b1dd13accd1f
2015-08-03 16:46:05 +00:00
pmoulon 5a5526e1d8 Typo fix.
Change-Id: I7c59f92f8691beb2a0b999c1f93e31a099bbdb9d
2015-05-27 09:07:33 +02:00
Keir Mierle 3527c0e324 Enhance usability when encountering Eigen version mismatches
Change-Id: I78fae5be517e3ee4756ea3ce448c1173c39857d6
2015-04-14 21:57:51 -07:00
Keir Mierle 7492b0d8de Update copyright headers with new year and URL
Since Ceres is moving to using GitHub for issues, and the Google
Code URL in the current copyright header will soon become invalid,
update all the headers.

Change-Id: I1fce70375d1bcf098591f07b4d8f01a5c1e0789c
2015-03-18 05:43:23 +00:00
Chris Sweeney d9d9bc3ef5 Changed the CURRENT_CONFIG_INSTALL_DIR to be a variable local to Ceres.
This prevents any conflict with other libraries that use a similar syntax.

Change-Id: I7d67b283fb33ef677cc54a00c6ab66b82575422c
2015-02-10 15:05:23 +01:00
Greg Coombe 2a5599f378 Fix Cmake error when using miniglog.
Create the glog include directories and library directories
only if we've already checked that the user is using
glog (and not miniglog).

Otherwise, @GLOG_INCLUDE_DIR@ and @GLOG_LIBRARY@ will be
empty and the generated files will cause Cmake errors.

Change-Id: Ia0ce9cf98f7d56c83b2285f72f45b8e0d5dc34c4
2014-06-04 23:21:33 +00:00
Alex Stewart ea76585068 Adding autogenerated Ceres config.h to #define Ceres compile options.
- Previously we passed all compile options to Ceres via add_definitions
  in CMake.  This was fine for private definitions (used only by Ceres)
  but required additional work for public definitions to ensure they
  were correctly propagated to clients via CMake using
  target_compile_definitions() (>= 2.8.11) or add_definitions().
- A drawback to these approaches is that they did not work for chained
  dependencies on Ceres, as in if in the users project B <- A <- Ceres,
  then although the required Ceres public compile definitions would
  be used when compiling A, they would not be propagated to B.

- This patch replaces the addition of compile definitions via
  add_definitions() with an autogenerated config.h header which
  is installed with Ceres and defines all of the enabled Ceres compile
  options.
- This removes the need for the user to propagate any compile
  definitions in their projects, and additionally allows post-install
  inspect of the options with which Ceres was compiled.

Change-Id: Idbdb6abdad0eb31e7540370e301afe87a07f2260
2014-05-09 10:57:31 +01:00
Sameer Agarwal 7088a08f5d Fix some 80col violations and reflow the comments in cmake.in file.
Change-Id: I4c65c89b794845aeef69159a03350c727e2ee812
2014-05-05 09:02:05 -07:00
Alex Stewart 5ffe06019a Export Ceres compile definitions to targets compiled against Ceres.
- Previously all Ceres compile definitions were private to Ceres, that
  is they were not exported to users via the CMake export mechanism.
- Now that we use compile definitions in public (installed) Ceres
  headers, we need to export the Ceres compile definitions.
- If we did not do this, then the client's code 'see's' a different
  version of the Ceres headers to those which were in fact compiled,
  or in the case of shared_ptr, may not find the required header.

- This patch makes use of the new, in CMake 2.8.11, function:
  target_compile_definitions() to export all of the Ceres compile
  definitions using CMake's export functionality.
- For CMake versions < 2.8.11, we have to use the blunter instrument of
  calling add_definitions() in CeresConfig.cmake (invoked by a call to
  find_package(Ceres)).  This is messy because it ends up adding the
  Ceres compile definitions to any target declared in the user's code
  after the call to find_package(Ceres).  Although this should do no
  harm as all of our defines are prefaced with CERES_, so any
  unintentional name clashes are unlikely.

Change-Id: I5dea80949190eaf4fb08ea4ac568ce28c32dd4e0
2014-05-02 13:33:24 +00:00
Alex Stewart 9697a08a2b Defining CERES_FOUND in addition to Ceres_FOUND in CeresConfig.
- Previously we relied on FindPackage() to define Ceres_FOUND when
  find_package(Ceres) was called.
- This is fine, but users might legitimately expect the variable to be
  CERES_FOUND given the form of CERES_INCLUDE_DIRS/LIBRARIES.
- As there is an inconsistency in the CMake recommended names when
  FindPackage() is called in Module vs Config form, we now explicltly
  define both.

Change-Id: I54bce9aa112b684d26b60a9ae4d11eb7925a6ee5
2013-11-23 10:12:35 +00:00
Alex Stewart 4d0e626b55 Fixing gflags HINTS variable names (adding missing “_DIR”).
- The HINTS variables for gflags were incorrectly used as
  GFLAGS_[INCLUDE/LIBRARY]_HINTS when they should have been
  GFLAGS_[INCLUDE/LIBRARY]_DIR_HINTS as per the docs.
- Also removing a completed TODO in the main CMakeLists.
- Updating method of extracting current directory in CeresConfig.cmake
  to avoid use of CMAKE_CURRENT_LIST_DIR, which was not present in
  CMake =< v2.8.3.

Change-Id: I42ae696e3b785febe48688d912f0f343e8947cb0
2013-11-15 14:51:21 +00:00
Alex Stewart 54fc942367 Removing incorrect specialisation of install dirs on Windows.
- Previously on Windows the leaf include & lib install directories
  passed to CeresConfig.cmake.in when configured where capitalised on
  Windows.
- This capitalisation was incorrect, as the actual paths used are
  specified in the install() statements and are always in the standard
  lower-case form.
- This likely did not cause any issues previously as although NTFS is
  case sensitive, the Win32 API is not, and most applications access
  files through the Win32 API, and are thus not case-sensitive.

Change-Id: I335b6e2d10a1c64f320c2a1a68eeda1b22344e73
2013-11-14 11:42:00 +00:00
Alex Stewart fcbbb11e37 Ensure build paths for dependencies are searched in FindPackage(Ceres)
- Append to hint locations used by FindPackage scripts for public
  dependencies (glog & Eigen) the locations of the dependencies when
  Ceres was built.
- This means that the user should not have to supply them again when
  using find_package(Ceres) even if they are installed in a
  non-standard location.

Change-Id: I9550de91025ba47f01f1ea3c3fefe80fe38d14ff
2013-11-13 22:22:30 +00:00
Alex Stewart 78cc2c4719 Cleaning up exported CeresConfig.cmake.
- Adding FindPackage scripts for all of Ceres dependencies.
- Moving depend.cmake contents to CeresConfig.cmake and cleaning up
  search for Ceres & required dependencies, no longer push Ceres
  options into client.
- Fixing uninstall to remove ceres include root directory.
- Fixing main CMakeLists to install miniglog header if enabled.
- Making miniglog library shared/static with Ceres library.

Change-Id: If926bebd11720230c5136597ccba672394ed9777
2013-10-17 19:13:08 +00:00
Sameer Agarwal c24a4ec6fb Cmake refactoring
1. Use CMake FindLAPACK and FindBLAS Modules.
2. Remove SEARCH_HEADERS and SEARCH_LIBS and replace them with
CMAKE variables. This leads to simplification of the FIND_LIBRARY
and FIND_PATH calls.
3. Make miniglog a fallback when glog is not present and the
user indicates MINIGLOG=OFF.
4. Add time.h to miniglog.
5. Remove shared library building.

Change-Id: I8a97156d3d7cf645fbbfe8e571761bc16c89f43f
2013-08-25 23:56:48 -07:00
Pablo Speciale 6bcb8d9c30 Compiling against static or shared library
Change-Id: I3fb35e9a49f90b8894f59dde49c90a7c2dd74b0a
2013-03-25 17:06:11 -07:00
Pablo Speciale 16dbf11626 Added CeresConfig.cmake based on this example:
https://projects.kde.org/projects/kde/kdeexamples/repository/revisions/master/show/buildsystem/HowToInstallALibrary

Change-Id: I130cac5d43d9fbbf359abc04d3691e25c4e2bb63
2013-03-20 18:38:27 +00:00