1CMAKE_MINIMUM_REQUIRED(VERSION 2.8.10 FATAL_ERROR) 2PROJECT(MEDFile C CXX) 3 4## The following signature is still buggy as of CMake 2.8.11 - 5## the OPTIONAL is not considered. 6## See http://www.cmake.org/Bug/view.php?id=10227 7#ENABLE_LANGUAGE(Fortran OPTIONAL) 8 9INCLUDE(CheckLanguage) 10CHECK_LANGUAGE(Fortran) 11IF(CMAKE_Fortran_COMPILER) 12 ENABLE_LANGUAGE(Fortran) 13ELSE() 14 MESSAGE(STATUS "No Fortran support") 15ENDIF() 16 17## Version number 18SET(MED_NUM_MAJEUR @MED_NUM_MAJEUR@) 19SET(MED_NUM_MINEUR @MED_NUM_MINEUR@) 20SET(MED_NUM_RELEASE @MED_NUM_RELEASE@) 21 22## Previous version 23SET(MED_3_LATEST_MINOR @MED_3_LATEST_MINOR@) 24 25SET(MED_STR_VERSION "${MED_NUM_MAJEUR}.${MED_NUM_MINEUR}.${MED_NUM_RELEASE}") 26 27SET(LONG_OR_INT int) 28 29## User options: 30OPTION (MEDFILE_BUILD_TESTS "Build MED-file tests" ON) 31IF (MEDFILE_BUILD_TESTS) 32 ENABLE_TESTING() 33ENDIF() 34OPTION (MEDFILE_BUILD_SHARED_LIBS "Build MED-file shared libraries" ON) 35OPTION (MEDFILE_BUILD_STATIC_LIBS "Build MED-file static libraries" OFF) 36OPTION (MEDFILE_INSTALL_DOC "Install pre-built documentation" ON) 37OPTION (MEDFILE_BUILD_PYTHON "Build Python bindings (needs SWIG)" OFF) 38 39#-- Add an Option to toggle the generation of the API documentation 40#-- Embedded documentation contains patched doxygen generated fortran documention 41#-- If you rebuild it with your own doxygen Fortran documentation will differ 42option(MEDFILE_BUILD_DOC "Use Doxygen to create the HTML based API documentation" OFF) 43if(MEDFILE_BUILD_DOC) 44 FIND_PACKAGE(Doxygen) 45 if (NOT DOXYGEN_FOUND) 46 message(FATAL_ERROR 47 "Doxygen is needed to build the documentation. Please install it correctly") 48 endif() 49 50 ADD_SUBDIRECTORY(doc) 51endif() 52 53# Option checking. 54IF(MEDFILE_BUILD_SHARED_LIBS AND MEDFILE_BUILD_STATIC_LIBS) 55 MESSAGE(FATAL_ERROR "You can not build shared and static libraries at the same time! ") 56 SET(MEDFILE_BUILD_STATIC_LIBS OFF) 57ENDIF() 58IF(NOT (MEDFILE_BUILD_SHARED_LIBS OR MEDFILE_BUILD_STATIC_LIBS)) 59 MESSAGE(FATAL_ERROR "You must select to build either STATIC or SHARED libs") 60 SET(MEDFILE_BUILD_SHARED_LIBS ON) 61ENDIF() 62 63## Useful macros 64LIST(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/config/cmake_files") 65INCLUDE(medMacros) 66 67## Version number 68#MED_EXTRACT_AUTOTOOLS_VERSION(${PROJECT_SOURCE_DIR}/configure.ac MED_NUM_MAJEUR MED_NUM_MINEUR MED_NUM_RELEASE) 69#SET(MED_STR_VERSION "${MED_NUM_MAJEUR}.${MED_NUM_MINEUR}.${MED_NUM_RELEASE}") 70 71## Platform specific flags (windows) 72IF(WIN32) 73 ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS) # To disable windows warnings for strcpy, fopen, ... 74 ADD_DEFINITIONS(-D_SCL_SECURE_NO_WARNINGS) # To disable windows warnings std::copy, std::transform, ... 75 ADD_DEFINITIONS(-DWNT -DWIN32) 76 ADD_DEFINITIONS(-D_WIN32_WINNT=0x0500) # Windows 2000 or later API is required 77 ADD_DEFINITIONS(-DPPRO_NT_CALL) # For windows system functions call 78 79 IF(NOT MINGW) 80 # Needed to avoid a seg fault at runtime! 81 # The variable is not very well documented but seems to exist 82 SET(CMAKE_Fortran_FLAGS "/iface:mixed_str_len_arg ${CMAKE_Fortran_FLAGS}") 83 ADD_DEFINITIONS(-DPPRO_NT) # For windows medfile function nammes 84 ENDIF() 85 86ELSE() 87 # Ensure intermediate OBJECT libraries and static libs are built with -fPIC: 88 SET(CMAKE_POSITION_INDEPENDENT_CODE ON) 89ENDIF(WIN32) 90 91## Directories 92IF(WIN32 AND NOT CYGWIN) 93 SET(INSTALL_CMAKE_CONFIG_DIR cmake) 94ELSE() 95 SET(INSTALL_CMAKE_CONFIG_DIR share/cmake/med-fichier-${MED_STR_VERSION}) 96ENDIF() 97SET(INSTALL_INCLUDE_DIR include) 98 99## Pre-requisites detection 100# Detect HDF5 first to potentially retrieve MPI automatically: 101MED_FIND_HDF5() 102MED_FIND_MPI() 103 104IF(MEDFILE_BUILD_PYTHON) 105 FIND_PACKAGE(SWIG REQUIRED) 106 INCLUDE(${SWIG_USE_FILE}) 107 FIND_PACKAGE(PythonLibs REQUIRED) 108 FIND_PACKAGE(PythonInterp REQUIRED) # to get version string ... 109ENDIF() 110 111## Creation of files med_config.h.cmake 112MED_CREATE_CONFIG_FILES() 113 114## Check for various functions 115MED_CHECK_HEADERS() 116MED_CHECK_FUNCTIONS() 117MED_CHECK_SIZE() 118MED_C_FORTRAN_INTERFACE() 119MED_TIME_SYS_TIME() 120 121## Configure the files created above 122CONFIGURE_FILE("${PROJECT_BINARY_DIR}/include/med_config.h.cmake" "${PROJECT_BINARY_DIR}/include/med_config.h") 123CONFIGURE_FILE("${PROJECT_BINARY_DIR}/include/2.3.6/med_config.h.cmake" "${PROJECT_BINARY_DIR}/include/2.3.6/med_config.h") 124 125## Sources 126ADD_SUBDIRECTORY(include) 127ADD_SUBDIRECTORY(src) 128ADD_SUBDIRECTORY(tools) 129IF(MEDFILE_BUILD_TESTS) 130 ADD_SUBDIRECTORY(tests) 131ENDIF() 132IF(MEDFILE_BUILD_PYTHON) 133 ADD_SUBDIRECTORY(python) 134ENDIF() 135 136## Installation of the doc 137IF(MEDFILE_INSTALL_DOC OR MEDFILE_BUILD_DOC) 138 INSTALL(DIRECTORY doc/html.dox/ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/doc/med-fichier-${MED_STR_VERSION} REGEX "Makefile*" EXCLUDE PATTERN "*.am" EXCLUDE) 139 INSTALL(DIRECTORY doc/gif doc/jpg doc/png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/doc/med-fichier-${MED_STR_VERSION} FILES_MATCHING PATTERN "*.gif" PATTERN "*.jpg" PATTERN "*.svg" PATTERN "*.png") 140ENDIF() 141 142####################### 143## Configuration export 144####################### 145INCLUDE(CMakePackageConfigHelpers) 146 147# Project name, upper case 148STRING(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UC) 149 150# Detect if we are built as a sub-project in a bigger source tree: 151IF("${CMAKE_SOURCE_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}") 152 SET(_BUILT_AS_SUB FALSE) 153 MESSAGE(STATUS "Configuring ${PROJECT_NAME} standalone.") 154ELSE() 155 MESSAGE(STATUS "Configuring ${PROJECT_NAME} as a sub-project. No conf files will be installed.") 156 SET(_BUILT_AS_SUB TRUE) 157ENDIF() 158 159# Add all targets to the build-tree export set if we are *not* 160# built as a sub-folder of a bigger project. 161IF(NOT _BUILT_AS_SUB) 162 IF(CMAKE_Fortran_COMPILER_WORKS) 163 SET(_fortLib med medfwrap) 164 SET(_fortLibS med_static medfwrap_static) 165 ELSE() 166 SET(_fortLib "") 167 SET(_fortLibS "") 168 ENDIF() 169 170 IF(MEDFILE_BUILD_STATIC_LIBS) 171 EXPORT(TARGETS medC_static ${_fortLibS} 172 FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake) 173 ENDIF() 174 IF(MEDFILE_BUILD_SHARED_LIBS) 175 EXPORT(TARGETS medC ${_fortLib} 176 APPEND FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake) 177 ENDIF() 178 179ENDIF() 180 181# Create the configuration files: 182# - in the build tree: 183SET(HDF5_ROOT_DIR "${HDF5_ROOT_DIR}") # ensure the var exists, even if blank 184SET(MPI_ROOT_DIR "${MPI_ROOT_DIR}") # ensure the var exists, even if blank 185SET(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/include" "${PROJECT_BINARY_DIR}/include") 186CONFIGURE_PACKAGE_CONFIG_FILE(config/cmake_files/${PROJECT_NAME}Config.cmake.in 187 ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake 188 INSTALL_DESTINATION "${INSTALL_CMAKE_CONFIG_DIR}" 189 PATH_VARS CONF_INCLUDE_DIRS INSTALL_CMAKE_CONFIG_DIR CMAKE_INSTALL_PREFIX HDF5_ROOT_DIR MPI_ROOT_DIR) 190 191# - in the install tree: 192# Get the relative path of the include directory so 193# we can register it in the generated configuration files: 194SET(CONF_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/${INSTALL_INCLUDE_DIR}") 195CONFIGURE_PACKAGE_CONFIG_FILE(config/cmake_files/${PROJECT_NAME}Config.cmake.in 196 ${PROJECT_BINARY_DIR}/to_install/${PROJECT_NAME}Config.cmake 197 INSTALL_DESTINATION "${INSTALL_CMAKE_CONFIG_DIR}" 198 PATH_VARS CONF_INCLUDE_DIRS INSTALL_CMAKE_CONFIG_DIR CMAKE_INSTALL_PREFIX HDF5_ROOT_DIR MPI_ROOT_DIR) 199 200WRITE_BASIC_PACKAGE_VERSION_FILE(${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake 201 VERSION ${MED_STR_VERSION} 202 COMPATIBILITY AnyNewerVersion) 203 204# Install the CMake configuration files: 205INSTALL(FILES 206 "${PROJECT_BINARY_DIR}/to_install/${PROJECT_NAME}Config.cmake" 207 "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" 208 DESTINATION "${INSTALL_CMAKE_CONFIG_DIR}") 209 210# Install the export set for use within the install-tree 211IF(NOT _BUILT_AS_SUB) 212 INSTALL(EXPORT medfileTargets DESTINATION "${INSTALL_CMAKE_CONFIG_DIR}" FILE ${PROJECT_NAME}Targets.cmake) 213ENDIF() 214 215