ENH: Tweak CMake cache variables "advancedness"
[freefoam.git] / CMake / FOAMThirdPartyUtilities.cmake
blob8ba76f4d22e272c0d6a87abc97194915d19b3581
1 # - Utilities to build Third-Party libraries.
3 #  FOAM_THIRDPARTY_OPTION(<name> <description> <pkgname> <optional> <enabled>)
5 # Offers the user with options related to a third-party library. If <optional>
6 # is TRUE, the option FOAM_<UPPER_name>_ENABLED is created with the initial
7 # value <enabled> and the description given in <description>. If <optional>
8 # is FALSE, the option is not generated, and <description> can be the empty
9 # string and the value of <enabled> is meaningless. The function then first
10 # tries to find the package <pkgname> using FIND_PACKAGE(). Depending on the
11 # result, the function creates the option FOAM_BUILD_PRIVATE_<UPPER_name>
12 # with the default value set to FALSE if FIND_PACKAGE() found <pkgname>,
13 # or TRUE otherwise. Lastly an entry in the feature-summary table is made.
14 # All remaining arguments are considered to be variables that have to be
15 # purged using FOAM_DEPENDENT_VARIABLES() when FOAM_BUILD_PRIVATE_<UPPER_name>
16 # changes its value.
18 #  FOAM_EXTERNAL_PROJECT_ADD(<name> [options ...])
20 # Like ExternalProject_Add() with simplified patching, MD5 checking and cache
21 # initialization. You can use the PATCH_FILE <patch> option to specify one
22 # patch file which is to be applied to the sources. Note that patch must apply
23 # with the patch-option -p1.  If you want to compare a download against an MD5
24 # sum, use the MD5SUM <file> <sum> option to specify a file to check and the
25 # check-sum. The former should be a base-name, the download directory will be
26 # added automatically. CACHE_INIT can be used to specify a cache-initialization
27 # script.
29 #  FOAM_WRITE_CACHE_INIT(<fname> [<varname1> ...])
31 # Write a cache initializer file <fname> that can be used for external
32 # projects. The file will contain SET() commands that pre-populate the cache of
33 # the external project with the variables <varname1>...
36 #-------------------------------------------------------------------------------
37 #               ______                _     ____          __  __
38 #              |  ____|             _| |_  / __ \   /\   |  \/  |
39 #              | |__ _ __ ___  ___ /     \| |  | | /  \  | \  / |
40 #              |  __| '__/ _ \/ _ ( (| |) ) |  | |/ /\ \ | |\/| |
41 #              | |  | | |  __/  __/\_   _/| |__| / ____ \| |  | |
42 #              |_|  |_|  \___|\___|  |_|   \____/_/    \_\_|  |_|
44 #                   FreeFOAM: The Cross-Platform CFD Toolkit
46 # Copyright (C) 2008-2010 Michael Wild <themiwi@users.sf.net>
47 #                         Gerber van der Graaf <gerber_graaf@users.sf.net>
48 #-------------------------------------------------------------------------------
49 # License
50 #   This file is part of FreeFOAM.
52 #   FreeFOAM is free software; you can redistribute it and/or modify it
53 #   under the terms of the GNU General Public License as published by the
54 #   Free Software Foundation; either version 2 of the License, or (at your
55 #   option) any later version.
57 #   FreeFOAM is distributed in the hope that it will be useful, but WITHOUT
58 #   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
59 #   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
60 #   for more details.
62 #   You should have received a copy of the GNU General Public License
63 #   along with FreeFOAM; if not, write to the Free Software Foundation,
64 #   Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
66 # Description
67 #   Functions to build thirdparty libraries
69 #-------------------------------------------------------------------------------
71 # helper variables
72 set(_foam_sf_master "http://master.dl.sourceforge.net/project")
73 set(_foam_sf_url "${_foam_sf_master}/freefoam")
75 macro(foam_thirdparty_option name description
76     pkgname optional enable)
77   set(_tpo_name "${name}")
78   set(_tpo_description "${description}")
79   set(_tpo_pkgname "${pkgname}")
80   set(_tpo_optional "${optional}")
81   set(_tpo_enable "${enable}")
82   string(TOUPPER ${_tpo_name} _tpo_upper_name)
83   string(TOUPPER ${_tpo_pkgname} _tpo_upper_pkgname)
84   if(_tpo_optional)
85     foam_option(FOAM_ENABLE_${_tpo_upper_name} "Enable ${_tpo_name}"
86       "${_tpo_description}" ${_tpo_enable})
87   endif()
88   if(FOAM_ENABLE_${_tpo_upper_name} OR NOT _tpo_optional)
89     find_package(${_tpo_pkgname} QUIET)
90     if(${_tpo_upper_pkgname}_FOUND)
91       set(_tpo_private OFF)
92     else()
93       set(_tpo_private ON)
94     endif()
95     foam_option(FOAM_BUILD_PRIVATE_${_tpo_upper_name}
96       "Build private ${_tpo_name}"
97       "Download and compile ${_tpo_name} instead of searching in on the system"
98       ${_tpo_private})
99     foam_dependent_variables(FOAM_BUILD_PRIVATE_${_tpo_upper_name}
100       ${_tpo_upper_name}_INCLUDE_DIR ${_tpo_upper_name}_LIBRARY ${ARGN})
101     if(FOAM_BUILD_PRIVATE_${_tpo_upper_name})
102       foam_build_thirdparty(${_tpo_upper_name})
103     elseif(NOT ${_tpo_upper_pkgname}_FOUND)
104       # just to get the not-found-message on the screen
105       find_package(${_tpo_pkgname})
106       set(_tpo_msg
107         " If you have ${_tpo_name} installed, edit the variables beginning"
108         " with ${_tpo_upper_name}_ to refer to the installation or enable the"
109         " setting FOAM_BUILD_PRIVATE_${_tpo_upper_name} in the cache.\n"
110         )
111       if(_tpo_optional)
112         message(SEND_ERROR
113           "FOAM_ENABLE_${_tpo_upper_name} is TRUE, but ${_tpo_name} cannot be"
114           " found." ${_tpo_msg}
115           )
116       else()
117         message(SEND_ERROR
118           "${_tpo_name} is required but cannot be found.\n"
119           ${_tpo_msg}
120           )
121       endif()
122     else()
123       # just to get the found-message on the screen
124       find_package(${_tpo_pkgname})
125     endif()
126     mark_as_advanced(FOAM_BUILD_PRIVATE_${_tpo_upper_name})
127   endif()
128 endmacro()
130 include(ExternalProject)
132 find_program(PATCH_EXECUTABLE patch)
133 mark_as_advanced(PATCH_EXECUTABLE)
134 configure_file("${CMAKE_SOURCE_DIR}/CMake/foam_apply_patch.cmake.in"
135   "${CMAKE_BINARY_DIR}/CMake/foam_apply_patch.cmake" @ONLY)
137 function(foam_external_project_add name)
138   # argument parsing
139   foam_parse_arguments(_fepa
140     "CMAKE_ARGS;MD5SUM:2;CACHE_INIT:1;PATCH_FILE:1" "" "${ARGN}")
141   set(args "${_fepa_DEFAULT_ARGS}")
142   if(_fepa_PATCH_FILE)
143     if(NOT PATCH_EXECUTABLE)
144       message(SEND_ERROR "Required program `patch' not found")
145     endif()
146     list(APPEND args PATCH_COMMAND "${CMAKE_COMMAND}"
147       -DPATCH_FILE=${_fepa_PATCH_FILE}
148       -P "${CMAKE_BINARY_DIR}/CMake/foam_apply_patch.cmake")
149   endif()
150   if(_fepa_CMAKE_ARGS OR _fepa_CACHE_INIT)
151     list(APPEND args CMAKE_ARGS)
152     if(_fepa_CACHE_INIT)
153       list(APPEND args -C ${_fepa_CACHE_INIT})
154     endif()
155     list(APPEND args ${_fepa_CMAKE_ARGS})
156   endif()
157   ExternalProject_Add(${name} "${args}")
158   if(_fepa_MD5SUM)
159     list(GET _fepa_MD5SUM 0 md5file)
160     list(GET _fepa_MD5SUM 1 md5sum)
161     if(NOT md5file OR NOT md5sum)
162       message(SEND_ERROR "MD5SUM requires file and md5sum arguments")
163     endif()
164     ExternalProject_Get_Property(${name} download_dir stamp_dir)
165     file(WRITE "${stamp_dir}/md5check-${name}.cmake"
166 "execute_process(
167   COMMAND \"${CMAKE_COMMAND}\" -E md5sum \"${download_dir}/${md5file}\"
168   OUTPUT_VARIABLE md5sum_computed
169   OUTPUT_STRIP_TRAILING_WHITESPACE
170   )
171 string(REGEX REPLACE \" +.*$\" \"\" md5sum_computed \${md5sum_computed})
172 if(NOT md5sum_computed STREQUAL \"${md5sum}\")
173   message(FATAL_ERROR \"error: Mismatching MD5 sum for
174 ${download_dir}/${md5file}
175 Expected ${md5sum}
176 Got      \${md5sum_computed}\")
177 endif()
179     ExternalProject_Add_Step(${name} md5check
180       COMMENT "Checking MD5 sum for '${name}'"
181       COMMAND "${CMAKE_COMMAND}" -P "${stamp_dir}/md5check-${name}.cmake"
182       WORKING_DIRECTORY ${download_dir}
183       DEPENDEES download
184       DEPENDERS patch
185       )
186   endif()
187 endfunction()
189 function(_foam_append_init_var strvar)
190   foreach(varname ${ARGN})
191     get_property(type CACHE ${varname} PROPERTY TYPE)
192     get_property(help CACHE ${varname} PROPERTY HELPSTRING)
193     if(NOT type)
194       set(type STRING)
195     endif()
196     if(NOT help)
197       set(help "Set by CMake")
198     endif()
199     set(${strvar}
200       "${${strvar}}\nset(${varname} \"${${varname}}\" CACHE ${type} \"${help}\")")
201   endforeach()
202   set(${strvar} "${${strvar}}" PARENT_SCOPE)
203 endfunction()
205 function(foam_write_cache_init fname)
206   set(FOAM_CONFIGURABLE_CONTENT)
207   if(CMAKE_CONFIGURATION_TYPES)
208     string(TOUPPER "${CMAKE_CONFIGURATION_TYPES}" config_types)
209   else()
210     set(config_types DEBUG RELEASE RELWITHDEBINFO MINSIZEREL)
211   endif()
212   foreach(lang C CXX)
213     # make sure that the static libraries are suitable to be used in shared
214     # libraries
215     set(CMAKE_${lang}_FLAGS "${CMAKE_SHARED_LIBRARY_${lang}_FLAGS}")
216     _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT
217       CMAKE_${lang}_COMPILER CMAKE_${lang}_FLAGS)
218     foreach(config ${config_types})
219       _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT
220         CMAKE_${lang}_FLAGS_${config})
221     endforeach()
222   endforeach()
223   foreach(type EXE MODULE SHARED)
224     _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT CMAKE_${type}_LINKER_FLAGS)
225     foreach(config ${config_types})
226       _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT
227         CMAKE_${type}_LINKER_FLAGS_${config})
228     endforeach()
229   endforeach()
230   _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT
231     A2X_EXECUTABLE ASCIIDOC_EXECUTABLE BISON_EXECUTABLE CMAKE_AR
232     CMAKE_BUILD_TYPE CMAKE_COLOR_MAKEFILE CMAKE_HAVE_HP_CMA CMAKE_HAVE_SPROC_H
233     CMAKE_HAVE_THR_CREATE CMAKE_INSTALL_NAME_TOOL CMAKE_LINKER
234     CMAKE_MAKE_PROGRAM CMAKE_NM CMAKE_OBJCOPY CMAKE_OBJDUMP
235     CMAKE_OSX_ARCHITECTURES CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT
236     CMAKE_RANLIB CMAKE_SKIP_RPATH CMAKE_STRIP CMAKE_USE_RELATIVE_PATHS
237     CMAKE_VERBOSE_MAKEFILE FLEX_CXX_FLAGS FLEX_EXECUTABLE FL_LIBRARY MPIEXEC
238     MPIEXEC_MAX_NUMPROCS MPIEXEC_NUMPROC_FLAG MPIEXEC_POSTFLAGS
239     MPIEXEC_PREFLAGS MPI_COMPILER MPI_COMPILE_FLAGS MPI_EXTRA_LIBRARY
240     MPI_INCLUDE_PATH MPI_LIBRARY MPI_LINK_FLAGS ZLIB_INCLUDE_DIR ZLIB_LIBRARY)
241   configure_file(
242     "${CMAKE_SOURCE_DIR}/CMake/FOAMConfigurableFile.in" "${fname}" @ONLY)
243 endfunction()
245 # build metis
246 function(foam_build_metis)
247   find_package(Threads REQUIRED)
248   _foam_ep_download_if_required(download_opts
249     "http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/metis-5.0pre2.tar.gz"
250     "5b6946bdd7c8a68cd37aabbc4c31c8ae"
251     )
252   foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/METIS/metis_init.cmake")
253   foam_external_project_add(METIS
254     PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/METIS
255     ${download_opts}
256     PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/metis.patch"
257     CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/METIS/metis_init.cmake"
258     CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/METIS"
259     )
260   # create imported library
261   ExternalProject_Get_Property(METIS prefix)
262   add_library(foam_metis STATIC IMPORTED)
263   set_target_properties(foam_metis PROPERTIES
264     IMPORTED_LOCATION
265     "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_metis${CMAKE_STATIC_LIBRARY_SUFFIX}"
266     )
267   # FindMETIS compatibility
268   set(METIS_INCLUDE_DIRS
269     ${CMAKE_BINARY_DIR}/ThirdParty/METIS/include PARENT_SCOPE)
270   set(METIS_LIBRARIES foam_metis PARENT_SCOPE)
271   set(METIS_LINK_FLAGS PARENT_SCOPE)
272   # mark it for removal from the interface libraries by foam_install_targets
273   set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_metis)
274 endfunction()
276 # build parmetis
277 function(foam_build_parmetis)
278   find_package(Threads REQUIRED)
279   _foam_ep_download_if_required(download_opts
280     "http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis/ParMetis-3.1.tar.gz"
281     "15f252eabc397a8c2f56fa1f5ed91354"
282     )
283   foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/ParMetis/parmetis_init.cmake")
284   foam_external_project_add(ParMetis
285     PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/ParMetis
286     ${download_opts}
287     PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/parmetis.patch"
288     CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/ParMetis/parmetis_init.cmake"
289     CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/ParMetis"
290     )
291   # create imported library
292   ExternalProject_Get_Property(ParMetis prefix)
293   add_library(foam_parmetis STATIC IMPORTED)
294   set_target_properties(foam_parmetis PROPERTIES
295     IMPORTED_LOCATION
296     "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_parmetis${CMAKE_STATIC_LIBRARY_SUFFIX}"
297     )
298   # FindPARMETIS compatibility
299   set(PARMETIS_INCLUDE_DIRS
300     ${CMAKE_BINARY_DIR}/ThirdParty/ParMetis/include PARENT_SCOPE)
301   set(PARMETIS_LIBRARIES foam_parmetis ${MPI_LIBRARIES} PARENT_SCOPE)
302   set(PARMETIS_COMPILE_FLAGS "${MPIL_COMPILE_FLAGS}" PARENT_SCOPE)
303   set(PARMETIS_LINK_FLAGS "${MPIL_LINK_FLAGS}" PARENT_SCOPE)
304   # mark it for removal from the interface libraries by foam_install_targets
305   set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_parmetis)
306 endfunction()
308 # build ccmio
309 function(foam_build_ccmio)
310   set(filename libccmio-2.6.1.tar.gz)
311   set(URL "https://wci.llnl.gov/codes/visit/3rd_party/${filename}")
312   _foam_ep_download_if_required(download_opts
313     "${URL}"
314     "f81fbdfb960b1a4f3bcc7feee491efe4"
315     )
316   list(FIND download_opts DOWNLOAD_COMMAND download_cmd)
317   if(download_cmd EQUAL -1)
318     # the file is not local, remove the URL
319     set(is_local FALSE)
320     list(REMOVE_AT download_opts 0 1)
321     find_package(Wget)
322     find_program(CURL_EXECUTABLE curl)
323     mark_as_advanced(CURL_EXECUTABLE)
324     set(filepath "${CMAKE_BINARY_DIR}/ThirdParty/ccmio/src/${filename}")
325     if(WGET_FOUND)
326       list(INSERT download_opts 0 DOWNLOAD_COMMAND
327         "${WGET_EXECUTABLE}" --no-check-certificate -O "${filename}" ${URL})
328     elseif(CURL_EXECUTABLE)
329       list(INSERT download_opts 0 DOWNLOAD_COMMAND
330         "${CURL_EXECUTABLE}" --insecure -o "${filename}" ${URL})
331     else()
332       message(SEND_ERROR "Cannot download ${URL}\n"
333         "Please do so manually and place the file in\n"
334         "${CMAKE_SOURCE_DIR}/ThirdParty/${filename}")
335     endif()
336   else()
337     set(is_local TRUE)
338     set(filepath "${CMAKE_SOURCE_DIR}/ThirdParty/${filename}")
339   endif()
340   foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/ccmio/ccmio_init.cmake")
341   foam_external_project_add(ccmio
342     PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/ccmio
343     ${download_opts}
344     PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/ccmio.patch"
345     CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/ccmio/ccmio_init.cmake"
346     CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/ccmio"
347     )
348   # have to manually unpack..
349   ExternalProject_Get_Property(ccmio source_dir download_dir stamp_dir tmp_dir)
350   file(WRITE "${stamp_dir}/extract-ccmio.cmake"
351 "# Make file names absolute:
353 get_filename_component(tmp_dir \"${tmp_dir}\" ABSOLUTE)
354 get_filename_component(source_dir \"${source_dir}\" ABSOLUTE)
356 message(STATUS \"extracting...
357      src='${filepath}'
358      dst='\${source_dir}'\")
360 # Prepare a space for extracting:
362 set(i 1)
363 while(EXISTS \"\${tmp_dir}/extract\${i}\")
364   math(EXPR i \"\${i} + 1\")
365 endwhile()
366 set(ut_dir \"\${tmp_dir}/extract\${i}\")
367 file(MAKE_DIRECTORY \"\${ut_dir}\")
369 # Extract it:
371 message(STATUS \"extracting... [tar xzf]\")
372 execute_process(COMMAND \"\${CMAKE_COMMAND}\" -E tar xzf ${filepath}
373   WORKING_DIRECTORY \${ut_dir}
374   RESULT_VARIABLE rv)
376 if(NOT rv EQUAL 0)
377   message(STATUS \"extracting... [error clean up]\")
378   file(REMOVE_RECURSE \"\${ut_dir}\")
379   message(FATAL_ERROR \"error: extract of '${filepath}' failed\")
380 endif()
382 # Analyze what came out of the tar file:
384 message(STATUS \"extracting... [analysis]\")
385 file(GLOB contents \"\${ut_dir}/*\")
386 list(LENGTH contents n)
387 if(NOT n EQUAL 1 OR NOT IS_DIRECTORY \"\${contents}\")
388   set(contents \"\${ut_dir}\")
389 endif()
391 # Copy \"the one\" directory to the final directory:
393 message(STATUS \"extracting... [copy]\")
394 file(COPY \"\${contents}/\" DESTINATION \${source_dir})
396 # Clean up:
398 message(STATUS \"extracting... [clean up]\")
399 file(REMOVE_RECURSE \"\${ut_dir}\")
401 message(STATUS \"extracting... done\")
404   if(is_local)
405     set(md5file-dep)
406     set(md5check)
407   else()
408     set(md5file-dep DEPENDS "${download_dir}/${md5file}")
409     set(md5check ${md5check})
410   endif()
411   ExternalProject_Add_Step(ccmio unpack
412     COMMENT "Performing extraction step for 'ccmio'"
413     COMMAND "${CMAKE_COMMAND}" -P "${stamp_dir}/extract-ccmio.cmake"
414     WORKING_DIRECTORY ${download_dir}
415     DEPENDEES download ${md5check}
416     DEPENDERS patch
417     ${md5file-dep}
418     )
419   # create imported library
420   ExternalProject_Get_Property(ccmio prefix)
421   add_library(foam_ccmio STATIC IMPORTED)
422   set_target_properties(foam_ccmio PROPERTIES
423     IMPORTED_LOCATION
424     "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_ccmio${CMAKE_STATIC_LIBRARY_SUFFIX}"
425     )
426   # FindCcmio compatibility
427   set(CCMIO_INCLUDE_DIRS
428     ${CMAKE_BINARY_DIR}/ThirdParty/ccmio/include PARENT_SCOPE)
429   set(CCMIO_LIBRARIES foam_ccmio PARENT_SCOPE)
430   # mark it for removal from the interface libraries by foam_install_targets
431   set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_ccmio)
432 endfunction()
434 # build mgridgen
435 function(foam_build_mgridgen)
436   _foam_ep_download_if_required(download_opts
437     "http://www-users.cs.umn.edu/~moulitsa/download/ParMGridGen-1.0.tar.gz"
438     "2872fa95b7fb91d6bd525490eed62038"
439     )
440   foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/MGridGen/mgridgen_init.cmake")
441   foam_external_project_add(MGridGen
442     PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/MGridGen
443     ${download_opts}
444     PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/mgridgen.patch"
445     CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/MGridGen/mgridgen_init.cmake"
446     CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/MGridGen"
447     )
448   # create imported library
449   ExternalProject_Get_Property(MGridGen prefix)
450   add_library(foam_mgridgen STATIC IMPORTED)
451   set_target_properties(foam_mgridgen PROPERTIES
452     IMPORTED_LOCATION
453     "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_mgridgen${CMAKE_STATIC_LIBRARY_SUFFIX}"
454     )
455   # FindMGRIDGEN compatibility
456   set(MGRIDGEN_INCLUDE_DIRS
457     ${CMAKE_BINARY_DIR}/ThirdParty/MGridGen/include PARENT_SCOPE)
458   set(MGRIDGEN_LIBRARIES foam_mgridgen PARENT_SCOPE)
459   set(PARMETIS_LINK_FLAGS PARENT_SCOPE)
460   # mark it for removal from the interface libraries by foam_install_targets
461   set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_mgridgen)
462 endfunction()
464 # build scotch
465 function(foam_build_scotch)
466   find_package(BISON REQUIRED)
467   find_package(FLEX REQUIRED)
468   find_package(Threads)
469   _foam_ep_download_if_required(download_opts
470     "${_foam_sf_url}/ThirdParty/scotch/scotch_5.1.7.dfsg.orig.tar.gz"
471     "53d9715e11ae8e4cec1a48e8859e817f"
472     )
473   foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/scotch/scotch_init.cmake")
474   foam_external_project_add(scotch
475     PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/scotch
476     ${download_opts}
477     PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/scotch.patch"
478     CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/scotch/scotch_init.cmake"
479     CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/scotch"
480     )
481   # create imported library
482   ExternalProject_Get_Property(scotch prefix)
483   add_library(foam_scotch STATIC IMPORTED)
484   set_target_properties(foam_scotch PROPERTIES
485     IMPORTED_LOCATION
486     "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_scotch${CMAKE_STATIC_LIBRARY_SUFFIX}"
487     )
488   # FindSCOTCH compatibility
489   set(SCOTCH_INCLUDE_DIRS
490     ${CMAKE_BINARY_DIR}/ThirdParty/scotch/include PARENT_SCOPE)
491   set(SCOTCH_LIBRARIES foam_scotch PARENT_SCOPE)
492   # mark it for removal from the interface libraries by foam_install_targets
493   set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_scotch)
494 endfunction()
496 # build zlib
497 function(foam_build_zlib)
498   _foam_ep_download_if_required(download_opts
499     "${_foam_sf_url}/ThirdParty/zlib/zlib-1.2.5.tar.gz"
500     "c735eab2d659a96e5a594c9e8541ad63"
501     )
502   foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/zlib/zlib_init.cmake")
503   foam_external_project_add(ZLIB
504     PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/zlib
505     ${download_opts}
506     PATCH_COMMAND "${CMAKE_COMMAND}" -E remove -f zconf.h
507     CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/zlib/zlib_init.cmake"
508     CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/zlib"
509                "-DBUILD_SHARED_LIBS=OFF"
510     )
511   # create imported library
512   ExternalProject_Get_Property(ZLIB prefix)
513   add_library(foam_zlib STATIC IMPORTED)
514   set_target_properties(foam_zlib PROPERTIES
515     IMPORTED_LOCATION
516     "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}z${CMAKE_STATIC_LIBRARY_SUFFIX}"
517     )
518   # FindZLIB compatibility
519   set(ZLIB_INCLUDE_DIRS
520     ${CMAKE_BINARY_DIR}/ThirdParty/zlib/include PARENT_SCOPE)
521   set(ZLIB_LIBRARIES foam_zlib PARENT_SCOPE)
522   # mark it for removal from the interface libraries by foam_install_targets
523   set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_zlib)
524 endfunction()
526 # build MathJax
527 function(foam_build_mathjax)
528   set(install_dir ${CMAKE_BINARY_DIR}/doc/MathJax)
529   _foam_ep_download_if_required(download_opts
530     "${_foam_sf_master}/mathjax/MathJax/v1.0.1/MathJax-v1.0.1a.zip"
531     "b93c1f1e26a898faee072ab7aec57251"
532     )
533   foam_external_project_add(MathJax-PreFontUpdate
534     PREFIX "${CMAKE_BINARY_DIR}/ThirdParty/MathJax"
535     ${download_opts}
536     CONFIGURE_COMMAND ""
537     BUILD_COMMAND ""
538     INSTALL_DIR "${install_dir}"
539     INSTALL_COMMAND "${CMAKE_COMMAND}" -E copy_directory
540       <SOURCE_DIR> <INSTALL_DIR>
541     )
542   ExternalProject_Add_Step(MathJax-PreFontUpdate fontCleanup
543     COMMENT "Removing broken web fonts in MathJax"
544     COMMAND "${CMAKE_COMMAND}" -E remove_directory
545       "${install_dir}/MathJax/fonts/HTML-CSS/TeX/otf"
546     DEPENDEES install
547     )
548   _foam_ep_download_if_required(download_opts
549     "http://www.mathjax.org/dl/MathJax-Font-Update.zip"
550     "03ce6b5a62cfb9a8a8d205aea2e6997e"
551     )
552   # download & install font update
553   foam_external_project_add(MathJax-FontUpdate
554     DEPENDS MathJax-PreFontUpdate
555     PREFIX "${CMAKE_BINARY_DIR}/ThirdParty/MathJax-FontUpdate"
556     ${download_opts}
557     CONFIGURE_COMMAND ""
558     BUILD_COMMAND ""
559     INSTALL_DIR "${install_dir}/fonts/HTML-CSS/TeX/otf"
560     INSTALL_COMMAND "${CMAKE_COMMAND}" -E copy_directory
561       <SOURCE_DIR>/MathJax-Font-Update/otf <INSTALL_DIR>
562     )
563   add_custom_target(MathJax)
564   add_dependencies(MathJax MathJax-FontUpdate)
565   # FindMathJax compatibility
566   set(MATHJAX_DIR "${install_dir}" PARENT_SCOPE)
567 endfunction()
569 # build third-party library
570 macro(foam_build_thirdparty _btp_what)
571   if(${_btp_what} STREQUAL METIS)
572     foam_build_metis()
573   elseif(${_btp_what} STREQUAL PARMETIS)
574     foam_build_parmetis()
575   elseif(${_btp_what} STREQUAL CCMIO)
576     foam_build_ccmio()
577   elseif(${_btp_what} STREQUAL MGRIDGEN)
578     foam_build_mgridgen()
579   elseif(${_btp_what} STREQUAL SCOTCH)
580     foam_build_scotch()
581   elseif(${_btp_what} STREQUAL ZLIB)
582     foam_build_zlib()
583   elseif(${_btp_what} STREQUAL MATHJAX)
584     foam_build_mathjax()
585   else()
586     message(FATAL_ERROR "Unknown third-party package ${_btp_what}")
587   endif()
588 endmacro()
590 # Assemble download options for foam_external_project_add.
591 # If the file already exists in ${CMAKE_SOURCE_DIR}/ThirdParty and the MD5SUM
592 # matches, don't download it.
593 function(_foam_ep_download_if_required var url md5sum)
594   string(REGEX REPLACE "^.*/" "" filename "${url}")
595   set(filepath "${CMAKE_SOURCE_DIR}/ThirdParty/${filename}")
596   if(EXISTS "${filepath}")
597     execute_process(
598       COMMAND "${CMAKE_COMMAND}" -E md5sum "${filepath}"
599       OUTPUT_VARIABLE md5sum_computed
600       OUTPUT_STRIP_TRAILING_WHITESPACE
601       )
602     string(REGEX REPLACE " +.*$" "" md5sum_computed ${md5sum_computed})
603     if(md5sum_computed STREQUAL "${md5sum}")
604       # it's already there and the MD5 sum matches
605       set(${var} URL "${filepath}" DOWNLOAD_COMMAND "" PARENT_SCOPE)
606     else()
607       message(SEND_ERROR "error: Mismatching MD5 sum for\n"
608         "${filepath}\nExpected ${md5sum}\nGot      ${md5sum_computed}\n"
609         "Either re-download the file from\n${url}\n"
610         "or delete it and CMake will download it for you")
611     endif()
612   else()
613     # use ExternalCommand to download it
614     set(${var} URL "${url}" MD5SUM "${filename}" "${md5sum}" PARENT_SCOPE)
615   endif()
616 endfunction()
618 # ------------------------- vim: set sw=2 sts=2 et: --------------- end-of-file