My project build fails when import storage_client.a

Does this issue affect the google-cloud-cpp project?
No
What component of google-cloud-cpp is this related to?

Cloud Storage.

What version of google-cloud-cpp are you using?
v0.11.0
cc1af99d40c8db9d5abcd598a4211e38950cfeed
What compiler and version are you using?
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
............
gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
What operating system and version are you using?
Ubuntu 18.04.02
What were you trying to do?
I followed the instruction to build libstorage_client.a and libgoogle_cloud_cpp_common.a, then I import them to my cmake project which is a simplified version of my working project and it only have these two as dependency. The test project itself is a static library.
What did you expect to see?
My cmake project should build without error.
What did you see instead?
/usr/bin/ld: /home/***********/Release/libstorage_client.a(curl_client.cc.o): undefined reference to symbol 'curl_share_setopt@@CURL_GNUTLS_3'
//usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

Anything else you would like us to know?
I have not install any special version of curl or anything on my environment, everything is from sudo apt update/upgrade

I followed the instruction to build libstorage_client.a and libgoogle_cloud_cpp_common.a, then I import them to my cmake project which is a simplified version of my working project and it only have these two as dependency. The test project itself is a static library.

How do you import the libraries?  Do you:

Use find_package(storage_client) and then link against the imported target, or
Link the libraries directly?

Can you tell us how you configured the problem? Do you provide any options to cmake or make before installing the library?
Also, you might find this helpful, this is how we test compiling and linking against the libraries:
https://github.com/googleapis/google-cloud-cpp/blob/master/ci/test-install/storage/CMakeLists.txt
https://github.com/googleapis/google-cloud-cpp/blob/2de685053a3ba44afb43531776e0eaada3c35e4c/ci/kokoro/install/Dockerfile.ubuntu#L107-L121

DSO missing from command line

This error generally means you either specified the wrong link order or omitted a library entirely. Make sure the following is present in your CMakeLists.txt:
find_package(curl REQUIRED)
target_link_libraries(your_project storage_client CURL::libcurl).

I linked the libraries directly (and store them as binrary in git). The reason we do not install it is because that would require everyone in the big team to download/compile/and install google cloud storage lib, which is not ideal in our setup. We don't want to install any of the google cloud dependencies either, so I can't do find_package(curl REQUIRED)
We typically just do a one time compiling on all the dependencies and the dependencies of them and store in git.
I further strip down the test program to this:
cmake
project(gcloudtest)

set(GCLOUD_LIB ${CMAKE_CURRENT_SOURCE_DIR}/../../Extlibs/gcloud/lib/Linux/Debug)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../Extlibs/gcloud/include)

add_library(gcloud-client-curl STATIC IMPORTED)

add_library(gcloud-common STATIC IMPORTED)
add_library(gcloud-client STATIC IMPORTED)

set_target_properties(gcloud-client-curl PROPERTIES IMPORTED_LOCATION ${GCLOUD_LIB}/libcurl.a)
set_target_properties(gcloud-common PROPERTIES IMPORTED_LOCATION ${GCLOUD_LIB}/libgoogle_cloud_cpp_common.a)
set_target_properties(gcloud-client PROPERTIES IMPORTED_LOCATION ${GCLOUD_LIB}/libstorage_client.a)

add_executable(${PROJECT_NAME} gcloudtest.cpp)
target_link_libraries(${PROJECT_NAME} gcloud-client-curl gcloud-client gcloud-common)

and here is the cpp
#include "google/cloud/storage/client.h"

int main()
{
    namespace gcs = google::cloud::storage;
    // load credential.
    auto credentials = gcs::oauth2::CreateServiceAccountCredentialsFromJsonContents("cred");
    if(!credentials.ok())
    {
        return 0;
    }

    // create options for google cloud client.
    auto options = std::make_unique<gcs::ClientOptions>(credentials.value());
    if (!options)
    {
        return 0;
    }
    const int kMaxUploadSize =<PHONE_NUMBER>;  // 1Gb
    options->set_maximum_simple_upload_size(kMaxUploadSize);
    google::cloud::StatusOr<google::cloud::storage::Client> client_;       //!< Google Cloud Client.
    client_ = google::cloud::storage::Client(*options);
}

