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 147 148 149 150 151 152
|
cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
project(edlib VERSION 1.2.7)
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 SHARED ${SOURCES})
add_library(edlib_static STATIC ${SOURCES})
target_include_directories(edlib_static PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/edlib/include>
$<INSTALL_INTERFACE:include>)
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_static)
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 edlib_static
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()
|