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()
							 |