-
Notifications
You must be signed in to change notification settings - Fork 167
/
CMakeLists.txt
146 lines (124 loc) · 4.94 KB
/
CMakeLists.txt
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
project(edlib VERSION 1.2.6)
option(EDLIB_ENABLE_INSTALL "Generate the install target" ON)
option(EDLIB_BUILD_EXAMPLES "Build examples" ON)
option(EDLIB_BUILD_UTILITIES "Build utilities" ON)
set(MACOSX (${CMAKE_SYSTEM_NAME} MATCHES "Darwin"))
if(CMAKE_BUILD_TYPE MATCHES Debug)
message("Debug mode")
endif()
include(GNUInstallDirs)
include(CheckCXXCompilerFlag)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON) # Falling back to different standard it not allowed.
set(CMAKE_CXX_EXTENSIONS OFF) # Make sure no compiler-specific features are used.
# Build edlib as static library by default
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build all libraries as shared")
# Set strict warnings.
if(MSVC)
# Force to always compile with W4
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()
else()
message("Setting warning flags")
check_cxx_compiler_flag(-Wold-style-cast WOLD_STYLE_CAST)
if (WOLD_STYLE_CAST)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wold-style-cast")
endif()
check_cxx_compiler_flag(-Wshadow WSHADOW)
if (WSHADOW)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wshadow")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic")
endif()
# Define output directories for created binaries and libraries.
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
file(GLOB SOURCES "edlib/src/*.cpp")
# Create libraries.
add_library(edlib ${SOURCES})
add_library(edlib::edlib ALIAS edlib)
set_target_properties(edlib
PROPERTIES
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN ON
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
)
target_compile_definitions(edlib PRIVATE DLIB_BUILD)
if(BUILD_SHARED_LIBS)
target_compile_definitions(edlib PUBLIC EDLIB_SHARED)
endif()
target_include_directories(edlib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/edlib/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
# Build binaries.
if(EDLIB_BUILD_EXAMPLES)
add_executable(helloWorld apps/hello-world/helloWorld.c)
target_link_libraries(helloWorld edlib)
endif()
include(CTest)
if (BUILD_TESTING)
add_executable(runTests test/runTests.cpp)
target_link_libraries(runTests edlib)
add_test(edlib_tests ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/runTests)
endif()
if(EDLIB_BUILD_UTILITIES)
if(NOT WIN32) # If on windows, do not build binaries that do not support windows.
add_executable(edlib-aligner apps/aligner/aligner.cpp)
target_link_libraries(edlib-aligner edlib)
endif()
endif()
# configure and install pkg-config file
set(PKG_EDLIB_DEFS "")
get_target_property(EDLIB_INTERFACE_DEFS edlib INTERFACE_COMPILE_DEFINITIONS)
if(NOT (EDLIB_INTERFACE_DEFS STREQUAL "NOTFOUND" OR EDLIB_INTERFACE_DEFS STREQUAL "EDLIB_INTERFACE_DEFS-NOTFOUND"))
foreach(EDLIB_INTERFACE_DEF ${EDLIB_INTERFACE_DEFS})
list(APPEND PKG_EDLIB_DEFS "-D${EDLIB_INTERFACE_DEF}")
endforeach()
endif()
string(REPLACE ";" " " PKG_EDLIB_DEFS "${PKG_EDLIB_DEFS}")
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/edlib.pc.in
${CMAKE_CURRENT_BINARY_DIR}/edlib-${PROJECT_VERSION_MAJOR}.pc
@ONLY)
if(EDLIB_ENABLE_INSTALL)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/edlib-${PROJECT_VERSION_MAJOR}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
include(CMakePackageConfigHelpers)
set(EDLIB_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/edlib" CACHE STRING
"Installation directory for cmake files, relative to ${CMAKE_INSTALL_PREFIX}.")
set(version_config "${PROJECT_BINARY_DIR}/edlib-config-version.cmake")
set(project_config "${PROJECT_BINARY_DIR}/edlib-config.cmake")
set(targets_export_name edlib-targets)
# Generate the version, config and target files into the build directory.
write_basic_package_version_file(
${version_config}
VERSION ${VERSION}
COMPATIBILITY AnyNewerVersion)
configure_package_config_file(
${PROJECT_SOURCE_DIR}/edlib-config.cmake.in
${project_config}
INSTALL_DESTINATION ${EDLIB_CMAKE_DIR})
export(TARGETS edlib NAMESPACE edlib::
FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake)
# Install version, config and target files.
# These are cmake config files and they are useful for some consumers, for example vcpkg.
install(
FILES ${project_config} ${version_config}
DESTINATION ${EDLIB_CMAKE_DIR})
install(EXPORT ${targets_export_name} DESTINATION ${EDLIB_CMAKE_DIR}
NAMESPACE edlib::)
# Create target 'install' for installing libraries.
install(
TARGETS edlib
EXPORT ${targets_export_name}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install(FILES edlib/include/edlib.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
endif()