¿Qué está tratando de hacer este proyecto por mí?
Haz que sea simple hacer solicitudes HTTPS de C ++ (o C).
¿Por qué utilizar este proyecto para obtener una biblioteca de clientes C ++ HTTPS?
C ++ le falta el soporte de red de red de la caja. Si está leyendo esto, sospechamos que está en la misma posición que estábamos: necesitábamos llenar ese agujero para nosotros mismos y no estábamos satisfechos con las otras opciones que vimos. Escribimos este código porque todas las otras reglas de bazel que hemos visto tienen problemas serios envolviendo el curl, ya sea la configuración errónea en el archivo de TensorFlow que causa errores de memoria o envolturas de CMake que no manejan correctamente la configuración de bazel o la compilación cruzada. El objetivo aquí es crear un componente fácilmente reutilizable que lo haga bien para todos.
Tiempo de configuración básica: 2m
¿Hola, usuario de Bazel? Hagamos que haga una solicitud HTTPS en poco tiempo.
Hay un montón de texto aquí, pero solo porque estamos tratando de deletrear cosas y facilitarlas. Si tiene problemas, háganoslo saber; Nos encantaría su ayuda para hacer que las cosas sean aún mejor y más completas, ¡y nos encantaría ayudarlo!
Copie esto en su archivo Bazel WORKSPACE para agregar este repositorio como una dependencia externa, asegurándose de actualizar la última confirmación según las instrucciones a continuación.
load ( "@bazel_tools//tools/build_defs/repo:http.bzl" , "http_archive" )
# Hedron's Bazel Rules for C++ HTTPS Requests
# Makes @cpr, @curl, and @boringssl available for use
# https://github.com/hedronvision/bazel-make-cc-https-easy
# This also brings in @hedron_std_filesystem_backport to enable CPR across-platforms.
# Lets you use the std::filesystem API on Apple platforms, where it wouldn't otherwise be available. # (Deployment targets before macOS 10.15, iOS/tvOS 13.0, and watchOS 6.0)
# Just use fs:: as a drop-in replacement for std::filesystem.
# For more, see: https://github.com/hedronvision/bazel-cc-filesystem-backport
http_archive (
name = "hedron_make_cc_https_easy" ,
# Replace the commit hash in both places (below) with the latest, rather than using the stale one here.
# Even better, set up Renovate and let it do the work for you (see "Suggestion: Updates" in the README).
url = "https://github.com/hedronvision/bazel-make-cc-https-easy/archive/315416306204ce6bb2983b4a923815a7e89eb727.tar.gz" ,
strip_prefix = "bazel-make-cc-https-easy-315416306204ce6bb2983b4a923815a7e89eb727" ,
# When you first run this tool, it'll recommend a sha256 hash to put here with a message like: "DEBUG: Rule 'hedron_make_cc_https_easy' indicated that a canonical reproducible form can be obtained by modifying arguments sha256 = ..."
)
load ( "@hedron_make_cc_https_easy//:workspace_setup.bzl" , "hedron_make_cc_https_easy" )
hedron_make_cc_https_easy ()
load ( "@hedron_make_cc_https_easy//:transitive_workspace_setup.bzl" , "hedron_keep_cc_https_easy" )
hedron_keep_cc_https_easy ()Al igual que con todos los C/C ++ dependientes de la plataforma en Bazel, necesitará usar Bazel 7+ (y una versión igualmente reciente de Rules_apple) para que la configuración por plataforma funcione automáticamente fuera de la caja. (Presente un PR para eliminar esta sección si Bazel 7 ahora es tan antiguo como para ser estándar).
Deberá asegurarse de tener los encabezados de desarrollo libcurl instalados para que pueda usarlos desde su código.
Ejecute sudo apt-get install libcurl4-openssl-dev (Debian/ubuntu) o el equivalente para su distribución. Para obtener instrucciones de instalación para otras distribuciones, consulte las entradas de Libcurl aquí: https://everything.curl.dev/get/linux. Si distribuye un paquete binario basado en su código, debe declarar una dependencia de LibCurl4 o decirle a sus usuarios que sudo apt-get libcurl4 . Y, como siempre, si aprende cosas que ayudarían a los usuarios futuros, por favor presenten un PR o un problema.
Como fondo, adoptamos el enfoque de la vinculación dinámica contra las bibliotecas que el sistema operativo puede proporcionar de manera confiable, y la agrupación (construcción + vinculación estáticamente) de lo contrario. Linux es un caso especial porque hay un gran sistema de gestión de dependencia integrado, por lo que puede proporcionar más bibliotecas que las que se envían con el sistema operativo.
Aparte: nos sorprende que hay una oportunidad aquí para una extensión de bazel que permitiría a Bazel mejor admitir los administradores de paquetes de Linux. Consulte esta propuesta si está interesado en eso o en ayudar a piratearla. Continuemos la discusión sobre ese tema, ya sea que Google esté interesado o no en implementarlo ellos mismos.
¡Agregue "@cpr" a su deps y use la maravillosa interfaz LIBCPR!
Consulte sus documentos para más detalles, pero la interfaz es realmente deliciosamente ergonómica. Como ejemplo:
# include < cpr/cpr.h >
cpr::Response r = cpr::Get(cpr::Url{ " https://github.com " },
cpr::Parameters{{ " key " , " value " }});Para obtener más información sobre por qué elegimos y recomendamos RCP, consulte WhyCPR.MD
Tenga en cuenta que deberá habilitar C ++ 17 o más, si aún no lo ha hecho. Satisfacemos esto poniendo lo siguiente en nuestro .bazelrc:
build --cxxopt=-std=gnu++20
build --per_file_copt=.*.mm$@-std=gnu++20
Agregue "@curl" a sus deps y use libcurl en todo su gloria habitual (ejemplo, documentos).
... o simplemente implementa su interfaz C en C ++ (usando extern "C" ) y use libcpr.
Pero tenemos una sugerencia ...
Las mejoras son frecuentemente a las bibliotecas subyacentes, incluidos los parches de seguridad, por lo que recomendamos mantenerse al día.
Recomendamos encarecidamente que configure renovado (o similar) en algún momento para mantener esta dependencia (y otras) actualizada por defecto. [No estamos afiliados a renovado ni nada, pero creemos que es increíble. Observa nuevas versiones y le envía PRS para su revisión o pruebas automatizadas. Es gratis y fácil de configurar. Ha sido asombrosamente útil en nuestra base de código, y hemos trabajado con el maravilloso mantenedor para hacer que las cosas sean excelentes para el uso de bazel. Y se usa en repositorios oficiales de bazel, ¡y este!]
Si no ahora, tal vez vuelva a este paso más tarde, o vea este repositorio para actualizaciones. [O oye, tal vez danos una estrella rápida, mientras estás pensando en mirar.] Como Abseil, vivimos en la cabeza; El último compromiso con la rama principal es el compromiso que desea. Así que no confíes en las notificaciones de liberación; Use renovado o encueste manualmente para nuevos compromisos.
Manera de pasar a través de la configuración. ¡Saludos a poder usar fácilmente el poder de la web de C ++!
Esto debería funcionar sin problemas para MacOS, Linux, Android, iOS, Watchos y TVOS.
Si lo desea para Windows, nos encantaría su ayuda. Debería ser un poco más fácil agregar soporte que hacerlo desde cero. Ayudaremos a la guía. Y su código funcionará en todas las plataformas de forma gratuita. Además, estarás ayudando a todos. Comuníquese con el tema cuando se inicie, solo para asegurarse de que las personas no dupliquen los esfuerzos.
Si está usando Bazel para C o C ++, es probable que también quiera algunas de nuestras otras herramientas, como ...