Lemma is an Electromagnetics API
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

CMakeLists.txt 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
  2. # Bug in CMake on Linux, but Linux, Mac, and Win all support shared libraries, no harm in this,
  3. # but remove when warning no longer shows.
  4. # Related to calling find_package before a project is created...
  5. # https://cmake.org/Bug/view.php?id=15999
  6. SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
  7. ####################################################################################################
  8. # Lemma versioning, set Major, minor, and patch here #
  9. set(LEMMA_VERSION_MAJOR "0") #
  10. set(LEMMA_VERSION_MINOR "2") #
  11. set(LEMMA_VERSION_PATCH "2") #
  12. set(LEMMA_VERSION "\"${LEMMA_VERSION_MAJOR}.${LEMMA_VERSION_MINOR}.${LEMMA_VERSION_PATCH}\"") #
  13. set(LEMMA_VERSION_NOQUOTES "${LEMMA_VERSION_MAJOR}.${LEMMA_VERSION_MINOR}.${LEMMA_VERSION_PATCH}") #
  14. ####################################################################################################
  15. ########################################
  16. # ################################## #
  17. # # Pre-Build checks/ dependencies # #
  18. # ################################## #
  19. ########################################
  20. ## Options--what do you want to do
  21. option ( BUILD_SHARED_LIBS "Shared or static libraries" OFF )
  22. set(CMAKE_BUILD_TYPE "Release" STRING
  23. "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
  24. FORCE cache)
  25. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel )
  26. option ( LEMMA_ENABLE_TESTING "Turn on unit testing" OFF )
  27. option ( LEMMA_BUILD_EXAMPLES "Compile example Lemma applications" OFF )
  28. option ( LEMMA_USE_OPENMP "Use OpenMP in Lemma" OFF )
  29. option ( LEMMA_BUILD_DOCUMENTATION "Build Doxygen man pages" OFF )
  30. option (LEMMA_VTK6_SUPPORT "VTK 6.x library for visualisation and grids" OFF)
  31. option (LEMMA_VTK7_SUPPORT "VTK 7.x library for visualisation and grids" OFF)
  32. option (LEMMA_VTK8_SUPPORT "VTK 8.x library for visualisation and grids" OFF)
  33. #option (CMAKE_CROSSCOMPILING "Target different arch than you are on" OFF)
  34. ##########################################################################################
  35. ## Only look for packages where we build them...this makes finding VTK a problem though! #
  36. ##########################################################################################
  37. if (CMAKE_CROSSCOMPILING)
  38. message ( STATUS "Cross-compiling! Only searching in install directory for components." )
  39. SET( CMAKE_FIND_ROOT_PATH ONLY ${CMAKE_INSTALL_PREFIX})
  40. SET( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
  41. SET( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
  42. SET( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY )
  43. UNSET( Eigen3_DIR CACHE )
  44. UNSET( yaml-cpp_DIR CACHE )
  45. find_package (Eigen3 3.3 )# QUIET) # Matrix/Vector & Math
  46. find_package (yaml-cpp 0.6 ) #QUIET ) # Serialisation of classes
  47. endif()
  48. find_package (Eigen3 3.3 )# QUIET) # Matrix/Vector & Math
  49. find_package (yaml-cpp 0.6 ) #QUIET ) # Serialisation of classes
  50. INCLUDE_DIRECTORIES(${YAML_CPP_INCLUDE_DIR})
  51. if (LEMMA_BUILD_DOCUMENTATION)
  52. find_package(Doxygen REQUIRED)
  53. endif()
  54. ## Optional Dependencies
  55. if (LEMMA_ENABLE_TESTING)
  56. if (EXISTS "${CMAKE_CURRENT_BINARY_DIR}/external/CxxTest/src/CxxTest/README")
  57. set (CXXTEST_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/external/CxxTest/src/CxxTest/" CACHE PATH "" FORCE )
  58. else()
  59. set (CXXTEST_INCLUDE_DIR "CXXTEST_INCLUDE_DIR-NOTFOUND" CACHE PATH "" FORCE )
  60. endif()
  61. if (EXISTS "${CMAKE_CURRENT_BINARY_DIR}/external/CxxTest/src/CxxTest/bin/cxxtestgen")
  62. set (CXXTEST_PYTHON_TESTGEN_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/external/CxxTest/src/CxxTest/bin/cxxtestgen" CACHE PATH "" FORCE )
  63. else()
  64. set (CXXTEST_PYTHON_TESTGEN_EXECUTABLE "CXXTEST_PYTHON_TESTGEN_EXECUTABLE-NOTFOUND" CACHE PATH "" FORCE )
  65. endif()
  66. find_package (CxxTest QUIET) # Unit testing
  67. endif()
  68. #######################################################################
  69. # CXXTEST Framework
  70. if(CXXTEST_FOUND)
  71. if (LEMMA_ENABLE_TESTING)
  72. #include_directories(${CXXTEST_INCLUDE_DIR}) # Add this in testing CMakeLists.txt instead, cleaner
  73. enable_testing()
  74. endif()
  75. endif()
  76. ## Optional Dependencies
  77. if ( NOT Eigen3_FOUND OR
  78. NOT yaml-cpp_FOUND OR
  79. (LEMMA_ENABLE_TESTING AND NOT CxxTest_FOUND) )
  80. message ( STATUS "Missing hard dependencies have been found, these will be downloaded any compiled." )
  81. message ( STATUS "This necessitates a two step build." )
  82. message ( STATUS "Build these packages first...THEN RERUN CMAKE!" )
  83. project (SUPERBUILD NONE)
  84. # execute the superbuild (this script will be invoked again without the
  85. # USE_SUPERBUILD option this time)
  86. include (CMake/SuperBuild.cmake)
  87. return() # stop processing this file further
  88. else()
  89. #project (Blah) # <-- YOUR PROJECT NAME HERE
  90. message( STATUS "Everything was found, happy Lemma-ing" )
  91. endif()
  92. # Mac OSX RPATH is weird
  93. # enable @rpath in the install name for any shared library being built
  94. # note: it is planned that a future version of CMake will enable this by default
  95. if(POLICY CMP0015)
  96. cmake_policy(SET CMP0015 NEW)
  97. endif()
  98. set(CMAKE_MACOSX_RPATH 1)
  99. project (Lemma CXX)
  100. # Disallow in-source build
  101. if ("${Lemma_SOURCE_DIR}" STREQUAL "${Lemma_BINARY_DIR}")
  102. message(FATAL_ERROR
  103. "Lemma requires an out of source Build. "
  104. "Please create a separate binary directory and run CMake there.")
  105. endif()
  106. ##############################
  107. # required external programs # for downloading packages
  108. ##############################
  109. FIND_PROGRAM(HAVEGIT git
  110. PATHS /usr/bin/ /bin ENV PATH NO_DEFAULT_PATH
  111. )
  112. if(NOT HAVEGIT)
  113. message(FATAL_ERROR "Lemma requires that git is installed and in the path of your machine")
  114. endif(NOT HAVEGIT)
  115. if(BUILD_SHARED_LIBS)
  116. set(LABEL_SUFFIX "shared")
  117. else()
  118. set(LABEL_SUFFIX "static")
  119. endif()
  120. #if(NOT CMAKE_BUILD_TYPE)
  121. # set(CMAKE_BUILD_TYPE "Release" CACHE STRING
  122. # "Choose the type of build, options are: Debug Release
  123. # RelWithDebInfo MinSizeRel."
  124. # FORCE)
  125. #endif(NOT CMAKE_BUILD_TYPE)
  126. ###################
  127. # External Projects
  128. ###################
  129. # We don't build VTK, it is too heavy.
  130. if ( LEMMA_VTK6_SUPPORT )
  131. #find_package(VTK 6 REQUIRED NO_MODULE)
  132. find_package(VTK 6.0 COMPONENTS vtkCommonCore vtkRenderingCore vtkFiltersCore vtkFiltersSources
  133. vtkCommonDataModel vtkFiltersHyperTree vtkIOXML vtkIOImage vtkIOLegacy vtkInteractionStyle
  134. vtkRenderingAnnotation vtkFiltersHybrid vtkFiltersModeling vtkRenderingVolumeOpenGL NO_MODULE)
  135. set(volumeRenderer volumerenderer.cxx)
  136. include(${VTK_USE_FILE})
  137. add_compile_options(-DLEMMAUSEVTK)
  138. # Compile Matplot_vtk if VTK is present
  139. #add_subdirectory(Matplot_vtk)
  140. #include_directories ("${PROJECT_SOURCE_DIR}/Matplot_vtk")
  141. endif()
  142. if ( LEMMA_VTK7_SUPPORT )
  143. #find_package(VTK 7 REQUIRED NO_MODULE)
  144. find_package(VTK 7.0 COMPONENTS vtkCommonCore vtkRenderingCore vtkFiltersCore vtkFiltersSources
  145. vtkCommonDataModel vtkFiltersHyperTree vtkIOXML vtkIOImage vtkIOLegacy vtkInteractionStyle
  146. vtkRenderingAnnotation vtkFiltersHybrid vtkFiltersModeling vtkRenderingVolumeOpenGL2 NO_MODULE)
  147. set(volumeRenderer volumerenderer.cxx)
  148. if (VTK_FOUND)
  149. message(STATUS "VTK 7 was found! ")
  150. include(${VTK_USE_FILE})
  151. #add_compile_options(-DLEMMAUSEVTK)
  152. #target_compile_definitions( lemmacore PRIVATE LEMMAUSEVTK=1 )
  153. add_definitions(-DLEMMAUSEVTK)
  154. else()
  155. ExternalProject_Add(VTK
  156. GIT_REPOSITORY "https://gitlab.kitware.com/vtk/vtk.git"
  157. GIT_TAG "v7.1.1"
  158. PREFIX ${CMAKE_CURRENT_BINARY_DIR}/external/vtk7
  159. CMAKE_ARGS
  160. -DBUILD_SHARED_LIBS:BOOL=ON
  161. -DBUILD_EXAMPLES:BOOL=OFF
  162. -DBUILD_TESTING:BOOL=OFF
  163. -DVTK_Group_Web:BOOL=OFF
  164. -DModule_vtkImagingMath:BOOL=ON
  165. LOG_DOWNLOAD 0
  166. LOG_UPDATE 0
  167. )
  168. endif()
  169. endif()
  170. if ( LEMMA_VTK8_SUPPORT )
  171. find_package(VTK 8.0 COMPONENTS vtkCommonCore vtkRenderingCore vtkFiltersCore vtkFiltersSources
  172. vtkCommonDataModel vtkFiltersHyperTree vtkIOXML vtkIOImage vtkIOLegacy vtkInteractionStyle
  173. vtkRenderingAnnotation vtkFiltersHybrid vtkFiltersModeling vtkRenderingVolumeOpenGL2 NO_MODULE)
  174. if (VTK_FOUND)
  175. message(STATUS "VTK 8 was found! ")
  176. set(volumeRenderer volumerenderer.cxx)
  177. include(${VTK_USE_FILE})
  178. else()
  179. message( STATUS "External build of VTK 8 has been added, this may take some time to build." )
  180. ExternalProject_Add(VTK8
  181. GIT_REPOSITORY "https://gitlab.kitware.com/vtk/vtk.git"
  182. GIT_TAG "v8.1.0"
  183. PREFIX ${CMAKE_CURRENT_BINARY_DIR}/external/vtk8
  184. CMAKE_ARGS
  185. -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}
  186. -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} /
  187. -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} /
  188. -DBUILD_SHARED_LIBS:BOOL=ON /
  189. -DBUILD_EXAMPLES:BOOL=OFF /
  190. -DBUILD_TESTING:BOOL=OFF /
  191. -DVTK_Group_Web:BOOL=OFF /
  192. -DModule_vtkImagingMath:BOOL=ON /
  193. LOG_DOWNLOAD 0 /
  194. LOG_UPDATE 0
  195. )
  196. endif()
  197. add_definitions(-DLEMMAUSEVTK)
  198. endif()
  199. #######################
  200. # Lemma Configuration #
  201. #######################
  202. #############################
  203. # Look for Ki Ha Lee (EM1D) #
  204. #############################
  205. FIND_LIBRARY( KIHA_EM1D kihaem1d )
  206. if ( KIHA_EM1D )
  207. add_definitions(-DKIHALEE_EM1D)
  208. endif()
  209. ####################
  210. # Look for Boost
  211. ####################
  212. option (LEMMA_USE_BOOST "Boost is required by gaussian quadrature classes" OFF)
  213. if (LEMMA_USE_BOOST)
  214. find_package(Boost
  215. 1.58.0 # Minimum or EXACT version e.g. 1.36.0
  216. # COMPONENTS math # Boost libraries by their canonical name
  217. )
  218. if(Boost_FOUND)
  219. include_directories(${Boost_INCLUDE_DIRS})
  220. endif()
  221. find_path( HAVE_BOOST_SPECIAL_FUNCTIONS "boost/math/special_functions.hpp" )
  222. if(HAVE_BOOST_SPECIAL_FUNCTIONS)
  223. add_definitions(-DHAVE_BOOST_SPECIAL_FUNCTIONS)
  224. endif()
  225. find_path( HAVE_BOOST_PROGRESS "boost/progress.hpp" )
  226. if(HAVE_BOOST_PROGRESS)
  227. add_definitions(-DHAVE_BOOST_PROGRESS)
  228. endif()
  229. endif()
  230. ####################
  231. # Magic rpath flag
  232. ####################
  233. SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
  234. if (LEMMA_USE_OPENMP)
  235. if (CMAKE_CROSSCOMPILING)
  236. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")
  237. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
  238. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fopenmp")
  239. add_definitions(-DLEMMAUSEOMP)
  240. else()
  241. find_package(OpenMP REQUIRED)
  242. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
  243. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
  244. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
  245. add_definitions(-DLEMMAUSEOMP)
  246. endif()
  247. endif()
  248. configure_file (
  249. "${PROJECT_SOURCE_DIR}/config/LemmaConfig.h.in"
  250. "${PROJECT_BINARY_DIR}/include/LemmaConfig.h"
  251. )
  252. install ( FILES ${PROJECT_BINARY_DIR}/include/LemmaConfig.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include/Lemma/ )
  253. include_directories("${PROJECT_BINARY_DIR}/include")
  254. include_directories ("${CMAKE_INSTALL_PREFIX}/include/")
  255. link_directories ("${CMAKE_INSTALL_PREFIX}/lib/")
  256. ########################################################################
  257. # Build Modules
  258. add_subdirectory (Modules)
  259. ########################################################################
  260. # add a target to generate API documentation with Doxyfile.in
  261. # ALL make documentation build by default if possible
  262. find_package(Doxygen)
  263. if(DOXYGEN_FOUND)
  264. if (LEMMA_BUILD_DOCUMENTATION)
  265. # Custom header and footer option, enable in Doxygen
  266. # file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/Documentation/header.html
  267. # DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Documentation/header.html
  268. # )
  269. # file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/Documentation/footer.html
  270. # DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Documentation/footer.html
  271. # )
  272. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Documentation/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Documentation/Doxyfile @ONLY)
  273. add_custom_target(doc
  274. ALL
  275. ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Documentation/Doxyfile
  276. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  277. COMMENT "Generating API documentation with Doxygen" VERBATIM
  278. )
  279. endif (LEMMA_BUILD_DOCUMENTATION)
  280. endif(DOXYGEN_FOUND)
  281. # vim: set tabstop=4 shiftwidth=4 expandtab: