1cmake_minimum_required(VERSION 3.5.1) 2cmake_policy(SET CMP0069 NEW) 3 4project(llhttp VERSION 6.1.1) 5include(GNUInstallDirs) 6 7set(CMAKE_C_STANDARD 99) 8 9# By default build in relwithdebinfo type, supports both lowercase and uppercase 10if(NOT CMAKE_CONFIGURATION_TYPES) 11 set(allowableBuildTypes DEBUG RELEASE RELWITHDEBINFO MINSIZEREL) 12 set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "${allowableBuildTypes}") 13 if(NOT CMAKE_BUILD_TYPE) 14 set(CMAKE_BUILD_TYPE RELWITHDEBINFO CACHE STRING "" FORCE) 15 else() 16 string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) 17 if(NOT CMAKE_BUILD_TYPE IN_LIST allowableBuildTypes) 18 message(FATAL_ERROR "Invalid build type: ${CMAKE_BUILD_TYPE}") 19 endif() 20 endif() 21endif() 22 23# 24# Options 25# 26# Generic option 27option(BUILD_SHARED_LIBS "Build shared libraries (.dll/.so)" ON) 28option(BUILD_STATIC_LIBS "Build static libraries (.lib/.a)" OFF) 29 30# Source code 31set(LLHTTP_SOURCES 32 ${CMAKE_CURRENT_SOURCE_DIR}/src/llhttp.c 33 ${CMAKE_CURRENT_SOURCE_DIR}/src/http.c 34 ${CMAKE_CURRENT_SOURCE_DIR}/src/api.c 35) 36 37set(LLHTTP_HEADERS 38 ${CMAKE_CURRENT_SOURCE_DIR}/include/llhttp.h 39) 40 41configure_file( 42 ${CMAKE_CURRENT_SOURCE_DIR}/libllhttp.pc.in 43 ${CMAKE_CURRENT_SOURCE_DIR}/libllhttp.pc 44 @ONLY 45) 46 47function(config_library target) 48 target_sources(${target} PRIVATE ${LLHTTP_SOURCES} ${LLHTTP_HEADERS}) 49 50 target_include_directories(${target} PRIVATE 51 ${CMAKE_CURRENT_SOURCE_DIR}/include 52 ) 53 54 set_target_properties(${target} PROPERTIES 55 OUTPUT_NAME llhttp 56 VERSION ${PROJECT_VERSION} 57 SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} 58 PUBLIC_HEADER ${LLHTTP_HEADERS} 59 ) 60 61 install(TARGETS ${target} 62 EXPORT llhttp 63 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 64 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 65 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} 66 ) 67 68 install(FILES 69 ${CMAKE_CURRENT_SOURCE_DIR}/libllhttp.pc 70 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig 71 ) 72 73 # This is required to work with FetchContent 74 install(EXPORT llhttp 75 FILE llhttp-config.cmake 76 NAMESPACE llhttp:: 77 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/llhttp) 78endfunction(config_library target) 79 80if(BUILD_SHARED_LIBS) 81 add_library(llhttp_shared SHARED 82 ${llhttp_src} 83 ) 84 add_library(llhttp::llhttp ALIAS llhttp_shared) 85 config_library(llhttp_shared) 86endif() 87 88if(BUILD_STATIC_LIBS) 89 add_library(llhttp_static STATIC 90 ${llhttp_src} 91 ) 92 if(BUILD_SHARED_LIBS) 93 add_library(llhttp::llhttp ALIAS llhttp_shared) 94 else() 95 add_library(llhttp::llhttp ALIAS llhttp_static) 96 endif() 97 config_library(llhttp_static) 98endif() 99 100# On windows with Visual Studio, add a debug postfix so that release 101# and debug libraries can coexist. 102if(MSVC) 103 set(CMAKE_DEBUG_POSTFIX "d") 104endif() 105 106# Print project configure summary 107message(STATUS "") 108message(STATUS "") 109message(STATUS "Project configure summary:") 110message(STATUS "") 111message(STATUS " CMake build type .................: ${CMAKE_BUILD_TYPE}") 112message(STATUS " Install prefix ...................: ${CMAKE_INSTALL_PREFIX}") 113message(STATUS " Build shared library .............: ${BUILD_SHARED_LIBS}") 114message(STATUS " Build static library .............: ${BUILD_STATIC_LIBS}") 115message(STATUS "") 116