PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/packages/PyTrilinos/src/CMakeLists.txt

https://github.com/qsnake/trilinos
CMake | 320 lines | 199 code | 37 blank | 84 comment | 0 complexity | 1d3c49d6966fadce0d654cfe1b248f26 MD5 | raw file
  1. # @HEADER
  2. # ************************************************************************
  3. #
  4. # PyTrilinos: Python Interface to Trilinos
  5. # Copyright (2009) Sandia Corporation
  6. #
  7. # Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
  8. # license for use of this work by or on behalf of the U.S. Government.
  9. #
  10. # This library is free software; you can redistribute it and/or modify
  11. # it under the terms of the GNU Lesser General Public License as
  12. # published by the Free Software Foundation; either version 2.1 of the
  13. # License, or (at your option) any later version.
  14. #
  15. # This library is distributed in the hope that it will be useful, but
  16. # WITHOUT ANY WARRANTY; without even the implied warranty of
  17. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  18. # Lesser General Public License for more details.
  19. #
  20. # You should have received a copy of the GNU Lesser General Public
  21. # License along with this library; if not, write to the Free Software
  22. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  23. # USA
  24. # Questions? Contact Bill Spotz (wfspotz@sandia.gov)
  25. #
  26. # ************************************************************************
  27. # @HEADER
  28. INCLUDE(PackageLibraryMacros)
  29. #
  30. # Package-specific configuration options
  31. IF(Trilinos_ENABLE_Epetra)
  32. SET(HAVE_EPETRA ON)
  33. ENDIF(Trilinos_ENABLE_Epetra)
  34. IF(Trilinos_ENABLE_Teuchos)
  35. SET(HAVE_TEUCHOS ON)
  36. ENDIF(Trilinos_ENABLE_Teuchos)
  37. IF(NOX_ENABLE_Epetra)
  38. SET(HAVE_NOX_EPETRA ON)
  39. ENDIF(NOX_ENABLE_Epetra)
  40. IF(NOX_ENABLE_EpetraExt)
  41. SET(HAVE_NOX_EPETRAEXT ON)
  42. ENDIF(NOX_ENABLE_EpetraExt)
  43. IF(TPL_ENABLE_MPI)
  44. SET(HAVE_MPI ON)
  45. ENDIF(TPL_ENABLE_MPI)
  46. PACKAGE_CONFIGURE_FILE(${PACKAGE_NAME}_config.h)
  47. #
  48. # On Mac OS X Gnu compilers, add dynamic lookup for undefined symbols
  49. # to the pytrilinos library and PyTrilinos extension modules
  50. SET(EXTRA_LINK_ARGS "")
  51. IF(APPLE)
  52. IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  53. APPEND_SET(EXTRA_LINK_ARGS "-undefined dynamic_lookup")
  54. ENDIF()
  55. ENDIF(APPLE)
  56. #
  57. # Add the current binary and source directories, the python include
  58. # path, and the NumPy include path to the include directories
  59. INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
  60. INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
  61. INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
  62. INCLUDE_DIRECTORIES(${NumPy_INCLUDE_DIR})
  63. #
  64. # Copy the pyfragments.swg file to the build directory
  65. CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/pyfragments.swg.in
  66. ${CMAKE_CURRENT_BINARY_DIR}/pyfragments.swg)
  67. #
  68. # Initialize the headers and sources
  69. SET(HEADERS "")
  70. SET(SOURCES "")
  71. SET(HEADERS ${HEADERS}
  72. ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}_config.h
  73. )
  74. #
  75. # Core PyTrilinos headers and sources
  76. APPEND_SET(HEADERS
  77. NumPyImporter.h
  78. PythonException.h
  79. PyTrilinos_Util.h
  80. FILEstream.h
  81. numpy_include.h
  82. )
  83. APPEND_SET(SOURCES
  84. NumPyImporter.cpp
  85. PythonException.cpp
  86. PyTrilinos_Util.cpp
  87. FILEstream.cpp
  88. )
  89. #
  90. # PyTrilinos + Teuchos headers and sources
  91. IF(PyTrilinos_ENABLE_Teuchos)
  92. APPEND_SET(HEADERS
  93. Teuchos_PythonParameter.h
  94. )
  95. APPEND_SET(SOURCES
  96. Teuchos_PythonParameter.cpp
  97. )
  98. ENDIF(PyTrilinos_ENABLE_Teuchos)
  99. #
  100. # PyTrilinos + Epetra headers and sources
  101. IF(PyTrilinos_ENABLE_Epetra)
  102. APPEND_SET(HEADERS
  103. Epetra_NumPyFEVector.h
  104. Epetra_NumPyIntSerialDenseMatrix.h
  105. Epetra_NumPyIntSerialDenseVector.h
  106. Epetra_NumPyIntVector.h
  107. Epetra_NumPyMultiVector.h
  108. Epetra_NumPySerialDenseMatrix.h
  109. Epetra_NumPySerialDenseVector.h
  110. Epetra_NumPyVector.h
  111. Epetra_PyUtil.h
  112. )
  113. APPEND_SET(SOURCES
  114. Epetra_NumPyFEVector.cpp
  115. Epetra_NumPyIntSerialDenseMatrix.cpp
  116. Epetra_NumPyIntSerialDenseVector.cpp
  117. Epetra_NumPyIntVector.cpp
  118. Epetra_NumPyMultiVector.cpp
  119. Epetra_NumPySerialDenseMatrix.cpp
  120. Epetra_NumPySerialDenseVector.cpp
  121. Epetra_NumPyVector.cpp
  122. Epetra_PyUtil.cpp
  123. )
  124. ENDIF(PyTrilinos_ENABLE_Epetra)
  125. #
  126. # PyTrilinos + EpetraExt headers and sources
  127. IF(PyTrilinos_ENABLE_EpetraExt)
  128. APPEND_SET(HEADERS
  129. EpetraExt_PyUtil.h
  130. )
  131. APPEND_SET(SOURCES
  132. EpetraExt_PyUtil.cpp
  133. )
  134. ENDIF(PyTrilinos_ENABLE_EpetraExt)
  135. #
  136. # PyTrilinos + ML headers and sources
  137. IF(PyTrilinos_ENABLE_ML)
  138. APPEND_SET(HEADERS
  139. MLAPI_PyMatrix.h
  140. )
  141. ENDIF(PyTrilinos_ENABLE_ML)
  142. #
  143. # Define the target for the swig runtime header
  144. SET(SWIG_RUNTIME swigpyrun.h)
  145. ADD_CUSTOM_COMMAND(
  146. OUTPUT ${SWIG_RUNTIME}
  147. COMMAND ${SWIG_EXECUTABLE} -python -external-runtime
  148. )
  149. APPEND_SET(HEADERS ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_RUNTIME})
  150. #
  151. # Define the targets for the PyTrilinos library
  152. PACKAGE_ADD_LIBRARY(pytrilinos
  153. HEADERS ${HEADERS}
  154. SOURCES ${SOURCES}
  155. )
  156. SET_TARGET_PROPERTIES(pytrilinos
  157. PROPERTIES LINK_FLAGS "${EXTRA_LINK_ARGS}"
  158. )
  159. #
  160. # Define the PyTrilinos swig setup
  161. SET(CMAKE_SWIG_FLAGS "")
  162. GET_FILENAME_COMPONENT(PYTRILINOS_DOXDIR
  163. ${CMAKE_CURRENT_SOURCE_DIR}/../doc/Doxygen ABSOLUTE
  164. )
  165. APPEND_SET(CMAKE_SWIG_FLAGS -I${PYTRILINOS_DOXDIR})
  166. #
  167. # Determine the install directory
  168. EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c "import sys; print sys.version[:3]"
  169. OUTPUT_VARIABLE PYTHON_VERSION
  170. OUTPUT_STRIP_TRAILING_WHITESPACE
  171. )
  172. SET(PyTrilinos_INSTALL_DIR
  173. ${PyTrilinos_INSTALL_PREFIX}/lib/python${PYTHON_VERSION}/site-packages/PyTrilinos
  174. CACHE PATH "The path where PyTrilinos will be installed"
  175. )
  176. MESSAGE(STATUS "PyTrilinos installation path: ${PyTrilinos_INSTALL_DIR}")
  177. #
  178. # Add the PyTrilinos subdirectory, which is the top-level package
  179. # directory. This needs to be done before the following loop over the
  180. # PyTrilinos modules, because of the call to GET_DIRECTORY_PROPERTY().
  181. ADD_SUBDIRECTORY(PyTrilinos)
  182. #
  183. # Initialize the list of additional clean files
  184. SET(ADDITIONAL_CLEAN_FILES "")
  185. #
  186. # Loop over the PyTrilinos-enabled Trilinos modules and define the
  187. # swig-generated PyTrilinos extension modules
  188. FOREACH(MODULE ${PyTrilinos_MODULES})
  189. # Alternate versions of the module name
  190. STRING(TOUPPER ${MODULE} MODULE_UPPER)
  191. STRING(REPLACE "." "_" MODULE_NODOT ${MODULE})
  192. SET_SOURCE_FILES_PROPERTIES(${MODULE}.i PROPERTIES
  193. CPLUSPLUS ON
  194. )
  195. # Determine the swig module output directory, name and unique target name
  196. SWIG_MODULE_GET_OUTDIR_AND_MODULE(${MODULE}.i MODULE_OUTDIR MODULE_NAME)
  197. SET(PyTrilinos_TARGET_NAME ${MODULE_NODOT})
  198. SWIG_ADD_MODULE(${PyTrilinos_TARGET_NAME}
  199. python
  200. "${MODULE}.i"
  201. "${MODULE_OUTDIR}"
  202. "${MODULE_NAME}")
  203. SWIG_LINK_LIBRARIES(${PyTrilinos_TARGET_NAME} pytrilinos)
  204. # Add the header file to the list of additional "make clean" files
  205. LIST(APPEND ADDITIONAL_CLEAN_FILES "${MODULE}PYTHON_wrap.h")
  206. #
  207. # Choosing the Trilinos libraries to link against, the python module
  208. # to byte-compile and the installation rules requires a little bit
  209. # of logic.
  210. #
  211. # PyTrilinos.NOX.Epetra
  212. IF("${MODULE_OUTDIR}" MATCHES "PyTrilinos/NOX/Epetra")
  213. SET(TRILINOS_LIBS ${NOXEPETRA_LIBRARIES})
  214. ADD_CUSTOM_COMMAND(TARGET ${PyTrilinos_TARGET_NAME} POST_BUILD
  215. COMMAND ${PYTHON_EXECUTABLE} -c "import py_compile; py_compile.compile('PyTrilinos/NOX/Epetra/${MODULE_NAME}.py')"
  216. COMMENT "Byte compiling NOX/Epetra/${MODULE_NAME}.py"
  217. VERBATIM)
  218. INSTALL(FILES
  219. ${CMAKE_CURRENT_BINARY_DIR}/PyTrilinos/NOX/Epetra/${MODULE_NAME}.py
  220. ${CMAKE_CURRENT_BINARY_DIR}/PyTrilinos/NOX/Epetra/${MODULE_NAME}.pyc
  221. DESTINATION ${PyTrilinos_INSTALL_DIR}/NOX/Epetra)
  222. INSTALL(TARGETS ${PyTrilinos_TARGET_NAME}
  223. DESTINATION ${PyTrilinos_INSTALL_DIR}/NOX/Epetra)
  224. LIST(APPEND ADDITIONAL_CLEAN_FILES "PyTrilinos/NOX/Epetra/${MODULE_NAME}.pyc")
  225. #
  226. # PyTrilinos.NOX
  227. ELSEIF("${MODULE_OUTDIR}" MATCHES "PyTrilinos/NOX")
  228. SET(TRILINOS_LIBS ${NOX_LIBRARIES})
  229. ADD_CUSTOM_COMMAND(TARGET ${PyTrilinos_TARGET_NAME} POST_BUILD
  230. COMMAND ${PYTHON_EXECUTABLE} -c "import py_compile; py_compile.compile('PyTrilinos/NOX/${MODULE_NAME}.py')"
  231. COMMENT "Byte compiling NOX/${MODULE_NAME}.py"
  232. VERBATIM)
  233. INSTALL(FILES
  234. ${CMAKE_CURRENT_BINARY_DIR}/PyTrilinos/NOX/${MODULE_NAME}.py
  235. ${CMAKE_CURRENT_BINARY_DIR}/PyTrilinos/NOX/${MODULE_NAME}.pyc
  236. DESTINATION ${PyTrilinos_INSTALL_DIR}/NOX)
  237. INSTALL(TARGETS ${PyTrilinos_TARGET_NAME}
  238. DESTINATION ${PyTrilinos_INSTALL_DIR}/NOX)
  239. LIST(APPEND ADDITIONAL_CLEAN_FILES "PyTrilinos/NOX/${MODULE_NAME}.pyc")
  240. #
  241. # PyTrilinos.LOCA
  242. ELSEIF("${MODULE_OUTDIR}" MATCHES "PyTrilinos/LOCA")
  243. SET(TRILINOS_LIBS ${LOCA_LIBRARIES})
  244. ADD_CUSTOM_COMMAND(TARGET ${PyTrilinos_TARGET_NAME} POST_BUILD
  245. COMMAND ${PYTHON_EXECUTABLE} -c "import py_compile; py_compile.compile('PyTrilinos/LOCA/${MODULE_NAME}.py')"
  246. COMMENT "Byte compiling LOCA/${MODULE_NAME}.py"
  247. VERBATIM)
  248. INSTALL(FILES
  249. ${CMAKE_CURRENT_BINARY_DIR}/PyTrilinos/LOCA/${MODULE_NAME}.py
  250. ${CMAKE_CURRENT_BINARY_DIR}/PyTrilinos/LOCA/${MODULE_NAME}.pyc
  251. DESTINATION ${PyTrilinos_INSTALL_DIR}/LOCA)
  252. INSTALL(TARGETS ${PyTrilinos_TARGET_NAME}
  253. DESTINATION ${PyTrilinos_INSTALL_DIR}/LOCA)
  254. LIST(APPEND ADDITIONAL_CLEAN_FILES "PyTrilinos/LOCA/${MODULE_NAME}.pyc")
  255. #
  256. # PyTrilinos
  257. ELSE("${MODULE_OUTDIR}")
  258. SET(TRILINOS_LIBS ${${MODULE_UPPER}_LIBRARIES})
  259. ADD_CUSTOM_COMMAND(TARGET ${PyTrilinos_TARGET_NAME} POST_BUILD
  260. COMMAND ${PYTHON_EXECUTABLE} -c "import py_compile; py_compile.compile('PyTrilinos/${MODULE}.py')"
  261. COMMENT "Byte compiling ${MODULE}.py"
  262. VERBATIM)
  263. INSTALL(FILES
  264. ${CMAKE_CURRENT_BINARY_DIR}/PyTrilinos/${MODULE_NAME}.py
  265. ${CMAKE_CURRENT_BINARY_DIR}/PyTrilinos/${MODULE_NAME}.pyc
  266. DESTINATION ${PyTrilinos_INSTALL_DIR})
  267. INSTALL(TARGETS ${PyTrilinos_TARGET_NAME}
  268. DESTINATION ${PyTrilinos_INSTALL_DIR})
  269. LIST(APPEND ADDITIONAL_CLEAN_FILES "PyTrilinos/${MODULE}.pyc")
  270. #
  271. ENDIF("${MODULE_OUTDIR}" MATCHES "PyTrilinos/NOX/Epetra")
  272. SWIG_LINK_LIBRARIES(${PyTrilinos_TARGET_NAME} ${TRILINOS_LIBS})
  273. SET_TARGET_PROPERTIES(${PyTrilinos_TARGET_NAME} PROPERTIES
  274. LINK_FLAGS "${EXTRA_LINK_ARGS}"
  275. )
  276. ENDFOREACH(MODULE ${PyTrilinos_MODULES})
  277. #
  278. # Add the additional "make clean" files
  279. GET_DIRECTORY_PROPERTY(clean_files ADDITIONAL_MAKE_CLEAN_FILES)
  280. LIST(APPEND clean_files ${ADDITIONAL_CLEAN_FILES})
  281. LIST(REMOVE_DUPLICATES clean_files)
  282. LIST(REMOVE_ITEM clean_files "")
  283. SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${clean_files}")