Qu'est-ce que ce projet essaie de faire pour moi?
Rendez-le mort simple pour faire des demandes HTTPS à C ++ (ou C).
Pourquoi utiliser ce projet pour obtenir une bibliothèque client C ++ HTTPS?
C ++ manque le support de mise en réseau hors de la boîte. Si vous lisez ceci, nous soupçonnons que vous êtes dans la même position que nous étions: nous devions remplir ce trou pour nous-mêmes et nous n'étions pas satisfaits des autres options que nous avons vues. Nous avons écrit ce code parce que toutes les autres règles de bazel que nous avons vues ont de graves problèmes enroulant Curl, que ce soit la mauvaise configuration dans le fichier de TensorFlow provoquant des erreurs de mémoire ou des emballages Cmake qui ne gèrent pas correctement les paramètres de bazel ou la compilation croisée. L'objectif ici est de créer un composant facilement réutilisable qui fait le bien pour tout le monde.
Temps de configuration de base: 2m
Howdy, Bazel User ?. Voyons vous faire une demande HTTPS en un rien de temps.
Il y a un tas de texte ici, mais uniquement parce que nous essayons d'épeler les choses et de les rendre faciles. Si vous avez des problèmes, faites-le nous savoir; Nous aimerions votre aide à rendre les choses encore meilleures et plus complètes - et nous serions ravis de vous aider!
Copiez-le dans votre fichier WORKSPACE Bazel pour ajouter ce dépôt en tant que dépendance externe, en vous assurant de mettre à jour le dernier engagement selon les instructions ci-dessous.
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 ()Comme pour tous les C / C ++ dépendants de la plate-forme dans Bazel, vous devrez utiliser Bazel 7+ (et une version tout aussi récente de règles_apple) pour que la configuration par plate-forme fonctionne automatiquement hors de la boîte. (Veuillez déposer un PR pour supprimer cette section si Bazel 7 est maintenant si ancien qu'il est standard.)
Vous devrez vous assurer que les en-têtes de développement libcurl sont installés afin que vous puissiez les utiliser à partir de votre code.
Exécutez sudo apt-get install libcurl4-openssl-dev (debian / ubuntu) ou l'équivalent de votre distribution. Pour les instructions d'installation pour d'autres distributions, consultez les entrées libcurl ici: https://everything.curl.dev/get/linux. Si vous distribuez un package binaire en fonction de votre code, vous devez déclarer une dépendance à Libcurl4 ou dire autrement à vos utilisateurs à sudo apt-get libcurl4 . Et, comme toujours, si vous apprenez des choses qui aideraient les futurs utilisateurs, veuillez déposer un RP ou un problème.
En tant que fond, nous adoptons l'approche de la liaison dynamiquement aux bibliothèques que le système d'exploitation peut fournir de manière fiable et en regroupant (bâtiment + liaison statiquement) autrement. Linux est un cas spécial car il existe un grand système de gestion de la dépendance intégrée, il peut donc fournir de manière fiable plus de bibliothèques qui sont expédiées avec le système d'exploitation.
Mis à part: il nous semble qu'il y a une opportunité ici pour une extension bazel qui permettrait à Bazel de mieux prendre en charge les gestionnaires de packages Linux. Veuillez consulter cette proposition si vous seriez intéressé à cela ou à y aider à pirater. Continuons la discussion sur cette question, que Google souhaite ou non la mettre en œuvre elles-mêmes.
Ajoutez "@cpr" à vos deps et utilisez la merveilleuse interface libcpr!
Veuillez consulter leurs documents pour plus de détails, mais l'interface est vraiment délicieusement ergonomique. Par exemple:
# include < cpr/cpr.h >
cpr::Response r = cpr::Get(cpr::Url{ " https://github.com " },
cpr::Parameters{{ " key " , " value " }});Pour en savoir plus sur les raisons pour lesquelles nous avons choisi et recommandé la RCR, voir pourquoicpr.md
Notez que vous devrez activer C ++ 17 ou plus, si vous ne l'avez pas déjà fait. Nous satisfaisons cela en mettant ce qui suit dans notre .bazelrc:
build --cxxopt=-std=gnu++20
build --per_file_copt=.*.mm$@-std=gnu++20
Ajoutez "@curl" à vos deps et utilisez libcurl dans toute sa gloire habituelle (exemple, docs).
... ou implémentez simplement votre interface C en C ++ (en utilisant extern "C" ) et utilisez libcpr.
Mais nous avons une suggestion ...
Les améliorations viennent fréquemment des bibliothèques sous-jacentes, y compris les correctifs de sécurité, nous vous recommandons donc de rester à jour.
Nous vous recommandons fortement de configurer Renove (ou similaire) à un moment donné pour maintenir cette dépendance (et d'autres) à jour par défaut. [Nous ne sommes pas affiliés à Renovate ou quoi que ce soit, mais nous pensons que c'est génial. Il regarde pour de nouvelles versions et vous envoie des PR pour examen ou tests automatisés. C'est gratuit et facile à installer. Il a été incroyablement utile dans notre base de code, et nous avons travaillé avec le merveilleux mainteneur pour rendre les choses super pour une utilisation en bazel. Et il est utilisé dans les référentiels officiels de Bazel - et celui-ci!]
Sinon maintenant, revenez peut-être à cette étape plus tard, ou regardez ce dépôt pour les mises à jour. [Ou bon, peut-être nous donner une star rapide, pendant que vous pensez à regarder.] Comme Abseil, nous vivons à la tête; Le dernier engagement dans la branche principale est l'engagement que vous souhaitez. Alors ne comptez pas sur les notifications de libération; Utilisez rénover ou sonder manuellement pour les nouveaux engins.
Moyen de le faire grâce à la configuration. Bravo à pouvoir utiliser facilement la puissance du Web à partir de C ++!
Cela devrait fonctionner de manière transparente pour MacOS, Linux, Android, iOS, WatchOS et TVOS.
Si vous le souhaitez pour Windows, nous aimerions votre aide. Il devrait être un peu plus facile d'ajouter du soutien que de le faire vous-même à partir de zéro. Nous aiderons à guider. Et votre code fonctionnera ensuite gratuitement sur les plateformes. De plus, vous aiderez tout le monde. Veuillez contacter le problème lorsque vous démarrez, juste pour vous assurer que les gens ne reproduisent pas les efforts.
Si vous utilisez Bazel pour C ou C ++, vous voudrez probablement également certains de nos autres outils, comme ...