merk/CMakeLists.txt

69 lines
1.9 KiB
CMake

cmake_minimum_required(VERSION 3.16)
project(merk LANGUAGES C CXX)
# Standards
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
option(BUILD_SHARED_LIBS "Build shared libraries by default" OFF)
# Collect all source files under src/ (recursively).
# CONFIGURE_DEPENDS makes CMake re-scan when files are added/removed.
file(GLOB_RECURSE PROJECT_SOURCES CONFIGURE_DEPENDS
"${CMAKE_SOURCE_DIR}/src/*.c"
"${CMAKE_SOURCE_DIR}/src/*.cc"
"${CMAKE_SOURCE_DIR}/src/*.cpp"
"${CMAKE_SOURCE_DIR}/src/*.cxx")
# Decide: executable (if src/main.* exists) or library (otherwise).
set(MAIN_CANDIDATES
"${CMAKE_SOURCE_DIR}/src/main.c"
"${CMAKE_SOURCE_DIR}/src/main.cc"
"${CMAKE_SOURCE_DIR}/src/main.cpp"
"${CMAKE_SOURCE_DIR}/src/main.cxx")
set(HAVE_MAIN FALSE)
foreach(f IN LISTS MAIN_CANDIDATES)
if(EXISTS "${f}")
set(HAVE_MAIN TRUE)
endif()
endforeach()
if(HAVE_MAIN)
add_executable(merk ${PROJECT_SOURCES})
set(TARGET_NAME merk)
else()
add_library(${PROJECT_NAME} ${PROJECT_SOURCES})
set(TARGET_NAME ${PROJECT_NAME})
endif()
# Public headers live in ./include
target_include_directories(${TARGET_NAME}
PUBLIC "${CMAKE_SOURCE_DIR}/include"
)
# Sensible warnings
if(MSVC)
target_compile_options(${TARGET_NAME} PRIVATE /W4 /permissive-)
else()
target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -Wpedantic)
endif()
# Put built artifacts under build/bin and build/lib
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
# Find and link zlib
find_package(ZLIB REQUIRED)
find_package(OpenSSL REQUIRED)
target_link_libraries(${TARGET_NAME} PRIVATE
${ZLIB_LIBRARIES}
${OPENSSL_LIBRARIES}
)
target_include_directories(${TARGET_NAME} PRIVATE
${ZLIB_INCLUDE_DIRS}
${OPENSSL_INCLUDE_DIR}
)