mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
This can be used with or without COVERAGE, though if without the results will reflect only the Scheme code exercised by the tests.
248 lines
9.8 KiB
CMake
248 lines
9.8 KiB
CMake
|
|
|
|
function(get_guile_env)
|
|
set(_GNC_MODULE_PATH ${LIBDIR_BUILD}:${LIBDIR_BUILD}/gnucash)
|
|
if (WIN32)
|
|
set(_GNC_MODULE_PATH ${CMAKE_BINARY_DIR}/bin)
|
|
endif()
|
|
set(env "")
|
|
list(APPEND env "GNC_UNINSTALLED=yes")
|
|
list(APPEND env "GNC_BUILDDIR=${CMAKE_BINARY_DIR}")
|
|
if (APPLE)
|
|
list(APPEND env "DYLD_LIBRARY_PATH=${_GNC_MODULE_PATH}:$ENV{DYLD_LIBRARY_PATH}")
|
|
endif()
|
|
if (UNIX)
|
|
list(APPEND env "LD_LIBRARY_PATH=${_GNC_MODULE_PATH}:$ENV{LD_LIBRARY_PATH}")
|
|
endif()
|
|
if (MINGW64)
|
|
set(fpath "")
|
|
set(path $ENV{PATH})
|
|
list(INSERT path 0 ${CMAKE_BINARY_DIR}/bin)
|
|
foreach(dir ${path})
|
|
string(REGEX REPLACE "^([A-Za-z]):" "/\\1" dir ${dir})
|
|
string(REGEX REPLACE "\\\\" "/" dir ${dir})
|
|
set(fpath "${fpath}${dir}:")
|
|
endforeach(dir)
|
|
list(APPEND env "PATH=${fpath}")
|
|
set(compiled_path "${CMAKE_BINARY_DIR}/${GUILE_REL_SITECCACHEDIR}")
|
|
string(REGEX REPLACE "^([A-Za-z]):" "/\\1" compiled_path ${compiled_path})
|
|
list(APPEND env GUILE_LOAD_COMPILED_PATH=${compiled_path})
|
|
endif()
|
|
list(APPEND env "GNC_MODULE_PATH=${_GNC_MODULE_PATH}")
|
|
list(APPEND env "GUILE=${GUILE_EXECUTABLE}")
|
|
|
|
set(guile_load_paths "")
|
|
list(APPEND guile_load_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITEDIR}")
|
|
list(APPEND guile_load_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITEDIR}/gnucash/deprecated") # Path to gnucash' deprecated modules
|
|
if (GUILE_COVERAGE)
|
|
list(APPEND guile_load_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITEDIR}/gnucash")
|
|
list(APPEND guile_load_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITEDIR}/gnucash/report")
|
|
list(APPEND guile_load_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITEDIR}/gnucash/reports")
|
|
list(APPEND guile_load_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITEDIR}/gnucash/engine")
|
|
list(APPEND guile_load_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITEDIR}/gnucash/app-utils")
|
|
list(APPEND guile_load_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITEDIR}/gnucash/qif-import")
|
|
|
|
endif()
|
|
set(guile_load_path "${guile_load_paths}")
|
|
|
|
set(guile_load_compiled_paths "")
|
|
list(APPEND guile_load_compiled_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITECCACHEDIR}")
|
|
list(APPEND guile_load_compiled_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITECCACHEDIR}/gnucash/deprecated")
|
|
list(APPEND guile_load_compiled_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITECCACHEDIR}/tests")
|
|
set(guile_load_compiled_path "${guile_load_compiled_paths}")
|
|
|
|
if (MINGW64)
|
|
set(new_path "")
|
|
foreach(load_item ${guile_load_path})
|
|
string(REGEX REPLACE "^([A-Za-z]):" "/\\1" load_item ${load_item})
|
|
list(APPEND new_path ${load_item})
|
|
endforeach(load_item)
|
|
set(guile_load_path ${new_path})
|
|
|
|
set(new_path "")
|
|
foreach(load_item ${guile_load_compiled_path})
|
|
string(REGEX REPLACE "^([A-Za-z]):" "/\\1" load_item ${load_item})
|
|
list(APPEND new_path ${load_item})
|
|
endforeach(load_item)
|
|
set(guile_load_compiled_path ${new_path})
|
|
endif()
|
|
if (WIN32 AND NOT MINGW64)
|
|
string(REPLACE ";" "\\\\;" GUILE_LOAD_PATH "${guile_load_path}")
|
|
string(REPLACE ";" "\\\\;" GUILE_LOAD_COMPILED_PATH "${guile_load_compiled_path}")
|
|
else()
|
|
string(REPLACE ";" ":" GUILE_LOAD_PATH "${guile_load_path}")
|
|
string(REPLACE ";" ":" GUILE_LOAD_COMPILED_PATH "${guile_load_compiled_path}")
|
|
endif()
|
|
list(APPEND env "GUILE_LOAD_PATH=${GUILE_LOAD_PATH}")
|
|
list(APPEND env "GUILE_LOAD_COMPILED_PATH=${GUILE_LOAD_COMPILED_PATH}")
|
|
list(APPEND env "GUILE_WARN_DEPRECATED=detailed")
|
|
set(GUILE_ENV ${env} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
|
|
function(gnc_add_test _TARGET _SOURCE_FILES TEST_INCLUDE_VAR_NAME TEST_LIBS_VAR_NAME)
|
|
set(HAVE_ENV_VARS FALSE)
|
|
if (${ARGC} GREATER 4)
|
|
# Extra arguments are treated as environment variables
|
|
set(HAVE_ENV_VARS TRUE)
|
|
endif()
|
|
set(ENVVARS "GNC_UNINSTALLED=YES;GNC_BUILDDIR=${CMAKE_BINARY_DIR}")
|
|
if (HAVE_ENV_VARS)
|
|
list(APPEND ENVVARS ${ARGN})
|
|
endif()
|
|
set(TEST_INCLUDE_DIRS ${${TEST_INCLUDE_VAR_NAME}})
|
|
set(TEST_LIBS ${${TEST_LIBS_VAR_NAME}})
|
|
set_source_files_properties (${_SOURCE_FILES} PROPERTIES OBJECT_DEPENDS ${CONFIG_H})
|
|
if (CMAKE_GENERATOR STREQUAL Xcode)
|
|
add_test(NAME ${_TARGET} COMMAND ${_TARGET} CONFIGURATIONS Debug;Release)
|
|
else()
|
|
add_test(NAME ${_TARGET} COMMAND ${_TARGET})
|
|
endif()
|
|
add_executable(${_TARGET} EXCLUDE_FROM_ALL ${_SOURCE_FILES})
|
|
target_link_libraries(${_TARGET} PRIVATE ${TEST_LIBS})
|
|
target_include_directories(${_TARGET} PRIVATE ${TEST_INCLUDE_DIRS})
|
|
set_tests_properties(${_TARGET} PROPERTIES ENVIRONMENT "${ENVVARS}$<$<CONFIG:Asan>:;ASAN_OPTIONS=${ASAN_TEST_OPTIONS}>")
|
|
add_dependencies(check ${_TARGET})
|
|
endfunction()
|
|
|
|
function(gnc_add_test_with_guile _TARGET _SOURCE_FILES TEST_INCLUDE_VAR_NAME TEST_LIBS_VAR_NAME)
|
|
get_guile_env()
|
|
gnc_add_test(${_TARGET} "${_SOURCE_FILES}" "${TEST_INCLUDE_VAR_NAME}" "${TEST_LIBS_VAR_NAME}"
|
|
"${GUILE_ENV}$<$<CONFIG:Asan>:;${ASAN_DYNAMIC_LIB_ENV}>;${ARGN}"
|
|
)
|
|
endfunction()
|
|
|
|
function(gnc_add_scheme_test _TARGET _SOURCE_FILE)
|
|
if (GUILE_COVERAGE)
|
|
add_test(NAME ${_TARGET} COMMAND ${GUILE_EXECUTABLE} --debug -c "
|
|
(set! %load-hook
|
|
(lambda (filename)
|
|
(when (and filename
|
|
(string-contains filename \"${GUILE_REL_SITEDIR}\")
|
|
(not (string-prefix? \"${CMAKE_BINARY_DIR}\" filename)))
|
|
(format #t \"%load-path = ~s~%\" %load-path)
|
|
(format #t \"%load-compiled-path = ~s~%\" %load-compiled-path)
|
|
(error \"Loading guile/site file from outside build tree!\" filename))))
|
|
(load-from-path \"${_TARGET}\")
|
|
(use-modules (system vm coverage)
|
|
(system vm vm))
|
|
(call-with-values (lambda ()
|
|
(with-code-coverage
|
|
(lambda ()
|
|
(run-test))))
|
|
|
|
(lambda (data result)
|
|
(let ((port (open-output-file \"${coverage_dir}/${_TARGET}_results.info\")))
|
|
(coverage-data->lcov data port)
|
|
(close port))
|
|
(exit result)))
|
|
"
|
|
)
|
|
else()
|
|
add_test(NAME ${_TARGET} COMMAND ${GUILE_EXECUTABLE} --debug -c "
|
|
(set! %load-hook
|
|
(lambda (filename)
|
|
(when (and filename
|
|
(string-contains filename \"${GUILE_REL_SITEDIR}\")
|
|
(not (string-prefix? \"${CMAKE_BINARY_DIR}\" filename)))
|
|
(format #t \"%load-path = ~s~%\" %load-path)
|
|
(format #t \"%load-compiled-path = ~s~%\" %load-compiled-path)
|
|
(error \"Loading guile/site file from outside build tree!\" filename))))
|
|
(load-from-path \"${_TARGET}\")
|
|
(exit (run-test))"
|
|
)
|
|
endif()
|
|
get_guile_env()
|
|
set_tests_properties(${_TARGET} PROPERTIES ENVIRONMENT "${GUILE_ENV}$<$<CONFIG:Asan>:;${ASAN_DYNAMIC_LIB_ENV};ASAN_OPTIONS=${ASAN_TEST_OPTIONS}>;${ARGN}>")
|
|
endfunction()
|
|
|
|
function(gnc_add_scheme_tests _SOURCE_FILES)
|
|
foreach(test_file ${_SOURCE_FILES})
|
|
get_filename_component(basename ${test_file} NAME_WE)
|
|
gnc_add_scheme_test(${basename} ${test_file})
|
|
endforeach()
|
|
endfunction()
|
|
|
|
function(gnc_gtest_configure)
|
|
message(STATUS "Checking for GTEST")
|
|
if (NOT DEFINED ${GTEST_ROOT})
|
|
set(GTEST_ROOT $ENV{GTEST_ROOT})
|
|
endif()
|
|
unset(GTEST_SRC_DIR CACHE)
|
|
if (GTEST_ROOT)
|
|
find_path(GTEST_SRC_DIR src/gtest-all.cc NO_CMAKE_SYSTEM_PATH
|
|
PATHS ${GTEST_ROOT}/googletest)
|
|
endif()
|
|
if (GTEST_SRC_DIR)
|
|
if (EXISTS ${GTEST_SRC_DIR}/include/gtest/gtest.h)
|
|
set(GTEST_INCLUDE_DIR ${GTEST_SRC_DIR}/include CACHE PATH "" FORCE)
|
|
else()
|
|
message(FATAL_ERROR "GTEST sources found, but it doesn't have 'gtest/gtest.h'")
|
|
endif()
|
|
else()
|
|
if (GTEST_ROOT)
|
|
message(FATAL_ERROR "GTEST sources not found in GTEST_ROOT")
|
|
endif()
|
|
find_path(GTEST_SRC_DIR src/gtest-all.cc
|
|
PATHS /usr/src/googletest/googletest)
|
|
if (GTEST_SRC_DIR)
|
|
find_path(GTEST_INCLUDE_DIR gtest/gtest.h NO_CMAKE_SYSTEM_PATH
|
|
PATHS ${GTEST_SRC_DIR}/include)
|
|
endif()
|
|
endif()
|
|
find_path(GTEST_INCLUDE_DIR gtest/gtest.h)
|
|
if (GTEST_SRC_DIR)
|
|
set(lib_gtest_SOURCES
|
|
"${GTEST_SRC_DIR}/src/gtest_main.cc"
|
|
"${GTEST_SRC_DIR}/src/gtest-all.cc"
|
|
PARENT_SCOPE)
|
|
else()
|
|
find_library(GTEST_SHARED_LIB gtest)
|
|
find_library(GTEST_MAIN_LIB gtest_main)
|
|
if (NOT (GTEST_SHARED_LIB AND GTEST_MAIN_LIB AND GTEST_INCLUDE_DIR))
|
|
message(FATAL_ERROR "GTEST not found. Please install it or set GTEST_ROOT")
|
|
endif()
|
|
endif()
|
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
|
find_package(Threads REQUIRED)
|
|
set(GTEST_FOUND YES CACHE INTERNAL "Found GTest")
|
|
|
|
message(STATUS "Checking for GMOCK")
|
|
unset(GMOCK_SRC_DIR CACHE)
|
|
if (GTEST_ROOT)
|
|
find_path(GMOCK_SRC_DIR src/gmock-all.cc NO_CMAKE_SYSTEM_PATH
|
|
PATHS ${GTEST_ROOT}/googlemock)
|
|
endif()
|
|
if (GMOCK_SRC_DIR)
|
|
if (EXISTS ${GMOCK_SRC_DIR}/include/gmock/gmock.h)
|
|
set(GMOCK_INCLUDE_DIR ${GMOCK_SRC_DIR}/include CACHE PATH "" FORCE)
|
|
else()
|
|
message(FATAL_ERROR "GMOCK sources found, but it doesn't have 'gmock/gmock.h'")
|
|
endif()
|
|
else()
|
|
if (GTEST_ROOT)
|
|
message(FATAL_ERROR "GMOCK sources not found in GTEST_ROOT")
|
|
endif()
|
|
find_path(GMOCK_SRC_DIR src/gmock-all.cc
|
|
PATHS /usr/src/googletest/googlemock)
|
|
if (GMOCK_SRC_DIR)
|
|
find_path(GMOCK_INCLUDE_DIR gmock/gmock.h NO_CMAKE_SYSTEM_PATH
|
|
PATHS ${GMOCK_SRC_DIR}/include)
|
|
endif()
|
|
endif()
|
|
find_path(GMOCK_INCLUDE_DIR gmock/gmock.h)
|
|
if (GMOCK_SRC_DIR)
|
|
set(GMOCK_SRC "${GMOCK_SRC_DIR}/src/gmock-all.cc" PARENT_SCOPE)
|
|
set(GMOCK_LIB "${CMAKE_BINARY_DIR}/common/test-core/libgmock.a" PARENT_SCOPE)
|
|
else()
|
|
find_library(GMOCK_SHARED_LIB gmock)
|
|
find_library(GMOCK_MAIN_LIB gmock_main)
|
|
if (GMOCK_MAIN_LIB AND GMOCK_SHARED_LIB AND GMOCK_INCLUDE_DIR)
|
|
set(GMOCK_LIB "${GMOCK_SHARED_LIB};${GMOCK_MAIN_LIB}" PARENT_SCOPE)
|
|
else()
|
|
message(FATAL_ERROR "GMOCK not found. Please install it or set GTEST_ROOT")
|
|
endif()
|
|
endif()
|
|
set(GMOCK_FOUND YES PARENT_SCOPE)
|
|
endfunction()
|