From b7375b5fd9c2f19bc736e5588edb52b703e72262 Mon Sep 17 00:00:00 2001
From: Mederic Fourmy <mederic.fourmy@gmail.com>
Date: Thu, 5 May 2022 16:25:33 +0200
Subject: [PATCH] Finish switch to cmake refactoring

---
 CMakeLists.txt                          | 80 +++++++++++++++----------
 cmake_modules/gnss_utilsConfig.cmake.in | 13 ++++
 2 files changed, 62 insertions(+), 31 deletions(-)
 create mode 100644 cmake_modules/gnss_utilsConfig.cmake.in

diff --git a/CMakeLists.txt b/CMakeLists.txt
index d36785f..be7e529 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,13 +2,7 @@
 MESSAGE("Starting gnss-utils CMakeLists ...")
 
 # Pre-requisites about cmake itself
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
-
-if(COMMAND cmake_policy)
-  cmake_policy(SET CMP0005 NEW)
-  cmake_policy(SET CMP0003 NEW)
-
-endif(COMMAND cmake_policy)
+CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
 
 # MAC OSX RPATH
 set(CMAKE_MACOSX_RPATH true)
@@ -18,7 +12,8 @@ PROJECT(gnss_utils)
 
 SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin)
 SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib)
-SET(CMAKE_INSTALL_PREFIX /usr/local)
+set(INCLUDE_INSTALL_DIR include/iri-algorithms)
+set(LIB_INSTALL_DIR lib/)
 
 IF (NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE "RELEASE")
@@ -45,12 +40,6 @@ endif()
 
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive")
 
-FIND_PACKAGE(Eigen3 3.3 REQUIRED)
-IF(Eigen3_FOUND)
-    INCLUDE_DIRECTORIES(${EIGEN3_INCLUDE_DIRS})
-ENDIF(Eigen3_FOUND)
-
-
 # Testing
 IF(NOT BUILD_TESTS)
   OPTION(BUILD_TESTS "Build Unit tests" ON)
@@ -84,14 +73,13 @@ message("CONFIG DIRECTORY ${PROJECT_BINARY_DIR}")
 include_directories("${PROJECT_BINARY_DIR}/conf")
 
 # rtklib path
-SET(RTKLIB_DIR deps/RTKLIB)
-SET(RTKLIB_SRC_DIR ${RTKLIB_DIR}/src)
+SET(RTKLIB_SRC_DIR deps/RTKLIB/src)
 
 # driver source files
 SET(SOURCES
     src/navigation.cpp
     src/observations.cpp
-	src/range.cpp
+	  src/range.cpp
     src/receiver_raw_base.cpp
     src/receivers/ublox_raw.cpp
     src/receivers/novatel_raw.cpp
@@ -135,36 +123,66 @@ SET(RTKLIB_SRC
 # NOT SET SINCE WE COPY THE WHOLE include FOLDER
 
 # Eigen #######
-FIND_PACKAGE(Eigen3 REQUIRED)
-
-# Adding libraries' directories
-link_directories(/usr/lib/x86_64-linux-gnu/)
+FIND_PACKAGE(Eigen3 3.3 REQUIRED)
 
 # Adding include directories
-INCLUDE_DIRECTORIES(include/ ${EIGEN3_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ${RTKLIB_SRC_DIR})
+INCLUDE_DIRECTORIES(BEFORE include ${RTKLIB_SRC_DIR})
 
 # create the shared library
 ADD_LIBRARY(gnss_utils SHARED ${SOURCES} ${RTKLIB_SRC})
-TARGET_LINK_LIBRARIES(gnss_utils ${Boost_LIBRARIES})
+
+# Link this library wrt. its dependencies
+TARGET_LINK_LIBRARIES(gnss_utils Eigen3::Eigen)
 
 # Examples
 ADD_SUBDIRECTORY(src/examples)
+
 # Testing
 if(BUILD_TESTS)
   	add_subdirectory(test)
 endif()
 
 # Installing
-INSTALL(TARGETS ${PROJECT_NAME}
-        RUNTIME DESTINATION bin
-        LIBRARY DESTINATION lib
-        ARCHIVE DESTINATION lib)
-INSTALL(DIRECTORY include/gnss_utils DESTINATION include/iri-algorithms)
-INSTALL(FILES ${RTKLIB_SRC_DIR}/rtklib.h DESTINATION include/iri-algorithms/gnss_utils)
-INSTALL(FILES Findgnss_utils.cmake DESTINATION ${CMAKE_ROOT}/Modules/)
+INSTALL(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets
+  RUNTIME DESTINATION bin
+  LIBRARY DESTINATION ${LIB_INSTALL_DIR}
+  ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
+)
+install(EXPORT ${PROJECT_NAME}Targets DESTINATION lib/${PROJECT_NAME}/cmake)
+
+# Configure the package installation
+include(CMakePackageConfigHelpers)
+configure_package_config_file(
+  ${CMAKE_SOURCE_DIR}/cmake_modules/${PROJECT_NAME}Config.cmake.in
+  ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
+  INSTALL_DESTINATION ${LIB_INSTALL_DIR}/${PROJECT_NAME}/cmake
+  PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR
+)
+
+install(
+  FILES 
+  ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
+  DESTINATION 
+  ${LIB_INSTALL_DIR}/${PROJECT_NAME}/cmake
+)
+
+# Specifies include directories to use when compiling the plugin target
+# This way, include_directories does not need to be called in plugins depending on this one
+target_include_directories(${PROJECT_NAME} INTERFACE
+  $<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
+)
+
+INSTALL(DIRECTORY include/gnss_utils DESTINATION ${INCLUDE_INSTALL_DIR})
+
+INSTALL(FILES ${RTKLIB_SRC_DIR}/rtklib.h DESTINATION ${INCLUDE_INSTALL_DIR}/gnss_utils)
+
 INSTALL(FILES "${GNSS_UTILS_CONFIG_DIR}/config.h"
-  DESTINATION include/iri-algorithms/gnss_utils/internal)
+  DESTINATION ${INCLUDE_INSTALL_DIR}/gnss_utils/internal)
+
 
+###############
+# Documentation
+###############
 FIND_PACKAGE(Doxygen)
 
 FIND_PATH(IRI_DOC_DIR doxygen.conf ${CMAKE_SOURCE_DIR}/doc/iri_doc/)
diff --git a/cmake_modules/gnss_utilsConfig.cmake.in b/cmake_modules/gnss_utilsConfig.cmake.in
new file mode 100644
index 0000000..ae01299
--- /dev/null
+++ b/cmake_modules/gnss_utilsConfig.cmake.in
@@ -0,0 +1,13 @@
+set(@PROJECT_NAME@_VERSION 0.0.1)
+
+
+@PACKAGE_INIT@
+
+set_and_check(@PROJECT_NAME@_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
+set(@PROJECT_NAME@_INCLUDE_DIRS @PROJECT_NAME@_INCLUDE_DIR)
+set_and_check(@PROJECT_NAME@_LIB_INSTALL_DIR "@PACKAGE_LIB_INSTALL_DIR@")
+set(@PROJECT_NAME@_LIB_INSTALL_DIRS @PROJECT_NAME@_LIB_INSTALL_DIR)
+
+include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
+
+check_required_components(@PROJECT_NAME@)
\ No newline at end of file
-- 
GitLab