バツイチとインケンのエンジニアブログ
プログラムやプログラムじゃないこと

Rust を Bazel でビルドする〜後編〜

2018-05-28
書いた人 : バツイチ
カテゴリ : bazel, rust | タグ : cargo-raze, hyper-rustls, ring, rules_rust

前回の Rust を Bazel でビルドする〜前編〜 の続きです。

Bazel のインストールやかんたんなビルド操作については 前編 をご覧くださいませ。

ソースコードの完全版はGithubに公開しておりますので、合わせてご覧頂くとわかりやすいかもしれません。
https://github.com/x1-/rust_bazel_sandbox

さて、前回は base64 を依存に追加したのですが、今回は hyper と hyper-rustls を追加していきます。

  • hyper
  • hyper-rustls

どちらも定番ライブラリで、 hyper はHTTPサーバとクライアント機能を提供し、hyper-rustls は hyper に TLSを提供します。

依存を追加

前回同様、 Cargo.toml に依存を書きます。

[dependencies]
base64 = "*"
hyper = "^0.10"        # new
hyper-rustls = "^0.6"  # new

続けて、 cargo/ ディレクトリで cargo raze を実行します。

$ cd cargo/
$ cargo raze
Loaded override settings: RazeSettings {
    workspace_path: "//cargo",
:
Generated .//BUILD successfully
Generated .//crates.bzl successfully
$ tree .
.
├── BUILD
├── Cargo.lock
├── Cargo.toml
├── crates.bzl
└── remote
    ├── BUILD
    ├── arrayvec-0.4.7.BUILD
    ├── base64-0.6.0.BUILD
    ├── base64-0.9.1.BUILD
    ├── bitflags-1.0.3.BUILD
    ├── byteorder-1.2.3.BUILD
    ├── cfg-if-0.1.3.BUILD
:

cargo/remote/ ディレクトリに沢山の依存ライブラリ(Rustなんでcrateですね)用 BUILD ファイルが生成されます。

ワークスペース直下の BUILD ファイルに依存を追加します。

load("@io_bazel_rules_rust//rust:rust.bzl", "rust_binary")

rust_binary(
    name = "rust_bazel_sandbox",
    srcs = ["src/main.rs"],
    deps = [
        "//cargo:base64",
        "//cargo:hyper",        # new
        "//cargo:hyper_rustls", # new
    ],
)

ここで、再度ビルドしてみます。
※ –verbose_failures は、エラー時に詳細を出力するオプションです。

$ bazel build //:rust_bazel_sandbox --verbose_failures 
INFO: Analysed target //:rust_bazel_sandbox (37 packages loaded).
INFO: Found 1 target...
ERROR: /private/var/tmp/...../external/raze__ring__0_11_0/BUILD.bazel:28:1: error executing shell command: 'set -e; rm -rf bazel-out/darwin-fastbuild/bin/external/raze__ring__0_11_0/ring.deps; mkdir bazel-out/darwin-fastbuild/bin/external/raze__ring__0_11_0/ring.deps
 ln -sf ../../raze__libc__0_2_41/libl...' failed (Exit 101): bash failed: error executing command
  (cd /private/var/tmp/...../execroot/__main__ && \
  exec env - \
:
 ln -sf ../../raze__libc__0_2_41/libl...' failed (Exit 101)
error: couldn't read external/raze__ring__0_11_0/src/ec/curve25519/ed25519_pkcs8_v2_template.der: No such file or directory (os error 2)
   --> external/raze__ring__0_11_0/src/ec/curve25519/ed25519.rs:307:12
    |
307 |     bytes: include_bytes!("ed25519_pkcs8_v2_template.der"),
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: couldn't read external/raze__ring__0_11_0/src/ec/suite_b/ecPublicKey_p256_pkcs8_v1_template.der: No such file or directory (os error 2)
   --> external/raze__ring__0_11_0/src/ec/suite_b/ecdsa.rs:448:12
    |
448 |     bytes: include_bytes ! ("ecPublicKey_p256_pkcs8_v1_template.der"),
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: couldn't read external/raze__ring__0_11_0/src/ec/suite_b/ecPublicKey_p384_pkcs8_v1_template.der: No such file or directory (os error 2)
   --> external/raze__ring__0_11_0/src/ec/suite_b/ecdsa.rs:455:12
    |
455 |     bytes: include_bytes!("ecPublicKey_p384_pkcs8_v1_template.der"),
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: couldn't read external/raze__ring__0_11_0/src/rsa/../data/alg-rsa-encryption.der: No such file or directory (os error 2)
   --> external/raze__ring__0_11_0/src/rsa/signing.rs:144:13
    |
144 |             include_bytes!("../data/alg-rsa-encryption.der");
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 4 previous errors

Target //:rust_bazel_sandbox failed to build
INFO: Elapsed time: 18.541s, Critical Path: 7.88s
FAILED: Build did NOT complete successfully

前回はあっさりうまくいったのに、エラーとなりました。

エラー原因

エラーを見ると、hyper-rustls が依存している暗号化ライブラリの ring がビルドできないようです。

error: couldn't read external/raze__ring__0_11_0/src/ec/curve25519/ed25519_pkcs8_v2_template.der: No such file or directory 

include_bytes! マクロで読み込んでいる ed25519_pkcs8_v2_template.der が読めていなさそうです。

Bazel はソースコードを汚染しないよう、ワークスペース外からワークスペースのソースにシンボリックリンクを張って作業するのですが、 external/raze__ring__0_11_0/ は Bazel 作業ディレクトリ内に生成されたディレクトリです。

実行時に
cd /private/var/tmp/…../execroot/__main__
と、作業ディレクトリに移動しているので、
ここを基点に、見つからないと言われている external/raze__ring__0_11_0/ を辿ってみると…

$ ls /private/var/tmp/...../execroot/__main__/external/raze__ring__0_11_0/src/ec/curve25519/ed25519.rs
/private/var/tmp/...../execroot/__main__/external/raze__ring__0_11_0/src/ec/curve25519/ed25519.rs

あります。。。
ということは、Bazelのビルド対象に組み込まれていないだけのようです。

[raze.crates] ディレクティブの追加

bazelbuild/rules_rust#rust_binary を見ると、 data という属性があります。
include_str! マクロで読み込むようなファイルを指定しろと書いてあるので、ここに見つからないと言われているファイルを追加すれば良さそうです。

ですが、属性を追加したい ring-0.11.0.BUILD は cargo-raze によって自動生成されたファイルのため、ここに追記しても再度 cargo raze を実行すれば設定が消えてしまいます(・_・;)

そこで cargo-raze をもう一度確認すると、 crate 毎に設定を上書きできる機能があるようです。

[raze.crates.openssl-sys.'0.9.24']
additional_flags = [
  # Vendored openssl is 1.0.2m
  "--cfg=ossl102",
  "--cfg=version=102",
]
additional_deps = [
  "@//third_party/openssl:crypto",
  "@//third_party/openssl:ssl",
]

これを使って、 ring の data を上書きしました。

Cargo.toml に下記を追加します。

[raze.crates.ring.'0.11.0']
data_attr = "[\"src/ec/curve25519/ed25519_pkcs8_v2_template.der\", \"src/ec/suite_b/ecPublicKey_p256_pkcs8_v1_template.der\", \"src/ec/suite_b/ecPublicKey_p384_pkcs8_v1_template.der\", \"src/data/alg-rsa-encryption.der\"]"

[raze.crates.webpki.'0.14.0']
data_attr = "[\"src/data/alg-ecdsa-p256.der\",\"src/data/alg-ecdsa-p384.der\",\"src/data/alg-ecdsa-sha256.der\",\"src/data/alg-ecdsa-sha384.der\",\"src/data/alg-rsa-encryption.der\",\"src/data/alg-rsa-pkcs1-sha1.der\",\"src/data/alg-rsa-pkcs1-sha256.der\",\"src/data/alg-rsa-pkcs1-sha384.der\",\"src/data/alg-rsa-pkcs1-sha512.der\",\"src/data/alg-rsa-pss-sha256.der\",\"src/data/alg-rsa-pss-sha384.der\",\"src/data/alg-rsa-pss-sha512.der\"]"

※ webpkiも同様のエラーが出るため、同じように data_attr を追加しています。

Cargo.toml を編集したので、 cargo raze で再度、依存crate用BUILDファイルを生成します。

$ cd cargo/
$ cargo raze
Loaded override settings: RazeSettings {
    workspace_path: "//cargo",
:
        "ring": {
            "0.11.0": CrateSettings {
                additional_deps: [],
                skipped_deps: [],
                extra_aliased_targets: [],
                additional_flags: [],
                gen_buildrs: false,
                data_attr: Some(
                    "[\"src/ec/curve25519/ed25519_pkcs8_v2_template.der\", \"src/ec/suite_b/ecPublicKey_p256_pkcs8_v1_template.der\", \"src/ec/suite_b/ecPublicKey_p384_pkcs8_v1_template.der\", \"src/data/alg-rsa-encryption.der\"]"
                )
            }
        }
    },
    gen_workspace_prefix: "raze",
    genmode: Remote
:
}

$ cat ./remote/ring-0.11.0.BUILD
:
rust_library(
    name = "ring",
    crate_root = "src/lib.rs",
    crate_type = "lib",
    srcs = glob(["**/*.rs"]),
    deps = [
        "@raze__libc__0_2_41//:libc",
        "@raze__untrusted__0_5_1//:untrusted",
    ],
    rustc_flags = [
        "--cap-lints allow",
        "--target=x86_64-apple-darwin",
    ],
    data = ["src/ec/curve25519/ed25519_pkcs8_v2_template.der", "src/ec/suite_b/ecPublicKey_p256_pkcs8_v1_template.der", "src/ec/suite_b/ecPublicKey_p384_pkcs8_v1_template.der", "src/data/alg-rsa-encryption.der"],
    crate_features = [
        "default",
        "dev_urandom_fallback",
        "rsa_signing",
        "use_heap",
    ],
)

ちゃんと data が上書かれて生成されました。
再度ビルドしてみます。

$ bazel build //:rust_bazel_sandbox --verbose_failures   
INFO: Analysed target //:rust_bazel_sandbox (0 packages loaded).
INFO: Found 1 target...
Target //:rust_bazel_sandbox up-to-date:
  bazel-bin/rust_bazel_sandbox
INFO: Elapsed time: 0.185s, Critical Path: 0.01s
INFO: Build completed successfully, 1 total action

無事ビルドできました…!
しかし、これで終わりではありません(笑

ソースコードでhyper-rustlsを使う

無事ビルドができるようになったので、ソースコード上で hyper-rustls を使ってみます。

src/main.rs を下記のように変更します。

extern crate base64;
extern crate hyper;
extern crate hyper_rustls;

use hyper::net::HttpsConnector;

fn main() {
    println!("Hello, world!");
    println!("{:?}", base64::encode("Hello, world!".as_bytes()));

    let client = hyper::Client::with_connector(HttpsConnector::new(hyper_rustls::TlsClient::new()));
    let res = client.get("https://github.com").send().unwrap();
    println!("{:?}", res.status);
}

再度ビルドします。

$ bazel build //:rust_bazel_sandbox --verbose_failures   
INFO: Analysed target //:rust_bazel_sandbox (0 packages loaded).
INFO: Found 1 target...
ERROR: rust_bazel_sandbox/BUILD:3:1: error executing shell command: 'set -e; rm -rf bazel-out/darwin-fastbuild/bin/rust_test.deps; mkdir bazel-out/darwin-fastbuild/bin/rust_test.deps
 ln -sf ../external/raze__base64__0_9_1/libbase64--251683115.rlib bazel-out/darwin-...' failed (Exit 101)
error: linking with `external/local_config_cc/cc_wrapper.sh` failed: exit code: 1
  :
          Undefined symbols for architecture x86_64:
            "_LIMBS_shl_mod", referenced from:
                ring::rsa::bigint::repr_c::BIGNUM::make_limbs::h8768d136cc54e6ba in libring--22413770.rlib(ring--22413770.ring6-7e6565c642b0e8d0412ea35080243785.rs.rcgu.o)
            "_GFp_bn_correct_top", referenced from:
                ring::rsa::bigint::repr_c::BIGNUM::make_limbs::h8768d136cc54e6ba in libring--22413770.rlib(ring--22413770.ring6-7e6565c642b0e8d0412ea35080243785.rs.rcgu.o)
                ring::rsa::bigint::repr_c::BIGNUM::make_limbs::hec271672ce487b9f in libring--22413770.rlib(ring--22413770.ring6-7e6565c642b0e8d0412ea35080243785.rs.rcgu.o)
            "_GFp_nistz256_point_mul", referenced from:
:

またしても ring でエラーです(T T)

エラー原因

libring が参照している _LIMBS_shl_modや _GFp_bn_correct_topが見つからない、という参照エラーのようです。
ring のソースコードをGithub で確認すると、なるほど、Cヘッダが含まれています。

ring は RustだけでなくCで書かれている部分もあるようでした(ハイブリッド)。

なので、Cargo では問題なくビルドできるように、ソースコードの直下に build.rs が含まれています。
build.rs は バンドルのCライブラリをビルドし、Rustモジュールへの参照を Cargo に通知するためのビルド・スクリプトです。

詳細はこちら: Build Scripts | The Cargo Book

これを実行すれば ring バンドルの、Cライブラリがビルドできそうです。
※ 本来的には Bazel でビルドすべきかもしれません…沢山のCライブラリの依存を書くのがイヤで build.rs に逃げました…

gen_buildrs

ありがたいことに cargo-raze には、build.rs を実行し、 $OUT_DIR に格納する仕組みがありました。

cargo-raze#crates-that-generate-files-using-locally-known-information

この場合ですと、[raze.crates.ring.’0.11.0′] ディレクティブに gen_buildrs = true を追加すれば良さそうです。

Cargo.toml に上記を追加し、また cargo raze の実行を行います。

[raze.crates.ring.'0.11.0']
data_attr = "[\"src/ec/curve25519/ed25519_pkcs8_v2_template.der\", \"src/ec/suite_b/ecPublicKey_p256_pkcs8_v1_template.der\", \"src/ec/suite_b/ecPublicKey_p384_pkcs8_v1_template.der\", \"src/data/alg-rsa-encryption.der\"]"
gen_buildrs = true    # new

再度ビルドしてみます。

$ bazel build //:rust_bazel_sandbox --verbose_failures   
INFO: Analysed target //:rust_bazel_sandbox (0 packages loaded).
INFO: Found 1 target...
ERROR: /private/var/tmp/...../external/raze__ring__0_11_0/BUILD.bazel:41:1: Executing genrule @raze__ring__0_11_0//:ring_build_script_executor failed (Exit 101): bash failed: error executing command
  (cd /private/var/tmp/...../execroot/__main__ && \
  exec env - \
    :
  /bin/bash -c 'source external/bazel_tools/tools/genrule/genrule-setup.sh; mkdir ring_out_dir_outputs/; (export CARGO_MANIFEST_DIR="$PWD/$(dirname external/raze__ring__0_11_0/Cargo.toml)"; export TARGET='\''x86_64-apple-darwin'\''; export RUST_BACKTRACE=1; export CARGO_FEATURE_DEFAULT=1; export CARGO_FEATURE_DEV_URANDOM_FALLBACK=1; export CARGO_FEATURE_RSA_SIGNING=1; export CARGO_FEATURE_USE_HEAP=1; export OUT_DIR=$PWD/ring_out_dir_outputs; export BINARY_PATH="$PWD/bazel-out/host/bin/external/raze__ring__0_11_0/ring_build_script"; export OUT_TAR=$PWD/bazel-out/darwin-fastbuild/genfiles/external/raze__ring__0_11_0/ring_out_dir_outputs.tar.gz; cd $(dirname external/raze__ring__0_11_0/Cargo.toml) && $BINARY_PATH && tar -czf $OUT_TAR -C $OUT_DIR .)')
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error { repr: Os { code: 17, message: "File exists" } }', src/libcore/result.rs:916:5
stack backtrace:
   0: std::sys::unix::backtrace::tracing::imp::unwind_backtrace
   1: std::panicking::default_hook::{{closure}}
   2: std::panicking::default_hook
   3: std::panicking::rust_panic_with_hook
:

違うエラーになりました。
追加した gen_buildrs がエラーになっているようです(・_・;)

ring-0.11.0.BUILD の修正

致し方ないので、 build.rs のソースコードを読むと、Cargo から実行された場合には渡されるべき環境変数がいくつか足りていないようです。

苦渋の決断ですが、自動生成の ring-0.11.0.BUILD を一部修正します。

genrule(
    name = "ring_build_script_executor",
    srcs = glob(["*", "**/*.rs"]),
    outs = ["ring_out_dir_outputs.tar.gz"],
    tools = [":ring_build_script"],
    local = 1,
    cmd = "mkdir ring_out_dir_outputs/;"
        + " (export CARGO_MANIFEST_DIR=\"$$PWD/\$$(dirname $(location :Cargo.toml))\";"
        + " export TARGET='x86_64-apple-darwin';"
        + " export RUST_BACKTRACE=1;"
        + " export CARGO_FEATURE_DEFAULT=1;"
        + " export CARGO_FEATURE_DEV_URANDOM_FALLBACK=1;"
        + " export CARGO_FEATURE_RSA_SIGNING=1;"
        + " export CARGO_FEATURE_USE_HEAP=1;"
        + " export OUT_DIR=$$PWD/ring_out_dir_outputs;"
        + " export BINARY_PATH=\"$$PWD/$(location :ring_build_script)\";"
        + " export OUT_TAR=$$PWD/$@;"
# ここから追加
        + " export CARGO_PKG_NAME=ring;"
        + " export CARGO_CFG_TARGET_ARCH=x86_64;"
        + " export CARGO_CFG_TARGET_OS=macos;"
        + " export CARGO_CFG_TARGET_ENV='';"
        + " export DEBUG=false;"
        + " export OPT_LEVEL=2;"
        + " export HOST=x86_64-apple-darwin;"
# ここまで
        + " cd \$$(dirname $(location :Cargo.toml)) && $$BINARY_PATH && tar -czf $$OUT_TAR -C $$OUT_DIR .)"
)

※ ブログの都合上 $ が全角の$となっている箇所があるため、ご注意くださいませ m(_ _)m
※ Cargo が実行時にどんな変数を渡しているか見たい場合は、 build 時に -vv オプションを渡してあげると見ることができます。

もう一度ビルドします。

$ bazel build //:rust_bazel_sandbox --verbose_failures
INFO: Analysed target //:rust_bazel_sandbox (1 packages loaded).
INFO: Found 1 target...
INFO: From Executing genrule @raze__ring__0_11_0//:ring_build_script_executor:
OPT_LEVEL: 2
CARGO_FEATURE_RSA_SIGNING: 1
HOST: x86_64-apple-darwin
:
cargo:rustc-link-lib=static=ring-core
cargo:rustc-link-search=native=/private/var/tmp/...../execroot/__main__/ring_out_dir_outputs
ERROR: rust_bazel_sandbox/BUILD:3:1: error executing shell command: 'set -e; rm -rf bazel-out/darwin-fastbuild/bin/rust_test.deps; mkdir bazel-out/darwin-fastbuild/bin/rust_test.deps
 ln -sf ../external/raze__base64__0_9_1/libbase64--251683115.rlib bazel-out/darwin-...' failed (Exit 101): bash failed: error executing command
  (cd /private/var/tmp/...../execroot/__main__ && \
  exec env -
:
            "_LIMBS_shl_mod", referenced from:
                ring::rsa::bigint::repr_c::BIGNUM::make_limbs::h8768d136cc54e6ba in libring--22413770.rlib(ring--22413770.ring6-7e6565c642b0e8d0412ea35080243785.rs.rcgu.o)
            "_GFp_bn_correct_top", referenced from:
                ring::rsa::bigint::repr_c::BIGNUM::make_limbs::h8768d136cc54e6ba in libring--22413770.rlib(ring--22413770.ring6-7e6565c642b0e8d0412ea35080243785.rs.rcgu.o)
                ring::rsa::bigint::repr_c::BIGNUM::make_limbs::hec271672ce487b9f in libring--22413770.rlib(ring--22413770.ring6-7e6565c642b0e8d0412ea35080243785.rs.rcgu.o)
            "_GFp_nistz256_point_mul", referenced from:
:

gen_buildrs によって生成された genrule は成功したようですが、 また参照エラーが出てしまいました(T T)

エラー原因

build.rs の仕組みとして、ビルドしたCライブラリの検索パスとスタティック・ライブラリ名を下記のように出力して Cargo に渡し、Cargo はそれをオプションとして rustc に渡す機構があります。

cargo:rustc-link-lib=static=ring-core
cargo:rustc-link-search=native=/private/var/tmp/...../execroot/__main__/ring_out_dir_outputs

genrule の追加によって libring のビルド時には $OUT_DIR にコンパイル済みCライブラリが追加されますが、スタティック・ライブラリ名は知らされません。
それに、メインの rust_bazel_sandbox アプリケーション にもこれらを通知する必要があります。
よって、これらを rustc_flags に追加してあげれば良いさそうです。
※ もっと良い解法があったら教えて頂きたいです… (人-)

additional_flags の追加

Cargo.toml に additional_flags を追加します。
これは、rules_rust の rustc_flags を上書きます。

[raze.crates.ring.'0.11.0']
data_attr = "[\"src/ec/curve25519/ed25519_pkcs8_v2_template.der\", \"src/ec/suite_b/ecPublicKey_p256_pkcs8_v1_template.der\", \"src/ec/suite_b/ecPublicKey_p384_pkcs8_v1_template.der\", \"src/data/alg-rsa-encryption.der\"]"
additional_flags = [
  "--cfg 'feature=\\\"default\\\"'",
  "--cfg 'feature=\\\"dev_urandom_fallback\\\"'",
  "--cfg 'feature=\\\"use_heap\\\"'",
  "-l static=ring-core",
  "-L native=/tmp/ring_out_dir_outputs",
]
gen_buildrs = true

Cargo.toml を変更したので再度 cargo raze を実行します。
※ 変更した ring-0.11.0.BUILD は上書きされます。

ring-0.11.0.BUILD

最終的に ring-0.11.0.BUILD は修正せざるをえません。
下記を再度追加します。

genrule(
    name = "ring_build_script_executor",
    srcs = glob(["*", "**/*.rs"]),
    outs = ["ring_out_dir_outputs.tar.gz"],
    tools = [":ring_build_script"],
    local = 1,
    cmd = "mkdir ring_out_dir_outputs/;"
        + " (export CARGO_MANIFEST_DIR=\"$$PWD/$$(dirname $(location :Cargo.toml))\";"
        + " export TARGET='x86_64-apple-darwin';"
        + " export RUST_BACKTRACE=1;"
        + " export CARGO_FEATURE_DEFAULT=1;"
        + " export CARGO_FEATURE_DEV_URANDOM_FALLBACK=1;"
        + " export CARGO_FEATURE_RSA_SIGNING=1;"
        + " export CARGO_FEATURE_USE_HEAP=1;"
        + " export OUT_DIR=$$PWD/ring_out_dir_outputs;"
        + " export BINARY_PATH=\"$$PWD/$(location :ring_build_script)\";"
        + " export OUT_TAR=$$PWD/$@;"
# ここから追加
        + " export CARGO_PKG_NAME=ring;"
        + " export CARGO_CFG_TARGET_ARCH=x86_64;"
        + " export CARGO_CFG_TARGET_OS=macos;"
        + " export CARGO_CFG_TARGET_ENV='';"
        + " export DEBUG=false;"
        + " export OPT_LEVEL=2;"
        + " export HOST=x86_64-apple-darwin;"
# ここまで
#        + " cd $$(dirname $(location :Cargo.toml)) $$BINARY_PATH && tar -czf $$OUT_TAR -C OUT_DIR .)"# /tmp に ring_out_dir_outputs へのシンボリックリンクを作成        + " cd $$(dirname $(location :Cargo.toml)) && $$BINARY_PATH && tar -czf $$OUT_TAR -C OUT_DIR . && ln -nfs $$OUT_DIR /tmp/ring_out_dir_outputs)"
)

BUILD の修正

ワークスペース直下の BUILD にも rustc_flags を追加します。

load("@io_bazel_rules_rust//rust:rust.bzl", "rust_binary")

rust_binary(
    name = "rust_bazel_sandbox",
    srcs = ["src/main.rs"],
    deps = [
        "//cargo:base64",
        "//cargo:hyper",
        "//cargo:hyper_rustls",
    ],
    rustc_flags = [
        "-L native=/tmp/ring_out_dir_outputs",
    ]
)

ビルド(最後)

これでやっとビルドできるようになりました。

$ bazel build //:rust_bazel_sandbox --verbose_failures                                                                            木  5/24 15:16:24 2018
INFO: Analysed target //:rust_bazel_sandbox (2 packages loaded).
INFO: Found 1 target...
INFO: From Executing genrule @raze__ring__0_11_0//:ring_build_script_executor:
OPT_LEVEL: 2
CARGO_FEATURE_RSA_SIGNING: 1
HOST: x86_64-apple-darwin
:
cargo:rustc-link-lib=static=ring-core
cargo:rustc-link-search=native=/private/var/tmp/...../execroot/__main__/ring_out_dir_outputs
Target //:rust_bazel_sandbox up-to-date:
  bazel-bin/rust_bazel_sandbox
INFO: Elapsed time: 31.539s, Critical Path: 24.92s
INFO: Build completed successfully, 9 total actions

生成されたバイナリを実行してみます。

$ ./bazel-bin/rust_bazel_sandbox
Hello, world!
"SGVsbG8sIHdvcmxkIQ=="
Ok

やっと動きました(¯―¯٥)


実はそこそこハマりました、、、
こういうところに楽しさを見出してしまうのが私のエンジニアとしてのウィークポイントだなと思いつつ…
Baze x Rust x ring でこれからハマる方々の参考になればと思い、公開した次第です。
(いるんでしょうか、、、)

参考にしたサイト

  • rules_rustのexamples: https://github.com/bazelbuild/rules_rust/tree/master/examples
  • cargo-raze-examplesのexamples: https://github.com/acmcarther/cargo-raze-examples
  • OpenSSLのコンパイル: https://github.com/acmcarther/compile_openssl
  • cargo-raze: https://github.com/google/cargo-raze
  • Bazelのrules_rust: https://github.com/bazelbuild/rules_rust
  • Build Scriptsについて: https://doc.rust-lang.org/cargo/reference/build-scripts.html
  • Bazelのgenrule: https://docs.bazel.build/versions/master/be/general.html#genrule
このエントリーをはてなブックマークに追加
Tweet

← Rust を Bazel でビルドする〜前編〜
Rust の Web Framework, actix_web のパフォーマンスをとことん測定する →

 

最近書いた記事

  • Ryzen7 3800XT でmini ITXオープンフレームPCを作る
  • Pythonで機械学習入門 競馬予測
  • HP ENVY 15 クリエイターモデルレビューとRAID0解除
  • JRA-VAN データラボを使って、競馬データを収集する
  • Surface Pro 3 にubuntu18.04を入れる

カテゴリー

  • Android
  • Apache Flink
  • API
  • AWS
  • bazel
  • BigQuery
  • Cassandra
  • Docker
  • Druid
  • Elasticsearch
  • Git
  • Golang
  • gradle
  • HDFS
  • JavaScript
  • jvm
  • Linux
  • MongoDB
  • MySQL
  • Nginx
  • Nodejs
  • PaaS
  • PHP
  • Python
  • RabbitMQ
  • Raspberry Pi
  • React Native
  • Redis
  • Riak
  • rust
  • scala
  • Scheme
  • SEO
  • solr
  • Spark
  • spray
  • Sublime Text
  • Swift
  • Tableau
  • Unity
  • WebIDE
  • Wordpress
  • Youtube
  • ひとこと
  • カンファレンス
  • スケジューラ
  • マイクロマウス
  • 広告
  • 技術じゃないやつ
  • 株
  • 機械学習
  • 競馬
  • 自作キーボード
  • 自然言語処理

アーカイブ

  • 2021年4月
  • 2021年2月
  • 2021年1月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年10月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年9月
  • 2018年5月
  • 2018年3月
  • 2018年2月
  • 2017年9月
  • 2017年8月
  • 2017年6月
  • 2017年4月
  • 2017年3月
  • 2017年1月
  • 2016年10月
  • 2016年9月
  • 2016年8月
  • 2016年6月
  • 2016年5月
  • 2016年4月
  • 2016年3月
  • 2016年2月
  • 2016年1月
  • 2015年12月
  • 2015年11月
  • 2015年10月
  • 2015年9月
  • 2015年8月
  • 2015年6月
  • 2015年5月
  • 2015年2月
  • 2015年1月
  • 2014年12月
  • 2014年11月
  • 2014年9月
  • 2014年6月
  • 2014年5月
  • 2014年3月
  • 2014年2月
  • 2014年1月
  • 2013年12月
  • 2013年11月
  • 2013年10月
  • 2013年9月
  • 2013年8月

書いた人

  • バツイチちゃん
  • インケンくん

このブログについて

エンジニアとしての考え方が間逆な2人がしょーもないこと書いてます。

バツイチ

アイコン

IT業界で働くエンジニアです。名前の通りバツイチです。
理論や抽象的概念が好きだけど人に説明するのが下手。

インケン

アイコン

バツイチちゃんと同じ業界で働いています。
理論とか開発手法とかは正直どうでもよくて、
生活する上で役に立つことに使いたい

Copyright 2025 バツイチとインケンのエンジニアブログ