1 # PackageMultipass - this module defines two macros
3 # FIND_PACKAGE_MULTIPASS (Name CURRENT
5 # DEPENDENTS DEP0 DEP1 ...)
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.
16 # find_path (FOO_DIR include/foo.h)
17 # FIND_PACKAGE_MULTIPASS (Foo foo_current
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)
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
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.
35 macro (FIND_PACKAGE_MULTIPASS _name _current)
36 string (TOUPPER ${_name} _NAME)
38 list (REMOVE_AT _args 0 1)
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")
57 set (_stored ${_NAME}_CURRENT)
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})
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)
73 endif (_cmd STREQUAL "DEPENDENTS")
74 set (${_NAME}_FOUND "NOTFOUND" CACHE INTERNAL "Cleared" FORCE)
76 set (PACKAGE_MULTIPASS_${name}_CALLED YES CACHE INTERNAL "Private" FORCE)
77 endmacro (FIND_PACKAGE_MULTIPASS)
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})
101 set (${runs} "${${testname}}")
102 endmacro (MULTIPASS_SOURCE_RUNS)
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)