Alpine3D

Alpine3D Svn Source Tree

Root/trunk/tools/cmake/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
35macro (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)
77endmacro (FIND_PACKAGE_MULTIPASS)
78
79
80macro (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}}")
102endmacro (MULTIPASS_SOURCE_RUNS)
103
104macro (MULTIPASS_C_SOURCE_RUNS includes libraries source runs)
105 multipass_source_runs("${includes}" "${libraries}" "${source}" ${runs} "C")
106endmacro (MULTIPASS_C_SOURCE_RUNS)

Archive Download this file

Revision: HEAD