140 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			CMake
		
	
	
		
		
			
		
	
	
			140 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			CMake
		
	
	
|  | # Utilities to help with wrapping.
 | ||
|  | 
 | ||
|  | # Use CMake's find_package to find the version of Python installed.
 | ||
|  | macro(get_python_version)
 | ||
|  |   if(${CMAKE_VERSION} VERSION_LESS "3.12.0")
 | ||
|  |     # Use older version of cmake's find_python
 | ||
|  |     find_package(PythonInterp)
 | ||
|  | 
 | ||
|  |     if(NOT ${PYTHONINTERP_FOUND})
 | ||
|  |       message( | ||
|  |         FATAL_ERROR
 | ||
|  |           "Cannot find Python interpreter. Please install Python>=3.5.")
 | ||
|  |     endif()
 | ||
|  | 
 | ||
|  |     find_package(PythonLibs ${PYTHON_VERSION_STRING})
 | ||
|  | 
 | ||
|  |   else()
 | ||
|  |     # Get info about the Python interpreter
 | ||
|  |     # https://cmake.org/cmake/help/latest/module/FindPython.html#module:FindPython
 | ||
|  |     find_package(Python COMPONENTS Interpreter Development)
 | ||
|  | 
 | ||
|  |     if(NOT ${Python_FOUND})
 | ||
|  |       message( | ||
|  |         FATAL_ERROR
 | ||
|  |           "Cannot find Python interpreter. Please install Python>=3.5.")
 | ||
|  |     endif()
 | ||
|  | 
 | ||
|  |   endif()
 | ||
|  | endmacro()
 | ||
|  | 
 | ||
|  | # Depending on the version of CMake, ensure all the appropriate variables are set.
 | ||
|  | macro(configure_python_variables)
 | ||
|  |   if(${CMAKE_VERSION} VERSION_LESS "3.12.0")
 | ||
|  |     set(Python_VERSION_MAJOR | ||
|  |         ${PYTHON_VERSION_MAJOR}
 | ||
|  |         CACHE INTERNAL "")
 | ||
|  |     set(Python_VERSION_MINOR | ||
|  |         ${PYTHON_VERSION_MINOR}
 | ||
|  |         CACHE INTERNAL "")
 | ||
|  |     set(Python_VERSION_PATCH | ||
|  |         ${PYTHON_VERSION_PATCH}
 | ||
|  |         CACHE INTERNAL "")
 | ||
|  |     set(Python_EXECUTABLE | ||
|  |         ${PYTHON_EXECUTABLE}
 | ||
|  |         CACHE PATH "")
 | ||
|  | 
 | ||
|  |   else()
 | ||
|  |     # Set both sets of variables
 | ||
|  |     set(PYTHON_VERSION_MAJOR | ||
|  |         ${Python_VERSION_MAJOR}
 | ||
|  |         CACHE INTERNAL "")
 | ||
|  |     set(PYTHON_VERSION_MINOR | ||
|  |         ${Python_VERSION_MINOR}
 | ||
|  |         CACHE INTERNAL "")
 | ||
|  |     set(PYTHON_VERSION_PATCH | ||
|  |         ${Python_VERSION_PATCH}
 | ||
|  |         CACHE INTERNAL "")
 | ||
|  |     set(PYTHON_EXECUTABLE | ||
|  |         ${Python_EXECUTABLE}
 | ||
|  |         CACHE PATH "")
 | ||
|  | 
 | ||
|  |   endif()
 | ||
|  | endmacro()
 | ||
|  | 
 | ||
|  | # Set the Python version for the wrapper and set the paths to the executable and
 | ||
|  | # include/library directories.
 | ||
|  | # WRAP_PYTHON_VERSION (optionally) can be "Default" or a
 | ||
|  | # specific major.minor version.
 | ||
|  | macro(gtwrap_get_python_version)
 | ||
|  |   # Unset these cached variables to avoid surprises when the python in the
 | ||
|  |   # current environment are different from the cached!
 | ||
|  |   unset(Python_EXECUTABLE CACHE)
 | ||
|  |   unset(Python_INCLUDE_DIRS CACHE)
 | ||
|  |   unset(Python_VERSION_MAJOR CACHE)
 | ||
|  |   unset(Python_VERSION_MINOR CACHE)
 | ||
|  |   unset(Python_VERSION_PATCH CACHE)
 | ||
|  | 
 | ||
|  |   # Set default value if the parameter is not passed in
 | ||
|  |   if(NOT WRAP_PYTHON_VERSION)
 | ||
|  |     set(WRAP_PYTHON_VERSION "Default")
 | ||
|  |   endif()
 | ||
|  | 
 | ||
|  |   # Allow override
 | ||
|  |   if(${WRAP_PYTHON_VERSION} STREQUAL "Default")
 | ||
|  |     # Check for Python3 or Python2 in order
 | ||
|  |     get_python_version()
 | ||
|  | 
 | ||
|  |     # Set the wrapper python version
 | ||
|  |     set(WRAP_PYTHON_VERSION | ||
|  |         "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}.${Python_VERSION_PATCH}"
 | ||
|  |         CACHE STRING "The version of Python to build the wrappers against."
 | ||
|  |               FORCE)
 | ||
|  | 
 | ||
|  |   else()
 | ||
|  |     # Find the Python that best matches the python version specified.
 | ||
|  |     find_package( | ||
|  |       Python ${WRAP_PYTHON_VERSION}
 | ||
|  |       COMPONENTS Interpreter Development
 | ||
|  |       EXACT)
 | ||
|  |   endif()
 | ||
|  | 
 | ||
|  |   # (Always) Configure the variables once we find the python package
 | ||
|  |   configure_python_variables()
 | ||
|  | 
 | ||
|  | endmacro()
 | ||
|  | 
 | ||
|  | # Concatenate multiple wrapper interface headers into one.
 | ||
|  | # The concatenation will be (re)performed if and only if any interface files
 | ||
|  | # change.
 | ||
|  | #
 | ||
|  | # Arguments:
 | ||
|  | # ~~~
 | ||
|  | # destination: The concatenated master interface header file will be placed here.
 | ||
|  | # inputs (optional): All the input interface header files
 | ||
|  | function(combine_interface_headers | ||
|  |          destination
 | ||
|  |          #inputs
 | ||
|  |          )
 | ||
|  |   # check if any interface headers changed
 | ||
|  |   foreach(INTERFACE_FILE ${ARGN})
 | ||
|  |     if(NOT EXISTS ${destination} OR | ||
|  |       ${INTERFACE_FILE} IS_NEWER_THAN ${destination})
 | ||
|  |       set(UPDATE_INTERFACE TRUE)
 | ||
|  |     endif()
 | ||
|  |     # trigger cmake on file change
 | ||
|  |     set_property(DIRECTORY | ||
|  |                  APPEND
 | ||
|  |                  PROPERTY CMAKE_CONFIGURE_DEPENDS ${INTERFACE_FILE})
 | ||
|  |   endforeach()
 | ||
|  |   # if so, then update the overall interface file
 | ||
|  |   if (UPDATE_INTERFACE)
 | ||
|  |     file(WRITE ${destination} "")
 | ||
|  |     # append additional interface headers to end of gtdynamics.i
 | ||
|  |     foreach(INTERFACE_FILE ${ARGN})
 | ||
|  |       file(READ ${INTERFACE_FILE} interface_contents)
 | ||
|  |       file(APPEND ${destination} "${interface_contents}")
 | ||
|  |     endforeach()
 | ||
|  |   endif()
 | ||
|  | endfunction()
 |