使用Bazel为Android编译OpenSSL

5

我正在使用bazel为我的Android应用构建本地库。

我想在其中使用一些OpenSSL函数,例如:

#include <jni.h>
#include <openssl/aes.h>
...
AES_encrypt(in, out, key);

如何将openssl库添加到Bazel构建中? 子问题: 我应该使用哪个归档文件?
openssl-1.1.0c.tar.gz
openssl-1.0.2j.tar.gz
openssl-1.0.1u.tar.gz
openssl-fips-2.0.13.tar.gz
openssl-fips-ecp-2.0.13.tar.gz

我尝试过的

我下载了openssl-1.0.2j压缩包,并在我的BUILD文件中添加了一个cc_library条目。

cc_library(
    name = "openssl",
    srcs = glob([
         "openssl-1.0.2j/crypto/**/*.h",
         "openssl-1.0.2j/crypto/**/*.c"
         ]),
    includes = [
        "openssl-1.0.2j",
        "openssl-1.0.2j/crypto/",
        ],
    visibility = ["//visibility:public"],
)

我遇到了这个错误:

openssl-1.0.2j/crypto/dh/p512.c:60:24: fatal error: openssl/bn.h: No such file or directory
 #include <openssl/bn.h>

但我不明白为什么这段代码试图从openssl中包含一个文件,而它实际上在openssl-1.0.2j/crypto/中。

使用openssl-1.1.0c

openssl-1.1.0c/include/openssl/e_os2.h:13:34: fatal error: openssl/opensslconf.h: No such file or directory
 # include <openssl/opensslconf.h>

即使我运行了Configure命令,也没有生成opensslconf.h文件。

<opensslconf.h><bn.h>是由OpenSSL的Configure脚本创建的。它们是特定于平台和架构的。另请参见在OS X上构建Multiarch OpenSSL - jww
1
我担心OpenSSL的构建可能比一个简单的cc_library表达更复杂。我刚试着下载了1.0.2j,但它并不简单。我认为正在发生的是,如果在配置时未启用bn(无论它是什么),则只有通过./config才会生成bn.h,因此您必须手动(?)从cc_library中的源代码中排除bn子库。您可以使用-k进行构建(即bazel -k:openssl)以查看更多错误-bn.h只是其中之一-我还看到了缺少rc5.h和md2.h。 - Ulf Adams
有用于使用Bazel构建OpenSSL的构建规则:lbuchy/bazel-opensslbazelment/trunk。我没有尝试过它们,但至少这些构建文件可以帮助了解如何构建它的基本思路。 - kolen
1个回答

3
基于 @Ulf Adams 的回答,我放弃了尝试使用 bazel 编译 OpenSSL。我改用了 BoringSSL。
BoringSSL 是 OpenSSL 的一个分支,可以很容易地通过以下方式将其并入到 bazel 项目中: BoringSSL。有关详细信息,请参阅 INCORPORATING.md
git_repository(
    name = "boringssl",
    commit = "_some commit_",
    remote = "https://boringssl.googlesource.com/boringssl",
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接