Salome HOME
Tested mesh fast equivalence when giving an input field
[tools/solverlab.git] / cmake_files / FindPackageMultipass.cmake
1 # PackageMultipass - this module defines two macros
2 #
3 # FIND_PACKAGE_MULTIPASS (Name CURRENT
4 #  STATES VAR0 VAR1 ...
5 #  DEPENDENTS DEP0 DEP1 ...)
6 #
7 #  This function creates a cache entry <UPPERCASED-Name>_CURRENT which
8 #  the user can set to "NO" to trigger a reconfiguration of the package.
9 #  The first time this function is called, the values of
10 #  <UPPERCASED-Name>_VAR0, ... are saved.  If <UPPERCASED-Name>_CURRENT
11 #  is false or if any STATE has changed since the last time
12 #  FIND_PACKAGE_MULTIPASS() was called, then CURRENT will be set to "NO",
13 #  otherwise CURRENT will be "YES".  IF not CURRENT, then
14 #  <UPPERCASED-Name>_DEP0, ... will be FORCED to NOTFOUND.
15 #  Example:
16 #    find_path (FOO_DIR include/foo.h)
17 #    FIND_PACKAGE_MULTIPASS (Foo foo_current
18 #      STATES DIR
19 #      DEPENDENTS INCLUDES LIBRARIES)
20 #    if (NOT foo_current)
21 #      # Make temporary files, run programs, etc, to determine FOO_INCLUDES and FOO_LIBRARIES
22 #    endif (NOT foo_current)
23 #
24 # MULTIPASS_SOURCE_RUNS (Name INCLUDES LIBRARIES SOURCE RUNS LANGUAGE)
25 #  Always runs the given test, use this when you need to re-run tests
26 #  because parent variables have made old cache entries stale. The LANGUAGE
27 #  variable is either C or CXX indicating which compiler the test should
28 #  use. 
29 # MULTIPASS_C_SOURCE_RUNS (Name INCLUDES LIBRARIES SOURCE RUNS)
30 #  DEPRECATED! This is only included for backwards compatability. Use
31 #  the more general MULTIPASS_SOURCE_RUNS instead.
32 #  Always runs the given test, use this when you need to re-run tests
33 #  because parent variables have made old cache entries stale.
34
35 macro (FIND_PACKAGE_MULTIPASS _name _current)
36   string (TOUPPER ${_name} _NAME)
37   set (_args ${ARGV})
38   list (REMOVE_AT _args 0 1)
39
40   set (_states_current "YES")
41   list (GET _args 0 _cmd)
42   if (_cmd STREQUAL "STATES")
43     list (REMOVE_AT _args 0)
44     list (GET _args 0 _state)
45     while (_state AND NOT _state STREQUAL "DEPENDENTS")
46       # The name of the stored value for the given state
47       set (_stored_var PACKAGE_MULTIPASS_${_NAME}_${_state})
48       if (NOT "${${_stored_var}}" STREQUAL "${${_NAME}_${_state}}")
49         set (_states_current "NO")
50       endif (NOT "${${_stored_var}}" STREQUAL "${${_NAME}_${_state}}")
51       set (${_stored_var} "${${_NAME}_${_state}}" CACHE INTERNAL "Stored state for ${_name}." FORCE)
52       list (REMOVE_AT _args 0)
53       list (GET _args 0 _state)
54     endwhile (_state AND NOT _state STREQUAL "DEPENDENTS")
55   endif (_cmd STREQUAL "STATES")
56
57   set (_stored ${_NAME}_CURRENT)
58   if (NOT ${_stored})
59     set (${_stored} "YES" CACHE BOOL "Is the configuration for ${_name} current?  Set to \"NO\" to reconfigure." FORCE)
60     set (_states_current "NO")
61   endif (NOT ${_stored})
62
63   set (${_current} ${_states_current})
64   if (NOT ${_current} AND PACKAGE_MULTIPASS_${_name}_CALLED)
65     message (STATUS "Clearing ${_name} dependent variables")
66     # Clear all the dependent variables so that the module can reset them
67     list (GET _args 0 _cmd)
68     if (_cmd STREQUAL "DEPENDENTS")
69       list (REMOVE_AT _args 0)
70       foreach (dep ${_args})
71         set (${_NAME}_${dep} "NOTFOUND" CACHE INTERNAL "Cleared" FORCE)
72       endforeach (dep)
73     endif (_cmd STREQUAL "DEPENDENTS")
74     set (${_NAME}_FOUND "NOTFOUND" CACHE INTERNAL "Cleared" FORCE)
75   endif ()
76   set (PACKAGE_MULTIPASS_${name}_CALLED YES CACHE INTERNAL "Private" FORCE)
77 endmacro (FIND_PACKAGE_MULTIPASS)
78
79
80 macro (MULTIPASS_SOURCE_RUNS includes libraries source runs language)
81   include (Check${language}SourceRuns)
82   # This is a ridiculous hack.  CHECK_${language}_SOURCE_* thinks that if the
83   # *name* of the return variable doesn't change, then the test does
84   # not need to be re-run.  We keep an internal count which we
85   # increment to guarantee that every test name is unique.  If we've
86   # gotten here, then the configuration has changed enough that the
87   # test *needs* to be rerun.
88   if (NOT MULTIPASS_TEST_COUNT)
89     set (MULTIPASS_TEST_COUNT 00)
90   endif (NOT MULTIPASS_TEST_COUNT)
91   math (EXPR _tmp "${MULTIPASS_TEST_COUNT} + 1") # Why can't I add to a cache variable?
92   set (MULTIPASS_TEST_COUNT ${_tmp} CACHE INTERNAL "Unique test ID")
93   set (testname MULTIPASS_TEST_${MULTIPASS_TEST_COUNT}_${runs})
94   set (CMAKE_REQUIRED_INCLUDES ${includes})
95   set (CMAKE_REQUIRED_LIBRARIES ${libraries})
96   if(${language} STREQUAL "C")
97     check_c_source_runs ("${source}" ${testname})
98   elseif(${language} STREQUAL "CXX")
99     check_cxx_source_runs ("${source}" ${testname})
100   endif()
101   set (${runs} "${${testname}}")
102 endmacro (MULTIPASS_SOURCE_RUNS)
103
104 macro (MULTIPASS_C_SOURCE_RUNS includes libraries source runs)
105   multipass_source_runs("${includes}" "${libraries}" "${source}" ${runs} "C")
106 endmacro (MULTIPASS_C_SOURCE_RUNS)