diff options
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/EigenTesting.cmake | 87 | ||||
-rw-r--r-- | cmake/FindEigen2.cmake | 80 |
2 files changed, 146 insertions, 21 deletions
diff --git a/cmake/EigenTesting.cmake b/cmake/EigenTesting.cmake index 571774787..b8e159be7 100644 --- a/cmake/EigenTesting.cmake +++ b/cmake/EigenTesting.cmake @@ -27,7 +27,11 @@ endmacro(ei_add_property) # void test_<testname>() { ... } # # this macro add an executable test_<testname> as well as a ctest test -# named <testname> +# named <testname>. +# +# it also adds another executable debug_<testname> that compiles in full debug mode +# and is not added to the test target. The idea is that when a test fails you want +# a quick way of rebuilding this specific test in full debug mode. # # On platforms with bash simply run: # "ctest -V" or "ctest -V -R <testname>" @@ -36,38 +40,65 @@ endmacro(ei_add_property) macro(ei_add_test testname) set(targetname test_${testname}) + if(NOT MSVC_IDE) + set(debug_targetname debug_${testname}) + endif(NOT MSVC_IDE) set(filename ${testname}.cpp) add_executable(${targetname} ${filename}) + add_dependencies(btest ${targetname}) + if(NOT MSVC_IDE) + add_executable(${debug_targetname} EXCLUDE_FROM_ALL ${filename}) + endif(NOT MSVC_IDE) if(NOT EIGEN_NO_ASSERTION_CHECKING) if(MSVC) set_target_properties(${targetname} PROPERTIES COMPILE_FLAGS "/EHsc") + if(NOT MSVC_IDE) + set_target_properties(${debug_targetname} PROPERTIES COMPILE_FLAGS "/EHsc") + endif(NOT MSVC_IDE) else(MSVC) set_target_properties(${targetname} PROPERTIES COMPILE_FLAGS "-fexceptions") + set_target_properties(${debug_targetname} PROPERTIES COMPILE_FLAGS "-fexceptions") endif(MSVC) option(EIGEN_DEBUG_ASSERTS "Enable debuging of assertions" OFF) if(EIGEN_DEBUG_ASSERTS) ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_DEBUG_ASSERTS=1") + if(NOT MSVC_IDE) + ei_add_target_property(${debug_targetname} COMPILE_FLAGS "-DEIGEN_DEBUG_ASSERTS=1") + endif(NOT MSVC_IDE) endif(EIGEN_DEBUG_ASSERTS) else(NOT EIGEN_NO_ASSERTION_CHECKING) ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_NO_ASSERTION_CHECKING=1") + if(NOT MSVC_IDE) + ei_add_target_property(${debug_targetname} COMPILE_FLAGS "-DEIGEN_NO_ASSERTION_CHECKING=1") + endif(NOT MSVC_IDE) endif(NOT EIGEN_NO_ASSERTION_CHECKING) + # let the user pass e.g. optimization flags, but don't apply them to the debug target if(${ARGC} GREATER 1) ei_add_target_property(${targetname} COMPILE_FLAGS "${ARGV1}") endif(${ARGC} GREATER 1) - ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_TEST_FUNC=${testname}") + # for the debug target, add full debug options + if(CMAKE_COMPILER_IS_GNUCXX) + # O0 is in principle redundant here, but doesn't hurt + ei_add_target_property(${debug_targetname} COMPILE_FLAGS "-O0 -g3") + elseif(MSVC) + if(NOT MSVC_IDE) + ei_add_target_property(${debug_targetname} COMPILE_FLAGS "/Od /Zi") + endif(NOT MSVC_IDE) + endif(CMAKE_COMPILER_IS_GNUCXX) - if(TEST_LIB) - target_link_libraries(${targetname} Eigen2) - endif(TEST_LIB) + ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_TEST_FUNC=${testname}") + if(NOT MSVC_IDE) + ei_add_target_property(${debug_targetname} COMPILE_FLAGS "-DEIGEN_TEST_FUNC=${testname}") + endif(NOT MSVC_IDE) target_link_libraries(${targetname} ${EXTERNAL_LIBS}) if(${ARGC} GREATER 2) @@ -75,11 +106,18 @@ macro(ei_add_test testname) string(LENGTH "${ARGV2_stripped}" ARGV2_stripped_length) if(${ARGV2_stripped_length} GREATER 0) target_link_libraries(${targetname} ${ARGV2}) + if(NOT MSVC_IDE) + target_link_libraries(${debug_targetname} ${ARGV2}) + endif(NOT MSVC_IDE) endif(${ARGV2_stripped_length} GREATER 0) endif(${ARGC} GREATER 2) if(WIN32) - add_test(${testname} "${targetname}") + if(CYGWIN) + add_test(${testname} "${Eigen_SOURCE_DIR}/test/runtest.sh" "${testname}") + else(CYGWIN) + add_test(${testname} "${targetname}") + endif(CYGWIN) else(WIN32) add_test(${testname} "${Eigen_SOURCE_DIR}/test/runtest.sh" "${testname}") endif(WIN32) @@ -102,31 +140,31 @@ macro(ei_testing_print_summary) if(EIGEN_TEST_SSE2) message("SSE2: ON") else(EIGEN_TEST_SSE2) - message("SSE2: AUTO") + message("SSE2: Using architecture defaults") endif(EIGEN_TEST_SSE2) if(EIGEN_TEST_SSE3) message("SSE3: ON") else(EIGEN_TEST_SSE3) - message("SSE3: AUTO") + message("SSE3: Using architecture defaults") endif(EIGEN_TEST_SSE3) if(EIGEN_TEST_SSSE3) message("SSSE3: ON") else(EIGEN_TEST_SSSE3) - message("SSSE3: AUTO") + message("SSSE3: Using architecture defaults") endif(EIGEN_TEST_SSSE3) if(EIGEN_TEST_ALTIVEC) - message("Altivec: ON") + message("Altivec: Using architecture defaults") else(EIGEN_TEST_ALTIVEC) - message("Altivec: AUTO") + message("Altivec: Using architecture defaults") endif(EIGEN_TEST_ALTIVEC) if(EIGEN_TEST_NO_EXPLICIT_VECTORIZATION) message("Explicit vec: OFF") else(EIGEN_TEST_NO_EXPLICIT_VECTORIZATION) - message("Explicit vec: AUTO") + message("Explicit vec: Using architecture defaults") endif(EIGEN_TEST_NO_EXPLICIT_VECTORIZATION) message("\n${EIGEN_TESTING_SUMMARY}") @@ -153,18 +191,25 @@ macro(ei_init_testing) endmacro(ei_init_testing) if(CMAKE_COMPILER_IS_GNUCXX) + option(EIGEN_COVERAGE_TESTING "Enable/disable gcov" OFF) + if(EIGEN_COVERAGE_TESTING) + set(COVERAGE_FLAGS "-fprofile-arcs -ftest-coverage") + else(EIGEN_COVERAGE_TESTING) + set(COVERAGE_FLAGS "") + endif(EIGEN_COVERAGE_TESTING) + if(EIGEN_TEST_RVALUE_REF_SUPPORT OR EIGEN_TEST_C++0x) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") + endif(EIGEN_TEST_RVALUE_REF_SUPPORT OR EIGEN_TEST_C++0x) if(CMAKE_SYSTEM_NAME MATCHES Linux) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g2") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O2 -g2") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-inline-functions") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g2") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_FLAGS} -g2") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${COVERAGE_FLAGS} -O2 -g2") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${COVERAGE_FLAGS} -fno-inline-functions") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${COVERAGE_FLAGS} -O0 -g2") endif(CMAKE_SYSTEM_NAME MATCHES Linux) set(EI_OFLAG "-O2") -# MSVC fails with: -# cl : Command line warning D9025 : overriding '/Od' with '/O2' -# cl : Command line error D8016 : '/RTC1' and '/O2' command-line options are incompatible -# elseif(MSVC) -# set(EI_OFLAG "/O2") +elseif(MSVC) + set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /MDd /Zi /Ob0 /Od" CACHE STRING "Flags used by the compiler during debug builds." FORCE) + set(EI_OFLAG "/O2") else(CMAKE_COMPILER_IS_GNUCXX) set(EI_OFLAG "") endif(CMAKE_COMPILER_IS_GNUCXX) diff --git a/cmake/FindEigen2.cmake b/cmake/FindEigen2.cmake new file mode 100644 index 000000000..ee054b0da --- /dev/null +++ b/cmake/FindEigen2.cmake @@ -0,0 +1,80 @@ +# - Try to find Eigen2 lib +# +# This module supports requiring a minimum version, e.g. you can do +# find_package(Eigen2 2.0.3) +# to require version 2.0.3 to newer of Eigen2. +# +# Once done this will define +# +# EIGEN2_FOUND - system has eigen lib with correct version +# EIGEN2_INCLUDE_DIR - the eigen include directory +# EIGEN2_VERSION - eigen version + +# Copyright (c) 2006, 2007 Montel Laurent, <montel@kde.org> +# Copyright (c) 2008, 2009 Gael Guennebaud, <g.gael@free.fr> +# Redistribution and use is allowed according to the terms of the BSD license. + +if(NOT Eigen2_FIND_VERSION) + if(NOT Eigen2_FIND_VERSION_MAJOR) + set(Eigen2_FIND_VERSION_MAJOR 2) + endif(NOT Eigen2_FIND_VERSION_MAJOR) + if(NOT Eigen2_FIND_VERSION_MINOR) + set(Eigen2_FIND_VERSION_MINOR 0) + endif(NOT Eigen2_FIND_VERSION_MINOR) + if(NOT Eigen2_FIND_VERSION_PATCH) + set(Eigen2_FIND_VERSION_PATCH 0) + endif(NOT Eigen2_FIND_VERSION_PATCH) + + set(Eigen2_FIND_VERSION "${Eigen2_FIND_VERSION_MAJOR}.${Eigen2_FIND_VERSION_MINOR}.${Eigen2_FIND_VERSION_PATCH}") +endif(NOT Eigen2_FIND_VERSION) + +macro(_eigen2_check_version) + file(READ "${EIGEN2_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen2_version_header LIMIT 5000 OFFSET 1000) + + string(REGEX MATCH "define *EIGEN_WORLD_VERSION ([0-9]*)" _eigen2_world_version_match "${_eigen2_version_header}") + set(EIGEN2_WORLD_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define *EIGEN_MAJOR_VERSION ([0-9]*)" _eigen2_major_version_match "${_eigen2_version_header}") + set(EIGEN2_MAJOR_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define *EIGEN_MINOR_VERSION ([0-9]*)" _eigen2_minor_version_match "${_eigen2_version_header}") + set(EIGEN2_MINOR_VERSION "${CMAKE_MATCH_1}") + + set(EIGEN2_VERSION ${EIGEN2_WORLD_VERSION}.${EIGEN2_MAJOR_VERSION}.${EIGEN2_MINOR_VERSION}) + if(${EIGEN2_VERSION} VERSION_LESS ${Eigen2_FIND_VERSION}) + set(EIGEN2_VERSION_OK FALSE) + else(${EIGEN2_VERSION} VERSION_LESS ${Eigen2_FIND_VERSION}) + set(EIGEN2_VERSION_OK TRUE) + endif(${EIGEN2_VERSION} VERSION_LESS ${Eigen2_FIND_VERSION}) + + if(NOT EIGEN2_VERSION_OK) + + message(STATUS "Eigen2 version ${EIGEN2_VERSION} found in ${EIGEN2_INCLUDE_DIR}, " + "but at least version ${Eigen2_FIND_VERSION} is required") + endif(NOT EIGEN2_VERSION_OK) +endmacro(_eigen2_check_version) + +if (EIGEN2_INCLUDE_DIR) + + # in cache already + _eigen2_check_version() + set(EIGEN2_FOUND ${EIGEN2_VERSION_OK}) + +else (EIGEN2_INCLUDE_DIR) + +find_path(EIGEN2_INCLUDE_DIR NAMES Eigen/Core + PATHS + ${INCLUDE_INSTALL_DIR} + ${KDE4_INCLUDE_DIR} + PATH_SUFFIXES eigen2 + ) + +if(EIGEN2_INCLUDE_DIR) + _eigen2_check_version() +endif(EIGEN2_INCLUDE_DIR) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Eigen2 DEFAULT_MSG EIGEN2_INCLUDE_DIR EIGEN2_VERSION_OK) + +mark_as_advanced(EIGEN2_INCLUDE_DIR) + +endif(EIGEN2_INCLUDE_DIR) + |