Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Ceres Solver #10

Draft
wants to merge 12 commits into
base: main
Choose a base branch
from
56 changes: 32 additions & 24 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,31 @@
cmake_minimum_required(VERSION 3.5)

# Require out-of-source builds as suggested on
# https://cliutils.gitlab.io/modern-cmake/chapters/basics/structure.html
file(TO_CMAKE_PATH "${PROJECT_BINARY_DIR}/CMakeLists.txt" LOC_PATH)
if(EXISTS "${LOC_PATH}")
message(FATAL_ERROR "You cannot build in a source directory (or any directory with a CMakeLists.txt file). Please make a build subdirectory. Feel free to remove CMakeCache.txt and CMakeFiles.")
endif()

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

# Use find_package everywhere, no-op if it's a target
macro(find_package)
if(NOT TARGET ${ARGV0} AND NOT TARGET ${ARGV0}::${ARGV0})
_find_package(${ARGV})
else()
if(TARGET ${ARGV0}::${ARGV0})
get_target_property(TGT_VER ${ARGV0}::${ARGV0} VERSION)
set(TGT ${ARGV0}::${ARGV0})
else()
get_target_property(TGT_VER ${ARGV0} VERSION)
set(TGT ${ARGV0})
endif()
message(STATUS "Found ${ARGV0}: CMake Target ${TGT} (found version \"${TGT_VER}\")")
set(${ARGV0}_FOUND TRUE)
endif()
endmacro()

project(Windows-CalcEngine VERSION 1.0.33 LANGUAGES CXX)

set(target_name ${PROJECT_NAME})
Expand Down Expand Up @@ -63,29 +89,11 @@ if( ${BUILD_WCE_OPTICAL} )
set( BUILD_WCE_VIEWER ON )
endif()

if( DOWNLOAD_GTEST STREQUAL ON ) # Do not need gtest since it will be processed by E+
# include(CMakeLists-GTest.txt)
configure_file(CMakeLists.txt.in ${CMAKE_CURRENT_BINARY_DIR}/googletest-download/CMakeLists.txt)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download )
execute_process(COMMAND ${CMAKE_COMMAND} --build .
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download )

# Prevent GoogleTest from overriding our compiler/linker options
# when building with Visual Studio
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)

# Add googletest directly to our build. This adds
# the following targets: gtest, gtest_main, gmock
# and gmock_main
add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/googletest-src
${CMAKE_CURRENT_BINARY_DIR}/googletest-build)

# Now simply link your own targets against gtest, gmock,
# etc. as appropriate

include_directories( ${CMAKE_CURRENT_BINARY_DIR}/googletest-src/include )
endif ()
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

# Build Dependencies
add_subdirectory(cmake)

# foreach( _variableName ${SOURCES})
# message( STATUS "${_variableName}" )
Expand Down Expand Up @@ -207,4 +215,4 @@ else()

endif()

config_compiler_and_linker_wce()
config_compiler_and_linker_wce()
234 changes: 234 additions & 0 deletions cmake/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
set(BUILD_SHARED_LIBS OFF)
set(BUILD_TESTING OFF)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

############
## GTest ##
############
if( DOWNLOAD_GTEST STREQUAL ON ) # Do not need gtest since it will be processed by E+
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/gtest.CMakeLists.txt.in"
"${CMAKE_BINARY_DIR}/gtest-download/CMakeLists.txt")
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/gtest-download" )
if(result)
message(FATAL_ERROR "CMake step for gtest failed: ${result}")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/gtest-download" )
if(result)
message(FATAL_ERROR "Build step for gtest failed: ${result}")
endif()

set(gtest_NAMESPACE "gtest" CACHE INTERNAL "Namespace for gtest")

# Prevent GoogleTest from overriding our compiler/linker options
# when building with Visual Studio
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)

# Add googletest directly to our build. This adds
# the following targets: gtest, gtest_main, gmock
# and gmock_main
add_subdirectory( "${CMAKE_BINARY_DIR}/gtest-src" "${CMAKE_BINARY_DIR}/gtest-build" EXCLUDE_FROM_ALL )

# Now simply link your own targets against gtest, gmock,
# etc. as appropriate
include_directories(
"${CMAKE_BINARY_DIR}/cmake/gtest-build/googletest/include"
"${CMAKE_BINARY_DIR}/cmake/gtest-build/googlemock/include")

# Keep the `CACHE` clean as suggested on
# https://cliutils.gitlab.io/modern-cmake/chapters/testing/googletest.html
mark_as_advanced(
BUILD_GMOCK BUILD_GTEST BUILD_SHARED_LIBS
gmock_build_tests gtest_build_samples gtest_build_tests
gtest_disable_pthreads gtest_force_shared_crt gtest_hide_internal_symbols
)

message(STATUS "Subproject: Gflag...DONE")
endif ()

##############
## GFLAGS ##
##############
message(STATUS "Subproject: GFlags...")
# Download and unpack gflags at configure time
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/gflags.CMakeLists.txt.in"
"${CMAKE_BINARY_DIR}/gflags-download/CMakeLists.txt")
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/gflags-download")
if(result)
message(FATAL_ERROR "CMake step for gflags failed: ${result}")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/gflags-download")
if(result)
message(FATAL_ERROR "Build step for gflags failed: ${result}")
endif()

set(GFLAGS_NAMESPACE "gflags")
set(GFLAGS_INSTALL_STATIC_LIBS ON)
set(GFLAGS_INSTALL_HEADERS ON)
#set(GFLAGS_IS_SUBPROJECT TRUE)
add_subdirectory( "${CMAKE_BINARY_DIR}/gflags-src" "${CMAKE_BINARY_DIR}/gflags-build" EXCLUDE_FROM_ALL )
message(STATUS "Subproject: Gflag...DONE")

############
## GLOG ##
############
message(STATUS "Subproject: GLog...")
# Download and unpack glog at configure time
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/glog.CMakeLists.txt.in"
"${CMAKE_BINARY_DIR}/glog-download/CMakeLists.txt")
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/glog-download")
if(result)
message(FATAL_ERROR "CMake step for glog failed: ${result}")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/glog-download")
if(result)
message(FATAL_ERROR "Build step for glog failed: ${result}")
endif()

set(gflags_NAMESPACE "gflags" CACHE INTERNAL "Namespace for gflags")
add_subdirectory( "${CMAKE_BINARY_DIR}/glog-src" "${CMAKE_BINARY_DIR}/glog-build" EXCLUDE_FROM_ALL )
message(STATUS "Subproject: Glog...DONE")

############
## BLAS ##
############
message(STATUS "Subproject: BLAS...")
# Download and unpack BLAS at configure time
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/blas.CMakeLists.txt.in"
"${CMAKE_BINARY_DIR}/blas-download/CMakeLists.txt")
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/blas-download")
if(result)
message(FATAL_ERROR "CMake step for blas failed: ${result}")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/blas-download")
if(result)
message(FATAL_ERROR "Build step for blas failed: ${result}")
endif()

set(blas_NAMESPACE "blas" CACHE INTERNAL "Namespace for BLAS")
add_subdirectory( "${CMAKE_BINARY_DIR}/blas-src" "${CMAKE_BINARY_DIR}/blas-build" EXCLUDE_FROM_ALL )
message(STATUS "Subproject: blas...DONE")

##############
## LAPACK ##
##############
message(STATUS "Subproject: LAPACK...")
# Download and unpack LAPACK at configure time
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/lapack.CMakeLists.txt.in"
"${CMAKE_BINARY_DIR}/lapack-download/CMakeLists.txt")
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/lapack-download")
if(result)
message(FATAL_ERROR "CMake step for lapack failed: ${result}")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/lapack-download")
if(result)
message(FATAL_ERROR "Build step for lapack failed: ${result}")
endif()

set(lapack_NAMESPACE "lapack" CACHE INTERNAL "Namespace for LAPACK")
add_subdirectory( "${CMAKE_BINARY_DIR}/lapack-src" "${CMAKE_BINARY_DIR}/lapack-build" EXCLUDE_FROM_ALL )
message(STATUS "Subproject: lapack...DONE")

#############
## Eigen ##
#############
message(STATUS "Subproject: Eigen...")
# Download and unpack Eigen at configure time
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/eigen.CMakeLists.txt.in"
"${CMAKE_BINARY_DIR}/eigen-download/CMakeLists.txt")
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/eigen-download")
if(result)
message(FATAL_ERROR "CMake step for eigen failed: ${result}")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/eigen-download")
if(result)
message(FATAL_ERROR "Build step for eigen failed: ${result}")
endif()

set(eigen_NAMESPACE "eigen" CACHE INTERNAL "Namespace for Eigen")
add_subdirectory( "${CMAKE_BINARY_DIR}/eigen-src" "${CMAKE_BINARY_DIR}/eigen-build" EXCLUDE_FROM_ALL )
message(STATUS "Subproject: eigen...DONE")

##################
## SuiteSparse ##
##################
# message(STATUS "Subproject: SuiteSparse...")
# # Download and unpack SuiteSparse at configure time
# configure_file(
# "${CMAKE_CURRENT_SOURCE_DIR}/suitesparse.CMakeLists.txt.in"
# "${CMAKE_BINARY_DIR}/suitesparse-download/CMakeLists.txt")
# execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
# RESULT_VARIABLE result
# WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/suitesparse-download")
# if(result)
# message(FATAL_ERROR "CMake step for suitesparse failed: ${result}")
# endif()
# execute_process(COMMAND ${CMAKE_COMMAND} --build .
# RESULT_VARIABLE result
# WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/suitesparse-download")
# if(result)
# message(FATAL_ERROR "Build step for suitesparse failed: ${result}")
# endif()
#
# set(suitesparse_NAMESPACE "suitesparse" CACHE INTERNAL "Namespace for SuiteSparse")
# add_subdirectory( "${CMAKE_BINARY_DIR}/suitesparse-src" "${CMAKE_BINARY_DIR}/suitesparse-build" EXCLUDE_FROM_ALL )
# message(STATUS "Subproject: suitesparse...DONE")

####################
## Ceres Solver ##
####################
message(STATUS "Subproject: Ceres Solver...")
# Download and unpack Ceres Solver at configure time
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/ceres.CMakeLists.txt.in"
"${CMAKE_BINARY_DIR}/ceres-download/CMakeLists.txt")
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/ceres-download")
if(result)
message(FATAL_ERROR "CMake step for ceres failed: ${result}")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/ceres-download")
if(result)
message(FATAL_ERROR "Build step for ceres failed: ${result}")
endif()

set(ceres_NAMESPACE "ceres" CACHE INTERNAL "Namespace for Ceres Solver")
# Eigen's and Ceres' `uninstall` targets collide as both are added as
# subdirectories. [Eigen's `uninstall` target cannot be
# excluded](https://gitlab.com/libeigen/eigen/-/issues/1892). However, Ceres'
# one can with `PROVIDE_UNINSTALL_TARGET`.
set(PROVIDE_UNINSTALL_TARGET OFF)
add_subdirectory( "${CMAKE_BINARY_DIR}/ceres-src" "${CMAKE_BINARY_DIR}/ceres-build" EXCLUDE_FROM_ALL )
message(STATUS "Subproject: ceres...DONE")
23 changes: 23 additions & 0 deletions cmake/blas.CMakeLists.txt.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
cmake_minimum_required(VERSION 3.5)

include(ExternalProject)

project( blas-download NONE )

ExternalProject_Add(BlasExternal
GIT_REPOSITORY https://github.com/icl-utk-edu/blaspp
GIT_TAG "v2023.11.05"

UPDATE_COMMAND ""
PATCH_COMMAND ""

SOURCE_DIR "${CMAKE_BINARY_DIR}/blas-src"
BINARY_DIR "${CMAKE_BINARY_DIR}/blas-build"

CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
TEST_COMMAND ""

LOG_DOWNLOAD ON
)
33 changes: 33 additions & 0 deletions cmake/ceres.CMakeLists.txt.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
cmake_minimum_required(VERSION 3.5)

include(ExternalProject)

project( ceres-solver-download NONE )

ExternalProject_Add(CeresExternal
GIT_REPOSITORY https://github.com/ceres-solver/ceres-solver.git
GIT_TAG "2.2.0"

UPDATE_COMMAND ""
PATCH_COMMAND ""

SOURCE_DIR "${CMAKE_BINARY_DIR}/ceres-src"
BINARY_DIR "${CMAKE_BINARY_DIR}/ceres-build"

CONFIGURE_COMMAND ""
BUILD_COMMAND ""
TEST_COMMAND ""
INSTALL_COMMAND ""

LOG_DOWNLOAD ON

CMAKE_ARGS
-DCMAKE_C_FLAGS=-fPIC
-DCMAKE_CXX_FLAGS=-fPIC
-DBUILD_EXAMPLES=OFF
-DBUILD_TESTING=OFF
-DMINIGLOG=ON
-DMINIGLOG_MAX_LOG_LEVEL=-100
-DEIGEN_INCLUDE_PATH=${CMAKE_BINARY_DIR}/eigen-src
-DENABLE_PRECOMPILED_HEADERS=OFF
)
23 changes: 23 additions & 0 deletions cmake/eigen.CMakeLists.txt.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
cmake_minimum_required(VERSION 3.12)

include(ExternalProject)

project( eigen-download NONE )

ExternalProject_Add(EigenExternal
GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git
GIT_TAG "3.4.0"

UPDATE_COMMAND ""
PATCH_COMMAND ""

SOURCE_DIR "${CMAKE_BINARY_DIR}/eigen-src"
BINARY_DIR "${CMAKE_BINARY_DIR}/eigen-build"

CONFIGURE_COMMAND ""
BUILD_COMMAND ""
TEST_COMMAND ""
INSTALL_COMMAND ""

LOG_DOWNLOAD ON
)
Loading
Loading