You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
278 lines
10 KiB
278 lines
10 KiB
# @HEADER
|
|
# ************************************************************************
|
|
#
|
|
# TriBITS: Tribal Build, Integrate, and Test System
|
|
# Copyright 2013 Sandia Corporation
|
|
#
|
|
# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
|
|
# the U.S. Government retains certain rights in this software.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions are
|
|
# met:
|
|
#
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
#
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
#
|
|
# 3. Neither the name of the Corporation nor the names of the
|
|
# contributors may be used to endorse or promote products derived from
|
|
# this software without specific prior written permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
|
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
|
|
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
#
|
|
# ************************************************************************
|
|
# @HEADER
|
|
|
|
|
|
include(TribitsAddExecutable)
|
|
include(TribitsAddTest)
|
|
include(TribitsDeprecatedHelpers)
|
|
|
|
|
|
#
|
|
# Helper Macros
|
|
#
|
|
|
|
|
|
macro(tribits_fwd_parse_arg VAR_TO_SET_OUT ARGNAME)
|
|
if (PARSE_${ARGNAME})
|
|
set(${VAR_TO_SET_OUT} ${${VAR_TO_SET_OUT}} ${ARGNAME} ${PARSE_${ARGNAME}})
|
|
endif()
|
|
endmacro()
|
|
|
|
|
|
macro(tribits_fwd_parse_opt VAR_TO_SET_OUT OPTNAME)
|
|
if (PARSE_${OPTNAME})
|
|
set(${VAR_TO_SET_OUT} ${${VAR_TO_SET_OUT}} ${OPTNAME})
|
|
endif()
|
|
endmacro()
|
|
|
|
|
|
macro(tribits_add_executable_wrapper)
|
|
if (TRIBITS_ADD_EXECUTABLE_AND_TEST_TEST_MODE)
|
|
set(TRIBITS_ADD_EXECUTABLE_CAPTURE_ARGS ${ARGN} CACHE INTERNAL "")
|
|
else()
|
|
tribits_add_executable(${ARGN})
|
|
endif()
|
|
endmacro()
|
|
|
|
|
|
macro(tribits_add_test_wrapper)
|
|
if (TRIBITS_ADD_EXECUTABLE_AND_TEST_TEST_MODE)
|
|
set(TRIBITS_ADD_TEST_CAPTURE_ARGS ${ARGN} CACHE INTERNAL "")
|
|
else()
|
|
tribits_add_test(${ARGN})
|
|
endif()
|
|
endmacro()
|
|
|
|
|
|
# @FUNCTION: tribits_add_executable_and_test()
|
|
#
|
|
# Add an executable and a test (or several tests) all in one shot (just calls
|
|
# `tribits_add_executable()`_ followed by `tribits_add_test()`_).
|
|
#
|
|
# Usage::
|
|
#
|
|
# tribits_add_executable_and_test(
|
|
# <exeRootName> [NOEXEPREFIX] [NOEXESUFFIX] [ADD_DIR_TO_NAME]
|
|
# SOURCES <src0> <src1> ...
|
|
# [NAME <testName> | NAME_POSTFIX <testNamePostfix>]
|
|
# [CATEGORIES <category0> <category1> ...]
|
|
# [HOST <host0> <host1> ...]
|
|
# [XHOST <xhost0> <xhost1> ...]
|
|
# [XHOST_TEST <xhost0> <xhost1> ...]
|
|
# [HOSTTYPE <hosttype0> <hosttype1> ...]
|
|
# [XHOSTTYPE <xhosttype0> <xhosttype1> ...]
|
|
# [XHOSTTYPE_TEST <xhosttype0> <xhosttype1> ...]
|
|
# [EXCLUDE_IF_NOT_TRUE <varname0> <varname1> ...]
|
|
# [DISABLED "<messageWhyDisabled>"]
|
|
# [DIRECTORY <dir>]
|
|
# [TESTONLYLIBS <lib0> <lib1> ...]
|
|
# [IMPORTEDLIBS <lib0> <lib1> ...]
|
|
# [COMM [serial] [mpi]]
|
|
# [ARGS "<arg0> <arg1> ..." "<arg2> <arg3> ..." ...]
|
|
# [NUM_MPI_PROCS <numProcs>]
|
|
# [RUN_SERIAL]
|
|
# [LINKER_LANGUAGE (C|CXX|Fortran)]
|
|
# [STANDARD_PASS_OUTPUT
|
|
# | PASS_REGULAR_EXPRESSION "<regex0>;<regex1>;..."]
|
|
# [FAIL_REGULAR_EXPRESSION "<regex0>;<regex1>;..."]
|
|
# [WILL_FAIL]
|
|
# [ENVIRONMENT <var0>=<value0> <var1>=<value1> ...]
|
|
# [INSTALLABLE]
|
|
# [TIMEOUT <maxSeconds>]
|
|
# [LIST_SEPARATOR <sep>]
|
|
# [ADDED_EXE_TARGET_NAME_OUT <exeTargetName>]
|
|
# [ADDED_TESTS_NAMES_OUT <testsNames>]
|
|
# )
|
|
#
|
|
# This function takes a fairly common set of arguments to
|
|
# `tribits_add_executable()`_ and `tribits_add_test()`_ but not the full set
|
|
# passed to ``tribits_add_test()``. See the documentation for
|
|
# `tribits_add_executable()`_ and `tribits_add_test()`_ to see which arguments
|
|
# are accepted by which functions.
|
|
#
|
|
# Arguments that are specific to this function and not directly passed on to
|
|
# ``tribits_add_executable()`` or ``tribits_add_test()`` include:
|
|
#
|
|
# ``XHOST_TEST <xhost0> <xhost1> ...``
|
|
#
|
|
# When specified, this disables just running the tests for the named hosts
|
|
# ``<xhost0>``, ``<xhost0>`` etc. but still builds the executable for the
|
|
# test. These are just passed in through the ``XHOST`` argument to
|
|
# ``tribits_add_test()``.
|
|
#
|
|
# ``XHOSTTYPE_TEST <xhosttype0> <hosttype1> ...``
|
|
#
|
|
# When specified, this disables just running the tests for the named host
|
|
# types ``<hosttype0>``, ``<hosttype0>``, ..., but still builds the
|
|
# executable for the test. These are just passed in through the
|
|
# ``XHOSTTYPE`` argument to ``tribits_add_test()``.
|
|
#
|
|
# This is the function to use for simple test executables that you want to run
|
|
# that either takes no arguments or just a simple set of arguments passed in
|
|
# through ``ARGS``. For more flexibility, just use
|
|
# ``tribits_add_executable()`` followed by ``tribits_add_test()``.
|
|
#
|
|
# Finally, the tests are only added if tests are enabled for the package
|
|
# (i.e. `${PACKAGE_NAME}_ENABLE_TESTS`_ ``= ON``) and other criteria are met.
|
|
# But the test executable will always be added if this function is called,
|
|
# regardless of the value of ``${PACKAGE_NAME}_ENABLE_TESTS``. To avoid
|
|
# adding the test (or example) executable when
|
|
# ``${PACKAGE_NAME}_ENABLE_TESTS=OFF``, put this command in a subdir under
|
|
# ``test/`` or ``example/`` and that subdir with
|
|
# `tribits_add_test_directories()`_ or `tribits_add_example_directories()`_,
|
|
# respectively.
|
|
#
|
|
function(tribits_add_executable_and_test EXE_NAME)
|
|
|
|
#
|
|
# A) Parse the input arguments
|
|
#
|
|
|
|
cmake_parse_arguments(
|
|
#prefix
|
|
PARSE
|
|
#options
|
|
"RUN_SERIAL;STANDARD_PASS_OUTPUT;WILL_FAIL;ADD_DIR_TO_NAME;INSTALLABLE;NOEXEPREFIX;NOEXESUFFIX"
|
|
#one_value_keywords
|
|
"DISABLED"
|
|
#mulit_value_keywords
|
|
"SOURCES;DEPLIBS;TESTONLYLIBS;IMPORTEDLIBS;NAME;NAME_POSTFIX;NUM_MPI_PROCS;DIRECTORY;KEYWORDS;COMM;ARGS;PASS_REGULAR_EXPRESSION;FAIL_REGULAR_EXPRESSION;ENVIRONMENT;TIMEOUT;LIST_SEPARATOR;CATEGORIES;HOST;XHOST;XHOST_TEST;HOSTTYPE;XHOSTTYPE;EXCLUDE_IF_NOT_TRUE;XHOSTTYPE_TEST;LINKER_LANGUAGE;TARGET_DEFINES;DEFINES;ADDED_EXE_TARGET_NAME_OUT;ADDED_TESTS_NAMES_OUT"
|
|
${ARGN}
|
|
)
|
|
|
|
tribits_check_for_unparsed_arguments()
|
|
|
|
if(${PROJECT_NAME}_VERBOSE_CONFIGURE)
|
|
message("")
|
|
message("TRIBITS_ADD_EXECUTABLE_AND_TEST: ${EXE_NAME} ${ARGN}")
|
|
endif()
|
|
|
|
if(PARSE_ADDED_EXE_TARGET_NAME_OUT)
|
|
set(${PARSE_ADDED_EXE_TARGET_NAME_OUT} "" PARENT_SCOPE)
|
|
endif()
|
|
if(PARSE_ADDED_TESTS_NAMES_OUT)
|
|
set(${PARSE_ADDED_TESTS_NAMES_OUT} "" PARENT_SCOPE)
|
|
endif()
|
|
|
|
#
|
|
# B) Arguments common to both
|
|
#
|
|
|
|
set(COMMON_CALL_ARGS "")
|
|
tribits_fwd_parse_arg(COMMON_CALL_ARGS COMM)
|
|
tribits_fwd_parse_arg(COMMON_CALL_ARGS CATEGORIES)
|
|
tribits_fwd_parse_arg(COMMON_CALL_ARGS HOST)
|
|
tribits_fwd_parse_arg(COMMON_CALL_ARGS XHOST)
|
|
tribits_fwd_parse_arg(COMMON_CALL_ARGS HOSTTYPE)
|
|
tribits_fwd_parse_arg(COMMON_CALL_ARGS XHOSTTYPE)
|
|
tribits_fwd_parse_arg(COMMON_CALL_ARGS EXCLUDE_IF_NOT_TRUE)
|
|
tribits_fwd_parse_opt(COMMON_CALL_ARGS NOEXEPREFIX)
|
|
tribits_fwd_parse_opt(COMMON_CALL_ARGS NOEXESUFFIX)
|
|
|
|
#
|
|
# C) tribits_add_executable(...)
|
|
#
|
|
|
|
if (PARSE_DEPLIBS)
|
|
tribits_deprecated("DEPLIBS argument of tribits_add_executable_and_test() is deprecated.")
|
|
endif()
|
|
|
|
set(CALL_ARGS "")
|
|
tribits_fwd_parse_arg(CALL_ARGS SOURCES)
|
|
tribits_fwd_parse_arg(CALL_ARGS DEPLIBS) # Deprecated
|
|
tribits_fwd_parse_arg(CALL_ARGS TESTONLYLIBS)
|
|
tribits_fwd_parse_arg(CALL_ARGS IMPORTEDLIBS)
|
|
tribits_fwd_parse_arg(CALL_ARGS DIRECTORY)
|
|
tribits_fwd_parse_opt(CALL_ARGS ADD_DIR_TO_NAME)
|
|
tribits_fwd_parse_arg(CALL_ARGS LINKER_LANGUAGE)
|
|
tribits_fwd_parse_arg(CALL_ARGS TARGET_DEFINES)
|
|
tribits_fwd_parse_arg(CALL_ARGS DEFINES)
|
|
tribits_fwd_parse_opt(CALL_ARGS INSTALLABLE)
|
|
if (PARSE_ADDED_EXE_TARGET_NAME_OUT)
|
|
list(APPEND CALL_ARGS ADDED_EXE_TARGET_NAME_OUT ADDED_EXE_TARGET_NAME)
|
|
endif()
|
|
|
|
tribits_add_executable_wrapper(${EXE_NAME} ${COMMON_CALL_ARGS} ${CALL_ARGS})
|
|
|
|
if(PARSE_ADDED_EXE_TARGET_NAME_OUT)
|
|
set( ${PARSE_ADDED_EXE_TARGET_NAME_OUT} "${ADDED_EXE_TARGET_NAME}"
|
|
PARENT_SCOPE )
|
|
endif()
|
|
|
|
#
|
|
# D) tribits_add_test(...)
|
|
#
|
|
|
|
set(CALL_ARGS "")
|
|
tribits_fwd_parse_arg(CALL_ARGS NAME)
|
|
tribits_fwd_parse_arg(CALL_ARGS NAME_POSTFIX)
|
|
tribits_fwd_parse_arg(CALL_ARGS DIRECTORY)
|
|
tribits_fwd_parse_arg(CALL_ARGS KEYWORDS)
|
|
tribits_fwd_parse_arg(CALL_ARGS NUM_MPI_PROCS)
|
|
tribits_fwd_parse_arg(CALL_ARGS ARGS)
|
|
tribits_fwd_parse_arg(CALL_ARGS PASS_REGULAR_EXPRESSION)
|
|
tribits_fwd_parse_arg(CALL_ARGS FAIL_REGULAR_EXPRESSION)
|
|
tribits_fwd_parse_arg(CALL_ARGS ENVIRONMENT)
|
|
tribits_fwd_parse_arg(CALL_ARGS DISABLED)
|
|
tribits_fwd_parse_opt(CALL_ARGS RUN_SERIAL)
|
|
tribits_fwd_parse_opt(CALL_ARGS STANDARD_PASS_OUTPUT)
|
|
tribits_fwd_parse_opt(CALL_ARGS WILL_FAIL)
|
|
tribits_fwd_parse_arg(CALL_ARGS TIMEOUT)
|
|
tribits_fwd_parse_arg(CALL_ARGS LIST_SEPARATOR)
|
|
tribits_fwd_parse_opt(CALL_ARGS ADD_DIR_TO_NAME)
|
|
tribits_fwd_parse_opt(CALL_ARGS ADDED_TESTS_NAMES_OUT)
|
|
if (PARSE_XHOST_TEST)
|
|
set(CALL_ARGS ${CALL_ARGS} XHOST ${PARSE_XHOST_TEST})
|
|
endif()
|
|
if (PARSE_XHOSTTYPE_TEST)
|
|
set(CALL_ARGS ${CALL_ARGS} XHOSTTYPE ${PARSE_XHOSTTYPE_TEST})
|
|
endif()
|
|
if (PARSE_ADDED_TESTS_NAMES_OUT)
|
|
list(APPEND CALL_ARGS ADDED_TESTS_NAMES_OUT ADDED_TESTS_NAMES)
|
|
endif()
|
|
|
|
tribits_add_test_wrapper(${EXE_NAME} ${COMMON_CALL_ARGS} ${CALL_ARGS})
|
|
|
|
if(PARSE_ADDED_TESTS_NAMES_OUT)
|
|
set(${PARSE_ADDED_TESTS_NAMES_OUT} "${ADDED_TESTS_NAMES}" PARENT_SCOPE)
|
|
endif()
|
|
|
|
endfunction()
|
|
|
|
# LocalWords: executables
|
|
|