FIX: Python exception handling across different versions
[freefoam.git] / CMake / FOAMThirdPartyUtilities.cmake
blob85bff3d25059e8471a72c9c8e667801f6fb1b235
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 URL_MD5 <sum> option to specify a file to check and the
25 # check-sum. CACHE_INIT can be used to specify a cache-initialization script.
27 #  FOAM_WRITE_CACHE_INIT(<fname> [<varname1> ...])
29 # Write a cache initializer file <fname> that can be used for external
30 # projects. The file will contain SET() commands that pre-populate the cache of
31 # the external project with the variables <varname1>...
34 #-------------------------------------------------------------------------------
35 #               ______                _     ____          __  __
36 #              |  ____|             _| |_  / __ \   /\   |  \/  |
37 #              | |__ _ __ ___  ___ /     \| |  | | /  \  | \  / |
38 #              |  __| '__/ _ \/ _ ( (| |) ) |  | |/ /\ \ | |\/| |
39 #              | |  | | |  __/  __/\_   _/| |__| / ____ \| |  | |
40 #              |_|  |_|  \___|\___|  |_|   \____/_/    \_\_|  |_|
42 #                   FreeFOAM: The Cross-Platform CFD Toolkit
44 # Copyright (C) 2008-2012 Michael Wild <themiwi@users.sf.net>
45 #                         Gerber van der Graaf <gerber_graaf@users.sf.net>
46 #-------------------------------------------------------------------------------
47 # License
48 #   This file is part of FreeFOAM.
50 #   FreeFOAM is free software: you can redistribute it and/or modify it
51 #   under the terms of the GNU General Public License as published by the
52 #   Free Software Foundation, either version 3 of the License, or (at your
53 #   option) any later version.
55 #   FreeFOAM is distributed in the hope that it will be useful, but WITHOUT
56 #   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
57 #   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
58 #   for more details.
60 #   You should have received a copy of the GNU General Public License
61 #   along with FreeFOAM.  If not, see <http://www.gnu.org/licenses/>.
63 # Description
64 #   Functions to build thirdparty libraries
66 #-------------------------------------------------------------------------------
68 # helper variables
69 set(_foam_sf_master "http://master.dl.sourceforge.net/project")
70 set(_foam_sf_url "${_foam_sf_master}/freefoam")
72 macro(foam_thirdparty_option name description
73     pkgname optional enable)
74   set(_tpo_name "${name}")
75   set(_tpo_description "${description}")
76   set(_tpo_pkgname "${pkgname}")
77   set(_tpo_optional "${optional}")
78   set(_tpo_enable "${enable}")
79   string(TOUPPER ${_tpo_name} _tpo_upper_name)
80   string(TOUPPER ${_tpo_pkgname} _tpo_upper_pkgname)
81   if(_tpo_optional)
82     foam_option(FOAM_ENABLE_${_tpo_upper_name} "Enable ${_tpo_name}"
83       "${_tpo_description}" ${_tpo_enable})
84   endif()
85   if(FOAM_ENABLE_${_tpo_upper_name} OR NOT _tpo_optional)
86     if(NOT FOAM_BUILD_PRIVATE_${_tpo_upper_name})
87       find_package(${_tpo_pkgname} QUIET)
88       if(${_tpo_upper_pkgname}_FOUND)
89         set(_tpo_private OFF)
90       else()
91         set(_tpo_private ON)
92       endif()
93     else()
94       set(_tpo_private ON)
95     endif()
96     foam_option(FOAM_BUILD_PRIVATE_${_tpo_upper_name}
97       "Build private ${_tpo_name}"
98       "Download and compile ${_tpo_name} instead of searching in on the system"
99       ${_tpo_private})
100     foam_dependent_variables(FOAM_BUILD_PRIVATE_${_tpo_upper_name}
101       ${_tpo_upper_name}_INCLUDE_DIR ${_tpo_upper_name}_LIBRARY ${ARGN})
102     if(FOAM_BUILD_PRIVATE_${_tpo_upper_name})
103       foam_build_thirdparty(${_tpo_upper_name})
104     elseif(NOT ${_tpo_upper_pkgname}_FOUND)
105       # just to get the not-found-message on the screen
106       find_package(${_tpo_pkgname})
107       set(_tpo_msg
108         " If you have ${_tpo_name} installed, edit the variables beginning"
109         " with ${_tpo_upper_name}_ to refer to the installation or enable the"
110         " setting FOAM_BUILD_PRIVATE_${_tpo_upper_name} in the cache.\n"
111         )
112       if(_tpo_optional)
113         message(SEND_ERROR
114           "FOAM_ENABLE_${_tpo_upper_name} is TRUE, but ${_tpo_name} cannot be"
115           " found." ${_tpo_msg}
116           )
117       else()
118         message(SEND_ERROR
119           "${_tpo_name} is required but cannot be found.\n"
120           ${_tpo_msg}
121           )
122       endif()
123     else()
124       # just to get the found-message on the screen
125       find_package(${_tpo_pkgname})
126     endif()
127     mark_as_advanced(FOAM_BUILD_PRIVATE_${_tpo_upper_name})
128   endif()
129 endmacro()
131 include(ExternalProject)
133 find_program(PATCH_EXECUTABLE patch)
134 mark_as_advanced(PATCH_EXECUTABLE)
135 configure_file("${CMAKE_SOURCE_DIR}/CMake/foam_apply_patch.cmake.in"
136   "${CMAKE_BINARY_DIR}/CMake/foam_apply_patch.cmake" @ONLY)
138 function(foam_external_project_add name)
139   # argument parsing
140   foam_parse_arguments(_fepa
141     "CMAKE_ARGS;CACHE_INIT:1;PATCH_FILE:1" "" "${ARGN}")
142   set(args "${_fepa_DEFAULT_ARGS}")
143   if(_fepa_PATCH_FILE)
144     if(NOT PATCH_EXECUTABLE)
145       message(SEND_ERROR "Required program `patch' not found")
146     endif()
147     list(APPEND args PATCH_COMMAND "${CMAKE_COMMAND}"
148       -DPATCH_FILE=${_fepa_PATCH_FILE}
149       -P "${CMAKE_BINARY_DIR}/CMake/foam_apply_patch.cmake")
150   endif()
151   if(_fepa_CMAKE_ARGS OR _fepa_CACHE_INIT)
152     list(APPEND args CMAKE_ARGS)
153     if(_fepa_CACHE_INIT)
154       list(APPEND args -C ${_fepa_CACHE_INIT})
155     endif()
156     list(APPEND args ${_fepa_CMAKE_ARGS})
157   endif()
158   ExternalProject_Add(${name} "${args}")
159 endfunction()
161 function(_foam_append_init_var strvar)
162   foreach(varname ${ARGN})
163     get_property(type CACHE ${varname} PROPERTY TYPE)
164     get_property(help CACHE ${varname} PROPERTY HELPSTRING)
165     if(NOT type)
166       set(type STRING)
167     endif()
168     if(NOT help)
169       set(help "Set by CMake")
170     endif()
171     set(${strvar}
172       "${${strvar}}\nset(${varname} \"${${varname}}\" CACHE ${type} \"${help}\")")
173   endforeach()
174   set(${strvar} "${${strvar}}" PARENT_SCOPE)
175 endfunction()
177 function(foam_write_cache_init fname)
178   set(FOAM_CONFIGURABLE_CONTENT)
179   if(CMAKE_CONFIGURATION_TYPES)
180     string(TOUPPER "${CMAKE_CONFIGURATION_TYPES}" config_types)
181   else()
182     set(config_types DEBUG RELEASE RELWITHDEBINFO MINSIZEREL)
183   endif()
184   foreach(lang C CXX)
185     # make sure that the static libraries are suitable to be used in shared
186     # libraries
187     set(CMAKE_${lang}_FLAGS "${CMAKE_SHARED_LIBRARY_${lang}_FLAGS}")
188     _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT
189       CMAKE_${lang}_COMPILER CMAKE_${lang}_FLAGS)
190     foreach(config ${config_types})
191       _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT
192         CMAKE_${lang}_FLAGS_${config})
193     endforeach()
194   endforeach()
195   foreach(type EXE MODULE SHARED)
196     _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT CMAKE_${type}_LINKER_FLAGS)
197     foreach(config ${config_types})
198       _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT
199         CMAKE_${type}_LINKER_FLAGS_${config})
200     endforeach()
201   endforeach()
202   _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT
203     A2X_EXECUTABLE ASCIIDOC_EXECUTABLE BISON_EXECUTABLE CMAKE_AR
204     CMAKE_BUILD_TYPE CMAKE_COLOR_MAKEFILE CMAKE_HAVE_HP_CMA CMAKE_HAVE_SPROC_H
205     CMAKE_HAVE_THR_CREATE CMAKE_INSTALL_NAME_TOOL CMAKE_LINKER
206     CMAKE_MAKE_PROGRAM CMAKE_NM CMAKE_OBJCOPY CMAKE_OBJDUMP
207     CMAKE_OSX_ARCHITECTURES CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT
208     CMAKE_RANLIB CMAKE_SKIP_RPATH CMAKE_STRIP CMAKE_USE_RELATIVE_PATHS
209     CMAKE_VERBOSE_MAKEFILE FLEX_CXX_FLAGS FLEX_EXECUTABLE FL_LIBRARY MPIEXEC
210     MPIEXEC_MAX_NUMPROCS MPIEXEC_NUMPROC_FLAG MPIEXEC_POSTFLAGS
211     MPIEXEC_PREFLAGS MPI_COMPILER MPI_COMPILE_FLAGS MPI_EXTRA_LIBRARY
212     MPI_INCLUDE_PATH MPI_LIBRARY MPI_LINK_FLAGS ZLIB_INCLUDE_DIR ZLIB_LIBRARY)
213   configure_file(
214     "${CMAKE_SOURCE_DIR}/CMake/FOAMConfigurableFile.in" "${fname}" @ONLY)
215 endfunction()
217 # build metis
218 function(foam_build_metis)
219   find_package(Threads REQUIRED)
220   _foam_ep_download_if_required(download_opts
221     "http://freefoam.sf.net/nonfree/metis-5.0.1.tar.gz"
222     "6daba5e64ed86d46e038437eda720532"
223     )
224   foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/METIS/metis_init.cmake")
225   foam_external_project_add(METIS
226     PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/METIS
227     ${download_opts}
228     CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/METIS/metis_init.cmake"
229     CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/METIS"
230        "-DGKLIB_PATH:PATH=<SOURCE_DIR>/GKlib"
231     )
232   # create imported library
233   ExternalProject_Get_Property(METIS prefix)
234   add_library(foam_metis STATIC IMPORTED)
235   set_target_properties(foam_metis PROPERTIES
236     IMPORTED_LOCATION
237     "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}metis${CMAKE_STATIC_LIBRARY_SUFFIX}"
238     )
239   # FindMETIS compatibility
240   set(METIS_INCLUDE_DIRS
241     ${CMAKE_BINARY_DIR}/ThirdParty/METIS/include PARENT_SCOPE)
242   set(METIS_LIBRARIES foam_metis PARENT_SCOPE)
243   set(METIS_LINK_FLAGS PARENT_SCOPE)
244   set(METIS_NEW_API TRUE PARENT_SCOPE)
245   # mark it for removal from the interface libraries by foam_install_targets
246   set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_metis)
247 endfunction()
249 # build parmetis
250 function(foam_build_parmetis)
251   find_package(Threads REQUIRED)
252   _foam_ep_download_if_required(download_opts
253     "http://freefoam.sf.net/nonfree/ParMetis-3.1.tar.gz"
254     "15f252eabc397a8c2f56fa1f5ed91354"
255     )
256   foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/ParMetis/parmetis_init.cmake")
257   foam_external_project_add(ParMetis
258     PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/ParMetis
259     ${download_opts}
260     PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/parmetis.patch"
261     CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/ParMetis/parmetis_init.cmake"
262     CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/ParMetis"
263     )
264   # create imported library
265   ExternalProject_Get_Property(ParMetis prefix)
266   add_library(foam_parmetis STATIC IMPORTED)
267   set_target_properties(foam_parmetis PROPERTIES
268     IMPORTED_LOCATION
269     "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_parmetis${CMAKE_STATIC_LIBRARY_SUFFIX}"
270     )
271   # FindPARMETIS compatibility
272   set(PARMETIS_INCLUDE_DIRS
273     ${CMAKE_BINARY_DIR}/ThirdParty/ParMetis/include PARENT_SCOPE)
274   set(PARMETIS_LIBRARIES foam_parmetis ${MPI_LIBRARIES} PARENT_SCOPE)
275   set(PARMETIS_COMPILE_FLAGS "${MPIL_COMPILE_FLAGS}" PARENT_SCOPE)
276   set(PARMETIS_LINK_FLAGS "${MPIL_LINK_FLAGS}" PARENT_SCOPE)
277   # mark it for removal from the interface libraries by foam_install_targets
278   set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_parmetis)
279 endfunction()
281 # build ccmio
282 function(foam_build_ccmio)
283   set(filename libccmio-2.6.1.tar.gz)
284   set(URL "http://freefoam.sf.net/nonfree/${filename}")
285   _foam_ep_download_if_required(download_opts
286     "${URL}"
287     "f81fbdfb960b1a4f3bcc7feee491efe4"
288     )
289   list(FIND download_opts DOWNLOAD_COMMAND download_cmd)
290   if(download_cmd EQUAL -1)
291     # the file is not local, remove the URL
292     set(is_local FALSE)
293     list(REMOVE_AT download_opts 0 1)
294     find_package(Wget)
295     find_program(CURL_EXECUTABLE curl)
296     mark_as_advanced(CURL_EXECUTABLE)
297     set(filepath "${CMAKE_BINARY_DIR}/ThirdParty/ccmio/src/${filename}")
298     if(WGET_FOUND)
299       list(INSERT download_opts 0 DOWNLOAD_COMMAND
300         "${WGET_EXECUTABLE}" --no-check-certificate -O "${filename}" ${URL})
301     elseif(CURL_EXECUTABLE)
302       list(INSERT download_opts 0 DOWNLOAD_COMMAND
303         "${CURL_EXECUTABLE}" --insecure --location -o "${filename}" ${URL})
304     else()
305       message(SEND_ERROR "Cannot download ${URL}\n"
306         "Please do so manually and place the file in\n"
307         "${CMAKE_SOURCE_DIR}/ThirdParty/${filename}")
308     endif()
309   else()
310     set(is_local TRUE)
311     set(filepath "${CMAKE_SOURCE_DIR}/ThirdParty/${filename}")
312   endif()
313   foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/ccmio/ccmio_init.cmake")
314   foam_external_project_add(ccmio
315     PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/ccmio
316     ${download_opts}
317     PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/ccmio.patch"
318     CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/ccmio/ccmio_init.cmake"
319     CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/ccmio"
320     )
321   # have to manually unpack..
322   ExternalProject_Get_Property(ccmio source_dir download_dir stamp_dir tmp_dir)
323   file(WRITE "${stamp_dir}/extract-ccmio.cmake"
324 "# Make file names absolute:
326 get_filename_component(tmp_dir \"${tmp_dir}\" ABSOLUTE)
327 get_filename_component(source_dir \"${source_dir}\" ABSOLUTE)
329 message(STATUS \"extracting...
330      src='${filepath}'
331      dst='\${source_dir}'\")
333 # Prepare a space for extracting:
335 set(i 1)
336 while(EXISTS \"\${tmp_dir}/extract\${i}\")
337   math(EXPR i \"\${i} + 1\")
338 endwhile()
339 set(ut_dir \"\${tmp_dir}/extract\${i}\")
340 file(MAKE_DIRECTORY \"\${ut_dir}\")
342 # Extract it:
344 message(STATUS \"extracting... [tar xzf]\")
345 execute_process(COMMAND \"\${CMAKE_COMMAND}\" -E tar xzf ${filepath}
346   WORKING_DIRECTORY \${ut_dir}
347   RESULT_VARIABLE rv)
349 if(NOT rv EQUAL 0)
350   message(STATUS \"extracting... [error clean up]\")
351   file(REMOVE_RECURSE \"\${ut_dir}\")
352   message(FATAL_ERROR \"error: extract of '${filepath}' failed\")
353 endif()
355 # Analyze what came out of the tar file:
357 message(STATUS \"extracting... [analysis]\")
358 file(GLOB contents \"\${ut_dir}/*\")
359 list(LENGTH contents n)
360 if(NOT n EQUAL 1 OR NOT IS_DIRECTORY \"\${contents}\")
361   set(contents \"\${ut_dir}\")
362 endif()
364 # Copy \"the one\" directory to the final directory:
366 message(STATUS \"extracting... [copy]\")
367 file(COPY \"\${contents}/\" DESTINATION \${source_dir})
369 # Clean up:
371 message(STATUS \"extracting... [clean up]\")
372 file(REMOVE_RECURSE \"\${ut_dir}\")
374 message(STATUS \"extracting... done\")
377   ExternalProject_Add_Step(ccmio unpack
378     COMMENT "Performing extraction step for 'ccmio'"
379     COMMAND "${CMAKE_COMMAND}" -P "${stamp_dir}/extract-ccmio.cmake"
380     WORKING_DIRECTORY ${download_dir}
381     DEPENDEES download
382     DEPENDERS patch
383     )
384   # create imported library
385   ExternalProject_Get_Property(ccmio prefix)
386   add_library(foam_ccmio STATIC IMPORTED)
387   set_target_properties(foam_ccmio PROPERTIES
388     IMPORTED_LOCATION
389     "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_ccmio${CMAKE_STATIC_LIBRARY_SUFFIX}"
390     )
391   # FindCcmio compatibility
392   set(CCMIO_INCLUDE_DIRS
393     ${CMAKE_BINARY_DIR}/ThirdParty/ccmio/include PARENT_SCOPE)
394   set(CCMIO_LIBRARIES foam_ccmio PARENT_SCOPE)
395   # mark it for removal from the interface libraries by foam_install_targets
396   set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_ccmio)
397 endfunction()
399 # build mgridgen
400 function(foam_build_mgridgen)
401   _foam_ep_download_if_required(download_opts
402     "http://freefoam.sf.net/nonfree/ParMGridGen-1.0.tar.gz"
403     "2872fa95b7fb91d6bd525490eed62038"
404     )
405   foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/MGridGen/mgridgen_init.cmake")
406   foam_external_project_add(MGridGen
407     PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/MGridGen
408     ${download_opts}
409     PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/mgridgen.patch"
410     CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/MGridGen/mgridgen_init.cmake"
411     CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/MGridGen"
412     )
413   # create imported library
414   ExternalProject_Get_Property(MGridGen prefix)
415   add_library(foam_mgridgen STATIC IMPORTED)
416   set_target_properties(foam_mgridgen PROPERTIES
417     IMPORTED_LOCATION
418     "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_mgridgen${CMAKE_STATIC_LIBRARY_SUFFIX}"
419     )
420   # FindMGRIDGEN compatibility
421   set(MGRIDGEN_INCLUDE_DIRS
422     ${CMAKE_BINARY_DIR}/ThirdParty/MGridGen/include PARENT_SCOPE)
423   set(MGRIDGEN_LIBRARIES foam_mgridgen PARENT_SCOPE)
424   set(PARMETIS_LINK_FLAGS PARENT_SCOPE)
425   # mark it for removal from the interface libraries by foam_install_targets
426   set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_mgridgen)
427 endfunction()
429 # build scotch
430 function(foam_build_scotch)
431   find_package(BISON REQUIRED)
432   find_package(FLEX REQUIRED)
433   find_package(Threads)
434   _foam_ep_download_if_required(download_opts
435     "${_foam_sf_url}/ThirdParty/scotch/scotch_5.1.7.dfsg.orig.tar.gz"
436     "53d9715e11ae8e4cec1a48e8859e817f"
437     )
438   foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/scotch/scotch_init.cmake")
439   foam_external_project_add(scotch
440     PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/scotch
441     ${download_opts}
442     PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/scotch.patch"
443     CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/scotch/scotch_init.cmake"
444     CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/scotch"
445     )
446   # create imported library
447   ExternalProject_Get_Property(scotch prefix)
448   add_library(foam_scotch STATIC IMPORTED)
449   set_target_properties(foam_scotch PROPERTIES
450     IMPORTED_LOCATION
451     "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_scotch${CMAKE_STATIC_LIBRARY_SUFFIX}"
452     )
453   # FindSCOTCH compatibility
454   set(SCOTCH_INCLUDE_DIRS
455     ${CMAKE_BINARY_DIR}/ThirdParty/scotch/include PARENT_SCOPE)
456   set(SCOTCH_LIBRARIES foam_scotch PARENT_SCOPE)
457   # mark it for removal from the interface libraries by foam_install_targets
458   set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_scotch)
459 endfunction()
461 # build zlib
462 function(foam_build_zlib)
463   _foam_ep_download_if_required(download_opts
464     "${_foam_sf_url}/ThirdParty/zlib/zlib-1.2.5.tar.gz"
465     "c735eab2d659a96e5a594c9e8541ad63"
466     )
467   foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/zlib/zlib_init.cmake")
468   foam_external_project_add(ZLIB
469     PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/zlib
470     ${download_opts}
471     PATCH_COMMAND "${CMAKE_COMMAND}" -E remove -f zconf.h
472     CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/zlib/zlib_init.cmake"
473     CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/zlib"
474                "-DBUILD_SHARED_LIBS=OFF"
475     )
476   # create imported library
477   ExternalProject_Get_Property(ZLIB prefix)
478   add_library(foam_zlib STATIC IMPORTED)
479   set_target_properties(foam_zlib PROPERTIES
480     IMPORTED_LOCATION
481     "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}z${CMAKE_STATIC_LIBRARY_SUFFIX}"
482     )
483   # FindZLIB compatibility
484   set(ZLIB_INCLUDE_DIRS
485     ${CMAKE_BINARY_DIR}/ThirdParty/zlib/include PARENT_SCOPE)
486   set(ZLIB_LIBRARIES foam_zlib PARENT_SCOPE)
487   # mark it for removal from the interface libraries by foam_install_targets
488   set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_zlib)
489 endfunction()
491 # build MathJax
492 function(foam_build_mathjax)
493   set(install_dir ${CMAKE_BINARY_DIR}/doc/MathJax)
494   _foam_ep_download_if_required(download_opts
495     "${_foam_sf_master}/mathjax/MathJax/v1.0.1/MathJax-v1.0.1a.zip"
496     "b93c1f1e26a898faee072ab7aec57251"
497     )
498   foam_external_project_add(MathJax-PreFontUpdate
499     PREFIX "${CMAKE_BINARY_DIR}/ThirdParty/MathJax"
500     ${download_opts}
501     CONFIGURE_COMMAND ""
502     BUILD_COMMAND ""
503     INSTALL_DIR "${install_dir}"
504     INSTALL_COMMAND "${CMAKE_COMMAND}" -E copy_directory
505       <SOURCE_DIR> <INSTALL_DIR>
506     )
507   ExternalProject_Add_Step(MathJax-PreFontUpdate fontCleanup
508     COMMENT "Removing broken web fonts in MathJax"
509     COMMAND "${CMAKE_COMMAND}" -E remove_directory
510       "${install_dir}/MathJax/fonts/HTML-CSS/TeX/otf"
511     DEPENDEES install
512     )
513   _foam_ep_download_if_required(download_opts
514     "http://www.mathjax.org/dl/MathJax-Font-Update.zip"
515     "03ce6b5a62cfb9a8a8d205aea2e6997e"
516     )
517   # download & install font update
518   foam_external_project_add(MathJax-FontUpdate
519     DEPENDS MathJax-PreFontUpdate
520     PREFIX "${CMAKE_BINARY_DIR}/ThirdParty/MathJax-FontUpdate"
521     ${download_opts}
522     CONFIGURE_COMMAND ""
523     BUILD_COMMAND ""
524     INSTALL_DIR "${install_dir}/fonts/HTML-CSS/TeX/otf"
525     INSTALL_COMMAND "${CMAKE_COMMAND}" -E copy_directory
526       <SOURCE_DIR>/MathJax-Font-Update/otf <INSTALL_DIR>
527     )
528   add_custom_target(MathJax)
529   add_dependencies(MathJax MathJax-FontUpdate)
530   # FindMathJax compatibility
531   set(MATHJAX_DIR "${install_dir}" PARENT_SCOPE)
532 endfunction()
534 # build third-party library
535 macro(foam_build_thirdparty _btp_what)
536   if(${_btp_what} STREQUAL METIS)
537     foam_build_metis()
538   elseif(${_btp_what} STREQUAL PARMETIS)
539     foam_build_parmetis()
540   elseif(${_btp_what} STREQUAL CCMIO)
541     foam_build_ccmio()
542   elseif(${_btp_what} STREQUAL MGRIDGEN)
543     foam_build_mgridgen()
544   elseif(${_btp_what} STREQUAL SCOTCH)
545     foam_build_scotch()
546   elseif(${_btp_what} STREQUAL ZLIB)
547     foam_build_zlib()
548   elseif(${_btp_what} STREQUAL MATHJAX)
549     foam_build_mathjax()
550   else()
551     message(FATAL_ERROR "Unknown third-party package ${_btp_what}")
552   endif()
553 endmacro()
555 # Assemble download options for foam_external_project_add.
556 # If the file already exists in ${CMAKE_SOURCE_DIR}/ThirdParty, don't download
557 # it.
558 function(_foam_ep_download_if_required var url md5sum)
559   string(REGEX REPLACE "^.*/" "" filename "${url}")
560   set(filepath "${CMAKE_SOURCE_DIR}/ThirdParty/${filename}")
561   if(EXISTS "${filepath}")
562     # it's already in ${CMAKE_SOURCE_DIR}/ThirdParty
563     set(${var} URL "${filepath}" URL_MD5 "${md5sum}" DOWNLOAD_COMMAND ""
564       PARENT_SCOPE)
565   else()
566     # use ExternalCommand to download it
567     set(${var} URL "${url}" URL_MD5 "${md5sum}" PARENT_SCOPE)
568   endif()
569 endfunction()
571 # ------------------------- vim: set sw=2 sts=2 et: --------------- end-of-file