.. _model_config_cmake_macros_dir:
CMAKE_MACROS_DIR
================
.. contents::
:local:
Entry
-----
The following is an example for ``CMAKE_MACROS_DIR`` in ``config_files.xml``.
This variable is used to set the directory where the cmake macros are located. This is a required variable for the build system.
.. code-block:: xml
char
$SRCROOT/cime_config/machines/cmake_macros
case_last
env_case.xml
Directory containing cmake macros (for documentation only - DO NOT EDIT)
.. _model_config_cmake_macros_dir_def:
Configuration
-------------
This is a directory containing machine/compiler cmake macros that will be loaded during the build process.
To make these macro files available to the build system you'll need two files; ``CMakeLists.txt`` and ``Macros.cmake``.
Naming convention
`````````````````
The cmake macro files will be loaded using this hiearchy with more specific files taking precedence.
- universal.cmake
- .cmake
- .cmake
- _.cmake
Required Files
``````````````
These files will be copied to the ``CASEROOT/cmake_macros`` directory and used to load the appropriate macro files for the machine.
CMakeLists.txt
::::::::::::::
.. code-block:: cmake
cmake_policy(SET CMP0057 NEW)
cmake_minimum_required(VERSION 3.5)
project(cime LANGUAGES C Fortran)
include(${CMAKE_CURRENT_BINARY_DIR}/../Macros.cmake)
Macros.cmake
::::::::::::
.. code-block:: cmake
cmake_policy(SET CMP0057 NEW)
set(MACROS_DIR ${CASEROOT}/cmake_macros)
set(UNIVERSAL_MACRO ${MACROS_DIR}/universal.cmake)
set(COMPILER_MACRO ${MACROS_DIR}/${COMPILER}.cmake)
set(MACHINE_MACRO ${MACROS_DIR}/${MACH}.cmake)
set(COMPILER_MACHINE_MACRO ${MACROS_DIR}/${COMPILER}_${MACH}.cmake)
set(POST_PROCESS_MACRO ${SRCROOT}/cime_config/machines/cmake_macros/post_process.cmake)
if (CONVERT_TO_MAKE)
get_cmake_property(E3SM_CMAKE_INTERNAL_VARS_BEFORE_BUILD_INTERNAL_IGNORE VARIABLES)
foreach (VAR_BEFORE IN LISTS E3SM_CMAKE_INTERNAL_VARS_BEFORE_BUILD_INTERNAL_IGNORE)
set("E3SM_CMAKE_INTERNAL_${VAR_BEFORE}" "${${VAR_BEFORE}}")
endforeach()
list(APPEND E3SM_CMAKE_INTERNAL_VARS_BEFORE_BUILD_INTERNAL_IGNORE "VAR_BEFORE")
list(APPEND E3SM_CMAKE_INTERNAL_VARS_BEFORE_BUILD_INTERNAL_IGNORE "MACRO_FILE")
endif()
# Include order defines precedence
foreach (MACRO_FILE ${UNIVERSAL_MACRO} ${COMPILER_MACRO} ${MACHINE_MACRO} ${COMPILER_MACHINE_MACRO} ${POST_PROCESS_MACRO})
if (EXISTS ${MACRO_FILE})
include(${MACRO_FILE})
else()
message("No macro file found: ${MACRO_FILE}")
endif()
endforeach()
if (CONVERT_TO_MAKE)
get_cmake_property(VARS_AFTER VARIABLES)
foreach (VAR_AFTER IN LISTS VARS_AFTER)
if (VAR_AFTER MATCHES "^E3SM_CMAKE_INTERNAL_")
# skip
else()
if (NOT VAR_AFTER IN_LIST E3SM_CMAKE_INTERNAL_VARS_BEFORE_BUILD_INTERNAL_IGNORE)
message("CIME_SET_MAKEFILE_VAR ${VAR_AFTER} := ${${VAR_AFTER}}")
list(APPEND E3SM_CMAKE_INTERNAL_VARS_BEFORE_BUILD_INTERNAL_IGNORE "${VAR_AFTER}")
set("E3SM_CMAKE_INTERNAL_${VAR_AFTER}" "${${VAR_AFTER}}")
elseif (NOT "${${VAR_AFTER}}" STREQUAL "${E3SM_CMAKE_INTERNAL_${VAR_AFTER}}")
message("CIME_SET_MAKEFILE_VAR ${VAR_AFTER} := ${${VAR_AFTER}}")
set("E3SM_CMAKE_INTERNAL_${VAR_AFTER}" "${${VAR_AFTER}}")
endif()
endif()
endforeach()
endif()
Directory Structure
-------------------
.. code-block::
cmake_macros
CMakeList.txt
Macros.cmake
...