if (DEFINED ENV{CMAKE_GCOV})
cmake_minimum_required(VERSION 3.15)
else()
cmake_minimum_required(VERSION 3.10)
endif()
cmake_policy(SET CMP0048 NEW)


## CONFIG

project(wrmath VERSION 0.0.1 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})

# Don't warn on unused functions, because this is a library and not all
# functions might be used.
# add_compile_options(-Werror -Wno-unused-function -Wall -g -O0)

if (DEFINED ENV{CMAKE_GCOV})
add_compile_options(-fprofile-arcs -ftest-coverage)
# Need CMake 3.15+.
add_link_options(-fprofile-arcs -ftest-coverage)
add_custom_target(coverage COMMAND lcov -d . -t wrmath -o wrmath.info -c -i
			   COMMAND lcov -d . -t wrmath -o wrmath.info -c
			   COMMAND lcov -d . -t wrmath -o wrmath.info -r wrmath.info *gtest*
			   COMMAND genhtml -o coverage-report wrmath.info)
message(STATUS, "Code coverage enabled.")
endif()


include_directories(${PROJECT_SOURCE_DIR})

file(GLOB_RECURSE ${PROJECT_NAME}_HEADERS wrmath/**.h)
file(GLOB_RECURSE ${PROJECT_NAME}_SOURCES wrmath/*.cc)


## BUILD

add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SOURCES})

add_executable(euler2quat tools/euler2quat.cc)
target_link_libraries(euler2quat ${PROJECT_NAME})
set_target_properties(euler2quat PROPERTIES
		FOLDER bin
		RUNTIME_OUTPUT_DIRECTORY bin)

add_executable(quaternion tools/quaternion.cc)
target_link_libraries(quaternion ${PROJECT_NAME})
set_target_properties(quaternion PROPERTIES
		FOLDER bin
		RUNTIME_OUTPUT_DIRECTORY bin)

## INSTALL

install(TARGETS ${PROJECT_NAME} DESTINATION lib)
install(TARGETS euler2quat DESTINATION bin)
install(TARGETS quaternion DESTINATION bin)
install(DIRECTORY include/${PROJECT_NAME}
	DESTINATION include/
	FILES_MATCHING PATTERN "*.h")
install(DIRECTORY docs/sphinx/_build/html/
	DESTINATION share/doc/${PROJECT_NAME}
	FILES_MATCHING PATTERN "*.html")
	 


## TEST

# From Modern CMake:
# https://cliutils.gitlab.io/modern-cmake/chapters/testing/googletest.html
add_subdirectory("${PROJECT_SOURCE_DIR}/extern/googletest" "extern/googletest" EXCLUDE_FROM_ALL)
include_directories("${gtest_SOURCE_DIR}/include")
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
)
set_target_properties(gtest PROPERTIES FOLDER extern)
set_target_properties(gtest_main PROPERTIES FOLDER extern)
set_target_properties(gmock PROPERTIES FOLDER extern)
set_target_properties(gmock_main PROPERTIES FOLDER extern)

include(CTest)
set(TEST_EXECS)
macro(package_add_gtest TESTNAME)
	add_executable(${TESTNAME} ${ARGN})
	target_link_libraries(${TESTNAME} gtest_main ${PROJECT_NAME})
	target_compile_options(${TESTNAME} PUBLIC ${GTEST_CFLAGS})
	add_test(NAME ${TESTNAME} COMMAND ${TESTNAME})
	set_target_properties(${TESTNAME} PROPERTIES
		FOLDER tests
		RUNTIME_OUTPUT_DIRECTORY tests)
	list(APPEND TEST_EXECS ${TESTNAME})
endmacro()

# define the tests
package_add_gtest(vector_test 		test/vector_test.cc)
package_add_gtest(orientation_test 	test/orientation_test.cc)
package_add_gtest(quaternion_test 	test/quaternion_test.cc)
package_add_gtest(madgwick_test		test/madgwick_test.cc)

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose DEPENDS ${TEST_EXECS})


## DEPLOY

include(CMakePack.txt)


## DOCUMENTATE
## add_subdirectory ("docs")
