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})
87 mark_as_advanced(FOAM_ENABLE_${_tpo_upper_name})
89 if(FOAM_ENABLE_${_tpo_upper_name} OR NOT _tpo_optional)
90 find_package(${_tpo_pkgname} QUIET)
91 if(${_tpo_upper_pkgname}_FOUND)
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"
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})
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"
114 "FOAM_ENABLE_${_tpo_upper_name} is TRUE, but ${_tpo_name} cannot be"
115 " found." ${_tpo_msg}
119 "${_tpo_name} is required but cannot be found.\n"
124 # just to get the found-message on the screen
125 find_package(${_tpo_pkgname})
127 mark_as_advanced(FOAM_BUILD_PRIVATE_${_tpo_upper_name})
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)
140 foam_parse_arguments(_fepa
141 "CMAKE_ARGS;MD5SUM:2;CACHE_INIT:1;PATCH_FILE:1" "" "${ARGN}")
142 set(args "${_fepa_DEFAULT_ARGS}")
144 if(NOT PATCH_EXECUTABLE)
145 message(SEND_ERROR "Required program `patch' not found")
147 list(APPEND args PATCH_COMMAND "${CMAKE_COMMAND}"
148 -DPATCH_FILE=${_fepa_PATCH_FILE}
149 -P "${CMAKE_BINARY_DIR}/CMake/foam_apply_patch.cmake")
151 if(_fepa_CMAKE_ARGS OR _fepa_CACHE_INIT)
152 list(APPEND args CMAKE_ARGS)
154 list(APPEND args -C ${_fepa_CACHE_INIT})
156 list(APPEND args ${_fepa_CMAKE_ARGS})
158 ExternalProject_Add(${name} "${args}")
160 list(GET _fepa_MD5SUM 0 md5file)
161 list(GET _fepa_MD5SUM 1 md5sum)
162 if(NOT md5file OR NOT md5sum)
163 message(SEND_ERROR "MD5SUM requires file and md5sum arguments")
165 ExternalProject_Get_Property(${name} download_dir stamp_dir)
166 file(WRITE "${stamp_dir}/md5check-${name}.cmake"
168 COMMAND \"${CMAKE_COMMAND}\" -E md5sum \"${download_dir}/${md5file}\"
169 OUTPUT_VARIABLE md5sum_computed
170 OUTPUT_STRIP_TRAILING_WHITESPACE
172 string(REGEX REPLACE \" +.*$\" \"\" md5sum_computed \${md5sum_computed})
173 if(NOT md5sum_computed STREQUAL \"${md5sum}\")
174 message(FATAL_ERROR \"error: Mismatching MD5 sum for
175 ${download_dir}/${md5file}
177 Got \${md5sum_computed}\")
180 ExternalProject_Add_Step(${name} md5check
181 COMMENT "Checking MD5 sum for '${name}'"
182 COMMAND "${CMAKE_COMMAND}" -P "${stamp_dir}/md5check-${name}.cmake"
183 WORKING_DIRECTORY ${download_dir}
190 function(_foam_append_init_var strvar)
191 foreach(varname ${ARGN})
192 get_property(type CACHE ${varname} PROPERTY TYPE)
193 get_property(help CACHE ${varname} PROPERTY HELPSTRING)
198 set(help "Set by CMake")
201 "${${strvar}}\nset(${varname} \"${${varname}}\" CACHE ${type} \"${help}\")")
203 set(${strvar} "${${strvar}}" PARENT_SCOPE)
206 function(foam_write_cache_init fname)
207 set(FOAM_CONFIGURABLE_CONTENT)
208 if(CMAKE_CONFIGURATION_TYPES)
209 string(TOUPPER "${CMAKE_CONFIGURATION_TYPES}" config_types)
211 set(config_types DEBUG RELEASE RELWITHDEBINFO MINSIZEREL)
214 # make sure that the static libraries are suitable to be used in shared
216 set(CMAKE_${lang}_FLAGS "${CMAKE_SHARED_LIBRARY_${lang}_FLAGS}")
217 _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT
218 CMAKE_${lang}_COMPILER CMAKE_${lang}_FLAGS)
219 foreach(config ${config_types})
220 _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT
221 CMAKE_${lang}_FLAGS_${config})
224 foreach(type EXE MODULE SHARED)
225 _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT CMAKE_${type}_LINKER_FLAGS)
226 foreach(config ${config_types})
227 _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT
228 CMAKE_${type}_LINKER_FLAGS_${config})
231 _foam_append_init_var(FOAM_CONFIGURABLE_CONTENT
232 A2X_EXECUTABLE ASCIIDOC_EXECUTABLE BISON_EXECUTABLE CMAKE_AR
233 CMAKE_BUILD_TYPE CMAKE_COLOR_MAKEFILE CMAKE_HAVE_HP_CMA CMAKE_HAVE_SPROC_H
234 CMAKE_HAVE_THR_CREATE CMAKE_INSTALL_NAME_TOOL CMAKE_LINKER
235 CMAKE_MAKE_PROGRAM CMAKE_NM CMAKE_OBJCOPY CMAKE_OBJDUMP
236 CMAKE_OSX_ARCHITECTURES CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT
237 CMAKE_RANLIB CMAKE_SKIP_RPATH CMAKE_STRIP CMAKE_USE_RELATIVE_PATHS
238 CMAKE_VERBOSE_MAKEFILE FLEX_CXX_FLAGS FLEX_EXECUTABLE FL_LIBRARY MPIEXEC
239 MPIEXEC_MAX_NUMPROCS MPIEXEC_NUMPROC_FLAG MPIEXEC_POSTFLAGS
240 MPIEXEC_PREFLAGS MPI_COMPILER MPI_COMPILE_FLAGS MPI_EXTRA_LIBRARY
241 MPI_INCLUDE_PATH MPI_LIBRARY MPI_LINK_FLAGS ZLIB_INCLUDE_DIR ZLIB_LIBRARY)
243 "${CMAKE_SOURCE_DIR}/CMake/FOAMConfigurableFile.in" "${fname}" @ONLY)
247 function(foam_build_metis)
248 find_package(Threads REQUIRED)
249 _foam_ep_download_if_required(download_opts
250 "http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/metis-5.0pre2.tar.gz"
251 "5b6946bdd7c8a68cd37aabbc4c31c8ae"
253 foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/METIS/metis_init.cmake")
254 foam_external_project_add(METIS
255 PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/METIS
257 PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/metis.patch"
258 CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/METIS/metis_init.cmake"
259 CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/METIS"
261 # create imported library
262 ExternalProject_Get_Property(METIS prefix)
263 add_library(foam_metis STATIC IMPORTED)
264 set_target_properties(foam_metis PROPERTIES
266 "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_metis${CMAKE_STATIC_LIBRARY_SUFFIX}"
268 # FindMETIS compatibility
269 set(METIS_INCLUDE_DIRS
270 ${CMAKE_BINARY_DIR}/ThirdParty/METIS/include PARENT_SCOPE)
271 set(METIS_LIBRARIES foam_metis PARENT_SCOPE)
272 set(METIS_LINK_FLAGS PARENT_SCOPE)
273 # mark it for removal from the interface libraries by foam_install_targets
274 set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_metis)
278 function(foam_build_parmetis)
279 find_package(Threads REQUIRED)
280 _foam_ep_download_if_required(download_opts
281 "http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis/ParMetis-3.1.tar.gz"
282 "15f252eabc397a8c2f56fa1f5ed91354"
284 foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/ParMetis/parmetis_init.cmake")
285 foam_external_project_add(ParMetis
286 PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/ParMetis
288 PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/parmetis.patch"
289 CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/ParMetis/parmetis_init.cmake"
290 CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/ParMetis"
292 # create imported library
293 ExternalProject_Get_Property(ParMetis prefix)
294 add_library(foam_parmetis STATIC IMPORTED)
295 set_target_properties(foam_parmetis PROPERTIES
297 "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_parmetis${CMAKE_STATIC_LIBRARY_SUFFIX}"
299 # FindPARMETIS compatibility
300 set(PARMETIS_INCLUDE_DIRS
301 ${CMAKE_BINARY_DIR}/ThirdParty/ParMetis/include PARENT_SCOPE)
302 set(PARMETIS_LIBRARIES foam_parmetis ${MPI_LIBRARIES} PARENT_SCOPE)
303 set(PARMETIS_COMPILE_FLAGS "${MPIL_COMPILE_FLAGS}" PARENT_SCOPE)
304 set(PARMETIS_LINK_FLAGS "${MPIL_LINK_FLAGS}" PARENT_SCOPE)
305 # mark it for removal from the interface libraries by foam_install_targets
306 set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_parmetis)
310 function(foam_build_ccmio)
311 set(filename libccmio-2.6.1.tar.gz)
312 set(URL "https://wci.llnl.gov/codes/visit/3rd_party/${filename}")
313 _foam_ep_download_if_required(download_opts
315 "f81fbdfb960b1a4f3bcc7feee491efe4"
317 list(FIND download_opts DOWNLOAD_COMMAND download_cmd)
318 if(download_cmd EQUAL -1)
319 # the file is not local, remove the URL
321 list(REMOVE_AT download_opts 0 1)
323 find_program(CURL_EXECUTABLE curl)
324 mark_as_advanced(CURL_EXECUTABLE)
325 set(filepath "${CMAKE_BINARY_DIR}/ThirdParty/ccmio/src/${filename}")
327 list(INSERT download_opts 0 DOWNLOAD_COMMAND
328 "${WGET_EXECUTABLE}" --no-check-certificate -O "${filename}" ${URL})
329 elseif(CURL_EXECUTABLE)
330 list(INSERT download_opts 0 DOWNLOAD_COMMAND
331 "${CURL_EXECUTABLE}" --insecure -o "${filename}" ${URL})
333 message(SEND_ERROR "Cannot download ${URL}\n"
334 "Please do so manually and place the file in\n"
335 "${CMAKE_SOURCE_DIR}/ThirdParty/${filename}")
339 set(filepath "${CMAKE_SOURCE_DIR}/ThirdParty/${filename}")
341 foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/ccmio/ccmio_init.cmake")
342 foam_external_project_add(ccmio
343 PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/ccmio
345 PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/ccmio.patch"
346 CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/ccmio/ccmio_init.cmake"
347 CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/ccmio"
349 # have to manually unpack..
350 ExternalProject_Get_Property(ccmio source_dir download_dir stamp_dir tmp_dir)
351 file(WRITE "${stamp_dir}/extract-ccmio.cmake"
352 "# Make file names absolute:
354 get_filename_component(tmp_dir \"${tmp_dir}\" ABSOLUTE)
355 get_filename_component(source_dir \"${source_dir}\" ABSOLUTE)
357 message(STATUS \"extracting...
359 dst='\${source_dir}'\")
361 # Prepare a space for extracting:
364 while(EXISTS \"\${tmp_dir}/extract\${i}\")
365 math(EXPR i \"\${i} + 1\")
367 set(ut_dir \"\${tmp_dir}/extract\${i}\")
368 file(MAKE_DIRECTORY \"\${ut_dir}\")
372 message(STATUS \"extracting... [tar xzf]\")
373 execute_process(COMMAND \"\${CMAKE_COMMAND}\" -E tar xzf ${filepath}
374 WORKING_DIRECTORY \${ut_dir}
378 message(STATUS \"extracting... [error clean up]\")
379 file(REMOVE_RECURSE \"\${ut_dir}\")
380 message(FATAL_ERROR \"error: extract of '${filepath}' failed\")
383 # Analyze what came out of the tar file:
385 message(STATUS \"extracting... [analysis]\")
386 file(GLOB contents \"\${ut_dir}/*\")
387 list(LENGTH contents n)
388 if(NOT n EQUAL 1 OR NOT IS_DIRECTORY \"\${contents}\")
389 set(contents \"\${ut_dir}\")
392 # Copy \"the one\" directory to the final directory:
394 message(STATUS \"extracting... [copy]\")
395 file(COPY \"\${contents}/\" DESTINATION \${source_dir})
399 message(STATUS \"extracting... [clean up]\")
400 file(REMOVE_RECURSE \"\${ut_dir}\")
402 message(STATUS \"extracting... done\")
409 set(md5file-dep DEPENDS "${download_dir}/${md5file}")
410 set(md5check ${md5check})
412 ExternalProject_Add_Step(ccmio unpack
413 COMMENT "Performing extraction step for 'ccmio'"
414 COMMAND "${CMAKE_COMMAND}" -P "${stamp_dir}/extract-ccmio.cmake"
415 WORKING_DIRECTORY ${download_dir}
416 DEPENDEES download ${md5check}
420 # create imported library
421 ExternalProject_Get_Property(ccmio prefix)
422 add_library(foam_ccmio STATIC IMPORTED)
423 set_target_properties(foam_ccmio PROPERTIES
425 "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_ccmio${CMAKE_STATIC_LIBRARY_SUFFIX}"
427 # FindCcmio compatibility
428 set(CCMIO_INCLUDE_DIRS
429 ${CMAKE_BINARY_DIR}/ThirdParty/ccmio/include PARENT_SCOPE)
430 set(CCMIO_LIBRARIES foam_ccmio PARENT_SCOPE)
431 # mark it for removal from the interface libraries by foam_install_targets
432 set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_ccmio)
436 function(foam_build_mgridgen)
437 _foam_ep_download_if_required(download_opts
438 "http://www-users.cs.umn.edu/~moulitsa/download/ParMGridGen-1.0.tar.gz"
439 "2872fa95b7fb91d6bd525490eed62038"
441 foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/MGridGen/mgridgen_init.cmake")
442 foam_external_project_add(MGridGen
443 PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/MGridGen
445 PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/mgridgen.patch"
446 CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/MGridGen/mgridgen_init.cmake"
447 CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/MGridGen"
449 # create imported library
450 ExternalProject_Get_Property(MGridGen prefix)
451 add_library(foam_mgridgen STATIC IMPORTED)
452 set_target_properties(foam_mgridgen PROPERTIES
454 "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_mgridgen${CMAKE_STATIC_LIBRARY_SUFFIX}"
456 # FindMGRIDGEN compatibility
457 set(MGRIDGEN_INCLUDE_DIRS
458 ${CMAKE_BINARY_DIR}/ThirdParty/MGridGen/include PARENT_SCOPE)
459 set(MGRIDGEN_LIBRARIES foam_mgridgen PARENT_SCOPE)
460 set(PARMETIS_LINK_FLAGS PARENT_SCOPE)
461 # mark it for removal from the interface libraries by foam_install_targets
462 set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_mgridgen)
466 function(foam_build_scotch)
467 find_package(BISON REQUIRED)
468 find_package(FLEX REQUIRED)
469 find_package(Threads)
470 _foam_ep_download_if_required(download_opts
471 "${_foam_sf_url}/ThirdParty/scotch/scotch_5.1.7.dfsg.orig.tar.gz"
472 "53d9715e11ae8e4cec1a48e8859e817f"
474 foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/scotch/scotch_init.cmake")
475 foam_external_project_add(scotch
476 PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/scotch
478 PATCH_FILE "${CMAKE_SOURCE_DIR}/ThirdParty/scotch.patch"
479 CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/scotch/scotch_init.cmake"
480 CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/scotch"
482 # create imported library
483 ExternalProject_Get_Property(scotch prefix)
484 add_library(foam_scotch STATIC IMPORTED)
485 set_target_properties(foam_scotch PROPERTIES
487 "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}foam_scotch${CMAKE_STATIC_LIBRARY_SUFFIX}"
489 # FindSCOTCH compatibility
490 set(SCOTCH_INCLUDE_DIRS
491 ${CMAKE_BINARY_DIR}/ThirdParty/scotch/include PARENT_SCOPE)
492 set(SCOTCH_LIBRARIES foam_scotch PARENT_SCOPE)
493 # mark it for removal from the interface libraries by foam_install_targets
494 set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_scotch)
498 function(foam_build_zlib)
499 _foam_ep_download_if_required(download_opts
500 "${_foam_sf_url}/ThirdParty/zlib/zlib-1.2.5.tar.gz"
501 "c735eab2d659a96e5a594c9e8541ad63"
503 foam_write_cache_init("${CMAKE_BINARY_DIR}/ThirdParty/zlib/zlib_init.cmake")
504 foam_external_project_add(ZLIB
505 PREFIX ${CMAKE_BINARY_DIR}/ThirdParty/zlib
507 PATCH_COMMAND "${CMAKE_COMMAND}" -E remove -f zconf.h
508 CACHE_INIT "${CMAKE_BINARY_DIR}/ThirdParty/zlib/zlib_init.cmake"
509 CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ThirdParty/zlib"
510 "-DBUILD_SHARED_LIBS=OFF"
512 # create imported library
513 ExternalProject_Get_Property(ZLIB prefix)
514 add_library(foam_zlib STATIC IMPORTED)
515 set_target_properties(foam_zlib PROPERTIES
517 "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}z${CMAKE_STATIC_LIBRARY_SUFFIX}"
519 # FindZLIB compatibility
520 set(ZLIB_INCLUDE_DIRS
521 ${CMAKE_BINARY_DIR}/ThirdParty/zlib/include PARENT_SCOPE)
522 set(ZLIB_LIBRARIES foam_zlib PARENT_SCOPE)
523 # mark it for removal from the interface libraries by foam_install_targets
524 set_property(GLOBAL APPEND PROPERTY FOAM_THIRDPARTY_LIBRARIES foam_zlib)
528 function(foam_build_mathjax)
529 set(install_dir ${CMAKE_BINARY_DIR}/doc/MathJax)
530 _foam_ep_download_if_required(download_opts
531 "${_foam_sf_master}/mathjax/MathJax/v1.0.1/MathJax-v1.0.1a.zip"
532 "b93c1f1e26a898faee072ab7aec57251"
534 foam_external_project_add(MathJax-PreFontUpdate
535 PREFIX "${CMAKE_BINARY_DIR}/ThirdParty/MathJax"
539 INSTALL_DIR "${install_dir}"
540 INSTALL_COMMAND "${CMAKE_COMMAND}" -E copy_directory
541 <SOURCE_DIR> <INSTALL_DIR>
543 ExternalProject_Add_Step(MathJax-PreFontUpdate fontCleanup
544 COMMENT "Removing broken web fonts in MathJax"
545 COMMAND "${CMAKE_COMMAND}" -E remove_directory
546 "${install_dir}/MathJax/fonts/HTML-CSS/TeX/otf"
549 _foam_ep_download_if_required(download_opts
550 "http://www.mathjax.org/dl/MathJax-Font-Update.zip"
551 "03ce6b5a62cfb9a8a8d205aea2e6997e"
553 # download & install font update
554 foam_external_project_add(MathJax-FontUpdate
555 DEPENDS MathJax-PreFontUpdate
556 PREFIX "${CMAKE_BINARY_DIR}/ThirdParty/MathJax-FontUpdate"
560 INSTALL_DIR "${install_dir}/fonts/HTML-CSS/TeX/otf"
561 INSTALL_COMMAND "${CMAKE_COMMAND}" -E copy_directory
562 <SOURCE_DIR>/MathJax-Font-Update/otf <INSTALL_DIR>
564 add_custom_target(MathJax)
565 add_dependencies(MathJax MathJax-FontUpdate)
566 # FindMathJax compatibility
567 set(MATHJAX_DIR "${install_dir}" PARENT_SCOPE)
570 # build third-party library
571 macro(foam_build_thirdparty _btp_what)
572 if(${_btp_what} STREQUAL METIS)
574 elseif(${_btp_what} STREQUAL PARMETIS)
575 foam_build_parmetis()
576 elseif(${_btp_what} STREQUAL CCMIO)
578 elseif(${_btp_what} STREQUAL MGRIDGEN)
579 foam_build_mgridgen()
580 elseif(${_btp_what} STREQUAL SCOTCH)
582 elseif(${_btp_what} STREQUAL ZLIB)
584 elseif(${_btp_what} STREQUAL MATHJAX)
587 message(FATAL_ERROR "Unknown third-party package ${_btp_what}")
591 # Assemble download options for foam_external_project_add.
592 # If the file already exists in ${CMAKE_SOURCE_DIR}/ThirdParty and the MD5SUM
593 # matches, don't download it.
594 function(_foam_ep_download_if_required var url md5sum)
595 string(REGEX REPLACE "^.*/" "" filename "${url}")
596 set(filepath "${CMAKE_SOURCE_DIR}/ThirdParty/${filename}")
597 if(EXISTS "${filepath}")
599 COMMAND "${CMAKE_COMMAND}" -E md5sum "${filepath}"
600 OUTPUT_VARIABLE md5sum_computed
601 OUTPUT_STRIP_TRAILING_WHITESPACE
603 string(REGEX REPLACE " +.*$" "" md5sum_computed ${md5sum_computed})
604 if(md5sum_computed STREQUAL "${md5sum}")
605 # it's already there and the MD5 sum matches
606 set(${var} URL "${filepath}" DOWNLOAD_COMMAND "" PARENT_SCOPE)
608 message(SEND_ERROR "error: Mismatching MD5 sum for\n"
609 "${filepath}\nExpected ${md5sum}\nGot ${md5sum_computed}\n"
610 "Either re-download the file from\n${url}\n"
611 "or delete it and CMake will download it for you")
614 # use ExternalCommand to download it
615 set(${var} URL "${url}" MD5SUM "${filename}" "${md5sum}" PARENT_SCOPE)
619 # ------------------------- vim: set sw=2 sts=2 et: --------------- end-of-file