c++ - 如何在 Conan.io 中使用 Bazel 作为构建工具

标签 c++ gcc bazel conan

我正在尝试使用 Conan 进行包管理,并使用 Bazel 作为我的 C++ 代码的构建工具。我使用 conan 的原因是因为 JFrog Artifactory 支持它,我将其用作我的 Artifactory 存储库。

为此,我提出了以下计划:

$/home/mytimer=> ls -lrt
   0 Sep 25 11:57 WORKSPACE
4096 Sep 25 12:00 build/
4096 Sep 25 12:02 main/

$/home/mytimer=> ls -l main
total 4
60 Sep 25 12:02 BUILD
61 Sep 25 11:56 conanfile.txt
955 Sep 25 11:56 timer.cpp

$/home/mytimer=> ls -l build

total 8
1266 Sep 25 12:00 conanbuildinfo.gcc
1875 Sep 25 12:00 conaninfo.txt

(这是我执行 conan --install ../main 后的结果)

$/home/mytimer=> cat cat main/conanfile.txt
[requires]
Poco/1.7.8p3@pocoproject/stable

[generators]
gcc



$/home/mytimer=>cat build/conanbuildinfo.gcc
-DPOCO_STATIC=ON -DPOCO_NO_AUTOMATIC_LIBS -I"/home/.conan/data/Poco/1.7.8p3/pocoproject/stable/package/da23483d46b7229cbae8615ce1ea2594635f3a5f/include" -I"/home/.conan/data/OpenSSL/1.0.2l/conan/stable/package/c8dc3f0797f6d24f3c80634ae2854ddf9ee34334/include" -I"/home/.conan/data/zlib/1.2.11/conan/stable/package/82b1dd29b2e9143665c77ef477100c690d719cbf/include" -Wl,-rpath="/home/.conan/data/Poco/1.7.8p3/pocoproject/stable/package/da23483d46b7229cbae8615ce1ea2594635f3a5f/lib" -Wl,-rpath="/home/.conan/data/OpenSSL/1.0.2l/conan/stable/package/c8dc3f0797f6d24f3c80634ae2854ddf9ee34334/lib" -Wl,-rpath="/home/.conan/data/zlib/1.2.11/conan/stable/package/82b1dd29b2e9143665c77ef477100c690d719cbf/lib" -L"/home/.conan/data/Poco/1.7.8p3/pocoproject/stable/package/da23483d46b7229cbae8615ce1ea2594635f3a5f/lib" -L"/home/.conan/data/OpenSSL/1.0.2l/conan/stable/package/c8dc3f0797f6d24f3c80634ae2854ddf9ee34334/lib" -L"/home/.conan/data/zlib/1.2.11/conan/stable/package/82b1dd29b2e9143665c77ef477100c690d719cbf/lib" -lPocoUtil -lPocoMongoDB -lPocoNet -lPocoNetSSL -lPocoCrypto -lPocoData -lPocoDataSQLite -lPocoZip -lPocoXML -lPocoJSON -lPocoFoundation -lpthread -lrt -lssl -lcrypto -ldl -lz -D_GLIBCXX_USE_CXX11_ABI=0 -m64 -s -DNDEBUGdevc

$/home/mytimer=> cat build/conaninfo.txt
[settings]
arch=x86_64
build_type=Release
compiler=gcc
compiler.libcxx=libstdc++
compiler.version=6.3
os=Linux

[requires]
Poco/1.Y.Z

[options]


[full_settings]
arch=x86_64
build_type=Release
compiler=gcc
compiler.libcxx=libstdc++
compiler.version=6.3
os=Linux

[full_requires]
OpenSSL/1.0.2l@conan/stable:c8dc3f0797f6d24f3c80634ae2854ddf9ee34334
Poco/1.7.8p3@pocoproject/stable:da23483d46b7229cbae8615ce1ea2594635f3a5f
zlib/1.2.11@conan/stable:82b1dd29b2e9143665c77ef477100c690d719cbf

