forked from BlackMATov/curly.hpp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CMakeLists.txt
153 lines (125 loc) · 4.18 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# 3.8 version is required for `cxx_std_17`
cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
if(NOT DEFINED PROJECT_NAME)
set(BUILD_AS_STANDALONE ON)
endif()
project(curly.hpp)
option(USE_STATIC_CRT "Use static C runtime library" OFF)
option(USE_SYSTEM_CURL "Build with cURL from system paths" OFF)
option(USE_EMBEDDED_CURL "Build with embedded cURL library" ON)
#
# linking
#
if(MSVC AND USE_STATIC_CRT)
foreach(flag CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELWITHDEBINFO)
if(${flag} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}")
endif()
if(${flag} MATCHES "/MDd")
string(REGEX REPLACE "/MDd" "/MTd" ${flag} "${${flag}}")
endif()
endforeach()
endif()
#
# coverage
#
option(BUILD_WITH_COVERAGE "Build with coverage" OFF)
if(BUILD_WITH_COVERAGE AND (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang"))
set(COVERAGE_FLAGS "--coverage")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${COVERAGE_FLAGS}")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${COVERAGE_FLAGS}")
set(CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG} ${COVERAGE_FLAGS}")
endif()
#
# library
#
file(GLOB_RECURSE CURLY_HPP_HEADERS
headers/curly.hpp/*.hpp
headers/curly.hpp/*.inl)
file(GLOB_RECURSE CURLY_HPP_SOURCES
sources/curly.hpp/*.cpp
sources/curly.hpp/*.hpp
sources/curly.hpp/*.inl)
add_library(${PROJECT_NAME} STATIC
${CURLY_HPP_HEADERS}
${CURLY_HPP_SOURCES})
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES
${CURLY_HPP_HEADERS}
${CURLY_HPP_SOURCES})
target_include_directories(${PROJECT_NAME}
PUBLIC headers)
target_compile_features(${PROJECT_NAME}
PUBLIC cxx_std_17)
target_compile_options(${PROJECT_NAME}
PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:
/W4>
PRIVATE
$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
-Wall -Wextra -Wpedantic>)
#
# dependencies
#
find_package(Threads REQUIRED)
target_link_libraries(${PROJECT_NAME} PUBLIC Threads::Threads)
if(USE_SYSTEM_CURL)
find_package(CURL REQUIRED)
target_link_libraries(${PROJECT_NAME} PUBLIC ${CURL_LIBRARIES})
target_include_directories(${PROJECT_NAME} PRIVATE ${CURL_INCLUDE_DIRS})
endif()
if(USE_EMBEDDED_CURL)
include(FetchContent)
FetchContent_Declare(
embedded_curl
GIT_REPOSITORY https://github.com/curl/curl
GIT_TAG curl-7_65_1)
FetchContent_GetProperties(embedded_curl)
if(NOT embedded_curl_POPULATED)
FetchContent_Populate(embedded_curl)
endif()
set(HTTP_ONLY ON CACHE BOOL "" FORCE)
set(ENABLE_MANUAL OFF CACHE BOOL "" FORCE)
set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
set(BUILD_CURL_EXE OFF CACHE BOOL "" FORCE)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
if(MSVC AND USE_STATIC_CRT)
set(CURL_STATIC_CRT ON CACHE BOOL "" FORCE)
endif()
if(WIN32)
set(CMAKE_USE_WINSSL ON CACHE BOOL "" FORCE)
set(CURL_CA_PATH "none" CACHE STRING "" FORCE)
set(CURL_CA_BUNDLE "none" CACHE STRING "" FORCE)
endif()
if(APPLE)
set(CMAKE_USE_SECTRANSP ON CACHE BOOL "" FORCE)
set(CURL_CA_PATH "none" CACHE STRING "" FORCE)
set(CURL_CA_BUNDLE "none" CACHE STRING "" FORCE)
endif()
if(UNIX AND NOT APPLE)
set(CMAKE_USE_OPENSSL ON CACHE BOOL "" FORCE)
set(CURL_CA_PATH "auto" CACHE STRING "" FORCE)
set(CURL_CA_BUNDLE "auto" CACHE STRING "" FORCE)
endif()
add_subdirectory(${embedded_curl_SOURCE_DIR} ${embedded_curl_BINARY_DIR})
target_link_libraries(${PROJECT_NAME} PUBLIC libcurl)
target_include_directories(${PROJECT_NAME} PRIVATE ${CURL_SOURCE_DIR}/include)
endif()
#
# unit tests
#
if(BUILD_AS_STANDALONE)
option(BUILD_WITH_UNTESTS "Build with unit tests" ON)
if(BUILD_WITH_UNTESTS)
enable_testing()
add_subdirectory(untests)
endif()
endif()