diff --git a/cmake/Modules/OpmLibMain.cmake b/cmake/Modules/OpmLibMain.cmake index 7de80dd0c..12c2226b6 100644 --- a/cmake/Modules/OpmLibMain.cmake +++ b/cmake/Modules/OpmLibMain.cmake @@ -20,6 +20,7 @@ # - CMP0026 to allow access to the LOCATION target property # - CMP0048 to indicate that we want to deal with the *VERSION* # variables ourselves +# - CMP0064 to indicate that we want TEST if conditions to be evaluated if (POLICY CMP0026) cmake_policy(SET CMP0026 OLD) endif() @@ -28,6 +29,10 @@ if (POLICY CMP0048) cmake_policy(SET CMP0048 OLD) endif() +if(POLICY CMP0064) + cmake_policy(SET CMP0064 NEW) +endif() + # set the behavior of the policy 0054 to NEW. (i.e. do not implicitly # expand variables in if statements) if (POLICY CMP0054) diff --git a/cmake/Modules/OpmSatellites.cmake b/cmake/Modules/OpmSatellites.cmake index fb275ae90..4ea78d864 100644 --- a/cmake/Modules/OpmSatellites.cmake +++ b/cmake/Modules/OpmSatellites.cmake @@ -11,144 +11,136 @@ mark_as_advanced(ADD_DISABLED_CTESTS) # The following suffices must be defined for the opm prefix passed as # parameter: # -# _LINKER_FLAGS Necessary flags to link with this library -# _TARGET CMake target which creates the library -# _LIBRARIES Other dependencies that must also be linked +# _LINKER_FLAGS Necessary flags to link with this library +# _TARGET CMake target which creates the library +# _LIBRARIES Other dependencies that must also be linked # Synopsis: -# opm_compile_satellites (opm satellite excl_all test_regexp) +# opm_compile_satellites (opm satellite excl_all test_regexp) # # Parameters: -# opm Prefix of the variable which contain information -# about the library these satellites depends on, e.g. -# pass "opm-core" if opm-core_TARGET is the name of -# the target the builds this library. Variables with -# suffixes _TARGET and _LIBRARIES must exist. +# opm Prefix of the variable which contain information +# about the library these satellites depends on, e.g. +# pass "opm-core" if opm-core_TARGET is the name of +# the target the builds this library. Variables with +# suffixes _TARGET and _LIBRARIES must exist. # -# satellite Prefix of variable which contain the names of the -# files, e.g. pass "tests" if the files are in the -# variable tests_SOURCES. Variables with suffixes -# _DATAFILES, _SOURCES and _DIR should exist. This -# name is also used as name of the target that builds -# all these files. +# satellite Prefix of variable which contain the names of the +# files, e.g. pass "tests" if the files are in the +# variable tests_SOURCES. Variables with suffixes +# _DATAFILES, _SOURCES and _DIR should exist. This +# name is also used as name of the target that builds +# all these files. # -# excl_all EXCLUDE_FROM_ALL if these targets should not be built by -# default, otherwise empty string. +# excl_all EXCLUDE_FROM_ALL if these targets should not be built by +# default, otherwise empty string. # -# test_regexp Regular expression which picks the name of a test -# out of the filename, or blank if no test should be -# setup. +# test_regexp Regular expression which picks the name of a test +# out of the filename, or blank if no test should be +# setup. # # Example: -# opm_compile_satellites (opm-core test "" "^test_([^/]*)$") +# opm_compile_satellites (opm-core test "" "^test_([^/]*)$") # macro (opm_compile_satellites opm satellite excl_all test_regexp) # if we are going to build the tests always, then make sure that # the datafiles are present too if (NOT (${excl_all} MATCHES "EXCLUDE_FROM_ALL")) - set (_incl_all "ALL") + set (_incl_all "ALL") else (NOT (${excl_all} MATCHES "EXCLUDE_FROM_ALL")) - set (_incl_all "") + set (_incl_all "") endif (NOT (${excl_all} MATCHES "EXCLUDE_FROM_ALL")) # if a set of datafiles has been setup, pull those in add_custom_target (${satellite} ${_incl_all}) if (${satellite}_DATAFILES) - add_dependencies (${satellite} ${${satellite}_DATAFILES}) + add_dependencies (${satellite} ${${satellite}_DATAFILES}) endif (${satellite}_DATAFILES) # compile each of these separately foreach (_sat_FILE IN LISTS ${satellite}_SOURCES) - get_filename_component (_sat_NAME "${_sat_FILE}" NAME_WE) - add_executable (${_sat_NAME} ${excl_all} ${_sat_FILE}) - add_dependencies (${satellite} ${_sat_NAME}) - set_target_properties (${_sat_NAME} PROPERTIES - LINK_FLAGS "${${opm}_LINKER_FLAGS_STR}" - ) - if(HAVE_DYNAMIC_BOOST_TEST) - set_target_properties (${_sat_NAME} PROPERTIES - COMPILE_DEFINITIONS BOOST_TEST_DYN_LINK - ) - endif() - # are we building a test? luckily, the testing framework doesn't - # require anything else, so we don't have to figure out where it - # should go in the library list - if (NOT "${test_regexp}" STREQUAL "") - set (_test_lib "${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}") - else (NOT "${test_regexp}" STREQUAL "") - set (_test_lib "") - add_static_analysis_tests(_sat_FILE ${opm}_INCLUDE_DIRS) - endif (NOT "${test_regexp}" STREQUAL "") - target_link_libraries (${_sat_NAME} ${${opm}_TARGET} ${${opm}_LIBRARIES} ${_test_lib}) - if (STRIP_DEBUGGING_SYMBOLS) - strip_debug_symbols (${_sat_NAME} _sat_DEBUG) - list (APPEND ${satellite}_DEBUG ${_sat_DEBUG}) + get_filename_component (_sat_NAME "${_sat_FILE}" NAME_WE) + add_executable (${_sat_NAME} ${excl_all} ${_sat_FILE}) + add_dependencies (${satellite} ${_sat_NAME}) + set_target_properties (${_sat_NAME} PROPERTIES + LINK_FLAGS "${${opm}_LINKER_FLAGS_STR}") + if(HAVE_DYNAMIC_BOOST_TEST) + set_target_properties (${_sat_NAME} PROPERTIES + COMPILE_DEFINITIONS BOOST_TEST_DYN_LINK) + endif() + # are we building a test? luckily, the testing framework doesn't + # require anything else, so we don't have to figure out where it + # should go in the library list + if (NOT "${test_regexp}" STREQUAL "") + set (_test_lib "${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}") + else (NOT "${test_regexp}" STREQUAL "") + set (_test_lib "") + add_static_analysis_tests(_sat_FILE ${opm}_INCLUDE_DIRS) + endif (NOT "${test_regexp}" STREQUAL "") + target_link_libraries (${_sat_NAME} ${${opm}_TARGET} ${${opm}_LIBRARIES} ${_test_lib}) + if (STRIP_DEBUGGING_SYMBOLS) + strip_debug_symbols (${_sat_NAME} _sat_DEBUG) + list (APPEND ${satellite}_DEBUG ${_sat_DEBUG}) + endif() + + # variable with regular expression doubles as a flag for + # whether tests should be setup or not + set(_sat_FANCY) + if (NOT "${test_regexp}" STREQUAL "") + foreach (_regexp IN ITEMS ${test_regexp}) + if ("${_sat_NAME}" MATCHES "${_regexp}") + string (REGEX REPLACE "${_regexp}" "\\1" _sat_FANCY "${_sat_NAME}") + elseif(NOT _sat_FANCY) + set(_sat_FANCY ${_sat_NAME}) endif() + endforeach (_regexp) + get_target_property (_sat_LOC ${_sat_NAME} LOCATION) + # Run tests through mpi-run. Ubuntu 14.04 provided mpi libs will crash + # in the MPI_Finalize() call otherwise. + if(MPI_FOUND) + set(_sat_LOC ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 1 ${_sat_LOC}) + endif() + if (CMAKE_VERSION VERSION_LESS "2.8.4") + add_test (NAME ${_sat_FANCY} + COMMAND ${CMAKE_COMMAND} -E chdir "${PROJECT_BINARY_DIR}/${${satellite}_DIR}" ${_sat_LOC}) + else (CMAKE_VERSION VERSION_LESS "2.8.4") + add_test (${_sat_FANCY} ${_sat_LOC}) + # run the test in the directory where the data files are + set_tests_properties (${_sat_FANCY} PROPERTIES + WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${${satellite}_DIR}) + endif (CMAKE_VERSION VERSION_LESS "2.8.4") + if(NOT TARGET test-suite) + add_custom_target(test-suite) + endif() + add_dependencies(test-suite "${_sat_NAME}") + endif(NOT "${test_regexp}" STREQUAL "") - # variable with regular expression doubles as a flag for - # whether tests should be setup or not - set(_sat_FANCY) - if (NOT "${test_regexp}" STREQUAL "") - foreach (_regexp IN ITEMS ${test_regexp}) - if ("${_sat_NAME}" MATCHES "${_regexp}") - string (REGEX REPLACE "${_regexp}" "\\1" _sat_FANCY "${_sat_NAME}") - elseif(NOT _sat_FANCY) - set(_sat_FANCY ${_sat_NAME}) - endif() - endforeach (_regexp) - get_target_property (_sat_LOC ${_sat_NAME} LOCATION) - # Run tests through mpi-run. Ubuntu 14.04 provided mpi libs will crash - # in the MPI_Finalize() call otherwise. - if(MPI_FOUND) - set(_sat_LOC ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 1 ${_sat_LOC}) - endif() - if (CMAKE_VERSION VERSION_LESS "2.8.4") - add_test ( - NAME ${_sat_FANCY} - COMMAND ${CMAKE_COMMAND} -E chdir "${PROJECT_BINARY_DIR}/${${satellite}_DIR}" ${_sat_LOC} - ) - else (CMAKE_VERSION VERSION_LESS "2.8.4") - add_test (${_sat_FANCY} ${_sat_LOC}) - # run the test in the directory where the data files are - set_tests_properties (${_sat_FANCY} PROPERTIES - WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${${satellite}_DIR} - ) - endif (CMAKE_VERSION VERSION_LESS "2.8.4") - if(NOT TARGET test-suite) - add_custom_target(test-suite) - endif() - add_dependencies(test-suite "${_sat_NAME}") - endif(NOT "${test_regexp}" STREQUAL "") - - # if this program on the list of files that should be distributed? - # we check by the name of the source file - list (FIND ${satellite}_SOURCES_DIST "${_sat_FILE}" _is_util) - if (NOT (_is_util EQUAL -1)) - install (TARGETS ${_sat_NAME} RUNTIME - DESTINATION bin${${opm}_VER_DIR}/ - ) - endif (NOT (_is_util EQUAL -1)) + # if this program on the list of files that should be distributed? + # we check by the name of the source file + list (FIND ${satellite}_SOURCES_DIST "${_sat_FILE}" _is_util) + if (NOT (_is_util EQUAL -1)) + install (TARGETS ${_sat_NAME} RUNTIME + DESTINATION bin${${opm}_VER_DIR}/) + endif (NOT (_is_util EQUAL -1)) endforeach (_sat_FILE) endmacro (opm_compile_satellites opm prefix) # Synopsis: -# opm_data (satellite target dirname files) +# opm_data (satellite target dirname files) # # provides these output variables: # -# ${satellite}_INPUT_FILES List of all files that are copied -# ${satellite}_DATAFILES Name of target which copies these files +# ${satellite}_INPUT_FILES List of all files that are copied +# ${satellite}_DATAFILES Name of target which copies these files # # Example: # -# opm_data (tests datafiles "tests/") +# opm_data (tests datafiles "tests/") # macro (opm_data satellite target dirname) # even if there are no datafiles, create the directory so the # satellite programs have a homedir to run in - execute_process ( - COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${dirname} - ) + execute_process (COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${dirname}) # if ever huge test datafiles are necessary, then change this # into "create_symlink" (on UNIX only, apparently) @@ -158,26 +150,27 @@ macro (opm_data satellite target dirname) # to a tests/ directory in the output tree (if different) set (${satellite}_INPUT_FILES) if (NOT PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR) - foreach (input_datafile IN LISTS ${satellite}_DATA) - file (RELATIVE_PATH rel_datafile "${PROJECT_SOURCE_DIR}" ${input_datafile}) - set (output_datafile "${PROJECT_BINARY_DIR}/${rel_datafile}") - add_custom_command ( - OUTPUT ${output_datafile} - COMMAND ${CMAKE_COMMAND} - ARGS -E ${make_avail} ${input_datafile} ${output_datafile} - DEPENDS ${input_datafile} - VERBATIM - ) - list (APPEND ${satellite}_INPUT_FILES "${output_datafile}") - endforeach (input_datafile) + foreach (input_datafile IN LISTS ${satellite}_DATA) + if (IS_ABSOLUTE ${input_datafile}) + file (RELATIVE_PATH rel_datafile "${PROJECT_SOURCE_DIR}" ${input_datafile}) + else() + set(rel_datafile ${input_datafile}) + endif() + set (output_datafile "${PROJECT_BINARY_DIR}/${rel_datafile}") + add_custom_command (OUTPUT ${output_datafile} + COMMAND ${CMAKE_COMMAND} + ARGS -E ${make_avail} ${input_datafile} ${output_datafile} + DEPENDS ${input_datafile} + VERBATIM) + list (APPEND ${satellite}_INPUT_FILES "${output_datafile}") + endforeach (input_datafile) endif(NOT PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR) # setup a target which does all the copying set (${satellite}_DATAFILES "${target}") add_custom_target (${${satellite}_DATAFILES} - DEPENDS ${${satellite}_INPUT_FILES} - COMMENT "Making \"${satellite}\" data available in output tree" - ) + DEPENDS ${${satellite}_INPUT_FILES} + COMMENT "Making \"${satellite}\" data available in output tree") if(NOT TARGET test-suite) add_custom_target(test-suite) endif() @@ -309,6 +302,8 @@ macro(opm_add_test TestName) # only compile the binary but do not run it as a test add_executable("${CURTEST_EXE_NAME}" ${CURTEST_EXCLUDE_FROM_ALL} ${CURTEST_SOURCES}) target_link_libraries (${CURTEST_EXE_NAME} ${CURTEST_LIBRARIES}) + get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) + add_static_analysis_tests(CURTEST_SOURCES dirs) if(TARGET ${project}_prepare) add_dependencies("${CURTEST_EXE_NAME}" ${project}_prepare) @@ -324,10 +319,11 @@ macro(opm_add_test TestName) add_executable("${CURTEST_EXE_NAME}" ${CURTEST_EXCLUDE_FROM_ALL} ${CURTEST_SOURCES}) if(HAVE_DYNAMIC_BOOST_TEST) set_target_properties (${CURTEST_EXE_NAME} PROPERTIES - COMPILE_DEFINITIONS BOOST_TEST_DYN_LINK - ) - endif() + COMPILE_DEFINITIONS BOOST_TEST_DYN_LINK) + endif() target_link_libraries (${CURTEST_EXE_NAME} ${CURTEST_LIBRARIES}) + get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) + add_static_analysis_tests(CURTEST_SOURCES dirs) if(CURTEST_DEPENDS) add_dependencies("${CURTEST_EXE_NAME}" ${CURTEST_DEPENDS}) @@ -370,9 +366,7 @@ macro(opm_add_test TestName) endif() add_dependencies(test-suite "${CURTEST_EXE_NAME}") endif() - else() # test is skipped - # the following causes the test to appear as 'skipped' in the # CDash dashboard. it this is removed, the test is just silently # ignored. diff --git a/cmake/Modules/UseStaticAnalysis.cmake b/cmake/Modules/UseStaticAnalysis.cmake index e7828fedc..03651f9d2 100644 --- a/cmake/Modules/UseStaticAnalysis.cmake +++ b/cmake/Modules/UseStaticAnalysis.cmake @@ -34,16 +34,29 @@ function(add_static_analysis_tests sources includes) list(APPEND IPATHS -I ${dep}) endforeach() foreach(src ${${sources}}) - file(RELATIVE_PATH name ${PROJECT_SOURCE_DIR} ${src}) + if(src MATCHES "TARGET_OBJECTS:") + string(REGEX REPLACE "\\$" "\\1" TGT ${src}) + get_target_property(src ${TGT} SOURCES) + endif() + if(IS_ABSOLUTE ${src}) + file(RELATIVE_PATH name ${PROJECT_SOURCE_DIR} ${src}) + else() + set(name ${src}) + set(src ${PROJECT_SOURCE_DIR}/${src}) + endif() if(CPPCHECK_FOUND) - add_test(NAME cppcheck+${name} - COMMAND bin/cppcheck-test.sh ${CPPCHECK_PROGRAM} ${src} ${IPATHS} - CONFIGURATIONS analyze cppcheck) + if(NOT TEST cppcheck+${name}) + add_test(NAME cppcheck+${name} + COMMAND bin/cppcheck-test.sh ${CPPCHECK_PROGRAM} ${src} ${IPATHS} + CONFIGURATIONS analyze cppcheck) + endif() endif() if(CLANGCHECK_FOUND AND CMAKE_EXPORT_COMPILE_COMMANDS) - add_test(NAME clang-check+${name} - COMMAND bin/clang-check-test.sh ${CLANGCHECK_PROGRAM} ${src} - CONFIGURATIONS analyze clang-check) + if(NOT TEST clang-check+${name}) + add_test(NAME clang-check+${name} + COMMAND bin/clang-check-test.sh ${CLANGCHECK_PROGRAM} ${src} + CONFIGURATIONS analyze clang-check) + endif() endif() endforeach() endif()