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