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 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  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 "3") #
  11. set(LEMMA_VERSION_PATCH "0") #
  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. # Disallow in-source build
  23. #if ("${Lemma_SOURCE_DIR}" STREQUAL "${Lemma_BINARY_DIR}")
  24. # message(FATAL_ERROR
  25. # "ParaView requires an out of source Build. "
  26. # "Please create a separate binary directory and run CMake there.")
  27. #endif()
  28. #------------------------------------------------------------------------------
  29. # Set a default build type if none was specified
  30. if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  31. message(STATUS "Setting build type to 'Debug' as none was specified.")
  32. set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE)
  33. # Set the possible values of build type for cmake-gui
  34. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
  35. "MinSizeRel" "RelWithDebInfo")
  36. endif()
  37. # If CMAKE_BUILD_TYPE is not specified, assume Release.
  38. #IF( NOT CMAKE_BUILD_TYPE )
  39. # SET( CMAKE_BUILD_TYPE Release ... FORCE )
  40. #ENDIF()
  41. option ( LEMMA_ENABLE_TESTING "Turn on unit testing" OFF )
  42. option ( LEMMA_BUILD_EXAMPLES "Compile example Lemma applications" OFF )
  43. option ( LEMMA_USE_OPENMP "Use OpenMP in Lemma" OFF )
  44. option ( LEMMA_BUILD_DOCUMENTATION "Build Doxygen man pages" OFF )
  45. #option (LEMMA_VTK7_SUPPORT "VTK 7.x library for visualisation and grids" OFF)
  46. option (LEMMA_VTK8_SUPPORT "VTK 8.x library for visualisation and grids" OFF)
  47. #option (CMAKE_CROSSCOMPILING "Target different arch than you are on" OFF)
  48. SET( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/CMake/ )
  49. #message( STATUS "MODULE PATH ${CMAKE_MODULE_PATH}" )
  50. SET (CMAKE_CROSSCOMPILING TRUE)
  51. ##########################################################################################
  52. ## Only look for packages where we build them...this makes finding VTK a problem though! #
  53. ##########################################################################################
  54. if (CMAKE_CROSSCOMPILING)
  55. message ( STATUS "Performing SuperBuild") #, Only searching in install directory for components." )
  56. # Kind of hack-ish, CMake doesn't always find this. It's buried in Cross compilation, so,
  57. # hopefully anyone doing this can problem solve.
  58. # SET( CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX}/CMake ${CMAKE_INSTALL_PREFIX}/share/eigen3 )
  59. # SET( CMAKE_MODULE_PATH ${CMAKE_INSTALL_PREFIX} )
  60. # SET( CMAKE_FIND_ROOT_PATH ONLY ${CMAKE_INSTALL_PREFIX} )
  61. # SET( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
  62. # SET( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
  63. # SET( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY )
  64. # UNSET( Eigen3_DIR CACHE )
  65. # UNSET( yaml-cpp_DIR CACHE )
  66. # UNSET( Eigen3_FOUND CACHE )
  67. # UNSET( yaml-cpp_FOUND CACHE )
  68. #message( STATUS "........Looking for yaml-cpp in ${CMAKE_INSTALL_PREFIX}" )
  69. find_package (yaml-cpp 0.6 PATHS ${CMAKE_INSTALL_PREFIX} NO_DEFAULT_PATH ) # Serialisation of classes
  70. find_package (Eigen3 3.3 PATHS ${CMAKE_INSTALL_PREFIX} NO_DEFAULT_PATH ) # Matrix/Vector & Math
  71. #message( STATUS "yaml-cpp include dir ${YAML_CPP_INCLUDE_DIR}" )
  72. else()
  73. find_package (Eigen3 3.3 QUIET) # Matrix/Vector & Math
  74. find_package (yaml-cpp 0.6 QUIET ) # Serialisation of classes
  75. endif()
  76. INCLUDE_DIRECTORIES(${YAML_CPP_INCLUDE_DIR})
  77. if (LEMMA_BUILD_DOCUMENTATION)
  78. find_package(Doxygen REQUIRED)
  79. endif()
  80. ## Optional Dependencies
  81. if (LEMMA_ENABLE_TESTING)
  82. if (EXISTS "${CMAKE_CURRENT_BINARY_DIR}/external/CxxTest/src/CxxTest/README")
  83. set (CXXTEST_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/external/CxxTest/src/CxxTest/" CACHE PATH "" FORCE )
  84. else()
  85. set (CXXTEST_INCLUDE_DIR "CXXTEST_INCLUDE_DIR-NOTFOUND" CACHE PATH "" FORCE )
  86. endif()
  87. if (EXISTS "${CMAKE_CURRENT_BINARY_DIR}/external/CxxTest/src/CxxTest/bin/cxxtestgen")
  88. set (CXXTEST_PYTHON_TESTGEN_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/external/CxxTest/src/CxxTest/bin/cxxtestgen" CACHE PATH "" FORCE )
  89. else()
  90. set (CXXTEST_PYTHON_TESTGEN_EXECUTABLE "CXXTEST_PYTHON_TESTGEN_EXECUTABLE-NOTFOUND" CACHE PATH "" FORCE )
  91. endif()
  92. find_package (CxxTest QUIET) # Unit testing
  93. endif()
  94. ## Optional Dependencies
  95. if ( NOT Eigen3_FOUND OR
  96. NOT yaml-cpp_FOUND OR
  97. (LEMMA_ENABLE_TESTING AND NOT CxxTest_FOUND) )
  98. message ( STATUS "Missing hard dependencies have been found, these will be downloaded any compiled." )
  99. message ( STATUS "This necessitates a two step build." )
  100. message ( STATUS "Build these packages first...THEN RERUN CMAKE!" )
  101. project (SUPERBUILD NONE)
  102. # execute the superbuild (this script will be invoked again without the
  103. # USE_SUPERBUILD option this time)
  104. include (CMake/SuperBuild.cmake)
  105. return() # stop processing this file further
  106. else()
  107. #project (Blah) # <-- YOUR PROJECT NAME HERE
  108. message( STATUS "Everything was found, happy Lemma-ing" )
  109. endif()
  110. # Mac OSX RPATH is weird
  111. # enable @rpath in the install name for any shared library being built
  112. # note: it is planned that a future version of CMake will enable this by default
  113. if(POLICY CMP0015)
  114. cmake_policy(SET CMP0015 NEW)
  115. endif()
  116. set(CMAKE_MACOSX_RPATH 1)
  117. project (Lemma CXX)
  118. if(CXXTEST_FOUND)
  119. if (LEMMA_ENABLE_TESTING)
  120. include (CTest)
  121. enable_testing()
  122. endif()
  123. endif()
  124. # Disallow in-source build
  125. if ("${Lemma_SOURCE_DIR}" STREQUAL "${Lemma_BINARY_DIR}")
  126. message(FATAL_ERROR
  127. "Lemma requires an out of source Build. "
  128. "Please create a separate binary directory and run CMake there.")
  129. endif()
  130. ##############################
  131. # required external programs # for downloading packages
  132. ##############################
  133. FIND_PROGRAM(HAVEGIT git
  134. PATHS /usr/bin/ /bin ENV PATH NO_DEFAULT_PATH
  135. )
  136. if(NOT HAVEGIT)
  137. message(FATAL_ERROR "Lemma requires that git is installed and in the path of your machine")
  138. endif(NOT HAVEGIT)
  139. if(BUILD_SHARED_LIBS)
  140. set(LABEL_SUFFIX "shared")
  141. else()
  142. set(LABEL_SUFFIX "static")
  143. endif()
  144. #if(NOT CMAKE_BUILD_TYPE)
  145. # set(CMAKE_BUILD_TYPE "Release" CACHE STRING
  146. # "Choose the type of build, options are: Debug Release
  147. # RelWithDebInfo MinSizeRel."
  148. # FORCE)
  149. #endif(NOT CMAKE_BUILD_TYPE)
  150. ###################
  151. # External Projects
  152. ###################
  153. # We don't build VTK, it is too heavy.
  154. #if ( LEMMA_VTK7_SUPPORT )
  155. # #find_package(VTK 7 REQUIRED NO_MODULE)
  156. # find_package(VTK 7.0 COMPONENTS vtkCommonCore vtkRenderingCore vtkFiltersCore vtkFiltersSources
  157. # vtkCommonDataModel vtkFiltersHyperTree vtkIOXML vtkIOImage vtkIOLegacy vtkIOGeometry vtkInteractionStyle
  158. # vtkRenderingAnnotation vtkFiltersHybrid vtkFiltersModeling vtkRenderingVolumeOpenGL2 NO_MODULE)
  159. # set(volumeRenderer volumerenderer.cxx)
  160. # if (VTK_FOUND)
  161. # message(STATUS "VTK 7 was found! ")
  162. # include(${VTK_USE_FILE})
  163. # #add_compile_options(-DLEMMAUSEVTK)
  164. # #target_compile_definitions( lemmacore PRIVATE LEMMAUSEVTK=1 )
  165. # add_definitions(-DLEMMAUSEVTK)
  166. # else()
  167. # ExternalProject_Add(VTK
  168. # GIT_REPOSITORY "https://gitlab.kitware.com/vtk/vtk.git"
  169. # GIT_TAG "v7.1.1"
  170. # PREFIX ${CMAKE_CURRENT_BINARY_DIR}/external/vtk7
  171. # CMAKE_ARGS
  172. # -DBUILD_SHARED_LIBS:BOOL=ON
  173. # -DBUILD_EXAMPLES:BOOL=OFF
  174. # -DBUILD_TESTING:BOOL=OFF
  175. # -DVTK_Group_Web:BOOL=OFF
  176. # -DModule_vtkImagingMath:BOOL=ON
  177. # LOG_DOWNLOAD 0
  178. # LOG_UPDATE 0
  179. # )
  180. # endif()
  181. #endif()
  182. if ( LEMMA_VTK8_SUPPORT )
  183. find_package(VTK 8.2 COMPONENTS vtkCommonCore vtkRenderingCore vtkFiltersCore vtkFiltersSources
  184. vtkCommonDataModel vtkFiltersHyperTree vtkIOXML vtkIOImage vtkIOLegacy vtkIOGeometry vtkInteractionStyle
  185. vtkRenderingAnnotation vtkFiltersHybrid vtkFiltersModeling vtkRenderingVolumeOpenGL2 NO_MODULE)
  186. #find_package(VTK 8 NO_MODULE)
  187. #vtkCommonDataModel vtkFiltersHyperTree vtkIOXML vtkIOImage vtkIOLegacy vtkIOGeometry vtkInteractionStyle
  188. #vtkRenderingAnnotation vtkFiltersHybrid vtkFiltersModeling vtkRenderingVolumeOpenGL2 NO_MODULE)
  189. if (VTK_FOUND)
  190. message(STATUS "VTK 8 was found! " ${VTK_VERSION}, ${VTK_USE_FILE} )
  191. set(volumeRenderer volumerenderer.cxx)
  192. #include(${VTK_USE_FILE})
  193. else()
  194. message( STATUS "External build of VTK 8 has been added, this may take some time to build." )
  195. ExternalProject_Add(VTK8
  196. GIT_REPOSITORY "https://gitlab.kitware.com/vtk/vtk.git"
  197. GIT_TAG "v8.2.0"
  198. PREFIX ${CMAKE_CURRENT_BINARY_DIR}/external/vtk8
  199. CMAKE_ARGS
  200. -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}
  201. -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} /
  202. -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} /
  203. -DBUILD_SHARED_LIBS:BOOL=ON /
  204. -DBUILD_EXAMPLES:BOOL=OFF /
  205. -DBUILD_TESTING:BOOL=OFF /
  206. -DVTK_Group_Web:BOOL=OFF /
  207. -DModule_vtkImagingMath:BOOL=ON /
  208. LOG_DOWNLOAD 0 /
  209. LOG_UPDATE 0
  210. )
  211. endif()
  212. add_definitions(-DLEMMAUSEVTK)
  213. endif()
  214. #######################
  215. # Lemma Configuration #
  216. #######################
  217. #############################
  218. # Look for Ki Ha Lee (EM1D) #
  219. #############################
  220. FIND_LIBRARY( KIHA_EM1D kihaem1d )
  221. if ( KIHA_EM1D )
  222. add_definitions(-DKIHALEE_EM1D)
  223. endif()
  224. ####################
  225. # Look for Boost
  226. ####################
  227. option (LEMMA_USE_BOOST "Boost is required by gaussian quadrature classes" OFF)
  228. if (LEMMA_USE_BOOST)
  229. find_package(Boost
  230. 1.58.0 # Minimum or EXACT version e.g. 1.36.0
  231. # COMPONENTS math # Boost libraries by their canonical name
  232. )
  233. if(Boost_FOUND)
  234. include_directories(${Boost_INCLUDE_DIRS})
  235. endif()
  236. find_path( HAVE_BOOST_SPECIAL_FUNCTIONS "boost/math/special_functions.hpp" )
  237. if(HAVE_BOOST_SPECIAL_FUNCTIONS)
  238. add_definitions(-DHAVE_BOOST_SPECIAL_FUNCTIONS)
  239. endif()
  240. find_path( HAVE_BOOST_PROGRESS "boost/progress.hpp" )
  241. if(HAVE_BOOST_PROGRESS)
  242. add_definitions(-DHAVE_BOOST_PROGRESS)
  243. endif()
  244. endif()
  245. option( MSVC_EXTENDED_ALIGNMENT "Turn on MSVC compiler definition _ENABLE_EXTENDED_ALIGNED_STORAGE " OFF )
  246. if (MSVC_EXTENDED_ALIGNMENT)
  247. add_definitions(-D_ENABLE_EXTENDED_ALIGNED_STORAGE)
  248. endif()
  249. ####################
  250. # Magic rpath flag
  251. ####################
  252. SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
  253. if (LEMMA_USE_OPENMP)
  254. if(APPLE)
  255. if(CMAKE_C_COMPILER_ID MATCHES "Clang")
  256. set(OpenMP_C "${CMAKE_C_COMPILER}")
  257. set(OpenMP_C_FLAGS "-fopenmp=libomp -Wno-unused-command-line-argument")
  258. set(OpenMP_C_LIB_NAMES "libomp" "libgomp" "libiomp5")
  259. set(OpenMP_libomp_LIBRARY ${OpenMP_C_LIB_NAMES})
  260. set(OpenMP_libgomp_LIBRARY ${OpenMP_C_LIB_NAMES})
  261. set(OpenMP_libiomp5_LIBRARY ${OpenMP_C_LIB_NAMES})
  262. endif()
  263. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  264. set(OpenMP_CXX "${CMAKE_CXX_COMPILER}")
  265. set(OpenMP_CXX_FLAGS "-fopenmp=libomp -Wno-unused-command-line-argument")
  266. set(OpenMP_CXX_LIB_NAMES "libomp" "libgomp" "libiomp5")
  267. set(OpenMP_libomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})
  268. set(OpenMP_libgomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})
  269. set(OpenMP_libiomp5_LIBRARY ${OpenMP_CXX_LIB_NAMES})
  270. # set(OpenMP_CXX_FLAGS "-Xpreprocessor -fopenmp -I/usr/local/opt/libomp/include")
  271. # " -DOpenMP_CXX_LIB_NAMES=\"omp\" -DOpenMP_omp_LIBRARY=/usr/local/opt/libomp/lib/libomp.dylib ")
  272. # set(OpenMP_CXX_LIB_NAMES "omp") # "libgomp" "libiomp5")
  273. # set(OpenMP_libomp_LIBRARY "/usr/local/opt/libomp/lib/libomp.dylib") #${OpenMP_CXX_LIB_NAMES})
  274. # set(OpenMP_libgomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})
  275. # set(OpenMP_libiomp5_LIBRARY ${OpenMP_CXX_LIB_NAMES})
  276. endif()
  277. endif()
  278. if (CMAKE_CROSSCOMPILING)
  279. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")
  280. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
  281. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fopenmp")
  282. else()
  283. find_package(OpenMP REQUIRED)
  284. if (OPENMP_FOUND)
  285. # include_directories("${OPENMP_INCLUDES}")
  286. link_directories("${OPENMP_LIBRARIES}")
  287. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
  288. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
  289. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
  290. endif()
  291. endif()
  292. add_definitions(-DLEMMAUSEOMP) # -DEIGEN_DONT_VECTORIZE)
  293. endif()
  294. configure_file (
  295. "${PROJECT_SOURCE_DIR}/config/LemmaConfig.h.in"
  296. "${PROJECT_BINARY_DIR}/include/LemmaConfig.h"
  297. )
  298. install ( FILES ${PROJECT_BINARY_DIR}/include/LemmaConfig.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include/Lemma/ )
  299. include_directories("${PROJECT_BINARY_DIR}/include")
  300. include_directories ("${CMAKE_INSTALL_PREFIX}/include/")
  301. link_directories ("${CMAKE_INSTALL_PREFIX}/lib/")
  302. ########################################################################
  303. # Build Modules
  304. add_subdirectory (Modules)
  305. #######################################################################
  306. # CXXTEST Framework
  307. #if(CXXTEST_FOUND)
  308. # if (LEMMA_ENABLE_TESTING)
  309. # include (CTest)
  310. #enable_testing()
  311. # endif()
  312. #endif()
  313. ########################################################################
  314. # add a target to generate API documentation with Doxyfile.in
  315. # ALL make documentation build by default if possible
  316. find_package(Doxygen)
  317. if(DOXYGEN_FOUND)
  318. if (LEMMA_BUILD_DOCUMENTATION)
  319. # Custom header and footer option, enable in Doxygen
  320. # file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/Documentation/header.html
  321. # DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Documentation/header.html
  322. # )
  323. # file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/Documentation/footer.html
  324. # DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Documentation/footer.html
  325. # )
  326. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Documentation/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Documentation/Doxyfile @ONLY)
  327. add_custom_target(doc
  328. ALL
  329. ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Documentation/Doxyfile
  330. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  331. COMMENT "Generating API documentation with Doxygen" VERBATIM
  332. )
  333. endif (LEMMA_BUILD_DOCUMENTATION)
  334. endif(DOXYGEN_FOUND)
  335. # vim: set tabstop=4 shiftwidth=4 expandtab: