TriBITS Detailed Reference Documentation ======================================== The following subsections contain detailed reference documentation for the various TriBITS variables, functions, and macros that are used by TriBITS projects that `TriBITS Project Developers`_ need to know about. Variables, functions and macros that are used only internally in TriBITS are generally not documented here (see the TriBITS ``*.cmake`` source files). TriBITS Global Project Settings ------------------------------- TriBITS defines a number of global project-level settings that can be set by the user and can have their default determined by each individual TriBITS project. If a given TriBITS project does not define its own default, a reasonable default is set by the TriBITS system automatically. These options are defined and are set, for the most part, in the internal TriBITS function ``tribits_define_global_options_and_define_extra_repos()`` in the TriBITS CMake code file ``TribitsGlobalMacros.cmake`` which gets called inside of the `tribits_project()`_ macro. That function and that file are the definitive source the options that a TriBITS project takes and what the default values are but we strive to document them here as well. Many of these global options (i.e. cache variables) such as ``${PROJECT_NAME}_`` allow the project to define a default by setting a local variable ``${PROJECT_NAME}__DEFAULT`` as:: set(${PROJECT_NAME}__DEFAULT ) either in its top-level ``CMakeLists.txt`` file or in its ``ProjectName.cmake`` file (depends on what variable it is as to where it should be set). If ``${PROJECT_NAME}__DEFAULT`` is not set by the project, then TriBITS provides a reasonable default value. The TriBITS code that uses these defaults for this looks like:: if ("${${PROJECT_NAME}__DEFAULT}" STREQUAL "") set(${PROJECT_NAME}__DEFAULT ) endif() advanced_set( ${PROJECT_NAME}_ ${PROJECT_NAME}__DEFAULT} CACHE BOOL "[documentation]." ) where ```` is an option name, for example like ``TEST_CATEGORIES``, and ```` is the default set by TriBITS if the project does not define a default. In this way, if the project sets the variable ``${PROJECT_NAME}__DEFAULT`` before this code executes, then ``${${PROJECT_NAME}__DEFAULT}`` will be used as the default for the cache variable ``${PROJECT_NAME}_`` which, of course, can be overridden by the user when calling ``cmake`` in a number of ways. Most of these global options that can be overridden externally by setting the cache variable ``${PROJECT_NAME}_`` should be documented in the `Project-Specific Build Reference`_ document. A generic version of this document is found in `TribitsBuildReference`_. Some of the more unusual options that might only be of interest to developers mentioned below may not be documented in `TribitsBuildReference`_. The global project-level TriBITS options for which defaults can be provided by a given TriBITS project are: * `${PROJECT_NAME}_ASSERT_CORRECT_TRIBITS_USAGE`_ * `${PROJECT_NAME}_ASSERT_DEFINED_DEPENDENCIES`_ * `${PROJECT_NAME}_C_Standard`_ * `${PROJECT_NAME}_CHECK_FOR_UNPARSED_ARGUMENTS`_ * `${PROJECT_NAME}_CONFIGURE_OPTIONS_FILE_APPEND`_ * `${PROJECT_NAME}_CPACK_SOURCE_GENERATOR`_ * `${PROJECT_NAME}_CTEST_DO_ALL_AT_ONCE`_ * `${PROJECT_NAME}_DISABLE_ENABLED_FORWARD_DEP_PACKAGES`_ * `${PROJECT_NAME}_ELEVATE_ST_TO_PT`_ * `${PROJECT_NAME}_ENABLE_CPACK_PACKAGING`_ * `${PROJECT_NAME}_ENABLE_CXX`_ * `${PROJECT_NAME}_ENABLE_C`_ * `${PROJECT_NAME}_ENABLE_DEVELOPMENT_MODE`_ * `${PROJECT_NAME}_ENABLE_Fortran`_ * `${PROJECT_NAME}_ENABLE_INSTALL_CMAKE_CONFIG_FILES`_ * `${PROJECT_NAME}_ENABLE_SECONDARY_TESTED_CODE`_ * `${PROJECT_NAME}_EXCLUDE_DISABLED_SUBPACKAGES_FROM_DISTRIBUTION`_ * `${PROJECT_NAME}_GENERATE_EXPORT_FILE_DEPENDENCIES`_ * `${PROJECT_NAME}_GENERATE_VERSION_DATE_FILES`_ * `${PROJECT_NAME}_GENERATE_REPO_VERSION_FILE`_ * `${PROJECT_NAME}_IMPORTED_NO_SYSTEM`_ * `${PROJECT_NAME}_INSTALL_LIBRARIES_AND_HEADERS`_ * `${PROJECT_NAME}_MAKE_INSTALL_GROUP_READABLE`_ * `${PROJECT_NAME}_MAKE_INSTALL_GROUP_WRITABLE`_ * `${PROJECT_NAME}_MAKE_INSTALL_WORLD_READABLE`_ * `${PROJECT_NAME}_MUST_FIND_ALL_TPL_LIBS`_ * `${PROJECT_NAME}_REQUIRES_PYTHON`_ * `${PROJECT_NAME}_SET_INSTALL_RPATH`_ * `${PROJECT_NAME}_SHOW_TEST_START_END_DATE_TIME`_ * `${PROJECT_NAME}_SKIP_INSTALL_PROJECT_CMAKE_CONFIG_FILES`_ * `${PROJECT_NAME}_TEST_CATEGORIES`_ * `${PROJECT_NAME}_TPL_SYSTEM_INCLUDE_DIRS`_ * `${PROJECT_NAME}_TRACE_ADD_TEST`_ * `${PROJECT_NAME}_USE_GNUINSTALLDIRS`_ * `${PROJECT_NAME}_USES_PYTHON`_ * `DART_TESTING_TIMEOUT`_ * `CMAKE_INSTALL_RPATH_USE_LINK_PATH`_ * `MPI_EXEC_MAX_NUMPROCS`_ * `PythonInterp_FIND_VERSION`_ * `TRIBITS_HANDLE_TRIBITS_DEPRECATED_CODE`_ These options are described below. .. _${PROJECT_NAME}_ASSERT_CORRECT_TRIBITS_USAGE: **${PROJECT_NAME}_ASSERT_CORRECT_TRIBITS_USAGE** The CMake cache variable ``${PROJECT_NAME}_ASSERT_CORRECT_TRIBITS_USAGE`` is used to define how some invalid TriBITS usage checks are handled. The valid values include 'FATAL_ERROR', 'SEND_ERROR', 'WARNING', and 'IGNORE'. The default value is 'FATAL_ERROR' for a project when ``${PROJECT_NAME}_ENABLE_DEVELOPMENT_MODE=ON``, which is best for development mode for a project that currently has no invalid usage patterns. The default is 'IGNORE' when ``${PROJECT_NAME}_ENABLE_DEVELOPMENT_MODE=OFF``. But a project with some existing invalid usage patterns might want to set, for example, a default of 'WARNING' in order to allow for a smooth upgrade of TriBITS. To do so, set:: set(${PROJECT_NAME}_ASSERT_CORRECT_TRIBITS_USAGE_DEFAULT WARNING) in the project's base `/ProjectName.cmake`_ file. .. _${PROJECT_NAME}_ASSERT_DEFINED_DEPENDENCIES: **${PROJECT_NAME}_ASSERT_DEFINED_DEPENDENCIES** To set ``${PROJECT_NAME}_ASSERT_DEFINED_DEPENDENCIES`` a different default, set:: set(${PROJECT_NAME}_ASSERT_DEFINED_DEPENDENCIES_DEFAULT ) in the project's base `/ProjectName.cmake`_ file, where ```` can be ``FATAL_ERROR``, ``SEND_ERROR``, ``WARNING``, ``NOTICE`` or ``IGNORE`` Otherwise, the default is ``WARNING`` when ``${PROJECT_NAME}_ENABLE_DEVELOPMENT_MODE`` is ``ON`` and if ``IGNORE`` if ``${PROJECT_NAME}_ENABLE_DEVELOPMENT_MODE`` is ``OFF``. .. _${PROJECT_NAME}_C_Standard: **${PROJECT_NAME}_C_Standard** The variable ``${PROJECT_NAME}_C_Standard`` is used define the C standard pass to the compiler in ``--std=`` for GCC builds of the project. TriBITS sets the default as ``c99`` but the project can set a new default in the project's base `/CMakeLists.txt`_ file with, for example:: set(${PROJECT_NAME}_C_Standard_DEFAULT c11) .. _${PROJECT_NAME}_CHECK_FOR_UNPARSED_ARGUMENTS: **${PROJECT_NAME}_CHECK_FOR_UNPARSED_ARGUMENTS** The variable ``${PROJECT_NAME}_CHECK_FOR_UNPARSED_ARGUMENTS`` determines how unparsed and otherwise ignored arguments are handled in TriBITS functions that are called by the client TriBITS projects. These are arguments that are left over from parsing input options to functions and macros that take both positional arguments and keyword arguments/options handled with the ``cmake_parse_arguments()`` function. For example, for the a TriBITS function declared like:: tribits_copy_files_to_binary_dir( [SOURCE_FILES ...] [SOURCE_DIR ] ... ) the arguments ``SOURCE_FILES ...`` and those that follow are parsed by the ``cmake_parse_arguments()`` function while the argument ```` is a positional argument. The problem is that any arguments passed between the first ```` argument and the specified keyword arguments like ``SOURCE_FILES`` and ``SOURCE_DIR`` are returned as unparsed arguments and are basically ignored (which is what happened in earlier versions of TriBITS). For example, calling the function as:: tribits_copy_files_to_binary_dir( FooTestCopyFiles ThisArgumentIsNotParsedAndIsIgnored SOURCE_FILES file1.cpp file2.cpp ... ... ) would result in the unparsed argument ``ThisArgumentIsNotParsedAndIsIgnored``. The value of ``${PROJECT_NAME}_CHECK_FOR_UNPARSED_ARGUMENTS`` determines how that ignored argument is handled. If the value is ``WARNING``, then it will just result in a ``message(WARNING ...)`` command that states the warning but configure is allowed to be completed. This would be the right value to allow an old TriBITS project to keep configuring until the warnings can be cleaned up. If the value is ``SEND_ERROR``, then ``message(SEND_ERROR ...)`` is called. This will result in the configure failing but will allow configure to continue until the end (or a ``FATAL_ERROR`` is raised). This would be the right value when trying to upgrade a TriBITS project where you wanted to see all of the warnings when upgrading TriBITS (so you could fix them all in one shot). Finally, the value of ``FATAL_ERROR`` will result in ``message(FATAL_ERROR ...)`` being called which will halt configure right away. This is the best value when developing on a TriBITS project that is already clean but you want to catch new developer-inserted errors right away. The default value for ``${PROJECT_NAME}_CHECK_FOR_UNPARSED_ARGUMENTS`` is ``WARNING``, so that it will be backward compatible for TriBITS projects that might have previously undetected unparased and therefore ignored argument . However, a project can change the default by setting, for example:: set(${PROJECT_NAME}_CHECK_FOR_UNPARSED_ARGUMENTS_DEFAULT FATAL_ERROR) in the `/ProjectName.cmake`_ file. The user of a TriBITS project should not be able to trigger this unparsed arguments condition so this variable is not documented in the `TriBITS Build Reference`_. But it is still a CMake cache var that is documented in the CMakeCache.txt file and can be set by the user or developer if desired. .. _${PROJECT_NAME}_CONFIGURE_OPTIONS_FILE_APPEND: **${PROJECT_NAME}_CONFIGURE_OPTIONS_FILE_APPEND** The variable ``${PROJECT_NAME}_CONFIGURE_OPTIONS_FILE_APPEND`` is used to define the absolute path to a file (or a list of files) that should be included after the files listed in ``${PROJECT_NAME}_CONFIGURE_OPTIONS_FILE``. This variable can be used by the TriBITS project to define, for example, a standard set of development environments in the base `/CMakeLists.txt`_ file with:: set(${PROJECT_NAME}_CONFIGURE_OPTIONS_FILE_APPEND_DEFAULT "${CMAKE_CURRENT_LIST_DIR}/cmake/StdDevEnvs.cmake") **before** the `tribits_project()`_ command. By including this file(s) after the file(s) listed in ``${PROJECT_NAME}_CONFIGURE_OPTIONS_FILE``, the user can override the variables set in this appended file(s). But it is important that these variables best set after the users options have been set but before the Package and TPL dependency analysis is done (because this might enable or disable some TPLs). .. _${PROJECT_NAME}_CPACK_SOURCE_GENERATOR: **${PROJECT_NAME}_CPACK_SOURCE_GENERATOR** The variable ``${PROJECT_NAME}_CPACK_SOURCE_GENERATOR`` determines the CPack source generation types that are created when the ``package_source`` target is run. The TriBITS default is set to ``TGZ``. However, this default can be overridden by setting, for example:: set(${PROJECT_NAME}_CPACK_SOURCE_GENERATOR_DEFAULT "TGZ;TBZ2") This variable should generally be set in the file:: /cmake/CallbackDefineProjectPackaging.cmake instead of in the base-level ``CMakeLists.txt`` file so that it goes along with rest of the project-specific CPack packaging options. .. _${PROJECT_NAME}_CTEST_DO_ALL_AT_ONCE: **${PROJECT_NAME}_CTEST_DO_ALL_AT_ONCE** The variable ``${PROJECT_NAME}_CTEST_DO_ALL_AT_ONCE`` determines if the CTest driver scripts using `tribits_ctest_driver()`_ configure, build, test and submit results to CDash all-at-once for all of the packages being tested or if instead is done package-by-package. Currently, the default is set to ``FALSE`` for the package-by-package mode (for historical reasons) but the default can be set to ``TRUE`` by setting: set(${PROJECT_NAME}_CTEST_DO_ALL_AT_ONCE_DEFAULT "TRUE") in the project's `/ProjectName.cmake`_ file. (This default must be changed in the ``/ProjectName.cmake`` file and **NOT** the `/CMakeLists.txt`_ file because the latter is not directly processed in CTest -S driver scripts using ``tribits_ctest_driver()``.) In general, a project should change the default to ``TRUE`` when using a newer CDash installation with CDash versions 3.0+ that can accommodate the results coming from ctest -S and display them package-by-package very nicely. Otherwise, most projects are better off with package-by-package mode since it results in nicer display on CDash for older CDash versions. .. _${PROJECT_NAME}_DISABLE_ENABLED_FORWARD_DEP_PACKAGES: **${PROJECT_NAME}_DISABLE_ENABLED_FORWARD_DEP_PACKAGES** If `${PROJECT_NAME}_DISABLE_ENABLED_FORWARD_DEP_PACKAGES=ON`_ (the TriBITS default value), then any explicitly enabled packages that have disabled `upstream`_ required packages or TPLs will be disabled. If `${PROJECT_NAME}_DISABLE_ENABLED_FORWARD_DEP_PACKAGES=OFF`_, then an configure error will occur. For more details also see `TribitsBuildReference`_ and `Disables trump enables where there is a conflict`_. A project can define a different default value by setting:: set(${PROJECT_NAME}_DISABLE_ENABLED_FORWARD_DEP_PACKAGES_DEFAULT FALSE) .. _${PROJECT_NAME}_ELEVATE_ST_TO_PT: **${PROJECT_NAME}_ELEVATE_ST_TO_PT** If ``${PROJECT_NAME}_ELEVATE_ST_TO_PT`` is set to ``ON``, then all ``ST`` packages will be elevated to ``PT`` packages. The TriBITS default is obviously ``OFF``. The default can be changed by setting:: set(${PROJECT_NAME}_ELEVATE_ST_TO_PT_DEFAULT ON) There are projects, especially meta-projects, where the distinction between ``PT`` and ``ST`` code is not helpful or the assignment of ``PT`` and ``ST`` packages in a repository is not appropriate with respect to the outer meta-project. An example project like this CASL VERA. Changing the default to ``ON`` allows any and packages to be considered in pre-push testing. .. _${PROJECT_NAME}_ENABLE_CPACK_PACKAGING: **${PROJECT_NAME}_ENABLE_CPACK_PACKAGING** If ``${PROJECT_NAME}_ENABLE_CPACK_PACKAGING`` is ``ON``, then CPack support is enabled and some TriBITS code is run that is needed to set up data-structures that are used by the built-in CMake target ``package_source``. The TriBITS default is ``OFF`` with the idea that the average developer or user will not be wanting to create source distributions with CPack. However, this default can be changed by setting:: set(${PROJECT_NAME}_ENABLE_CPACK_PACKAGING_DEFAULT ON) .. _${PROJECT_NAME}_ENABLE_CXX: **${PROJECT_NAME}_ENABLE_CXX** If ``${PROJECT_NAME}_ENABLE_CXX`` is ``ON``, then C++ language support for the project will be enabled and the C++ compiler must be found. By default, TriBITS sets this to ``ON`` for all systems. A project never requires C++ can set this to off by default by setting: set(${PROJECT_NAME}_ENABLE_CXX_DEFAULT FALSE) .. _${PROJECT_NAME}_ENABLE_C: **${PROJECT_NAME}_ENABLE_C** If ``${PROJECT_NAME}_ENABLE_C`` is ``ON``, then C language support for the project will be enabled and the C compiler must be found. By default, TriBITS sets this to ``ON`` for all systems. A project never requires C can set this to off by default by setting: set(${PROJECT_NAME}_ENABLE_C_DEFAULT FALSE) If a project does not have any native C code a good default would be:: set(${PROJECT_NAME}_ENABLE_C_DEFAULT FALSE) NOTE: It is usually not a good idea to always force off C, or any compiler, because extra repositories and packages might be added by someone that might require the compiler and we don't want to unnecessarily limit the generality of a given TriBITS build. Setting the default for all platforms should be sufficient. .. _${PROJECT_NAME}_ENABLE_DEVELOPMENT_MODE: .. _${PROJECT_NAME}_ENABLE_DEVELOPMENT_MODE_DEFAULT: **${PROJECT_NAME}_ENABLE_DEVELOPMENT_MODE** The variable ``${PROJECT_NAME}_ENABLE_DEVELOPMENT_MODE`` switches the TriBITS project from development mode to release mode. The default for this variable ``${PROJECT_NAME}_ENABLE_DEVELOPMENT_MODE_DEFAULT`` should be set in the project's `/Version.cmake`_ file and switched from ``ON`` to ``OFF`` when creating a release (see `Project and Repository Versioning and Release Mode`_). When ``${PROJECT_NAME}_ENABLE_DEVELOPMENT_MODE`` is ``ON``, several other variables are given defaults appropriate for development mode. For example, ``${PROJECT_NAME}_ASSERT_DEFINED_DEPENDENCIES`` is set to ``FATAL_ERROR`` by default in development mode but is set to ``IGNORE`` by default in release mode. In addition, strong compiler warnings are enabled by default in development mode but are disabled by default in release mode. This variable also affects the behavior of `tribits_set_st_for_dev_mode()`_. .. _${PROJECT_NAME}_ENABLE_Fortran: **${PROJECT_NAME}_ENABLE_Fortran** If ``${PROJECT_NAME}_ENABLE_Fortran`` is ``ON``, then Fortran support for the project will be enabled and the Fortran compiler(s) must be found. By default, TriBITS sets this to ``ON`` . If a project does not have any native Fortran code a good default would be:: set(${PROJECT_NAME}_ENABLE_Fortran_DEFAULT OFF) This default can be set in `/ProjectName.cmake`_ or `/CMakeLists.txt`_. On WIN32 systems, the default for ``${PROJECT_NAME}_ENABLE_Fortran_DEFAULT`` is set to ``OFF`` since it can be difficult to get a Fortran compiler for native Windows. Given that a native Fortran compiler is not supported by default on Windows and on most Mac OSX systems, projects that have optional Fortran code may decide to set the default depending on the platform by setting, for example:: if ( (WIN32 AND NOT CYGWIN) OR (CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin") ) message(STATUS "Warning: Setting ${PROJECT_NAME}_ENABLE_Fortran=OFF by default" " because this is Windows (not cygwin) and we assume to not have Fortran!") set(${PROJECT_NAME}_ENABLE_Fortran_DEFAULT OFF) else() set(${PROJECT_NAME}_ENABLE_Fortran_DEFAULT ON) endif() NOTE: It is usually not a good idea to always force off Fortran, or any compiler, because extra repositories and packages might be added by someone that might require the compiler and we don't want to unnecessarily limit the generality of a given TriBITS build. Setting the default for all platforms should be sufficient. .. _${PROJECT_NAME}_ENABLE_INSTALL_CMAKE_CONFIG_FILES: **${PROJECT_NAME}_ENABLE_INSTALL_CMAKE_CONFIG_FILES** If ``${PROJECT_NAME}_ENABLE_INSTALL_CMAKE_CONFIG_FILES`` is set to ``ON``, then ``Config.cmake`` files are created at configure time in the build tree and installed into the install tree. These files are used by external CMake projects to pull in the list of compilers, compiler options, include directories and libraries. The TriBITS default is ``OFF`` but a project can change the default by setting, for example:: set(${PROJECT_NAME}_ENABLE_INSTALL_CMAKE_CONFIG_FILES_DEFAULT ON) A project would want to leave off the creation and installation of ``Config.cmake`` files if it was only installing and providing executables (see `${PROJECT_NAME}_INSTALL_LIBRARIES_AND_HEADERS`_). However, if it is wanting to provide libraries for other projects to use, then it should turn on the default generation of these files. .. _${PROJECT_NAME}_ENABLE_SECONDARY_TESTED_CODE: **${PROJECT_NAME}_ENABLE_SECONDARY_TESTED_CODE** If ``${PROJECT_NAME}_ENABLE_SECONDARY_TESTED_CODE`` is ``ON``, then packages and subpackages marked as ``ST`` in the `/PackagesList.cmake`_ file will be implicitly enabled along with the ``PT`` packages. Additional code and tests may also be enabled using this option. The TriBITS default is ``OFF`` but this can be changed by setting:: set(${PROJECT_NAME}_ENABLE_SECONDARY_TESTED_CODE_DEFAULT ON) in the `/ProjectName.cmake`_ file. .. _${PROJECT_NAME}_EXCLUDE_DISABLED_SUBPACKAGES_FROM_DISTRIBUTION: **${PROJECT_NAME}_EXCLUDE_DISABLED_SUBPACKAGES_FROM_DISTRIBUTION** If ``${PROJECT_NAME}_EXCLUDE_DISABLED_SUBPACKAGES_FROM_DISTRIBUTION`` is ``TRUE``, then the directories for subpackages that are not enabled are left out of the source tarball. This reduces the size of the tarball as much as possible but does require that the TriBITS packages and subpackages be properly set up to allow disabled subpackages from being excluded. The TriBITS default is ``TRUE`` but this can be changed by setting:: set(${PROJECT_NAME}_EXCLUDE_DISABLED_SUBPACKAGES_FROM_DISTRIBUTION_DEFAULT FALSE) .. _${PROJECT_NAME}_GENERATE_EXPORT_FILE_DEPENDENCIES: **${PROJECT_NAME}_GENERATE_EXPORT_FILE_DEPENDENCIES** If ``${PROJECT_NAME}_GENERATE_EXPORT_FILE_DEPENDENCIES`` is ``ON``, then the data-structures needed to generate ``Config.cmake`` files are created. These data structures are also needed in order to generate export makefiles on demand using the function `tribits_write_flexible_package_client_export_files()`_. The default in TriBITS is to turn this ``ON`` automatically by default if ``${PROJECT_NAME}_ENABLE_INSTALL_CMAKE_CONFIG_FILES`` is ``ON``. Else, by default, TriBITS sets this to ``OFF``. The only reason for the project to override the default is to set it to ``ON`` as with:: set(${PROJECT_NAME}_GENERATE_EXPORT_FILE_DEPENDENCIES_DEFAULT ON) is so that the necessary data-structures are generated in order to use the function `tribits_write_flexible_package_client_export_files()`_. .. _${PROJECT_NAME}_GENERATE_VERSION_DATE_FILES: **${PROJECT_NAME}_GENERATE_VERSION_DATE_FILES** If ``${PROJECT_NAME}_GENERATE_VERSION_DATE_FILES`` is ``ON``, then the files ``VersionDate.cmake`` and ``_version_date.h`` will get generated and the generated file ``_version_date.h`` will get installed for each TriBITS version-controlled repository when the local directories are git repositories. The default is ``OFF`` but the project can change that by setting:: set(${PROJECT_NAME}_GENERATE_VERSION_DATE_FILES ON) in the `/ProjectName.cmake`_ file. .. _${PROJECT_NAME}_GENERATE_REPO_VERSION_FILE: **${PROJECT_NAME}_GENERATE_REPO_VERSION_FILE** If ``${PROJECT_NAME}_GENERATE_REPO_VERSION_FILE`` is ``ON``, then the file ``RepoVersion.txt`` will get generated as a byproduct of configuring with CMake. See `Multi-Repository Support`_ and `_GENERATE_REPO_VERSION_FILE`_. The default is ``OFF`` but the project can change that by setting:: set(${PROJECT_NAME}_GENERATE_REPO_VERSION_FILE_DEFAULT ON) in the `/ProjectName.cmake`_ file. Note that if a ``git`` exectauble cannot be found at configure time, then the default ``${PROJECT_NAME}_GENERATE_REPO_VERSION_FILE_DEFAULT`` will be overridden to ``OFF``. But if the user sets ``${PROJECT_NAME}_GENERATE_REPO_VERSION_FILE=ON`` in the cache and ``git`` can't be found, then an configure-time error will occur. .. _${PROJECT_NAME}_IMPORTED_NO_SYSTEM: **${PROJECT_NAME}_IMPORTED_NO_SYSTEM** By default, include directories from IMPORTED library targets from the TriBITS project's installed ``Config.cmake`` files will be considered ``SYSTEM`` headers and therefore be included on the compile lines of downstream CMake projects with ``-isystem`` with most compilers. However, if ``${PROJECT_NAME}_IMPORTED_NO_SYSTEM`` is set to ``ON`` (only supported for CMake versions 3.23 or greater), then all of the IMPORTED library targets exported into the set of installed ``Config.cmake`` files will have the ``IMPORTED_NO_SYSTEM`` property set. This will cause downstream customer CMake projects to apply the include directories from these IMPORTED library targets as non-system include directories. On most compilers, that means that the include directories will be listed on the compile lines with ``-I`` instead of with ``-isystem``. (See more details in the TriBITS Build Reference for ``_IMPORTED_NO_SYSTEM``.) The default value set by TriBITS itself is ``OFF`` but a TriBITS project can change the default value to ``ON`` by adding:: if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.23) set(${PROJECT_NAME}_IMPORTED_NO_SYSTEM_DEFAULT ON) endif() in the `/ProjectName.cmake`_ file. (NOTE: The above ``if()`` statement ensures that a configure error will not occur if a version of CMake less than 3.23 is used. But if the TriBITS project minimum CMake version is 3.23 or greater, then the above ``if()`` statement guard can be removed.) .. _${PROJECT_NAME}_INSTALL_LIBRARIES_AND_HEADERS: **${PROJECT_NAME}_INSTALL_LIBRARIES_AND_HEADERS** If ``${PROJECT_NAME}_INSTALL_LIBRARIES_AND_HEADERS`` is set to ``ON``, then any defined libraries or header files that are listed in calls to `tribits_add_library()`_ or `tribits_install_headers()`_ will be installed (unless options are passed into `tribits_add_library()`_ that disable installs). If set to ``OFF``, then headers and libraries will *not* be installed by default and only ``INSTALLABLE`` executables added with `tribits_add_executable()`_ will be installed. However, as described in `TribitsBuildReference`_, shared libraries will always be installed if enabled since they are needed by the installed executables. For a TriBITS project that is primarily delivering libraries (e.g. Trilinos), then it makes sense to leave the TriBITS default which is ``ON`` or explicitly set:: set(${PROJECT_NAME}_INSTALL_LIBRARIES_AND_HEADERS_DEFAULT ON) For a TriBITS project that is primarily delivering executables (e.g. VERA), then it makes sense to set the default to:: set(${PROJECT_NAME}_INSTALL_LIBRARIES_AND_HEADERS_DEFAULT OFF) .. _${PROJECT_NAME}_MAKE_INSTALL_GROUP_READABLE: .. _${PROJECT_NAME}_MAKE_INSTALL_GROUP_WRITABLE: .. _${PROJECT_NAME}_MAKE_INSTALL_WORLD_READABLE: **${PROJECT_NAME}_MAKE_INSTALL_GROUP_READABLE** **${PROJECT_NAME}_MAKE_INSTALL_GROUP_WRITABLE** **${PROJECT_NAME}_MAKE_INSTALL_WORLD_READABLE** Determines the permissions for directories and files created during the execution of the of the ``install`` and ``isntall_package_by_package`` targets. To make the created directories by only group readable for the project by default, set:: set(${PROJECT_NAME}_MAKE_INSTALL_WORLD_READABLE_DEFAULT TRUE) To make the created directories by only group writable (and readable) for the project by default, set:: set(${PROJECT_NAME}_MAKE_INSTALL_WORLD_WRITABLE_DEFAULT TRUE) To make the created directories by world readable for the project by default, set:: set(${PROJECT_NAME}_MAKE_INSTALL_WORLD_READABLE_DEFAULT TRUE) On non-Windows systems, these set permissions for all files and directories from the the user-set base directory ``${PROJECT_NAME}_SET_GROUP_AND_PERMISSIONS_ON_INSTALL_BASE_DIR`` on down. For more details see `Installation considerations`_. These defaults can be set in the `/ProjectName.cmake`_ file. .. _${PROJECT_NAME}_MUST_FIND_ALL_TPL_LIBS: **${PROJECT_NAME}_MUST_FIND_ALL_TPL_LIBS** Determines if all of the libraries listed in ``_LIBRARY_NAMES`` for a given TPL must be found for each enabled TPL. By default, this is ``FALSE`` which means that the determination if all of the listed libs for a TPL should be found is determined by the ``MUST_FIND_ALL_LIBS`` option to the `tribits_tpl_find_include_dirs_and_libraries()`_ function in the TPL find module. To change the default for this, set:: set(${PROJECT_NAME}_MUST_FIND_ALL_TPL_LIBS_DEFAULT TRUE) in the `/ProjectName.cmake`_ file. .. _${PROJECT_NAME}_REQUIRES_PYTHON: **${PROJECT_NAME}_REQUIRES_PYTHON** If the TriBITS project requires Python, set:: set(${PROJECT_NAME}_REQUIRES_PYTHON TRUE) in the `/ProjectName.cmake`_ file (See `Python Support`_). The default is implicitly ``FALSE``. .. _${PROJECT_NAME}_SET_INSTALL_RPATH: **${PROJECT_NAME}_SET_INSTALL_RPATH** The cache variable ``${PROJECT_NAME}_SET_INSTALL_RPATH`` is used to define the default RPATH mode for the TriBITS project (see `Setting install RPATH`_ for details). The TriBITS default is to set this to ``TRUE`` but the TriBITS project can be set the default to ``FALSE`` by setting:: set(${PROJECT_NAME}_SET_INSTALL_RPATH_DEFAULT FALSE) in the project's `/ProjectName.cmake`_ file (see `RPATH Handling`_). .. _${PROJECT_NAME}_SHOW_TEST_START_END_DATE_TIME: **${PROJECT_NAME}_SHOW_TEST_START_END_DATE_TIME** The cache variable ``${PROJECT_NAME}_SHOW_TEST_START_END_DATE_TIME`` determines if the start and end date/time for each advanced test (i.e. added with `tribits_add_advanced_test()`_) is printed or not with each test. If set to ``TRUE`` this also causes in the timing for each ``TEST_`` block to be printed as well. The TriBITS default is ``OFF`` but a TriBITS project can change this default by setting:: set(${PROJECT_NAME}_SHOW_TEST_START_END_DATE_TIME_DEFAULT ON) The implementation of this feature currently uses ``execute_process(date)`` and therefore will work on many (but perhaps not all) Linux/Unix/Mac systems and not on Windows systems. NOTE: In a future version of CTest, this option may turn on start and end date/time for regular tests added with `tribits_add_test()`_ (which uses a raw command with ``add_test()``). .. _${PROJECT_NAME}_SKIP_INSTALL_PROJECT_CMAKE_CONFIG_FILES: **${PROJECT_NAME}_SKIP_INSTALL_PROJECT_CMAKE_CONFIG_FILES** To change the default value of the ``${PROJECT_NAME}_SKIP_INSTALL_PROJECT_CMAKE_CONFIG_FILES`` to ``TRUE``, for example, for a TriBITS project, set:: set(${PROJECT_NAME}_SKIP_INSTALL_PROJECT_CMAKE_CONFIG_FILES_DEFAULT TRUE) in the project's `/CMakeLists.txt`_ or `/ProjectName.cmake`_ files. .. _${PROJECT_NAME}_SKIP_EXTRAREPOS_FILE: **${PROJECT_NAME}_SKIP_EXTRAREPOS_FILE** The cache variable ``${PROJECT_NAME}_SKIP_EXTRAREPOS_FILE`` is set in the `/ProjectName.cmake`_ file as:: set(${PROJECT_NAME}_SKIP_EXTRAREPOS_FILE TRUE) for projects that don't have a `/cmake/ExtraRepositoriesList.cmake`_ file. This variable needs to be set when using the CTest driver script and does not need to be set for the basic configure and build process. .. _${PROJECT_NAME}_TEST_CATEGORIES: .. _${PROJECT_NAME}_TEST_CATEGORIES_DEFAULT: **${PROJECT_NAME}_TEST_CATEGORIES** The cache variable ``${PROJECT_NAME}_TEST_CATEGORIES`` determines what tests defined using `tribits_add_test()`_ and `tribits_add_advanced_test()`_ will be added for ``ctest`` to run (see `Test Test Category`_). The TriBITS default is ``NIGHTLY`` for a standard local build. The `checkin-test.py`_ tool sets this to ``BASIC`` by default. A TriBITS project can override the default for a basic configure using, for example:: set(${PROJECT_NAME}_TEST_CATEGORIES_DEFAULT BASIC) The justification for having the default `Test Test Category`_ be ``NIGHTLY`` instead of ``BASIC`` is that when someone is enabling a package to develop on it or install it, we want them by default to be seeing the full version of the test suite (shy of the `Test Test Category HEAVY`_ tests which can be very expensive) for the packages they are explicitly enabling. Typically they will not be enabling forward/`downstream`_ dependent packages so the cost of running the test suite should not be too prohibitive. This all depends on how good of a job the development teams do in making their test suites run fast and keeping the cost of running the tests down. See the section `TriBITS Automated Testing`_ for a more detailed discussion. .. _${PROJECT_NAME}_TPL_SYSTEM_INCLUDE_DIRS: .. _${PROJECT_NAME}_TPL_SYSTEM_INCLUDE_DIRS_DEFAULT: **${PROJECT_NAME}_TPL_SYSTEM_INCLUDE_DIRS** If ``${PROJECT_NAME}_TPL_SYSTEM_INCLUDE_DIRS`` is set to ``TRUE``, then the ``SYSTEM`` flag will be passed into the ``include_directories()`` command for TPL include directories for every TPL for every package, by default. On some systems this will result in include directories being passed to the compiler with ``-isystem`` instead of ``-I``. This helps to avoid compiler warning coming from TPL header files for C and C++. However, with CMake version 3.2 and less, this also results in ``-isystem`` being passed to the Fortran compiler (e.g. gfortran) as well. This breaks the reading of Fortran module files (perhaps a bug in gfortran). Because of this issue with Fortran, the TriBITS default for this option is set to ``FALSE`` but a project can override the default using:: set(${PROJECT_NAME}_TPL_SYSTEM_INCLUDE_DIRS_DEFAULT TRUE) (This would be a good default if the project has not Fortran files or has not Fortran files that use modules provided by TPLs). However, if a package or subpackage sets:: set(${PACKAGE_NAME}_SKIP_TPL_SYSTEM_INCLUDE_DIRS TRUE) in its ``CMakeLists.txt`` files before the ``tribits_add_library()`` or ``tribits_add_executable()`` commands are called in that package, then ``SYSTEM`` will **not** be passed into ``include_directories()`` for TPL include dirs. This is how some TriBITS packages with Fortran files that use Fortran modules avoid passing in ``-isystem`` to the Fortran compiles and thereby avoid the defect with gfortran described above. If CMake version 3.3 or greater is used, this variable is not required. NOTE: Currently, a TriBITS package must have a direct dependency on a TPL to have ``-isystem`` added to a TPL's include directories on the compile lines for that package. That is, the TPL must be listed in the ``LIB_REQUIRED_TPLS`` or ``LIB_OPTIONAL_TPLS`` arguments passed into the `tribits_package_define_dependencies()`_ function in the package's `/cmake/Dependencies.cmake`_ file. In addition, to have ``-isystem`` added to the include directories for a TPL when compiling the tests for an package, it must be listed in the ``TEST_REQUIRED_TPLS`` or ``TEST_OPTIONAL_TPLS`` arguments. This is a limitation of the TriBITS implementation that will be removed in a future version of TriBITS. .. _${PROJECT_NAME}_TRACE_ADD_TEST: .. _${PROJECT_NAME}_TRACE_ADD_TEST_DEFAULT: **${PROJECT_NAME}_TRACE_ADD_TEST** If ``${PROJECT_NAME}_TRACE_ADD_TEST`` is set to ``TRUE``, then a single line will be printed for each call to `tribits_add_test()`_ and `tribits_add_advanced_test()`_ for if the test is added or not and if not then why. The default is set based on the value of ``${PROJECT_NAME}_VERBOSE_CONFIGURE`` but a project can override the default by setting:: set(${PROJECT_NAME}_TRACE_ADD_TEST_DEFAULT TRUE) .. _${PROJECT_NAME}_USE_GNUINSTALLDIRS: **${PROJECT_NAME}_USE_GNUINSTALLDIRS** If ``${PROJECT_NAME}_USE_GNUINSTALLDIRS`` is set to ``TRUE``, then the default install paths will be determined by the standard CMake module ``GNUInstallDirs``. Otherwise, platform independent install paths are used by default. A project can use the paths given the cmake module ``GNUInstallDirs`` by default by setting:: set(${PROJECT_NAME}_USE_GNUINSTALLDIRS_DEFAULT TRUE) in the project's top-level `/CMakeLists.txt`_ file or its `/ProjectName.cmake`_ file. The default is ``FALSE``. .. _${PROJECT_NAME}_USES_PYTHON: **${PROJECT_NAME}_USES_PYTHON** If the TriBITS project can use Python, but does not require it, set:: set(${PROJECT_NAME}_USES_PYTHON TRUE) in the `/ProjectName.cmake`_ file (see `Python Support`_). The default for a TriBITS project is implicitly ``TRUE``. To explicitly state that Python is never needed, set:: set(${PROJECT_NAME}_USES_PYTHON FALSE) .. _DART_TESTING_TIMEOUT: **DART_TESTING_TIMEOUT** The cache variable ``DART_TESTING_TIMEOUT`` is a built-in CMake variable that provides a default timeout for all tests (see `Setting test timeouts at configure time`_). By default, TriBITS defines this to be 1500 seconds (which is also the raw CMake default) but the project can change this default, from 1500 to 300 for example, by setting the following in the project's `/ProjectName.cmake`_ or `/CMakeLists.txt`_ file:: set(DART_TESTING_TIMEOUT_DEFAULT 300) .. _CMAKE_INSTALL_RPATH_USE_LINK_PATH: **CMAKE_INSTALL_RPATH_USE_LINK_PATH** The cache variable ``CMAKE_INSTALL_RPATH_USE_LINK_PATH`` is a built-in CMake variable that determines if the paths for external libraries (i.e. from TPLs) is put into the installed library RPATHS (see `RPATH Handling`_). TriBITS sets the default for this to ``TRUE`` but a project can change the default back to ``FALSE`` by setting the following in the project's `/ProjectName.cmake`_ file:: set(CMAKE_INSTALL_RPATH_USE_LINK_PATH_DEFAULT FALSE) .. _MPI_EXEC_MAX_NUMPROCS: **MPI_EXEC_MAX_NUMPROCS** The variable ``MPI_EXEC_MAX_NUMPROCS`` gives the maximum number of processes for an MPI test that will be allowed as defined by `tribits_add_test()`_ and `tribits_add_advanced_test()`_. The TriBITS default is set to be ``4`` (for no good reason really but it needs to stay that way for backward compatibility). This default can be changed by setting:: set(MPI_EXEC_MAX_NUMPROCS_DEFAULT ) While this default can be changed for the project as a whole on all platforms, it is likely better to change this default on a machine-by-machine basis to correspond to the load that can be accommodated by a given machine (or class of machines). For example if a given machine has 64 cores, a reasonable number for ``MPI_EXEC_MAX_NUMPROCS_DEFAULT`` is 64. .. _PythonInterp_FIND_VERSION: **PythonInterp_FIND_VERSION** Determines the version of Python that is looked for. TriBITS requires at least version "2.7". A particular TriBITS project can require a higher version of TriBITS and this is set using, for example: set(PythonInterp_FIND_VERSION_DEFAULT "3.5.2") in the `/ProjectName.cmake`_ file (See `Python Support`_). The default is version "2.7". The user can force a more recent version of Python by configuring with, for example:: -D PythonInterp_FIND_VERSION="3.6.2" .. _TRIBITS_HANDLE_TRIBITS_DEPRECATED_CODE: **TRIBITS_HANDLE_TRIBITS_DEPRECATED_CODE** Determines how the function `tribits_deprecated()`_ behaves. To change the default behavor, such as call ``message(FATAL_ERROR ...)``, set:: set(TRIBITS_HANDLE_TRIBITS_DEPRECATED_CODE_DEFAULT FATAL_ERROR) in the project's `/ProjectName.cmake`_ file, or `/CMakeLists.txt`_ file, or on the individual package basis in its `/CMakeLists.txt`_ file. TriBITS Macros and Functions ---------------------------- The following subsections give detailed documentation for the CMake macros and functions that make up the core TriBITS system. These are what are used by TriBITS project developers in their ``CMakeLists.txt`` and other files. All of these functions and macros should be automatically available when processing the project's and package's variables files if used properly. Therefore, no explicit ``include()`` statements should be needed other than the initial include of the ``TriBITS.cmake`` file in the top-level `/CMakeLists.txt`_ file so the command `tribits_project()`_ can be executed. .. include:: TribitsMacroFunctionDoc.rst General Utility Macros and Functions ------------------------------------ The following subsections give detailed documentation for some CMake macros and functions which are *not* a core part of the TriBITS system but are included in the TriBITS source tree, are used inside of the TriBITS system, and are provided as a convenience to TriBITS project developers. One will see many of these functions and macros used throughout the implementation of TriBITS and even in the ``CMakeLists.txt`` files for different projects that use TriBITS. These macros and functions are *not* prefixed with ``TRIBITS_``. However, there is really not a large risk to defining and using these non-namespaces utility functions and macros. It turns out that CMake allows one to redefine any macro or function, even built-in ones, inside of one's project. Therefore, even if CMake did add new commands that clashed with these names, there would be no conflict. When overriding a built-in command, e.g. ``some_builtin_command()``, one can always access the original built-in command as ``_some_builtin_command()``. .. include:: UtilsMacroFunctionDoc.rst .. *** NOTE: This file is symlinked into users_guide/ and maintainers_guide/ .. *** and the symlinked file gets included in the top-level *.rst document. .. *** This is so that the includes for the generated files .. *** TribitsMacroFunctionDoc.rst and UtilsMacroFunctionDoc.rst in those .. *** directories work correctly.