Then I got errors
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(client.cc.o): In function `google::cloud::storage::v1::internal::CurlHandle::MakeEscapedString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:134: undefined reference to `curl_free'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:134: undefined reference to `curl_easy_escape'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle.cc.o): In function `google::cloud::storage::v1::internal::CurlHandle::CurlHandle()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.cc:85: undefined reference to `curl_easy_cleanup'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.cc:85: undefined reference to `curl_easy_init'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle.cc.o): In function `google::cloud::storage::v1::internal::CurlHandle::AsStatus(CURLcode, char const*)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.cc:153: undefined reference to `curl_easy_strerror'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle.cc.o): In function `google::cloud::storage::v1::internal::CurlHandle::ThrowSetOptionError(CURLcode, CURLoption, long)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.cc:198: undefined reference to `curl_easy_strerror'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle.cc.o): In function `google::cloud::storage::v1::internal::CurlHandle::ThrowSetOptionError(CURLcode, CURLoption, char const*)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.cc:206: undefined reference to `curl_easy_strerror'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle.cc.o): In function `google::cloud::storage::v1::internal::CurlHandle::ThrowSetOptionError(CURLcode, CURLoption, void*)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.cc:213: undefined reference to `curl_easy_strerror'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle.cc.o): In function `void google::cloud::storage::v1::internal::CurlHandle::SetOption<std::function<unsigned long (char*, unsigned long, unsigned long)>*>(CURLoption, std::function<unsigned long (char*, unsigned long, unsigned long)>*&&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:139: undefined reference to `curl_easy_setopt'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle.cc.o): In function `void google::cloud::storage::v1::internal::CurlHandle::SetOption<unsigned long (*)(char*, unsigned long, unsigned long, void*)>(CURLoption, unsigned long (*&&)(char*, unsigned long, unsigned long, void*))':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:139: undefined reference to `curl_easy_setopt'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle.cc.o): In function `void google::cloud::storage::v1::internal::CurlHandle::SetOption<decltype(nullptr)>(CURLoption, decltype(nullptr)&&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:139: undefined reference to `curl_easy_setopt'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle.cc.o): In function `void google::cloud::storage::v1::internal::CurlHandle::SetOption<std::function<unsigned long (void*, unsigned long, unsigned long)>*>(CURLoption, std::function<unsigned long (void*, unsigned long, unsigned long)>*&&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:139: undefined reference to `curl_easy_setopt'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle.cc.o): In function `void google::cloud::storage::v1::internal::CurlHandle::SetOption<unsigned long (*)(void*, unsigned long, unsigned long, void*)>(CURLoption, unsigned long (*&&)(void*, unsigned long, unsigned long, void*))':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:139: undefined reference to `curl_easy_setopt'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle.cc.o):/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:139: more undefined references to `curl_easy_setopt' follow
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_client.cc.o): In function `google::cloud::storage::v1::internal::CurlClient::CurlClient(google::cloud::storage::v1::ClientOptions)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_client.cc:260: undefined reference to `curl_share_cleanup'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_client.cc:265: undefined reference to `curl_share_init'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_client.cc:282: undefined reference to `curl_share_setopt'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_client.cc:283: undefined reference to `curl_share_setopt'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_client.cc:285: undefined reference to `curl_share_setopt'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_client.cc:286: undefined reference to `curl_share_setopt'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_client.cc:287: undefined reference to `curl_share_setopt'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_client.cc.o):/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_client.cc:288: more undefined references to `curl_share_setopt' follow
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(hash_validator_impl.cc.o): In function `google::cloud::storage::v1::internal::MD5HashValidator::MD5HashValidator()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/hash_validator_impl.cc:26: undefined reference to `MD5_Init'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(hash_validator_impl.cc.o): In function `google::cloud::storage::v1::internal::MD5HashValidator::Update(char const*, unsigned long)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/hash_validator_impl.cc:29: undefined reference to `MD5_Update'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(hash_validator_impl.cc.o): In function `google::cloud::storage::v1::internal::MD5HashValidator::Finish() &&':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/hash_validator_impl.cc:61: undefined reference to `MD5_Final'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(hash_validator_impl.cc.o): In function `google::cloud::storage::v1::internal::Crc32cHashValidator::Update(char const*, unsigned long)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/hash_validator_impl.cc:71: undefined reference to `crc32c::Extend(unsigned int, unsigned char const*, unsigned long)'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(openssl_util.cc.o): In function `google::cloud::storage::v1::internal::(anonymous namespace)::GetDigestCtx()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:45: undefined reference to `EVP_MD_CTX_free'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:45: undefined reference to `EVP_MD_CTX_new'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(openssl_util.cc.o): In function `google::cloud::storage::v1::internal::(anonymous namespace)::PushBase64Transcoding(std::unique_ptr<bio_st, int (*)(bio_st*)>)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:66: undefined reference to `BIO_free'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:66: undefined reference to `BIO_f_base64'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:66: undefined reference to `BIO_new'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:77: undefined reference to `BIO_free_all'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:77: undefined reference to `BIO_push'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:79: undefined reference to `BIO_set_flags'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(openssl_util.cc.o): In function `google::cloud::storage::v1::internal::(anonymous namespace)::Base64Encode(unsigned char const*, unsigned long)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:94: undefined reference to `BIO_free'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:94: undefined reference to `BIO_s_mem'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:94: undefined reference to `BIO_new'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:100: undefined reference to `BIO_write'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:110: undefined reference to `BIO_ctrl'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:120: undefined reference to `BIO_ctrl'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(openssl_util.cc.o): In function `google::cloud::storage::v1::internal::Base64Decode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:144: undefined reference to `BIO_free'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:144: undefined reference to `BIO_new_mem_buf'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:155: undefined reference to `BIO_read'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(openssl_util.cc.o): In function `google::cloud::storage::v1::internal::SignStringWithPem(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, google::cloud::storage::v1::oauth2::JwtSigningAlgorithms)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:200: undefined reference to `EVP_sha256'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:210: undefined reference to `BIO_free'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:210: undefined reference to `BIO_new_mem_buf'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:224: undefined reference to `EVP_PKEY_free'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:224: undefined reference to `PEM_read_bio_PrivateKey'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:231: undefined reference to `EVP_DigestSignInit'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:240: undefined reference to `EVP_DigestUpdate'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:249: undefined reference to `EVP_DigestSignFinal'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/openssl_util.cc:256: undefined reference to `EVP_DigestSignFinal'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(sha256_hash.cc.o): In function `std::vector<unsigned char, std::allocator<unsigned char> > google::cloud::storage::v1::internal::(anonymous namespace)::Sha256Hash<char, 0>(char const*, unsigned long)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/sha256_hash.cc:31: undefined reference to `SHA256_Init'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/sha256_hash.cc:36: undefined reference to `SHA256_Update'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/sha256_hash.cc:39: undefined reference to `SHA256_Final'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(sha256_hash.cc.o): In function `std::vector<unsigned char, std::allocator<unsigned char> > google::cloud::storage::v1::internal::(anonymous namespace)::Sha256Hash<unsigned char, 0>(unsigned char const*, unsigned long)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/sha256_hash.cc:31: undefined reference to `SHA256_Init'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/sha256_hash.cc:36: undefined reference to `SHA256_Update'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/sha256_hash.cc:39: undefined reference to `SHA256_Final'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(service_account_credentials.cc.o): In function `google::cloud::storage::v1::oauth2::ParseServiceAccountP12File(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)#1}::operator()(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:87: undefined reference to `d2i_PKCS12_fp'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(service_account_credentials.cc.o): In function `google::cloud::storage::v1::oauth2::ParseServiceAccountP12File(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#2}::operator()() const':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:96: undefined reference to `ERR_get_error'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:102: undefined reference to `ERR_error_string_n'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(service_account_credentials.cc.o): In function `google::cloud::storage::v1::oauth2::ParseServiceAccountP12File(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#3}::operator()() const::{lambda(void*)#1}::operator()({lambda()#3}) const':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:140: undefined reference to `CRYPTO_free'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(service_account_credentials.cc.o): In function `google::cloud::storage::v1::oauth2::ParseServiceAccountP12File(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#3}::operator()() const':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:142: undefined reference to `X509_NAME_oneline'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(service_account_credentials.cc.o): In function `google::cloud::storage::v1::oauth2::ParseServiceAccountP12File(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:80: undefined reference to `OPENSSL_init_crypto'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:92: undefined reference to `PKCS12_free'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:116: undefined reference to `PKCS12_parse'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:124: undefined reference to `EVP_PKEY_free'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:125: undefined reference to `X509_free'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:137: undefined reference to `X509_get_subject_name'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:160: undefined reference to `BIO_free'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:160: undefined reference to `BIO_s_mem'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:160: undefined reference to `BIO_new'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:162: undefined reference to `PEM_write_bio_PKCS8PrivateKey'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/oauth2/service_account_credentials.cc:172: undefined reference to `BIO_ctrl'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(hashing_options.cc.o): In function `google::cloud::storage::v1::ComputeMD5Hash(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/hashing_options.cc:28: undefined reference to `MD5_Init'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/hashing_options.cc:29: undefined reference to `MD5_Update'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/hashing_options.cc:32: undefined reference to `MD5_Final'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(hashing_options.cc.o): In function `google::cloud::storage::v1::ComputeCrc32cChecksum(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/hashing_options.cc:38: undefined reference to `crc32c::Extend(unsigned int, unsigned char const*, unsigned long)'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle_factory.cc.o): In function `google::cloud::storage::v1::internal::DefaultCurlHandleFactory::CreateHandle()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:33: undefined reference to `curl_easy_cleanup'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:33: undefined reference to `curl_easy_init'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle_factory.cc.o): In function `google::cloud::storage::v1::internal::DefaultCurlHandleFactory::CleanupHandle(std::unique_ptr<void, void (*)(void*)>&&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:38: undefined reference to `curl_easy_getinfo'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle_factory.cc.o): In function `google::cloud::storage::v1::internal::DefaultCurlHandleFactory::CreateMultiHandle()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:48: undefined reference to `curl_multi_cleanup'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:48: undefined reference to `curl_multi_init'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle_factory.cc.o): In function `google::cloud::storage::v1::internal::PooledCurlHandleFactory::~PooledCurlHandleFactory()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:61: undefined reference to `curl_easy_cleanup'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:64: undefined reference to `curl_multi_cleanup'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle_factory.cc.o): In function `google::cloud::storage::v1::internal::PooledCurlHandleFactory::CreateHandle()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:73: undefined reference to `curl_easy_reset'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:75: undefined reference to `curl_easy_cleanup'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:77: undefined reference to `curl_easy_cleanup'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:77: undefined reference to `curl_easy_init'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle_factory.cc.o): In function `google::cloud::storage::v1::internal::PooledCurlHandleFactory::CleanupHandle(std::unique_ptr<void, void (*)(void*)>&&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:83: undefined reference to `curl_easy_getinfo'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:90: undefined reference to `curl_easy_cleanup'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle_factory.cc.o): In function `google::cloud::storage::v1::internal::PooledCurlHandleFactory::CreateMultiHandle()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:102: undefined reference to `curl_multi_cleanup'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:104: undefined reference to `curl_multi_cleanup'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:104: undefined reference to `curl_multi_init'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_handle_factory.cc.o): In function `google::cloud::storage::v1::internal::PooledCurlHandleFactory::CleanupMultiHandle(std::unique_ptr<void, CURLMcode (*)(void*)>&&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle_factory.cc:112: undefined reference to `curl_multi_cleanup'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_request.cc.o): In function `google::cloud::storage::v1::internal::CurlRequest::CurlRequest()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_request.cc:23: undefined reference to `curl_slist_free_all'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_request.cc.o): In function `google::cloud::storage::v1::internal::CurlHandle::EasyPerform()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:147: undefined reference to `curl_easy_perform'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_request.cc.o): In function `google::cloud::storage::v1::internal::CurlHandle::GetResponseCode()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:153: undefined reference to `curl_easy_getinfo'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_request.cc.o): In function `void google::cloud::storage::v1::internal::CurlHandle::SetOption<unsigned long>(CURLoption, unsigned long&&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:139: undefined reference to `curl_easy_setopt'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_request.cc.o): In function `void google::cloud::storage::v1::internal::CurlHandle::SetOption<char const*>(CURLoption, char const*&&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:139: undefined reference to `curl_easy_setopt'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_request.cc.o): In function `void google::cloud::storage::v1::internal::CurlHandle::SetOption<curl_slist*>(CURLoption, curl_slist*&&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:139: undefined reference to `curl_easy_setopt'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_request.cc.o): In function `void google::cloud::storage::v1::internal::CurlHandle::SetOption<int>(CURLoption, int&&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:139: undefined reference to `curl_easy_setopt'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_request_builder.cc.o): In function `google::cloud::storage::v1::internal::CurlRequestBuilder::CurlRequestBuilder(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<google::cloud::storage::v1::internal::CurlHandleFactory>)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_request_builder.cc:33: undefined reference to `curl_slist_free_all'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_request_builder.cc.o): In function `google::cloud::storage::v1::internal::CurlRequestBuilder::AddHeader(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_request_builder.cc:77: undefined reference to `curl_slist_append'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_request_builder.cc.o): In function `google::cloud::storage::v1::internal::CurlRequestBuilder::UserAgentSuffix[abi:cxx11]() const::{lambda()#1}::operator()() const':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_request_builder.cc:123: undefined reference to `curl_version'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_request_builder.cc.o): In function `void google::cloud::storage::v1::internal::CurlHandle::SetOption<void*&>(CURLoption, void*&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:139: undefined reference to `curl_easy_setopt'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_wrappers.cc.o): In function `google::cloud::storage::v1::internal::(anonymous namespace)::CurlInitializer::CurlInitializer()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_wrappers.cc:188: undefined reference to `curl_global_init'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_wrappers.cc.o): In function `google::cloud::storage::v1::internal::(anonymous namespace)::CurlInitializer::~CurlInitializer()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_wrappers.cc:189: undefined reference to `curl_global_cleanup'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_wrappers.cc.o): In function `google::cloud::storage::v1::internal::CurlSslLibraryId[abi:cxx11]()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_wrappers.cc:194: undefined reference to `curl_version_info'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_download_request.cc.o): In function `google::cloud::storage::v1::internal::CurlDownloadRequest::CurlDownloadRequest()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_download_request.cc:44: undefined reference to `curl_slist_free_all'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_download_request.cc:45: undefined reference to `curl_multi_cleanup'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_download_request.cc.o): In function `google::cloud::storage::v1::internal::CurlDownloadRequest::Close()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_download_request.cc:96: undefined reference to `curl_multi_remove_handle'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_download_request.cc.o): In function `google::cloud::storage::v1::internal::CurlDownloadRequest::SetOptions()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_download_request.cc:173: undefined reference to `curl_multi_add_handle'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_download_request.cc.o): In function `google::cloud::storage::v1::internal::CurlDownloadRequest::PerformWork()':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_download_request.cc:271: undefined reference to `curl_multi_perform'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_download_request.cc:285: undefined reference to `curl_multi_info_read'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_download_request.cc:294: undefined reference to `curl_easy_strerror'
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_download_request.cc:307: undefined reference to `curl_multi_remove_handle'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_download_request.cc.o): In function `google::cloud::storage::v1::internal::CurlDownloadRequest::WaitForHandles(int&)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_download_request.cc:340: undefined reference to `curl_multi_wait'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_download_request.cc.o): In function `google::cloud::storage::v1::internal::CurlDownloadRequest::AsStatus(CURLMcode, char const*)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_download_request.cc:366: undefined reference to `curl_multi_strerror'
/home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libstorage_client.a(curl_download_request.cc.o): In function `google::cloud::storage::v1::internal::CurlHandle::EasyPause(int)':
/home/zicons/repo/google-cloud-cpp/google/cloud/storage/internal/curl_handle.h:161: undefined reference to `curl_easy_pause'
collect2: error: ld returned 1 exit status
make[2]: *** [gcloudtest] Error 1
make[1]: *** [CMakeFiles/gcloudtest.dir/all] Error 2
make: *** [all] Error 2

target_link_libraries(${PROJECT_NAME} gcloud-client-curl gcloud-client gcloud-common)

I believe gcloud-client-curl needs to be last since gcloud-client depends upon it.

I have tried put it to the end, it does not fix the problem.
Also, I added openssl
add_library(openssl STATIC IMPORTED)
set_target_properties(openssl PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../../Extlibs/openssl/lib/Linux/Release/libssl.so.1.1)
add_executable(${PROJECT_NAME} gcloudtest.cpp)
target_link_libraries(${PROJECT_NAME} gcloud-client gcloud-common gcloud-client-curl openssl)

but get the error similar to before.
/usr/bin/ld: /home/zicons/repo/malibu/Tools/gcloudtest/../../Extlibs/gcloud/lib/Linux/Debug/libcurl.a(openssl.c.o): undefined reference to symbol 'ENGINE_ctrl@@OPENSSL_1_1_0'
//usr/lib/x86_64-linux-gnu/libcrypto.so.1.1: error adding symbols: DSO missing from command line

Just to add, I use the libcurl.a from google_cloud_cpp/external/lib, I think thats what google cloud cpp freshly build from source.

Your life will probably be a lot easier if you are able to use the FindOpenSSL.cmake that comes with CMake (you will need to set OPENSSL_ROOT_DIR and OPENSSL_USE_STATIC_LIBS) then use OpenSSL::SSL and OpenSSL::Crypto). Otherwise, it looks like you will also need to link against libcrypto.
Not sure why the curl thing is still failing, I will look into it with more detail later.

I linked the libraries directly (and store them as binrary in git). The reason we do not install it is because that would require everyone in the big team to download/compile/and install google cloud storage lib, which is not ideal in our setup.
We don't want to install any of the google cloud dependencies either, so I can't do find_package(curl REQUIRED)

Ack. Note that curl in particular can be finicky with respect to the certificate authority trust store, you probably will have a better experience using the version included with your distro.

We typically just do a one time compiling on all the dependencies and the dependencies of them and store in git.

Hmmm... Okay, I trust that you have good reasons to do so.  But this is not a model we have spent a lot of time thinking about, so we will need to work together to discover how to make it work.
As @remyabel points out, at the very least you will want the OpenSSL libraries installed in your system and you most likely want to use the CMake modules for them.  We do not compile OpenSSL from source, and you probably want your crypto software to come from a trusted source anyway.

I further strip down the test program to this:
cmake
project(gcloudtest)

set(GCLOUD_LIB ${CMAKE_CURRENT_SOURCE_DIR}/../../Extlibs/gcloud/lib/Linux/Debug)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../Extlibs/gcloud/include)

add_library(gcloud-client-curl STATIC IMPORTED)

add_library(gcloud-common STATIC IMPORTED)
add_library(gcloud-client STATIC IMPORTED)

set_target_properties(gcloud-client-curl PROPERTIES IMPORTED_LOCATION ${GCLOUD_LIB}/libcurl.a)
set_target_properties(gcloud-common PROPERTIES IMPORTED_LOCATION ${GCLOUD_LIB}/libgoogle_cloud_cpp_common.a)
set_target_properties(gcloud-client PROPERTIES IMPORTED_LOCATION ${GCLOUD_LIB}/libstorage_client.a)

add_executable(${PROJECT_NAME} gcloudtest.cpp)
target_link_libraries(${PROJECT_NAME} gcloud-client-curl gcloud-client gcloud-common)

You will want to include a lot of additional dependencies, gcloud-client will need to link Crc32c::crc32c, OpenSSL::SSL, OpenSSL::Crypto, ZLIB::ZLIB, and you need to make sure you compile and link with -pthread.
You may be able to get all this information from CMake, using the --graphviz option.

Thanks,@coryan @remyabel I managed to solve this problem.
The following is for future reference.
I built openssl v1.1.0 stable (libssl.a and libcrypto.a) and curl 7.65.2 (libcurl.a) from source, and import them along with ibgoogle_cloud_cpp_common.a and libstorage_client.a. Don't forget crc32c which can be just copied from google-cloud-cpp/external/lib. (libcurl.a is also there, but that one does not work.) I did not encounter issue by not linking to zlib, tho.
add_library(crc32c STATIC IMPORTED)
set_target_properties(crc32c PROPERTIES IMPORTED_LOCATION ${GCLOUD_LIB}/libcrc32c.a)
set_target_properties(gcloud-common PROPERTIES IMPORTED_LOCATION ${GCLOUD_LIB}/libgoogle_cloud_cpp_common.a)
set_target_properties(gcloud-client PROPERTIES IMPORTED_LOCATION ${GCLOUD_LIB}/libstorage_client.a)
target_link_libraries(${PROJECT_NAME} gcloud-client gcloud-common curl openssl crypto crc32c pthread dl)

That brings it to a question, why can't google cloud cpp provide an option to build a dynamic library so that all the dependencies are built-in, people can simply import it to their project?

By default, google-cloud-cpp will try to download, build and install the dependencies (except for OpenSSL, which we use find_package for) as CMake external projects. We also create imported targets (if they do not already exist) for the dependencies. If you want to use those targets, you may need to do something like set CMAKE_MODULE_PATH then either include() the appropriate files or use find_package.
An easier way is to use a super build. We plan on eventually using only find_package, which means you need to obtain the dependencies yourself or use the super build option. The super build "guarantees" compatibility as we download the dependencies with specific versions and build them with specific flags in the same tree.

Another option is to vendor  google-cloud-cpp in your project, then use add_subdirectory(google-cloud-cpp EXCLUDE_FROM_ALL). This is the least hassle option and you get all of the targets for free.

That brings it to a question, why can't google cloud cpp provide an option to build a dynamic library

I believe we do?  -DBUILD_SHARED_LIBS=ON is the standard CMake option to compile libraries as shared objects (aka dynamic libraries).

so that all the dependencies are built-in,

What do you mean by "built-in"?  You would still need to make sure that the shared objects for Crc32c, or libcurl, or openssl are available also, yes you would not have to explicitly add them to the command line, but you need them in the locations where you program finds them.

people can simply import it to their project?

If by "import" you mean "commit the binary artifact to git and then use it": I did not think that was a common technique.  I still do not think it is that common, but maybe I am wrong.
If by "import" you mean "install the binary artifacts in /usr/local or a similar location and use them via find_package()" we do support that, and test it.
If by "import" you mean "vendor the project into git as a sub-module or via FetchContent", then as @remyabel mentioned, that works too and we have tests for it.
If by "import" you mean "use google-cloud-cpp as part of a super-build", then we know that works too.
So I guess the short answer is "We did not think the way you use the binary artifacts is a common way to do things."

@fire3280  I think I am going to close this issue because things seem to be working with you, happy to reopen if you want to discuss further.

@coryan ,Thanks for the help. Just to clarify, yes, -DBUILD_SHARED_LIBS=ON is provided, but I think it links to the shared library of it's dependencies such as crc32c, which means as you said, our program still needs to link to the dependencies in runtime besides storage-client.so and etc. It would be great if google cloud can link to static version of its dependencies so that everything it needs is already in a single shared lib (google-common.so and storage-client.so)
You are definitely more experienced than I am. But from what I understand, in a close source world, it is very common to pre-compile dependency libraries and store the lib/dll/a/so in the SCM for many good reasons. with few downside but not going to argument on this.
One good example is we use a few heavily modified and custom built open source libraries for maximum performance and minimal of size and precompile and store the binary because we don't plan to update from mainstream possibly forever.
Back to the question, we prefer to see library as a single .so or dll. without having to worry about its own dependency dlls. The best way, for example, is to make google cloud link crc32c.a into libstorage-client.so.
Again, thanks for the help, I might spend some time take a look how make this (link dependencies statically) happen and possible make a PR for it.


Update business finder request to use facet values from Publishing API

Facet values are currently hardcoded in the EU Exit business readiness request from and therefore have to be manually changed when the facet value is updated in the finder.
This populates a support form with values obtained from the Publishing API.
Dependent on https://github.com/alphagov/govuk-puppet/pull/9080
Test by checking if options for Is the content about selling goods in the UK, importing or doing business abroad? question are in the ground form (eg. sell, not selling)
Trello card

Updated questions according to Sharon's instructions


I want to know whether an attempted fix has worked

First question would be: what would be our data storage for attempted fixes?

Git commit messages (e.g. Fixes-Test-Case: dfb2edb8-f95e-4c85-b6a4-43bc5250c06c)
Some message in a PR
Storing some info on the test observability server saying that a test case was fixed in a particular commit

The Git commit message would be my preference. We might want to also be able to add a file at the root of the repo for defining extra fixes, in case we forget to add one in a commit message.

Also, what would we do once we realise that a "fix" on main really hasn't fixed the problem? Would there be a way to mark it as un-fixed?

Perhaps it would be simpler to just have a file of "fixed" test case IDs at the root of the repo.


[Tree] examples of using the Tree Behavior with forms

Basically, I want to have a parent dropdown in a form. If the parent changes, obviously I need to update the tree which I suppose could be done with a listener similar to the Timestampable listener.

Hi,
can't find any example of how to use tree behavior in forms.
Do I have to create a custom type ? Does someone can show me an example ?

@CharlyPoppins Hey, i put in pastbin an implementation to show ordered and indented tree in form for parent node: http://pastebin.com/P9ntWM3r
If this is what you search...

Thanks, it's helping.
Now that I have done this with a choice list, I'm trying to have a tree view like this :
http://www.codeproject.com/KB/tree/Generic_Tree_View/GenericTreeView.JPG

@CharlyPoppins to show a tree expanded view in a backoffice, i wrote this Twig extension: http://pastebin.com/5dqnjHws.
In parameter of this twig extension you can give the "getTreeOrdered" result from the previous pastebin.

Nice, works fine too,
then I'm still trying to use a treeview in a form (with radio or chexkboxes).
![Tree view in form]
(https://cloud.githubusercontent.com/assets/7072633/6886790/c9809aec-d649-11e4-8b0a-44dc77c89fe5.png)

You can make your tree view  outside of the form and writting JavaScript to
update the form values (wich will be hidden).
Le dim. 29 mars 2015 19:30, Charly Poppins<EMAIL_ADDRESS>a
écrit :

Nice, works fine too,
then I'm still trying to use a treeview in a form (with radio or
chexkboxes).
[image: Tree view in form]
https://cloud.githubusercontent.com/assets/7072633/6886790/c9809aec-d649-11e4-8b0a-44dc77c89fe5.png
—
Reply to this email directly or view it on GitHub
https://github.com/KnpLabs/DoctrineBehaviors/issues/38#issuecomment-87448851
.

Or use the generateTreeFlat and write JavaScript to modify the view.
Le dim. 29 mars 2015 19:58, Frédéric Oudry<EMAIL_ADDRESS>a
écrit :

You can make your tree view  outside of the form and writting JavaScript
to update the form values (wich will be hidden).
Le dim. 29 mars 2015 19:30, Charly Poppins<EMAIL_ADDRESS>a
écrit :

Nice, works fine too,
then I'm still trying to use a treeview in a form (with radio or
chexkboxes).
[image: Tree view in form]
https://cloud.githubusercontent.com/assets/7072633/6886790/c9809aec-d649-11e4-8b0a-44dc77c89fe5.png
—
Reply to this email directly or view it on GitHub
https://github.com/KnpLabs/DoctrineBehaviors/issues/38#issuecomment-87448851
.

Yes but it can be nice if I manage to add a TreeViewFormType that can be called in a FormBuilder.-,
with parametre a recordset $em->getRepository('CharlyBundle:Categorie')->getTreeOrdered()
and this have to return null, one or multiple choices/entities.

i agree it would be nice, but it would be in another repo, tokeep this one simple, single-purpose

Agree with you @docteurklein

I finally managed to build my tree view :)
Used a macro that I call in a view.
{% import "CharlyBaseBundle:Vendors:treeview.macros.html.twig" as treeview %}
{{ treeview.affiche(formCategories.categories) }}

{% macro affiche(form) %}
	{% import _self as myMacro %}
	{% set listeFormViews = form.children %}
	{% set listeChoiceViews = form.vars.choices %}
	{#{ dump(listeFormViews) }}
	{{ dump(listeChoiceViews) }#}

		{% if form.vars.empty_value != null %}

				{#% if form.vars.multiple %}
					<input type="checkbox" id="{{ form.vars.id }}_placeholder" name="{{ form.vars.full_name }}" {{ block('widget_attributes') }} value=""{% if checked %} checked="checked"{% endif %} />
				{% else %#}
					<input type="radio" id="{{ form.vars.id }}_placeholder" name="{{ form.vars.full_name }}" {{ block('widget_attributes') }} value=""{% if form.vars.data == null %} checked="checked"{% endif %} />
				{#% endif %#}

				{{ form.vars.empty_value|trans }}

		{% endif %}
		{% for choiceView in listeChoiceViews %}
			{% if choiceView.data.categorieParente == null %}
				{% for formView in listeFormViews %}
					{% if formView.vars.value == choiceView.data.id %}
						{{ myMacro.recursive(choiceView.data, listeChoiceViews, listeFormViews) }}
					{% endif %}
				{% endfor %}
			{% endif %}
		{% endfor %}

	{% do form.setRendered %}
{% endmacro %}

{% macro recursive(objet, listeChoiceViews, listeFormViews) %}
	{% import _self as myMacro %}
	{% set choiceView = listeChoiceViews[objet.id] %}
	{% set formView = listeFormViews[objet.id] %}
		{{ myMacro.affichage(choiceView, formView) }}
		{% if choiceView.data.childNodes|length > 0 %}

			{% for element in choiceView.data.childNodes %}
				{#{ dump(element) }#}
				{{ myMacro.recursive(element, listeChoiceViews, listeFormViews) }}
			{% endfor %}

		{% endif %}

{% endmacro %}

{% macro affichage(choiceView, formView) %}
	{% import _self as myMacro %}
	{% if formView != null %}
	{% set parentForm = formView.parent %}

		 0 %}
				tree-folder-name
			{% else %}
				tree-item-name
			{% endif %}
			{#% if formView.vars.checked %}
				 tree-selected
			{% endif %#}
			{% endspaceless %}">
			{% if parentForm.vars.multiple %}
				<input type="checkbox" id="{{ parentForm.vars.id }}_{{ choiceView.value }}" name="{{ parentForm.vars.full_name }}" {{ block('widget_attributes') }} value="{{ choiceView.value }}"{% if formView.vars.checked %} checked="checked"{% endif %} />
			{% else %}
				<input type="radio" id="{{ parentForm.vars.id }}_{{ choiceView.value }}" name="{{ parentForm.vars.full_name }}" {{ block('widget_attributes') }} value="{{ choiceView.value }}"{% if formView.vars.checked %} checked="checked"{% endif %} />
			{% endif %}
			{% if choiceView.data == null or choiceView.data.childNodes|length > 0 %}

			{% else %}

			{% endif %}
			{{ choiceView.label }}

	{% endif %}
{% endmacro %}

Maybe it's not the best way, but it works for now.

I'm going through the old issues/PRs and closing most of them so we can focus on now.
This one is missing any feedback or reasoning so I cannot deduce anything from it.
Thanks for you though, but closing for reasons above.
If the bug still remains, please send failing test case to verify it. Only with test we'll be albe to help.


New Trait for decoding attribute in images

The decoding property of the HTMLImageElement interface provides a hint to the browser as to how it should decode the image. More specifically, whether it should wait for the image to be decoded before presenting other content updates or not.
With this trait you can add the decoding attribute to load images in an easy way. It basically works the same way as the 'loading' attribute (see Grav Docs), with async, sync and auto  options. More info in Mozilla.org

Sorry for the oversight. Shortly, I will make the pull request from the admin plugin with the translations corresponding to the 'decoding' trait.

  I think its becaues you the code is ALWAYS adding 'encoding="auto"' to every single link, even if you don't provide an encoding option.

Thank you very much for your help. Now the 'decoding' attribute behaves the same as 'loading' and I hope there is no problem.

Looks good thanks!


Fix failing mesheryctl unit tests

Signed-off-by: Nishant Mittal<EMAIL_ADDRESS>Description
This PR fixes n/a. Fix failing mesheryctl unit tests along with some minor improvements int tests.
Notes for Reviewers
Signed commits

[X] Yes, I signed my commits.

Still need to fix one failing test.

@nishantwrp, my hero. 🦸

Codecov Report

Merging #5971 (65de30b) into master (2ab8585) will increase coverage by 12.17%.
The diff coverage is n/a.

@@             Coverage Diff             @@
##           master    #5971       +/-   ##
===========================================
+ Coverage    5.79%   17.97%   +12.17%
===========================================
  Files         107      110        +3
  Lines       10248    10394      +146
===========================================
+ Hits          594     1868     +1274
+ Misses       9497     8070     -1427
- Partials      157      456      +299

Flag
Coverage Δ

gointegrationtests
6.39% <ø> (+0.60%)
:arrow_up:

unittests
13.25% <ø> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files
Coverage Δ

cmd/main.go
0.00% <0.00%> (ø)

handlers/meshery_filter_handler.go
0.00% <0.00%> (ø)

handlers/meshery_pattern_handler.go
0.00% <0.00%> (ø)

handlers/meshery_application_handler.go
0.00% <0.00%> (ø)

mesheryctl/internal/cli/root/root.go
65.62% <0.00%> (ø)

mesheryctl/internal/cli/root/error.go
20.00% <0.00%> (ø)

mesheryctl/internal/cli/root/version.go
32.94% <0.00%> (ø)

mesheryctl/pkg/utils/healthcheck.go
13.23% <0.00%> (+2.94%)
:arrow_up:

mesheryctl/internal/cli/root/system/logs.go
40.21% <0.00%> (+3.26%)
:arrow_up:

models/pattern/stages/provision.go
3.77% <0.00%> (+3.77%)
:arrow_up:

... and 30 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.


The validation section could be more in depth

The validation section could be more in depth

E.g. the "unique" key, if you open a issue I could help adding more validations, implementing TDD in those new features

Originally posted by @rafaelbreno in https://github.com/confetti-framework/confetti/discussions/97#discussioncomment-347518

@rafaelbreno you can use this issue. Please commit with prefix #1

I'll be forking and creating a branch to test and separate everything, if you can, could you assign this to me? Will help maintain the track of the notifications.

Add regex validation

Add in_array validation.
Remembering, I'm solving this issue in this fork

@rafaelbreno Look good! You may want to create a pull request after this and continue in a new branch. Then I can already look at it and write documentation.

@reindert-vetter I'm going to PR what I've for now.


Footer text "Hactoberfest" color require fixing, not easily readable after "Hacto...."

Text color of Hactoberfest require fixing.
Please assign this to me under label hactoberfest-accepted.

submitted my PR #128 .
Please merge under label hacktoberfest-accepted


3 small errors in css

missing comma's
Proberly me who missed them in the first place.
line125:
.wi-rotate-225,.wi-rotate-SW.wi-towards-SW,.wi-from-NE {
should be added comma after "rotate-SW"
.wi-rotate-225,.wi-rotate-SW,.wi-towards-SW,.wi-from-NE {
same with line 130:
.wi-rotate-248,.wi-rotate-WSW.wi-towards-WSW,.wi-from-ENE {
should be added comma after "rotate-WSW"
.wi-rotate-248,.wi-rotate-WSW,.wi-towards-WSW,.wi-from-ENE {
and line 141
.wi-rotate-293,.wi-rotate-WNW.wi-towards-WNW,.wi-from-ESE {
should be added comma after "rotate-WNW"
.wi-rotate-293,.wi-rotate-WNW,.wi-towards-WNW,.wi-from-ESE {

Hi Thomas. I didn't notice them either.
I've updated a branch with the typos, if you find any other issues, please let me know, otherwise I'll update NPM in a few days time.
Thanks

https://github.com/Paul-Reed/weather-icons-lite/commit/c225546360fed377e252e47ce13c06df99315e2f now merged into master, and v1.6.1 published on NPM.


Add support for containerized PuppetBoard

The current Dockerfile in the project doesn't deliver PuppetBoard as a ready to use container.
Some changes to the code were also necessary in order to support specifying PuppetDB connection parameters to an immutable container image via ENV parameters set at runtime.

The most important PuppetDB connection info will be first looks up in current ENV and fallback to configuration file.
A new route was added to serve static resources directly via Gunicorn/Flask. This way it's not necessary to add a reverse proxy in front of the Puppet Board instance just to serve /static.

Have you verified that the app.py changes still work on a regular OS install?
Can you check the Travis CI errors?

Coverage decreased (-1.3%) to 21.718% when pulling babc8ecc69a41e1ffd443ffb76a286ad7eaa1c33 on tux-o-matic:docker into feac4441c9faae8d67c1621c6def5cc5a9b72db1 on voxpupuli:master.

Coverage decreased (-1.3%) to 21.718% when pulling babc8ecc69a41e1ffd443ffb76a286ad7eaa1c33 on tux-o-matic:docker into feac4441c9faae8d67c1621c6def5cc5a9b72db1 on voxpupuli:master.

@corey-hammerton no breaking change with this code for a regular installation using settings.py rather than ENV variables. Same goes for static, if the location is defined in Apache or Nginx (test), that's how the resources will be served.
CI is green after indention corrections.

A new release of PuppetBoard on PyPi will be required to use this container since it uses 'pip' internally.

With the new settings.py file in this PR it appears that it contains settings specific to your environment, most notably the PUPPETDB_HOST setting. Because of this I cannot accept this PR.
My suggestion is to update README.rst with instructions of how users can configure their containers that fit their environments.

Coverage decreased (-0.5%) to 22.559% when pulling<PHONE_NUMBER>df679af2687bd2153bb7152280ab41 on tux-o-matic:docker into feac4441c9faae8d67c1621c6def5cc5a9b72db1 on voxpupuli:master.

Coverage decreased (-0.5%) to 22.559% when pulling fb6272a64de4c50743467dd9c63b618129355a51 on tux-o-matic:docker into feac4441c9faae8d67c1621c6def5cc5a9b72db1 on voxpupuli:master.

@corey-hammerton  I removed the local settings file and added steps to use the new Dockerfile in the README.

What's the purpose of this change?  The Dockerfile now installs the latest released version of puppetboard, which will only be determined at build time,  when you already have a specific version checked out.
Also, all the performance numbers I've seen is uwsgi > gunicorn.
I use this existing docker container for my deployment. I set the settings.py env variable which points to a volume that has my settings and keys that are needed to establish a connection.

@mterzo this new container can do everything out of the box and can run anywhere once the image is built. The current one requires a build for every change in the settings and requires a reverse proxy to run in front of it.
As for performance, I kept this one pretty simple but for most usage I assume this gunicorn with sync worker will be enough. We could make Gunicorn use eventlet/gevent/gthread if you have scenarios with a lot of users, to which I would recommend adding a container with Nginx in front to add some caching.

@tux-o-matic I have multiple web services on one host the only option is a proxy.
I want to run puppetboard:0.2.0. When I build that container I better get 0.2.0. This will get whatever the latest in pypi.

@mterzo this new container doesn't stop you from using a reverse proxy in front of it. The choice is up to you but at least it can provide a working PuppetBoard without re-building for every host or serving static resources from a secondary service.
As for the version, VoxPupuli should publish a Docker image on the DockerHub along with every release.
So real world usage would be very simple from a usage point of view
docker run -e PUPPETBOARD_PUPPETDB_HOST=some.ip.or.name voxpupuli/puppetboard:0.2.1

@tux-o-matic gunicorn 19.6.0, doesn't serve files under /static.  I ended up having to run supervisor and nginx to host the static files.  I don't see how the static js / css files will get served.

@mterzo if your container implementation resorts to using supervisord then something is really wrong.
My PR with a Flask route for static did work without the need for Nginx/Apache. So again maybe we should leave one PR for the ENV variables and one for a new Docker support.

@tux-o-matic it was another project I was trying it on. I couldn't get gunicorn to serve files out of /static even though it had it in being routed correctly in flask.  I'm concerned that newer gunicorn disabled this and now your container will have the same problem since you get the latest at build.

As long as there is a Flask route serving content via send_from_directory(), it should work, regardless of the WSGI server in front.

That's what I thought. But looks like significant changes in the last few releases of gunicorn.

It's was flask and gunicorn hand off that I was having a problem with on another app. When using /static.  The static_folder needs to be set when it changes from the relative path static.  The app path /static is ignored running flask inside gunicorn.

Closing in favor of #310. Thanks @tux-o-matic you did heavy lift.


Styles main element as full white block

This PR styles the main element as a full white block, which I think is more consistent with the current Sunderland website, and generally looks cleaner. Feel free to not use this PR or change it though.
I'll wait until you merge or close this PR before merging yours.
Before

After

Thanks Sanjay
That looks a lot cleaner.


Molfile Unsaturation Query Not Parsed Correctly

I'm having trouble parsing the following molfile, which contains an unsaturation query.
unsaturated.sdf

MOESketch           2D

  5  5  0  0  1  0            999 V2000
   13.5413    2.8394    0.0000 N   0  0  0  0  0  0  0  0  0  3  0  0
   14.0120    1.4152    0.0000 N   0  0  0  0  0  0  0  0  0  0  0  0
   15.5120    1.4227    0.0000 N   0  0  0  0  0  0  0  0  0  0  0  0
   15.9683    2.8516    0.0000 N   0  0  0  0  0  0  0  0  0  2  0  0
   14.7504    3.7272    0.0000 C   0  0  0  0  0  0  0  0  0  1  0  0
  1  2  8  0  0  0  4
  2  3  8  0  0  0  0
  3  4  8  0  0  0  4
  4  5  8  0  0  0  9
  5  1  1  0  0  0  0
M  SUB  4   1   2   2   2   3   2   4   2
M  UNS  4   2   1   3   1   4   1   5   1
M  END

The following python script, which just reads this sdf file gives me an error.
from rdkit.Chem.rdmolfiles import MolFromMolFile

mol = MolFromMolFile("unsaturated.sdf")

[18:45:17] Value 3 is not supported as an unsaturation query (only 0 and 1 are allowed). line: 16
I think the issue is that in the ParseUnsaturationLine function in https://github.com/rdkit/rdkit/blob/3b3f6138302dba6e66d9c33c7dbc80fa5eb27b3a/Code/GraphMol/FileParsers/MolFileParser.cpp#L566-L616 there is a missing spos += 4 at the end of the try block. The code should be parsing the 8 numbers at the end of the unsaturation line in pairs (2 1), (3 1), (4 1), (5 1), but the code is instead parsing the pair (2 1), and then parsing (1 3) [this is the 1 from the (2 1) pair] because it does not move far enough to reach the pair (3 1).
Happy to write a PR for this if this is a bug and the fix I mentioned above is correct. Let me know if I have a misunderstanding of how this code is supposed to work.

@timothyngo I agree with your description of the problem and the proposed fix. A PR would be most welcome!
To be consistent with the other related functions, it looks like the new line would go after the expandQuery call on line 598.

Should there also be a spos += 4 before the continue on line 592? Otherwise, similar issues would occur with an unsaturation line like
M  UNS  4   2   0   3   0   4   0   5   0
(although admittedly, such a line would not do anything).

you're right. It would be better to catch that case. having it after the try/catch is a better idea
The other functions also probably ought to be updated

Okay, sounds like a plan. I can write a pr soon.

Okay, sounds like a plan. I can write a pr soon.

Awesome. Thanks!


Add method to get the latest available Ansys installation

📝 Description of the feature
It would be useful to have a method that returns the location of the latest installed Ansys. Since get_available_ansys_installations can return both normal and Student installs, I would propose the following logic:

Always use the latest available release
If there is both a student and regular install for the latest release, use the regular install.

Use case: for providing a useful default when configuring how a product is launched.
💡 Steps for implementing the feature
Example implementation:
def get_latest_ansys_installation():
    installations = get_available_ansys_installations()
    if not installations:
         raise ValueError("No Ansys installation found.")

    def sort_key(version_nr):
        if version_nr < 0:
            return abs(version_nr) - 0.5
        return version_nr

    latest_key = max(installations, key=sort_key)
    return installations[latest_key]

This seems a good idea. Assigning to @Gryfenfer97


[502E] Deps update

https://github.com/craftersoftware/craftercms/issues/502
Needs to be merged after https://github.com/craftercms/studio-ui/pull/3293 is merged

Closing PR, upgrade manager will take care of this update


csproj.md: Emphasise implicit version context

Emphasises that RuntimeFrameworkVersion and NetStandardImplicitPackageVersion only apply to .NET Core and .NET Standard projects respectively.
Context: https://github.com/NuGet/Home/issues/5809 - User expected NetStandardImplicitPackageVersion to work for a .NET Framework project.

@dasMulli,
Thanks for having already signed the Contribution License Agreement. Your agreement was validated by .NET Foundation. We will now review your pull request.
Thanks,
.NET Foundation Pull Request Bot

Changed wording based feedback form @guardrex on slack

@mairaw could you take a look? any more changes necessary or ready to go?

@dasMulli,
Thanks for having already signed the Contribution License Agreement. Your agreement was validated by .NET Foundation. We will now review your pull request.
Thanks,
.NET Foundation Pull Request Bot

@dasMulli,
Thanks for having already signed the Contribution License Agreement. Your agreement was validated by .NET Foundation. We will now review your pull request.
Thanks,
.NET Foundation Pull Request Bot


Add pounce highlights

Hello, when discovering this amazing plugin, I wanted to add Rose pine hl to it.
This is my take:

Original:

maybe a slightly transparent background color would be easier to read? or does it look okay to you – screenshot may make it a little harder than it actually is

This is my attempt, what do you think @mvllow @danymat

that does seem a little easier to read. because i don't use that plugin (therefore don't understand the desired look) whatever y'all can agree on i'll merge 😌

This is my attempt, what do you think @mvllow @danymat

Can you show us the PounceMatch and PounceGap?

This is my attempt, what do you think @mvllow @danymat

Can you show us the PounceMatch and PounceGap?

I just link them to hl-Search, which is define at here https://github.com/rose-pine/neovim/blob/9344ec79352eae505b9b65a9054457e013860f11/lua/rose-pine/theme.lua#L71

Nice, @ikws4, you can port your PR then, I'm closing mine


Tests fail in Release after migration to .netcoreapp2.2 and EF Core 2.2.

Hello, our tests are not working intermitently after updating our microservices to .netcoreapp2.2 and EF Core 2.2. The main reason is that it seems that the database is somehow deleted. Testing in VS is working fine, but when testing using dotnet test --no-build -c Release, some tests are failing with this errors, but also it happens intermittently. The tests that fail are the same everytime they fail. If I ran this test in isolation, the test works correctly.
Exception message: No such table ''.
Stack trace: See attached logs.
[Standard_Console_Output.log]

(https://github.com/aspnet/EntityFrameworkCore/files/2685214/Standard_Console_Output.log)
Steps to reproduce
This is the part of the code that gets executed and triggers the error. I will try to build a reporduction Project, but I am not convinced if it will be successful.
        /// <summary>
        ///     A DbContextOptionsBuilder extension method that uses a connection provider.
        /// </summary>
        /// <param name="optionsBuilder"> The optionsBuilder to act on. </param>
        /// <param name="connectionProvider"> The connection provider. </param>
        /// <returns> The optionsBuilder to chain calls on. </returns>
        public static DbContextOptionsBuilder UseConnectionProvider(this DbContextOptionsBuilder optionsBuilder, IConnectionProvider connectionProvider)
        {
            switch (connectionProvider)
            {
                case SQLServerConnectionProvider sqlServerConnectionProvider:
                    optionsBuilder.UseSqlServer(sqlServerConnectionProvider.ConnectionString);

                    return optionsBuilder;
                case SQLiteConnectionProvider sqliteConnectionProvider:
                    optionsBuilder.UseSqlite(sqliteConnectionProvider.ConnectionString);

                    return optionsBuilder;
                case InMemorySQLiteConnectionProvider inMemorySqliteConnectionProvider:

                    // If the connection is managed by the Entity Framework Core, when SaveChanges
                    // is invoked, Entity Framework Core closes the connection and with an 'In memory
                    // database' type the database is released too. To avoid this behaviour, the connection
                    // must be given to Entity Framework Core.
                    SqliteConnection connection = new SqliteConnection(inMemorySqliteConnectionProvider.ConnectionString);
                    connection.Open();

                    optionsBuilder.UseSqlite(connection);

                    return optionsBuilder;
                case null:
                default:
                    return optionsBuilder;
            }
        }

namespace Core.Persistence.EFCore.Providers
{
    using System.Globalization;
    using Core.Persistence.Contracts;
    using Microsoft.Extensions.Options;

    /// <summary>
    ///     The connection provider to obtain the proper connection data for SQLite in memory.
    /// </summary>
    public class InMemorySQLiteConnectionProvider : IConnectionProvider
    {
        private readonly string databaseName;

        /// <summary>
        ///     Initializes a new instance of the <see cref="InMemorySQLiteConnectionProvider"/> class.
        /// </summary>
        /// <param name="persistenceOptions"> Options for configuring the Persistence. </param>
        public InMemorySQLiteConnectionProvider(IOptions<PersistenceOptions> persistenceOptions)
        {
            // TODO: (Error Management) Decide what to do when the databaseName is null.
            this.databaseName = persistenceOptions.Value.DatabaseName;
        }

        /// <summary> Gets the connection string. </summary>
        /// <returns> The connection string. </returns>
        public string ConnectionString
        {
            get
            {
                return string.Format(CultureInfo.InvariantCulture, "Data Source={0};Mode=Memory;Cache=Shared", this.databaseName);
            }
        }
    }
}

        [TestMethod]
        public async Task GetPage_ExistingEntitiesGetCalculatedDTOFilteredPage_ReturnsPageNumberOne()
        {
            // Arrange.
            Guid testDatabaseIdentifier = Guid.NewGuid();

            IServiceProvider arrangeServiceProvider = ApplicationTestsDependencyInjectionProvider.GetScopedServiceProvider(testDatabaseIdentifier);

            using (HealthAndWelfareContext context = arrangeServiceProvider.GetService<HealthAndWelfareContext>())
            {
                context.Database.EnsureCreated();
                InsertBackgroundTestData(context);

                context.SaveChanges();
            }

            // Act.
            IApplicationRPQPrototypeHealthAndWelfareDataManager applicationManager = ApplicationTestsDependencyInjectionProvider.GetScopedServiceProvider(testDatabaseIdentifier).GetService<IApplicationRPQPrototypeHealthAndWelfareDataManager>();

            GetPageDTO getPageDTO = new GetPageDTO(userIdTwo, queryDTO);

            int page = await applicationManager.GetPageAsync(getPageDTO);

            // Assert.
            page.Should().Be(1);
        }

Further technical details
EF Core version: 2.2
Database Provider: built-in SQLite
Operating system: Windows Server 2016
IDE: Visual Studio 15.7 (.NET Core SDK 2.2)

@alexdrl There's nothing here that seems obviously wrong. I think we are going to need a complete repro.

@alexdrl First, please don't send DLLs. A clean solution which I can restore packages for and build is what is needed. Ideally, if it can be posted here, that's best. If it's confidential, then you can email me at microsoft.com. I am "avickers" there.

@ajcvickers I sent you an email about this because the underlying Project is confidential.

@alexdrl I think this is happening because if the dangling SqliteConnection happens to be garbage collected and finalized before the test has finished running, then it will cause the in-memory SQLite database to be deleted. I was able to consistently repro the issue until I changed the code to hold on to SqliteConnections such that they are not garbage collected.

So... Should we need to change the code? Or should we expect a change from EF Core?

@alexdrl It's a race condition bug in your code.

@ajcvickers I think I'm not getting why the SQLite connection is garbage collected because it is passed to the EF constructor. And also you mention that it is a race condition? Do the tests execute in parallel? I thought that this was not enabled by default.
I am sorry but I am a bit lost about this... Should we create the SQLite connections in the tests? Why this will make the garbage collector to not collect it?

@alexdrl What I saw was this:

Test creates a SqliteConnection and passes it to a DbContext, but otherwise does not hold on to any reference.
That DbContext is used to do some setup, but then is let go so it, and the connection that it references, are now available for garbage collection.

If garbage collection/finalization kicks in here, then the connection is closed, causing SQLite to delete the in-memory database.

The test creates one or more new context instances, each of which use a new SqliteConnection to the same database.
If the previous connection was not yet finalized, then everything is fine. If it was, then the database has been deleted and the test fails.


Deep Record.setIn()

The docs state that Records are implemented with Maps, and Map.setIn says:

Returns a new Map having set value at this keyPath. If any keys in keyPath do not exist, a new immutable Map will be created at that key.

But:
> R = Immutable.Record(({ foo: null }));
> r = new R();
> r.setIn([ 'foo' ], 123);
Object {_map: Object, __ownerID: undefined}
> r.setIn([ 'foo', 'bar' ], 123);
Uncaught Error: invalid keyPath

Am I missing something, or is this a bug?

As far as I understand it, Records are only meant to be used if you want to enforce a certain schema for your data while providing defaults when removing a key.
In your example the second setIn operation rightfully throws an error  because immutable recognizes that foo is set to a value (even though it is set to its default - null) and tries to forward the set call resulting in your error.
Either just use Immutable.Map()
> Immutable.Map().setIn(['foo','bar'], 'baz').toJS()
{"foo":{"bar":"baz"}}

or enforce a suitable schema with Record
> r = Immutable.Record({foo: Immutable.Record({bar: 'baz'})()})()
> r.toJS()
{"foo":{"bar":"baz"}}
> r.setIn(['foo','baz'], 'bar') // fails becaus the inner record only allows the "bar' key
Uncaught Error: Cannot set unknown key "baz" on Record
> r2 = r.setIn(['foo','bar'], 'qux')
> r2.toJS()
{"foo":{"bar":"qux"}}
> r2.remove('foo').toJS()
{"foo":{"bar":"baz"}}
> r2.removeIn(['foo','bar']).toJS()
{"foo":{"bar":"baz"}}

This is an interesting interpretation, but I'm not sure if "Records are only meant to be used if you want to enforce a certain schema" is entirely accurate... since it's actually not possible to enforce any kind of content policy on Immutable objects (at least before e.g. #473).
As to "immutable recognizes that foo is set to a value [...] and tries to forward the set call", what actually makes this different from a Map?

You are right, that Records do not enforce any types or immutability on the keys, however they do limit ability to remove keys set in the Record and the ability to set keys which are not defined in the Record.
You are correct, that your initial example would also throw for a Map
> Immutable.Map({foo:null}).setIn(['foo', 'bar'], 'baz')
Uncaught Error: invalid keyPath

This is due to the same reason - the key foo is set to a type (in this case null) which does not support the setIn / set function.
With a Map it would however be possible to
> Immutable.Map({foo:null}).remove('foo').setIn(['foo','bar'], 'baz').toJS()
{"foo":{"bar":"baz"}}
> Immutable.Record({foo: null})().remove('foo').setIn(['foo','bar'], 'baz')
Uncaught Error: invalid keyPath
> Immutable.Record({foo: null})().remove('foo').toJS() // on removal the default is being set
{"foo":null}

OK, that makes sense. So it's actually more about how Maps work with setIn(), than Records being somehow exceptional.
Thanks for a thorough explanation!

This is very unintuitive based on the behavior of setIn with other objects, and incredibly hard to debug due to #635
The way this series of calls work also makes this unintuitive:
var r = Immutable.Record({foo: undefined});
var r1 = new r()
var r2 = r1.set('foo', undefined);
r1 === r2 // false

var m1 = Immutable.Map();
var m2 = m1.set('foo', undefined);
m1 === m2 // false

The above makes me incorrectly assume that the default of a record is somehow similar to the "not set" state of map. In any case it would be nice to support a form of record that allows safe usage of setIn and deleteIn.


Coerce boolean strings in attributes to actual boolean values

This fixes a bug in the previous feature I added which misinterprets boolean attributes in the user attributes such that "superuser": "False" is interpreted as "superuser": True when the model is saved because the string "False" is truthy.

Hi, can you upload the new version to PyPi?
The last upload was done before those fixes have been made.

Thank you.


Mulitple Gitea Doctor improvements (#10943) (#10990) (#10064) (#9095)

Backport #10943 #10990 #10064 #9095

Add gitea doctor (#9095)
Add basic app.ini and path checks (#10064)
Add gitea doctor --list flag to list the checks that will be run, including those by default
Add gitea doctor --run to run specific checks
Add gitea doctor --all to run all checks
Add db version checker
Add non-default recalculate merge bases check/fixer to doctor
Add hook checker (Fix #9878) and ensure hooks are executable (Fix #6319)
Fix authorized_keys checker - slight change of functionality here because parsing the command is fragile and we should just check if the authorized_keys file is essentially the same as what gitea would produce. (This is still not perfect as order matters - we should probably just md5sum the two files.)
Add SCRIPT_TYPE check (Fix #10977)
Add gitea doctor --fix to attempt to fix what is possible to easily fix
Add gitea doctor --log-file to set the log-file, be it a file, stdout or to switch off completely. (Fixes previously undetected bug with certain xorm logging configurations - see @6543 comment.)

Signed-off-by: Andrew Thornton<EMAIL_ADDRESS>Co-authored-by: guillep2k<EMAIL_ADDRESS>Co-authored-by: John Olheiser<EMAIL_ADDRESS>Co-authored-by: Lunny Xiao<EMAIL_ADDRESS>

Undefined io.StringWriter

is kind/build the right label for this?


optional word at start of sentence breaks intent recognition

According to the docs at https://rhasspy.readthedocs.io/en/latest/training/#optional-words it should be possible to have an optional word at the start of the sentence. I created a template with the example provided in the docs.
[GetExample]
[an] example sentence [with] some optional words

But it complete breaks the recognition, as no variation is being recognized anymore.

[GetExample]
test [an] example sentence [with] some optional words

I understand the logic behind it. Starting a sentence with an optional word makes it more difficult for the parser to understand what's an intent and what is a sentence.
However If the example sentence definition in the documentation starts with an optional word, I would've expected that to work.

It has to be escaped. In your link you can find following:
Special Cases
If one of your sentences happens to start with an optional word (e.g., [the]), this can lead to a problem:

[SomeIntent]
[the] problem sentence
Python's [configparser](https://docs.python.org/3/library/configparser.html) will interpret [the] as a new section header, which will produce a new intent, grammar, etc. Rhasspy handles this special case by using a backslash escape sequence (\[):

[SomeIntent]
\[the] problem sentence
Now [the] will be properly interpreted as a sentence under [SomeIntent]. You only need to escape a [ if it's the very first character in your sentence.


pageserver: add counter for wait time on background loop semaphore

Problem
Compaction jobs and other background loops are concurrency-limited through a global semaphore.
The current counters allow quantifying how many tasks are waiting.
But there is no way to tell how much delay is added by the semaphore.
So, add a counter that aggregates the wall clock time seconds spent acquiring the semaphore.
The metrics can be used as follows:

retroactively calculate average acquisition time in a given time range
compare the degree of background loop backlog among pageservers

The metric is insufficient to calculate

run-up of ongoing acquisitions that haven't finished acquiring yet

Not easily feasible because "Cancelling a call to acquire makes you lose your place in the queue"

Summary of changes

Refactor the metrics to follow the current best practice for typed metrics in metrics.rs.
Add the new counter.

Rust Test failures due to  https://github.com/neondatabase/neon/pull/8771

Re-ran failed.


OHMR Needs More Work

Please improve the OHMR version.
Currently I get the bug:
2022/08/29 (15:04:12) | ===> btop++ v.1.0.0
2022/08/29 (15:04:12) | ERROR: Something went wrong with Open Hardware Monitor Report. Disabling CPU clock/temp monitoring and GPU monitoring.

@hl2guide
The Open Hardware Monitor implementation is soon gonna be rewritten using LibreHardwareMonitor  as base instead.
Meanwhile you can open OpenHardwareMonitor.exe in the OHMR folder and post a screenshot of the available sensors there.

OHMR is no more...
LHM lives!


New configuration parameters

This PR adds a new configuration input parameter with some parameters that
let the user exclude some fields or models or filter the features that are added
to the original dataset from the unsupervised models.
In the near future, some new configuration parameters may be added for other
unsupervised models.

mostly style nits. Still untested.


Support any frame format

These changes allow to support all frame formats exposed by libuvc. We need those to make the demo application work with a camera that doesn't support the MJPEG and YUYV frame formats.
First, we can use the libuvc uvc_any2rgb() function to convert frames into RGB for preview. This function relies on the format data contained in the frames and this allows to simplify the render code while getting support for all formats.
Then, we can set UVC_FRAME_FORMAT_ANY when configuring the preview, so libuvc choses a supported frame format from the camera.
With these changes, I had my camera work in the demo application. Also I tested that a camera that already worked still works.
Now, the application Kotlin code itself could be simplified by also removing the format handling logic (which is no-op with these changes). I started to do it locally, but maybe it is better to do this in a separate step, when/if these changes are merged here.

Thanks @guillaume-roche i'll check this PR.


Support passing arbitrary inputs to Reports and ScheduledReports via spec.inputs

This is an initial prototype for how we can make ReportGenerationQueries
more reusable and composable. It should be backwards compatible with
existing Reports and ScheduledReports, but existing
ReportGenerationQueries not in the repo would need to be updated to use
the correct template variables.

All recent e2e test failures are due to recent CI changes, not the tests. THe tests are actually passing so I'm merging this to get some other stuff unblocked.


Support stub files (PEP 484)

Add the ability to read type information from a stub file, per PEP 484. This goes somewhat in hand with issue #36 and there is likely some overlap (namely with parsing).
Rationale/use cases (from PEP 484)

Extension modules
Third-party modules whose authors have not yet added type hints
Standard library modules for which type hints have not yet been written
Modules that must be compatible with Python 2 and 3
Modules that use annotations for other purposes

After some initial poking around, the scope of this may be beyond what can sanely be accomplished with flake8 in its current state.
The primary barrier here is that flake8 operates on a per-file basis and there's no way (at least that I can determine) to persist information between files. This torpedoes my initial thought of matching *.py files with their corresponding *.pyi in order to identify which definitions in the *.py file are missing annotations in the stub. While we can likely adequately lint the stub with minor changes (this is kinda what our testing suite does), I'm not sure if that provides meaningful insight into the stub's coverage of the corresponding *.py file.
flakei-pyi appears to inject stub support into flake8, but does so by overloading Pyflakes & its integration with flake8. This may be a sufficient answer to the general question of stub support outside of going to mypy. Though it looks like it may just be linting the stub itself, I haven't had the chance to try out this plugin to see how well flake8-annotations plays. Browsing the source it appears to involve a not insignificant amount of work that I'm not sure we'd be comfortable maintaining, and given the issue raised in the first paragraph may not be helpful at all.

That makes sense. Expanding this extension beyond on regular source code (.py files) will likely result in maintenance headaches in the future, especially when there's a major Python release (like 3.8 coming up soon). The existing flake8-pyi extension is probably the more logical place for this feature. Going to go ahead and close this unless you think otherwise.


misc + start furo

IMPORTANT: Please search among the Pull requests before creating one.
Description
Change docs theme with Furo, update release note.
How has this been tested?

Closes

@giovp, did you see @adamgayoso wants to switch the cookiecutter from furo to sphinx_book_theme?

scverse/cookiecutter-scverse#100

I think both are good, but the book theme requires is more deployable with zero changes. I'd be content if you picked whatever makes you happy :)
Both furo and book theme look better than the RTD theme IMO

need to play around with css, will address with separate PR, thanks all for suggestions


Adding dae2collision as a dep?

https://github.com/JustAPotota/dae2collision
What do you think about adding this to the project?
So along with that would want some editor scripts and some guides for building / adding new assets properly.
Do you already have an asset generation workflow?

Do you already have an asset generation workflow?

Personally, I use SideFX Houdini for asset generation and the corresponding convex shapes generation. However, HDA for Defold will be released later - it's not ready yet.

So along with that would want some editor scripts

Editor scripts is a great idea - we should add another issue to discuss it. Something like:

Align selected objects
Rename selected objects
etc...

What do you think about adding this to the project?

I'll add the link to that project as one of the ways of content producing.


Recognition of xOsmunasium nothgen. nov.

Name of taxon
xOsmunasium
Rank of taxon
Nothogenus
Approximate number of species affected
1
Description of change
This proposal recognizes the nothogenus x Osmunasium for hybrids between the genera Osmunda and Plenasium (Osmundaceae). It contains one species: x Osmunasium x mildei, a hybrid between Osmunda japonica and Plenasium vachellii.
Reason for change
Nothotaxa are planned to be recognized in PPG II. If Claytosmunda and Plenasium are separated from Osmunda s.s. as genera, as in PPG I, this species becomes an intergeneric hybrid.
Spore viability of the hybrid is low, and it is of very uncommon occurrence in Asia. (Tsutsumi et al. 2012)
The first valid name for this nothogenus is x Osmunasium Hong M.Liu, Schuettp. & H.Schneid. (Liu et al. 2020)
Alternatively, PPG II could revert to recognizing a broadly circumscribed but monophyletic Osmunda which would render this nothogenus superfluous. However, Claytosmunda and Plenasium are believed to have diverged from Osmunda s.s. in the Jurassic and Cretaceous, respectively, and they can be identified and distinguished in the fossil record. (Bomfleur et al. 2017).
Bomfleur B, Grimm GW, McLoughlin S. 2017. The fossil Osmundales (royal ferns)—a phylogenetic network analyses, revised taxonomy, and evolutionary classification of anatomically preserved trunks and rhizomes. PeerJ 5: 3433. https://doi.org/10.7717/peerj.3433
Hong-Mei Liu, Eric Schuettpelz, Harald Schneider. 2020. Evaluating the status of fern and lycophyte nothotaxa in the context of the Pteridophyte Phylogeny Group classification (PPG I). Journal of Systematics and Evolution 58(6): 988-1002. https://doi.org/10.1111/jse.12641
C. Tsutsumi, Y. Hirayama, M. Kato, Y. Yatabe-Kakugawa, S-Z. Zhang. 2012.
Molecular Evidence on the Origin of Osmunda ×mildei (Osmundaceae). American Fern Journal 102(1):55-68.https://doi.org/10.1640/0002-8444-102.1.55
Reference(s) for publication of the name
Hong-Mei Liu, Eric Schuettpelz, Harald Schneider. 2020. Evaluating the status of fern and lycophyte nothotaxa in the context of the Pteridophyte Phylogeny Group classification (PPG I). Journal of Systematics and Evolution 58(6): 988-1002. https://doi.org/10.1111/jse.12641
List the numbers of any related issues
#9
Code of Conduct

[X] I agree to follow the PPG Code of Conduct

Looks convincing to me. Although I personally think sometimes there is an over-exageration on the number of recognized genera, in this specific case the genera represent old lineages that diverged apart hundreds of millions of years ago. I am in favor of this proposal.

FYI, please see the related discussion about circumscription of Osmunda: https://github.com/pteridogroup/ppg/discussions/24

This proposal was voted on during PPG Ballot 1 (voting period July 2023). A total of 46 votes were cast. There were 42 'Yes' votes (91.3%) and 4 'No' votes (8.7%). The proposal passes.

Already implemented in data, closing.


Exclude _app.js from babelTransformContext

Hey, awesome concept on this library! I don't know if I should raise an issue first (made a fix that works), but basically, my issue is the following:
If I enable the experimental context stuff, my _app.tsx (the only non-vanilla thing it's doing is adding in some CSS and an error boundary), my entire app breaks with a call stack exceeded error on _app.tsx. No more error context at all. After hours of debugging I could not understand what was going on so I just went disabling things one by one. Disabling the experimental context flag fixed it.
Looking through the code I figured that if I excluded the _app.tsx from babelTransformContext the library would still work (context and all, I'm using cookie auth and it works great). However, I don't know the underlying implications of this exactly. From what I understand and tested, disabling here just makes req, res undefined on requests made from _app.tsx. For my use case, not having that is not a deal-breaker. Until contexts are reworked, we could just disable _app.tsx handling.
Let me know if I can help any other way.

_app.js could have a getInitialProps method that will need to be wrapped with context (as does _document.js, come to think of it). Will try to take a look over the weekend

Thanks. I investigated further and it only happens if you write the _app.js like this
function App({...}) {
  return ...
}

export default App;

Works fine, even without this fix if you just export it straight away:
export default function App({...}) {
  return ...
}

@jfranciscosousa This should have been fixed in 3.1.2

Awesome, thanks!


Clicking on TypeText doesn't paste in PowerShell

Lab Name: Analyze Data Lake with SQL
Task: Synapse set up - load data into Azure Synapse Analytics
Step: 4+5
Issue Type: non-blocking
Description of issue: Clicking on TypeText with the cursor in PowerShell seems to have the same effect as trying to do Ctrl+V.
Repro steps (please include screenshot if applicable):

Put cursor in PowerShell, and click "T" next to TypeText.
The result is "^V" instead of the actual text. I suggest just removing the TypeText around the commands (ie. remove +++_+++) and asking the student to copy and right click, paste.

Thanks Sherry!


#114 - Scheduled Tasking frontend support

Closes #114
Introduced Changes

Added scheduled task list, create, and update pages
Dynamically load function parameters with htmx
Dynamically validate crontab fields with htmx
Added separate htmx urls
Display message to user if they have no scheduled tasks they can make in their current environment
Display form errors when creating or updating a ScheduledTask

Testing

Launch Functionary and view the Scheduling UI
Create tasks and verify they run according to the crontab schedule
Update tasks to verify their next run reflects those updates
Try and submit invalid data to the forms and verify you receive an error

Notes

There are some helper functions in core.utils.scheduling that I think can be migrated over to the ScheduledTask model
With my current implementation, I do not persist parameter arguments when a form gets rejected. The parameter values will reset to their defaults according to their widget type

Some additional Scheduled Task view features that could be added:

Hide or un-hide the Archived scheduled tasks
Sorting by scheduled task statuses (Active -> Error -> Paused -> Archived)
Ability to immediately run a Scheduled Task


Help building SDL_ttf using CMake?

I've run external/download.sh to get the dependencies, and then:
cmake -DCMAKE_BUILD_TYPE=Release .. -DSDL3_DIR=../external/SDL
fails with:
-- Configuring SDL3_ttf 3.0.0
CMake Error at CMakeLists.txt:87 (find_package):
  By not providing "FindSDL3.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "SDL3", but
  CMake did not find one.

  Could not find a package configuration file provided by "SDL3" (requested
  version 3.0.0) with any of the following names:

    SDL3Config.cmake
    sdl3-config.cmake

  Add the installation prefix of "SDL3" to CMAKE_PREFIX_PATH or set
  "SDL3_DIR" to a directory containing one of the above files.  If "SDL3"
  provides a separate development package or SDK, be sure it has been
  installed.

-- Configuring incomplete, errors occurred!
See also "C:/projects/SDL_ttf/build/CMakeFiles/CMakeOutput.log".

I'm sure I'm doing something silly, but there are no instructions on how to build this beast. :)

The satellite libraries expect an already configured SDL3 or already-built SDL3.
What I do:

SDL3 is checked out in ~/projects/SDL, builds in ~/projects/SDL/cmake-build-Debug and installs in ~/projects/SDL/cmake-build-Debug/prefix
SDL3_image is checked out in ~/projects/SDL_image, builds in ~/projects/SDL_image/cmake-build-Debug and installs in ~/projects/SDL_image/cmake-build-Debug/prefix

By configuring SDL3_image with -DSDL3_ROOT=$HOME/projects/SDL/cmake-build-debug (or -DSDL3_ROOT=$HOME/projects/SDL/cmake-build-debug/prefix), the cmake project will pick up the already built SDL3.
So there's no need for rebuilding SDL3 for every satellite library.
Btw:

SDL3_ROOT is for configuring the root folder of an SDL3 prefix
SDL3_DIR is for configuring the location of SDL3Config.cmake (on nix, this is $prefix/lib/pkgconfig/SDL3).

By "already configured SDL3`, I mean users of SDL that do:
add_subdirecty(externals/SDL)
add_subdirecty(externals/SDL_image)

How do you set the install location to ~/projects/SDL/cmake-build-Debug/prefix?

You can install to whatever location you desire with cmake --install ~/projects/SDL/cmake-build-debug --prefix /tmp/SDL-prefix.
The installation path can be configured with CMAKE_INSTALL_PREFIX.
When the path is not absolute, it installs relative to the build directory.
So in my example above, I configure with cmake -S ~/projects/SDL -B ~/projects/SDL/cmake-build-debug -DCMAKE_INSTALL_PREFIX=prefix.

Also worth mentioning is the following would work as well:
cmake -S ~/projects/SDL -B ~/projects/SDL/cmake-build-debug -DCMAKE_INSTALL_PREFIX=/tmp/SDL-prefix
cmake --build ~/projects/SDL/cmake-build-debug
cmake --install ~/projects/SDL/cmake-build-debug
for satellite in SDL_image SDL_ttf SDL_mixer; do
    cmake -S ~/projects/$satellite -B ~/projects/$satellite/cmake-build-debug -DCMAKE_INSTALL_PREFIX=/tmp/SDL-prefix
    cmake --build ~/projects/$satellite/cmake-build-debug
    cmake --install ~/projects/$satellite/cmake-build-debug

CMake also looks for dependencies in the installation prefix.
The commands above are very close to ../configure && make && make install.