1 #-------------------------------------------------------------------------------
3 # | ____| _| |_ / __ \ /\ | \/ |
4 # | |__ _ __ ___ ___ / \| | | | / \ | \ / |
5 # | __| '__/ _ \/ _ ( (| |) ) | | |/ /\ \ | |\/| |
6 # | | | | | __/ __/\_ _/| |__| / ____ \| | | |
7 # |_| |_| \___|\___| |_| \____/_/ \_\_| |_|
9 # FreeFOAM: The Cross-Platform CFD Toolkit
11 # Copyright (C) 2008-2009 Michael Wild <themiwi@users.sf.net>
12 # Gerber van der Graaf <gerber_graaf@users.sf.net>
13 #-------------------------------------------------------------------------------
15 # This file is part of FreeFOAM.
17 # FreeFOAM is free software; you can redistribute it and/or modify it
18 # under the terms of the GNU General Public License as published by the
19 # Free Software Foundation; either version 2 of the License, or (at your
20 # option) any later version.
22 # FreeFOAM is distributed in the hope that it will be useful, but WITHOUT
23 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
24 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
27 # You should have received a copy of the GNU General Public License
28 # along with FreeFOAM; if not, write to the Free Software Foundation,
29 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
30 #-------------------------------------------------------------------------------
32 cmake_minimum_required(VERSION 2.8.0 FATAL_ERROR)
36 string(TOLOWER "${PROJECT_NAME}" LOWER_PROJECT_NAME)
39 set(FOAM_VERSION_MAJOR 0)
40 set(FOAM_VERSION_MINOR 1)
41 set(FOAM_VERSION_PATCH 0)
42 set(FOAM_VERSION ${FOAM_VERSION_MAJOR}.${FOAM_VERSION_MINOR})
43 set(FOAM_VERSION_FULL ${FOAM_VERSION}.${FOAM_VERSION_PATCH})
45 # set up custom cmake module path
46 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake/Modules)
49 set(FOAM_CREATE_INCLUDE_WRAPPERS TRUE)
50 set(FOAM_HAS_FLEX_SOURCES TRUE)
51 set(FOAM_ENABLE_DOC_INDEX TRUE)
52 set(FOAM_EXPORT_NAMESPACE FOAM_)
53 include(${CMAKE_SOURCE_DIR}/CMake/FOAMUtilities.cmake)
54 include(${CMAKE_SOURCE_DIR}/CMake/FOAMThirdPartyUtilities.cmake)
55 include(${CMAKE_SOURCE_DIR}/CMake/FOAMInternal.cmake)
57 # determine computer system
58 include(${CMAKE_SOURCE_DIR}/CMake/FOAMDetermineArch.cmake)
61 foam_option(FOAM_DOUBLE_PRECISION "Double precision"
62 "Compile ${PROJECT_NAME} with double precision floating point arithmetics." ON)
63 if(FOAM_DOUBLE_PRECISION)
64 set(FOAM_PRECISION DP)
66 set(FOAM_PRECISION SP)
69 # select whether we want to build framewors on Mac OS X
71 foam_option(FOAM_BUILD_FRAMEWORKS "Build frameworks"
72 "Build frameworks on Mac OS X" OFF)
74 set(FOAM_BUILD_FRAMEWORKS OFF)
77 # ask user whether she wants to build ParaView plugins
78 foam_option(FOAM_BUILD_PARAVIEW_PLUGINS "Build ParaView plugins"
79 "Build the ParaView plugins. Requires a ParaView build tree." OFF)
80 if(FOAM_BUILD_PARAVIEW_PLUGINS)
81 # find ParaView, which also find the VTK which has been used to build ParaView
82 find_package(ParaView)
83 if(NOT ParaView_FOUND)
85 "Failed to find the ParaView build tree. Specify ParaView_DIR or\n"
86 "disable FOAM_BUILD_PARAVIEW_PLUGINS")
88 # find the installed ParaView executable
90 FOAM_PARAVIEW3_APP NAMES paraview paraview.app
91 HINTS ${ParaView_DIR}/bin
92 DOC "Path to the ParaView 3 executable (or application bundle on Mac OS X)"
94 if(NOT FOAM_PARAVIEW3_APP)
96 "Failed to find the ParaView 3 executable or application bundle")
99 mark_as_advanced(FOAM_PARAVIEW3_APP)
101 # we want shared libraries
102 set(BUILD_SHARED_LIBS SHARED)
104 # installation directories
105 foam_installation_path(FOAM_INSTALL_BIN_PATH bin "Executables"
106 "Executables installation path")
107 if(APPLE AND FOAM_BUILD_FRAMEWORKS)
108 foam_installation_path(FOAM_INSTALL_FRAMEWORK_PATH /Library/Frameworks
109 "Frameworks" "Framework installation path")
111 foam_installation_path(FOAM_INSTALL_LIBRARY_PATH
112 lib/${CMAKE_PROJECT_NAME}-${FOAM_VERSION_FULL}
113 "Libraries" "Library installation path")
114 foam_installation_path(FOAM_INSTALL_LIBEXEC_PATH
115 libexec/${CMAKE_PROJECT_NAME}-${FOAM_VERSION_FULL} "Private executables"
116 "Installation path for executables not on PATH.")
117 foam_installation_path(FOAM_INSTALL_HEADER_PATH
118 include/${CMAKE_PROJECT_NAME}-${FOAM_VERSION_FULL}
119 "Headers" "Header installation path (not for frameworks)")
120 foam_installation_path(FOAM_INSTALL_CONFIG_PATH
121 etc/${CMAKE_PROJECT_NAME}/${FOAM_VERSION_FULL} "Config files"
122 "Configuration files installation path")
123 foam_installation_path(FOAM_INSTALL_DATA_PATH
124 share/${CMAKE_PROJECT_NAME}-${FOAM_VERSION_FULL} "Data files"
125 "Data files installation path")
126 foam_installation_path(FOAM_INSTALL_DOC_PATH
127 share/doc/${CMAKE_PROJECT_NAME}-${FOAM_VERSION_FULL} "Documentation"
128 "Documentation files installation path")
129 foam_installation_path(FOAM_INSTALL_MAN_PATH share/man "Man pages"
130 "Man-pages installation path")
131 foam_installation_path(FOAM_INSTALL_TUTORIALS_PATH "${FOAM_INSTALL_DOC_PATH}"
132 "Tutorials" "Tutorials installation path")
133 foam_installation_path(FOAM_INSTALL_CMAKE_PATH "${FOAM_INSTALL_DATA_PATH}/CMake"
134 "CMake files" "CMake configuration files installation path")
135 if(FOAM_BUILD_PARAVIEW_PLUGINS)
136 foam_installation_path(FOAM_INSTALL_PVFOAMREADER_PATH
137 "${FOAM_INSTALL_LIBRARY_PATH}/plugins/PVFoamReader"
138 "ParaView2 plugin" "ParaView2 OpenFOAM-reader plugin installation path")
139 foam_installation_path(FOAM_INSTALL_PV3FOAMREADER_PATH
140 "${FOAM_INSTALL_LIBRARY_PATH}/plugins/PV3FoamReader"
141 "ParaView3 plubin" "ParaView3 OpenFOAM-reader plugin installation path")
143 foam_installation_path(FOAM_INSTALL_USERDFOAM_PATH
144 "${FOAM_INSTALL_LIBRARY_PATH}/plugins/ensightReader"
145 "Ensight plugin" "Ensight OpenFOAM-reader plugin installation path")
147 set(FOAM_INSTALL_RUNTIME_PATH "${FOAM_INSTALL_LIBEXEC_PATH}")
149 # determine the INSTALL_NAME_DIR of potential frameworks
150 if(APPLE AND FOAM_BUILD_FRAMEWORKS)
151 set(FOAM_FRAMEWORK_INSTALL_NAME_DIR "${FOAM_INSTALL_FRAMEWORK_PATH}")
153 set(FOAM_FRAMEWORK_INSTALL_NAME_DIR "${FOAM_INSTALL_LIBRARY_PATH}")
156 # select html documentation browser (try a few well known ones for default)
157 # have to loop, because find_program(HTML_DOC_BROWSER NAMES ...) garbles things up
158 foreach(browser open gnome-open kde-open x-www-browser www-browser
159 firefox epiphany konqueror w3m lynx launch open)
160 find_program(HTML_DOC_BROWSER ${browser}
161 DOC "Program to open an HTML file")
166 if(NOT HTML_DOC_BROWSER)
168 "Failed to find a program to open HTML pages with (a.k.a a browser).\n"
169 "Point HTML_DOC_BROWSER to a suitable program.")
170 set(HTML_DOC_BROWSER "ECHO" CACHE STRING
171 "Command to open an HTML file (ECHO will print it to STDOUT)" FORCE)
173 set(FOAM_HTML_DOC_BROWSER_COMMAND
174 "\${HTML_DOC_BROWSER} %f" CACHE STRING "Command to open an HTML file")
175 string(CONFIGURE "${FOAM_HTML_DOC_BROWSER_COMMAND}"
176 FOAM_HTML_DOC_BROWSER_COMMAND ESCAPE_QUOTES)
177 mark_as_advanced(HTML_DOC_BROWSER FOAM_HTML_DOC_BROWSER_COMMAND)
180 string(TOLOWER "${PROJECT_NAME}-" _FOAM_DEFAULT_EXE_PREFIX)
181 set(FOAM_EXE_PREFIX "${_FOAM_DEFAULT_EXE_PREFIX}"
182 CACHE STRING "Prefix for application output-names")
183 mark_as_advanced(FOAM_EXE_PREFIX)
184 string(TOUPPER "${FOAM_EXE_PREFIX}" FOAM_UPPER_EXE_PREFIX)
186 # ask user whether she wants to build Doxygen docs
187 foam_option(FOAM_ENABLE_DOXYGEN_DOCS "Doxygen API documentation"
188 "Build the Doxygen API documentation" OFF)
189 # if user wants doxygen docs, find Doxygen and set up some options
190 if(FOAM_ENABLE_DOXYGEN_DOCS)
191 find_package(Doxygen REQUIRED)
192 foam_option(FOAM_DOXYDOCS_FOR_SF "Doxygen for SourceForge"
193 "Build the Doxygen docs for deployment on SourceForge" OFF)
194 # ask user whether she prefers local or www docs
195 foam_option(FOAM_USE_LOCAL_DOXYGEN_DOCS "Use local API docs"
196 "Use the local Doxygen documentation instead of the one on http://freefoam.sf.net/doc/Doxygen/html" OFF)
199 # ask user whether she wants to build the man pages
200 foam_option(FOAM_ENABLE_MANPAGE_HELP "Build manpage help"
201 "Build the manpages (requires asciidoc)" OFF)
202 # ask user whether she wants to build the xhtml man pages
203 foam_option(FOAM_ENABLE_XHTML_HELP "Build xhtml help"
204 "Build the xhtml help pages (requires asciidoc)" OFF)
206 # assemble the list of enabled manpage formats
207 set(FOAM_MANPAGE_FORMATS)
208 if(FOAM_ENABLE_MANPAGE_HELP)
209 list(APPEND FOAM_MANPAGE_FORMATS manpage)
211 if(FOAM_ENABLE_XHTML_HELP)
212 list(APPEND FOAM_MANPAGE_FORMATS xhtml)
215 # set up the RPATH for installation
216 set(CMAKE_INSTALL_RPATH ${FOAM_INSTALL_LIBRARY_PATH})
217 set(CMAKE_INSTALL_NAME_DIR ${FOAM_FRAMEWORK_INSTALL_NAME_DIR})
219 # we want executables and libraries in uniform places
220 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY
221 "${CMAKE_BINARY_DIR}/libexec/${PROJECT_NAME}/${FOAM_VERSION_FULL}")
222 set(FOAM_LIBRARY_OUTPUT_DIRECTORY
223 "${CMAKE_BINARY_DIR}/lib/${PROJECT_NAME}-${FOAM_VERSION_FULL}")
224 set(FOAM_FRAMEWORK_OUTPUT_DIRECTORY
225 "${CMAKE_BINARY_DIR}/Library/Frameworks")
226 if(FOAM_BUILD_FRAMEWORKS)
227 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${FOAM_FRAMEWORK_OUTPUT_DIRECTORY}")
229 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${FOAM_LIBRARY_OUTPUT_DIRECTORY}")
231 set(FOAM_ARCHIVE_OUTPUT_DIRECTORY "${FOAM_LIBRARY_OUTPUT_DIRECTORY}")
233 # find parallel libraries
235 "FOAM_ENABLE_@PKG@ is true, but @PKG@ cannot be found.\n"
236 "If you have @PKG@ installed on your system, edit the variables\n"
237 "@PKG@_INCLUDE_DIR and @PKG@_LIBRARY in the cache, else disable the\n"
238 "setting FOAM_USE_@PKG@."
242 set(_FOAM_USE_MPI ON)
244 set(_FOAM_USE_MPI OFF)
246 foam_option(FOAM_USE_MPI "Use MPI"
247 "Build ${CMAKE_PROJECT} against MPI parallel libraries" ${_FOAM_USE_MPI})
248 if(FOAM_USE_MPI AND NOT MPI_FOUND)
249 string(REPLACE "@PKG@" "MPI" _FOAM_MPI_ERROR "${_FOAM_PAR_ERROR}")
250 message(SEND_ERROR "${_FOAM_MPI_ERROR}")
252 if(CMAKE_SYSTEM_NAME STREQUAL Linux)
255 set(_FOAM_USE_GAMMA ON)
257 set(_FOAM_USE_GAMMA OFF)
259 foam_option(FOAM_USE_GAMMA "Use GAMMA"
260 "Build ${CMAKE_PROJECT} against GAMMA parallel libraries"
262 if(FOAM_USE_GAMMA AND NOT GAMMA_FOUND)
263 string(REPLACE "@PKG@" "GAMMA" _FOAM_GAMMA_ERROR "${_FOAM_PAR_ERROR}")
264 message(SEND_ERROR "${_FOAM_GAMMA_ERROR}")
267 if(MPI_FOUND OR GAMMA_FOUND)
268 set(FOAM_USE_PARALLEL TRUE)
272 find_package(Readline)
274 # substitution for build-tree and install-tree as used by
275 # foam_configure_files.
276 set(FOAM_CONFIGURE_FILES_VARIABLES
278 "${CMAKE_BINARY_DIR}/data"
279 "${FOAM_INSTALL_DATA_PATH}"
281 "${CMAKE_BINARY_DIR}/doc"
282 "${FOAM_INSTALL_DOC_PATH}"
284 "${CMAKE_BINARY_DIR}/bin"
285 "${FOAM_INSTALL_BIN_PATH}"
287 "${CMAKE_BINARY_DIR}/lib/FreeFOAM-${FOAM_VERSION_FULL}"
288 "${FOAM_INSTALL_LIBRARY_PATH}"
290 "${CMAKE_BINARY_DIR}/libexec/FreeFOAM/${FOAM_VERSION_FULL}"
291 "${FOAM_INSTALL_LIBEXEC_PATH}"
293 "${CMAKE_BINARY_DIR}/Library/Frameworks"
294 "${FOAM_INSTALL_FRAMEWORK_PATH}"
295 FOAM_PV3FOAMREADER_DIR
296 "${FOAM_LIB_DIR}/plugins/PV3FoamReader"
297 "${FOAM_INSTALL_PV3FOAMREADER_PATH}"
299 "${CMAKE_BINARY_DIR}/include"
300 "${FOAM_INSTALL_HEADER_PATH}"
302 "${CMAKE_BINARY_DIR}/etc"
303 "${FOAM_INSTALL_CONFIG_PATH}"
305 "${CMAKE_BINARY_DIR}/CMake"
306 "${FOAM_INSTALL_CMAKE_PATH}"
311 "${CMAKE_BINARY_DIR}/data/utilities/doxyFixIncludes $1 |"
314 "| ${CMAKE_BINARY_DIR}/data/utilities/doxyFixHeaderName $1"
317 if(FOAM_USE_LOCAL_DOXYGEN_DOCS)
318 list(APPEND FOAM_CONFIGURE_FILES_VARIABLES
319 FOAM_DOC_DIR "${CMAKE_BINARY_DIR}/doc" "${FOAM_INSTALL_DOC_PATH}")
321 set(_sf_doc "http://freefoam.sf.net/doc/${FOAM_VERSION_FULL}")
322 list(APPEND FOAM_CONFIGURE_FILES_VARIABLES
323 FOAM_DOC_DIR "${_sf_doc}" "${_sf_doc}")
326 # thirdparty libraries
327 foam_thirdparty_option(Metis
328 "Required by the metis decomposition method"
330 if(FOAM_ENABLE_METIS)
331 if(FOAM_ENABLE_METIS AND METIS_REQUIRES_MPI AND NOT FOAM_USE_MPI)
333 "Your metis implementation requires FOAM_USE_MPI to be enabled."
334 "If you don't have/want MPI, enable FOAM_BUILD_PRIVATE_METIS instead.")
337 foam_thirdparty_option(ParMetis
338 "Required by the parmetis decomposition method"
339 ParMetis TRUE ${FOAM_USE_MPI}
340 PARMETIS_metis_LIBRARY PARMETIS_parmetis_LIBRARY)
341 if(FOAM_ENABLE_PARMETIS AND NOT FOAM_USE_MPI)
343 "ParMetis requires FOAM_USE_MPI to be enabled.")
345 if(FOAM_ENABLE_PARMETIS AND NOT FOAM_ENABLE_METIS)
347 "ParMetis requires FOAM_ENABLE_METIS to be enabled.")
349 set(SCOTCH_USE_ERREXIT TRUE)
350 foam_thirdparty_option(SCOTCH "" SCOTCH FALSE ON SCOTCH_scotch_LIBRARY
351 SCOTCH_scotcherr_LIBRARY SCOTCH_scotcherrexit_LIBRARY)
352 # do not enable mgridgen by default (licensing issues)
353 if(NOT FOAM_DOUBLE_PRECISION)
354 set(MGRIDGEN_USE_REAL ON)
356 foam_thirdparty_option(MGRIDGEN
357 "Required by the MGridGen GAMG agglomerator. LICENSE UNCLEAR"
359 # do not enable libccmio by default (licensing issues)
360 foam_thirdparty_option(ccmio
361 "Required by ccm26ToFoam. REQUIRES PERMISSION BY CDADAPCO!"
363 foam_thirdparty_option(zlib "" ZLIB FALSE ON)
365 if(FOAM_BUILD_PRIVATE_METIS OR FOAM_BUILD_PRIVATE_MGRIDGEN)
366 find_package(Threads REQUIRED)
368 if(FOAM_BUILD_PRIVATE_SCOTCH)
369 find_package(BISON REQUIRED)
370 find_package(FLEX REQUIRED)
371 find_package(Threads)
374 # figure out default Pstream library
376 set(_FOAM_DEFAULT_PSTREAM mpi)
377 elseif(FOAM_USE_GAMMA)
378 set(_FOAM_DEFAULT_PSTREAM gamma)
380 set(_FOAM_DEFAULT_PSTREAM dummy)
382 set(FOAM_DEFAULT_PSTREAM ${_FOAM_DEFAULT_PSTREAM} CACHE STRING
383 "Default Pstream library implementation [dummy|mpi|gamma]")
384 mark_as_advanced(FOAM_DEFAULT_PSTREAM)
386 # find m4 macro processor
387 find_program(M4_EXECUTABLE m4 DOC "Path to the m4 macro processor")
388 mark_as_advanced(M4_EXECUTABLE)
389 if(NOT M4_EXECUTABLE)
390 message("WARNING: Failed to find M4 macro processor.\n"
391 "Some of the tutorials will fail if it can't be found.")
392 set(M4_EXECUTABLE m4)
395 # on APPLE use cp -R -P -p, otherwise use cp -a
397 set(FOAM_CP_A_FLAGS "-R -P -p")
399 set(FOAM_CP_A_FLAGS "-a")
402 # execinfo.h and cxxabi.h only work using GNU gcc and Debug config
403 # assume that if we have execinfo.h, cxxabi.h is also present.
404 if(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_BUILD_TYPE STREQUAL Debug)
405 find_package(Execinfo)
408 # create the FOAMConfig.h file
409 configure_file(${CMAKE_SOURCE_DIR}/FOAMConfig.h.in
410 ${CMAKE_BINARY_DIR}/include/FOAMConfig.h @ONLY)
412 # on Solaris/SunOS fix up the shebangs
413 if(CMAKE_SYSTEM_NAME STREQUAL SunOS AND NOT EXISTS ${CMAKE_BINARY_DIR}/replaceAllShellSun.run)
414 message(STATUS "Fixing shell-interpreter for SunOS and Solaris")
416 COMMAND ${CMAKE_SOURCE_DIR}/data/utilities/replaceAllShellSun bin
417 COMMAND ${CMAKE_SOURCE_DIR}/data/utilities/replaceAllShellSun data
418 COMMAND ${CMAKE_SOURCE_DIR}/data/utilities/replaceAllShellSun tutorials
419 COMMAND ${CMAKE_SOURCE_DIR}/data/utilities/replaceAllShellSun doc
420 COMMAND ${CMAKE_COMMAND} -E touch${CMAKE_BINARY_DIR}/replaceAllShellSun.run
421 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
426 set(FOAM_COMPILE_DEFINITIONS
432 list(APPEND FOAM_COMPILE_DEFINITIONS -Ddarwin)
434 add_definitions(${FOAM_COMPILE_DEFINITIONS})
436 # set up include-directories for own headers
437 include_directories(${CMAKE_BINARY_DIR}/include)
439 # descend into the sources...
440 add_subdirectory(bin)
441 add_subdirectory(etc)
442 add_subdirectory(data)
443 add_subdirectory(src)
444 add_subdirectory(applications)
445 add_subdirectory(tutorials)
446 add_subdirectory(doc)
448 # export the library dependencies to the build tree
449 foam_export_targets_to_build_tree(${PROJECT_NAME}LibraryDepends)
450 export(PACKAGE ${PROJECT_NAME})
452 # write the doc index file and install it
453 foam_write_doc_index()
455 ${CMAKE_BINARY_DIR}/InstallFiles/data/DoxyDocIndex
456 DESTINATION ${FOAM_INSTALL_DATA_PATH}
460 # create ${PROJECT_NAME}Config.cmake ${PROJECT_NAME}Use.cmake,
461 # ${PROJECT_NAME}Utilities.cmake and ${PROJECT_NAME}WmakeCompatibility.cmake
462 # for the build and install tree
463 foam_configure_files(ConfigInstallFiles
464 "CMake/FOAMConfig.cmake.in==CMake/${PROJECT_NAME}Config.cmake"
465 "CMake/FOAMUse.cmake.in==CMake/${PROJECT_NAME}Use.cmake"
466 "CMake/FOAMWmakeCompatibility.cmake.in==CMake/${PROJECT_NAME}WmakeCompatibility.cmake"
468 "CMake/FOAMUtilities.cmake==CMake/${PROJECT_NAME}Utilities.cmake"
471 # install the CMake config files
473 ${ConfigInstallFiles}
474 DESTINATION ${FOAM_INSTALL_CMAKE_PATH}
478 # install the ${PROJECT_NAME}LibraryDepends.cmake file
479 install(EXPORT ${PROJECT_NAME}LibraryDepends
480 DESTINATION ${FOAM_INSTALL_CMAKE_PATH}
486 include(${CMAKE_SOURCE_DIR}/CMake/FOAMCPack.cmake)
490 "${CMAKE_SOURCE_DIR}/CMake/Modules/cmake_uninstall.cmake.in"
491 "${CMAKE_BINARY_DIR}/cmake_uninstall.cmake"
495 add_custom_target(uninstall
496 "${CMAKE_COMMAND}" -P "${CMAKE_BINARY_DIR}/cmake_uninstall.cmake"
499 # print cool feature summary
500 foam_print_feature_summary()
502 # ------------------------- vim: set sw=2 sts=2 et: --------------- end-of-file