-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
122 lines (98 loc) · 3.85 KB
/
Copy pathCMakeLists.txt
File metadata and controls
122 lines (98 loc) · 3.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
cmake_minimum_required(VERSION 3.14)
# Set version information
set(VCFX_VERSION_MAJOR 1)
set(VCFX_VERSION_MINOR 1)
set(VCFX_VERSION_PATCH 5)
set(VCFX_VERSION "${VCFX_VERSION_MAJOR}.${VCFX_VERSION_MINOR}.${VCFX_VERSION_PATCH}")
add_compile_definitions(VCFX_VERSION="${VCFX_VERSION}")
project(VCFX
VERSION ${VCFX_VERSION}
DESCRIPTION "A Comprehensive VCF Manipulation Toolkit"
LANGUAGES CXX
)
# Set a user-friendly default install prefix when none is provided.
# This prevents installation attempts into system directories when
# running without root privileges.
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local" CACHE PATH "Install prefix" FORCE)
endif()
include(GNUInstallDirs)
# Optionally allow building for WebAssembly via Emscripten
option(BUILD_WASM "Build with emscripten toolchain" OFF)
option(PYTHON_BINDINGS "Build Python bindings" ON)
if(BUILD_WASM)
if(NOT CMAKE_TOOLCHAIN_FILE)
if(DEFINED ENV{EMSDK} AND EXISTS "$ENV{EMSDK}/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake")
set(CMAKE_TOOLCHAIN_FILE "$ENV{EMSDK}/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake" CACHE FILEPATH "Emscripten toolchain" FORCE)
elseif(DEFINED ENV{EMSCRIPTEN} AND EXISTS "$ENV{EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake")
set(CMAKE_TOOLCHAIN_FILE "$ENV{EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake" CACHE FILEPATH "Emscripten toolchain" FORCE)
endif()
endif()
if(NOT EXISTS "${CMAKE_TOOLCHAIN_FILE}")
message(FATAL_ERROR "Emscripten toolchain file not found. Please set CMAKE_TOOLCHAIN_FILE or EMSDK.")
endif()
message(STATUS "Building for WebAssembly (Emscripten).")
endif()
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type" FORCE)
endif()
# Enable Link-Time Optimization for Release builds (significant perf improvement)
if(CMAKE_BUILD_TYPE STREQUAL "Release")
include(CheckIPOSupported)
check_ipo_supported(RESULT ipo_supported OUTPUT ipo_output)
if(ipo_supported)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
message(STATUS "LTO enabled for Release build")
else()
message(STATUS "LTO not supported: ${ipo_output}")
endif()
endif()
# Find threading library
find_package(Threads REQUIRED)
# Locate zlib if we need it (some tools do)
# On macOS with Homebrew, you might need to specify paths. E.g.:
# list(APPEND CMAKE_PREFIX_PATH "/usr/local/opt/zlib" "/opt/homebrew/opt/zlib")
# Emscripten ships zlib as a port; the system find_package can't locate it,
# so we enable the port directly via compile/link flags when building for WASM.
# See https://emscripten.org/docs/compiling/Building-Projects.html#emscripten-ports
if(BUILD_WASM)
add_compile_options(-sUSE_ZLIB=1)
add_link_options(-sUSE_ZLIB=1)
else()
find_package(ZLIB REQUIRED)
endif()
# If building natively on ARM, e.g. Apple M1
if((NOT BUILD_WASM) AND (CMAKE_SYSTEM_PROCESSOR MATCHES "arm|aarch64"))
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=native -O3")
endif()
enable_testing()
# Add top-level 'src' subdirectory, which in turn references each tool subdirectory
add_subdirectory(src)
if(PYTHON_BINDINGS)
add_subdirectory(python)
endif()
# Add the test suite
add_subdirectory(tests)
# Installation configuration
# Install header files
install(FILES
include/vcfx_core.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/vcfx
)
# Install documentation files if they exist
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
install(FILES
README.md
DESTINATION ${CMAKE_INSTALL_DOCDIR}
)
endif()
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
install(FILES
LICENSE
DESTINATION ${CMAKE_INSTALL_DOCDIR}
)
endif()
message(STATUS "VCFX version: ${VCFX_VERSION}")
message(STATUS "Installation prefix: ${CMAKE_INSTALL_PREFIX}")