Skip to content

Commit

Permalink
Fix case for optional missing component (trilinos/Trilinos#2689)
Browse files Browse the repository at this point in the history
My last commit broke the use case where an optional component (TriBITS
package) is missing (i.e. was not enabled).  This broke the SPARC use case
where it looks for TriKota but TriKota can be missing.

I added tests for that use case and strengthened the existing tests.  I broke
the failing test into two ctest tests since you have to reconfigure from
scratch anyway so there is no benefit to keeping these together.

Build/Test Cases Summary
Enabled Packages:
Enabled all Packages
0) MPI_DEBUG => passed: passed=355,notpassed=0 (1.16 min)
1) SERIAL_RELEASE => passed: passed=355,notpassed=0 (1.22 min)
  • Loading branch information
bartlettroscoe committed Apr 23, 2019
1 parent 52c9850 commit 1d1334b
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 46 deletions.
7 changes: 7 additions & 0 deletions test/core/ExamplesUnitTests/DummyPackageClientCMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,10 @@ MESSAGE("${EXPORT_VAR_PREFIX}_MPI_EXEC_MAX_NUMPROCS = '${${EXPORT_VAR_PREFIX}_MP
MESSAGE("${EXPORT_VAR_PREFIX}_MPI_EXEC_NUMPROCS_FLAG = '${${EXPORT_VAR_PREFIX}_MPI_EXEC_NUMPROCS_FLAG}'")
MESSAGE("${EXPORT_VAR_PREFIX}_PACKAGE_LIST = '${${EXPORT_VAR_PREFIX}_PACKAGE_LIST}'")
MESSAGE("${EXPORT_VAR_PREFIX}_TPL_LIST = '${${EXPORT_VAR_PREFIX}_TPL_LIST}'")
SET(ALL_PACKAGES_AND_COMPONENTS
${${EXPORT_VAR_PREFIX}_PACKAGE_LIST} ${DUMMY_PROJECT_FIND_COMPONENTS})
LIST(REMOVE_DUPLICATES ALL_PACKAGES_AND_COMPONENTS)
FOREACH (PACKAGE_NAME ${ALL_PACKAGES_AND_COMPONENTS})
MESSAGE("${EXPORT_VAR_PREFIX}_${PACKAGE_NAME}_FOUND = '${${EXPORT_VAR_PREFIX}_${PACKAGE_NAME}_FOUND}'")
ENDFOREACH()
MESSAGE("${EXPORT_VAR_PREFIX}_FOUND = '${${EXPORT_VAR_PREFIX}_FOUND}'")
100 changes: 88 additions & 12 deletions test/ctest_driver/TribitsExampleProject/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1904,7 +1904,9 @@ FUNCTION(GENERATE_AAO_TESTS USE_NEW_AAO_CTEST_CDASH_FEATURES)
ALWAYS_FAIL_ON_NONZERO_RETURN
)

SET(TEST_NAME_BODY CTestDriver_AAO${AAO_POSTFIX}_CTEST_DO_INSTALL_FAIL)

