Tentei construir H2O com LibreSSL 2.7.0, lançado em 21 de março.
Em seguida, o processo de construção falha com as mensagens de erro abaixo.
(branch master (commit 0376131) e 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....
A nota de lançamento do LibreSSL diz "Adicionado suporte para muitas APIs OpenSSL 1.0.2 e 1.1" e parece que o código backport de H2O não é compatível com isso.
Não acho que esse problema dependa do meio ambiente, mas descrevo meu meio ambiente.
cmake -DWITH_MRUBY=on -DCMAKE_INSTALL_PREFIX=%{_prefix} -DCMAKE_INCLUDE_PATH=%{libressl_root}/include -DCMAKE_LIBRARY_PATH=%{libressl_root}/lib
Ele pode ser compilado com o mesmo script de compilação com LibreSSL 2.6.4.
Talvez funcione se aplicar os 3 patches abaixo:
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)
patch `` `
diff --git a / deps / neverbleed / neverbleed.cb / deps / neverbleed / neverbleed.c
índice 29b35a9..42356a6 100644
--- a / deps / neverbleed / neverbleed.c
+++ b / deps / neverbleed / neverbleed.c
@@ -547,7 +547,7 @@ static int sign_stub (struct expbuf_t * buf)
return 0;
}
- # if! OPENSSL_1_1_API
+ # if! OPENSSL_1_1_API && (! definido (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)
(Nota: "H2O 2.2.4+" significa "H2O 2.2.4 + patches")
Boa pegada!
Não testado com LibreSSL <2.7.0
Eu confirmei que H2O 2.2.4 e master com seus patches podem ser construídos com sucesso com LibreSSL 2.6.3 no OpenBSD 6.2.
Confirme se isso funciona no FreeBSD com LibreSSL 2.7.1
Patch aqui
Criei H2O-HEAD vanilla + LibreSSL 2.7.2 e funciona.
Eu encerro este problema agora.
Ainda não foi lançado.
Ainda precisa do patch acima se vocês criarem a versão lançada (v2.2.4) + LibreSSL 2.7.x.
Obrigado @kazuho pelo seu trabalho.
Comentários muito úteis
Talvez funcione se aplicar os 3 patches abaixo:
patch `` `
diff --git a / deps / neverbleed / neverbleed.cb / deps / neverbleed / neverbleed.c
índice 29b35a9..42356a6 100644
--- a / deps / neverbleed / neverbleed.c
+++ b / deps / neverbleed / neverbleed.c
@@ -547,7 +547,7 @@ static int sign_stub (struct expbuf_t * buf)
return 0;
}
- # if! OPENSSL_1_1_API
+ # if! OPENSSL_1_1_API && (! definido (LIBRESSL_VERSION_NUMBER) || LIBRESSL_VERSION_NUMBER <0x2070000fL)
static void RSA_get0_key (const RSA rsa, const BIGNUM * n, const BIGNUM * e, const BIGNUM * d)
{
(Nota: "H2O 2.2.4+" significa "H2O 2.2.4 + patches")