CMakeLists.txt (3912B)
1 if (Pism_BUILD_PYTHON_BINDINGS) 2 include(${SWIG_USE_FILE}) 3 4 include_directories (. ${PETSC4PY_INCLUDES} ${PYTHON_INCLUDE_DIRS} ${Pism_SOURCE_DIR}/src) 5 6 set(PISM_PYTHON_BINDING_LIBRARIES "pism") 7 8 list(APPEND PISM_Python_deps 9 AgeModel.i 10 geometry.i 11 pism_BedDef.i 12 pism_ColumnSystem.i 13 pism_DM.i 14 pism_FlowLaw.i 15 pism_Hydrology.i 16 pism_IceGrid.i 17 pism_IceModelVec.i 18 pism_File.i 19 pism_SIA.i 20 pism_SSA.i 21 pism_Timeseries.i 22 pism_VariableMetadata.i 23 pism_Vars.i 24 pism_Vec.i 25 pism_atmosphere.i 26 pism_energy.i 27 pism_exception.i 28 pism_inverse.i 29 pism_ocean.i 30 pism_options.i 31 pism_surface.i 32 pism_verification.i 33 pism_frontalmelt.i 34 pism_calving.i 35 ) 36 37 set_property(SOURCE PISM.i PROPERTY SWIG_FLAGS "-I${CMAKE_BINARY_DIR}" APPEND) 38 39 if(Pism_USE_JANSSON) 40 set_property(SOURCE PISM.i PROPERTY SWIG_FLAGS "-DPism_USE_JANSSON=1" APPEND) 41 else() 42 set_property(SOURCE PISM.i PROPERTY SWIG_FLAGS "-DPism_USE_JANSSON=0" APPEND) 43 endif() 44 45 set_source_files_properties(PISM.i PROPERTIES 46 CPLUSPLUS ON 47 SWIG_MODULE_NAME cpp) 48 49 # has to be set *before* calling SWIG_ADD_MODULE 50 set(SWIG_MODULE_cpp_EXTRA_DEPS ${PISM_Python_deps}) 51 52 if (${CMAKE_VERSION} VERSION_LESS "3.8.0") 53 SWIG_ADD_MODULE(cpp python PISM.i pism_python.cc) 54 else() 55 SWIG_ADD_LIBRARY(cpp 56 LANGUAGE python 57 SOURCES PISM.i pism_python.cc) 58 endif() 59 SWIG_LINK_LIBRARIES(cpp ${PYTHON_LIBRARIES} ${PISM_PYTHON_BINDING_LIBRARIES}) 60 61 # Disable compiler warnings: 62 SET_SOURCE_FILES_PROPERTIES(${swig_generated_file_fullname} 63 PROPERTIES COMPILE_FLAGS "-w") 64 65 add_custom_target (clean_swig 66 COMMAND ${CMAKE_COMMAND} -E touch PISM.i 67 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 68 VERBATIM) 69 70 # Disable compiler warnings: 71 SET_SOURCE_FILES_PROPERTIES(${swig_generated_file_fullname} 72 PROPERTIES COMPILE_FLAGS "-w") 73 74 # Generate version_info.py to make PETSc's version information available to PISM's 75 # Python bindings. This is necessary to initialize petsc4py using the correct PETSC_ARCH 76 # value *before* importing PISM.cpp. 77 configure_file(version_info.py.in version_info.py ESCAPE_QUOTES) 78 79 # Install Python .py files 80 install(FILES 81 $<TARGET_FILE:_cpp> 82 ${CMAKE_CURRENT_BINARY_DIR}/cpp.py 83 ${CMAKE_CURRENT_BINARY_DIR}/version_info.py 84 DESTINATION ${PISM_INSTALL_PYTHON_MODULE_DIR}/PISM 85 COMPONENT RuntimeLibraries 86 ) 87 88 add_custom_target (install_python_bindings_in_the_build_directory ALL 89 COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:_cpp> ${CMAKE_BINARY_DIR}/site-packages/PISM 90 COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/cpp.py ${CMAKE_BINARY_DIR}/site-packages/PISM/ 91 COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/version_info.py ${CMAKE_BINARY_DIR}/site-packages/PISM/ 92 VERBATIM 93 DEPENDS ${SWIG_MODULE_cpp_REAL_NAME} install_site_packages_in_the_build_directory ) 94 95 # The Python code snippet below returns 1 if Python can import a PISM 96 # and if the directory of said PISM matches the place we are about to 97 # install PISM's Python wrappers. If the return value is not 1, we 98 # print a message stating how to set your PYTHONPATH. 99 set (pism_test_py "${PROJECT_BINARY_DIR}/pism_test.py") 100 file (WRITE "${pism_test_py}" " 101 from os.path import realpath, join 102 try: 103 import PISM 104 except: 105 exit(0) 106 107 if realpath(PISM.__file__) == realpath(join('${PISM_INSTALL_PYTHON_MODULE_DIR}', 'PISM', '__init__.pyc')): 108 exit(1) 109 ") 110 111 install(CODE "EXEC_PROGRAM( ${PYTHON_EXECUTABLE} ARGS ${pism_test_py} RETURN_VALUE PISM_PYTHON_MATCHES OUTPUT_VARIABLE PYTHON_OUT ) 112 if(NOT PISM_PYTHON_MATCHES) 113 MESSAGE(\"\n ATTENTION! To complete installation of Python bindings you need to add\n\n export PYTHONPATH=${PISM_INSTALL_PYTHON_MODULE_DIR}:\$PYTHONPATH\n\n to your .bashrc or equivalent. \") 114 endif() 115 " ) 116 117 endif(Pism_BUILD_PYTHON_BINDINGS)