SET(TEST_NAME_BODY
CTestDriver_AAO${AAO_POSTFIX}_CTEST_DO_INSTALL_FAIL_bad_intall_filename)
SET(TEST_NAME ${PACKAGE_NAME}_${TEST_NAME_BODY})
SET(TEST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME}")
TRIBITS_ADD_ADVANCED_TEST( ${TEST_NAME_BODY}
Expand Down Expand Up @@ -1976,19 +1978,82 @@ FUNCTION(GENERATE_AAO_TESTS USE_NEW_AAO_CTEST_CDASH_FEATURES)
# aborts in the SimpleCxx install while the 'install_package_by_package'
# will call install in all of the packages.

TEST_4
MESSAGE "Remove the install directory"
CMND rm ARGS -r BUILD/install
ALWAYS_FAIL_ON_NONZERO_RETURN
TEST_4
MESSAGE "Create and configure a dummy project that includes"
" TribitsExProjConfig.cmake from the install tree and ask for non-enabled package"
CMND ${CMAKE_COMMAND}
ARGS
-DDUMMY_PROJECT_NAME=DummyProject
-DDUMMY_PROJECT_DIR=dummy_client_of_TribitsExProj
-DEXPORT_VAR_PREFIX=TribitsExProj
"-DDUMMY_PROJECT_FIND_COMPONENTS=SimpleCxx,WithSubpackagesA,WrapExternal"
-DEXPORT_CONFIG_FILE=../BUILD/install/lib/cmake/TribitsExProj/TribitsExProjConfig.cmake
-DCMAKE_COMMAND=${CMAKE_COMMAND}
-P ${PROJECT_SOURCE_DIR}/test/core/ExamplesUnitTests/RunDummyPackageClientBulid.cmake
PASS_REGULAR_EXPRESSION_ALL
"DUMMY_PROJECT_NAME = 'DummyProject'"
"DUMMY_PROJECT_DIR = 'dummy_client_of_TribitsExProj'"
"EXPORT_CONFIG_FILE = '../BUILD/install/lib/cmake/TribitsExProj/TribitsExProjConfig.cmake'"
"TribitsExProj_FIND_COMPONENTS = 'SimpleCxx[;]WithSubpackagesA[;]WrapExternal'"
"Component .WrapExternal. NOT found"
"TribitsExProj_LIBRARIES = 'pws_a[;]simplecxx'"
"TribitsExProj_TPL_INCLUDE_DIRS = '.*/examples/tpls/HeaderOnlyTpl'"
"TribitsExProj_PACKAGE_LIST = 'WithSubpackages[;]WithSubpackagesC[;]WithSubpackagesB[;]WithSubpackagesA[;]MixedLang[;]SimpleCxx'"
"TribitsExProj_TPL_LIST = 'HeaderOnlyTpl'"
"TribitsExProj_WithSubpackages_FOUND = ''"
"TribitsExProj_WithSubpackagesC_FOUND = ''"
"TribitsExProj_WithSubpackagesB_FOUND = ''"
"TribitsExProj_WithSubpackagesA_FOUND = 'TRUE'"
"TribitsExProj_MixedLang_FOUND = ''"
"TribitsExProj_SimpleCxx_FOUND = 'TRUE'"
"TribitsExProj_FOUND = 'TRUE'"
"TribitsExProj_WrapExternal_FOUND = 'FALSE'"
"-- Configuring done"
"-- Generating done"
ALWAYS_FAIL_ON_NONZERO_RETURN

# ToDo: Add another dummy project for the case where componets are
# required and assure that TribitsExProj_FOUND = 'FALSE'.

)
# NOTE: That above test tests two primary things:
#
# * Install failures due to missing files will be caught and reported.
#
# * If an install failure occures in one package, it will not impact
# installs in other packages due to the custom
# 'install_package_by_package' target.
#

TEST_5

