2008-12-02 20:59:10 +08:00
project ( Eigen )
2008-08-27 14:43:42 +08:00
2009-08-15 09:58:41 +08:00
cmake_minimum_required ( VERSION 2.6.2 )
2010-04-19 23:19:22 +08:00
# guard against in-source builds
2009-11-15 13:11:33 +08:00
if ( ${ CMAKE_SOURCE_DIR } STREQUAL ${ CMAKE_BINARY_DIR } )
2009-12-02 06:39:29 +08:00
message ( FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. (you may need to remove CMakeCache.txt " )
2009-11-15 13:11:33 +08:00
endif ( )
2010-10-25 22:15:22 +08:00
# guard against bad build-type strings
string ( TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_tolower )
if ( NOT cmake_build_type_tolower STREQUAL "debug"
A N D N O T c m a k e _ b u i l d _ t y p e _ t o l o w e r S T R E Q U A L " r e l e a s e "
2010-10-26 00:49:39 +08:00
A N D N O T c m a k e _ b u i l d _ t y p e _ t o l o w e r S T R E Q U A L " r e l w i t h d e b i n f o "
A N D N O T c m a k e _ b u i l d _ t y p e _ t o l o w e r S T R E Q U A L " " )
message ( FATAL_ERROR "Unknown build type \" ${ CMAKE_BUILD_TYPE } \". Allowed values are Debug, Release, RelWithDebInfo and \"\" ( case-insensitive ) . " )
2010-10-25 22:15:22 +08:00
endif ( )
2010-04-19 23:19:22 +08:00
#############################################################################
# retrieve version infomation #
#############################################################################
2009-05-20 06:04:08 +08:00
# automatically parse the version number
2009-11-20 01:09:04 +08:00
file ( READ "${CMAKE_SOURCE_DIR}/Eigen/src/Core/util/Macros.h" _eigen_version_header )
string ( REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen_world_version_match "${_eigen_version_header}" )
set ( EIGEN_WORLD_VERSION "${CMAKE_MATCH_1}" )
string ( REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen_major_version_match "${_eigen_version_header}" )
set ( EIGEN_MAJOR_VERSION "${CMAKE_MATCH_1}" )
string ( REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen_minor_version_match "${_eigen_version_header}" )
set ( EIGEN_MINOR_VERSION "${CMAKE_MATCH_1}" )
set ( EIGEN_VERSION_NUMBER ${ EIGEN_WORLD_VERSION } . ${ EIGEN_MAJOR_VERSION } . ${ EIGEN_MINOR_VERSION } )
2009-01-05 01:32:20 +08:00
2009-08-15 09:58:41 +08:00
# if the mercurial program is absent, this will leave the EIGEN_HG_CHANGESET string empty,
2009-05-20 06:04:08 +08:00
# but won't stop CMake.
execute_process ( COMMAND hg tip -R ${ CMAKE_SOURCE_DIR } OUTPUT_VARIABLE EIGEN_HGTIP_OUTPUT )
2009-08-15 09:58:41 +08:00
execute_process ( COMMAND hg branch -R ${ CMAKE_SOURCE_DIR } OUTPUT_VARIABLE EIGEN_BRANCH_OUTPUT )
# if this is the default (aka development) branch, extract the mercurial changeset number from the hg tip output...
if ( EIGEN_BRANCH_OUTPUT MATCHES "default" )
string ( REGEX MATCH "^changeset: *[0-9]*:([0-9;a-f]+).*" EIGEN_HG_CHANGESET_MATCH "${EIGEN_HGTIP_OUTPUT}" )
set ( EIGEN_HG_CHANGESET "${CMAKE_MATCH_1}" )
endif ( EIGEN_BRANCH_OUTPUT MATCHES "default" )
#...and show it next to the version number
if ( EIGEN_HG_CHANGESET )
set ( EIGEN_VERSION "${EIGEN_VERSION_NUMBER} (mercurial changeset ${EIGEN_HG_CHANGESET})" )
else ( EIGEN_HG_CHANGESET )
2008-12-02 20:59:10 +08:00
set ( EIGEN_VERSION "${EIGEN_VERSION_NUMBER}" )
2009-08-15 09:58:41 +08:00
endif ( EIGEN_HG_CHANGESET )
2008-06-01 07:21:49 +08:00
2010-04-19 23:19:22 +08:00
2009-05-06 16:15:54 +08:00
include ( CheckCXXCompilerFlag )
2008-08-24 01:40:52 +08:00
set ( CMAKE_MODULE_PATH ${ PROJECT_SOURCE_DIR } /cmake )
2008-08-24 01:25:54 +08:00
2010-04-19 23:19:22 +08:00
#############################################################################
# find how to link to the standard libraries #
#############################################################################
find_package ( StandardMathLibrary )
set ( EIGEN_STANDARD_LIBRARIES_TO_LINK_TO "" )
if ( NOT STANDARD_MATH_LIBRARY_FOUND )
message ( FATAL_ERROR
" C a n ' t l i n k t o t h e s t a n d a r d m a t h l i b r a r y . P l e a s e r e p o r t t o t h e E i g e n d e v e l o p e r s , t e l l i n g t h e m a b o u t y o u r p l a t f o r m . " )
else ( )
if ( EIGEN_STANDARD_LIBRARIES_TO_LINK_TO )
set ( EIGEN_STANDARD_LIBRARIES_TO_LINK_TO "${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO} ${STANDARD_MATH_LIBRARY}" )
else ( )
set ( EIGEN_STANDARD_LIBRARIES_TO_LINK_TO "${STANDARD_MATH_LIBRARY}" )
endif ( )
endif ( )
if ( EIGEN_STANDARD_LIBRARIES_TO_LINK_TO )
message ( STATUS "Standard libraries to link to explicitly: ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}" )
else ( )
message ( STATUS "Standard libraries to link to explicitly: none" )
endif ( )
2008-12-02 20:59:10 +08:00
option ( EIGEN_BUILD_BTL "Build benchmark suite" OFF )
2009-05-20 00:48:50 +08:00
if ( NOT WIN32 )
option ( EIGEN_BUILD_PKGCONFIG "Build pkg-config .pc file for Eigen" ON )
endif ( NOT WIN32 )
2008-07-09 22:04:48 +08:00
2008-12-02 20:59:10 +08:00
set ( CMAKE_INCLUDE_CURRENT_DIR ON )
2007-05-30 14:57:40 +08:00
2010-10-21 13:39:06 +08:00
string ( TOLOWER "${CMAKE_GENERATOR}" cmake_generator_tolower )
2010-10-17 18:33:47 +08:00
if ( cmake_generator_tolower MATCHES "makefile" AND NOT MSVC_IDE )
option ( EIGEN_SPLIT_LARGE_TESTS "Split large tests into smaller executables" ON )
else ( )
option ( EIGEN_SPLIT_LARGE_TESTS "Split large tests into smaller executables" OFF )
endif ( )
2010-05-18 20:59:39 +08:00
option ( EIGEN_DEFAULT_TO_ROW_MAJOR "Use row-major as default matrix storage order" OFF )
if ( EIGEN_DEFAULT_TO_ROW_MAJOR )
add_definitions ( "-DEIGEN_DEFAULT_TO_ROW_MAJOR" )
endif ( )
2008-12-02 20:59:10 +08:00
if ( CMAKE_COMPILER_IS_GNUCXX )
2010-02-21 00:39:58 +08:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -fexceptions -fno-check-new -fno-common -fstrict-aliasing" )
set ( CMAKE_CXX_FLAGS_DEBUG "-g3" )
set ( CMAKE_CXX_FLAGS_RELEASE "-g0 -O2" )
check_cxx_compiler_flag ( "-Wno-variadic-macros" COMPILER_SUPPORT_WNOVARIADICMACRO )
if ( COMPILER_SUPPORT_WNOVARIADICMACRO )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-variadic-macros" )
endif ( )
check_cxx_compiler_flag ( "-Wextra" COMPILER_SUPPORT_WEXTRA )
if ( COMPILER_SUPPORT_WEXTRA )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra" )
endif ( )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic" )
option ( EIGEN_TEST_SSE2 "Enable/Disable SSE2 in tests/examples" OFF )
if ( EIGEN_TEST_SSE2 )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2" )
message ( "Enabling SSE2 in tests/examples" )
endif ( )
option ( EIGEN_TEST_SSE3 "Enable/Disable SSE3 in tests/examples" OFF )
if ( EIGEN_TEST_SSE3 )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse3" )
message ( "Enabling SSE3 in tests/examples" )
endif ( )
option ( EIGEN_TEST_SSSE3 "Enable/Disable SSSE3 in tests/examples" OFF )
if ( EIGEN_TEST_SSSE3 )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mssse3" )
message ( "Enabling SSSE3 in tests/examples" )
endif ( )
option ( EIGEN_TEST_SSE4_1 "Enable/Disable SSE4.1 in tests/examples" OFF )
if ( EIGEN_TEST_SSE4_1 )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1" )
message ( "Enabling SSE4.1 in tests/examples" )
endif ( )
option ( EIGEN_TEST_SSE4_2 "Enable/Disable SSE4.2 in tests/examples" OFF )
if ( EIGEN_TEST_SSE4_2 )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2" )
message ( "Enabling SSE4.2 in tests/examples" )
endif ( )
2010-03-04 02:16:21 +08:00
option ( EIGEN_TEST_ALTIVEC "Enable/Disable AltiVec in tests/examples" OFF )
2010-02-21 00:39:58 +08:00
if ( EIGEN_TEST_ALTIVEC )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maltivec -mabi=altivec" )
message ( "Enabling AltiVec in tests/examples" )
endif ( )
2010-03-04 01:25:41 +08:00
2010-03-04 02:16:21 +08:00
option ( EIGEN_TEST_NEON "Enable/Disable Neon in tests/examples" OFF )
2010-03-04 01:25:41 +08:00
if ( EIGEN_TEST_NEON )
2010-07-10 05:09:29 +08:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=hard -mfpu=neon -mcpu=cortex-a8" )
2010-03-04 01:25:41 +08:00
message ( "Enabling NEON in tests/examples" )
endif ( )
2010-03-05 17:22:27 +08:00
check_cxx_compiler_flag ( "-fopenmp" COMPILER_SUPPORT_OPENMP )
if ( COMPILER_SUPPORT_OPENMP )
option ( EIGEN_TEST_OPENMP "Enable/Disable OpenMP in tests/examples" OFF )
if ( EIGEN_TEST_OPENMP )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp" )
message ( "Enabling OpenMP in tests/examples" )
endif ( )
endif ( )
2008-12-02 20:59:10 +08:00
endif ( CMAKE_COMPILER_IS_GNUCXX )
2007-05-30 14:57:40 +08:00
2008-12-18 17:07:36 +08:00
if ( MSVC )
2010-02-21 00:39:58 +08:00
# C4127 - conditional expression is constant
2010-05-20 01:35:42 +08:00
# C4714 - marked as __forceinline not inlined (I failed to deactivate it selectively)
# We can disable this warning in the unit tests since it is clear that it occurs
# because we are oftentimes returning objects that have a destructor or may
# throw exceptions - in particular in the unit tests we are throwing extra many
# exceptions to cover indexing errors.
# C4505 - unreferenced local function has been removed (impossible to deactive selectively)
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /wd4127 /wd4505 /wd4714" )
2010-07-01 13:28:16 +08:00
# replace all /Wx by /W4
2010-02-21 22:23:51 +08:00
string ( REGEX REPLACE "/W[0-9]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" )
2010-07-01 13:28:16 +08:00
check_cxx_compiler_flag ( "/openmp" COMPILER_SUPPORT_OPENMP )
if ( COMPILER_SUPPORT_OPENMP )
option ( EIGEN_TEST_OPENMP "Enable/Disable OpenMP in tests/examples" OFF )
if ( EIGEN_TEST_OPENMP )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp" )
message ( "Enabling OpenMP in tests/examples" )
endif ( )
endif ( )
2008-12-18 17:07:36 +08:00
option ( EIGEN_TEST_SSE2 "Enable/Disable SSE2 in tests/examples" OFF )
if ( EIGEN_TEST_SSE2 )
2009-08-28 06:05:44 +08:00
if ( NOT CMAKE_CL_64 )
2009-09-25 19:08:39 +08:00
# arch is not supported on 64 bit systems, SSE is enabled automatically.
2009-08-28 06:05:44 +08:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2" )
endif ( NOT CMAKE_CL_64 )
2008-12-18 17:07:36 +08:00
message ( "Enabling SSE2 in tests/examples" )
endif ( EIGEN_TEST_SSE2 )
endif ( MSVC )
2009-01-14 22:24:10 +08:00
option ( EIGEN_TEST_NO_EXPLICIT_VECTORIZATION "Disable explicit vectorization in tests/examples" OFF )
2010-10-13 21:04:59 +08:00
option ( EIGEN_TEST_X87 "Force using X87 instructions. Implies no vectorization." OFF )
if ( EIGEN_TEST_X87 )
set ( EIGEN_TEST_NO_EXPLICIT_VECTORIZATION ON )
if ( CMAKE_COMPILER_IS_GNUCXX )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpmath=387" )
message ( "Forcing use of x87 instructions in tests/examples" )
else ( )
message ( "EIGEN_TEST_X87 ignored on your compiler" )
endif ( )
endif ( )
2009-01-14 22:24:10 +08:00
if ( EIGEN_TEST_NO_EXPLICIT_VECTORIZATION )
2009-01-15 16:26:40 +08:00
add_definitions ( -DEIGEN_DONT_VECTORIZE=1 )
2009-01-14 22:24:10 +08:00
message ( "Disabling vectorization in tests/examples" )
2010-03-06 15:17:37 +08:00
endif ( )
option ( EIGEN_TEST_NO_EXPLICIT_ALIGNMENT "Disable explicit alignment (hence vectorization) in tests/examples" OFF )
if ( EIGEN_TEST_NO_EXPLICIT_ALIGNMENT )
add_definitions ( -DEIGEN_DONT_ALIGN=1 )
message ( "Disabling alignment in tests/examples" )
endif ( )
2009-01-14 22:24:10 +08:00
2009-09-22 01:59:58 +08:00
option ( EIGEN_TEST_C++0x "Enables all C++0x features." OFF )
2008-12-02 20:59:10 +08:00
include_directories ( ${ CMAKE_CURRENT_SOURCE_DIR } ${ CMAKE_CURRENT_BINARY_DIR } )
2007-05-30 14:57:40 +08:00
2010-04-08 19:28:21 +08:00
# the user modifiable install path for header files
set ( EIGEN_INCLUDE_INSTALL_DIR ${ EIGEN_INCLUDE_INSTALL_DIR } CACHE PATH "The directory where we install the header files (optional)" )
# set the internal install path for header files which depends on wether the user modifiable
# EIGEN_INCLUDE_INSTALL_DIR has been set by the user or not.
if ( EIGEN_INCLUDE_INSTALL_DIR )
set ( INCLUDE_INSTALL_DIR
$ { E I G E N _ I N C L U D E _ I N S T A L L _ D I R }
C A C H E I N T E R N A L
" T h e d i r e c t o r y w h e r e w e i n s t a l l t h e h e a d e r files ( internal ) "
)
else ( )
set ( INCLUDE_INSTALL_DIR
2009-11-20 01:09:04 +08:00
" $ { C M A K E _ I N S T A L L _ P R E F I X } / i n c l u d e / e i g e n 3 "
2010-04-08 19:28:21 +08:00
C A C H E I N T E R N A L
" T h e d i r e c t o r y w h e r e w e i n s t a l l t h e h e a d e r files ( internal ) "
)
endif ( )
2009-02-05 17:37:53 +08:00
2010-06-28 06:05:11 +08:00
# similar to set_target_properties but append the property instead of overwriting it
macro ( ei_add_target_property target prop value )
get_target_property ( previous ${ target } ${ prop } )
# if the property wasn't previously set, ${previous} is now "previous-NOTFOUND" which cmake allows catching with plain if()
if ( NOT previous )
set ( previous "" )
endif ( NOT previous )
set_target_properties ( ${ target } PROPERTIES ${ prop } "${previous} ${value}" )
endmacro ( ei_add_target_property )
2009-11-20 01:41:28 +08:00
install ( FILES
s i g n a t u r e _ o f _ e i g e n 3 _ m a t r i x _ l i b r a r y
D E S T I N A T I O N $ { I N C L U D E _ I N S T A L L _ D I R } C O M P O N E N T D e v e l
)
2009-05-20 00:48:50 +08:00
if ( EIGEN_BUILD_PKGCONFIG )
2009-11-20 01:09:04 +08:00
configure_file ( eigen3.pc.in eigen3.pc )
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } /eigen3.pc
2009-11-11 22:28:39 +08:00
D E S T I N A T I O N s h a r e / p k g c o n f i g
2009-05-20 00:48:50 +08:00
)
endif ( EIGEN_BUILD_PKGCONFIG )
2008-12-02 20:59:10 +08:00
add_subdirectory ( Eigen )
2008-07-09 22:04:48 +08:00
2009-09-28 05:48:53 +08:00
add_subdirectory ( doc EXCLUDE_FROM_ALL )
2009-02-28 00:19:13 +08:00
2009-09-28 05:48:53 +08:00
include ( CTest )
enable_testing ( ) # must be called from the root CMakeLists, see man page
2009-11-26 10:26:37 +08:00
include ( EigenTesting )
ei_init_testing ( )
2009-11-13 01:07:18 +08:00
if ( EIGEN_LEAVE_TEST_IN_ALL_TARGET )
2009-11-13 21:05:57 +08:00
add_subdirectory ( test ) # can't do EXCLUDE_FROM_ALL here, breaks CTest
2009-11-13 01:07:18 +08:00
else ( )
2009-11-13 21:05:57 +08:00
add_subdirectory ( test EXCLUDE_FROM_ALL )
2009-11-13 01:07:18 +08:00
endif ( )
2008-12-02 20:59:10 +08:00
2009-02-05 17:37:53 +08:00
add_subdirectory ( unsupported )
2009-09-28 05:48:53 +08:00
add_subdirectory ( demos EXCLUDE_FROM_ALL )
2008-12-02 20:59:10 +08:00
2009-09-28 05:48:53 +08:00
add_subdirectory ( blas EXCLUDE_FROM_ALL )
2009-09-25 19:08:39 +08:00
2009-11-26 10:26:37 +08:00
# must be after test and unsupported, for configuring buildtests.in
2009-11-13 01:07:18 +08:00
add_subdirectory ( scripts EXCLUDE_FROM_ALL )
2009-09-28 05:48:53 +08:00
# TODO: consider also replacing EIGEN_BUILD_BTL by a custom target "make btl"?
2008-12-02 20:59:10 +08:00
if ( EIGEN_BUILD_BTL )
2009-09-28 05:48:53 +08:00
add_subdirectory ( bench/btl EXCLUDE_FROM_ALL )
2008-12-02 20:59:10 +08:00
endif ( EIGEN_BUILD_BTL )
2009-02-28 00:19:13 +08:00
2009-09-28 05:48:53 +08:00
ei_testing_print_summary ( )
2009-10-20 03:56:03 +08:00
2009-09-28 06:05:54 +08:00
message ( "" )
message ( "Configured Eigen ${EIGEN_VERSION_NUMBER}" )
2009-11-16 10:12:15 +08:00
message ( "" )
2009-10-20 03:56:03 +08:00
if ( cmake_generator_tolower MATCHES "makefile" )
2009-11-13 01:07:18 +08:00
message ( "Some things you can do now:" )
2009-10-20 03:56:03 +08:00
message ( "--------------+----------------------------------------------------------------" )
message ( "Command | Description" )
message ( "--------------+----------------------------------------------------------------" )
2010-04-18 00:10:53 +08:00
message ( "make install | Install to ${CMAKE_INSTALL_PREFIX}. To change that:" )
message ( " | cmake . -DCMAKE_INSTALL_PREFIX=yourpath" )
message ( " | Eigen headers will then be installed to:" )
message ( " | ${INCLUDE_INSTALL_DIR}" )
message ( " | To install Eigen headers to a separate location, do:" )
message ( " | cmake . -DEIGEN_INCLUDE_INSTALL_DIR=yourpath" )
2009-10-20 03:56:03 +08:00
message ( "make doc | Generate the API documentation, requires Doxygen & LaTeX" )
2009-11-16 10:12:15 +08:00
message ( "make check | Build and run the unit-tests. Read this page:" )
message ( " | http://eigen.tuxfamily.org/index.php?title=Tests" )
2009-11-13 01:07:18 +08:00
message ( "make blas | Build BLAS library (not the same thing as Eigen)" )
2009-10-20 03:56:03 +08:00
message ( "--------------+----------------------------------------------------------------" )
2009-11-16 10:12:15 +08:00
else ( )
message ( "To build/run the unit tests, read this page:" )
message ( " http://eigen.tuxfamily.org/index.php?title=Tests" )
2009-10-20 03:56:03 +08:00
endif ( )
2009-11-13 01:07:18 +08:00
message ( "" )