xref: /aosp_15_r20/external/eigen/test/CMakeLists.txt (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1# The file split_test_helper.h was generated at first run,
2# it is now included in test/
3if(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/split_test_helper.h)
4  file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/split_test_helper.h)
5endif()
6
7# check if we have a Fortran compiler
8include(CheckLanguage)
9check_language(Fortran)
10if(CMAKE_Fortran_COMPILER)
11  enable_language(Fortran)
12  set(EIGEN_Fortran_COMPILER_WORKS ON)
13else()
14  set(EIGEN_Fortran_COMPILER_WORKS OFF)
15  # search for a default Lapack library to complete Eigen's one
16  find_package(LAPACK QUIET)
17endif()
18
19# TODO do the same for EXTERNAL_LAPACK
20option(EIGEN_TEST_EXTERNAL_BLAS "Use external BLAS library for testsuite" OFF)
21if(EIGEN_TEST_EXTERNAL_BLAS)
22  find_package(BLAS REQUIRED)
23  message(STATUS "BLAS_COMPILER_FLAGS: ${BLAS_COMPILER_FLAGS}")
24  add_definitions("-DEIGEN_USE_BLAS") # is adding  ${BLAS_COMPILER_FLAGS} necessary?
25  list(APPEND EXTERNAL_LIBS "${BLAS_LIBRARIES}")
26endif()
27
28# configure blas/lapack (use Eigen's ones)
29set(EIGEN_BLAS_LIBRARIES eigen_blas)
30set(EIGEN_LAPACK_LIBRARIES eigen_lapack)
31
32set(EIGEN_TEST_MATRIX_DIR "" CACHE STRING "Enable testing of realword sparse matrices contained in the specified path")
33if(EIGEN_TEST_MATRIX_DIR)
34  if(NOT WIN32)
35    message(STATUS "Test realworld sparse matrices: ${EIGEN_TEST_MATRIX_DIR}")
36    add_definitions( -DTEST_REAL_CASES="${EIGEN_TEST_MATRIX_DIR}" )
37  else()
38    message(STATUS "REAL CASES CAN NOT BE CURRENTLY TESTED ON WIN32")
39  endif()
40endif()
41
42set(SPARSE_LIBS " ")
43
44find_package(CHOLMOD)
45if(CHOLMOD_FOUND)
46  add_definitions("-DEIGEN_CHOLMOD_SUPPORT")
47  include_directories(${CHOLMOD_INCLUDES})
48  set(SPARSE_LIBS ${SPARSE_LIBS} ${CHOLMOD_LIBRARIES} ${EIGEN_BLAS_LIBRARIES} ${EIGEN_LAPACK_LIBRARIES})
49  set(CHOLMOD_ALL_LIBS  ${CHOLMOD_LIBRARIES} ${EIGEN_BLAS_LIBRARIES} ${EIGEN_LAPACK_LIBRARIES})
50  ei_add_property(EIGEN_TESTED_BACKENDS "CHOLMOD, ")
51else()
52  ei_add_property(EIGEN_MISSING_BACKENDS "CHOLMOD, ")
53endif()
54
55find_package(UMFPACK)
56if(UMFPACK_FOUND)
57  add_definitions("-DEIGEN_UMFPACK_SUPPORT")
58  include_directories(${UMFPACK_INCLUDES})
59  set(SPARSE_LIBS ${SPARSE_LIBS} ${UMFPACK_LIBRARIES} ${EIGEN_BLAS_LIBRARIES})
60  set(UMFPACK_ALL_LIBS ${UMFPACK_LIBRARIES} ${EIGEN_BLAS_LIBRARIES})
61  ei_add_property(EIGEN_TESTED_BACKENDS "UMFPACK, ")
62else()
63  ei_add_property(EIGEN_MISSING_BACKENDS "UMFPACK, ")
64endif()
65
66find_package(KLU)
67if(KLU_FOUND)
68  add_definitions("-DEIGEN_KLU_SUPPORT")
69  include_directories(${KLU_INCLUDES})
70  set(SPARSE_LIBS ${SPARSE_LIBS} ${KLU_LIBRARIES} ${EIGEN_BLAS_LIBRARIES})
71  set(KLU_ALL_LIBS ${KLU_LIBRARIES} ${EIGEN_BLAS_LIBRARIES})
72  ei_add_property(EIGEN_TESTED_BACKENDS "KLU, ")
73else()
74  ei_add_property(EIGEN_MISSING_BACKENDS "KLU, ")
75endif()
76
77find_package(SuperLU 4.0)
78if(SuperLU_FOUND)
79  add_definitions("-DEIGEN_SUPERLU_SUPPORT")
80  include_directories(${SUPERLU_INCLUDES})
81  set(SPARSE_LIBS ${SPARSE_LIBS} ${SUPERLU_LIBRARIES} ${EIGEN_BLAS_LIBRARIES})
82  set(SUPERLU_ALL_LIBS ${SUPERLU_LIBRARIES} ${EIGEN_BLAS_LIBRARIES})
83  ei_add_property(EIGEN_TESTED_BACKENDS  "SuperLU, ")
84else()
85  ei_add_property(EIGEN_MISSING_BACKENDS  "SuperLU, ")
86endif()
87
88
89find_package(PASTIX QUIET COMPONENTS METIS SEQ)
90# check that the PASTIX found is a version without MPI
91find_path(PASTIX_pastix_nompi.h_INCLUDE_DIRS
92  NAMES pastix_nompi.h
93  HINTS ${PASTIX_INCLUDE_DIRS}
94)
95if (NOT PASTIX_pastix_nompi.h_INCLUDE_DIRS)
96  message(STATUS "A version of Pastix has been found but pastix_nompi.h does not exist in the include directory."
97                 " Because Eigen tests require a version without MPI, we disable the Pastix backend.")
98endif()
99if(PASTIX_FOUND AND PASTIX_pastix_nompi.h_INCLUDE_DIRS)
100  add_definitions("-DEIGEN_PASTIX_SUPPORT")
101  include_directories(${PASTIX_INCLUDE_DIRS_DEP})
102  if(SCOTCH_FOUND)
103    include_directories(${SCOTCH_INCLUDE_DIRS})
104    set(PASTIX_LIBRARIES ${PASTIX_LIBRARIES} ${SCOTCH_LIBRARIES})
105  elseif(METIS_FOUND)
106    include_directories(${METIS_INCLUDE_DIRS})
107    set(PASTIX_LIBRARIES ${PASTIX_LIBRARIES} ${METIS_LIBRARIES})
108  else()
109    ei_add_property(EIGEN_MISSING_BACKENDS  "PaStiX, ")
110  endif()
111  set(SPARSE_LIBS ${SPARSE_LIBS} ${PASTIX_LIBRARIES_DEP} ${ORDERING_LIBRARIES})
112  set(PASTIX_ALL_LIBS ${PASTIX_LIBRARIES_DEP})
113  ei_add_property(EIGEN_TESTED_BACKENDS  "PaStiX, ")
114else()
115  ei_add_property(EIGEN_MISSING_BACKENDS  "PaStiX, ")
116endif()
117
118if(METIS_FOUND)
119  add_definitions("-DEIGEN_METIS_SUPPORT")
120  include_directories(${METIS_INCLUDE_DIRS})
121  ei_add_property(EIGEN_TESTED_BACKENDS "METIS, ")
122else()
123  ei_add_property(EIGEN_MISSING_BACKENDS "METIS, ")
124endif()
125
126find_package(SPQR)
127if(SPQR_FOUND AND CHOLMOD_FOUND AND (EIGEN_Fortran_COMPILER_WORKS OR LAPACK_FOUND) )
128  add_definitions("-DEIGEN_SPQR_SUPPORT")
129  include_directories(${SPQR_INCLUDES})
130  set(SPQR_ALL_LIBS ${SPQR_LIBRARIES} ${CHOLMOD_LIBRARIES} ${EIGEN_LAPACK_LIBRARIES} ${EIGEN_BLAS_LIBRARIES} ${LAPACK_LIBRARIES})
131  set(SPARSE_LIBS ${SPARSE_LIBS} ${SPQR_ALL_LIBS})
132  ei_add_property(EIGEN_TESTED_BACKENDS "SPQR, ")
133else()
134  ei_add_property(EIGEN_MISSING_BACKENDS "SPQR, ")
135endif()
136
137option(EIGEN_TEST_NOQT "Disable Qt support in unit tests" OFF)
138if(NOT EIGEN_TEST_NOQT)
139  find_package(Qt4)
140  if(QT4_FOUND)
141    include(${QT_USE_FILE})
142    ei_add_property(EIGEN_TESTED_BACKENDS  "Qt4 support, ")
143  else()
144    ei_add_property(EIGEN_MISSING_BACKENDS  "Qt4 support, ")
145  endif()
146endif()
147
148if(TEST_LIB)
149  add_definitions("-DEIGEN_EXTERN_INSTANTIATIONS=1")
150endif()
151
152set_property(GLOBAL PROPERTY EIGEN_CURRENT_SUBPROJECT "Official")
153add_custom_target(BuildOfficial)
154
155ei_add_test(rand)
156ei_add_test(meta)
157ei_add_test(numext)
158ei_add_test(sizeof)
159ei_add_test(dynalloc)
160ei_add_test(nomalloc)
161ei_add_test(first_aligned)
162ei_add_test(type_alias)
163ei_add_test(nullary)
164ei_add_test(mixingtypes)
165ei_add_test(io)
166ei_add_test(packetmath "-DEIGEN_FAST_MATH=1")
167ei_add_test(vectorization_logic)
168ei_add_test(basicstuff)
169ei_add_test(constructor)
170ei_add_test(linearstructure)
171ei_add_test(integer_types)
172ei_add_test(unalignedcount)
173if(NOT EIGEN_TEST_NO_EXCEPTIONS AND NOT EIGEN_TEST_OPENMP)
174  ei_add_test(exceptions)
175endif()
176ei_add_test(redux)
177ei_add_test(visitor)
178ei_add_test(block)
179ei_add_test(corners)
180ei_add_test(symbolic_index)
181ei_add_test(indexed_view)
182ei_add_test(reshape)
183ei_add_test(swap)
184ei_add_test(resize)
185ei_add_test(conservative_resize)
186ei_add_test(product_small)
187ei_add_test(product_large)
188ei_add_test(product_extra)
189ei_add_test(diagonalmatrices)
190ei_add_test(adjoint)
191ei_add_test(diagonal)
192ei_add_test(miscmatrices)
193ei_add_test(commainitializer)
194ei_add_test(smallvectors)
195ei_add_test(mapped_matrix)
196ei_add_test(mapstride)
197ei_add_test(mapstaticmethods)
198ei_add_test(array_cwise)
199ei_add_test(array_for_matrix)
200ei_add_test(array_replicate)
201ei_add_test(array_reverse)
202ei_add_test(ref)
203ei_add_test(is_same_dense)
204ei_add_test(triangular)
205ei_add_test(selfadjoint)
206ei_add_test(product_selfadjoint)
207ei_add_test(product_symm)
208ei_add_test(product_syrk)
209ei_add_test(product_trmv)
210ei_add_test(product_trmm)
211ei_add_test(product_trsolve)
212ei_add_test(product_mmtr)
213ei_add_test(product_notemporary)
214ei_add_test(stable_norm)
215ei_add_test(permutationmatrices)
216ei_add_test(bandmatrix)
217ei_add_test(cholesky)
218ei_add_test(lu)
219ei_add_test(determinant)
220ei_add_test(inverse)
221ei_add_test(qr)
222ei_add_test(qr_colpivoting)
223ei_add_test(qr_fullpivoting)
224ei_add_test(upperbidiagonalization)
225ei_add_test(hessenberg)
226ei_add_test(schur_real)
227ei_add_test(schur_complex)
228ei_add_test(eigensolver_selfadjoint)
229ei_add_test(eigensolver_generic)
230ei_add_test(eigensolver_complex)
231ei_add_test(real_qz)
232ei_add_test(eigensolver_generalized_real)
233ei_add_test(jacobi)
234ei_add_test(jacobisvd)
235ei_add_test(bdcsvd)
236ei_add_test(householder)
237ei_add_test(geo_orthomethods)
238ei_add_test(geo_quaternion)
239ei_add_test(geo_eulerangles)
240ei_add_test(geo_parametrizedline)
241ei_add_test(geo_alignedbox)
242ei_add_test(geo_hyperplane)
243ei_add_test(geo_transformations)
244ei_add_test(geo_homogeneous)
245ei_add_test(stdvector)
246ei_add_test(stdvector_overload)
247ei_add_test(stdlist)
248ei_add_test(stdlist_overload)
249ei_add_test(stddeque)
250ei_add_test(stddeque_overload)
251ei_add_test(sparse_basic)
252ei_add_test(sparse_block)
253ei_add_test(sparse_vector)
254ei_add_test(sparse_product)
255ei_add_test(sparse_ref)
256ei_add_test(sparse_solvers)
257ei_add_test(sparse_permutations)
258ei_add_test(simplicial_cholesky)
259ei_add_test(conjugate_gradient)
260ei_add_test(incomplete_cholesky)
261ei_add_test(bicgstab)
262ei_add_test(lscg)
263ei_add_test(sparselu)
264ei_add_test(sparseqr)
265ei_add_test(umeyama)
266ei_add_test(nesting_ops "${CMAKE_CXX_FLAGS_DEBUG}")
267ei_add_test(nestbyvalue)
268ei_add_test(zerosized)
269ei_add_test(dontalign)
270ei_add_test(evaluators)
271if(NOT EIGEN_TEST_NO_EXCEPTIONS)
272  ei_add_test(sizeoverflow)
273endif()
274ei_add_test(prec_inverse_4x4)
275ei_add_test(vectorwiseop)
276ei_add_test(special_numbers)
277ei_add_test(rvalue_types)
278ei_add_test(dense_storage)
279ei_add_test(ctorleak)
280ei_add_test(mpl2only)
281ei_add_test(inplace_decomposition)
282ei_add_test(half_float)
283ei_add_test(bfloat16_float)
284ei_add_test(array_of_string)
285ei_add_test(num_dimensions)
286ei_add_test(stl_iterators)
287ei_add_test(blasutil)
288if(EIGEN_TEST_CXX11)
289  ei_add_test(initializer_list_construction)
290  ei_add_test(diagonal_matrix_variadic_ctor)
291endif()
292
293add_executable(bug1213 bug1213.cpp bug1213_main.cpp)
294
295check_cxx_compiler_flag("-ffast-math" COMPILER_SUPPORT_FASTMATH)
296if(COMPILER_SUPPORT_FASTMATH)
297  set(EIGEN_FASTMATH_FLAGS "-ffast-math")
298else()
299  check_cxx_compiler_flag("/fp:fast" COMPILER_SUPPORT_FPFAST)
300  if(COMPILER_SUPPORT_FPFAST)
301    set(EIGEN_FASTMATH_FLAGS "/fp:fast")
302  endif()
303endif()
304
305ei_add_test(fastmath " ${EIGEN_FASTMATH_FLAGS} ")
306
307# # ei_add_test(denseLM)
308
309if(QT4_FOUND)
310  ei_add_test(qtvector "" "${QT_QTCORE_LIBRARY}")
311endif()
312
313if(UMFPACK_FOUND)
314  ei_add_test(umfpack_support "" "${UMFPACK_ALL_LIBS}")
315endif()
316
317if(KLU_FOUND OR SuiteSparse_FOUND)
318  ei_add_test(klu_support "" "${KLU_ALL_LIBS}")
319endif()
320
321if(SUPERLU_FOUND)
322  ei_add_test(superlu_support "" "${SUPERLU_ALL_LIBS}")
323endif()
324
325if(CHOLMOD_FOUND)
326  ei_add_test(cholmod_support "" "${CHOLMOD_ALL_LIBS}")
327endif()
328
329if(PARDISO_FOUND)
330  ei_add_test(pardiso_support "" "${PARDISO_ALL_LIBS}")
331endif()
332
333if(PASTIX_FOUND AND (SCOTCH_FOUND OR METIS_FOUND))
334  ei_add_test(pastix_support "" "${PASTIX_ALL_LIBS}")
335endif()
336
337if(SPQR_FOUND AND CHOLMOD_FOUND)
338  ei_add_test(spqr_support "" "${SPQR_ALL_LIBS}")
339endif()
340
341if(METIS_FOUND)
342ei_add_test(metis_support "" "${METIS_LIBRARIES}")
343endif()
344
345string(TOLOWER "${CMAKE_CXX_COMPILER}" cmake_cxx_compiler_tolower)
346if(cmake_cxx_compiler_tolower MATCHES "qcc")
347  set(CXX_IS_QCC "ON")
348endif()
349
350ei_add_property(EIGEN_TESTING_SUMMARY "CXX:               ${CMAKE_CXX_COMPILER}\n")
351if(CMAKE_COMPILER_IS_GNUCXX AND NOT CXX_IS_QCC)
352  execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version COMMAND head -n 1 OUTPUT_VARIABLE EIGEN_CXX_VERSION_STRING OUTPUT_STRIP_TRAILING_WHITESPACE)
353  ei_add_property(EIGEN_TESTING_SUMMARY "CXX_VERSION:       ${EIGEN_CXX_VERSION_STRING}\n")
354endif()
355ei_add_property(EIGEN_TESTING_SUMMARY "CXX_FLAGS:         ${CMAKE_CXX_FLAGS}\n")
356if (EIGEN_TEST_CUSTOM_CXX_FLAGS)
357  ei_add_property(EIGEN_TESTING_SUMMARY "Custom CXX flags:  ${EIGEN_TEST_CUSTOM_CXX_FLAGS}\n")
358endif()
359ei_add_property(EIGEN_TESTING_SUMMARY "Sparse lib flags:  ${SPARSE_LIBS}\n")
360
361option(EIGEN_TEST_EIGEN2 "Run whole Eigen2 test suite against EIGEN2_SUPPORT" OFF)
362mark_as_advanced(EIGEN_TEST_EIGEN2)
363if(EIGEN_TEST_EIGEN2)
364  message(WARNING "The Eigen2 test suite has been removed")
365endif()
366
367# boost MP unit test
368find_package(Boost 1.53.0)
369if(Boost_FOUND)
370  include_directories(${Boost_INCLUDE_DIRS})
371  ei_add_test(boostmultiprec "" "${Boost_LIBRARIES}")
372  ei_add_property(EIGEN_TESTED_BACKENDS "Boost.Multiprecision, ")
373else()
374  ei_add_property(EIGEN_MISSING_BACKENDS "Boost.Multiprecision, ")
375endif()
376
377
378# CUDA unit tests
379option(EIGEN_TEST_CUDA "Enable CUDA support in unit tests" OFF)
380option(EIGEN_TEST_CUDA_CLANG "Use clang instead of nvcc to compile the CUDA tests" OFF)
381
382if(EIGEN_TEST_CUDA_CLANG AND NOT CMAKE_CXX_COMPILER MATCHES "clang")
383  message(WARNING "EIGEN_TEST_CUDA_CLANG is set, but CMAKE_CXX_COMPILER does not appear to be clang.")
384endif()
385
386if(EIGEN_TEST_CUDA)
387
388find_package(CUDA 5.0)
389if(CUDA_FOUND)
390
391  set(CUDA_PROPAGATE_HOST_FLAGS OFF)
392
393  set(EIGEN_CUDA_RELAXED_CONSTEXPR "--expt-relaxed-constexpr")
394  if (${CUDA_VERSION} STREQUAL "7.0")
395    set(EIGEN_CUDA_RELAXED_CONSTEXPR "--relaxed-constexpr")
396  endif()
397
398  if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
399    set(CUDA_NVCC_FLAGS "-ccbin ${CMAKE_C_COMPILER}" CACHE STRING "nvcc flags" FORCE)
400  endif()
401  if(EIGEN_TEST_CUDA_CLANG)
402    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
403    string(APPEND CMAKE_CXX_FLAGS " --cuda-path=${CUDA_TOOLKIT_ROOT_DIR}")
404    foreach(GPU IN LISTS EIGEN_CUDA_COMPUTE_ARCH)
405      string(APPEND CMAKE_CXX_FLAGS " --cuda-gpu-arch=sm_${GPU}")
406    endforeach()
407  else()
408    foreach(GPU IN LISTS EIGEN_CUDA_COMPUTE_ARCH)
409      string(APPEND CUDA_NVCC_FLAGS " -gencode arch=compute_${GPU},code=sm_${GPU}")
410    endforeach()
411  endif()
412  string(APPEND CUDA_NVCC_FLAGS " ${EIGEN_CUDA_RELAXED_CONSTEXPR}")
413  set(EIGEN_ADD_TEST_FILENAME_EXTENSION  "cu")
414
415  ei_add_test(gpu_basic)
416
417  unset(EIGEN_ADD_TEST_FILENAME_EXTENSION)
418
419endif()
420
421endif()
422
423
424# HIP unit tests
425option(EIGEN_TEST_HIP "Add HIP support." OFF)
426if (EIGEN_TEST_HIP)
427
428  set(HIP_PATH "/opt/rocm/hip" CACHE STRING "Path to the HIP installation.")
429
430  if (EXISTS ${HIP_PATH})
431
432    list(APPEND CMAKE_MODULE_PATH ${HIP_PATH}/cmake)
433
434    find_package(HIP REQUIRED)
435    if (HIP_FOUND)
436
437      execute_process(COMMAND ${HIP_PATH}/bin/hipconfig --platform OUTPUT_VARIABLE HIP_PLATFORM)
438
439      if ((${HIP_PLATFORM} STREQUAL "hcc") OR (${HIP_PLATFORM} STREQUAL "amd"))
440
441	include_directories(${HIP_PATH}/include)
442
443	set(EIGEN_ADD_TEST_FILENAME_EXTENSION  "cu")
444	ei_add_test(gpu_basic)
445	unset(EIGEN_ADD_TEST_FILENAME_EXTENSION)
446
447      elseif ((${HIP_PLATFORM} STREQUAL "nvcc") OR (${HIP_PLATFORM} STREQUAL "nvidia"))
448	message(FATAL_ERROR "HIP_PLATFORM = nvcc is not supported within Eigen")
449      else ()
450	message(FATAL_ERROR "Unknown HIP_PLATFORM = ${HIP_PLATFORM}")
451      endif()
452    endif()
453  else ()
454    message(FATAL_ERROR "EIGEN_TEST_HIP is ON, but the specified HIP_PATH (${HIP_PATH}) does not exist")
455  endif()
456endif()
457
458cmake_dependent_option(EIGEN_TEST_BUILD_DOCUMENTATION "Test building the doxygen documentation" OFF "EIGEN_BUILD_DOC" OFF)
459if(EIGEN_TEST_BUILD_DOCUMENTATION)
460  add_dependencies(buildtests doc)
461endif()
462
463# Register all smoke tests
464include("EigenSmokeTestList")
465ei_add_smoke_tests("${ei_smoke_test_list}")
466