Light1992

CMakeLists.txt

Jun 26th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.13 KB | None | 0 0
  1. cmake_minimum_required(VERSION 3.9)
  2.  
  3. if(DEFINED ENV{CC})
  4. set(CC $ENV{CC})
  5. else()
  6. set(CC gcc)
  7. endif()
  8. message("CC: ${CC}")
  9.  
  10. set(CC_VERSION "")
  11. if(${CC} MATCHES ^gcc-)
  12. string(REGEX REPLACE "gcc-" "" CC_VERSION ${CC})
  13. endif()
  14. message("CC version: ${CC_VERSION}")
  15.  
  16. enable_testing()
  17.  
  18. project(Salmon)
  19.  
  20. option(USE_SHARED_LIBS "Use shared instead of static libraries" OFF)
  21.  
  22. # auto-populate version:
  23. # from https://stackoverflow.com/questions/47066115/cmake-get-version-from-multi-line-text-file
  24. file(READ "current_version.txt" ver)
  25.  
  26. string(REGEX MATCH "VERSION_MAJOR ([0-9]*)" _ ${ver})
  27. set(ver_major ${CMAKE_MATCH_1})
  28.  
  29. string(REGEX MATCH "VERSION_MINOR ([0-9]*)" _ ${ver})
  30. set(ver_minor ${CMAKE_MATCH_1})
  31.  
  32. string(REGEX MATCH "VERSION_PATCH ([0-9]*)" _ ${ver})
  33. set(ver_patch ${CMAKE_MATCH_1})
  34.  
  35. set(CPACK_PACKAGE_VERSION_MAJOR ${ver_major})
  36. set(CPACK_PACKAGE_VERSION_MINOR ${ver_minor})
  37. set(CPACK_PACKAGE_VERSION_PATCH ${ver_patch})
  38.  
  39. set(CPACK_PACKAGE_VERSION "${ver_major}.${ver_minor}.${ver_patch}")
  40. message("version: ${CPACK_PACKAGE_VERSION}")
  41.  
  42. set(PROJECT_VERSION ${CPACK_PACKAGE_VERSION})
  43. set(CPACK_GENERATOR "TGZ")
  44. set(CPACK_SOURCE_GENERATOR "TGZ")
  45. set(CPACK_PACKAGE_VENDOR "Stony Brook University")
  46. set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Salmon - Wicked-fast RNA-seq isoform quantification using lightweight mapping")
  47. set(CPACK_PACKAGE_NAME
  48. "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
  49. set(CPACK_SOURCE_PACKAGE_FILE_NAME
  50. "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}-Source")
  51.  
  52. set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
  53.  
  54. # Set a default build type if none was specified
  55. set(default_build_type "Release")
  56.  
  57. if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  58. message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
  59. set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
  60. STRING "Choose the type of build." FORCE)
  61. # Set the possible values of build type for cmake-gui
  62. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
  63. "Debug" "Release")
  64. endif()
  65.  
  66. ## Set the standard required compile flags
  67. # Nov 18th --- removed -DHAVE_CONFIG_H
  68. set(REMOVE_WARNING_FLAGS "-Wno-unused-function;-Wno-unused-local-typedefs")
  69. set(TGT_COMPILE_FLAGS "-ftree-vectorize;-funroll-loops;-fPIC;-fomit-frame-pointer;-O3;-DNDEBUG")
  70. set(TGT_WARN_FLAGS "-Wall;-Wno-unknown-pragmas;-Wno-reorder;-Wno-unused-variable;-Wreturn-type;-Werror=return-type;${REMOVE_WARNING_FLAGS}")
  71.  
  72.  
  73. ###
  74. # Sanitizers BEGIN
  75. ###
  76. #list(APPEND TGT_COMPILE_FLAGS "-fsanitize=address")
  77. #list(APPEND TGT_COMPILE_FLAGS "-fsanitize=undefined")
  78. #set(CMAKE_LINK_FLAGS "-fsanitize=address")
  79. #list(APPEND CMAKE_LINK_FLAGS "-fsanitize=undefined")
  80. ###
  81. # Sanitizers END
  82. ###
  83.  
  84. if(APPLE)
  85. set(WARNING_IGNORE_FLAGS "-Wno-deprecated-register")
  86. list(APPEND TGT_WARN_FLAGS -Wno-deprecated-register)
  87. else()
  88. set(WARNING_IGNORE_FLAGS "")
  89. endif()
  90.  
  91. ## Prefer static to dynamic libraries
  92. if(NOT USE_SHARED_LIBS)
  93. set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
  94. endif()
  95.  
  96. include(CheckIPOSupported)
  97.  
  98. set(THREADS_PREFER_PTHREAD_FLAG ON)
  99. find_package(Threads REQUIRED)
  100.  
  101. set(ICU_LIBS "")
  102. set(ICU_INC_DIRS "")
  103.  
  104. set(CMAKE_CXX_STANDARD 14)
  105. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  106. set(CMAKE_CXX_EXTENSIONS OFF)
  107. set(CXXSTDFLAG "-std=c++14")
  108. set(GCCVERSION "5.2")
  109.  
  110. if(CONDA_BUILD)
  111. message("Building with CONDA_BUILD flag")
  112. if(APPLE)
  113. # Do we require all these components? Any others?
  114. find_package(ICU COMPONENTS data i18n io uc REQUIRED)
  115. if(ICU_FOUND)
  116. message(STATUS "ICU_INCLUDE_DIRS = ${ICU_INCLUDE_DIRS}")
  117. message(STATUS "ICU_LIBRARIES = ${ICU_LIBRARIES}")
  118. endif()
  119. set(ICU_INC_DIRS ${ICU_INCLUDE_DIRS})
  120. set(ICU_LIBS ${ICU_LIBRARIES})
  121. endif()
  122. endif()
  123.  
  124. set(BOOST_CXX_FLAGS "${WARNING_IGNORE_FLAGS} ${CXXSTDFLAG}")
  125. if(FETCH_BOOST)
  126. set(BOOST_CXX_FLAGS "${BOOST_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}/external/install/include -L${CMAKE_CURRENT_SOURCE_DIR}/external/install/lib")
  127. endif()
  128.  
  129. ##
  130. # OSX is strange (some might say, stupid in this regard). Deal with it's quirkines here.
  131. ##
  132. if(APPLE)
  133. # To allow ourselves to build a dynamic library, we have to tell the compiler
  134. # that, yes, the symbols will be around at runtime.
  135. list(APPEND TGT_COMPILE_FLAGS "-undefined dynamic_lookup;-Wno-unused-command-line-argument")
  136. set(LIBSALMON_LINKER_FLAGS "-all_load")
  137. # In order to "think different", we also have to use non-standard suffixes
  138. # for our shared libraries
  139. set(SHARED_LIB_EXTENSION "dylib")
  140. else()
  141. # We're in sane linux world
  142. set(SHARED_LIB_EXTENSION "so")
  143. set(LIBSALMON_LINKER_FLAGS "")
  144. endif()
  145.  
  146. set( BOOST_EXTRA_FLAGS "--layout=tagged" )
  147. ## this get's set differently below if we
  148. ## are on clang & apple
  149. set(NON_APPLECLANG_LIBS gomp)
  150.  
  151. if(UNIX AND NOT APPLE)
  152. set(LIBRT rt)
  153. endif()
  154.  
  155. set(PTHREAD_LIB)
  156.  
  157. ##
  158. # Let us check the sha sum of our pacakges if we have the right tools
  159. ##
  160. set(SHASUM ${CMAKE_CURRENT_SOURCE_DIR}/scripts/check_shasum.sh)
  161.  
  162. ##
  163. # Compiler-specific C++11/14 activation.
  164. # http://stackoverflow.com/questions/10984442/how-to-detect-c11-support-of-a-compiler-with-cmake
  165. ##
  166. ##
  167. # First take care of what to do if we have gcc
  168. ##
  169. if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
  170. execute_process(
  171. COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
  172. # If we're on OSX
  173. if(APPLE AND NOT (GCC_VERSION VERSION_GREATER ${GCCVERSION} OR GCC_VERSION VERSION_EQUAL ${GCCVERSION}))
  174. message(FATAL_ERROR "When building under OSX, ${PROJECT_NAME} requires "
  175. "either clang or g++ >= ${GCCVERSION}")
  176. elseif(NOT (GCC_VERSION VERSION_GREATER ${GCCVERSION} OR GCC_VERSION VERSION_EQUAL ${GCCVERSION}))
  177. message(FATAL_ERROR "${PROJECT_NAME} requires g++ ${GCCVERSION} or greater.")
  178. endif()
  179.  
  180. set(GCC TRUE)
  181.  
  182. # Put complete static linking on hold for the time-being
  183. # If we're not on OSX, make an attempt to compile everything statically
  184. #if(NOT APPLE)
  185. #set(CMAKE_EXE_LINK_FLAGS "-static")
  186. set(PTHREAD_LIB "pthread")
  187. #endif()
  188.  
  189. # If we're on Linux (i.e. not OSX) and we're using
  190. # gcc, then set the -static-libstdc++ flag
  191. if(NOT APPLE)
  192. list(APPEND TGT_COMPILE_FLAGS -static-libstdc++)
  193. endif()
  194.  
  195. set(WARNING_IGNORE_FLAGS "${WARNING_IGNORE_FLAGS} -Wno-unused-local-typedefs")
  196. set(BOOST_TOOLSET "${CC}")
  197. set(BOOST_CONFIGURE_TOOLSET "--with-toolset=gcc")
  198. set(BCXX_FLAGS "${CXXSTDFLAG}")
  199. set(BOOST_EXTRA_FLAGS toolset=${CC} cxxflags=${BCXX_FLAGS})
  200. # Tentatively, we support clang now
  201. elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
  202. set(CLANG TRUE)
  203. # If we have libc++, then try and use it
  204. include(CheckCXXCompilerFlag)
  205. check_cxx_compiler_flag(-stdlib=libc++ HAVE_LIBCPP)
  206. if(HAVE_LIBCPP)
  207. message("It appears that you're compiling with clang and that libc++ is available, so I'll use that")
  208. list(APPEND TGT_COMPILE_FLAGS -stdlib=libc++)
  209. set(BOOST_TOOLSET "clang")
  210. set(BOOST_CONFIGURE_TOOLSET "--with-toolset=clang")
  211. set(BCXX_FLAGS "-stdlib=libc++ -DBOOST_HAS_INT128")
  212. set(BOOST_EXTRA_FLAGS toolset=clang cxxflags=${BCXX_FLAGS} linkflags="-stdlib=libc++")
  213. # Otherwise, use libstdc++ (and make it static)
  214. else()
  215. list(APPEND TGT_COMPILE_FLAGS -static-libstdc++)
  216. endif()
  217. # There's currently a bug with clang-3.4 & Boost 1.55 -- this hack fixes it
  218. # but we should do something better (does this break things if CPU doesn't
  219. # have 128-bit support)?
  220. list(APPEND TGT_COMPILE_FLAGS -DBOOST_HAS_INT128)
  221.  
  222. if(APPLE)
  223. set(NON_APPLECLANG_LIBS "")
  224. else()
  225. set(PTHREAD_LIB "pthread")
  226. endif()
  227. else()
  228. message(FATAL_ERROR "Your C++ compiler does not support C++14.")
  229. endif()
  230.  
  231. if(DO_QUIET_MAKE)
  232. set(QUIET_MAKE "--silent")
  233. else()
  234. set(QUIET_MAKE "")
  235. endif()
  236.  
  237. ## TODO: Figure out how to detect this automatically
  238. # If the "assembler" is too old, tell TBB not to compile
  239. # with -mrtm
  240. if(NO_RTM)
  241. set(TBB_CXXFLAGS "-mno-rtm")
  242. endif()
  243.  
  244. include(ExternalProject)
  245.  
  246. if(CMAKE_BUILD_TYPE MATCHES Debug)
  247. message("Making Debug build")
  248. elseif(CMAKE_BUILD_TYPE MATCHES Release)
  249. message("Making Release build")
  250. else()
  251. message("Making Default build type")
  252. endif()
  253.  
  254. ##
  255. # Record this top-level path
  256. ##
  257. set(GAT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
  258.  
  259. # Have CMake tell us what it's doing
  260. # set(CMAKE_VERBOSE_MAKEFILE true)
  261.  
  262. ###
  263. #
  264. # Grab RapMap sources for quasi-mapping code --- DURING CONFIGURE TIME!
  265. #
  266. ####
  267. if(NOT FETCHED_RAPMAP)
  268. exec_program(${CMAKE_CURRENT_SOURCE_DIR}/scripts/fetchRapMap.sh RETURN_VALUE FETCH_RM_SCRIPT_RET)
  269. message(STATUS "fetch RAPMAP exit code ${FETCH_RM_SCRIPT_RET}")
  270. if(NOT (FETCH_RM_SCRIPT_RET EQUAL 0))
  271. message(FATAL_ERROR "Could not fetch RapMap source [fetchRapMap.sh returned exit code ${FETCH_RM_SCRIPT_RET}].")
  272. endif()
  273. set(FETCHED_RAPMAP TRUE CACHE BOOL "Has RapMap been fetched?" FORCE)
  274. endif()
  275.  
  276. ##
  277. # Super-secret override
  278. ##
  279. if( DEFINED CUSTOM_BOOST_PATH )
  280. set(CMAKE_INCLUDE_PATH ${CUSTOM_BOOST_PATH} ${CMAKE_INCLUDE_PATH})
  281. set(CMAKE_LIBRARY_PATH ${CUSTOM_BOOST_PATH}/lib ${CMAKE_LIBRARY_PATH})
  282. endif()
  283.  
  284. ##
  285. # We want static, multithreaded boost libraries
  286. ##
  287. if(CONDA_BUILD)
  288. set(Boost_USE_STATIC_LIBS OFF)
  289. elseif(USE_SHARED_LIBS) # CI failed when using an OR statement above...
  290. set(Boost_USE_STATIC_LIBS OFF)
  291. else()
  292. set(Boost_USE_STATIC_LIBS ON)
  293. endif()
  294.  
  295. set(Boost_USE_MULTITHREADED ON)
  296. #set(Boost_USE_STATIC_RUNTIME OFF)
  297.  
  298. find_package(ZLIB)
  299. if(NOT ZLIB_FOUND)
  300. message(FATAL_ERROR "zlib must be installed before configuration & building can proceed")
  301. endif()
  302.  
  303. if("${CMAKE_INCLUDE_PATH}" STREQUAL "")
  304. set(EXTRA_CMAKE_INCLUDE_FLAGS "")
  305. else()
  306. set(EXTRA_CMAKE_INCLUDE_FLAGS "-I${CMAKE_INCLUDE_PATH}")
  307. endif()
  308.  
  309. if("${CMAKE_LIBRARY_PATH}" STREQUAL "")
  310. set(EXTRA_CMAKE_LIBRARY_FLAGS "")
  311. else()
  312. set(EXTRA_CMAKE_LIBRARY_FLAGS "-L${CMAKE_LIBRARY_PATH}")
  313. endif()
  314.  
  315. find_package(LibLZMA)
  316. if(NOT LIBLZMA_FOUND)
  317. message("Will attempt to fetch and build liblzma")
  318. message("=======================================")
  319. externalproject_add(liblzma
  320. DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external
  321. ##
  322. DOWNLOAD_COMMAND curl -k -L http://tukaani.org/xz/xz-5.2.2.tar.gz -o xz-5.2.2.tar.gz &&
  323. ${SHASUM} 73df4d5d34f0468bd57d09f2d8af363e95ed6cc3a4a86129d2f2c366259902a2 xz-5.2.2.tar.gz &&
  324. tar -xzvf xz-5.2.2.tar.gz
  325. #URL http://tukaani.org/xz/xz-5.2.2.tar.gz
  326. #URL_HASH SHA1=14663612422ab61386673be78fbb2556f50a1f08
  327. ##
  328. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/xz-5.2.2
  329. INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/install
  330. BUILD_IN_SOURCE TRUE
  331. CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/external/xz-5.2.2/configure --prefix=<INSTALL_DIR> CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} CFLAGS=${EXTRA_CMAKE_INCLUDE_FLAGS} CPPFLAGS=${EXTRA_CMAKE_INCLUDE_FLAGS} LDFLAGS=${EXTRA_CMAKE_LIBRARY_FLAGS}
  332. BUILD_COMMAND make ${QUIET_MAKE}
  333. INSTALL_COMMAND make ${QUIET_MAKE} install
  334. )
  335.  
  336. # Tell cmake that the external project generated a library so we can
  337. # add dependencies here instead of later
  338. set(LIBLZMA_LIBRARIES ${GAT_SOURCE_DIR}/external/install/lib/liblzma.a)
  339. set(LIBSTADEN_LDFLAGS "-L${GAT_SOURCE_DIR}/external/install/lib")
  340. set(LIBSTADEN_CFLAGS "-I${GAT_SOURCE_DIR}/external/install/include")
  341. set(FETCHED_LIBLZMA TRUE)
  342. else()
  343. message("Found liblzma library: ${LIBLZMA_LIBRARIES}")
  344. message("===========================================")
  345. endif()
  346.  
  347. find_package(BZip2)
  348. if(NOT BZIP2_FOUND)
  349. message("Will attempt to fetch and build libbz2")
  350. message("=======================================")
  351. externalproject_add(libbz2
  352. DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external
  353. DOWNLOAD_COMMAND curl -k -L http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz -o bzip2-1.0.6.tar.gz &&
  354. ${SHASUM} a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd bzip2-1.0.6.tar.gz &&
  355. tar -xzvf bzip2-1.0.6.tar.gz
  356. #URL http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz
  357. #URL_HASH SHA1=3f89f861209ce81a6bab1fd1998c0ef311712002
  358. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/bzip2-1.0.6
  359. INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/install
  360. BUILD_IN_SOURCE TRUE
  361. CONFIGURE_COMMAND ""
  362. BUILD_COMMAND make ${QUIET_MAKE} CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER}
  363. INSTALL_COMMAND make ${QUIET_MAKE} install PREFIX=<INSTALL_DIR>
  364. )
  365. # Tell cmake that the external project generated a library so we can
  366. # add dependencies here instead of later
  367. set(BZIP2_LIBRARIES ${GAT_SOURCE_DIR}/external/install/lib/libbz2.a)
  368. set(LIBSTADEN_LDFLAGS "-L${GAT_SOURCE_DIR}/external/install/lib -I${GAT_SOURCE_DIR}/external/install/include")
  369. set(LIBSTADEN_CFLAGS "-I${GAT_SOURCE_DIR}/external/install/include")
  370. set(FETCHED_LIBBZ2 TRUE)
  371. else()
  372. message("Found libbz2 library: ${BZIP2_LIBRARIES}")
  373. message("===========================================")
  374. endif()
  375.  
  376. ##
  377. # Set the latest version and look for what we need
  378. ##
  379. set(Boost_ADDITIONAL_VERSIONS "1.59.0" "1.60.0" "1.61.0" "1.62" "1.63" "1.64" "1.65" "1.66")
  380. find_package(Boost 1.59.0 COMPONENTS iostreams filesystem system timer chrono program_options)
  381. message("BOOST_INCLUDEDIR = ${BOOST_INCLUDEDIR}")
  382. message("BOOST_LIBRARYDIR = ${BOOST_LIBRARYDIR}")
  383. message("Boost_FOUND = ${Boost_FOUND}")
  384. include(ExternalProject)
  385.  
  386. ##
  387. # If we had to fetch Boost, the reconfigure step will re-run cmake. The second configuration
  388. # pass is executed with the BOOST_RECONFIGURE flag set. This should allow our newly
  389. # installed Boost to be found by CMake.
  390. ##
  391. if(BOOST_RECONFIGURE)
  392. message("Executing Boost Reconfiguration")
  393. unset(Boost_FOUND CACHE)
  394. unset(Boost_INCLUDE_DIR CACHE)
  395. unset(Boost_INCLUDE_DIRS CACHE)
  396. unset(Boost_LIBRARY_DIRS CACHE)
  397. unset(Boost_LIBRARIES CACHE)
  398. unset(BOOST_ROOT CACHE)
  399. unset(CMAKE_PREFIX_PATH CACHE)
  400.  
  401. set(BOOST_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/external/install)
  402. set(CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/external/install)
  403. set(Boost_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/external/install/include)
  404. set(Boost_LIBRARY_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/external/install/lib)
  405. find_package(Boost 1.59.0 COMPONENTS iostreams filesystem system timer chrono program_options locale REQUIRED)
  406. set(FETCH_BOOST FALSE)
  407. endif()
  408.  
  409.  
  410.  
  411. ##
  412. # Either inform the user of how to obtain Boost, or, if they passed in the FETCH_BOOST
  413. # option, go and grab it for them.
  414. ##
  415. if((NOT Boost_FOUND) AND (NOT FETCH_BOOST))
  416. message(FATAL_ERROR
  417. "Salmon cannot be compiled without Boost.\n"
  418. "It is recommended to visit http://www.boost.org/ and install Boost according to those instructions.\n"
  419. "This build system can also download and install a local version of boost for you (this takes a lot of time).\n"
  420. "To fetch and build boost locally, call cmake with -DFETCH_BOOST=TRUE"
  421. )
  422. elseif(FETCH_BOOST)
  423. ## Let the rest of the build process know we're going to be fetching boost
  424. set(BOOST_LIB_SUBSET --with-iostreams --with-atomic --with-chrono --with-container --with-date_time --with-exception
  425. --with-filesystem --with-graph --with-graph_parallel --with-math
  426. --with-program_options --with-system --with-locale
  427. --with-timer)
  428. set(BOOST_WILL_RECONFIGURE TRUE)
  429. set(FETCH_BOOST FALSE)
  430. message("Build system will fetch and build Boost")
  431. message("==================================================================")
  432. externalproject_add(libboost
  433. DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external
  434. DOWNLOAD_COMMAND curl -k -L http://downloads.sourceforge.net/project/boost/boost/1.66.0/boost_1_66_0.tar.gz -o boost_1_66_0.tar.gz &&
  435. ${SHASUM} bd0df411efd9a585e5a2212275f8762079fed8842264954675a4fddc46cfcf60 boost_1_66_0.tar.gz &&
  436. tar xzf boost_1_66_0.tar.gz
  437. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/boost_1_66_0
  438. INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/install
  439. #PATCH_COMMAND patch -p2 < ${CMAKE_CURRENT_SOURCE_DIR}/external/boost156.patch
  440. CONFIGURE_COMMAND CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} ${CMAKE_CURRENT_SOURCE_DIR}/external/boost_1_66_0/bootstrap.sh ${BOOST_CONFIGURE_TOOLSET} ${BOOST_BUILD_LIBS} --prefix=<INSTALL_DIR>
  441. add_custom_command(
  442. OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/external/boost_1_66_0/tools/build/src/user-config.jam
  443. PRE_BUILD
  444. COMMAND echo "using gcc : ${CC_VERSION} : ${CMAKE_CXX_COMPILER} ;"
  445. )
  446. BUILD_COMMAND CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} ${CMAKE_CURRENT_SOURCE_DIR}/external/boost_1_66_0/b2 -d0 -j2 ${BOOST_LIB_SUBSET} toolset=${BOOST_TOOLSET} ${BOOST_EXTRA_FLAGS} cxxflags=${BOOST_CXX_FLAGS} link=static install
  447. BUILD_IN_SOURCE 1
  448. INSTALL_COMMAND ""
  449. )
  450.  
  451. externalproject_add_step(libboost makedir
  452. COMMAND mkdir -p <SOURCE_DIR>/build
  453. COMMENT "Make build directory"
  454. DEPENDEES download
  455. DEPENDERS configure)
  456.  
  457. ##
  458. # After we've installed boost,
  459. ##
  460. set(RECONFIG_FLAGS ${RECONFIG_FLAGS} -DBOOST_WILL_RECONFIGURE=FALSE -DBOOST_RECONFIGURE=TRUE -DFETCH_BOOST=FALSE)
  461. externalproject_add_step(libboost reconfigure
  462. COMMAND ${CMAKE_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR} ${RECONFIG_FLAGS}
  463. DEPENDEES install
  464. )
  465. set(FETCHED_BOOST TRUE)
  466. endif()
  467.  
  468. ##
  469. # If we're fetching boost and we need to have dummy paths for these variables
  470. # so that CMake won't complain
  471. ##
  472. if(BOOST_WILL_RECONFIGURE)
  473. message("Setting Temporary Boost paths")
  474. set(Boost_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/install/include)
  475. set(Boost_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/external/install/include)
  476. set(Boost_LIBRARY_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/external/install/lib)
  477. set(Boost_FOUND TRUE)
  478. endif()
  479.  
  480. message("BOOST ROOT = ${BOOST_ROOT}")
  481. message("BOOST INCLUDE DIR = ${Boost_INCLUDE_DIR}")
  482. message("BOOST INCLUDE DIRS = ${Boost_INCLUDE_DIRS}")
  483. message("BOOST LIB DIR = ${Boost_LIBRARY_DIRS}")
  484. message("BOOST LIBRARIES = ${Boost_LIBRARIES}")
  485.  
  486. set(EXTERNAL_LIBRARY_PATH $CMAKE_CURRENT_SOURCE_DIR/lib)
  487.  
  488. find_package(libdivsufsort)
  489. if(NOT LIBDIVSUFSORT_FOUND)
  490. message("Build system will build libdivsufsort")
  491. message("==================================================================")
  492. include(ExternalProject)
  493. externalproject_add(libdivsufsort
  494. DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external
  495. URL ${CMAKE_CURRENT_SOURCE_DIR}/external/libdivsufsort.zip
  496. # Note: This zip comes from the fetched rapmap.zip, whose SHA we check
  497. # so we souldn't need to check this one separately.
  498. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/libdivsufsort-master
  499. INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/install
  500. #UPDATE_COMMAND sh -c "mkdir -p <SOURCE_DIR>/build"
  501. BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/libdivsufsort-master/build
  502. CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DBUILD_DIVSUFSORT64=TRUE -DUSE_OPENMP=TRUE -DBUILD_SHARED_LIBS=FALSE
  503. )
  504. externalproject_add_step(libdivsufsort makedir
  505. COMMAND mkdir -p <SOURCE_DIR>/build
  506. COMMENT "Make build directory"
  507. DEPENDEES download
  508. DEPENDERS configure)
  509.  
  510. set(SUFFARRAY_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/external/install/include)
  511. set(FETCHED_LIBDIVSUFSORT TRUE)
  512. else()
  513. message("SUFFARRAY_LIB = ${SUFFARRAY_LIBRARY}")
  514. set(SUFFARRAY_LIB ${SUFFARRAY_LIBRARY})
  515. message("SUFFARRAY_LIB64 = ${SUFFARRAY_LIBRARY64}")
  516. set(SUFFARRAY_LIB64 ${SUFFARRAY_LIBRARY64})
  517. set(SUFFARRAY_INCLUDE_DIRS ${SUFFARRAY_INCLUDE_DIR})
  518. endif()
  519.  
  520.  
  521. find_package(Cereal)
  522. if (NOT CEREAL_FOUND)
  523. message("Build system will fetch and build the Cereal serialization library")
  524. message("==================================================================")
  525. include(ExternalProject)
  526. externalproject_add(libcereal
  527. DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external
  528. DOWNLOAD_COMMAND curl -k -L https://github.com/USCiLab/cereal/archive/v1.2.2.tar.gz -o cereal-v1.2.2.tar.gz &&
  529. ${SHASUM} 1921f26d2e1daf9132da3c432e2fd02093ecaedf846e65d7679ddf868c7289c4 cereal-v1.2.2.tar.gz &&
  530. tar -xzvf cereal-v1.2.2.tar.gz
  531.  
  532. ##
  533. #URL https://github.com/USCiLab/cereal/archive/v1.2.2.tar.gz
  534. #DOWNLOAD_NAME cereal-v1.2.2.tar.gz
  535. #TLS_VERIFY FALSE
  536. #URL_HASH SHA1=ffddf5fc5313cfbb893e07823ca8c473084eebca
  537. ##
  538. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/cereal-1.2.2
  539. INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/install
  540. #UPDATE_COMMAND sh -c "mkdir -p <SOURCE_DIR>/build"
  541. BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/cereal-1.2.2/build
  542. CONFIGURE_COMMAND ""
  543. BUILD_COMMAND ""
  544. INSTALL_COMMAND sh -c "mkdir -p <INSTALL_DIR>/include && cp -r <SOURCE_DIR>/include/cereal <INSTALL_DIR>/include"
  545. )
  546. externalproject_add_step(libcereal makedir
  547. COMMAND mkdir -p <SOURCE_DIR>/build
  548. COMMENT "Make build directory"
  549. DEPENDEES download
  550. DEPENDERS configure)
  551.  
  552. set(FETCHED_CEREAL TRUE)
  553. endif()
  554.  
  555. ## Try and find TBB first
  556. find_package(TBB 2018.0 COMPONENTS tbb tbbmalloc tbbmalloc_proxy)
  557.  
  558. ##
  559. #
  560. # Fetch and build Intel's Threading Building Blocks library.
  561. #
  562. ##
  563. if((NOT TBB_FOUND) OR (TBB_FOUND AND (TBB_VERSION VERSION_LESS 2018.0)))
  564.  
  565. set(TBB_WILL_RECONFIGURE TRUE)
  566. # Set the appropriate compiler
  567. if(CLANG)
  568. set(TBB_COMPILER "clang")
  569. else()
  570. set(TBB_COMPILER "gcc")
  571. endif()
  572.  
  573. message("Build system will fetch and build Intel Threading Building Blocks")
  574. message("==================================================================")
  575. # These are useful for the custom install step we'll do later
  576. set(TBB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/tbb-2018_U3)
  577. set(TBB_INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/install)
  578.  
  579. if("${TBB_COMPILER}" STREQUAL "gcc")
  580. ## Don't know why it's a problem yet, but if we're using
  581. ## GCC, get rid of the DO_ITT_NOTIFY flag
  582. set(TBB_CXXFLAGS "${TBB_CXXFLAGS} -UDO_ITT_NOTIFY")
  583. endif()
  584.  
  585. set(TBB_CXXFLAGS "${TBB_CXXFLAGS} ${CXXSTDFLAG}")
  586.  
  587. externalproject_add(libtbb
  588. DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external
  589. DOWNLOAD_COMMAND curl -k -L https://github.com/01org/tbb/archive/2018_U3.tar.gz -o tbb-2018_U3.tgz &&
  590. ${SHASUM} 23793c8645480148e9559df96b386b780f92194c80120acce79fcdaae0d81f45 tbb-2018_U3.tgz &&
  591. tar -xzvf tbb-2018_U3.tgz
  592. ##
  593. #URL https://github.com/01org/tbb/archive/2018_U3.tar.gz
  594. #DOWNLOAD_NAME 2018_U3.tar.gz
  595. #URL_HASH SHA1=d6cf16a42ece60aad6a722b369e1a2aa753347b4
  596. #TLS_VERIFY FALSE
  597. ##
  598. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/tbb-2018_U3
  599. INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/install
  600. PATCH_COMMAND "${TBB_PATCH_STEP}"
  601. CONFIGURE_COMMAND ""
  602. BUILD_COMMAND make ${QUIET_MAKE} CXXFLAGS=${TBB_CXXFLAGS} lambdas=1 compiler=${TBB_COMPILER} cfg=release tbb_build_prefix=LIBS
  603. INSTALL_COMMAND sh -c "mkdir -p ${TBB_INSTALL_DIR}/include && mkdir -p ${TBB_INSTALL_DIR}/lib && cp ${TBB_SOURCE_DIR}/build/LIBS_release/*.${SHARED_LIB_EXTENSION}* ${TBB_INSTALL_DIR}/lib && cp -r ${TBB_SOURCE_DIR}/include/* ${TBB_INSTALL_DIR}/include"
  604. BUILD_IN_SOURCE 1
  605. )
  606.  
  607. set(RECONFIG_FLAGS ${RECONFIG_FLAGS} -DTBB_WILL_RECONFIGURE=FALSE -DTBB_RECONFIGURE=TRUE)
  608. externalproject_add_step(libtbb reconfigure
  609. COMMAND ${CMAKE_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR} ${RECONFIG_FLAGS}
  610. DEPENDEES install
  611. )
  612.  
  613. set(FETCHED_TBB TRUE)
  614. if(${FETCHED_BOOST})
  615. add_dependencies(libtbb libboost)
  616. endif()
  617. endif()
  618.  
  619. ##
  620. # If we're fetching tbb, we need to have dummy paths for these variables
  621. # so that CMake won't complain
  622. ##
  623. if(TBB_WILL_RECONFIGURE)
  624. set(TBB_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/external/install/include)
  625. set(TBB_LIBRARY_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/external/install/lib)
  626. #set(TBB_LIBRARIES tbb tbbmalloc)
  627. set(TBB_LIBRARIES ${CMAKE_CURRENT_SOURCE_DIR}/external/install/lib/libtbb.${SHARED_LIB_EXTENSION}
  628. ${CMAKE_CURRENT_SOURCE_DIR}/external/install/lib/libtbbmalloc.${SHARED_LIB_EXTENSION}
  629. )
  630. endif()
  631.  
  632. ##
  633. # Similar to the Boost trick above, the libtbb reconfigure should force this code
  634. # to be run on the second configuration pass, where it should appropriately set the
  635. # TBB_INSTALL_DIR variable.
  636. ##
  637. if(TBB_RECONFIGURE)
  638. unset(TBB_FOUND CACHE)
  639. unset(TBB_INSTALL_DIR CACHE)
  640. unset(CMAKE_PREFIX_PATH CACHE)
  641. set(CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/external/install)
  642. set(TBB_INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/install)
  643. message("TBB_INSTALL_DIR = ${TBB_INSTALL_DIR}")
  644. find_package(TBB)
  645. endif()
  646.  
  647.  
  648. message("TBB_LIBRARIES = ${TBB_LIBRARIES}")
  649.  
  650. find_package(libgff)
  651. if(NOT LIBGFF_FOUND)
  652. message("Build system will compile libgff")
  653. message("==================================================================")
  654. externalproject_add(libgff
  655. DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external
  656. DOWNLOAD_COMMAND curl -k -L https://github.com/COMBINE-lab/libgff/archive/v1.2.tar.gz -o libgff.tgz &&
  657. ${SHASUM} bfabf143da828e8db251104341b934458c19d3e3c592d418d228de42becf98eb libgff.tgz &&
  658. tar -xzvf libgff.tgz
  659. ##
  660. #URL https://github.com/COMBINE-lab/libgff/archive/v1.1.tar.gz
  661. #DOWNLOAD_NAME libff.tgz
  662. #URL_HASH SHA1=37b3147d78391d1fabbe6a0df313fbf516abbc6f
  663. #TLS_VERIFY FALSE
  664. ##
  665. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/libgff-1.2
  666. #UPDATE_COMMAND sh -c "mkdir -p <SOURCE_DIR>/build"
  667. INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/install
  668. BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/libgff-1.2/build
  669. CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_SOURCE_DIR}/external/install
  670. )
  671. externalproject_add_step(libgff makedir
  672. COMMAND mkdir -p <SOURCE_DIR>/build
  673. COMMENT "Make build directory"
  674. DEPENDEES download
  675. DEPENDERS configure)
  676. set(FETCHED_GFF TRUE)
  677. endif()
  678.  
  679. # Because of the way that Apple has changed SIP
  680. # in el capitan, some headers may be in a new location
  681. if(APPLE)
  682. set(STADEN_INC "-I/usr/local/include")
  683. set(STADEN_LIB "-L/usr/local/lib")
  684. endif()
  685.  
  686. if(CONDA_BUILD)
  687. set(LZFLAG "-lz")
  688. else()
  689. set(LZFLAG "")
  690. endif()
  691.  
  692. find_package(CURL)
  693. find_package(libstadenio)
  694. if (NOT LIBSTADENIO_FOUND)
  695. message("Build system will compile Staden IOLib")
  696. message("==================================================================")
  697. externalproject_add(libstadenio
  698. DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external
  699. DOWNLOAD_COMMAND curl -k -L https://github.com/COMBINE-lab/staden-io_lib/archive/v1.14.8.1.tar.gz -o staden-io_lib-v1.14.8.tar.gz &&
  700. ${SHASUM} f6f30eefa478cfb708f3109a35fb6ffa0e24951d9d971985df2cef5919dd0bc3 staden-io_lib-v1.14.8.tar.gz &&
  701. mkdir -p staden-io_lib-1.14.8 &&
  702. tar -xzf staden-io_lib-v1.14.8.tar.gz --strip-components=1 -C staden-io_lib-1.14.8 &&
  703. rm -fr staden-io_lib &&
  704. mv -f staden-io_lib-1.14.8 staden-io_lib
  705. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/staden-io_lib
  706. INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/install
  707. CONFIGURE_COMMAND ./configure --enable-shared=no --without-libcurl --prefix=<INSTALL_DIR> LDFLAGS=${LIBSTADEN_LDFLAGS} CFLAGS=${LIBSTADEN_CFLAGS} CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER}
  708. BUILD_COMMAND make ${QUIET_MAKE} CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} CFLAGS+=${STADEN_INC} CFLAGS+=${STADEN_LIB} LDFLAGS+=${EXTRA_CMAKE_LIBRARY_FLAGS} CFLAGS+=${EXTRA_CMAKE_INCLUDE_FLAGS} CFLAGS+=${LZFLAG}
  709.  
  710.  
  711. BUILD_IN_SOURCE 1
  712. INSTALL_COMMAND make install
  713. )
  714.  
  715. set(FETCHED_STADEN TRUE)
  716. set(STADEN_LIBRARIES "${GAT_SOURCE_DIR}/external/install/lib/libstaden-read.a")
  717. endif()
  718.  
  719. set(FAST_MALLOC_LIB "")
  720. set(HAVE_FAST_MALLOC FALSE)
  721.  
  722. # See if we have Jemalloc
  723. find_package(Jemalloc)
  724. if(Jemalloc_FOUND)
  725. ##
  726. # Don't be so stringent about the version yet
  727. ##
  728. #if (NOT (${JEMALLOC_VERSION} VERSION_LESS 5.1.0))
  729. message("Found Jemalloc library --- using this memory allocator")
  730. set(FAST_MALLOC_LIB ${JEMALLOC_LIBRARIES})
  731. set(HAVE_FAST_MALLOC TRUE)
  732. #else()
  733. # message("Fond Jemalloc version ${JEMALLOC_VERSION}, but require >= 5.1.0. Downloading newer version")
  734. #endif()
  735. endif()
  736.  
  737. if(CONDA_BUILD)
  738. set(JEMALLOC_FLAGS "CC=${CMAKE_C_COMPILER} CFLAGS=-fPIC CPPFLAGS=-fPIC")
  739. else()
  740. set(JEMALLOC_FLAGS "CC=${CMAKE_C_COMPILER}")
  741. endif()
  742.  
  743. if(NOT HAVE_FAST_MALLOC)
  744. message("Build system will fetch and use JEMalloc")
  745. message("==================================================================")
  746. externalproject_add(libjemalloc
  747. DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external
  748. DOWNLOAD_COMMAND curl -k -L https://github.com/COMBINE-lab/jemalloc/archive/5.1.0.tar.gz -o jemalloc-5.1.0.tar.gz &&
  749. ${SHASUM} ff28aef89df724bd7b6bd6fde8597695514e0e3404d1afad2f1eb8b55ef378d3 jemalloc-5.1.0.tar.gz &&
  750. tar -xzf jemalloc-5.1.0.tar.gz
  751.  
  752. SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/jemalloc-5.1.0
  753. BUILD_IN_SOURCE TRUE
  754. INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/install
  755. CONFIGURE_COMMAND sh -c "${JEMALLOC_FLAGS} ./autogen.sh --disable-debug --prefix=<INSTALL_DIR>"
  756. INSTALL_COMMAND cp -r lib <INSTALL_DIR>/ && cp -r include <INSTALL_DIR>/
  757. )
  758.  
  759. set(FAST_MALLOC_LIB ${CMAKE_CURRENT_SOURCE_DIR}/external/install/lib/libjemalloc.a)
  760. set(HAVE_FAST_MALLOC TRUE)
  761. set(FETCHED_JEMALLOC TRUE)
  762. if(FETCHED_LIBBZ2)
  763. add_dependencies(libjemalloc libbz2)
  764. endif()
  765.  
  766. if(FETCHED_LIBLZMA)
  767. add_dependencies(libjemalloc liblzma)
  768. endif()
  769. endif()
  770.  
  771. ###
  772. #
  773. # Done building external dependencies.
  774. #
  775. ###
  776.  
  777. set(CPACK_SOURCE_IGNORE_FILES
  778. "/src/PCA.cpp"
  779. "/src/PCAUtils.cpp"
  780. "/build/"
  781. "/scripts/AggregateToGeneLevel.py"
  782. "/scripts/ExpressionTools.py"
  783. "/scripts/GenerateExpressionFiles.sh"
  784. "/scripts/ParseSoftFile.py"
  785. "/scripts/PlotCorrelation.py"
  786. "/scripts/junk"
  787. "/scripts/sfstrace.log"
  788. "/scripts/SFPipeline.py"
  789. "/bin/"
  790. "/lib/"
  791. "/sample_data/"
  792. "PublishREADMEToWebsite.sh"
  793. "/external/"
  794. "/src/obsolete/"
  795. "/include/obsolete/"
  796. "WebsiteHeader.txt"
  797. "/experimental_configs/"
  798. ".git/")
  799.  
  800. message("CPACK_SOURCE_IGNORE_FILES = ${CPACK_SOURCE_IGNORE_FILES}")
  801.  
  802. # Recurse into Salmon source directory
  803. add_subdirectory( src )
  804. #add_dependencies(salmon RapMap)
  805. # build a CPack driven installer package
  806. include(CPack)
  807.  
  808. set(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${PROJECT_VERSION})
  809. add_custom_target(dist
  810. COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD
  811. | gzip > ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.gz
  812. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
Add Comment
Please, Sign In to add comment