Skip to content
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