Lemma is an Electromagnetics API
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CMakeLists.txt 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
  2. # add this options before PROJECT keyword
  3. set(CMAKE_DISABLE_SOURCE_CHANGES ON)
  4. set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
  5. # Bug in CMake on Linux, but Linux, Mac, and Win all support shared libraries, no harm in this,
  6. # but remove when warning no longer shows.
  7. # Related to calling find_package before a project is created...
  8. # https://cmake.org/Bug/view.php?id=15999
  9. SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
  10. ####################################################################################################
  11. # Lemma versioning, set Major, minor, and patch here #
  12. set(LEMMA_VERSION_MAJOR "0") #
  13. set(LEMMA_VERSION_MINOR "3") #
  14. set(LEMMA_VERSION_PATCH "2") #
  15. set(LEMMA_VERSION "\"${LEMMA_VERSION_MAJOR}.${LEMMA_VERSION_MINOR}.${LEMMA_VERSION_PATCH}\"") #
  16. set(LEMMA_VERSION_NOQUOTES "${LEMMA_VERSION_MAJOR}.${LEMMA_VERSION_MINOR}.${LEMMA_VERSION_PATCH}") #
  17. ####################################################################################################
  18. ########################################
  19. # ################################## #
  20. # # Pre-Build checks/ dependencies # #
  21. # ################################## #
  22. ########################################
  23. ## Options--what do you want to do
  24. option ( BUILD_SHARED_LIBS "Shared or static libraries" OFF )
  25. #------------------------------------------------------------------------------
  26. # Set a default build type if none was specified
  27. if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  28. message(STATUS "Setting build type to 'Debug' as none was specified.")
  29. set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE)
  30. # Set the possible values of build type for cmake-gui
  31. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
  32. "Debug"
  33. "Release"
  34. "MinSizeRel"
  35. "RelWithDebInfo"
  36. )
  37. endif()
  38. option ( LEMMA_ENABLE_TESTING "Turn on unit testing" OFF )
  39. option ( LEMMA_BUILD_EXAMPLES "Compile example Lemma applications" OFF )
  40. option ( LEMMA_USE_OPENMP "Use OpenMP in Lemma" OFF )
  41. option ( LEMMA_BUILD_DOCUMENTATION "Build Doxygen man pages" OFF )
  42. option ( LEMMA_VTK8_SUPPORT "VTK 8.x library for visualisation and grids" OFF )
  43. option ( LEMMA_PYTHON3_BINDINGS "Compile Python 3 bindings" OFF )
  44. # We end up using this for all builds, TODO remove this variable but follow same path
  45. #option (CMAKE_CROSSCOMPILING "Target different arch than you are on" OFF)
  46. SET( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/CMake/ )
  47. SET (CMAKE_CROSSCOMPILING TRUE)
  48. ##########################################################################################
  49. ## Only look for packages where we build them...this makes finding VTK a problem though! #
  50. ##########################################################################################
  51. if (CMAKE_CROSSCOMPILING)
  52. message ( STATUS "Performing SuperBuild")
  53. project (CHECKSUPERBUILD CXX) # Necessary for VTK query
  54. # if ("${CHECKSUPERBUILD_SOURCE_DIR}" STREQUAL "${CHECKSUPERBUILD_BINARY_DIR}")
  55. # message(FATAL_ERROR
  56. # "Lemma (SuperBuild) requires an out of source Build. "
  57. # "Please create a separate binary directory and run CMake there.")
  58. # endif()
  59. find_package (yaml-cpp 0.6 PATHS ${CMAKE_INSTALL_PREFIX} NO_DEFAULT_PATH) # Serialisation of classes
  60. find_package (Eigen3 3.3 PATHS ${CMAKE_INSTALL_PREFIX} NO_DEFAULT_PATH) # Matrix/Vector & Math
  61. if (LEMMA_PYTHON3_BINDINGS)
  62. find_package(pybind11 PATHS ${CMAKE_INSTALL_PREFIX} NO_DEFAULT_PATH) # Python 3 bindings
  63. endif()
  64. #${CMAKE_INSTALL_PREFIX} NO_DEFAULT_PATH
  65. if (LEMMA_VTK8_SUPPORT) # Visualisation
  66. find_package (VTK 8.2.0
  67. COMPONENTS
  68. vtkCommonCore
  69. vtkRenderingCore
  70. vtkFiltersCore
  71. vtkFiltersSources
  72. vtkCommonDataModel
  73. vtkFiltersHyperTree
  74. vtkIOXML
  75. vtkIOImage
  76. vtkIOLegacy
  77. vtkIOGeometry
  78. vtkInteractionStyle
  79. vtkRenderingAnnotation
  80. vtkFiltersHybrid
  81. vtkFiltersModeling
  82. vtkRenderingVolumeOpenGL2
  83. QUIET
  84. )
  85. endif()
  86. else()
  87. find_package (Eigen3 3.3 QUIET ) # Matrix/Vector & Math
  88. find_package (yaml-cpp 0.6 QUIET ) # Serialisation of classes
  89. if (LEMMA_VTK8_SUPPORT)
  90. find_package (VTK 8.2.0 COMPONENTS
  91. vtkCommonCore
  92. vtkRenderingCore
  93. vtkFiltersCore
  94. vtkFiltersSources
  95. vtkCommonDataModel
  96. vtkFiltersHyperTree
  97. vtkIOXML
  98. vtkIOImage
  99. vtkIOLegacy
  100. vtkIOGeometry
  101. vtkInteractionStyle
  102. vtkRenderingAnnotation
  103. vtkFiltersHybrid
  104. vtkFiltersModeling
  105. vtkRenderingVolumeOpenGL2
  106. QUIET )
  107. endif()
  108. endif()
  109. INCLUDE_DIRECTORIES(${YAML_CPP_INCLUDE_DIR})
  110. if (VTK_VERSION VERSION_GREATER "8.2.0")
  111. message( STATUS "${VTK_VERSION} is compatible: ${VTK_VERSION_COMPATIBLE} exact? ${VTK_VERSION_EXACT}" )
  112. set (VTK_FOUND False)
  113. endif()
  114. if (VTK_FOUND)
  115. set(volumeRenderer volumerenderer.cxx)
  116. add_definitions(-DLEMMAUSEVTK)
  117. endif()
  118. if (LEMMA_BUILD_DOCUMENTATION)
  119. find_package(Doxygen REQUIRED)
  120. endif()
  121. ## Optional Dependencies
  122. if (LEMMA_ENABLE_TESTING)
  123. if (EXISTS "${CMAKE_CURRENT_BINARY_DIR}/external/CxxTest/src/CxxTest/README")
  124. set (CXXTEST_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/external/CxxTest/src/CxxTest/" CACHE PATH "" FORCE )
  125. else()
  126. set (CXXTEST_INCLUDE_DIR "CXXTEST_INCLUDE_DIR-NOTFOUND" CACHE PATH "" FORCE )
  127. endif()
  128. if (EXISTS "${CMAKE_CURRENT_BINARY_DIR}/external/CxxTest/src/CxxTest/bin/cxxtestgen")
  129. set (CXXTEST_PYTHON_TESTGEN_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/external/CxxTest/src/CxxTest/bin/cxxtestgen" CACHE PATH "" FORCE )
  130. else()
  131. set (CXXTEST_PYTHON_TESTGEN_EXECUTABLE "CXXTEST_PYTHON_TESTGEN_EXECUTABLE-NOTFOUND" CACHE PATH "" FORCE )
  132. endif()
  133. find_package (CxxTest QUIET) # Unit testing
  134. endif()
  135. message ( STATUS "VTK Found? " ${VTK_FOUND} )
  136. ## Optional Dependencies
  137. if ( NOT Eigen3_FOUND OR
  138. NOT yaml-cpp_FOUND OR
  139. (LEMMA_PYTHON3_BINDINGS AND NOT pybind11_FOUND) OR
  140. (LEMMA_VTK8_SUPPORT AND NOT VTK_FOUND) OR
  141. (LEMMA_ENABLE_TESTING AND NOT CxxTest_FOUND) )
  142. message ( STATUS "Missing hard dependencies have been found, these will be downloaded any compiled." )
  143. message ( STATUS "This necessitates a two step build." )
  144. message ( STATUS "Build these packages first...THEN RERUN CMAKE!" )
  145. project (SUPERBUILD NONE)
  146. # execute the superbuild (this script will be invoked again without the
  147. # USE_SUPERBUILD option this time)
  148. include (CMake/SuperBuild.cmake)
  149. return() # stop processing this file further
  150. else()
  151. #project (Blah) # <-- YOUR PROJECT NAME HERE
  152. message( STATUS "Everything was found, happy Lemma-ing" )
  153. endif()
  154. # Mac OSX RPATH is weird
  155. # enable @rpath in the install name for any shared library being built
  156. # note: it is planned that a future version of CMake will enable this by default
  157. if(POLICY CMP0015)
  158. cmake_policy(SET CMP0015 NEW)
  159. endif()
  160. set(CMAKE_MACOSX_RPATH 1)
  161. project (Lemma CXX)
  162. # Disallow in-source build
  163. if ("${Lemma_SOURCE_DIR}" STREQUAL "${Lemma_BINARY_DIR}")
  164. message(FATAL_ERROR
  165. "Lemma requires an out of source Build. "
  166. "Please create a separate binary directory and run CMake there.")
  167. endif()
  168. if(CXXTEST_FOUND)
  169. if (LEMMA_ENABLE_TESTING)
  170. include (CTest)
  171. enable_testing()
  172. endif()
  173. endif()
  174. ##############################
  175. # required external programs # for downloading packages
  176. ##############################
  177. FIND_PROGRAM(HAVEGIT git
  178. PATHS /usr/bin/ /bin ENV PATH NO_DEFAULT_PATH
  179. )
  180. if(NOT HAVEGIT)
  181. message(FATAL_ERROR "Lemma requires that git is installed and in the path of your machine")
  182. endif(NOT HAVEGIT)
  183. if(BUILD_SHARED_LIBS)
  184. set(LABEL_SUFFIX "shared")
  185. else()
  186. set(LABEL_SUFFIX "static")
  187. endif()
  188. #######################
  189. # Lemma Configuration #
  190. #######################
  191. #############################
  192. # Look for Ki Ha Lee (EM1D) #
  193. #############################
  194. FIND_LIBRARY( KIHA_EM1D kihaem1d )
  195. if ( KIHA_EM1D )
  196. add_definitions(-DKIHALEE_EM1D)
  197. endif()
  198. ####################
  199. # Look for Boost
  200. ####################
  201. option (LEMMA_USE_BOOST "Boost is required by gaussian quadrature classes" OFF)
  202. if (LEMMA_USE_BOOST)
  203. find_package(Boost
  204. 1.64.0 # Minimum or EXACT version e.g. 1.36.0
  205. # COMPONENTS math # Boost libraries by their canonical name
  206. )
  207. if(Boost_FOUND)
  208. include_directories(${Boost_INCLUDE_DIRS})
  209. endif()
  210. find_path( HAVE_BOOST_SPECIAL_FUNCTIONS "boost/math/special_functions.hpp" )
  211. if(HAVE_BOOST_SPECIAL_FUNCTIONS)
  212. add_definitions(-DHAVE_BOOST_SPECIAL_FUNCTIONS)
  213. endif()
  214. find_path( HAVE_BOOST_PROGRESS "boost/progress.hpp" )
  215. if(HAVE_BOOST_PROGRESS)
  216. add_definitions(-DHAVE_BOOST_PROGRESS)
  217. endif()
  218. endif()
  219. if (LEMMA_PYTHON3_BINDINGS)
  220. find_package(PythonLibs 3.0 REQUIRED)
  221. find_package(pybind11 REQUIRED)
  222. # find_package(Boost 1.64.0 REQUIRED COMPONENTS system python3 numpy3)
  223. # Is this OK for portability of non-python libraries
  224. #include_directories(${PYTHON_INCLUDE_DIRS})
  225. #include_directories(${Boost_INCLUDE_DIRS})
  226. install ( FILES python/setup.py DESTINATION ${CMAKE_INSTALL_PREFIX}/pyLemma/ )
  227. install ( DIRECTORY python/pyLemma DESTINATION ${CMAKE_INSTALL_PREFIX}/pyLemma/ )
  228. endif()
  229. ####################
  230. # MSVC error fix
  231. ####################
  232. option( MSVC_EXTENDED_ALIGNMENT "Turn on MSVC compiler definition _ENABLE_EXTENDED_ALIGNED_STORAGE " OFF )
  233. if (MSVC_EXTENDED_ALIGNMENT)
  234. add_definitions(-D_ENABLE_EXTENDED_ALIGNED_STORAGE)
  235. SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LTCG")
  236. #add_definitions(-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE)
  237. #set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
  238. #include(GenerateExportHeader)
  239. endif()
  240. ####################
  241. # Magic rpath flag
  242. ####################
  243. SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
  244. if (LEMMA_USE_OPENMP)
  245. if(APPLE)
  246. if(CMAKE_C_COMPILER_ID MATCHES "Clang")
  247. set(OpenMP_C "${CMAKE_C_COMPILER}")
  248. set(OpenMP_C_FLAGS "-fopenmp=libomp -Wno-unused-command-line-argument")
  249. set(OpenMP_C_LIB_NAMES "libomp" "libgomp" "libiomp5")
  250. set(OpenMP_libomp_LIBRARY ${OpenMP_C_LIB_NAMES})
  251. set(OpenMP_libgomp_LIBRARY ${OpenMP_C_LIB_NAMES})
  252. set(OpenMP_libiomp5_LIBRARY ${OpenMP_C_LIB_NAMES})
  253. endif()
  254. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  255. set(OpenMP_CXX "${CMAKE_CXX_COMPILER}")
  256. set(OpenMP_CXX_FLAGS "-fopenmp=libomp -Wno-unused-command-line-argument")
  257. set(OpenMP_CXX_LIB_NAMES "libomp" "libgomp" "libiomp5")
  258. set(OpenMP_libomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})
  259. set(OpenMP_libgomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})
  260. set(OpenMP_libiomp5_LIBRARY ${OpenMP_CXX_LIB_NAMES})
  261. # set(OpenMP_CXX_FLAGS "-Xpreprocessor -fopenmp -I/usr/local/opt/libomp/include")
  262. # " -DOpenMP_CXX_LIB_NAMES=\"omp\" -DOpenMP_omp_LIBRARY=/usr/local/opt/libomp/lib/libomp.dylib ")
  263. # set(OpenMP_CXX_LIB_NAMES "omp") # "libgomp" "libiomp5")
  264. # set(OpenMP_libomp_LIBRARY "/usr/local/opt/libomp/lib/libomp.dylib") #${OpenMP_CXX_LIB_NAMES})
  265. # set(OpenMP_libgomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})
  266. # set(OpenMP_libiomp5_LIBRARY ${OpenMP_CXX_LIB_NAMES})
  267. endif()
  268. endif()
  269. if (CMAKE_CROSSCOMPILING)
  270. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")
  271. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
  272. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fopenmp")
  273. else()
  274. find_package(OpenMP REQUIRED)
  275. if (OPENMP_FOUND)
  276. # include_directories("${OPENMP_INCLUDES}")
  277. link_directories("${OPENMP_LIBRARIES}")
  278. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
  279. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
  280. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
  281. endif()
  282. endif()
  283. add_definitions(-DLEMMAUSEOMP) # -DEIGEN_DONT_VECTORIZE)
  284. endif()
  285. configure_file (
  286. "${PROJECT_SOURCE_DIR}/config/LemmaConfig.h.in"
  287. "${PROJECT_BINARY_DIR}/include/LemmaConfig.h"
  288. )
  289. install ( FILES ${PROJECT_BINARY_DIR}/include/LemmaConfig.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include/Lemma/ )
  290. include_directories("${PROJECT_BINARY_DIR}/include")
  291. include_directories ("${CMAKE_INSTALL_PREFIX}/include/")
  292. link_directories ("${CMAKE_INSTALL_PREFIX}/lib/")
  293. ##############
  294. # gprof hack #
  295. ##############
  296. #set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
  297. ########################################################################
  298. # Build Modules
  299. add_subdirectory (Modules)
  300. #######################################################################
  301. # CXXTEST Framework
  302. if(CXXTEST_FOUND)
  303. if (LEMMA_ENABLE_TESTING)
  304. include (CTest)
  305. enable_testing()
  306. endif()
  307. endif()
  308. ########################################################################
  309. # add a target to generate API documentation with Doxyfile.in
  310. # ALL make documentation build by default if possible
  311. find_package(Doxygen)
  312. if(DOXYGEN_FOUND)
  313. if (LEMMA_BUILD_DOCUMENTATION)
  314. # Custom header and footer option, enable in Doxygen
  315. # file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/Documentation/header.html
  316. # DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Documentation/header.html
  317. # )
  318. # file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/Documentation/footer.html
  319. # DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Documentation/footer.html
  320. # )
  321. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Documentation/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Documentation/Doxyfile @ONLY)
  322. add_custom_target(doc
  323. ALL
  324. ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Documentation/Doxyfile
  325. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  326. COMMENT "Generating API documentation with Doxygen" VERBATIM
  327. )
  328. endif (LEMMA_BUILD_DOCUMENTATION)
  329. endif(DOXYGEN_FOUND)
  330. # vim: set tabstop=4 shiftwidth=4 expandtab: