Cloned SEACAS for EXODUS library with extra build files for internal package management.
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.
 
 
 
 
 
 

417 lines
15 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
# Standard TriBITS system includes
include(TribitsConstants)
include(TribitsProcessExtraRepositoriesList)
include(TribitsProcessPackagesAndDirsLists)
include(TribitsProcessTplsLists)
include(TribitsReadDepsFilesCreateDepsGraph)
# Standard TriBITS utilities includes
include(TimingUtils)
# @MACRO: tribits_read_all_project_deps_files_create_deps_graph()
#
# Usage::
#
# tribits_read_all_project_deps_files_create_deps_graph()
#
# Macro run at the top project-level scope that reads the lists of packages
# and TPLs and creates the packages dependency graph.
#
# On output, this creates all of the package lists and dependency
# data-structures described in the section `TriBITS System Data Structures`_
# and more specifically the sections:
#
# * `Lists of external and internal packages`_
# * `Variables defining the package dependencies graph`_
# * `TriBITS Package Top-Level Local Variables`_
# * `TriBITS Subpackage Top-Level Local Variables`_
# * `TriBITS Package Cache Variables`_
#
# See `Function call tree for constructing package dependency graph`_.
#
macro(tribits_read_all_project_deps_files_create_deps_graph)
tribits_config_code_start_timer(SET_UP_DEPENDENCIES_TIME_START_SECONDS)
tribits_read_defined_external_and_internal_toplevel_packages_lists()
tribits_read_deps_files_create_deps_graph()
# ${PROJECT_NAME}_DEFINED_PACKAGES
set(${PROJECT_NAME}_DEFINED_PACKAGES
${${PROJECT_NAME}_DEFINED_TPLS}
${${PROJECT_NAME}_DEFINED_INTERNAL_PACKAGES})
list(LENGTH ${PROJECT_NAME}_DEFINED_PACKAGES
${PROJECT_NAME}_NUM_DEFINED_PACKAGES)
tribits_config_code_stop_timer(SET_UP_DEPENDENCIES_TIME_START_SECONDS
"\nTotal time to read in all dependencies files and build dependencies graph")
endmacro()
# @MACRO: tribits_read_defined_external_and_internal_toplevel_packages_lists()
#
# Usage::
#
# tribits_read_defined_external_and_internal_toplevel_packages_lists()
#
# Macro run at the top project-level scope that reads in the contents of all
# of the `<repoDir>/TPLsList.cmake`_ and `<repoDir>/PackagesList.cmake`_ files
# to get the list of defined external packages (TPLs) and internal top-level
# (TriBITS) packages.
#
# On output, this produces the local variables:
#
# * `${PROJECT_NAME}_DEFINED_TPLS`_
# * `${PROJECT_NAME}_DEFINED_INTERNAL_TOPLEVEL_PACKAGES`_
# * `${PROJECT_NAME}_DEFINED_TOPLEVEL_PACKAGES`_
#
# and the length vars for these:
#
# * `${PROJECT_NAME}_NUM_DEFINED_TPLS`_
# * `${PROJECT_NAME}_NUM_DEFINED_INTERNAL_TOPLEVEL_PACKAGES`_
# * `${PROJECT_NAME}_NUM_DEFINED_TOPLEVEL_PACKAGES`_
#
# This includes the files:
#
# * `<repoDir>/TPLsList.cmake`_
# * `<repoDir>/PackagesList.cmake`_
#
# and calls the macros:
#
# * `tribits_process_tpls_lists()`_
# * `tribits_process_packages_and_dirs_lists()`_
#
# which set their variables.
#
# See `Function call tree for constructing package dependency graph`_
#
macro(tribits_read_defined_external_and_internal_toplevel_packages_lists)
tribits_set_all_extra_repositories()
# Set package list vars to empty
set(${PROJECT_NAME}_DEFINED_TPLS "")
set(${PROJECT_NAME}_DEFINED_INTERNAL_TOPLEVEL_PACKAGES "")
#
# A) Read list of external packages/TPLs and top-level internal packages
# from 'PRE' extra repos
#
set(READ_PRE_OR_POST_EXRAREPOS PRE)
tribits_read_extra_repositories_lists()
#
# B) Read list of external packages/TPLs and top-level internal packages
# from the native repos
#
foreach(NATIVE_REPO ${${PROJECT_NAME}_NATIVE_REPOSITORIES})
tribits_get_repo_name_dir(${NATIVE_REPO} NATIVE_REPO_NAME NATIVE_REPO_DIR)
#print_var(NATIVE_REPO_NAME)
#print_var(NATIVE_REPO_DIR)
# Need to make sure this gets set because logic in Dependencies.cmake files
# looks for the presents of this variable.
tribits_set_base_repo_dir(${PROJECT_SOURCE_DIR} ${NATIVE_REPO_DIR}
${NATIVE_REPO_NAME}_SOURCE_DIR)
#print_var(${NATIVE_REPO_NAME}_SOURCE_DIR)
if (NATIVE_REPO STREQUAL ".")
set(REPOSITORY_NAME ${PROJECT_NAME})
else()
set(REPOSITORY_NAME ${NATIVE_REPO_NAME})
endif()
#
# B.1) Define the lists of all ${NATIVE_REPO_NAME} native packages and TPLs
#
# B.1.a) Read in the list of TPLs for this repo
if (${NATIVE_REPO_NAME}_TPLS_FILE_OVERRIDE)
if (IS_ABSOLUTE "${${NATIVE_REPO_NAME}_TPLS_FILE_OVERRIDE}")
set(${NATIVE_REPO_NAME}_TPLS_FILE
"${${NATIVE_REPO_NAME}_TPLS_FILE_OVERRIDE}")
else()
set(${NATIVE_REPO_NAME}_TPLS_FILE
"${${NATIVE_REPO_NAME}_SOURCE_DIR}/${${NATIVE_REPO_NAME}_TPLS_FILE_OVERRIDE}")
endif()
else()
set(${NATIVE_REPO_NAME}_TPLS_FILE
"${${NATIVE_REPO_NAME}_SOURCE_DIR}/${${PROJECT_NAME}_TPLS_FILE_NAME}")
endif()
message("")
message("Reading list of native TPLs from ${${NATIVE_REPO_NAME}_TPLS_FILE}")
message("")
tribits_trace_file_processing(REPOSITORY INCLUDE
"${${NATIVE_REPO_NAME}_TPLS_FILE}")
include(${${NATIVE_REPO_NAME}_TPLS_FILE})
tribits_process_tpls_lists(${NATIVE_REPO_NAME} ${NATIVE_REPO_DIR})
# B.1.b) Read in list of packages for this repo
if (${NATIVE_REPO_NAME}_PACKAGES_FILE_OVERRIDE)
if (IS_ABSOLUTE "${${NATIVE_REPO_NAME}_PACKAGES_FILE_OVERRIDE}")
set(${NATIVE_REPO_NAME}_PACKAGES_FILE
"${${NATIVE_REPO_NAME}_PACKAGES_FILE_OVERRIDE}")
else()
set(${NATIVE_REPO_NAME}_PACKAGES_FILE
"${${NATIVE_REPO_NAME}_SOURCE_DIR}/${${NATIVE_REPO_NAME}_PACKAGES_FILE_OVERRIDE}")
endif()
else()
set(${NATIVE_REPO_NAME}_PACKAGES_FILE
"${${NATIVE_REPO_NAME}_SOURCE_DIR}/${${PROJECT_NAME}_PACKAGES_FILE_NAME}")
endif()
message("")
message("Reading list of native packages from ${${NATIVE_REPO_NAME}_PACKAGES_FILE}")
message("")
tribits_trace_file_processing(REPOSITORY INCLUDE
"${${NATIVE_REPO_NAME}_PACKAGES_FILE}")
include(${${NATIVE_REPO_NAME}_PACKAGES_FILE})
tribits_process_packages_and_dirs_lists(${NATIVE_REPO_NAME} ${NATIVE_REPO_DIR})
endforeach()
#
# C) Read list of external packages/TPLs and top-level internal packages
# from 'POST' extra repos
#
set(READ_PRE_OR_POST_EXRAREPOS POST)
tribits_read_extra_repositories_lists()
#
# D) Compute lengths and other combined quantities
#
# ${PROJECT_NAME}_NUM_DEFINED_TPLS
list(LENGTH ${PROJECT_NAME}_DEFINED_TPLS ${PROJECT_NAME}_NUM_DEFINED_TPLS)
# ${PROJECT_NAME}_DEFINED_TOPLEVEL_PACKAGES
set(${PROJECT_NAME}_DEFINED_TOPLEVEL_PACKAGES
${${PROJECT_NAME}_DEFINED_TPLS}
${${PROJECT_NAME}_DEFINED_INTERNAL_TOPLEVEL_PACKAGES})
list(LENGTH ${PROJECT_NAME}_DEFINED_TOPLEVEL_PACKAGES
${PROJECT_NAME}_NUM_DEFINED_TOPLEVEL_PACKAGES)
endmacro()
# @FUNCTION: tribits_write_xml_dependency_files_if_supported()
#
# Usage::
#
# tribits_write_xml_dependency_files_if_supported()
#
# Function that writes XML dependency files if support for that exists in this
# instance of TriBITs.
#
# See `Function call tree for constructing package dependency graph`_
#
function(tribits_write_xml_dependency_files_if_supported)
set(TRIBITS_PROJECT_CI_SUPPORT_DIR
"${${PROJECT_NAME}_TRIBITS_DIR}/${TRIBITS_CI_SUPPORT_DIR}")
set(TRIBITS_DUMP_XML_DEPS_MODULE
"${TRIBITS_PROJECT_CI_SUPPORT_DIR}/TribitsWriteXmlDependenciesFiles.cmake")
if (EXISTS "${TRIBITS_DUMP_XML_DEPS_MODULE}")
include(${TRIBITS_DUMP_XML_DEPS_MODULE})
tribits_write_xml_dependency_files()
endif()
endfunction()
# Macro that sets ${PROJECT_NAME}_ALL_REPOSITORIES from
# ${PROJECT_NAME}_PRE_REPOSITORIES and ${PROJECT_NAME}_EXTRA_REPOSITORIES if
# it is not already set. Also, it replaces ',' with ';' in the latter.
#
# This function is needed in use cases where extra repos are used where the
# extra repos are not read in through an ExtraRepositoriesList.cmake file and
# instead are directly passed in by the user.
#
macro(tribits_set_all_extra_repositories)
if ("${${PROJECT_NAME}_ALL_EXTRA_REPOSITORIES}" STREQUAL "")
# Allow list to be separated by ',' instead of just by ';'. This is needed
# by the unit test driver code
split("${${PROJECT_NAME}_PRE_REPOSITORIES}" ","
${PROJECT_NAME}_PRE_REPOSITORIES)
split("${${PROJECT_NAME}_EXTRA_REPOSITORIES}" ","
${PROJECT_NAME}_EXTRA_REPOSITORIES)
set(${PROJECT_NAME}_ALL_EXTRA_REPOSITORIES
${${PROJECT_NAME}_PRE_REPOSITORIES} ${${PROJECT_NAME}_EXTRA_REPOSITORIES})
endif()
endmacro()
# Macro that processes the list of package and TPLs for the set of 'PRE' or
# 'POST' extra repos.
#
macro(tribits_read_extra_repositories_lists)
list(LENGTH ${PROJECT_NAME}_PRE_REPOSITORIES PRE_EXTRAREPOS_LEN)
list(LENGTH ${PROJECT_NAME}_EXTRA_REPOSITORIES POST_EXTRAREPOS_LEN)
math(EXPR ALL_EXTRAREPOS_LEN "${PRE_EXTRAREPOS_LEN} + ${POST_EXTRAREPOS_LEN}")
# See if processing 'PRE' or 'POST' extra repos
if (READ_PRE_OR_POST_EXRAREPOS STREQUAL "PRE")
set(EXTRAREPO_IDX_START 0)
set(EXTRAREPO_IDX_END ${PRE_EXTRAREPOS_LEN})
elseif (READ_PRE_OR_POST_EXRAREPOS STREQUAL "POST")
set(EXTRAREPO_IDX_START ${PRE_EXTRAREPOS_LEN})
set(EXTRAREPO_IDX_END ${ALL_EXTRAREPOS_LEN})
else()
message(FATAL_ERROR "Invalid value for READ_PRE_OR_POST_EXRAREPOS='${READ_PRE_OR_POST_EXRAREPOS}' ")
endif()
# NOTE: For some reason, we can't pass this argument to the function and
# have it read. Instead, we have to pass it a local variable. I will never
# understand CMake.
set(EXTRAREPO_IDX ${EXTRAREPO_IDX_START})
while(EXTRAREPO_IDX LESS EXTRAREPO_IDX_END)
list(GET ${PROJECT_NAME}_ALL_EXTRA_REPOSITORIES ${EXTRAREPO_IDX} EXTRA_REPO )
set(REPOSITORY_NAME ${EXTRA_REPO})
#print_var(EXTRA_REPO)
#print_var(EXTRAREPO_IDX)
#print_var(${PROJECT_NAME}_ALL_EXTRA_REPOSITORIES_HASPKGS)
# Need to make sure this gets set because logic in Dependencies.cmake files
# looks for the presents of this variable.
set(${EXTRA_REPO}_SOURCE_DIR "${PROJECT_SOURCE_DIR}/${EXTRA_REPO}")
if (${PROJECT_NAME}_VERBOSE_CONFIGURE)
print_var(${EXTRA_REPO}_SOURCE_DIR)
endif()
# ToDo: TriBITS:73: Get ${EXTRA_REPO}_SOURCE_DIR from
# ${PROJECT_NAME}_ALL_EXTRA_REPOSITORIES_DIR when it exists.
set(EXTRAREPO_PACKSTAT "")
if (${PROJECT_NAME}_ALL_EXTRA_REPOSITORIES_HASPKGS)
list(GET ${PROJECT_NAME}_ALL_EXTRA_REPOSITORIES_HASPKGS ${EXTRAREPO_IDX}
EXTRAREPO_PACKSTAT )
endif()
if (EXTRAREPO_PACKSTAT STREQUAL NOPACKAGES)
message("")
message("Skipping reading packages and TPLs for ${READ_PRE_OR_POST_EXRAREPOS} extra repo ${EXTRA_REPO} because marked NOPACKAGES ... ")
message("")
# ToDo: TriBITS:73: Don't print the above message by default. It is
# just clutter.
else()
# Read in the add-on TPLs from the extra repo
set(${EXTRA_REPO}_TPLS_FILE
"${${EXTRA_REPO}_SOURCE_DIR}/${${PROJECT_NAME}_EXTRA_TPLS_FILE_NAME}")
print_var(${EXTRA_REPO}_SOURCE_DIR)
print_var(${PROJECT_NAME}_EXTRA_TPLS_FILE_NAME)
print_var(${EXTRA_REPO}_TPLS_FILE)
message("")
message("Reading list of ${READ_PRE_OR_POST_EXRAREPOS} extra TPLs from ${${EXTRA_REPO}_TPLS_FILE} ... ")
message("")
if (NOT EXISTS "${${EXTRA_REPO}_TPLS_FILE}")
if (${PROJECT_NAME}_IGNORE_MISSING_EXTRA_REPOSITORIES)
message("-- "
"NOTE: Ignoring missing ${READ_PRE_OR_POST_EXRAREPOS} extra repo '${EXTRA_REPO}' TPLs list file '${${EXTRA_REPO}_TPLS_FILE}' on request!" )
else()
message( SEND_ERROR
"ERROR: Skipping missing ${READ_PRE_OR_POST_EXRAREPOS} extra repo '${EXTRA_REPO}' TPLs list file '${${EXTRA_REPO}_TPLS_FILE}'!")
endif()
else()
tribits_trace_file_processing(REPOSITORY INCLUDE "${${EXTRA_REPO}_TPLS_FILE}")
include("${${EXTRA_REPO}_TPLS_FILE}")
set(APPEND_TO_TPLS_LIST TRUE)
tribits_process_tpls_lists(${EXTRA_REPO} ${EXTRA_REPO})
endif()
# Read in the add-on packages from the extra repo
#print_var(${EXTRA_REPO}_PACKAGES_LIST_FILE)
if (${EXTRA_REPO}_PACKAGES_LIST_FILE)
set(EXTRAREPO_PACKAGES_FILE
"${PROJECT_SOURCE_DIR}/${${EXTRA_REPO}_PACKAGES_LIST_FILE}")
else()
set(EXTRAREPO_PACKAGES_FILE
"${${EXTRA_REPO}_SOURCE_DIR}/${${PROJECT_NAME}_EXTRA_PACKAGES_FILE_NAME}")
endif()
message("")
message("Reading list of ${READ_PRE_OR_POST_EXRAREPOS} extra packages from ${EXTRAREPO_PACKAGES_FILE} ... ")
message("")
if (NOT EXISTS "${EXTRAREPO_PACKAGES_FILE}")
if (${PROJECT_NAME}_IGNORE_MISSING_EXTRA_REPOSITORIES)
message("-- "
"NOTE: Ignoring missing ${READ_PRE_OR_POST_EXRAREPOS} extra repo '${EXTRA_REPO}' packages list file '${EXTRAREPO_PACKAGES_FILE}' on request!")
else()
message( SEND_ERROR
"ERROR: Skipping missing ${READ_PRE_OR_POST_EXRAREPOS} extra repo '${EXTRA_REPO}' packages list file '${EXTRAREPO_PACKAGES_FILE}'!")
# ToDo: TriBITS:73: Change to FATAL_ERROR to abort early
endif()
else()
tribits_trace_file_processing(REPOSITORY INCLUDE "${EXTRAREPO_PACKAGES_FILE}")
include("${EXTRAREPO_PACKAGES_FILE}")
set(APPEND_TO_PACKAGES_LIST TRUE)
tribits_process_packages_and_dirs_lists(${EXTRA_REPO} ${EXTRA_REPO})
endif()
endif()
math(EXPR EXTRAREPO_IDX "${EXTRAREPO_IDX}+1")
endwhile()
endmacro()