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