Advertisement
Guest User

Untitled

a guest
Jan 29th, 2015
456
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 33.78 KB | None | 0 0
  1. # Instructions:
  2. # $ mkdir build
  3. # $ cd build
  4. # $ cmake ..
  5. # $ make
  6.  
  7. project(shogun)
  8. cmake_minimum_required(VERSION 2.8.8)
  9. SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
  10. include(ShogunUtils)
  11.  
  12. # CCACHE
  13. OPTION(ENABLE_CCACHE "Enable ccache for compilation" ON)
  14. FIND_PACKAGE(CCache)
  15. if(CCACHE_FOUND AND ENABLE_CCACHE)
  16. SET(CCACHE "ccache" CACHE STRING "ccache")
  17. SET(CMAKE_C_COMPILER_ARG1 ${CMAKE_C_COMPILER})
  18. SET(CMAKE_C_COMPILER ${CCACHE})
  19. SET(CMAKE_CXX_COMPILER_ARG1 ${CMAKE_CXX_COMPILER})
  20. SET(CMAKE_CXX_COMPILER ${CCACHE})
  21. SET(CMAKE_C_FLAGS "${CCACHE_FLAGS} ${CMAKE_C_FLAGS}")
  22. SET(CMAKE_CXX_FLAGS "${CCACHE_FLAGS} ${CMAKE_CXX_FLAGS}")
  23. endif()
  24.  
  25. SET(CPACK_PACKAGE_CONTACT shogun@shogun-toolbox.org)
  26.  
  27. ################# VARIABLES #####################
  28. SET(DEFINES "SWIG_TYPE_TABLE=shogun;SHOGUN")
  29. SET(INCLUDES "")
  30.  
  31. SET(EXT_SRC_HEADER "h")
  32. SET(EXT_SRC_C "c")
  33. SET(EXT_SRC_CPP "cpp")
  34. SET(EXT_SRC_SWIG "_wrap.cxx")
  35. SET(EXT_SRC_TEST "_unittest.cc")
  36. SET(EXT_INP_SWIG "i")
  37. SET(EXT_IF_SWIG "py")
  38. SET(EXT_CPP_TMP "${EXT_SRC_CPP}.templ")
  39. SET(EXT_CPP_SH "${EXT_SRC_CPP}.sh")
  40. SET(EXT_CPP_PY "${EXT_SRC_CPP}.py")
  41. SET(EXT_SRC_TEST_TMP "${EXT_SRC_TEST}.jinja2")
  42.  
  43. SET(THIRD_PARTY_DIR ${CMAKE_SOURCE_DIR}/third_party)
  44. SET(LIBSHOGUN_SRC_DIR ${CMAKE_SOURCE_DIR}/src/shogun)
  45. SET(COMMON_MODULAR_SRC_DIR ${CMAKE_SOURCE_DIR}/src/interfaces/modular/)
  46.  
  47. INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src
  48. ${CMAKE_SOURCE_DIR}/src/shogun
  49. ${CMAKE_BINARY_DIR}/src
  50. ${CMAKE_BINARY_DIR}/src/shogun)
  51.  
  52. # check whether any of the modular interfaces are turned ON
  53. IF (
  54. PythonModular OR LuaModular OR RModular OR
  55. OctaveModular OR JavaModular OR PerlModular OR
  56. RubyModular OR CSharpModular
  57. )
  58. FIND_PACKAGE(SWIG 2.0.4 REQUIRED)
  59. # use our own UseSWIG.cmake in order to be able to enable ccache-swig
  60. SET(SWIG_USE_FILE ${CMAKE_SOURCE_DIR}/cmake/UseSWIG.cmake)
  61. IF(ENABLE_CCACHE AND CCACHE_SWIG)
  62. SET(CCACHE_SWIG_EXECUTABLE ${CCACHE_SWIG})
  63. ENDIF()
  64. SET(COMPILE_MODULAR_INTERFACE 1)
  65. ENDIF()
  66.  
  67. # Detect OS
  68. IF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
  69. SET(DARWIN 1)
  70. ELSEIF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
  71. SET(LINUX 1)
  72. ELSEIF(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
  73. SET(FREEBSD 1)
  74. ENDIF()
  75.  
  76. # Get processor type, sets MACHINE macro
  77. SET(MACHINE ${CMAKE_SYSTEM_PROCESSOR})
  78.  
  79. SET(EXT_LIB_SWIG_RUBY_MODULAR ".so")
  80. if(DARWIN)
  81. SET(EXT_LIB_SWIG_RUBY_MODULAR ".bundle")
  82. ENDIF()
  83.  
  84. ################ COMPILER #######################
  85. # g++ version needs to be => 4.3
  86. IF(CMAKE_COMPILER_IS_GNUCXX)
  87. # in order to support cmake 2.8.7 and older
  88. IF(NOT CMAKE_CXX_COMPILER_VERSION)
  89. include(CheckCompiler)
  90. ENDIF()
  91. IF("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "4.3.0")
  92. MESSAGE(FATAL_ERROR "g++ version is too old")
  93. ENDIF()
  94. ENDIF()
  95.  
  96. #Build type
  97. if( NOT CMAKE_BUILD_TYPE )
  98. set( CMAKE_BUILD_TYPE Release CACHE STRING
  99. "Choose the type of build, options are: Debug Release Distribution."
  100. FORCE )
  101. endif()
  102.  
  103. # set the flags for the build types
  104. IF(MSVC)
  105. SET(COMPILER_WARNINGS "/Wall")
  106. ELSE()
  107. SET(COMPILER_WARNINGS "-Wall -Wno-unused-parameter -Wformat -Wformat-security -Wparentheses -Wshadow -Wno-unknown-pragmas -Wno-deprecated")
  108. ENDIF()
  109.  
  110. IF(CMAKE_COMPILER_IS_GNUCXX)
  111. SET(RELEASE_COMPILER_FLAGS "-fexpensive-optimizations -frerun-cse-after-loop -fcse-follow-jumps -finline-functions -fschedule-insns2 -fthread-jumps -fforce-addr -fstrength-reduce -funroll-loops -mfpmath=sse")
  112. ELSEIF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  113. SET(RELEASE_COMPILER_FLAGS "-finline-functions -funroll-loops")
  114. ENDIF()
  115. SET(SWIG_CXX_COMPILER_FLAGS "-O0 -g")
  116. SET(CMAKE_C_FLAGS "${COMPILER_WARNINGS} -g ${CMAKE_C_FLAGS}")
  117. SET(CMAKE_CXX_FLAGS "${COMPILER_WARNINGS} -g ${CMAKE_CXX_FLAGS}")
  118. SET(CMAKE_C_FLAGS_RELEASE "-O3 ${RELEASE_COMPILER_FLAGS}")
  119. SET(CMAKE_CXX_FLAGS_RELEASE "-O3 ${RELEASE_COMPILER_FLAGS}")
  120. SET(CMAKE_C_FLAGS_DISTRIBUTION "-O2")
  121. SET(CMAKE_CXX_FLAGS_DISTRIBUTION "-O2")
  122.  
  123. OPTION(ENABLE_COVERAGE "Enable code coverage" OFF)
  124. IF(ENABLE_COVERAGE)
  125. IF(NOT CMAKE_COMPILER_IS_GNUCXX)
  126. MESSAGE(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
  127. ENDIF()
  128. IF (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
  129. MESSAGE(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
  130. ENDIF()
  131. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage")
  132. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
  133. SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
  134. SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} --coverage")
  135. ENDIF()
  136.  
  137. IF(ENABLE_TSAN)
  138. IF (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
  139. MESSAGE(WARNING "Thread-sanitizer results with an optimised (non-Debug) build may be misleading")
  140. ENDIF()
  141. SET(SANITIZER_FLAGS "-fsanitize=thread -fPIE")
  142. SET(SANITIZER_LIBRARY -pie)
  143. IF(CMAKE_COMPILER_IS_GNUCXX)
  144. LIST(APPEND SANITIZER_LIBRARY -ltsan)
  145. ELSEIF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  146. LIST(APPEND SANITIZER_LIBRARY -fsanitize=thread)
  147. ENDIF()
  148. ENDIF()
  149.  
  150. IF(ENABLE_ASAN)
  151. IF (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
  152. MESSAGE(WARNING "Address-sanitizer results with an optimised (non-Debug) build may be misleading")
  153. ENDIF()
  154. SET(SANITIZER_FLAGS "-fsanitize=address -fno-omit-frame-pointer")
  155. SET(SANITIZER_LIBRARY -fsanitize=address)
  156. IF(CMAKE_COMPILER_IS_GNUCXX)
  157. LIST(APPEND SANITIZER_LIBRARY -lasan)
  158. ENDIF()
  159. ENDIF()
  160.  
  161. IF(ENABLE_MSAN)
  162. IF (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
  163. MESSAGE(WARNING "Memory-sanitizer results with an optimised (non-Debug) build may be misleading")
  164. ENDIF()
  165. SET(SANITIZER_FLAGS "-fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer")
  166. SET(SANITIZER_LIBRARY)
  167. IF(CMAKE_COMPILER_IS_GNUCXX)
  168. LIST(APPEND SANITIZER_LIBRARY -lmsan)
  169. ELSEIF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  170. LIST(APPEND SANITIZER_LIBRARY -fsanitize=memory)
  171. ENDIF()
  172. ENDIF()
  173.  
  174. IF(ENABLE_UBSAN)
  175. IF (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
  176. MESSAGE(WARNING "Memory-sanitizer results with an optimised (non-Debug) build may be misleading")
  177. ENDIF()
  178. SET(SANITIZER_FLAGS "-fsanitize=undefined")
  179. SET(SANITIZER_LIBRARY)
  180. IF(CMAKE_COMPILER_IS_GNUCXX)
  181. LIST(APPEND SANITIZER_LIBRARY -lubsan)
  182. ELSEIF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  183. LIST(APPEND SANITIZER_LIBRARY -fsanitize=undefined)
  184. ENDIF()
  185. ENDIF()
  186.  
  187. # check for supported c++11 features
  188. #
  189. # clang with -std=c++11 and -stdlib=libc++ does not work
  190. # well with swig generated cxx hence disable c++11 for this case.
  191.  
  192. # this has been only fixed in swig 2.0.12 or later.
  193. IF (NOT ((CYGWIN AND ENABLE_TESTING) OR (DARWIN AND COMPILE_MODULAR_INTERFACE
  194. AND SWIG_VERSION VERSION_LESS "2.0.12")))
  195. INCLUDE(CheckCXX11Features)
  196.  
  197. IF(_HAS_CXX11_FLAG)
  198. LIST(APPEND DEFINES HAVE_CXX11)
  199. SET(HAVE_CXX11 1)
  200. SET(CMAKE_CXX_FLAGS "${CXX11_COMPILER_FLAGS} ${CMAKE_CXX_FLAGS}")
  201. SET(SWIG_CXX_COMPILER_FLAGS "${CXX11_COMPILER_FLAGS} ${SWIG_CXX_COMPILER_FLAGS}")
  202. ENDIF()
  203.  
  204. IF(_HAS_CXX0X_FLAG)
  205. LIST(APPEND DEFINES HAVE_CXX0X)
  206. SET(HAVE_CXX0X 1)
  207. SET(CMAKE_CXX_FLAGS "${CXX11_COMPILER_FLAGS} ${CMAKE_CXX_FLAGS}")
  208. SET(SWIG_CXX_COMPILER_FLAGS "${CXX11_COMPILER_FLAGS} ${SWIG_CXX_COMPILER_FLAGS}")
  209. ENDIF()
  210.  
  211. IF (HAVE_CXX11_ATOMIC)
  212. LIST(APPEND DEFINES HAVE_CXX11_ATOMIC)
  213. ENDIF()
  214. ELSEIF(DARWIN AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0.0"))
  215. # osx clang 5.0.0 or later uses libc++ by default
  216. # this is causing problems with source generated by swig version earlier than 3.0.0
  217. # force to use libstdc++ for compilation of sources
  218. SET(CMAKE_CXX_FLAGS "-stdlib=libstdc++ ${CMAKE_CXX_FLAGS}")
  219. SET(SWIG_CXX_COMPILER_FLAGS "-stdlib=libstdc++ ${SWIG_CXX_COMPILER_FLAGS}")
  220. ENDIF()
  221.  
  222. include(CheckIncludeFileCXX)
  223. CHECK_INCLUDE_FILE_CXX("unordered_map" HAVE_STD_UNORDERED_MAP)
  224. IF (HAVE_STD_UNORDERED_MAP)
  225. LIST(APPEND DEFINES HAVE_STD_UNORDERED_MAP)
  226. ENDIF()
  227.  
  228. IF(CMAKE_BUILD_TYPE MATCHES "Release")
  229. # there's a bug on FreeBSD -march=native.
  230. # for some CPU types it does not detect the right flags
  231. # see: http://www.freebsd.org/cgi/query-pr.cgi?pr=178792&cat=
  232. IF (NOT (FREEBSD AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")))
  233. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native")
  234. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
  235. SET(SWIG_CXX_COMPILER_FLAGS "${SWIG_CXX_COMPILER_FLAGS} -march=native")
  236. ENDIF()
  237. ENDIF()
  238.  
  239. ###### MALLOC LIBRARY ###########
  240. SET(EXTERNAL_MALLOC_CFLAGS "-fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")
  241. if (MALLOC_REPLACEMENT MATCHES "Jemalloc")
  242. include(external/Jemalloc)
  243.  
  244. SET(USE_JEMALLOC 1)
  245. LIST(APPEND DEFINES USE_JEMALLOC)
  246. LIST(INSERT INCLUDES 0 ${Jemalloc_INCLUDE_DIR})
  247. SET(CMAKE_CXX_FLAGS "${EXTERNAL_MALLOC_CFLAGS} ${CMAKE_CXX_FLAGS}")
  248. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${Jemalloc_LIBRARIES})
  249. elseif(MALLOC_REPLACEMENT MATCHES "TCMalloc")
  250. include(external/TCMalloc)
  251.  
  252. SET(USE_TCMALLOC 1)
  253. LIST(APPEND DEFINES USE_TCMALLOC)
  254. LIST(INSERT INCLUDES 0 ${TCMalloc_INCLUDE_DIR})
  255. SET(CMAKE_CXX_FLAGS "${EXTERNAL_MALLOC_CFLAGS} ${CMAKE_CXX_FLAGS}")
  256. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${TCMalloc_LIBRARIES})
  257. elseif(MALLOC_REPLACEMENT MATCHES "Hoard")
  258. find_package(Hoard)
  259. if (Hoard_FOUND)
  260. SET(USE_HOARD 1)
  261. LIST(APPEND DEFINES USE_HOARD)
  262. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${Hoard_LIBRARIES})
  263. else ()
  264. message(FATAL_ERROR "Unable to use hoard malloc: library not found")
  265. endif ()
  266. else()
  267. message(STATUS "Using system's malloc")
  268. endif()
  269.  
  270. ############### VERSION #####################
  271. FILE(STRINGS "@CMAKE_SOURCE_DIR@/NEWS" NEWS LIMIT_COUNT 5)
  272. STRING(REGEX REPLACE ".*SHOGUN Release version ([0-9.]*).*" "\\1" VERSION "${NEWS}")
  273. STRING(REGEX REPLACE ".*SHOGUN Release version.*\\(libshogun ([0-9.]*).*" "\\1" LIBSHOGUNVER "${NEWS}")
  274. STRING(REGEX REPLACE ".*SHOGUN Release version.*\\(libshogun ([0-9]*).*" "\\1" LIBSHOGUNSO "${NEWS}")
  275. STRING(REGEX REPLACE ".*SHOGUN Release version.*data ([0-9.]*).*" "\\1" DATAVER "${NEWS}")
  276. STRING(REGEX REPLACE "([0-9]*).[0-9]*.[0-9]*" "\\1" SHOGUN_VERSION_MAJOR "${VERSION}")
  277. STRING(REGEX REPLACE "[0-9]*.([0-9]*).[0-9]*" "\\1" SHOGUN_VERSION_MINOR "${VERSION}")
  278. STRING(REGEX REPLACE "[0-9]*.[0-9]*.([0-9]*)" "\\1" SHOGUN_VERSION_PATCH "${VERSION}")
  279.  
  280. SET(BUILD_STATIC "Build a statically linked binary" OFF)
  281. ################# EXAMPLES ##################
  282. OPTION(BUILD_EXAMPLES "Build Examples" ON)
  283.  
  284. ################# DATATYPES #################
  285. LIST(APPEND DEFINES USE_CHAR)
  286. LIST(APPEND DEFINES USE_BOOL)
  287. LIST(APPEND DEFINES USE_UINT8)
  288. LIST(APPEND DEFINES USE_UINT16)
  289. #LIST(APPEND DEFINES USE_UINT32)
  290. LIST(APPEND DEFINES USE_UINT64)
  291. #LIST(APPEND DEFINES USE_INT8)
  292. #LIST(APPEND DEFINES USE_INT16)
  293. LIST(APPEND DEFINES USE_INT32)
  294. LIST(APPEND DEFINES USE_INT64)
  295. LIST(APPEND DEFINES USE_FLOAT32)
  296. LIST(APPEND DEFINES USE_FLOAT64)
  297. LIST(APPEND DEFINES USE_COMPLEX128)
  298. #LIST(APPEND DEFINES USE_FLOATMAX)
  299.  
  300. IF(MSVC)
  301. include(external/MSIntTypes)
  302. LIST(APPEND INCLUDES ${THIRD_PARTY_DIR}/MSIntTypes)
  303.  
  304. include(external/MSDirent)
  305. LIST(APPEND INCLUDES ${MSDIRENT_INCLUDE_DIR})
  306. ENDIF()
  307.  
  308. # detect word size
  309. IF(CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT DARWIN)
  310. SET(CMAKE_SWIG_FLAGS -DSWIGWORDSIZE64)
  311. ENDIF()
  312.  
  313. #interfaces
  314. OPTION(PythonModular "Python Modular" OFF)
  315. OPTION(LuaModular "Lua Modular" OFF)
  316. OPTION(RModular "R Modular" OFF)
  317. OPTION(OctaveModular "Octave Modular" OFF)
  318. OPTION(JavaModular "Java Modular" OFF)
  319. OPTION(PerlModular "Perl Modular" OFF)
  320. OPTION(RubyModular "Ruby Modular" OFF)
  321. OPTION(CSharpModular "CSharp Modular" OFF)
  322.  
  323. OPTION(PythonStatic "Python Static" OFF)
  324. OPTION(RStatic "R Static" OFF)
  325. OPTION(CmdLineStatic "CmdLine Static" OFF)
  326. OPTION(MatlabStatic "Matlab Static" OFF)
  327. OPTION(OctaveStatic "Octave Static" OFF)
  328.  
  329. # SVMLight
  330. OPTION(USE_SVMLIGHT "SVMLight" ON)
  331. SET(SVMLightWarning "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
  332. SET(SVMLightWarning "${SVMLightWarning}\nWARNING: SHOGUN is built using SVMlight which was written")
  333. SET(SVMLightWarning "${SVMLightWarning}\nby Thorsten Joachims and uses a different non GPL compatible license.")
  334. SET(SVMLightWarning "${SVMLightWarning}\nTo build a fully GPL'd SHOGUN use")
  335. SET(SVMLightWarning "${SVMLightWarning}\nThe SVMlight license can be found in LICENSE.SVMlight. In case")
  336. SET(SVMLightWarning "${SVMLightWarning}\nyou do not know or cannot agree to the licensing terms expressed in")
  337. SET(SVMLightWarning "${SVMLightWarning}\nLICENSE.SVMlight press ctrl+c to abort configure now.")
  338. SET(SVMLightWarning "${SVMLightWarning}\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
  339. IF(USE_SVMLIGHT)
  340. LIST(APPEND DEFINES USE_SVMLIGHT)
  341. ENDIF()
  342.  
  343. #Trace memory allocs
  344. OPTION(TRACE_MEMORY_ALLOCS "Memory allocation tracing" OFF)
  345. IF(TRACE_MEMORY_ALLOCS)
  346. LIST(APPEND DEFINES TRACE_MEMORY_ALLOCS)
  347. ENDIF()
  348.  
  349. # HMM
  350. OPTION(USE_HMMDEBUG "HMM cache" OFF)
  351. IF(USE_HMMDEBUG)
  352. LIST(APPEND DEFINES USE_HMMDEBUG)
  353. ENDIF()
  354.  
  355. OPTION(USE_HMMCACHE "HMM cache" ON)
  356. IF(USE_HMMCACHE)
  357. LIST(APPEND DEFINES USE_HMMCACHE)
  358. ENDIF()
  359.  
  360. OPTION(USE_HMMPARALLEL "Parallel structures in hmm training" OFF)
  361. IF(USE_HMMPARALLEL)
  362. SET(USE_HMMPARALLEL_STRUCTURES 1)
  363. LIST(APPEND DEFINES USE_HMMPARALLEL_STRUCTURES USE_HMMPARALLEL)
  364. ENDIF()
  365.  
  366. # Viterbi path debug
  367. OPTION(USE_PATHDEBUG "Viterbi path debugging" OFF)
  368. IF(USE_PATHDEBUG)
  369. LIST(APPEND DEFINES USE_PATHDEBUG)
  370. ENDIF()
  371.  
  372. # big states
  373. OPTION(USE_BIGSTATES "Big (16bit) state" ON)
  374. IF(USE_BIGSTATES)
  375. LIST(APPEND DEFINES USE_BIGSTATES)
  376. ENDIF()
  377.  
  378. # Large file
  379. OPTION(HAVE_LARGEFILE "Large file support" ON)
  380. IF(HAVE_LARGEFILE)
  381. LIST(APPEND DEFINES HAVE_LARGEFILE)
  382. ENDIF()
  383.  
  384. #kernelcache to use 4-byte-floating-point values instead of 8-byte-doubles
  385. OPTION(USE_SHORTREAL_KERNELCACHE "Kernelcache to use 4-byte-floating-point values instead of 8-byte-doubles" ON)
  386. IF(USE_SHORTREAL_KERNELCACHE)
  387. LIST(APPEND DEFINES USE_SHORTREAL_KERNELCACHE)
  388. ENDIF()
  389.  
  390. # PRNG settings
  391. SET(MEXP "19937" CACHE STRING "PRNG Mersenne exponent")
  392. SET(SFMT_MEXP ${MEXP})
  393. SET(DSFMT_MEXP ${MEXP})
  394. LIST(APPEND DEFINES DSFMT_MEXP=${MEXP} SFMT_MEXP=${MEXP})
  395.  
  396. # Reference counting
  397. OPTION(USE_REFERENCE_COUNTING "Reference Counting" ON)
  398. IF(USE_REFERENCE_COUNTING)
  399. LIST(APPEND DEFINES USE_REFERENCE_COUNTING)
  400. ENDIF()
  401.  
  402. OPTION(USE_LOGCACHE "Use (1+exp(x)) log cache (is much faster but less accurate)" OFF)
  403. IF(USE_LOGCACHE)
  404. LIST(APPEND DEFINES USE_LOGCACHE)
  405. ENDIF()
  406.  
  407. OPTION(USE_LOGSUMARRAY "Use sum array, supposed to be a bit more accurate" OFF)
  408. IF(USE_LOGSUMARRAY)
  409. LIST(APPEND DEFINES USE_LOGSUMARRAY)
  410. ENDIF()
  411.  
  412. ######################### LIBRARIES #########################
  413.  
  414. #check for symbols
  415. include (CheckCXXSymbolExists)
  416. CHECK_CXX_SYMBOL_EXISTS(isfinite "cmath" HAVE_DECL_ISFINITE)
  417. AppendToDefines(HAVE_DECL_ISFINITE)
  418.  
  419. CHECK_CXX_SYMBOL_EXISTS(isinf "cmath" HAVE_DECL_ISINF)
  420. AppendToDefines(HAVE_DECL_ISINF)
  421.  
  422. CHECK_CXX_SYMBOL_EXISTS(isnan "cmath" HAVE_DECL_ISNAN)
  423. AppendToDefines(HAVE_DECL_ISNAN)
  424.  
  425. CHECK_CXX_SYMBOL_EXISTS(signgam "cmath" HAVE_DECL_SIGNGAM)
  426. AppendToDefines(HAVE_DECL_SIGNGAM)
  427.  
  428. # check for math functions
  429. include(CheckFunctionExists)
  430. IF(UNIX)
  431. SET(CMAKE_REQUIRED_LIBRARIES m)
  432. ENDIF()
  433. CHECK_FUNCTION_EXISTS(log2 HAVE_LOG2)
  434. IF(HAVE_LOG2)
  435. LIST(APPEND DEFINES HAVE_LOG2)
  436. ENDIF()
  437.  
  438. CHECK_FUNCTION_EXISTS(powl HAVE_POWL)
  439. IF(HAVE_POWL)
  440. LIST(APPEND DEFINES HAVE_POWL)
  441. ENDIF()
  442.  
  443. CHECK_FUNCTION_EXISTS(lgammal HAVE_LGAMMAL)
  444. IF(HAVE_LGAMMAL)
  445. LIST(APPEND DEFINES HAVE_LGAMMAL)
  446. ENDIF()
  447.  
  448. CHECK_FUNCTION_EXISTS(sqrtl HAVE_SQRTL)
  449. IF(HAVE_SQRTL)
  450. LIST(APPEND DEFINES HAVE_SQRTL)
  451. ENDIF()
  452.  
  453. CHECK_FUNCTION_EXISTS(finite HAVE_FPCLASS)
  454. AppendToDefines(HAVE_FPCLASS)
  455.  
  456. CHECK_FUNCTION_EXISTS(fpclass HAVE_FPCLASS)
  457. AppendToDefines(HAVE_FPCLASS)
  458.  
  459. CHECK_FUNCTION_EXISTS(isfinite HAVE_ISFINITE)
  460. AppendToDefines(HAVE_ISFINITE)
  461.  
  462. CHECK_FUNCTION_EXISTS(isinf HAVE_ISINF)
  463. AppendToDefines(HAVE_ISINF)
  464.  
  465. CHECK_FUNCTION_EXISTS(isnan HAVE_ISNAN)
  466. AppendToDefines(HAVE_ISNAN)
  467.  
  468. include(CheckCXXSourceCompiles)
  469. CHECK_CXX_SOURCE_COMPILES(
  470. "#include <cmath>\nint main() { return std::isinf( 0 ); }\n"
  471. HAVE_STD_ISINF )
  472. AppendToDefines(HAVE_STD_ISINF)
  473.  
  474. CHECK_CXX_SOURCE_COMPILES(
  475. "#include <cmath>\nint main() { return std::isfinite( 0 ); }\n"
  476. HAVE_STD_ISFINITE )
  477. AppendToDefines(HAVE_STD_ISFINITE)
  478.  
  479. CHECK_CXX_SOURCE_COMPILES(
  480. "#include <cmath>\nint main() { return std::isnan( 0 ); }\n"
  481. HAVE_STD_ISNAN )
  482. AppendToDefines(HAVE_STD_ISNAN)
  483.  
  484. # check SSE and SSE2 intrinsics header
  485. IF(NOT CYGWIN)
  486. include(CheckIncludeFile)
  487. CHECK_INCLUDE_FILE(xmmintrin.h HAVE_BUILTIN_VECTOR)
  488. CHECK_INCLUDE_FILE(emmintrin.h HAVE_SSE2)
  489. IF(HAVE_SSE2)
  490. LIST(APPEND DEFINES HAVE_SSE2)
  491. ENDIF(HAVE_SSE2)
  492. ENDIF(NOT CYGWIN)
  493.  
  494. ###### checks for random
  495. CHECK_FUNCTION_EXISTS(arc4random HAVE_ARC4RANDOM)
  496. IF(NOT HAVE_ARC4RANDOM)
  497. # assume that /dev/random is non-blocking if /dev/urandom does not exist
  498. if(EXISTS /dev/urandom)
  499. set(DEV_RANDOM "/dev/urandom" CACHE INTERNAL "" FORCE)
  500. elseif( EXISTS /dev/random )
  501. set(DEV_RANDOM "/dev/random" CACHE INTERNAL "" FORCE)
  502. endif()
  503. ENDIF()
  504.  
  505. FIND_PACKAGE(GDB)
  506. IF (GDB_FOUND)
  507. SET(GDB_DEFAULT_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/src/.gdb)
  508. ENDIF()
  509.  
  510. FIND_PACKAGE(Mosek)
  511. IF (MOSEK_FOUND)
  512. SET(USE_MOSEK 1)
  513. LIST(APPEND DEFINES USE_MOSEK)
  514. LIST(APPEND INCLUDES ${MOSEK_INCLUDE_DIR})
  515. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${MOSEK_LIBRARY})
  516. ENDIF()
  517.  
  518. FIND_PACKAGE(Threads)
  519. IF (CMAKE_USE_PTHREADS_INIT)
  520. SET(HAVE_PTHREAD 1)
  521. LIST(APPEND DEFINES HAVE_PTHREAD)
  522. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${CMAKE_THREAD_LIBS_INIT})
  523. ENDIF()
  524.  
  525. FIND_PACKAGE(OpenMP)
  526. if (OPENMP_FOUND)
  527. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
  528. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
  529. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
  530. endif()
  531.  
  532. FIND_PACKAGE(PkgConfig)
  533.  
  534. # prefer original LAPACK, if needed
  535. OPTION(USE_ORIGINAL_LAPACK "Original LAPACK" OFF)
  536.  
  537. FIND_PACKAGE(LAPACK)
  538. IF (LAPACK_FOUND)
  539. # find out whether it is Accelerate.framework we found for LaPack/BLAS
  540. IF("${LAPACK_LIBRARIES}" MATCHES ".*/Accelerate.framework$")
  541. SET(HAVE_MVEC 1)
  542. LIST(APPEND DEFINES HAVE_MVEC)
  543.  
  544. #Accelerate framework provides HAVE_CATLAS
  545. SET(HAVE_CATLAS 1)
  546. LIST(APPEND DEFINES HAVE_CATLAS)
  547.  
  548. SET(HAVE_LAPACK 1)
  549. LIST(APPEND DEFINES HAVE_LAPACK)
  550. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${LAPACK_LIBRARIES})
  551. ELSEIF("${LAPACK_LIBRARIES}" MATCHES ".*/mkl_.*")
  552. SET(HAVE_LAPACK 1)
  553. SET(HAVE_MKL 1)
  554. LIST(APPEND DEFINES HAVE_LAPACK HAVE_MKL)
  555. ELSE()
  556. FIND_PACKAGE(Atlas)
  557. IF(ATLAS_FOUND)
  558. SET(HAVE_ATLAS 1)
  559. SET(HAVE_LAPACK 1)
  560. LIST(APPEND DEFINES HAVE_LAPACK HAVE_ATLAS)
  561. LIST(APPEND INCLUDES ${ATLAS_INCLUDES})
  562. IF(USE_ORIGINAL_LAPACK)
  563. SET(ATLAS_CLAPACK_LIBRARY)
  564. FOREACH(ITR ${ATLAS_LIBRARIES})
  565. IF(ITR MATCHES ".*atlas.*lapack.*" OR ITR MATCHES ".*lapack.*atlas.*")
  566. STRING(REGEX REPLACE "lapack" "clapack" ITR ${ITR})
  567. LIST(APPEND ATLAS_CLAPACK_LIBRARY ${ITR})
  568. ENDIF(ITR MATCHES ".*atlas.*lapack.*" OR ITR MATCHES ".*lapack.*atlas.*")
  569. ENDFOREACH(ITR ${ATLAS_LIBRARIES})
  570. MESSAGE(STATUS "using ATLAS-CLAPACK from: ${ATLAS_CLAPACK_LIBRARY}")
  571. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${LAPACK_LIBRARIES} ${ATLAS_CLAPACK_LIBRARY} ${ATLAS_LIBRARIES})
  572. ELSE(USE_ORIGINAL_LAPACK)
  573. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${ATLAS_LIBRARIES})
  574. ENDIF(USE_ORIGINAL_LAPACK)
  575. ELSE()
  576. FIND_PACKAGE(CBLAS)
  577. if(CBLAS_LIBRARY)
  578. SET(HAVE_LAPACK 1)
  579. LIST(APPEND DEFINES HAVE_LAPACK)
  580. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${LAPACK_LIBRARIES} ${CBLAS_LIBRARY})
  581. else()
  582. SET(HAVE_LAPACK 1)
  583. LIST(APPEND DEFINES HAVE_LAPACK)
  584. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${LAPACK_LIBRARIES})
  585. endif()
  586. ENDIF()
  587. ENDIF()
  588. ENDIF()
  589.  
  590. FIND_PACKAGE(GLPK)
  591. IF (GLPK_FOUND)
  592. SET(USE_GLPK 1)
  593. LIST(APPEND DEFINES USE_GLPK)
  594. LIST(APPEND INCLUDES ${GLPK_INCLUDE_DIRS})
  595. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${GLPK_LIBRARY})
  596. ENDIF()
  597.  
  598. FIND_PACKAGE(CPLEX)
  599. IF (CPLEX_FOUND)
  600. SET(USE_CPLEX 1)
  601. LIST(APPEND DEFINES USE_CPLEX)
  602. LIST(APPEND INCLUDES ${CPLEX_INCLUDE_DIR})
  603. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${CPLEX_LIBRARY})
  604. ENDIF()
  605.  
  606. FIND_PACKAGE(ARPACK)
  607. IF (ARPACK_FOUND)
  608. SET(HAVE_ARPACK 1)
  609. LIST(APPEND DEFINES HAVE_ARPACK)
  610. LIST(APPEND INCLUDES ${ARPACK_INCLUDE_DIR})
  611. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${ARPACK_LIB})
  612. ENDIF()
  613.  
  614. OPTION(BUNDLE_EIGEN "Bundle Eigen" OFF)
  615. IF(BUNDLE_EIGEN)
  616. include(external/Eigen3)
  617. SET(HAVE_EIGEN3 1)
  618. LIST(APPEND DEFINES HAVE_EIGEN3)
  619. LIST(APPEND SYSTEM_INCLUDES ${EIGEN_INCLUDE_DIR})
  620. ELSE()
  621. FIND_PACKAGE(Eigen3 3.1.2)
  622. IF (EIGEN3_FOUND)
  623. SET(HAVE_EIGEN3 1)
  624. LIST(APPEND DEFINES HAVE_EIGEN3)
  625. LIST(APPEND SYSTEM_INCLUDES ${EIGEN_INCLUDE_DIR})
  626. ENDIF()
  627. ENDIF()
  628.  
  629. # COLPACK
  630. OPTION(BUNDLE_COLPACK "Bundle COLPACK" OFF)
  631. IF(BUNDLE_COLPACK)
  632. include(external/ColPack)
  633. SET(HAVE_COLPACK 1)
  634. LIST(APPEND DEFINES HAVE_COLPACK)
  635. LIST(APPEND INCLUDES ${COLPACK_INCLUDE_DIRS})
  636. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${COLPACK_LDFLAGS})
  637. ELSE()
  638. IF (PKG_CONFIG_FOUND)
  639. pkg_search_module(COLPACK libColPack>=1.0.9 ColPack>=1.0.9)
  640. IF (COLPACK_FOUND)
  641. SET(HAVE_COLPACK 1)
  642. LIST(APPEND DEFINES HAVE_COLPACK)
  643. LIST(APPEND INCLUDES ${COLPACK_INCLUDE_DIRS})
  644. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${COLPACK_LDFLAGS})
  645. ENDIF()
  646. ENDIF()
  647. ENDIF()
  648.  
  649. OPTION(BUNDLE_NLOPT "Bundle NLOPT" OFF)
  650. IF(BUNDLE_NLOPT)
  651. include(external/NLopt)
  652. SET(HAVE_NLOPT 1)
  653. LIST(APPEND DEFINES HAVE_NLOPT)
  654. LIST(APPEND INCLUDES ${NLOPT_INCLUDE_DIR})
  655. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${NLOPT_LIBRARIES})
  656. ELSE()
  657. FIND_PACKAGE(NLopt)
  658. IF (NLOPT_FOUND)
  659. SET(HAVE_NLOPT 1)
  660. LIST(APPEND DEFINES HAVE_NLOPT)
  661. LIST(APPEND INCLUDES ${NLOPT_INCLUDE_DIR})
  662. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${NLOPT_LIBRARIES})
  663. ENDIF()
  664. ENDIF()
  665.  
  666. FIND_PACKAGE(LpSolve)
  667. IF (LPSOLVE_FOUND)
  668. SET(USE_LPSOLVE 1)
  669. LIST(APPEND DEFINES USE_LPSOLVE YY_NEVER_INTERACTIVE PARSER_LP INVERSE_ACTIVE=INVERSE_LUSOL RoleIsExternalInvEngine)
  670. LIST(APPEND INCLUDES ${LPSOLVE_INCLUDE_DIR})
  671. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${LPSOLVE_LIBRARIES})
  672. ENDIF()
  673.  
  674. FIND_PACKAGE(ColPack)
  675. IF(COLPACK_FOUND)
  676. SET(HAVE_COLPACK 1)
  677. LIST(APPEND DEFINES HAVE_COLPACK)
  678. LIST(APPEND INCLUDES ${COLPACK_INCLUDE_DIR})
  679. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${COLPACK_LIBRARIES})
  680. ENDIF()
  681.  
  682. OPTION(BUNDLE_ARPREC "Bundle ARPREC" OFF)
  683. IF(BUNDLE_ARPREC)
  684. include(external/ARPREC)
  685. SET(HAVE_ARPREC 1)
  686. LIST(APPEND DEFINES HAVE_ARPREC)
  687. LIST(APPEND INCLUDES ${ARPREC_INCLUDE_DIR})
  688. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${ARPREC_LIBRARIES})
  689. ELSE()
  690. FIND_PACKAGE(ARPREC)
  691. IF(ARPREC_FOUND)
  692. SET(HAVE_ARPREC 1)
  693. LIST(APPEND DEFINES HAVE_ARPREC)
  694. LIST(APPEND INCLUDES ${ARPREC_INCLUDE_DIR})
  695. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${ARPREC_LIBRARIES})
  696. ENDIF()
  697. ENDIF()
  698.  
  699. FIND_PACKAGE(Doxygen)
  700. IF(DOXYGEN_FOUND)
  701. SET(HAVE_DOXYGEN 1)
  702. LIST(APPEND DEFINES HAVE_DOXYGEN)
  703. ENDIF()
  704.  
  705. # detect PYTHON
  706. FIND_PACKAGE(PythonInterp REQUIRED)
  707.  
  708. # JSON
  709. OPTION(BUNDLE_JSON "Bundle JSON" OFF)
  710. IF(BUNDLE_JSON)
  711. include(external/JSON)
  712. SET(HAVE_JSON 1)
  713. LIST(APPEND DEFINES HAVE_JSON)
  714. LIST(APPEND INCLUDES ${JSON_INCLUDE_DIRS})
  715. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${JSON_LDFLAGS})
  716. ELSE()
  717. IF (PKG_CONFIG_FOUND)
  718. pkg_search_module(JSON libjson>=0.11 json>=0.11 json-c>=0.11)
  719. IF (JSON_FOUND)
  720. SET(HAVE_JSON 1)
  721. LIST(APPEND DEFINES HAVE_JSON)
  722. LIST(APPEND INCLUDES ${JSON_INCLUDE_DIRS})
  723. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${JSON_LDFLAGS})
  724. ENDIF()
  725. ENDIF()
  726. ENDIF()
  727.  
  728. FIND_PACKAGE(LibXml2)
  729. IF (LIBXML2_FOUND)
  730. SET(HAVE_XML 1)
  731. LIST(APPEND DEFINES HAVE_XML)
  732. LIST(APPEND INCLUDES ${LIBXML2_INCLUDE_DIR})
  733. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${LIBXML2_LIBRARIES})
  734. ENDIF()
  735.  
  736. FIND_PACKAGE(HDF5)
  737. IF (HDF5_FOUND)
  738. SET(HAVE_HDF5 1)
  739. LIST(APPEND DEFINES HAVE_HDF5)
  740. LIST(APPEND INCLUDES ${HDF5_INCLUDE_DIRS})
  741. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${HDF5_LIBRARIES})
  742. ENDIF()
  743.  
  744. FIND_PACKAGE(CURL)
  745. IF (CURL_FOUND)
  746. SET(HAVE_CURL 1)
  747. LIST(APPEND DEFINES HAVE_CURL)
  748. LIST(APPEND INCLUDES ${CURL_INCLUDE_DIRS})
  749. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${CURL_LIBRARIES})
  750. ENDIF(CURL_FOUND)
  751.  
  752. FIND_PACKAGE(ZLIB)
  753. IF (ZLIB_FOUND)
  754. SET(USE_GZIP 1)
  755. LIST(APPEND DEFINES USE_GZIP)
  756. LIST(APPEND INCLUDES ${ZLIB_INCLUDE_DIRS})
  757. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${ZLIB_LIBRARIES})
  758. ENDIF()
  759.  
  760. FIND_PACKAGE(BZip2)
  761. IF (BZIP2_FOUND)
  762. SET(USE_BZIP2 1)
  763. LIST(APPEND DEFINES USE_BZIP2)
  764. LIST(APPEND INCLUDES ${BZIP_INCLUDE_DIRS})
  765. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${BZIP2_LIBRARIES})
  766. ENDIF()
  767.  
  768. FIND_PACKAGE(LibLZMA)
  769. IF (LIBLZMA_FOUND)
  770. SET(USE_LZMA 1)
  771. LIST(APPEND DEFINES USE_LZMA)
  772. LIST(APPEND INCLUDES ${LIBLZMA_INCLUDE_DIRS})
  773. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${LIBLZMA_LIBRARIES})
  774. ENDIF()
  775.  
  776. FIND_PACKAGE(SNAPPY)
  777. IF (SNAPPY_FOUND)
  778. SET(USE_SNAPPY 1)
  779. LIST(APPEND DEFINES USE_SNAPPY)
  780. LIST(APPEND INCLUDES ${SNAPPY_INCLUDE_DIR})
  781. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${SNAPPY_LIBRARIES})
  782. ENDIF()
  783.  
  784. FIND_PACKAGE(LZO)
  785. IF (LZO_FOUND)
  786. SET(USE_LZO 1)
  787. LIST(APPEND DEFINES USE_LZO)
  788. LIST(APPEND INCLUDES ${LZO_INCLUDE_DIR})
  789. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${LZO_LIBS})
  790. ENDIF()
  791.  
  792. FIND_PACKAGE(Spinlock)
  793. IF (SPINLOCK_FOUND)
  794. SET(USE_SPINLOCKS 1)
  795. LIST(APPEND DEFINES USE_SPINLOCKS)
  796. ENDIF()
  797.  
  798. FIND_PACKAGE(Protobuf)
  799. IF (PROTOBUF_FOUND)
  800. SET(HAVE_PROTOBUF 1)
  801. LIST(APPEND DEFINES HAVE_PROTOBUF)
  802. LIST(APPEND INCUDES ${PROTOBUF_INCLUDE_DIRS})
  803. SET(POSTLINKFLAGS ${POSTLINKFLAGS} ${PROTOBUF_LIBRARIES})
  804. ENDIF()
  805.  
  806. #SWIG Interfaces
  807. SET(CMAKE_SWIG_FLAGS "${CMAKE_SWIG_FLAGS};-w473;-w454;-w312;-w325;-fvirtual")
  808.  
  809. OPTION(USE_SWIG_DIRECTORS "Enable SWIG director classes" OFF)
  810. IF(USE_SWIG_DIRECTORS)
  811. LIST(APPEND DEFINES USE_SWIG_DIRECTORS)
  812. ENDIF()
  813.  
  814. # python modular
  815. IF (PythonModular OR PythonStatic)
  816. # find python library for the found python interpreter
  817. # i.e. versions should match!
  818. set(Python_ADDITIONAL_VERSIONS ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR})
  819. FIND_PACKAGE(PythonLibs REQUIRED)
  820. FIND_PACKAGE(NumPy REQUIRED)
  821.  
  822. LIST(APPEND DEFINES HAVE_PYTHON)
  823.  
  824. IF(PythonModular)
  825. #custom swig flags for python modular interface
  826. IF(${PYTHON_VERSION_MAJOR} VERSION_EQUAL 3)
  827. SET(TARGET_SWIGFLAGS "-builtin\;-modern\;-modernargs\;-py3")
  828. LIST(APPEND DEFINES PYTHON3)
  829. ELSE()
  830. SET(TARGET_SWIGFLAGS "-builtin\;-modern\;-modernargs")
  831. ENDIF()
  832.  
  833. IF(EXISTS ${CMAKE_SOURCE_DIR}/src/interfaces/python_modular)
  834. add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/python_modular)
  835. ENDIF()
  836. ENDIF()
  837.  
  838. IF(PythonStatic)
  839. IF(EXISTS ${CMAKE_SOURCE_DIR}/src/interfaces/python_static)
  840. add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/python_static)
  841. ENDIF()
  842. ENDIF()
  843. ENDIF()
  844.  
  845. # lua modular
  846. IF (LuaModular)
  847. #FIND_PACKAGE(Lua51 REQUIRED)
  848. pkg_search_module(LUA REQUIRED lua lua5.1)
  849. IF (NOT LUA_FOUND)
  850. MESSAGE(FATAL_ERROR "Lua could not be found!\n"
  851. "Lua is required for compiling lua modular interface!")
  852. ENDIF ()
  853. SET(LUA_EXECUTABLE lua)
  854. UNSET(TARGET_SWIGFLAGS)
  855. IF(EXISTS ${CMAKE_SOURCE_DIR}/src/interfaces/lua_modular)
  856. add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/lua_modular)
  857. ENDIF()
  858. ENDIF()
  859.  
  860. # java modular
  861. IF (JavaModular)
  862. FIND_PACKAGE(Java REQUIRED)
  863. FIND_PACKAGE(JNI REQUIRED)
  864.  
  865. #find jblas
  866. INCLUDE(UseJava)
  867. FIND_JAR(JBLAS NAMES jblas jblas-1.2.0
  868. PATHS /usr/lib/java /opt/local/share/java
  869. ENV JBLAS_PATH)
  870. IF(JBLAS)
  871. LIST(APPEND DEFINES HAVE_JBLAS)
  872. SET(HAVE_JBLAS 1)
  873. ELSE()
  874. MESSAGE(FATAL_ERROR "JBlas could not be found!\n"
  875. "It is required for java modular interface!!!")
  876. ENDIF()
  877.  
  878. SET(TARGET_SWIGFLAGS "-package\;org.shogun")
  879. IF(EXISTS ${CMAKE_SOURCE_DIR}/src/interfaces/java_modular)
  880. add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/java_modular)
  881. ENDIF()
  882. ENDIF()
  883.  
  884. # ruby modular
  885. IF (RubyModular)
  886. FIND_PACKAGE(Ruby REQUIRED)
  887. FIND_PACKAGE(RubyNArray REQUIRED)
  888. SET(NARRAY_LIB ${RUBY_NARRAY_LIBRARY})
  889. UNSET(TARGET_SWIGFLAGS)
  890. add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/ruby_modular)
  891. ENDIF()
  892.  
  893. # octave modular
  894. IF (OctaveModular OR OctaveStatic)
  895. FIND_PACKAGE(Octave 3.6 REQUIRED)
  896. LIST(APPEND DEFINES HAVE_OCTAVE)
  897. LIST(APPEND DEFINES "OCTAVE_APIVERSION=${OCTAVE_API_VERSION}")
  898. SET(OCTAVE_APIVERSION ${OCTAVE_API_VERSION})
  899.  
  900. IF(OctaveModular)
  901. UNSET(TARGET_SWIGFLAGS)
  902. IF(EXISTS ${CMAKE_SOURCE_DIR}/src/interfaces/octave_modular)
  903. add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/octave_modular)
  904. ENDIF()
  905. ENDIF()
  906.  
  907. IF(OctaveStatic)
  908. IF(EXISTS ${CMAKE_SOURCE_DIR}/src/interfaces/octave_static)
  909. add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/octave_static)
  910. ENDIF()
  911. ENDIF()
  912. ENDIF()
  913.  
  914. # csharp modular
  915. IF (CSharpModular)
  916. FIND_PACKAGE(CSharp REQUIRED)
  917. UNSET(TARGET_SWIGFLAGS)
  918. IF(EXISTS ${CMAKE_SOURCE_DIR}/src/interfaces/csharp_modular)
  919. add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/csharp_modular)
  920. ENDIF()
  921. ENDIF()
  922.  
  923. # r modular
  924. IF (RModular OR RStatic)
  925. FIND_PACKAGE(R REQUIRED)
  926.  
  927. IF (RModular)
  928. UNSET(TARGET_SWIGFLAGS)
  929. IF(EXISTS ${CMAKE_SOURCE_DIR}/src/interfaces/r_modular)
  930. add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/r_modular)
  931. ENDIF()
  932. ENDIF()
  933.  
  934. IF (RStatic)
  935. IF(EXISTS ${CMAKE_SOURCE_DIR}/src/interfaces/r_static)
  936. add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/r_static)
  937. ENDIF()
  938. ENDIF()
  939. ENDIF()
  940.  
  941. # perl modular
  942. IF (PerlModular)
  943. FIND_PACKAGE(FindPerlLibs REQUIRED)
  944. UNSET(TARGET_SWIGFLAGS)
  945. IF(EXISTS ${CMAKE_SOURCE_DIR}/src/interfaces/perl_modular)
  946. #add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/perl_modular)
  947. ENDIF()
  948. ENDIF()
  949.  
  950. IF (MatlabStatic)
  951. FIND_PACKAGE(Matlab REQUIRED)
  952. IF(MATLAB_FOUND)
  953. IF(EXISTS ${CMAKE_SOURCE_DIR}/src/interfaces/matlab_modular)
  954. add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/matlab_static)
  955. ENDIF()
  956. ELSE()
  957. MESSAGE(FATAL_ERROR "Could not find Matlab, which is required for compiling matlab_static interface. Try setting MATLAB_ROOT enviroment variable to the right path")
  958. ENDIF()
  959. ENDIF()
  960.  
  961. IF (CmdLineStatic)
  962. IF(EXISTS ${CMAKE_SOURCE_DIR}/src/interfaces/cmdline_static)
  963. add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/cmdline_static)
  964. ENDIF()
  965. ENDIF()
  966.  
  967. IF (SVMLight)
  968. MESSAGE(STATUS ${SVMLightWarning})
  969. ENDIF()
  970.  
  971. ################# TESTING ###################
  972. #TODO: finish!!!
  973. OPTION(BUILD_DASHBOARD_REPORTS "Set to ON to activate reporting of Shogun builds" OFF)
  974. IF(BUILD_DASHBOARD_REPORTS)
  975. file(TO_CMAKE_PATH "${CMAKE_SOURCE_DIR}/configs/valgrind.supp" VALGRIND_SUPPRESSION_FILE)
  976. SET(MEMORYCHECK_SUPPRESSIONS_FILE ${VALGRIND_SUPPRESSION_FILE} CACHE FILEPATH "File that contains suppressions for the memory checker")
  977. SET(MEMORYCHECK_COMMAND_OPTIONS "-q --tool=memcheck --leak-check=full --track-origins=yes --num-callers=50 --error-exitcode=1")
  978. include(CTest)
  979. ENDIF()
  980.  
  981. OPTION(ENABLE_TESTING "Enable testing" OFF)
  982. OPTION(TRAVIS_DISABLE_UNIT_TESTS "Disable unit testing to speed up jobs on travis-ci" OFF)
  983. OPTION(TRAVIS_DISABLE_LIBSHOGUN_TESTS "Disable libshogun tests to speed up jobs on travis-ci" OFF)
  984. IF(ENABLE_TESTING)
  985. FIND_PACKAGE(Jinja2)
  986. IF(NOT BUILD_DASHBOARD_REPORTS)
  987. enable_testing()
  988. ENDIF()
  989.  
  990. IF(EXISTS ${CMAKE_SOURCE_DIR}/tests)
  991. # add integration tests
  992. add_subdirectory(${CMAKE_SOURCE_DIR}/tests/integration)
  993.  
  994.  
  995. # add unit tests
  996. IF (NOT TRAVIS_DISABLE_UNIT_TESTS)
  997. add_subdirectory(${CMAKE_SOURCE_DIR}/tests/unit)
  998. ENDIF()
  999. ENDIF()
  1000. ENDIF()
  1001.  
  1002. # save configuration options
  1003. MergeCFLAGS()
  1004. SET(CONFIGURE_OPTIONS "TODO")
  1005. SET(COMPFLAGS_CPP "${MERGED_CXX_FLAGS}")
  1006. SET(LINKFLAGS "${POSTLINKFLAGS}")
  1007.  
  1008. IF(EXISTS ${CMAKE_SOURCE_DIR}/src/shogun)
  1009. add_subdirectory(${CMAKE_SOURCE_DIR}/src/shogun)
  1010. ENDIF()
  1011.  
  1012. IF(EXISTS ${CMAKE_SOURCE_DIR}/examples)
  1013. IF(BUILD_EXAMPLES OR ENABLE_TESTING)
  1014. add_subdirectory(${CMAKE_SOURCE_DIR}/examples)
  1015. ENDIF()
  1016. ENDIF()
  1017.  
  1018. # general cpack settings
  1019. set(CPACK_PACKAGE_NAME "shogun")
  1020. set(CPACK_PACKAGE_VENDOR "shogun")
  1021. #SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/src/README")
  1022. #SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/src/COPYRIGHT")
  1023. set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Shogun Machine Learning Toolbox")
  1024. set(CPACK_PACKAGE_VERSION ${VERSION})
  1025. set(CPACK_PACKAGE_VERSION_MAJOR ${SHOGUN_VERSION_MAJOR})
  1026. set(CPACK_PACKAGE_VERSION_MINOR ${SHOGUN_VERSION_MINOR})
  1027. set(CPACK_PACKAGE_VERSION_PATCH ${SHOGUN_VERSION_PATCH})
  1028.  
  1029. # debian package settings
  1030. set(CPACK_DEB_COMPONENT_INSTALL ON)
  1031.  
  1032. # rpm package settings
  1033. set(CPACK_RPM_COMPONENT_INSTALL ON)
  1034.  
  1035. INCLUDE(CPack)
  1036.  
  1037. message(STATUS "===================================================================================================================")
  1038. message(STATUS "Summary of Configuration Variables")
  1039. include(FeatureSummary)
  1040. feature_summary(WHAT ALL)
  1041.  
  1042. message(STATUS "===================================================================================================================")
  1043. message(STATUS "Enabled Interfaces")
  1044.  
  1045. message(STATUS " libshogun is ON")
  1046.  
  1047. PrintInterfaceStatus("python modular" PythonModular)
  1048. PrintInterfaceStatus("octave modular" OctaveModular)
  1049. PrintInterfaceStatus("java modular" JavaModular)
  1050. PrintInterfaceStatus("perl modular" PerlModular)
  1051. PrintInterfaceStatus("ruby modular" RubyModular)
  1052. PrintInterfaceStatus("csharp modular" CSharpModular)
  1053. PrintInterfaceStatus("R modular" RModular)
  1054. PrintInterfaceStatus("lua modular" LuaModular)
  1055.  
  1056. message(STATUS "")
  1057. message(STATUS "Enabled legacy interfaces")
  1058. PrintInterfaceStatus("cmdline static" CmdLineStatic)
  1059. PrintInterfaceStatus("python static" PythonStatic)
  1060. PrintInterfaceStatus("octave static" OctaveStatic)
  1061. PrintInterfaceStatus("matlab static" MatlabStatic)
  1062. PrintInterfaceStatus("R static" RStatic)
  1063.  
  1064. message(STATUS "===================================================================================================================")
  1065.  
  1066. message(STATUS "To compile shogun type")
  1067. message(STATUS " make")
  1068. message(STATUS "")
  1069. message(STATUS "To install shogun to ${CMAKE_INSTALL_PREFIX} type")
  1070. message(STATUS " make install")
  1071. message(STATUS "")
  1072. message(STATUS "or to install to a custom directory")
  1073. message(STATUS " make install DESTDIR=/my/special/path")
  1074. message(STATUS " (or rerun cmake with -DCMAKE_INSTALL_PREFIX=/my/special/path) to just change the prefix")
  1075. message(STATUS "===================================================================================================================")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement