mirror of
https://github.com/Gnucash/gnucash.git
synced 2024-11-21 16:38:06 -06:00
5f18971afb
Guile 3.0.5 fixed what they thought was a bug whering run-test returned the rv of test-runner-on-final instead of the current test runner. Ctest considered the returned object to be a successful test and always reported the test passing.
252 lines
9.9 KiB
CMake
252 lines
9.9 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}\")
|
|
(let ((result (run-test)))
|
|
(if (boolean? result)
|
|
(exit result)
|
|
(exit (test-runner-fail-count result))))
|
|
"
|
|
)
|
|
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()
|