2020-03-23 21:44:29 +08:00
|
|
|
#***************************************************************************
|
|
|
|
# _ _ ____ _
|
|
|
|
# Project ___| | | | _ \| |
|
|
|
|
# / __| | | | |_) | |
|
|
|
|
# | (__| |_| | _ <| |___
|
|
|
|
# \___|\___/|_| \_\_____|
|
|
|
|
#
|
2023-01-02 20:51:48 +08:00
|
|
|
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
|
2020-03-23 21:44:29 +08:00
|
|
|
#
|
|
|
|
# This software is licensed as described in the file COPYING, which
|
|
|
|
# you should have received as part of this distribution. The terms
|
2020-11-04 21:02:01 +08:00
|
|
|
# are also available at https://curl.se/docs/copyright.html.
|
2020-03-23 21:44:29 +08:00
|
|
|
#
|
|
|
|
# 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.
|
|
|
|
#
|
2020-10-13 03:44:37 +08:00
|
|
|
# SPDX-License-Identifier: curl
|
2022-05-17 17:16:50 +08:00
|
|
|
#
|
2020-03-23 21:44:29 +08:00
|
|
|
###########################################################################
|
cmake: document `-D` and env build options
Extend `INSTALL-CMAKE` document with the list of available options,
a short description and default values.
The list may not be 100% complete.
There are no component boundaries in CMake, so the line is blurry
between curl options, CMake options, CMake Find modules options.
I included certain CMake options that seemed useful, and/or have
dedicated use withing curl's CMake source. But, all CMake built-in
options are usable, as documented upstream in CMake.
The naming of the options has a heritage and the inconsistencies with
it, including a lack of clear namespace. This may be subject to future
updates, also after figuring out which name has special meaning within
CMake and/or CMake projects out of unwritten convention or something
more tangible.
CMake allows to initialize any internal variable via `-D`. This may be
useful to pre-initialize/override feature check results. The list
doesn't contain these, and they remain officially undocumented.
Also:
- make adjustments to keep the spellchecker happy.
- retrofit description changes to the cmake sources.
- stop documenting deprecated `Find*` variables.
Reported-by: Daniel Stenberg
Fixes https://github.com/curl/curl/discussions/14885
Closes #15388
2024-10-24 08:04:22 +08:00
|
|
|
option(CURL_TEST_BUNDLES "Bundle libtest and unittest tests into single binaries" OFF)
|
2024-09-02 20:46:00 +08:00
|
|
|
|
2024-08-04 23:18:39 +08:00
|
|
|
find_program(TEST_NGHTTPX "nghttpx")
|
|
|
|
if(NOT TEST_NGHTTPX)
|
|
|
|
set(TEST_NGHTTPX "nghttpx")
|
|
|
|
endif()
|
2024-08-14 16:11:03 +08:00
|
|
|
mark_as_advanced(TEST_NGHTTPX)
|
2024-08-09 01:09:56 +08:00
|
|
|
# Consumed variables: TEST_NGHTTPX
|
2024-08-04 23:18:39 +08:00
|
|
|
configure_file("config.in" "${CMAKE_CURRENT_BINARY_DIR}/config" @ONLY)
|
|
|
|
|
2020-05-10 08:10:20 +08:00
|
|
|
add_custom_target(testdeps)
|
2024-08-04 23:18:39 +08:00
|
|
|
add_subdirectory(http)
|
|
|
|
add_subdirectory(http/clients)
|
2009-06-10 01:29:16 +08:00
|
|
|
add_subdirectory(server)
|
2024-08-04 23:18:39 +08:00
|
|
|
add_subdirectory(libtest)
|
2016-06-16 18:53:50 +08:00
|
|
|
add_subdirectory(unit)
|
2024-08-07 22:57:43 +08:00
|
|
|
add_subdirectory(certs EXCLUDE_FROM_ALL)
|
2020-05-10 08:12:12 +08:00
|
|
|
|
2024-08-05 02:35:13 +08:00
|
|
|
function(add_runtests _targetname _test_flags)
|
2024-09-02 20:46:00 +08:00
|
|
|
if(CURL_TEST_BUNDLES)
|
|
|
|
set(_test_flags "${_test_flags} -bundle")
|
|
|
|
endif()
|
cmake: make `test-ci` target skip building dependencies
Make `test-ci` not depend on the `testdeps` target.
`test-ci` is designed to run curl tests in CI. In CI we build all
necessary dependencies explicitly beforehand, and they are always ready
when calling the `test-ci` step. Thus, it isn't necessary to enforce
them via a dependency rule. Dropping it saves redundant work and delay
in CI jobs.
The `testdeps` dependency should not normally be a problem. It's
supposed to be a no-op if those targets are already built. In practice
however, it causes a delay and/or an actual rebuild of those
dependencies depending on generator (= build tool) used and other
factors.
As observed in the GHA/windows workflow, the `testdeps` dependency:
- with Ninja, causes no delay, and no extra work:
https://github.com/curl/curl/actions/runs/10980099984/job/30485440389#step:25:18
- with GNU Make, caused a re-evaluation of `testdeps` targets,
but did not actually rebuild them. This re-evaluation took a
noticeable time (esp. with non-bundled tests):
https://github.com/curl/curl/actions/runs/10980099984/job/30485440155#step:14:11 (with bundles)
https://github.com/curl/curl/actions/runs/10973851013/job/30471690331#step:14:11 (w/o bundles)
verbose: https://github.com/curl/curl/actions/runs/10980506956/job/30486434629#step:14:13
- with MSBuild, caused a re-evaluation of `testdeps` targets, and
triggered a _rebuild_:
https://github.com/curl/curl/actions/runs/10980099984/job/30485435968#step:14:19 (with bundles)
https://github.com/curl/curl/actions/runs/10973851013/job/30471689714#step:14:19 (w/o bundles)
verbose: https://github.com/curl/curl/actions/runs/10980506956/job/30486436368#step:14:48
It's suspected that our use of
`-DCMAKE_VS_GLOBALS=TrackFileAccess=false` in CI is contributing to
this. This option is supposed to affect incremental builds only. For
some reason it affects CI builds too, even though they are not
incremental, and no sources are changed between build steps.
Reported-by: Aki Sakurai
Ref: #14999
Notice that `test-*` targets depending on `testdeps` is NOT sufficient
to build everything to run tests, e.g. it misses to build the curl tool,
which is essential. This is also true for autotools' `test-ci` target
which misses to build libcurl and the curl tool.
Perhaps it'd be best to drop `testdeps` as a dependency for _all_
`test-*` targets and make it official to require building dependencies
manually. Alternatively these targets could be fixed to rebuild
everything necessary to run tests.
Closes #15001
2024-09-22 18:01:36 +08:00
|
|
|
# Skip walking through dependent targets before running tests in CI.
|
|
|
|
# This avoids: GNU Make doing a slow re-evaluation of all targets and
|
|
|
|
# skipping them, MSBuild doing a re-evaluation, and actually rebuilding them.
|
2024-09-24 07:53:27 +08:00
|
|
|
unset(_depends)
|
cmake: make `test-ci` target skip building dependencies
Make `test-ci` not depend on the `testdeps` target.
`test-ci` is designed to run curl tests in CI. In CI we build all
necessary dependencies explicitly beforehand, and they are always ready
when calling the `test-ci` step. Thus, it isn't necessary to enforce
them via a dependency rule. Dropping it saves redundant work and delay
in CI jobs.
The `testdeps` dependency should not normally be a problem. It's
supposed to be a no-op if those targets are already built. In practice
however, it causes a delay and/or an actual rebuild of those
dependencies depending on generator (= build tool) used and other
factors.
As observed in the GHA/windows workflow, the `testdeps` dependency:
- with Ninja, causes no delay, and no extra work:
https://github.com/curl/curl/actions/runs/10980099984/job/30485440389#step:25:18
- with GNU Make, caused a re-evaluation of `testdeps` targets,
but did not actually rebuild them. This re-evaluation took a
noticeable time (esp. with non-bundled tests):
https://github.com/curl/curl/actions/runs/10980099984/job/30485440155#step:14:11 (with bundles)
https://github.com/curl/curl/actions/runs/10973851013/job/30471690331#step:14:11 (w/o bundles)
verbose: https://github.com/curl/curl/actions/runs/10980506956/job/30486434629#step:14:13
- with MSBuild, caused a re-evaluation of `testdeps` targets, and
triggered a _rebuild_:
https://github.com/curl/curl/actions/runs/10980099984/job/30485435968#step:14:19 (with bundles)
https://github.com/curl/curl/actions/runs/10973851013/job/30471689714#step:14:19 (w/o bundles)
verbose: https://github.com/curl/curl/actions/runs/10980506956/job/30486436368#step:14:48
It's suspected that our use of
`-DCMAKE_VS_GLOBALS=TrackFileAccess=false` in CI is contributing to
this. This option is supposed to affect incremental builds only. For
some reason it affects CI builds too, even though they are not
incremental, and no sources are changed between build steps.
Reported-by: Aki Sakurai
Ref: #14999
Notice that `test-*` targets depending on `testdeps` is NOT sufficient
to build everything to run tests, e.g. it misses to build the curl tool,
which is essential. This is also true for autotools' `test-ci` target
which misses to build libcurl and the curl tool.
Perhaps it'd be best to drop `testdeps` as a dependency for _all_
`test-*` targets and make it official to require building dependencies
manually. Alternatively these targets could be fixed to rebuild
everything necessary to run tests.
Closes #15001
2024-09-22 18:01:36 +08:00
|
|
|
if(NOT _targetname STREQUAL "test-ci")
|
|
|
|
set(_depends "testdeps")
|
|
|
|
endif()
|
2020-10-13 03:44:37 +08:00
|
|
|
# Use a special '$TFLAGS' placeholder as last argument which will be
|
2020-05-10 08:12:12 +08:00
|
|
|
# replaced by the contents of the environment variable in runtests.pl.
|
|
|
|
# This is a workaround for CMake's limitation where commands executed by
|
|
|
|
# 'make' or 'ninja' cannot portably reference environment variables.
|
2024-08-05 02:35:13 +08:00
|
|
|
string(REPLACE " " ";" _test_flags_list "${_test_flags}")
|
|
|
|
add_custom_target(${_targetname}
|
2020-05-10 08:12:12 +08:00
|
|
|
COMMAND
|
|
|
|
"${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/runtests.pl"
|
2024-07-13 03:10:57 +08:00
|
|
|
${_test_flags_list}
|
2020-10-13 03:44:37 +08:00
|
|
|
"\$TFLAGS"
|
cmake: make `test-ci` target skip building dependencies
Make `test-ci` not depend on the `testdeps` target.
`test-ci` is designed to run curl tests in CI. In CI we build all
necessary dependencies explicitly beforehand, and they are always ready
when calling the `test-ci` step. Thus, it isn't necessary to enforce
them via a dependency rule. Dropping it saves redundant work and delay
in CI jobs.
The `testdeps` dependency should not normally be a problem. It's
supposed to be a no-op if those targets are already built. In practice
however, it causes a delay and/or an actual rebuild of those
dependencies depending on generator (= build tool) used and other
factors.
As observed in the GHA/windows workflow, the `testdeps` dependency:
- with Ninja, causes no delay, and no extra work:
https://github.com/curl/curl/actions/runs/10980099984/job/30485440389#step:25:18
- with GNU Make, caused a re-evaluation of `testdeps` targets,
but did not actually rebuild them. This re-evaluation took a
noticeable time (esp. with non-bundled tests):
https://github.com/curl/curl/actions/runs/10980099984/job/30485440155#step:14:11 (with bundles)
https://github.com/curl/curl/actions/runs/10973851013/job/30471690331#step:14:11 (w/o bundles)
verbose: https://github.com/curl/curl/actions/runs/10980506956/job/30486434629#step:14:13
- with MSBuild, caused a re-evaluation of `testdeps` targets, and
triggered a _rebuild_:
https://github.com/curl/curl/actions/runs/10980099984/job/30485435968#step:14:19 (with bundles)
https://github.com/curl/curl/actions/runs/10973851013/job/30471689714#step:14:19 (w/o bundles)
verbose: https://github.com/curl/curl/actions/runs/10980506956/job/30486436368#step:14:48
It's suspected that our use of
`-DCMAKE_VS_GLOBALS=TrackFileAccess=false` in CI is contributing to
this. This option is supposed to affect incremental builds only. For
some reason it affects CI builds too, even though they are not
incremental, and no sources are changed between build steps.
Reported-by: Aki Sakurai
Ref: #14999
Notice that `test-*` targets depending on `testdeps` is NOT sufficient
to build everything to run tests, e.g. it misses to build the curl tool,
which is essential. This is also true for autotools' `test-ci` target
which misses to build libcurl and the curl tool.
Perhaps it'd be best to drop `testdeps` as a dependency for _all_
`test-*` targets and make it official to require building dependencies
manually. Alternatively these targets could be fixed to rebuild
everything necessary to run tests.
Closes #15001
2024-09-22 18:01:36 +08:00
|
|
|
DEPENDS "${_depends}"
|
2020-05-10 08:12:12 +08:00
|
|
|
VERBATIM USES_TERMINAL
|
|
|
|
)
|
|
|
|
endfunction()
|
|
|
|
|
2024-09-24 07:53:27 +08:00
|
|
|
function(add_pytest _targetname _test_flags)
|
|
|
|
unset(_depends)
|
|
|
|
if(NOT _targetname STREQUAL "pytest-ci")
|
|
|
|
set(_depends "test-http-clients")
|
|
|
|
endif()
|
|
|
|
string(REPLACE " " ";" _test_flags_list "${_test_flags}")
|
|
|
|
add_custom_target(${_targetname}
|
|
|
|
COMMAND pytest ${_test_flags_list} "${CMAKE_CURRENT_SOURCE_DIR}/http"
|
|
|
|
DEPENDS "${_depends}"
|
|
|
|
VERBATIM USES_TERMINAL
|
|
|
|
)
|
|
|
|
endfunction()
|
|
|
|
|
2024-07-09 00:32:34 +08:00
|
|
|
# Create configurehelp.pm, used by tests needing to run the C preprocessor.
|
|
|
|
if(MSVC OR CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
|
2024-09-07 07:49:40 +08:00
|
|
|
set(CURL_CPP "\"${CMAKE_C_COMPILER}\" -E")
|
2024-08-08 06:53:38 +08:00
|
|
|
if(APPLE AND CMAKE_OSX_SYSROOT)
|
2024-09-07 07:49:40 +08:00
|
|
|
set(CURL_CPP "${CURL_CPP} -isysroot ${CMAKE_OSX_SYSROOT}")
|
2024-07-09 00:32:34 +08:00
|
|
|
endif()
|
|
|
|
# Add header directories, like autotools builds do.
|
|
|
|
get_property(_include_dirs TARGET ${LIB_SELECTED} PROPERTY INCLUDE_DIRECTORIES)
|
|
|
|
foreach(_include_dir IN LISTS _include_dirs)
|
2024-09-07 07:49:40 +08:00
|
|
|
set(CURL_CPP "${CURL_CPP} -I${_include_dir}")
|
2024-07-09 00:32:34 +08:00
|
|
|
endforeach()
|
|
|
|
else()
|
2024-09-07 07:49:40 +08:00
|
|
|
set(CURL_CPP "cpp")
|
2024-07-09 00:32:34 +08:00
|
|
|
endif()
|
2024-09-07 07:49:40 +08:00
|
|
|
# Generate version script for the linker, for versioned symbols.
|
|
|
|
# Consumed variable:
|
|
|
|
# CURL_CPP
|
|
|
|
configure_file(
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/configurehelp.pm.in"
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/configurehelp.pm" @ONLY)
|
2024-07-09 00:32:34 +08:00
|
|
|
|
2020-05-10 08:12:12 +08:00
|
|
|
add_runtests(test-quiet "-a -s")
|
|
|
|
add_runtests(test-am "-a -am")
|
|
|
|
add_runtests(test-full "-a -p -r")
|
2024-07-13 03:10:57 +08:00
|
|
|
# ~flaky means that it ignores results of tests using the flaky keyword
|
2023-09-30 03:06:30 +08:00
|
|
|
add_runtests(test-nonflaky "-a -p ~flaky ~timing-dependent")
|
2024-09-25 21:14:50 +08:00
|
|
|
add_runtests(test-ci "-a -p ~flaky ~timing-dependent -r -rm -j20")
|
2024-10-22 20:41:55 +08:00
|
|
|
add_runtests(test-torture "-a -t -j20")
|
2020-05-10 08:12:12 +08:00
|
|
|
add_runtests(test-event "-a -e")
|
2024-09-24 07:53:27 +08:00
|
|
|
|
|
|
|
add_pytest(curl-pytest "")
|
|
|
|
add_pytest(curl-pytest-ci "-v")
|