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