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 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()