[full_options]
OpenSSL:386=False
OpenSSL:no_asm=False
OpenSSL:no_bf=False
OpenSSL:no_cast=False
OpenSSL:no_des=False
OpenSSL:no_dh=False
OpenSSL:no_dsa=False
OpenSSL:no_hmac=False
OpenSSL:no_md2=False
OpenSSL:no_md5=False
OpenSSL:no_mdc2=False
OpenSSL:no_rc2=False
OpenSSL:no_rc4=False
OpenSSL:no_rc5=False
OpenSSL:no_rsa=False
OpenSSL:no_sha=False
OpenSSL:no_sse2=False
OpenSSL:no_threads=False
OpenSSL:no_zlib=False
OpenSSL:shared=False
Poco:cxx_14=False
Poco:enable_apacheconnector=False
Poco:enable_cppparser=False
Poco:enable_crypto=True
Poco:enable_data=True
Poco:enable_data_mysql=False
Poco:enable_data_odbc=False
Poco:enable_data_sqlite=True
Poco:enable_json=True
Poco:enable_mongodb=True
Poco:enable_net=True
Poco:enable_netssl=True
Poco:enable_netssl_win=True
Poco:enable_pagecompiler=False
Poco:enable_pagecompiler_file2page=False
Poco:enable_pdf=False
Poco:enable_pocodoc=False
Poco:enable_sevenzip=False
Poco:enable_tests=False
Poco:enable_util=True
Poco:enable_xml=True
Poco:enable_zip=True
Poco:force_openssl=True
Poco:poco_unbundled=False
Poco:shared=False
zlib:shared=False

[scope]
dev=True

[recipe_hash]


[env]

$/home/mytimer=> cat main/BUILD
cc_binary(
name = "timer",
srcs = ["timer.cpp"],
)

现在,我想使用 bazel 构建 mytimer 项目,如下所示: $/home/mytimer=> bazel build --(一些选项)//main:timer

这些选项应该是什么,以便 bazel 可以读取 conanbuildinfo.gcc 并使用它来创建可执行文件?

最佳答案

我使用 bazel 的 genrule() 功能以这种方式解决我的问题:

$/home/mytimer=> cat main/BUILD
genrule(
  name = "timer",
  outs = ["timer.out"],
  cmd = "g++ /home/mytimer/main/timer.cpp@/home/mytimer/build/conanbuildinfo.gcc -o $@ ",
)
/home/mytime=> bazel build -s //main:timer
WARNING: ignoring http_proxy in environment.
WARNING: Output base '/home/.cache/bazel/_bazel_user/274fa1325d85b25c2722794ea' is on NFS. This may lead to surprising failures and undetermined behavior.
INFO: Found 1 target...
>>>>> # //main:timer [action 'Executing genrule //main:timer']
(cd /home/.cache/bazel/_bazel_user/274fa1325d85b25c2722614/execroot/__main__ && \
  exec env - \
    LD_LIBRARY_PATH=<library paths>
    PATH=<all other paths>
  /bin/bash -c 'source external/bazel_tools/tools/genrule/genrule-setup.sh; g++ /home/bazel/examples/cpp-tutorial/mytimer/main/timer.cpp @/home/bazel/examples/cpp-tutorial/mytimer/build/conanbuildinfo.gcc -o bazel-out/local-fastbuild/genfiles/main/timer.out ')
Target //main:timer up-to-date:
  bazel-genfiles/main/timer.out
INFO: Elapsed time: 1.050s, Critical Path: 0.50s

/home/mytime=> ls -lrt bazel-out/local-fastbuild/genfiles/main/
total 212
212000 Sep 26 14:42 timer.out
/home/mytime=> ./bazel-out/local-fastbuild/genfiles/main/timer.out
Callback called after 249 milliseconds.
Callback called after 749 milliseconds.
Callback called after 1249 milliseconds.
Callback called after 1749 milliseconds.
Callback called after 2249 milliseconds.
Callback called after 2749 milliseconds.
^C

因此,通过使用 genrule() 功能,我们可以在 bazel 中执行任何 shell 命令。虽然这不是所谓的“bazel”方式来生成工件(bazel 的 genrule() 与 C/C++ 的“goto”命令相同),但在这种情况下,我没有看到任何其他选项来解决此问题。

关于c++ - 如何在 Conan.io 中使用 Bazel 作为构建工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46411167/

相关文章:

C++模板自动参数

c++ - 错误 : cannot bind ‘std::basic_ostream<char>’ lvalue to ‘std::basic_ostream<char>&&’

c - 错误 : array type has incomplete element type

grpc - 解决在 bazel 中使用 gRPC cpp 时的依赖问题

bazel - 如何捕获转瞬即逝的 bazel 控制台输出

c++ - 读取指向函数中的变量时出现段错误

c++ - 合并列表

c++ - 将引用传递给函数是否可以进行内存管理?

gcc - 可以使gcc/gcov将coverage统计信息输出到源文件夹以外的位置吗?

在 GCC 中使用多个头文件进行编译——对 .. math 的 undefined reference