Skip to content

Commit d71b573

Browse files
committed
PhyloCSF++ initial version (squashed commits)
0 parents  commit d71b573

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+627744
-0
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.idea
2+
external
3+
build
4+
cmake-build-*

.travis.yml

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
sudo: true
2+
language: cpp
3+
matrix:
4+
include:
5+
6+
##########################################################################
7+
# GCC on Linux
8+
##########################################################################
9+
10+
# Debug builds on linux (gcc) with sanitizer, TODO: add coverage
11+
- os: linux
12+
dist: bionic
13+
compiler: gcc-9
14+
addons:
15+
apt:
16+
sources: ['ubuntu-toolchain-r-test']
17+
packages: ['cmake', 'g++-9', 'libgsl0-dev']
18+
# ubuntu toolchain does not contain the latest bugfixes for /usr/bin/ld
19+
env: CXX=g++-9 CMAKE_ARGS="-DCMAKE_BUILD_TYPE=Debug" CMAKE_CXX_FLAGS="-fsanitize=address -fno-omit-frame-pointer" THREADS=1 # -fuse-ld=gold
20+
21+
- os: linux
22+
dist: xenial
23+
compiler: gcc-4.9
24+
addons:
25+
apt:
26+
sources: ['ubuntu-toolchain-r-test']
27+
packages: ['cmake', 'g++-4.9', 'libgsl0-dev']
28+
env: CXX=g++-4.9 THREADS=1
29+
30+
- os: linux
31+
dist: bionic
32+
compiler: gcc-5
33+
addons:
34+
apt:
35+
sources: ['ubuntu-toolchain-r-test']
36+
packages: ['cmake', 'g++-5', 'libgsl0-dev']
37+
env: CXX=g++-5 THREADS=2
38+
39+
- os: linux
40+
dist: bionic
41+
compiler: gcc-6
42+
addons:
43+
apt:
44+
sources: ['ubuntu-toolchain-r-test']
45+
packages: ['cmake', 'g++-6', 'libgsl0-dev']
46+
env: CXX=g++-6 THREADS=3
47+
48+
- os: linux
49+
dist: bionic
50+
compiler: gcc-7
51+
addons:
52+
apt:
53+
sources: ['ubuntu-toolchain-r-test']
54+
packages: ['cmake', 'g++-7', 'libgsl0-dev']
55+
env: CXX=g++-7 THREADS=4
56+
57+
- os: linux
58+
dist: bionic
59+
compiler: gcc-8
60+
addons:
61+
apt:
62+
sources: ['ubuntu-toolchain-r-test']
63+
packages: ['cmake', 'g++-8', 'libgsl0-dev']
64+
env: CXX=g++-8 THREADS=5
65+
66+
- os: linux
67+
dist: bionic
68+
compiler: gcc-9
69+
addons:
70+
apt:
71+
sources: [ 'ubuntu-toolchain-r-test' ]
72+
packages: [ 'cmake', 'g++-9', 'libgsl0-dev' ]
73+
env: CXX=g++-9 THREADS=6
74+
75+
- os: linux
76+
dist: bionic
77+
compiler: gcc-10
78+
addons:
79+
apt:
80+
sources: [ 'ubuntu-toolchain-r-test' ]
81+
packages: [ 'cmake', 'g++-10', 'libgsl0-dev' ]
82+
env: CXX=g++-10 THREADS=7
83+
84+
##########################################################################
85+
# Clang on Linux
86+
##########################################################################
87+
88+
# - os: linux
89+
# dist: xenial
90+
# compiler: clang-3.8
91+
# addons:
92+
# apt:
93+
# packages: ['cmake', 'make', 'libc++-dev', 'libomp-dev', 'clang-3.8', 'libgsl0-dev']
94+
# env: CXX=clang++-3.8 THREADS=8
95+
#
96+
# - os: linux
97+
# dist: xenial
98+
# compiler: clang-4.0
99+
# addons:
100+
# apt:
101+
# packages: ['cmake', 'make', 'libc++-dev', 'libomp-dev', 'clang-4.0', 'libgsl0-dev']
102+
# env: CXX=clang++-4.0 THREADS=1
103+
#
104+
# - os: linux
105+
# dist: bionic
106+
# compiler: clang-5.0
107+
# addons:
108+
# apt:
109+
# packages: [ 'cmake', 'make', 'libc++-dev', 'libomp-dev', 'clang-5.0', 'libgsl0-dev' ]
110+
# env: CXX=clang++-5.0 THREADS=2
111+
#
112+
# - os: linux
113+
# dist: bionic
114+
# compiler: clang-6.0
115+
# addons:
116+
# apt:
117+
# packages: [ 'cmake', 'make', 'libc++-dev', 'libomp-dev', 'clang-6.0', 'libgsl0-dev' ]
118+
# env: CXX=clang++-6.0 THREADS=3
119+
#
120+
# - os: linux
121+
# dist: bionic
122+
# compiler: clang-7.0
123+
# addons:
124+
# apt:
125+
# packages: [ 'cmake', 'make', 'libc++-dev', 'libomp-dev', 'clang-7', 'libgsl0-dev' ]
126+
# env: CXX=clang++-7 THREADS=4
127+
#
128+
# - os: linux
129+
# dist: bionic
130+
# compiler: clang-8.0
131+
# addons:
132+
# apt:
133+
# packages: [ 'cmake', 'make', 'libc++-dev', 'libomp-dev', 'clang-8', 'libgsl0-dev' ]
134+
# env: CXX=clang++-8 THREADS=5
135+
136+
##########################################################################
137+
# Clang on OSX (with Xcode)
138+
##########################################################################
139+
140+
# - os: osx
141+
# osx_image: xcode7.3
142+
# compiler: clang
143+
# addons:
144+
# homebrew:
145+
# packages:
146+
# - gsl
147+
# update: true
148+
#
149+
# - os: osx
150+
# osx_image: xcode8.3
151+
# compiler: clang
152+
# addons:
153+
# homebrew:
154+
# packages:
155+
# - gsl
156+
# update: true
157+
#
158+
# - os: osx
159+
# osx_image: xcode9.4
160+
# compiler: clang
161+
# addons:
162+
# homebrew:
163+
# packages:
164+
# - gsl
165+
# update: true
166+
#
167+
# - os: osx
168+
# osx_image: xcode10.1
169+
# compiler: clang
170+
# addons:
171+
# homebrew:
172+
# packages:
173+
# - gsl
174+
# update: true
175+
176+
##########################################################################
177+
# GCC on OSX
178+
##########################################################################
179+
180+
# Homebrew seems not to have the latest bugfixes :(
181+
# https://github.com/nest/nest-simulator/issues/486
182+
# - os: osx
183+
# osx_image: xcode8.3
184+
# compiler: gcc-4.9
185+
# before_install:
186+
# - brew update
187+
# - brew install [email protected]
188+
# - sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
189+
# - sudo xcode-select -s /Library/Developer/CommandLineTools
190+
# install: export CXX="g++-4.9"
191+
#
192+
# - os: osx
193+
# osx_image: xcode8.3
194+
# compiler: gcc-5
195+
# before_install:
196+
# - brew update
197+
# - travis_wait 60 brew install gcc@5
198+
# - sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
199+
# - sudo xcode-select -s /Library/Developer/CommandLineTools
200+
# install: export CXX="g++-5"
201+
202+
# - os: osx
203+
# osx_image: xcode8.3
204+
# compiler: gcc-6
205+
# before_install:
206+
# - brew update
207+
# - travis_wait 60 brew install gcc@6
208+
# install: export CXX="g++-6"
209+
#
210+
# - os: osx
211+
# osx_image: xcode8.3
212+
# compiler: gcc-7
213+
# before_install:
214+
# - brew update
215+
# - travis_wait 60 brew install gcc@7
216+
# install: export CXX="g++-7"
217+
#
218+
# - os: osx
219+
# osx_image: xcode8.3
220+
# compiler: gcc-8
221+
# before_install:
222+
# - brew update
223+
# - travis_wait 60 brew install gcc@8
224+
# install: export CXX="g++-8"
225+
226+
script:
227+
- mkdir -p build && cd build
228+
- cmake .. ${CMAKE_ARGS} -DCMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS} -Werror"
229+
- make VERBOSE=1
230+
- cd ..
231+
- ./build/phylocsf++
232+
- test/tests.sh ${THREADS}

