diff --git a/.gitignore b/.gitignore index 1b5cabe689d85cfd5c0ce42d1075e665e2d98137..2846ab35ec82c4ab7659933c48ac750d7c7f13c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,9 @@ -lib/* -build/* -bin/* +lib/ +build*/ +bin/ .settings/language.settings.xml .project .cproject deps/RTKLIB -.vscode/* +.vscode/ diff --git a/CMakeLists.txt b/CMakeLists.txt index d36785ffb82b26bbff6e5be422c1e9a0c5c17f35..3892399b43771edd5c7d5cbd7ddde5724aba1179 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 @@ -131,41 +119,68 @@ SET(RTKLIB_SRC ${RTKLIB_SRC_DIR}/rcv/tersus.c ${RTKLIB_SRC_DIR}/rcv/ublox.c) -# application header files -# 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 CONFIG) # 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) + -FIND_PACKAGE(Doxygen) +############### +# Documentation +############### +FIND_PACKAGE(Doxygen MODULE) FIND_PATH(IRI_DOC_DIR doxygen.conf ${CMAKE_SOURCE_DIR}/doc/iri_doc/) IF (IRI_DOC_DIR) diff --git a/cmake_modules/gnss_utilsConfig.cmake.in b/cmake_modules/gnss_utilsConfig.cmake.in new file mode 100644 index 0000000000000000000000000000000000000000..ae01299238be6d3b5da20044665ea893e38ba378 --- /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 diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c180b0041c8d6001ce578b5c25b9813061259dec..03f45caae714c3b208ec8a8cfa21cdd2d3702a5e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,33 +1,24 @@ # Retrieve googletest from github & compile add_subdirectory(gtest) -# Include gtest directory. -include_directories(${GTEST_INCLUDE_DIRS}) - ############# USE THIS TEST AS AN EXAMPLE #################### # # # Create a specific test executable for gtest_example # # gnss_utils_add_gtest(gtest_example gtest_example.cpp) # -# target_link_libraries(gtest_example ${PROJECT_NAME}) # # # ############################################################## # Navigation test gnss_utils_add_gtest(gtest_navigation gtest_navigation.cpp) -target_link_libraries(gtest_navigation libgtest ${PROJECT_NAME}) # Observations test gnss_utils_add_gtest(gtest_observations gtest_observations.cpp) -target_link_libraries(gtest_observations libgtest ${PROJECT_NAME}) # TDCP test gnss_utils_add_gtest(gtest_tdcp gtest_tdcp.cpp) -target_link_libraries(gtest_tdcp ${PROJECT_NAME}) # Transformations test gnss_utils_add_gtest(gtest_transformations gtest_transformations.cpp) -target_link_libraries(gtest_transformations ${PROJECT_NAME}) # ChiSquare test -gnss_utils_add_gtest(gtest_chisquare gtest_chisquare.cpp) -target_link_libraries(gtest_chisquare ${PROJECT_NAME}) \ No newline at end of file +gnss_utils_add_gtest(gtest_chisquare gtest_chisquare.cpp) \ No newline at end of file diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt index 3c3c48c74516488a8c4eb24c2492bd81a5edc7f9..d066e223567d362f5b253ef7dd55e8f8f8ace188 100644 --- a/test/gtest/CMakeLists.txt +++ b/test/gtest/CMakeLists.txt @@ -1,65 +1,78 @@ -cmake_minimum_required(VERSION 2.8.8) -project(gtest_builder C CXX) +if(${CMAKE_VERSION} VERSION_LESS "3.11.0") + message("CMake version less than 3.11.0") -# We need thread support -#find_package(Threads REQUIRED) + # Enable ExternalProject CMake module + include(ExternalProject) -# Enable ExternalProject CMake module -include(ExternalProject) + set(GTEST_FORCE_SHARED_CRT ON) + set(GTEST_DISABLE_PTHREADS ON) # without this in ubuntu 18.04 we get linking errors + + # Download GoogleTest + ExternalProject_Add(googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG v1.8.x + # TIMEOUT 1 # We'll try this + CMAKE_ARGS -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=DebugLibs + -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=ReleaseLibs + -DCMAKE_CXX_FLAGS=${MSVC_COMPILER_DEFS} + -Dgtest_force_shared_crt=${GTEST_FORCE_SHARED_CRT} + -Dgtest_disable_pthreads=${GTEST_DISABLE_PTHREADS} + -DBUILD_GTEST=ON + PREFIX "${CMAKE_CURRENT_BINARY_DIR}" + # Disable install step + INSTALL_COMMAND "" + UPDATE_DISCONNECTED 1 # 1: do not update googletest; 0: update googletest via github + ) -set(GTEST_FORCE_SHARED_CRT ON) -set(GTEST_DISABLE_PTHREADS OFF) + # Get GTest source and binary directories from CMake project -# For some reason I need to disable PTHREADS -# with g++ (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 -# This is a known issue for MinGW : -# https://github.com/google/shaderc/pull/174 -#if(MINGW) - set(GTEST_DISABLE_PTHREADS ON) -#endif() + # Specify include dir + ExternalProject_Get_Property(googletest source_dir) + set(GTEST_INCLUDE_DIRS ${source_dir}/googletest/include PARENT_SCOPE) -# Download GoogleTest -ExternalProject_Add(googletest - GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG v1.8.x - # TIMEOUT 1 # We'll try this - CMAKE_ARGS -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=DebugLibs - -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=ReleaseLibs - -DCMAKE_CXX_FLAGS=${MSVC_COMPILER_DEFS} - -Dgtest_force_shared_crt=${GTEST_FORCE_SHARED_CRT} - -Dgtest_disable_pthreads=${GTEST_DISABLE_PTHREADS} - -DBUILD_GTEST=ON - PREFIX "${CMAKE_CURRENT_BINARY_DIR}" - # Disable install step - INSTALL_COMMAND "" - UPDATE_DISCONNECTED 1 # 1: do not update googletest; 0: update googletest via github -) + # Specify MainTest's link libraries + ExternalProject_Get_Property(googletest binary_dir) + set(GTEST_LIBS_DIR ${binary_dir}/googlemock/gtest PARENT_SCOPE) -# Get GTest source and binary directories from CMake project + # Create a libgtest target to be used as a dependency by test programs + add_library(libgtest IMPORTED STATIC GLOBAL) + add_dependencies(libgtest googletest) -# Specify include dir -ExternalProject_Get_Property(googletest source_dir) -set(GTEST_INCLUDE_DIRS ${source_dir}/googletest/include PARENT_SCOPE) + # Set libgtest properties + set_target_properties(libgtest PROPERTIES + "IMPORTED_LOCATION" "${binary_dir}/googlemock/gtest/libgtest.a" + "IMPORTED_LINK_INTERFACE_LIBRARIES" "${CMAKE_THREAD_LIBS_INIT}" + ) -# Specify MainTest's link libraries -ExternalProject_Get_Property(googletest binary_dir) -set(GTEST_LIBS_DIR ${binary_dir}/googlemock/gtest PARENT_SCOPE) +else() -# Create a libgtest target to be used as a dependency by test programs -add_library(libgtest IMPORTED STATIC GLOBAL) -add_dependencies(libgtest googletest) + message("CMake version equal or greater than 3.11.0") -# Set libgtest properties -set_target_properties(libgtest PROPERTIES - "IMPORTED_LOCATION" "${binary_dir}/googlemock/gtest/libgtest.a" - "IMPORTED_LINK_INTERFACE_LIBRARIES" "${CMAKE_THREAD_LIBS_INIT}" -) + include(FetchContent) + FetchContent_Declare( + googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG main) + + #FetchContent_MakeAvailable(googletest) + # Disable installation of googletest: https://stackoverflow.com/questions/65527126/disable-install-for-fetchcontent + FetchContent_GetProperties(googletest) + if(NOT googletest_POPULATED) + FetchContent_Populate(googletest) + add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR} EXCLUDE_FROM_ALL) + endif() + +endif() + function(gnss_utils_add_gtest target) add_executable(${target} ${ARGN}) - add_dependencies(${target} libgtest) - target_link_libraries(${target} libgtest) - - #WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin + if(${CMAKE_VERSION} VERSION_LESS "3.11.0") + add_dependencies(${target} libgtest) + target_link_libraries(${target} PUBLIC libgtest ${PROJECT_NAME}) + target_include_directories(${target} PUBLIC ${GTEST_INCLUDE_DIRS}) + else() + target_link_libraries(${target} PUBLIC gtest_main ${PROJECT_NAME}) + endif() add_test(NAME ${target} COMMAND ${target}) endfunction()