3月21日にリリースされたLibreSSL2.7.0でH2Oを構築しようとしました。
次に、ビルドプロセスが失敗し、以下のエラーメッセージが表示されます。
(マスターブランチ(コミット0376131)とH2O v2.2.4の両方)
In file included from //rpmbuild/BUILD/repo/include/h2o/socket.h:34:0,
from //rpmbuild/BUILD/repo/include/h2o/multithread.h:27,
from //rpmbuild/BUILD/repo/include/h2o/hostinfo.h:32,
from //rpmbuild/BUILD/repo/lib/common/hostinfo.c:22:
//rpmbuild/BUILD/repo/include/h2o/openssl_backport.h:37:27: error: static declaration of 'BIO_meth_new' follows non-static declaration
static inline BIO_METHOD *BIO_meth_new(int type, const char *name)
^~~~~~~~~~~~
In file included from /var/tmp/h2o-nightly-2.3.0-0.nightly20180323t195237.git0376131.el7.jp3cki-libressl-2.7.0-root/include/openssl/evp.h:67:0,
from /var/tmp/h2o-nightly-2.3.0-0.nightly20180323t195237.git0376131.el7.jp3cki-libressl-2.7.0-root/include/openssl/hmac.h:67,
from /var/tmp/h2o-nightly-2.3.0-0.nightly20180323t195237.git0376131.el7.jp3cki-libressl-2.7.0-root/include/openssl/ssl.h:149,
from //rpmbuild/BUILD/repo/include/h2o/socket.h:31,
from //rpmbuild/BUILD/repo/include/h2o/multithread.h:27,
from //rpmbuild/BUILD/repo/include/h2o/hostinfo.h:32,
from //rpmbuild/BUILD/repo/lib/common/hostinfo.c:22:
/var/tmp/h2o-nightly-2.3.0-0.nightly20180323t195237.git0376131.el7.jp3cki-libressl-2.7.0-root/include/openssl/bio.h:338:13: note: previous declaration of 'BIO_meth_new' was here
BIO_METHOD *BIO_meth_new(int type, const char *name);
^~~~~~~~~~~~
make[2]: *** [CMakeFiles/libh2o-evloop.dir/lib/common/hostinfo.c.o] Error 1
make[2]: *** Waiting for unfinished jobs....
LibreSSLのリリースノートには「多くのOpenSSL1.0.2および1.1APIのサポートが追加されました」と記載されており、H2Oのバックポートコードはそれと互換性がないようです。
この問題は環境に依存しているとは思いませんが、私は自分の環境について説明します。
cmake -DWITH_MRUBY=on -DCMAKE_INSTALL_PREFIX=%{_prefix} -DCMAKE_INCLUDE_PATH=%{libressl_root}/include -DCMAKE_LIBRARY_PATH=%{libressl_root}/lib
LibreSSL2.6.4と同じビルドスクリプトでビルドできます。
以下の3つのパッチを適用すると機能する可能性があります。
diff --git a/include/h2o/openssl_backport.h b/include/h2o/openssl_backport.h
index b24440e..b59a519 100644
--- a/include/h2o/openssl_backport.h
+++ b/include/h2o/openssl_backport.h
@@ -25,7 +25,7 @@
#include <stdlib.h>
/* backports for OpenSSL 1.0.2 */
-#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
+#if OPENSSL_VERSION_NUMBER < 0x10100000L || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL)
#define BIO_get_data(bio) ((bio)->ptr)
#define BIO_set_data(bio, p) ((bio)->ptr = (p))
@@ -57,7 +58,7 @@ static inline BIO_METHOD *BIO_meth_new(int type, const char *name)
#endif
/* backports for OpenSSL 1.0.1 and LibreSSL */
-#if OPENSSL_VERSION_NUMBER < 0x10002000L || defined(LIBRESSL_VERSION_NUMBER)
+#if OPENSSL_VERSION_NUMBER < 0x10002000L || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL)
#define SSL_is_server(ssl) ((ssl)->server)
`` `パッチ
diff --git a / deps / neverbleed / neverbleed.cb / deps / neverbleed / neverbleed.c
インデックス29b35a9..42356a6100644
--- a / deps / neverbleed / neverbleed.c
+++ b / deps / neverbleed / neverbleed.c
@@ -547,7 +547,7 @@ static int sign_stub(struct expbuf_t * buf)
0を返します。
}
-#if!OPENSSL_1_1_API
+#if!OPENSSL_1_1_API &&(!defined(LIBRESSL_VERSION_NUMBER)|| LIBRESSL_VERSION_NUMBER <0x2070000fL)
static void RSA_get0_key(const RSA rsa、const BIGNUM * n、const BIGNUM * e、const BIGNUM * d)
{{
```patch
diff --git a/deps/picotls/lib/openssl.c b/deps/picotls/lib/openssl.c
index a19a29a..c4dfccb 100644
--- a/deps/picotls/lib/openssl.c
+++ b/deps/picotls/lib/openssl.c
@@ -41,13 +41,15 @@
#include "picotls.h"
#include "picotls/openssl.h"
-#if (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
-#define OPENSSL_1_0_API 1
+#if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
+#define OPENSSL_1_1_API 1
+#elif defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x2070000fL
+#define OPENSSL_1_1_API 1
#else
-#define OPENSSL_1_0_API 0
+#define OPENSSL_1_1_API 0
#endif
-#if OPENSSL_1_0_API
+#if !OPENSSL_1_1_API
#define EVP_PKEY_up_ref(p) CRYPTO_add(&(p)->references, 1, CRYPTO_LOCK_EVP_PKEY)
#define X509_STORE_up_ref(p) CRYPTO_add(&(p)->references, 1, CRYPTO_LOCK_X509_STORE)
(注:「H2O2.2.4 +」は、「H2O 2.2.4 +パッチ」を意味します)
いいキャッチ!
LibreSSL <2.7.0ではテストされていません
H2O 2.2.4とパッチを使用したマスターは、OpenBSD6.2上のLibreSSL2.6.3で正常にビルドできることを確認しました。
これがLibreSSL2.7.1を使用するFreeBSDで機能することを確認します
ここにパッチを当てる
H2O-HEADバニラ+ LibreSSL 2.7.2を作成しましたが、動作します。
私は今この問題を閉じます。
まだリリースされていません。
リリースされたバージョン(v2.2.4)+ LibreSSL 2.7.xをビルドする場合は、上記のパッチが必要です。
@kazuhoさん、
最も参考になるコメント
以下の3つのパッチを適用すると機能する可能性があります。
`` `パッチ
diff --git a / deps / neverbleed / neverbleed.cb / deps / neverbleed / neverbleed.c
インデックス29b35a9..42356a6100644
--- a / deps / neverbleed / neverbleed.c
+++ b / deps / neverbleed / neverbleed.c
@@ -547,7 +547,7 @@ static int sign_stub(struct expbuf_t * buf)
0を返します。
}
-#if!OPENSSL_1_1_API
+#if!OPENSSL_1_1_API &&(!defined(LIBRESSL_VERSION_NUMBER)|| LIBRESSL_VERSION_NUMBER <0x2070000fL)
static void RSA_get0_key(const RSA rsa、const BIGNUM * n、const BIGNUM * e、const BIGNUM * d)
{{
(注:「H2O2.2.4 +」は、「H2O 2.2.4 +パッチ」を意味します)