CMakeLists.txt

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
cmake_minimum_required(VERSION 3.2)
2+
string(ASCII 27 Esc)
3+
set(ColourBold "${Esc}[1m")
4+
set(ColourReset "${Esc}[m")
5+
set(ColourRed "${Esc}[31m")
6+
7+
include(ExternalProject)
8+
9+
message("${ColourBold}Compiler Detection${ColourReset}") # This needs to go before "project ()".
10+
11+
project(PhyloCSF++ CXX)
12+
13+
# ----------------------------------------------------------------------------
14+
# Compiler detection
15+
# ----------------------------------------------------------------------------
16+
# TODO: check whether older compilers work as well
17+
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
18+
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9.1)
19+
message(FATAL_ERROR "Your GCC version is too old. Minimum version is GCC-4.9.1!")
20+
return()
21+
endif ()
22+
elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
23+
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6)
24+
message(FATAL_ERROR "Your Clang version seems too old. Please upgrade to 3.8.0 or use GCC.")
25+
return()
26+
elseif (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.8)
27+
message(WARNING "Your Clang version is too old, you will not have parallelism! Upgrade to 3.8.0 or newer.")
28+
endif ()
29+
elseif (CMAKE_CXX_COMPILER_ID MATCHES "Intel")
30+
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 17)
31+
message(WARNING "Your Intel Compiler version is too old. Please upgrade to 17.0.0 or newer!")
32+
endif ()
33+
else ()
34+
message(WARNING "Unknown compiler, you are on your own!")
35+
endif ()
36+
37+
message(STATUS "Compiling with ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}.")
38+
message(STATUS "The requirements were met.")
39+
40+
# ----------------------------------------------------------------------------
41+
# Dependency detection
42+
# ----------------------------------------------------------------------------
43+
44+
message("\n${ColourBold}Dependency detection${ColourReset}")
45+
46+
find_package(OpenMP QUIET)
47+
find_package(Git)
48+
find_package(GSL REQUIRED)
49+
50+
# TODO: don't build in source in case we have multiple build folders with different compiler flags
51+
ExternalProject_Add(libBigWig
52+
GIT_REPOSITORY "https://github.com/cpockrandt/libBigWig"
53+
UPDATE_COMMAND ""
54+
DOWNLOAD_DIR "${CMAKE_SOURCE_DIR}/external/"
55+
SOURCE_DIR "${CMAKE_BINARY_DIR}/libBigWig"
56+
BUILD_IN_SOURCE 1
57+
CONFIGURE_COMMAND ""
58+
BUILD_COMMAND ${MAKE}
59+
INSTALL_COMMAND ""
60+
)
61+
62+
# Pass git hash and git date to C++ compiler as macros to include them into the help string.
63+
# Source: https://stackoverflow.com/a/21028226 (by Drew Noakes)
64+
if (GIT_FOUND)
65+
execute_process(COMMAND
66+
"${GIT_EXECUTABLE}" describe --match=NeVeRmAtCh --always --abbrev=8 --dirty
67+
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
68+
OUTPUT_VARIABLE GIT_HASH
69+
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
70+
execute_process(COMMAND
71+
"${GIT_EXECUTABLE}" log -1 --date=short --format=%cd
72+
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
73+
OUTPUT_VARIABLE GIT_DATE
74+
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
75+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGIT_HASH=\"${GIT_HASH}\" -DGIT_DATE=\"${GIT_DATE}\"")
76+
endif()
77+
78+
message(STATUS "These dependencies where found:")
79+
message( " GSL ${GSL_FOUND} ${GSL_VERSION}")
80+
message( " OPENMP ${OPENMP_FOUND} ${OpenMP_CXX_FLAGS}")
81+
message( " GIT ${GIT_FOUND} (optional)")
82+
83+
if (OPENMP_FOUND)
84+
add_definitions(-DENABLE_OPENMP)
85+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
86+
else ()
87+
message(WARNING "WARNING WARNING WARNING\nWARNING: OpenMP not found. PhyloCSF++ will be built without multi-threading! "
88+
"This is probably not what you want! Use GCC >= 4.9.1 or Clang >= 3.8.0\nWARNING WARNING WARNING")
89+
endif ()
90+
91+
include_directories(${GSL_INCLUDE_DIRS})
92+
93+
message(STATUS "The requirements were met.")
94+
95+
# ----------------------------------------------------------------------------
96+
# Build configuration
97+
# ----------------------------------------------------------------------------
98+
99+
message("\n${ColourBold}Build configuration${ColourReset}")
100+
101+
# ----------------------------------------------------------------------------
102+
# Make "Release" the default cmake build type
103+
# ----------------------------------------------------------------------------
104+
105+
if (NOT CMAKE_BUILD_TYPE)
106+
set(CMAKE_BUILD_TYPE Release CACHE STRING
107+
"Choose the type of build, options are: Debug Release RelWithDebInfo"
108+
FORCE)
109+
endif ()
110+
111+
# ----------------------------------------------------------------------------
112+
# Warn if cmake build type is not "Release"
113+
# ----------------------------------------------------------------------------
114+
115+
if (NOT CMAKE_BUILD_TYPE STREQUAL Release)
116+
message(STATUS "${ColourRed}CMAKE_BUILD_TYPE is not \"Release\", your binaries will be slow.${ColourReset}")
117+
endif ()
118+
119+
option(PHYLOCSFPP_NATIVE_BUILD "Architecture-specific optimizations, i.e., g++ -march=native." ON)
120+
if (PHYLOCSFPP_NATIVE_BUILD)
121+
add_definitions(-DPHYLOCSFPP_NATIVE_BUILD=1)
122+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
123+
if (CMAKE_CXX_COMPILER_ID MATCHES "Intel")
124+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -xHOST -ipo -no-prec-div -fp-model fast=2")
125+
endif ()
126+
endif ()
127+
128+
include_directories(SYSTEM ${CMAKE_BINARY_DIR}/libBigWig)
129+
link_directories(${CMAKE_BINARY_DIR}/libBigWig)
130+
131+
message(STATUS "The following options are selected for the build:")
132+
message( " PHYLOCSFPP_NATIVE_BUILD ${PHYLOCSFPP_NATIVE_BUILD}")
133+
message(STATUS "Run 'cmake -LH' to get a comment on each option.")
134+
message(STATUS "Remove CMakeCache.txt and re-run cmake with -DOPTIONNAME=ON|OFF to change an option.")
135+
136+
# ----------------------------------------------------------------------------
137+
# Build Setup
138+
# ----------------------------------------------------------------------------
139+
140+
add_definitions(-DCMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE}")
141+
142+
# TODO: -Wconversion
143+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -DNOCURL -std=c++11 -fpermissive -DHAVE_INLINE")
144+
145+
add_executable(phylocsf++ src/phylocsf++.cpp)
146+
add_dependencies(phylocsf++ libBigWig)
147+
target_link_libraries(phylocsf++ z)
148+
target_link_libraries(phylocsf++ gsl)
149+
target_link_libraries(phylocsf++ gslcblas)
150+
target_link_libraries(phylocsf++ BigWig)
151+
152+
install(TARGETS phylocsf++ DESTINATION bin)
153+
154+
message("\n${ColourBold}Finishing up${ColourReset}")

0 commit comments

Comments
 (0)