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 )
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 ( )
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
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
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
2009-11-12 05:11:33 +08:00
string ( TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_tolower )
if ( cmake_build_type_tolower STREQUAL "debug" )
set ( CMAKE_BUILD_TYPE "Debug" )
else ( )
set ( CMAKE_BUILD_TYPE "Release" )
endif ( )
2008-12-02 20:59:10 +08:00
if ( CMAKE_COMPILER_IS_GNUCXX )
if ( CMAKE_SYSTEM_NAME MATCHES Linux )
2010-02-15 18:39:57 +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" )
2009-11-12 05:11:33 +08:00
set ( CMAKE_CXX_FLAGS_DEBUG "-g3" )
set ( CMAKE_CXX_FLAGS_RELEASE "-g0 -O2" )
2010-02-15 18:39:57 +08:00
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 ( )
2009-05-06 16:15:54 +08:00
check_cxx_compiler_flag ( "-Wextra" COMPILER_SUPPORT_WEXTRA )
if ( COMPILER_SUPPORT_WEXTRA )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra" )
endif ( )
2010-01-28 21:46:01 +08:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic" )
2008-12-18 17:07:36 +08:00
option ( EIGEN_TEST_SSE2 "Enable/Disable SSE2 in tests/examples" OFF )
2008-12-02 20:59:10 +08:00
if ( EIGEN_TEST_SSE2 )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2" )
message ( "Enabling SSE2 in tests/examples" )
2009-11-25 04:12:43 +08:00
endif ( )
2008-12-18 17:07:36 +08:00
option ( EIGEN_TEST_SSE3 "Enable/Disable SSE3 in tests/examples" OFF )
2008-12-02 20:59:10 +08:00
if ( EIGEN_TEST_SSE3 )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse3" )
message ( "Enabling SSE3 in tests/examples" )
2009-11-25 04:12:43 +08:00
endif ( )
2008-12-18 17:07:36 +08:00
option ( EIGEN_TEST_SSSE3 "Enable/Disable SSSE3 in tests/examples" OFF )
2008-12-02 20:59:10 +08:00
if ( EIGEN_TEST_SSSE3 )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mssse3" )
message ( "Enabling SSSE3 in tests/examples" )
2009-11-25 04:12:43 +08:00
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 ( )
2008-12-18 17:07:36 +08:00
option ( EIGEN_TEST_ALTIVEC "Enable/Disable altivec in tests/examples" OFF )
2008-12-02 20:59:10 +08:00
if ( EIGEN_TEST_ALTIVEC )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maltivec -mabi=altivec" )
message ( "Enabling AltiVec in tests/examples" )
2009-11-25 04:12:43 +08:00
endif ( )
2008-12-18 17:07:36 +08:00
2008-12-02 20:59:10 +08:00
endif ( CMAKE_SYSTEM_NAME MATCHES Linux )
endif ( CMAKE_COMPILER_IS_GNUCXX )
2007-05-30 14:57:40 +08:00
2008-12-18 17:07:36 +08:00
if ( MSVC )
2009-11-12 05:11:33 +08:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc" )
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 )
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" )
endif ( EIGEN_TEST_NO_EXPLICIT_VECTORIZATION )
2009-09-22 01:59:58 +08:00
option ( EIGEN_TEST_C++0x "Enables all C++0x features." OFF )
2009-12-12 18:39:07 +08:00
option ( EIGEN_TEST_MAX_WARNING_LEVEL "Sets the warning level to /Wall while building the unit tests." OFF )
mark_as_advanced ( EIGEN_TEST_MAX_WARNING_LEVEL )
2009-09-22 01:59:58 +08:00
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
2009-02-05 17:37:53 +08:00
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 "
2009-02-05 17:37:53 +08:00
C A C H E P A T H
" 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 f i l e s "
2009-08-04 23:06:54 +08:00
)
2009-02-05 17:37:53 +08:00
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
string ( TOLOWER "${CMAKE_GENERATOR}" cmake_generator_tolower )
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 ( "--------------+----------------------------------------------------------------" )
message ( "make install | Install to ${CMAKE_INSTALL_PREFIX}" )
2009-11-16 10:12:15 +08:00
message ( " | To change that: cmake . -DCMAKE_INSTALL_PREFIX=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 ( "" )