From c8b0f0c9ad78eafc6c8f0005113de346ee797c21 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Wed, 22 Jan 2025 15:13:47 +0100 Subject: [PATCH] cmake: add shell completion support Add the last (*) missing bit for feature parity with autotools. Also test in CI. Add a new `cmake install` step to GHA/macos. (*) AFAIK. Let us know if there's something else missing. Closes #16833 --- .github/workflows/linux.yml | 2 +- .github/workflows/macos.yml | 9 +++- CMakeLists.txt | 2 + docs/INSTALL-CMAKE.md | 4 ++ scripts/CMakeLists.txt | 86 +++++++++++++++++++++++++++++++++++++ scripts/Makefile.am | 3 +- 6 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 scripts/CMakeLists.txt diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 53f35da61a..3e4b54bb55 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -127,7 +127,7 @@ jobs: - name: mbedtls-pkg !pc install_packages: libnghttp2-dev libmbedtls-dev install_steps: skipall - generate: -DCURL_USE_MBEDTLS=ON -DENABLE_DEBUG=ON -DCURL_USE_PKGCONFIG=OFF + generate: -DCURL_USE_MBEDTLS=ON -DENABLE_DEBUG=ON -DCURL_USE_PKGCONFIG=OFF -DCURL_COMPLETION_FISH=ON -DCURL_COMPLETION_ZSH=ON - name: msh3 install_packages: zlib1g-dev diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 181525487a..4b471bc83b 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -134,8 +134,8 @@ jobs: install: gsasl rtmpdump generate: -DOPENSSL_ROOT_DIR=$(brew --prefix openssl) -DCURL_USE_GSASL=ON -DUSE_LIBRTMP=ON -DUSE_APPLE_IDN=ON - name: 'MultiSSL AppleIDN clang-tidy +examples' - install: llvm brotli zstd gnutls nettle mbedtls gsasl rtmpdump - generate: -DCURL_USE_OPENSSL=ON -DOPENSSL_ROOT_DIR=$(brew --prefix openssl) -DCURL_DEFAULT_SSL_BACKEND=openssl -DCURL_USE_GNUTLS=ON -DCURL_USE_MBEDTLS=ON -DENABLE_ARES=ON -DCURL_USE_GSASL=ON -DUSE_LIBRTMP=ON -DUSE_APPLE_IDN=ON -DUSE_SSLS_EXPORT=ON -DCURL_CLANG_TIDY=ON -DCLANG_TIDY=$(brew --prefix llvm)/bin/clang-tidy + install: llvm brotli zstd gnutls nettle mbedtls gsasl rtmpdump fish + generate: -DCURL_USE_OPENSSL=ON -DOPENSSL_ROOT_DIR=$(brew --prefix openssl) -DCURL_DEFAULT_SSL_BACKEND=openssl -DCURL_USE_GNUTLS=ON -DCURL_USE_MBEDTLS=ON -DENABLE_ARES=ON -DCURL_USE_GSASL=ON -DUSE_LIBRTMP=ON -DUSE_APPLE_IDN=ON -DUSE_SSLS_EXPORT=ON -DCURL_CLANG_TIDY=ON -DCLANG_TIDY=$(brew --prefix llvm)/bin/clang-tidy -DCURL_COMPLETION_FISH=ON -DCURL_COMPLETION_ZSH=ON clang-tidy: true chkprefill: _chkprefill - name: 'quictls +static libssh +examples' @@ -239,6 +239,7 @@ jobs: [[ '${{ matrix.build.install_steps }}' = *'pytest'* ]] && options+=' -DTEST_NGHTTPX= -DHTTPD_NGHTTPX=' [ "${_chkprefill}" = '_chkprefill' ] && options+=' -D_CURL_PREFILL=OFF' cmake -B "bld${_chkprefill}" -G Ninja -D_CURL_PREFILL=ON \ + -DCMAKE_INSTALL_PREFIX="$HOME/curl" \ -DCMAKE_UNITY_BUILD=ON -DCURL_TEST_BUNDLES=ON -DCURL_WERROR=ON \ -DCMAKE_OSX_SYSROOT="${sysroot}" \ -DCMAKE_C_COMPILER_TARGET="$(uname -m | sed 's/arm64/aarch64/')-apple-darwin$(uname -r)" \ @@ -288,6 +289,10 @@ jobs: - name: 'curl version' run: bld/src/curl --disable --version + - name: 'cmake install' + if: ${{ matrix.build.generate }} + run: cmake --install bld --strip + - name: 'build tests' run: | if [ -n '${{ matrix.build.generate }}' ]; then diff --git a/CMakeLists.txt b/CMakeLists.txt index cdc1c8f434..7052e1c51d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2051,6 +2051,8 @@ if(HAVE_MANUAL_TOOLS) add_subdirectory(docs) endif() +add_subdirectory(scripts) # for shell completions + list(REMOVE_DUPLICATES CURL_LIBDIRS) add_subdirectory(lib) diff --git a/docs/INSTALL-CMAKE.md b/docs/INSTALL-CMAKE.md index b845cb0bd6..ddfaeffd57 100644 --- a/docs/INSTALL-CMAKE.md +++ b/docs/INSTALL-CMAKE.md @@ -229,6 +229,10 @@ target_link_libraries(my_target PRIVATE CURL::libcurl) - `BUILD_TESTING`: Build tests. Default: `ON` - `CURL_CLANG_TIDY`: Run the build through `clang-tidy`. Default: `OFF` - `CURL_CLANG_TIDYFLAGS`: Custom options to pass to `clang-tidy`. Default: (empty) +- `CURL_COMPLETION_FISH`: Install fish completions. Default: `OFF` +- `CURL_COMPLETION_FISH_DIR`: Custom fish completion install directory. +- `CURL_COMPLETION_ZSH`: Install zsh completions. Default: `OFF` +- `CURL_COMPLETION_ZSH_DIR`: Custom zsh completion install directory. - `CURL_DEFAULT_SSL_BACKEND`: Override default TLS backend in MultiSSL builds. Accepted values in order of default priority: `wolfssl`, `gnutls`, `mbedtls`, `openssl`, `secure-transport`, `schannel`, `bearssl`, `rustls` diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt new file mode 100644 index 0000000000..8c98fbe060 --- /dev/null +++ b/scripts/CMakeLists.txt @@ -0,0 +1,86 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) Viktor Szakats, 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 +# +########################################################################### + +option(CURL_COMPLETION_FISH "Install fish completions" OFF) +option(CURL_COMPLETION_ZSH "Install zsh completions" OFF) + +if(CURL_COMPLETION_FISH OR + CURL_COMPLETION_ZSH) + if(PERL_FOUND) + if(CURL_COMPLETION_FISH) + set(_completion_fish "curl.fish") + add_custom_command(OUTPUT "${_completion_fish}" + COMMAND "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/completion.pl" + --opts-dir "${PROJECT_SOURCE_DIR}/docs/cmdline-opts" --shell fish > "${_completion_fish}" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/completion.pl" + VERBATIM + ) + add_custom_target("curl-completion-fish" ALL DEPENDS "${_completion_fish}") + endif() + + if(CURL_COMPLETION_ZSH) + set(_completion_zsh "_curl") + add_custom_command(OUTPUT "${_completion_zsh}" + COMMAND "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/completion.pl" + --opts-dir "${PROJECT_SOURCE_DIR}/docs/cmdline-opts" --shell zsh > "${_completion_zsh}" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/completion.pl" + VERBATIM + ) + add_custom_target("curl-completion-zsh" ALL DEPENDS "${_completion_zsh}") + endif() + + if(NOT CURL_DISABLE_INSTALL) + if(NOT CMAKE_CROSSCOMPILING) + if(NOT CURL_COMPLETION_FISH_DIR) + find_package(PkgConfig QUIET) + pkg_get_variable(CURL_COMPLETION_FISH_DIR "fish" "completionsdir") + if(NOT _pkg_fish_completionsdir) + include(GNUInstallDirs) + if(CMAKE_INSTALL_DATAROOTDIR) + set(CURL_COMPLETION_FISH_DIR "${CMAKE_INSTALL_DATAROOTDIR}/fish/vendor_completions.d") + endif() + endif() + endif() + if(NOT CURL_COMPLETION_ZSH_DIR) + include(GNUInstallDirs) + if(CMAKE_INSTALL_DATAROOTDIR) + set(CURL_COMPLETION_ZSH_DIR "${CMAKE_INSTALL_DATAROOTDIR}/zsh/site-functions") + endif() + endif() + if(CURL_COMPLETION_FISH_DIR) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${_completion_fish}" + DESTINATION "${CURL_COMPLETION_FISH_DIR}") + endif() + if(CURL_COMPLETION_ZSH_DIR) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${_completion_zsh}" + DESTINATION "${CURL_COMPLETION_ZSH_DIR}") + endif() + else() + message(STATUS "We cannot install completion scripts when cross-compiling") + endif() + endif() + else() + message(WARNING "No perl: cannot generate completion script") + endif() +endif() diff --git a/scripts/Makefile.am b/scripts/Makefile.am index d54f271fe8..2c95179c5b 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -24,7 +24,8 @@ EXTRA_DIST = coverage.sh completion.pl firefox-db2pem.sh checksrc.pl \ mk-ca-bundle.pl mk-unity.pl schemetable.c cd2nroff nroff2cd cdall cd2cd managen \ - dmaketgz maketgz release-tools.sh verify-release cmakelint.sh mdlinkcheck + dmaketgz maketgz release-tools.sh verify-release cmakelint.sh mdlinkcheck \ + CMakeLists.txt ZSH_FUNCTIONS_DIR = @ZSH_FUNCTIONS_DIR@ FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@ -- 2.47.2