1
2
3function(get_guile_env)
4  set(_GNC_MODULE_PATH ${LIBDIR_BUILD}:${LIBDIR_BUILD}/gnucash)
5  if (WIN32)
6    set(_GNC_MODULE_PATH ${CMAKE_BINARY_DIR}/bin)
7  endif()
8  set(env "")
9  list(APPEND env "GNC_UNINSTALLED=yes")
10  list(APPEND env "GNC_BUILDDIR=${CMAKE_BINARY_DIR}")
11  if (APPLE)
12    list(APPEND env "DYLD_LIBRARY_PATH=${_GNC_MODULE_PATH}:$ENV{DYLD_LIBRARY_PATH}")
13  endif()
14  if (UNIX)
15    list(APPEND env "LD_LIBRARY_PATH=${_GNC_MODULE_PATH}:$ENV{LD_LIBRARY_PATH}")
16  endif()
17  if (MINGW64)
18    set(fpath "")
19    set(path $ENV{PATH})
20    list(INSERT path 0 ${CMAKE_BINARY_DIR}/bin)
21    foreach(dir ${path})
22      string(REGEX REPLACE "^([A-Za-z]):" "/\\1" dir ${dir})
23      string(REGEX REPLACE "\\\\" "/" dir ${dir})
24      set(fpath "${fpath}${dir}:")
25    endforeach(dir)
26    list(APPEND env "PATH=${fpath}")
27    set(compiled_path "${CMAKE_BINARY_DIR}/${GUILE_REL_SITECCACHEDIR}")
28    string(REGEX REPLACE "^([A-Za-z]):" "/\\1" compiled_path ${compiled_path})
29    list(APPEND env GUILE_LOAD_COMPILED_PATH=${compiled_path})
30  endif()
31  list(APPEND env "GNC_MODULE_PATH=${_GNC_MODULE_PATH}")
32  list(APPEND env "GUILE=${GUILE_EXECUTABLE}")
33
34  set(guile_load_paths "")
35  #list(APPEND guile_load_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITEDIR}")
36  list(APPEND guile_load_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITEDIR}/gnucash/deprecated") # Path to gnucash' deprecated modules
37  set(guile_load_path "${guile_load_paths}")
38
39  set(guile_load_compiled_paths "")
40  list(APPEND guile_load_compiled_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITECCACHEDIR}")
41  list(APPEND guile_load_compiled_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITECCACHEDIR}/gnucash/deprecated")
42  list(APPEND guile_load_compiled_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITECCACHEDIR}/tests")
43  set(guile_load_compiled_path "${guile_load_compiled_paths}")
44
45  if (MINGW64)
46    set(new_path "")
47    foreach(load_item ${guile_load_path})
48      string(REGEX REPLACE "^([A-Za-z]):" "/\\1" load_item ${load_item})
49      list(APPEND new_path ${load_item})
50    endforeach(load_item)
51    set(guile_load_path ${new_path})
52
53    set(new_path "")
54    foreach(load_item ${guile_load_compiled_path})
55      string(REGEX REPLACE "^([A-Za-z]):" "/\\1" load_item ${load_item})
56      list(APPEND new_path ${load_item})
57    endforeach(load_item)
58    set(guile_load_compiled_path ${new_path})
59  endif()
60  if (WIN32 AND NOT MINGW64)
61      string(REPLACE ";" "\\\\;" GUILE_LOAD_PATH "${guile_load_path}")
62      string(REPLACE ";" "\\\\;" GUILE_LOAD_COMPILED_PATH "${guile_load_compiled_path}")
63  else()
64      string(REPLACE ";" ":" GUILE_LOAD_PATH "${guile_load_path}")
65      string(REPLACE ";" ":" GUILE_LOAD_COMPILED_PATH "${guile_load_compiled_path}")
66  endif()
67  list(APPEND env "GUILE_LOAD_PATH=${GUILE_LOAD_PATH}")
68  list(APPEND env "GUILE_LOAD_COMPILED_PATH=${GUILE_LOAD_COMPILED_PATH}")
69  list(APPEND env "GUILE_WARN_DEPRECATED=detailed")
70  set(GUILE_ENV ${env} PARENT_SCOPE)
71endfunction()
72
73
74function(gnc_add_test _TARGET _SOURCE_FILES TEST_INCLUDE_VAR_NAME TEST_LIBS_VAR_NAME)
75  set(HAVE_ENV_VARS FALSE)
76  if (${ARGC} GREATER 4)
77    # Extra arguments are treated as environment variables
78    set(HAVE_ENV_VARS TRUE)
79  endif()
80  set(TEST_INCLUDE_DIRS ${${TEST_INCLUDE_VAR_NAME}})
81  set(TEST_LIBS ${${TEST_LIBS_VAR_NAME}})
82  set_source_files_properties (${_SOURCE_FILES} PROPERTIES OBJECT_DEPENDS ${CONFIG_H})
83  add_executable(${_TARGET} EXCLUDE_FROM_ALL ${_SOURCE_FILES})
84  target_link_libraries(${_TARGET} ${TEST_LIBS})
85  target_include_directories(${_TARGET} PRIVATE ${TEST_INCLUDE_DIRS})
86  if (${HAVE_ENV_VARS})
87    add_test(${_TARGET} ${CMAKE_COMMAND} -E env "GNC_UNINSTALLED=YES;GNC_BUILDDIR=${CMAKE_BINARY_DIR};${ARGN}"
88      ${CMAKE_BINARY_DIR}/bin/${_TARGET}
89    )
90    set_tests_properties(${_TARGET} PROPERTIES ENVIRONMENT "GNC_UNINSTALLED=YES;GNC_BUILDDIR=${CMAKE_BINARY_DIR};${ARGN}")
91  else()
92    if (CMAKE_GENERATOR STREQUAL Xcode)
93      add_test(NAME ${_TARGET} COMMAND ${_TARGET} CONFIGURATIONS Debug;Release)
94    else()
95      add_test(NAME ${_TARGET} COMMAND ${_TARGET})
96    endif()
97    set_tests_properties(${_TARGET} PROPERTIES ENVIRONMENT "GNC_UNINSTALLED=YES;GNC_BUILDDIR=${CMAKE_BINARY_DIR}")
98  endif()
99  add_dependencies(check ${_TARGET})
100endfunction()
101
102function(gnc_add_test_with_guile _TARGET _SOURCE_FILES TEST_INCLUDE_VAR_NAME TEST_LIBS_VAR_NAME)
103  get_guile_env()
104  gnc_add_test(${_TARGET} "${_SOURCE_FILES}" "${TEST_INCLUDE_VAR_NAME}" "${TEST_LIBS_VAR_NAME}"
105    "${GUILE_ENV};${ARGN}"
106  )
107endfunction()
108
109
110function(gnc_add_scheme_test _TARGET _SOURCE_FILE)
111  add_test(${_TARGET} ${CMAKE_COMMAND} -E env
112    ${GUILE_EXECUTABLE} --debug -c "(load-from-path \"${_TARGET}\")(exit (run-test))"
113  )
114  get_guile_env()
115  set_tests_properties(${_TARGET} PROPERTIES ENVIRONMENT "${GUILE_ENV};${ARGN}")
116endfunction()
117
118function(gnc_add_scheme_tests _SOURCE_FILES)
119  foreach(test_file ${_SOURCE_FILES})
120    get_filename_component(basename ${test_file} NAME_WE)
121    gnc_add_scheme_test(${basename} ${test_file})
122  endforeach()
123endfunction()
124
125function(gnc_gtest_configure)
126  message(STATUS "Checking for GTEST")
127  if (NOT DEFINED ${GTEST_ROOT})
128    set(GTEST_ROOT $ENV{GTEST_ROOT})
129  endif()
130  unset(GTEST_SRC_DIR CACHE)
131  if (GTEST_ROOT)
132    find_path(GTEST_SRC_DIR src/gtest-all.cc NO_CMAKE_SYSTEM_PATH
133      PATHS ${GTEST_ROOT}/googletest)
134  endif()
135  if (GTEST_SRC_DIR)
136    if (EXISTS ${GTEST_SRC_DIR}/include/gtest/gtest.h)
137      set(GTEST_INCLUDE_DIR ${GTEST_SRC_DIR}/include CACHE PATH "" FORCE)
138    else()
139      message(FATAL_ERROR "GTEST sources found, but it doesn't have 'gtest/gtest.h'")
140    endif()
141  else()
142    if (GTEST_ROOT)
143      message(FATAL_ERROR "GTEST sources not found in GTEST_ROOT")
144    endif()
145    find_path(GTEST_SRC_DIR src/gtest-all.cc
146      PATHS /usr/src/googletest/googletest)
147    if (GTEST_SRC_DIR)
148      find_path(GTEST_INCLUDE_DIR gtest/gtest.h NO_CMAKE_SYSTEM_PATH
149        PATHS ${GTEST_SRC_DIR}/include)
150    endif()
151  endif()
152  find_path(GTEST_INCLUDE_DIR gtest/gtest.h)
153  if (GTEST_SRC_DIR)
154    set(lib_gtest_SOURCES
155      "${GTEST_SRC_DIR}/src/gtest_main.cc"
156      "${GTEST_SRC_DIR}/src/gtest-all.cc"
157      PARENT_SCOPE)
158  else()
159    find_library(GTEST_SHARED_LIB gtest)
160    find_library(GTEST_MAIN_LIB gtest_main)
161    if (NOT (GTEST_SHARED_LIB AND GTEST_MAIN_LIB AND GTEST_INCLUDE_DIR))
162      message(FATAL_ERROR "GTEST not found. Please install it or set GTEST_ROOT")
163    endif()
164  endif()
165  set(THREADS_PREFER_PTHREAD_FLAG ON)
166  find_package(Threads REQUIRED)
167  set(GTEST_FOUND YES CACHE INTERNAL "Found GTest")
168
169  message(STATUS "Checking for GMOCK")
170  unset(GMOCK_SRC_DIR CACHE)
171  if (GTEST_ROOT)
172    find_path(GMOCK_SRC_DIR src/gmock-all.cc NO_CMAKE_SYSTEM_PATH
173      PATHS ${GTEST_ROOT}/googlemock)
174  endif()
175  if (GMOCK_SRC_DIR)
176    if (EXISTS ${GMOCK_SRC_DIR}/include/gmock/gmock.h)
177      set(GMOCK_INCLUDE_DIR ${GMOCK_SRC_DIR}/include CACHE PATH "" FORCE)
178    else()
179      message(FATAL_ERROR "GMOCK sources found, but it doesn't have 'gmock/gmock.h'")
180    endif()
181  else()
182    if (GTEST_ROOT)
183      message(FATAL_ERROR "GMOCK sources not found in GTEST_ROOT")
184    endif()
185    find_path(GMOCK_SRC_DIR src/gmock-all.cc
186      PATHS /usr/src/googletest/googlemock)
187    if (GMOCK_SRC_DIR)
188      find_path(GMOCK_INCLUDE_DIR gmock/gmock.h NO_CMAKE_SYSTEM_PATH
189        PATHS ${GMOCK_SRC_DIR}/include)
190    endif()
191  endif()
192  find_path(GMOCK_INCLUDE_DIR gmock/gmock.h)
193  if (GMOCK_SRC_DIR)
194    set(GMOCK_SRC "${GMOCK_SRC_DIR}/src/gmock-all.cc" PARENT_SCOPE)
195    set(GMOCK_LIB "${CMAKE_BINARY_DIR}/common/test-core/libgmock.a" PARENT_SCOPE)
196  else()
197    find_library(GMOCK_SHARED_LIB gmock)
198    find_library(GMOCK_MAIN_LIB gmock_main)
199    if (GMOCK_MAIN_LIB AND GMOCK_SHARED_LIB AND GMOCK_INCLUDE_DIR)
200      set(GMOCK_LIB "${GMOCK_SHARED_LIB};${GMOCK_MAIN_LIB}" PARENT_SCOPE)
201    else()
202      message(FATAL_ERROR "GMOCK not found. Please install it or set GTEST_ROOT")
203    endif()
204  endif()
205  set(GMOCK_FOUND YES PARENT_SCOPE)
206endfunction()
207