|
1 | 1 | cmake_minimum_required(VERSION 3.5.1)
|
2 | 2 | cmake_policy(SET CMP0069 NEW)
|
3 | 3 |
|
4 |
| -project(llhttp C) |
| 4 | +project(llhttp VERSION 6.0.5) |
| 5 | +include(GNUInstallDirs) |
5 | 6 |
|
6 | 7 | set(CMAKE_C_STANDARD 99)
|
7 | 8 |
|
| 9 | +# By default build in relwithdebinfo type, supports both lowercase and uppercase |
| 10 | +if(NOT CMAKE_CONFIGURATION_TYPES) |
| 11 | + set(allowableBuileTypes DEBUG RELEASE RELWITHDEBINFO MINSIZEREL) |
| 12 | + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "${allowableBuileTypes}") |
| 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 allowableBuileTypes) |
| 18 | + message(FATEL_ERROR "Invalid build type: ${CMAKE_BUILD_TYPE}") |
| 19 | + endif() |
| 20 | + endif() |
| 21 | +endif() |
| 22 | + |
8 | 23 | #
|
9 | 24 | # Options
|
10 | 25 | #
|
11 | 26 | # Generic option
|
12 |
| -option(BUILD_SHARED_LIBS "Build shared libraries (.dll/.so) instead of static ones (.lib/.a)" OFF) |
| 27 | +option(BUILD_SHARED_LIBS "Build shared libraries (.dll/.so)" ON) |
| 28 | +option(BUILD_STATIC_LIBS "Build static libraries (.lib/.a)" OFF) |
13 | 29 |
|
14 | 30 | # Source code
|
15 | 31 | set(LLHTTP_SOURCES
|
16 |
| - src/llhttp.c |
17 |
| - src/http.c |
18 |
| - src/api.c |
| 32 | + ${CMAKE_CURRENT_SOURCE_DIR}/src/llhttp.c |
| 33 | + ${CMAKE_CURRENT_SOURCE_DIR}/src/http.c |
| 34 | + ${CMAKE_CURRENT_SOURCE_DIR}/src/api.c |
19 | 35 | )
|
20 | 36 |
|
21 | 37 | set(LLHTTP_HEADERS
|
22 |
| - include/llhttp.h |
| 38 | + ${CMAKE_CURRENT_SOURCE_DIR}/include/llhttp.h |
23 | 39 | )
|
24 | 40 |
|
25 |
| -add_library(llhttp) |
26 |
| -add_library(llhttp::llhttp ALIAS llhttp) |
| 41 | +configure_file( |
| 42 | + ${CMAKE_CURRENT_SOURCE_DIR}/libllhttp.pc.in |
| 43 | + ${CMAKE_CURRENT_SOURCE_DIR}/libllhttp.pc |
| 44 | + @ONLY |
| 45 | +) |
27 | 46 |
|
28 |
| -target_sources(llhttp PRIVATE ${LLHTTP_SOURCES} ${LLHTTP_HEADERS}) |
| 47 | +function(config_library target) |
| 48 | + target_sources(${target} PRIVATE ${LLHTTP_SOURCES} ${LLHTTP_HEADERS}) |
29 | 49 |
|
30 |
| -# On windows with Visual Studio, add a debug postfix so that release |
31 |
| -# and debug libraries can coexist. |
32 |
| -if(MSVC) |
33 |
| - set(CMAKE_DEBUG_POSTFIX "d") |
34 |
| -endif() |
| 50 | + target_include_directories(${target} PRIVATE |
| 51 | + ${CMAKE_CURRENT_SOURCE_DIR}/include |
| 52 | + ) |
35 | 53 |
|
36 |
| -target_include_directories(llhttp PUBLIC |
37 |
| - $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> |
38 |
| - $<INSTALL_INTERFACE:include> |
39 |
| -) |
| 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 | + ) |
40 | 60 |
|
41 |
| -set_target_properties(llhttp PROPERTIES PUBLIC_HEADER ${LLHTTP_HEADERS}) |
| 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 | + ) |
42 | 67 |
|
43 |
| -install(TARGETS llhttp |
44 |
| - EXPORT llhttp |
45 |
| - ARCHIVE DESTINATION lib |
46 |
| - PUBLIC_HEADER DESTINATION include/ |
47 |
| -) |
| 68 | + install(FILES |
| 69 | + ${CMAKE_CURRENT_SOURCE_DIR}/libllhttp.pc |
| 70 | + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig |
| 71 | + ) |
48 | 72 |
|
49 |
| -# This is required to work with FetchContent |
50 |
| -install(EXPORT llhttp |
| 73 | + # This is required to work with FetchContent |
| 74 | + install(EXPORT llhttp |
51 | 75 | FILE llhttp-config.cmake
|
52 | 76 | NAMESPACE llhttp::
|
53 |
| - DESTINATION lib/cmake/llhttp) |
| 77 | + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/llhttp) |
| 78 | +endfunction(config_library target) |
| 79 | + |
| 80 | +if(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) |
| 86 | +endif() |
| 87 | + |
| 88 | +if(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) |
| 98 | +endif() |
| 99 | + |
| 100 | +# On windows with Visual Studio, add a debug postfix so that release |
| 101 | +# and debug libraries can coexist. |
| 102 | +if(MSVC) |
| 103 | + set(CMAKE_DEBUG_POSTFIX "d") |
| 104 | +endif() |
| 105 | + |
| 106 | +# Print project configure summary |
| 107 | +message(STATUS "") |
| 108 | +message(STATUS "") |
| 109 | +message(STATUS "Project configure summary:") |
| 110 | +message(STATUS "") |
| 111 | +message(STATUS " CMake build type .................: ${CMAKE_BUILD_TYPE}") |
| 112 | +message(STATUS " Install prefix ...................: ${CMAKE_INSTALL_PREFIX}") |
| 113 | +message(STATUS " Build shared library .............: ${BUILD_SHARED_LIBS}") |
| 114 | +message(STATUS " Build static library .............: ${BUILD_STATIC_LIBS}") |
| 115 | +message(STATUS "") |
0 commit comments