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>
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
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 #-------------------------------------------------------------------------------
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 #-------------------------------------------------------------------------------
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
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
67 # Functions to build thirdparty libraries
69 #-------------------------------------------------------------------------------
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)
85 foam_option(FOAM_ENABLE_${_tpo_upper_name} "Enable ${_tpo_name}"
86 "${_tpo_description}" ${_tpo_enable})
88 if(FOAM_ENABLE_${_tpo_upper_name} OR NOT _tpo_optional)
89 find_package(${_tpo_pkgname} QUIET)
90 if(${_tpo_upper_pkgname}_FOUND)
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"
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})
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"
113 "FOAM_ENABLE_${_tpo_upper_name} is TRUE, but ${_tpo_name} cannot be"
114 " found." ${_tpo_msg}
118 "${_tpo_name} is required but cannot be found.\n"
123 # just to get the found-message on the screen
124 find_package(${_tpo_pkgname})
126 mark_as_advanced(FOAM_BUILD_PRIVATE_${_tpo_upper_name})
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)
139 foam_parse_arguments(_fepa
140 "CMAKE_ARGS;MD5SUM:2;CACHE_INIT:1;PATCH_FILE:1" "" "${ARGN}")
141 set(args "${_fepa_DEFAULT_ARGS}")
143 if(NOT PATCH_EXECUTABLE)
144 message(SEND_ERROR "Required program `patch' not found")
146 list(APPEND args PATCH_COMMAND "${CMAKE_COMMAND}"
147 -DPATCH_FILE=${_fepa_PATCH_FILE}
148 -P "${CMAKE_BINARY_DIR}/CMake/foam_apply_patch.cmake")
150 if(_fepa_CMAKE_ARGS OR _fepa_CACHE_INIT)
151 list(APPEND args CMAKE_ARGS)
153 list(APPEND args -C ${_fepa_CACHE_INIT})
155 list(APPEND args ${_fepa_CMAKE_ARGS})
157 ExternalProject_Add(${name} "${args}")
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")
164 ExternalProject_Get_Property(${name} download_dir stamp_dir)
165 file(WRITE "${stamp_dir}/md5check-${name}.cmake"
167 COMMAND \"${CMAKE_COMMAND}\" -E md5sum \"${download_dir}/${md5file}\"
168 OUTPUT_VARIABLE md5sum_computed
169 OUTPUT_STRIP_TRAILING_WHITESPACE
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}
176 Got \${md5sum_computed}\")
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}
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)
197 set(help "Set by CMake")
200 "${${strvar}}\nset(${varname} \"${${varname}}\" CACHE ${type} \"${help}\")")
202 set(${strvar} "${${strvar}}" PARENT_SCOPE)
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)
210 set(config_types DEBUG RELEASE RELWITHDEBINFO MINSIZEREL)
213 # make sure that the static libraries are suitable to be used in shared
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})
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})
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)
242 "${CMAKE_SOURCE_DIR}/CMake/FOAMConfigurableFile.in" "${fname}" @ONLY)
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"
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
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"
260 # create imported library
261 ExternalProject_Get_Property(METIS prefix)
262 add_library(foam_metis STATIC IMPORTED)
263 set_target_properties(foam_metis PROPERTIES
265 "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_metis${CMAKE_STATIC_LIBRARY_SUFFIX}"
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)
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"
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
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"
291 # create imported library
292 ExternalProject_Get_Property(ParMetis prefix)
293 add_library(foam_parmetis STATIC IMPORTED)
294 set_target_properties(foam_parmetis PROPERTIES
296 "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_parmetis${CMAKE_STATIC_LIBRARY_SUFFIX}"
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)
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
314 "f81fbdfb960b1a4f3bcc7feee491efe4"
316 list(FIND download_opts DOWNLOAD_COMMAND download_cmd)
317 if(download_cmd EQUAL -1)
318 # the file is not local, remove the URL
320 list(REMOVE_AT download_opts 0 1)
322 find_program(CURL_EXECUTABLE curl)
323 mark_as_advanced(CURL_EXECUTABLE)
324 set(filepath "${CMAKE_BINARY_DIR}/ThirdParty/ccmio/src/${filename}")
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})
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}")
338 set(filepath "${CMAKE_SOURCE_DIR}/ThirdParty/${filename}")
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
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"
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...
358 dst='\${source_dir}'\")
360 # Prepare a space for extracting:
363 while(EXISTS \"\${tmp_dir}/extract\${i}\")
364 math(EXPR i \"\${i} + 1\")
366 set(ut_dir \"\${tmp_dir}/extract\${i}\")
367 file(MAKE_DIRECTORY \"\${ut_dir}\")
371 message(STATUS \"extracting... [tar xzf]\")
372 execute_process(COMMAND \"\${CMAKE_COMMAND}\" -E tar xzf ${filepath}
373 WORKING_DIRECTORY \${ut_dir}
377 message(STATUS \"extracting... [error clean up]\")
378 file(REMOVE_RECURSE \"\${ut_dir}\")
379 message(FATAL_ERROR \"error: extract of '${filepath}' failed\")
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}\")
391 # Copy \"the one\" directory to the final directory:
393 message(STATUS \"extracting... [copy]\")
394 file(COPY \"\${contents}/\" DESTINATION \${source_dir})
398 message(STATUS \"extracting... [clean up]\")
399 file(REMOVE_RECURSE \"\${ut_dir}\")
401 message(STATUS \"extracting... done\")
408 set(md5file-dep DEPENDS "${download_dir}/${md5file}")
409 set(md5check ${md5check})
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}
419 # create imported library
420 ExternalProject_Get_Property(ccmio prefix)
421 add_library(foam_ccmio STATIC IMPORTED)
422 set_target_properties(foam_ccmio PROPERTIES
424 "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_ccmio${CMAKE_STATIC_LIBRARY_SUFFIX}"
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)
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"
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
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"
448 # create imported library
449 ExternalProject_Get_Property(MGridGen prefix)
450 add_library(foam_mgridgen STATIC IMPORTED)
451 set_target_properties(foam_mgridgen PROPERTIES
453 "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_mgridgen${CMAKE_STATIC_LIBRARY_SUFFIX}"
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)
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"
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
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"
481 # create imported library
482 ExternalProject_Get_Property(scotch prefix)
483 add_library(foam_scotch STATIC IMPORTED)
484 set_target_properties(foam_scotch PROPERTIES
486 "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_scotch${CMAKE_STATIC_LIBRARY_SUFFIX}"
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)
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"
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
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"
511 # create imported library
512 ExternalProject_Get_Property(ZLIB prefix)
513 add_library(foam_zlib STATIC IMPORTED)
514 set_target_properties(foam_zlib PROPERTIES
516 "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}z${CMAKE_STATIC_LIBRARY_SUFFIX}"
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)
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"
533 foam_external_project_add(MathJax-PreFontUpdate
534 PREFIX "${CMAKE_BINARY_DIR}/ThirdParty/MathJax"
538 INSTALL_DIR "${install_dir}"
539 INSTALL_COMMAND "${CMAKE_COMMAND}" -E copy_directory
540 <SOURCE_DIR> <INSTALL_DIR>
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"
548 _foam_ep_download_if_required(download_opts
549 "http://www.mathjax.org/dl/MathJax-Font-Update.zip"
550 "03ce6b5a62cfb9a8a8d205aea2e6997e"
552 # download & install font update
553 foam_external_project_add(MathJax-FontUpdate
554 DEPENDS MathJax-PreFontUpdate
555 PREFIX "${CMAKE_BINARY_DIR}/ThirdParty/MathJax-FontUpdate"
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>
563 add_custom_target(MathJax)
564 add_dependencies(MathJax MathJax-FontUpdate)
565 # FindMathJax compatibility
566 set(MATHJAX_DIR "${install_dir}" PARENT_SCOPE)
569 # build third-party library
570 macro(foam_build_thirdparty _btp_what)
571 if(${_btp_what} STREQUAL METIS)
573 elseif(${_btp_what} STREQUAL PARMETIS)
574 foam_build_parmetis()
575 elseif(${_btp_what} STREQUAL CCMIO)
577 elseif(${_btp_what} STREQUAL MGRIDGEN)
578 foam_build_mgridgen()
579 elseif(${_btp_what} STREQUAL SCOTCH)
581 elseif(${_btp_what} STREQUAL ZLIB)
583 elseif(${_btp_what} STREQUAL MATHJAX)
586 message(FATAL_ERROR "Unknown third-party package ${_btp_what}")
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}")
598 COMMAND "${CMAKE_COMMAND}" -E md5sum "${filepath}"
599 OUTPUT_VARIABLE md5sum_computed
600 OUTPUT_STRIP_TRAILING_WHITESPACE
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)
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")
613 # use ExternalCommand to download it
614 set(${var} URL "${url}" MD5SUM "${filename}" "${md5sum}" PARENT_SCOPE)
618 # ------------------------- vim: set sw=2 sts=2 et: --------------- end-of-file