SET(TEST_NAME_BODY
CTestDriver_AAO${AAO_POSTFIX}_CTEST_DO_INSTALL_FAIL_build_failed)
SET(TEST_NAME ${PACKAGE_NAME}_${TEST_NAME_BODY})
SET(TEST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME}")
TRIBITS_ADD_ADVANCED_TEST( ${TEST_NAME_BODY}
OVERALL_WORKING_DIRECTORY TEST_NAME
OVERALL_NUM_MPI_PROCS 1

TEST_0
MESSAGE "Copy TribitsExampleProject in so we can break it the install."
CMND cp
ARGS -r ${TribitsExProj_DIR} .

TEST_1
MESSAGE "Add the install of a file that does not exist!"
CMND ${CMAKE_CURRENT_SOURCE_DIR}/append_file_with_line.sh
ARGS
${TEST_DIR}/TribitsExampleProject/packages/mixed_lang/src/CMakeLists.txt
"\nINSTALL(FILES does_not_exist.txt DESTINATION dummy_intall_dir COMPONENT SimpleCxx)\n"

TEST_2
MESSAGE "Break the library build WithSubpackageC"
CMND ${CMAKE_CURRENT_SOURCE_DIR}/append_file_with_line.sh
ARGS TribitsExampleProject/packages/with_subpackages/c/C.cpp
"Build of C.cpp lib is broken!"

TEST_6
MESSAGE "Run rerun ctest -S driver with a broken lib."
TEST_3
MESSAGE "Run ctest -S driver"
CMND env
ARGS
CTEST_DASHBOARD_ROOT=PWD
Expand All @@ -2012,7 +2077,7 @@ FUNCTION(GENERATE_AAO_TESTS USE_NEW_AAO_CTEST_CDASH_FEATURES)
"TRIBITS_CTEST_DRIVER: OVERALL: ALL FAILED"
ALWAYS_FAIL_ON_ZERO_RETURN

TEST_7
TEST_4
MESSAGE "Check the contents of the install dir"
CMND ls ARGS -R BUILD/install
PASS_REGULAR_EXPRESSION_ALL
Expand All @@ -2031,9 +2096,9 @@ FUNCTION(GENERATE_AAO_TESTS USE_NEW_AAO_CTEST_CDASH_FEATURES)
# NOTE: Almost everything will install accept for the WithSubpackageC
# stuff since that library did not build.

TEST_8
TEST_5
MESSAGE "Create and configure a dummy project that includes"
" TribitsExProjConfig.cmake from the install tree"
" TribitsExProjConfig.cmake where componets are optional"
CMND ${CMAKE_COMMAND}
ARGS
-DDUMMY_PROJECT_NAME=DummyProject
Expand All @@ -2050,10 +2115,22 @@ FUNCTION(GENERATE_AAO_TESTS USE_NEW_AAO_CTEST_CDASH_FEATURES)
"TribitsExProj_FIND_COMPONENTS = 'SimpleCxx[;]WithSubpackagesA'"
"TribitsExProj_LIBRARIES = 'pws_a[;]simplecxx'"
"TribitsExProj_TPL_INCLUDE_DIRS = '.*/examples/tpls/HeaderOnlyTpl'"
"TribitsExProj_PACKAGE_LIST = 'WithSubpackages[;]WithSubpackagesC[;]WithSubpackagesB[;]WithSubpackagesA[;]MixedLang[;]SimpleCxx'"
"TribitsExProj_TPL_LIST = 'HeaderOnlyTpl'"
"TribitsExProj_WithSubpackages_FOUND = ''"
"TribitsExProj_WithSubpackagesC_FOUND = ''"
"TribitsExProj_WithSubpackagesB_FOUND = ''"
"TribitsExProj_WithSubpackagesA_FOUND = 'TRUE'"
"TribitsExProj_MixedLang_FOUND = ''"
"TribitsExProj_SimpleCxx_FOUND = 'TRUE'"
"TribitsExProj_FOUND = 'TRUE'"
"-- Configuring done"
"-- Generating done"
ALWAYS_FAIL_ON_NONZERO_RETURN

# ToDo: Add another dummy project for the case where componets are
# required and assure that TribitsExProj_FOUND = 'FALSE'.

)
# NOTE: That above test tests two primary things:
#
Expand Down Expand Up @@ -2087,4 +2164,3 @@ GENERATE_AAO_TESTS(FALSE)
IF (${PROJECT_NAME}_CTEST_USE_NEW_AAO_FEATURES)
GENERATE_AAO_TESTS(TRUE)
ENDIF()

59 changes: 25 additions & 34 deletions tribits/core/installation/TribitsProjectConfigTemplate.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -107,32 +107,32 @@ ENDIF()
# the required components wasn't found.
SET(${PROJECT_NAME}_FOUND TRUE)
FOREACH(comp ${PDOLLAR}{COMPONENTS_LIST})
SET(
INCLUDE_FILE
${PDOLLAR}{CMAKE_CURRENT_LIST_DIR}/../${PDOLLAR}{comp}/${PDOLLAR}{comp}Config.cmake
)
IF (EXISTS ${PDOLLAR}{INCLUDE_FILE})
# Set ${PROJECT_NAME}_<component>_FOUND.
SET(${PROJECT_NAME}_${PDOLLAR}{comp}_FOUND TRUE)
# Include the package file.
INCLUDE(${PDOLLAR}{INCLUDE_FILE})
# Add variables to lists.
LIST(APPEND ${PROJECT_NAME}_INCLUDE_DIRS ${PDOLLAR}{${PDOLLAR}{comp}_INCLUDE_DIRS})
LIST(APPEND ${PROJECT_NAME}_LIBRARY_DIRS ${PDOLLAR}{${PDOLLAR}{comp}_LIBRARY_DIRS})
LIST(APPEND ${PROJECT_NAME}_LIBRARIES ${PDOLLAR}{${PDOLLAR}{comp}_LIBRARIES})
LIST(APPEND ${PROJECT_NAME}_TPL_INCLUDE_DIRS ${PDOLLAR}{${PDOLLAR}{comp}_TPL_INCLUDE_DIRS})
LIST(APPEND ${PROJECT_NAME}_TPL_LIBRARY_DIRS ${PDOLLAR}{${PDOLLAR}{comp}_TPL_LIBRARY_DIRS})
LIST(APPEND ${PROJECT_NAME}_TPL_LIBRARIES ${PDOLLAR}{${PDOLLAR}{comp}_TPL_LIBRARIES})
ELSE()
# Component not found.
MESSAGE(WARNING "Component \"${PDOLLAR}{comp}\" NOT found.")
# Set ${PROJECT_NAME}_<component>_FOUND to FALSE.
SET(${PROJECT_NAME}_${PDOLLAR}{comp}_FOUND FALSE)
# Set ${PROJECT_NAME}_FOUND to FALSE if component is not optional.
IF(${PROJECT_NAME}_FIND_REQUIRED_${PDOLLAR}{comp})
SET(${PROJECT_NAME}_FOUND FALSE)
ENDIF()
SET(
INCLUDE_FILE
${PDOLLAR}{CMAKE_CURRENT_LIST_DIR}/../${PDOLLAR}{comp}/${PDOLLAR}{comp}Config.cmake
)
IF (EXISTS ${PDOLLAR}{INCLUDE_FILE})
# Set ${PROJECT_NAME}_<component>_FOUND.
SET(${PROJECT_NAME}_${PDOLLAR}{comp}_FOUND TRUE)
# Include the package file.
INCLUDE(${PDOLLAR}{INCLUDE_FILE})
# Add variables to lists.
LIST(APPEND ${PROJECT_NAME}_INCLUDE_DIRS ${PDOLLAR}{${PDOLLAR}{comp}_INCLUDE_DIRS})
LIST(APPEND ${PROJECT_NAME}_LIBRARY_DIRS ${PDOLLAR}{${PDOLLAR}{comp}_LIBRARY_DIRS})
LIST(APPEND ${PROJECT_NAME}_LIBRARIES ${PDOLLAR}{${PDOLLAR}{comp}_LIBRARIES})
LIST(APPEND ${PROJECT_NAME}_TPL_INCLUDE_DIRS ${PDOLLAR}{${PDOLLAR}{comp}_TPL_INCLUDE_DIRS})
LIST(APPEND ${PROJECT_NAME}_TPL_LIBRARY_DIRS ${PDOLLAR}{${PDOLLAR}{comp}_TPL_LIBRARY_DIRS})
LIST(APPEND ${PROJECT_NAME}_TPL_LIBRARIES ${PDOLLAR}{${PDOLLAR}{comp}_TPL_LIBRARIES})
ELSE()
# Component not found.
MESSAGE(WARNING "Component \"${PDOLLAR}{comp}\" NOT found.")
# Set ${PROJECT_NAME}_<component>_FOUND to FALSE.
SET(${PROJECT_NAME}_${PDOLLAR}{comp}_FOUND FALSE)
# Set ${PROJECT_NAME}_FOUND to FALSE if component is not optional.
IF(${PROJECT_NAME}_FIND_REQUIRED_${PDOLLAR}{comp})
SET(${PROJECT_NAME}_FOUND FALSE)
ENDIF()
ENDIF()
ENDFOREACH()

# Resolve absolute paths and remove duplicate paths
Expand Down Expand Up @@ -197,12 +197,3 @@ SET(${PROJECT_NAME}_PACKAGE_LIST "${FULL_PACKAGE_SET}")

## The TPLs enabled for this project
SET(${PROJECT_NAME}_TPL_LIST "${FULL_TPL_SET}")

## Load configurations for enabled packages in components list
FOREACH(comp ${PDOLLAR}{COMPONENTS_LIST})
SET(
PACKAGE_CONFIG_INCLUDE_FILE
"${PDOLLAR}{CMAKE_CURRENT_LIST_DIR}/../${PDOLLAR}{comp}/${PDOLLAR}{comp}Config.cmake"
)
INCLUDE("${PDOLLAR}{PACKAGE_CONFIG_INCLUDE_FILE}")
ENDFOREACH()

0 comments on commit 1d1334b

Please sign in to comment.