mirror of
https://github.com/curl/curl.git
synced 2026-04-13 12:41:42 +08:00
Build these examples when the necessary dependencies are present:
- cacertinmem, usercertinmem (OpenSSL/fork)
- multi-uv (libuv)
- multithread, threaded-ssl (pthread)
- sessioninfo (GnuTLS)
Indicate the necessary dependency via a `Required:` comment placed in
the source file. A single dependency per source is supported as of now.
The name of the dependency should match the variable used within
the cmake scripts, which in turn matches the macro used in the config
header. E.g. for GnuTLS it's `USE_GNUTLS`.
Also:
- GHA/macos: build examples in two job to test GnuTLS and pthread ones.
- GHA/linux: enable libuv to test it with examples.
Follow-up to 6bb7714032 #18914
Closes #18909
94 lines
4.4 KiB
CMake
94 lines
4.4 KiB
CMake
#***************************************************************************
|
|
# _ _ ____ _
|
|
# Project ___| | | | _ \| |
|
|
# / __| | | | |_) | |
|
|
# | (__| |_| | _ <| |___
|
|
# \___|\___/|_| \_\_____|
|
|
#
|
|
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
#
|
|
# This software is licensed as described in the file COPYING, which
|
|
# you should have received as part of this distribution. The terms
|
|
# are also available at https://curl.se/docs/copyright.html.
|
|
#
|
|
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
# copies of the Software, and permit persons to whom the Software is
|
|
# furnished to do so, under the terms of the COPYING file.
|
|
#
|
|
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
# KIND, either express or implied.
|
|
#
|
|
# SPDX-License-Identifier: curl
|
|
#
|
|
###########################################################################
|
|
|
|
add_custom_target(curl-examples)
|
|
|
|
# Get check_PROGRAMS, COMPLICATED_MAY_BUILD, COMPLICATED_EXAMPLES variables
|
|
curl_transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
|
|
include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
|
|
|
|
set(_with_deps "")
|
|
set(_all_src "")
|
|
set(_all_canary "")
|
|
set(_all "all")
|
|
foreach(_target IN LISTS COMPLICATED_MAY_BUILD check_PROGRAMS _all) # keep 'COMPLICATED_MAY_BUILD' first, and '_all' last
|
|
# Strip .c suffix from COMPLICATED_MAY_BUILD items
|
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.20)
|
|
cmake_path(GET _target STEM _target)
|
|
else()
|
|
get_filename_component(_target "${_target}" NAME_WE)
|
|
endif()
|
|
set(_more_libs "")
|
|
set(_target_name "curl-example-${_target}")
|
|
if(_target STREQUAL "all")
|
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12)
|
|
add_library(${_target_name} OBJECT EXCLUDE_FROM_ALL ${_all_src})
|
|
if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") # MSVC but exclude clang-cl
|
|
# CMake generates a static library for the OBJECT target. Silence these 'lib.exe' warnings:
|
|
# warning LNK4006: main already defined in ....obj; second definition ignored
|
|
# warning LNK4221: This object file does not define any previously undefined public symbols,
|
|
# so it will not be used by any link operation that consumes this library
|
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.13)
|
|
set_target_properties(${_target_name} PROPERTIES STATIC_LIBRARY_OPTIONS "-ignore:4006;-ignore:4221")
|
|
else()
|
|
set_target_properties(${_target_name} PROPERTIES STATIC_LIBRARY_FLAGS "-ignore:4006 -ignore:4221")
|
|
endif()
|
|
endif()
|
|
else()
|
|
add_library(${_target_name} STATIC EXCLUDE_FROM_ALL ${_all_src})
|
|
endif()
|
|
if(_with_deps)
|
|
set(_more_libs ${CURL_LIBS}) # If any examples required dependencies, link them
|
|
endif()
|
|
add_custom_target(curl-examples-build) # Special target to compile all tests quickly and build a single test to probe linkage
|
|
add_dependencies(curl-examples-build ${_target_name} ${_all_canary}) # Include a full build of a single test
|
|
else()
|
|
# Check if the example requires a build option. Then check if that build option is enabled.
|
|
# If it is, link all dependencies to the example.
|
|
set(_requires_regex "/\\* Requires: ([A-Z0-9_]+) \\*/")
|
|
file(STRINGS "${_target}.c" _req REGEX "${_requires_regex}")
|
|
string(REGEX REPLACE "${_requires_regex}" "\\1" _req "${_req}")
|
|
if(_req)
|
|
if(${${_req}})
|
|
string(APPEND _with_deps " ${_target}:${_req}")
|
|
set(_more_libs ${CURL_LIBS})
|
|
else()
|
|
continue() # Option required, but not found
|
|
endif()
|
|
endif()
|
|
set(_all_canary ${_target_name}) # Save the last test for the curl-examples-build target
|
|
list(APPEND _all_src "${_target}.c")
|
|
add_executable(${_target_name} EXCLUDE_FROM_ALL "${_target}.c")
|
|
add_dependencies(curl-examples ${_target_name})
|
|
endif()
|
|
target_link_libraries(${_target_name} ${LIB_SELECTED} ${CURL_NETWORK_AND_TIME_LIBS} ${_more_libs})
|
|
target_compile_definitions(${_target_name} PRIVATE "CURL_NO_OLDIES"
|
|
"$<$<BOOL:${WIN32}>:WIN32_LEAN_AND_MEAN>" "$<$<BOOL:${MSVC}>:_CRT_SECURE_NO_DEPRECATE>")
|
|
set_target_properties(${_target_name} PROPERTIES OUTPUT_NAME "${_target}" PROJECT_LABEL "Example ${_target}" UNITY_BUILD OFF)
|
|
endforeach()
|
|
|
|
if(_with_deps)
|
|
message(STATUS "Enabled examples with dependencies:${_with_deps}")
|
|
endif()
|