2011-11-04 00:37:25 +08:00
2009-02-28 00:19:13 +08:00
macro ( ei_add_property prop value )
2011-02-20 18:54:07 +08:00
get_property ( previous GLOBAL PROPERTY ${ prop } )
2011-11-12 17:54:16 +08:00
if ( ( NOT previous ) OR ( previous STREQUAL "" ) )
2011-02-20 18:54:07 +08:00
set_property ( GLOBAL PROPERTY ${ prop } "${value}" )
else ( )
set_property ( GLOBAL PROPERTY ${ prop } "${previous} ${value}" )
endif ( )
2009-02-28 00:19:13 +08:00
endmacro ( ei_add_property )
2009-10-20 01:29:00 +08:00
#internal. See documentation of ei_add_test for details.
macro ( ei_add_test_internal testname testname_with_suffix )
2009-12-03 01:07:47 +08:00
set ( targetname ${ testname_with_suffix } )
2013-11-05 22:41:45 +08:00
if ( EIGEN_ADD_TEST_FILENAME_EXTENSION )
set ( filename ${ testname } . ${ EIGEN_ADD_TEST_FILENAME_EXTENSION } )
else ( )
set ( filename ${ testname } .cpp )
endif ( )
if ( EIGEN_ADD_TEST_FILENAME_EXTENSION STREQUAL cu )
cuda_add_executable ( ${ targetname } ${ filename } )
else ( )
add_executable ( ${ targetname } ${ filename } )
endif ( )
2011-01-25 21:37:18 +08:00
if ( targetname MATCHES "^eigen2_" )
add_dependencies ( eigen2_buildtests ${ targetname } )
else ( )
add_dependencies ( buildtests ${ targetname } )
endif ( )
2009-02-05 01:11:04 +08:00
2009-11-12 05:11:33 +08:00
if ( EIGEN_NO_ASSERTION_CHECKING )
ei_add_target_property ( ${ targetname } COMPILE_FLAGS "-DEIGEN_NO_ASSERTION_CHECKING=1" )
else ( EIGEN_NO_ASSERTION_CHECKING )
2009-02-05 01:11:04 +08:00
if ( EIGEN_DEBUG_ASSERTS )
2009-05-15 23:53:26 +08:00
ei_add_target_property ( ${ targetname } COMPILE_FLAGS "-DEIGEN_DEBUG_ASSERTS=1" )
2009-02-05 01:11:04 +08:00
endif ( EIGEN_DEBUG_ASSERTS )
2009-11-12 05:11:33 +08:00
endif ( EIGEN_NO_ASSERTION_CHECKING )
2011-07-12 20:41:00 +08:00
ei_add_target_property ( ${ targetname } COMPILE_FLAGS "-DEIGEN_TEST_MAX_SIZE=${EIGEN_TEST_MAX_SIZE}" )
2009-02-05 01:11:04 +08:00
2009-11-12 05:11:33 +08:00
ei_add_target_property ( ${ targetname } COMPILE_FLAGS "-DEIGEN_TEST_FUNC=${testname}" )
2011-01-29 21:35:24 +08:00
if ( MSVC AND NOT EIGEN_SPLIT_LARGE_TESTS )
ei_add_target_property ( ${ targetname } COMPILE_FLAGS "/bigobj" )
endif ( )
2009-02-05 01:11:04 +08:00
2009-11-12 05:11:33 +08:00
# let the user pass flags.
2009-10-20 01:29:00 +08:00
if ( ${ ARGC } GREATER 2 )
ei_add_target_property ( ${ targetname } COMPILE_FLAGS "${ARGV2}" )
endif ( ${ ARGC } GREATER 2 )
2011-12-09 17:50:13 +08:00
if ( EIGEN_TEST_CUSTOM_CXX_FLAGS )
ei_add_target_property ( ${ targetname } COMPILE_FLAGS "${EIGEN_TEST_CUSTOM_CXX_FLAGS}" )
endif ( )
2009-02-05 01:11:04 +08:00
2010-04-19 23:19:22 +08:00
if ( EIGEN_STANDARD_LIBRARIES_TO_LINK_TO )
target_link_libraries ( ${ targetname } ${ EIGEN_STANDARD_LIBRARIES_TO_LINK_TO } )
endif ( )
2009-11-12 05:11:33 +08:00
if ( EXTERNAL_LIBS )
target_link_libraries ( ${ targetname } ${ EXTERNAL_LIBS } )
endif ( )
2011-12-09 17:50:13 +08:00
if ( EIGEN_TEST_CUSTOM_LINKER_FLAGS )
target_link_libraries ( ${ targetname } ${ EIGEN_TEST_CUSTOM_LINKER_FLAGS } )
endif ( )
2010-10-17 23:04:43 +08:00
2009-10-20 01:29:00 +08:00
if ( ${ ARGC } GREATER 3 )
2010-10-28 22:44:20 +08:00
set ( libs_to_link ${ ARGV3 } )
# it could be that some cmake module provides a bad library string " " (just spaces),
# and that severely breaks target_link_libraries ("can't link to -l-lstdc++" errors).
# so we check for strings containing only spaces.
string ( STRIP "${libs_to_link}" libs_to_link_stripped )
string ( LENGTH "${libs_to_link_stripped}" libs_to_link_stripped_length )
if ( ${ libs_to_link_stripped_length } GREATER 0 )
# notice: no double quotes around ${libs_to_link} here. It may be a list.
target_link_libraries ( ${ targetname } ${ libs_to_link } )
endif ( )
2011-01-29 21:35:24 +08:00
endif ( )
2009-02-05 01:11:04 +08:00
2013-08-01 05:11:43 +08:00
add_test ( ${ testname_with_suffix } "${targetname}" )
2013-03-20 15:40:13 +08:00
# Specify target and test labels accoirding to EIGEN_CURRENT_SUBPROJECT
get_property ( current_subproject GLOBAL PROPERTY EIGEN_CURRENT_SUBPROJECT )
if ( ( current_subproject ) AND ( NOT ( current_subproject STREQUAL "" ) ) )
set_property ( TARGET ${ targetname } PROPERTY LABELS "Build${current_subproject}" )
add_dependencies ( "Build${current_subproject}" ${ targetname } )
set_property ( TEST ${ testname_with_suffix } PROPERTY LABELS "${current_subproject}" )
endif ( )
2009-02-05 01:11:04 +08:00
2009-10-20 01:29:00 +08:00
endmacro ( ei_add_test_internal )
# Macro to add a test
#
2009-10-20 03:56:03 +08:00
# the unique mandatory parameter testname must correspond to a file
2009-10-20 01:29:00 +08:00
# <testname>.cpp which follows this pattern:
#
# #include "main.h"
# void test_<testname>() { ... }
#
2009-10-20 03:56:03 +08:00
# Depending on the contents of that file, this macro can have 2 behaviors,
# see below.
#
2009-11-12 05:11:33 +08:00
# The optional 2nd parameter is libraries to link to.
2009-10-20 02:40:35 +08:00
#
# A. Default behavior
#
2009-12-03 01:07:47 +08:00
# this macro adds an executable <testname> as well as a ctest test
# named <testname> too.
2009-10-20 01:29:00 +08:00
#
# On platforms with bash simply run:
# "ctest -V" or "ctest -V -R <testname>"
# On other platform use ctest as usual
#
2009-10-20 02:40:35 +08:00
# B. Multi-part behavior
2009-10-20 01:29:00 +08:00
#
2009-10-20 02:40:35 +08:00
# If the source file matches the regexp
2009-11-12 05:11:33 +08:00
# CALL_SUBTEST_[0-9]+|EIGEN_TEST_PART_[0-9]+
2009-10-20 02:40:35 +08:00
# then it is interpreted as a multi-part test. The behavior then depends on the
# CMake option EIGEN_SPLIT_LARGE_TESTS, which is ON by default.
2009-10-20 01:29:00 +08:00
#
2009-10-20 02:40:35 +08:00
# If EIGEN_SPLIT_LARGE_TESTS is OFF, the behavior is the same as in A (the multi-part
# aspect is ignored).
2009-10-20 01:29:00 +08:00
#
2009-10-20 02:40:35 +08:00
# If EIGEN_SPLIT_LARGE_TESTS is ON, the test is split into multiple executables
# test_<testname>_<N>
# where N runs from 1 to the greatest occurence found in the source file. Each of these
# executables is built passing -DEIGEN_TEST_PART_N. This allows to split large tests
# into smaller executables.
2009-10-20 01:29:00 +08:00
#
2009-12-03 01:07:47 +08:00
# Moreover, targets <testname> are still generated, they
2009-10-20 02:40:35 +08:00
# have the effect of building all the parts of the test.
2009-10-20 01:29:00 +08:00
#
2009-10-20 02:40:35 +08:00
# Again, ctest -R allows to run all matching tests.
macro ( ei_add_test testname )
2009-11-26 10:26:37 +08:00
get_property ( EIGEN_TESTS_LIST GLOBAL PROPERTY EIGEN_TESTS_LIST )
set ( EIGEN_TESTS_LIST "${EIGEN_TESTS_LIST}${testname}\n" )
set_property ( GLOBAL PROPERTY EIGEN_TESTS_LIST "${EIGEN_TESTS_LIST}" )
2013-11-05 22:41:45 +08:00
if ( EIGEN_ADD_TEST_FILENAME_EXTENSION )
set ( filename ${ testname } . ${ EIGEN_ADD_TEST_FILENAME_EXTENSION } )
else ( )
set ( filename ${ testname } .cpp )
endif ( )
file ( READ "${filename}" test_source )
2009-10-20 02:40:35 +08:00
set ( parts 0 )
2011-03-28 23:43:59 +08:00
string ( REGEX MATCHALL "CALL_SUBTEST_[0-9]+|EIGEN_TEST_PART_[0-9]+|EIGEN_SUFFIXES(;[0-9]+)+"
2009-10-29 06:19:29 +08:00
o c c u r e n c e s " $ { t e s t _ s o u r c e } " )
2011-03-28 23:43:59 +08:00
string ( REGEX REPLACE "CALL_SUBTEST_|EIGEN_TEST_PART_|EIGEN_SUFFIXES" "" suffixes "${occurences}" )
2009-10-29 06:19:29 +08:00
list ( REMOVE_DUPLICATES suffixes )
if ( EIGEN_SPLIT_LARGE_TESTS AND suffixes )
2009-12-03 01:07:47 +08:00
add_custom_target ( ${ testname } )
2009-10-29 06:19:29 +08:00
foreach ( suffix ${ suffixes } )
ei_add_test_internal ( ${ testname } ${ testname } _ ${ suffix }
" $ { A R G V 1 } - D E I G E N _ T E S T _ P A R T _ $ { s u f f i x } = 1 " " $ { A R G V 2 } " )
2009-12-03 01:07:47 +08:00
add_dependencies ( ${ testname } ${ testname } _ ${ suffix } )
2009-10-29 06:19:29 +08:00
endforeach ( suffix )
else ( EIGEN_SPLIT_LARGE_TESTS AND suffixes )
2009-10-20 01:29:00 +08:00
set ( symbols_to_enable_all_parts "" )
2009-10-29 06:19:29 +08:00
foreach ( suffix ${ suffixes } )
set ( symbols_to_enable_all_parts
" $ { s y m b o l s _ t o _ e n a b l e _ a l l _ p a r t s } - D E I G E N _ T E S T _ P A R T _ $ { s u f f i x } = 1 " )
endforeach ( suffix )
2009-10-20 02:40:35 +08:00
ei_add_test_internal ( ${ testname } ${ testname } "${ARGV1} ${symbols_to_enable_all_parts}" "${ARGV2}" )
2009-10-29 06:19:29 +08:00
endif ( EIGEN_SPLIT_LARGE_TESTS AND suffixes )
2009-10-20 02:40:35 +08:00
endmacro ( ei_add_test )
2009-10-20 01:29:00 +08:00
2011-02-06 07:57:29 +08:00
# adds a failtest, i.e. a test that succeed if the program fails to compile
# note that the test runner for these is CMake itself, when passed -DEIGEN_FAILTEST=ON
# so here we're just running CMake commands immediately, we're not adding any targets.
macro ( ei_add_failtest testname )
get_property ( EIGEN_FAILTEST_FAILURE_COUNT GLOBAL PROPERTY EIGEN_FAILTEST_FAILURE_COUNT )
get_property ( EIGEN_FAILTEST_COUNT GLOBAL PROPERTY EIGEN_FAILTEST_COUNT )
message ( STATUS "Checking failtest: ${testname}" )
set ( filename "${testname}.cpp" )
file ( READ "${filename}" test_source )
try_compile ( succeeds_when_it_should_fail
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / $ { f i l e n a m e } "
C O M P I L E _ D E F I N I T I O N S " - D E I G E N _ S H O U L D _ F A I L _ T O _ B U I L D " )
if ( succeeds_when_it_should_fail )
message ( STATUS "FAILED: ${testname} build succeeded when it should have failed" )
endif ( )
try_compile ( succeeds_when_it_should_succeed
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / $ { f i l e n a m e } "
C O M P I L E _ D E F I N I T I O N S )
if ( NOT succeeds_when_it_should_succeed )
message ( STATUS "FAILED: ${testname} build failed when it should have succeeded" )
endif ( )
if ( succeeds_when_it_should_fail OR NOT succeeds_when_it_should_succeed )
math ( EXPR EIGEN_FAILTEST_FAILURE_COUNT ${ EIGEN_FAILTEST_FAILURE_COUNT } +1 )
endif ( )
math ( EXPR EIGEN_FAILTEST_COUNT ${ EIGEN_FAILTEST_COUNT } +1 )
set_property ( GLOBAL PROPERTY EIGEN_FAILTEST_FAILURE_COUNT ${ EIGEN_FAILTEST_FAILURE_COUNT } )
set_property ( GLOBAL PROPERTY EIGEN_FAILTEST_COUNT ${ EIGEN_FAILTEST_COUNT } )
endmacro ( ei_add_failtest )
2009-02-28 00:19:13 +08:00
# print a summary of the different options
macro ( ei_testing_print_summary )
2010-12-30 05:02:01 +08:00
message ( STATUS "************************************************************" )
message ( STATUS "*** Eigen's unit tests configuration summary ***" )
message ( STATUS "************************************************************" )
message ( STATUS "" )
message ( STATUS "Build type: ${CMAKE_BUILD_TYPE}" )
2011-02-20 18:54:07 +08:00
message ( STATUS "Build site: ${SITE}" )
message ( STATUS "Build string: ${BUILDNAME}" )
2009-02-28 00:19:13 +08:00
get_property ( EIGEN_TESTING_SUMMARY GLOBAL PROPERTY EIGEN_TESTING_SUMMARY )
get_property ( EIGEN_TESTED_BACKENDS GLOBAL PROPERTY EIGEN_TESTED_BACKENDS )
get_property ( EIGEN_MISSING_BACKENDS GLOBAL PROPERTY EIGEN_MISSING_BACKENDS )
2010-12-30 05:02:01 +08:00
message ( STATUS "Enabled backends: ${EIGEN_TESTED_BACKENDS}" )
message ( STATUS "Disabled backends: ${EIGEN_MISSING_BACKENDS}" )
2009-02-28 00:19:13 +08:00
2010-01-27 20:48:48 +08:00
if ( EIGEN_DEFAULT_TO_ROW_MAJOR )
2010-12-30 05:02:01 +08:00
message ( STATUS "Default order: Row-major" )
2010-01-27 20:48:48 +08:00
else ( )
2010-12-30 05:02:01 +08:00
message ( STATUS "Default order: Column-major" )
2010-01-27 20:48:48 +08:00
endif ( )
2010-03-06 15:17:37 +08:00
if ( EIGEN_TEST_NO_EXPLICIT_ALIGNMENT )
2010-12-30 05:02:01 +08:00
message ( STATUS "Explicit alignment (hence vectorization) disabled" )
2010-03-06 15:17:37 +08:00
elseif ( EIGEN_TEST_NO_EXPLICIT_VECTORIZATION )
2010-12-30 05:02:01 +08:00
message ( STATUS "Explicit vectorization disabled (alignment kept enabled)" )
2009-11-25 04:12:43 +08:00
else ( )
2011-07-12 20:41:00 +08:00
message ( STATUS "Maximal matrix/vector size: ${EIGEN_TEST_MAX_SIZE}" )
2009-02-28 00:19:13 +08:00
2010-03-06 15:17:37 +08:00
if ( EIGEN_TEST_SSE2 )
2010-12-30 05:02:01 +08:00
message ( STATUS "SSE2: ON" )
2010-03-06 15:17:37 +08:00
else ( )
2010-12-30 05:02:01 +08:00
message ( STATUS "SSE2: Using architecture defaults" )
2010-03-06 15:17:37 +08:00
endif ( )
if ( EIGEN_TEST_SSE3 )
2010-12-30 05:02:01 +08:00
message ( STATUS "SSE3: ON" )
2010-03-06 15:17:37 +08:00
else ( )
2010-12-30 05:02:01 +08:00
message ( STATUS "SSE3: Using architecture defaults" )
2010-03-06 15:17:37 +08:00
endif ( )
if ( EIGEN_TEST_SSSE3 )
2010-12-30 05:02:01 +08:00
message ( STATUS "SSSE3: ON" )
2010-03-06 15:17:37 +08:00
else ( )
2010-12-30 05:02:01 +08:00
message ( STATUS "SSSE3: Using architecture defaults" )
2010-03-06 15:17:37 +08:00
endif ( )
if ( EIGEN_TEST_SSE4_1 )
2010-12-30 05:02:01 +08:00
message ( STATUS "SSE4.1: ON" )
2010-03-06 15:17:37 +08:00
else ( )
2010-12-30 05:02:01 +08:00
message ( STATUS "SSE4.1: Using architecture defaults" )
2010-03-06 15:17:37 +08:00
endif ( )
if ( EIGEN_TEST_SSE4_2 )
2010-12-30 05:02:01 +08:00
message ( STATUS "SSE4.2: ON" )
2010-03-06 15:17:37 +08:00
else ( )
2010-12-30 05:02:01 +08:00
message ( STATUS "SSE4.2: Using architecture defaults" )
2014-01-30 03:43:05 +08:00
endif ( )
if ( EIGEN_TEST_AVX )
message ( STATUS "AVX: ON" )
else ( )
message ( STATUS "AVX: Using architecture defaults" )
2010-03-06 15:17:37 +08:00
endif ( )
2014-03-25 00:52:45 +08:00
if ( EIGEN_TEST_FMA )
message ( STATUS "FMA: ON" )
else ( )
message ( STATUS "FMA: Using architecture defaults" )
endif ( )
2010-03-06 15:17:37 +08:00
if ( EIGEN_TEST_ALTIVEC )
2010-12-30 05:02:01 +08:00
message ( STATUS "Altivec: ON" )
2010-03-06 15:17:37 +08:00
else ( )
2010-12-30 05:02:01 +08:00
message ( STATUS "Altivec: Using architecture defaults" )
2010-03-06 15:17:37 +08:00
endif ( )
if ( EIGEN_TEST_NEON )
2010-12-30 05:02:01 +08:00
message ( STATUS "ARM NEON: ON" )
2010-03-06 15:17:37 +08:00
else ( )
2010-12-30 05:02:01 +08:00
message ( STATUS "ARM NEON: Using architecture defaults" )
2010-03-06 15:17:37 +08:00
endif ( )
endif ( ) # vectorization / alignment options
2009-02-28 00:19:13 +08:00
2010-12-30 05:02:01 +08:00
message ( STATUS "\n${EIGEN_TESTING_SUMMARY}" )
2009-02-28 00:19:13 +08:00
2010-12-30 05:02:01 +08:00
message ( STATUS "************************************************************" )
2009-02-28 00:19:13 +08:00
endmacro ( ei_testing_print_summary )
macro ( ei_init_testing )
2013-03-20 15:40:13 +08:00
define_property ( GLOBAL PROPERTY EIGEN_CURRENT_SUBPROJECT BRIEF_DOCS " " FULL_DOCS " " )
2009-02-28 00:19:13 +08:00
define_property ( GLOBAL PROPERTY EIGEN_TESTED_BACKENDS BRIEF_DOCS " " FULL_DOCS " " )
define_property ( GLOBAL PROPERTY EIGEN_MISSING_BACKENDS BRIEF_DOCS " " FULL_DOCS " " )
define_property ( GLOBAL PROPERTY EIGEN_TESTING_SUMMARY BRIEF_DOCS " " FULL_DOCS " " )
2009-11-26 10:26:37 +08:00
define_property ( GLOBAL PROPERTY EIGEN_TESTS_LIST BRIEF_DOCS " " FULL_DOCS " " )
2009-02-28 00:19:13 +08:00
set_property ( GLOBAL PROPERTY EIGEN_TESTED_BACKENDS "" )
set_property ( GLOBAL PROPERTY EIGEN_MISSING_BACKENDS "" )
set_property ( GLOBAL PROPERTY EIGEN_TESTING_SUMMARY "" )
2009-11-26 10:26:37 +08:00
set_property ( GLOBAL PROPERTY EIGEN_TESTS_LIST "" )
2011-02-06 07:57:29 +08:00
define_property ( GLOBAL PROPERTY EIGEN_FAILTEST_FAILURE_COUNT BRIEF_DOCS " " FULL_DOCS " " )
define_property ( GLOBAL PROPERTY EIGEN_FAILTEST_COUNT BRIEF_DOCS " " FULL_DOCS " " )
set_property ( GLOBAL PROPERTY EIGEN_FAILTEST_FAILURE_COUNT "0" )
set_property ( GLOBAL PROPERTY EIGEN_FAILTEST_COUNT "0" )
2011-12-07 20:20:52 +08:00
# uncomment anytime you change the ei_get_compilerver_from_cxx_version_string macro
# ei_test_get_compilerver_from_cxx_version_string()
2009-02-28 00:19:13 +08:00
endmacro ( ei_init_testing )
2011-02-20 18:54:07 +08:00
macro ( ei_set_sitename )
# if the sitename is not yet set, try to set it
if ( NOT ${ SITE } OR ${ SITE } STREQUAL "" )
set ( eigen_computername $ENV{ COMPUTERNAME } )
set ( eigen_hostname $ENV{ HOSTNAME } )
if ( eigen_hostname )
set ( SITE ${ eigen_hostname } )
elseif ( eigen_computername )
set ( SITE ${ eigen_computername } )
endif ( )
endif ( )
# in case it is already set, enforce lower case
if ( SITE )
string ( TOLOWER ${ SITE } SITE )
endif ( )
endmacro ( ei_set_sitename )
macro ( ei_get_compilerver VAR )
2013-08-01 22:38:05 +08:00
if ( MSVC )
# on windows system, we use a modified CMake script
include ( EigenDetermineVSServicePack )
EigenDetermineVSServicePack ( my_service_pack )
if ( my_service_pack )
set ( ${ VAR } ${ my_service_pack } )
else ( )
set ( ${ VAR } "na" )
endif ( )
2011-12-07 02:54:34 +08:00
else ( )
# on all other system we rely on ${CMAKE_CXX_COMPILER}
2013-06-18 23:25:37 +08:00
# supporting a "--version" flag
2011-12-07 20:20:52 +08:00
2013-06-18 23:25:37 +08:00
# check whether the head command exists
find_program ( HEAD_EXE head NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH NO_CMAKE_SYSTEM_PATH )
if ( HEAD_EXE )
execute_process ( COMMAND ${ CMAKE_CXX_COMPILER } --version
C O M M A N D h e a d - n 1
O U T P U T _ V A R I A B L E e i g e n _ c x x _ c o m p i l e r _ v e r s i o n _ s t r i n g O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
else ( )
execute_process ( COMMAND ${ CMAKE_CXX_COMPILER } --version
O U T P U T _ V A R I A B L E e i g e n _ c x x _ c o m p i l e r _ v e r s i o n _ s t r i n g O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
string ( REGEX REPLACE "[\n\r].*" "" eigen_cxx_compiler_version_string ${ eigen_cxx_compiler_version_string } )
endif ( )
2011-12-07 20:20:52 +08:00
2013-06-18 23:25:37 +08:00
ei_get_compilerver_from_cxx_version_string ( "${eigen_cxx_compiler_version_string}" CNAME CVER )
2011-12-07 20:20:52 +08:00
set ( ${ VAR } "${CNAME}-${CVER}" )
2011-02-20 18:54:07 +08:00
endif ( )
endmacro ( ei_get_compilerver )
2011-12-07 20:20:52 +08:00
# Extract compiler name and version from a raw version string
# WARNING: if you edit thid macro, then please test it by uncommenting
# the testing macro call in ei_init_testing() of the EigenTesting.cmake file.
# See also the ei_test_get_compilerver_from_cxx_version_string macro at the end of the file
macro ( ei_get_compilerver_from_cxx_version_string VERSTRING CNAME CVER )
# extract possible compiler names
string ( REGEX MATCH "g\\+\\+" ei_has_gpp ${ VERSTRING } )
string ( REGEX MATCH "llvm|LLVM" ei_has_llvm ${ VERSTRING } )
string ( REGEX MATCH "gcc|GCC" ei_has_gcc ${ VERSTRING } )
string ( REGEX MATCH "icpc|ICC" ei_has_icpc ${ VERSTRING } )
string ( REGEX MATCH "clang|CLANG" ei_has_clang ${ VERSTRING } )
# combine them
if ( ( ei_has_llvm ) AND ( ei_has_gpp OR ei_has_gcc ) )
set ( ${ CNAME } "llvm-g++" )
elseif ( ( ei_has_llvm ) AND ( ei_has_clang ) )
set ( ${ CNAME } "llvm-clang++" )
elseif ( ei_has_icpc )
set ( ${ CNAME } "icpc" )
elseif ( ei_has_gpp OR ei_has_gcc )
set ( ${ CNAME } "g++" )
else ( )
set ( ${ CNAME } "_" )
endif ( )
# extract possible version numbers
# first try to extract 3 isolated numbers:
string ( REGEX MATCH " [0-9]+\\.[0-9]+\\.[0-9]+" eicver ${ VERSTRING } )
if ( NOT eicver )
# try to extract 2 isolated ones:
string ( REGEX MATCH " [0-9]+\\.[0-9]+" eicver ${ VERSTRING } )
if ( NOT eicver )
# try to extract 3:
string ( REGEX MATCH "[^0-9][0-9]+\\.[0-9]+\\.[0-9]+" eicver ${ VERSTRING } )
if ( NOT eicver )
# try to extract 2:
string ( REGEX MATCH "[^0-9][0-9]+\\.[0-9]+" eicver ${ VERSTRING } )
else ( )
set ( eicver " _" )
endif ( )
endif ( )
endif ( )
string ( REGEX REPLACE ".(.*)" "\\1" ${ CVER } ${ eicver } )
endmacro ( ei_get_compilerver_from_cxx_version_string )
2011-02-20 18:54:07 +08:00
macro ( ei_get_cxxflags VAR )
set ( ${ VAR } "" )
ei_is_64bit_env ( IS_64BIT_ENV )
if ( EIGEN_TEST_NEON )
set ( ${ VAR } NEON )
elseif ( EIGEN_TEST_ALTIVEC )
set ( ${ VAR } ALVEC )
2014-03-25 00:52:45 +08:00
elseif ( EIGEN_TEST_FMA )
set ( ${ VAR } FMA )
elseif ( EIGEN_TEST_AVX )
set ( ${ VAR } AVX )
2011-02-20 18:54:07 +08:00
elseif ( EIGEN_TEST_SSE4_2 )
set ( ${ VAR } SSE42 )
elseif ( EIGEN_TEST_SSE4_1 )
set ( ${ VAR } SSE41 )
elseif ( EIGEN_TEST_SSSE3 )
set ( ${ VAR } SSSE3 )
elseif ( EIGEN_TEST_SSE3 )
set ( ${ VAR } SSE3 )
elseif ( EIGEN_TEST_SSE2 OR IS_64BIT_ENV )
set ( ${ VAR } SSE2 )
endif ( )
if ( EIGEN_TEST_OPENMP )
if ( ${ VAR } STREQUAL "" )
set ( ${ VAR } OMP )
else ( )
set ( ${ VAR } ${ ${VAR } }-OMP )
endif ( )
endif ( )
if ( EIGEN_DEFAULT_TO_ROW_MAJOR )
if ( ${ VAR } STREQUAL "" )
set ( ${ VAR } ROW )
else ( )
set ( ${ VAR } ${ ${VAR } }-ROWMAJ )
endif ( )
endif ( )
endmacro ( ei_get_cxxflags )
macro ( ei_set_build_string )
ei_get_compilerver ( LOCAL_COMPILER_VERSION )
ei_get_cxxflags ( LOCAL_COMPILER_FLAGS )
include ( EigenDetermineOSVersion )
DetermineOSVersion ( OS_VERSION )
set ( TMP_BUILD_STRING ${ OS_VERSION } - ${ LOCAL_COMPILER_VERSION } )
2011-07-12 20:41:00 +08:00
2011-02-20 18:54:07 +08:00
if ( NOT ${ LOCAL_COMPILER_FLAGS } STREQUAL "" )
set ( TMP_BUILD_STRING ${ TMP_BUILD_STRING } - ${ LOCAL_COMPILER_FLAGS } )
endif ( )
ei_is_64bit_env ( IS_64BIT_ENV )
if ( NOT IS_64BIT_ENV )
set ( TMP_BUILD_STRING ${ TMP_BUILD_STRING } -32bit )
else ( )
set ( TMP_BUILD_STRING ${ TMP_BUILD_STRING } -64bit )
endif ( )
2013-02-26 20:40:13 +08:00
if ( EIGEN_BUILD_STRING_SUFFIX )
set ( TMP_BUILD_STRING ${ TMP_BUILD_STRING } - ${ EIGEN_BUILD_STRING_SUFFIX } )
endif ( )
2011-02-20 18:54:07 +08:00
string ( TOLOWER ${ TMP_BUILD_STRING } BUILDNAME )
endmacro ( ei_set_build_string )
macro ( ei_is_64bit_env VAR )
2011-12-07 02:54:34 +08:00
file ( WRITE "${CMAKE_CURRENT_BINARY_DIR}/is64.cpp"
" i n t main ( ) { return ( sizeof(int* ) = = 8 ? 1 : 0 ) ; }
" )
try_run ( run_res compile_res
$ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / i s 6 4 . c p p "
R U N _ O U T P U T _ V A R I A B L E r u n _ o u t p u t )
if ( compile_res AND run_res )
set ( ${ VAR } ${ run_res } )
elseif ( CMAKE_CL_64 )
2011-02-20 18:54:07 +08:00
set ( ${ VAR } 1 )
elseif ( "$ENV{Platform}" STREQUAL "X64" ) # nmake 64 bit
set ( ${ VAR } 1 )
endif ( )
2011-11-10 04:19:05 +08:00
endmacro ( ei_is_64bit_env )
2011-12-07 20:20:52 +08:00
# helper macro for testing ei_get_compilerver_from_cxx_version_string
# STR: raw version string
# REFNAME: expected compiler name
# REFVER: expected compiler version
macro ( ei_test1_get_compilerver_from_cxx_version_string STR REFNAME REFVER )
ei_get_compilerver_from_cxx_version_string ( ${ STR } CNAME CVER )
if ( ( NOT ${ REFNAME } STREQUAL ${ CNAME } ) OR ( NOT ${ REFVER } STREQUAL ${ CVER } ) )
message ( "STATUS ei_get_compilerver_from_cxx_version_string error:" )
message ( "Expected \" ${ REFNAME } - ${ REFVER } \", got \"${CNAME}-${CVER}\"")
endif ( )
endmacro ( ei_test1_get_compilerver_from_cxx_version_string )
# macro for testing ei_get_compilerver_from_cxx_version_string
# feel free to add more version strings
macro ( ei_test_get_compilerver_from_cxx_version_string )
ei_test1_get_compilerver_from_cxx_version_string ( "g++ (SUSE Linux) 4.5.3 20110428 [gcc-4_5-branch revision 173117]" "g++" "4.5.3" )
ei_test1_get_compilerver_from_cxx_version_string ( "c++ (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)" "g++" "4.5.1" )
ei_test1_get_compilerver_from_cxx_version_string ( "icpc (ICC) 11.0 20081105" "icpc" "11.0" )
ei_test1_get_compilerver_from_cxx_version_string ( "g++-3.4 (GCC) 3.4.6" "g++" "3.4.6" )
ei_test1_get_compilerver_from_cxx_version_string ( "SUSE Linux clang version 3.0 (branches/release_30 145598) (based on LLVM 3.0)" "llvm-clang++" "3.0" )
ei_test1_get_compilerver_from_cxx_version_string ( "icpc (ICC) 12.0.5 20110719" "icpc" "12.0.5" )
ei_test1_get_compilerver_from_cxx_version_string ( "Apple clang version 2.1 (tags/Apple/clang-163.7.1) (based on LLVM 3.0svn)" "llvm-clang++" "2.1" )
ei_test1_get_compilerver_from_cxx_version_string ( "i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)" "llvm-g++" "4.2.1" )
ei_test1_get_compilerver_from_cxx_version_string ( "g++-mp-4.4 (GCC) 4.4.6" "g++" "4.4.6" )
ei_test1_get_compilerver_from_cxx_version_string ( "g++-mp-4.4 (GCC) 2011" "g++" "4.4" )
endmacro ( ei_test_get_compilerver_from_cxx_version_string )