From: https://github.com/dekeonus/libjwt/tree/feat-multi-ssl Enables multiple ssl implemtations to be installed at the same time default libjwt will default to linking to openssl (if openssl enabled) diff --git a/configure.ac b/configure.ac index be848df..3b61e2a 100644 --- a/configure.ac +++ b/configure.ac @@ -6,27 +6,105 @@ LT_INIT([]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS([libjwt/config.h]) +AC_SUBST([LIBJWT_LTVERSION], [11:0:9]) AC_SUBST([AM_CFLAGS], [-Wall]) -dnl Prefer OpenSSL unless asked to ignore it +dnl Build with OpenSSL when asked AC_ARG_WITH([openssl], - AS_HELP_STRING([--without-openssl], [Ignore presence of OpenSSL libraries and use GnuTLS])) - -AS_IF([test "x$with_openssl" != "xno"], [ - PKG_CHECK_MODULES([OPENSSL], [openssl >= 0.9.8]) - AM_CONDITIONAL([HAVE_OPENSSL], [true]) -], [ - PKG_CHECK_MODULES([GNUTLS], [gnutls >= 3.5.8]) - AM_CONDITIONAL([HAVE_OPENSSL], [false]) + AS_HELP_STRING([--with-openssl], [Build using OpenSSL library]), + [with_openssl=$withval], + [blank_openssl=yes]) + +dnl Build with GnutLS when asked +AC_ARG_WITH([gnutls], + AS_HELP_STRING([--with-gnutls], [Build using GnuTLS library]), + [with_gnutls=$withval], + [blank_gnutls=yes]) + +dnl If no with[out]-'ssl' default to openssl +AS_IF([test "x$blank_openssl" = "xyes" -a "x$blank_gnutls" = "xyes"], [ + with_openssl=yes +]) + +dnl emulate previous build, without-openssl means build with gnutls +AS_IF([test "x$with_openssl" = "xno" -a "x$blank_gnutls" = "xyes"], [ + with_gnutls=yes +]) + +AC_ARG_ENABLE([multi-ssl], AS_HELP_STRING([--enable-multi-ssl], + [Enable multiple ssl library implementations]), + [enable_multi_ssl=$enableval], + [enable_multi_ssl=no]) + +AS_IF([test "x$enable_multi_ssl" = "xno"], [ + AS_IF([test "x$with_openssl" = "xyes" -a "x$with_gnutls" = "xyes"], [ +AC_MSG_ERROR([You need to enable multi-ssl to support multiple ssl implementations concurrently]) + ]) +]) +AM_CONDITIONAL([MULTI_SSL], [test "x$enable_multi_ssl" = "xyes"]) + +AS_IF([test "x$with_openssl" = "xyes"], [ + PKG_CHECK_MODULES([OPENSSL], [openssl >= 0.9.8], [found_openssl=yes]) +]) +AM_CONDITIONAL([HAVE_OPENSSL], [test "x$found_openssl" = "xyes"]) + +AS_IF([test "x$with_gnutls" = "xyes"], [ + PKG_CHECK_MODULES([GNUTLS], [gnutls >= 3.5.8], [found_gnutls=yes]) +]) +AM_CONDITIONAL([HAVE_GNUTLS], [test "x$found_gnutls" = "xyes"]) + +AS_IF([test "x$found_openssl" != "xyes" -a "x$found_gnutls" != "xyes"], [ + AC_MSG_ERROR([Neither openssl nor gnutls was found]) ]) +dnl work out default, or only, ssl library +AC_MSG_CHECKING([which ssl library to use as default]) +AC_ARG_WITH([default-ssl], AS_HELP_STRING([--with-default-ssl@<:@=Lib@:>@], + [set default ssl library [openssl|gnutls] for multi-ssl]), + [with_default_ssl=$withval], + [with_default_ssl=yes]) +dnl note, yes/blank case will require further nesting, if additional ssl lib support added +AS_CASE([$with_default_ssl], + [openssl], [AS_IF([test "x$found_openssl" = "xyes"], [ssl_impl=openssl], + [AC_MSG_ERROR([requested default ssl lib openssl, but openssl not found])] + )], + [gnutls], [AS_IF([test "x$found_gnutls" = "xyes"], [ssl_impl=gnutls], + [AC_MSG_ERROR([requested default ssl lib gnutls, but gnutls not found])] + )], + [no], [AC_MSG_ERROR([unsupported configuration --without-default-ssl])], + [yes], [AS_IF([test "x$found_openssl" = "xyes"], [ssl_impl=openssl], + [ssl_impl=gnutls])], + [AC_MSG_ERROR([Unknown ssl library $with_default_ssl])] +) +AC_MSG_RESULT([$ssl_impl]) + AC_ARG_WITH([examples], AS_HELP_STRING([--without-examples], [do not build example programs]), - [], + [with_examples=$withval], [with_examples=yes]) AM_CONDITIONAL([BUILD_EXAMPLES], [test "x$with_examples" != "xno"]) +dnl should not reach default case, bail out if it triggers +AS_CASE([$ssl_impl], + [openssl], [ + AC_SUBST([SSL_DEF_LDFLAGS], [$OPENSSL_LDFLAGS]) + AC_SUBST([SSL_DEF_INCLUDES], [$OPENSSL_INCLUDES]) + AC_SUBST([SSL_DEF_CFLAGS], [$OPENSSL_CFLAGS]) + AC_SUBST([SSL_DEF_LIBS], [$OPENSSL_LIBS]) + ], + [gnutls], [ + AC_SUBST([SSL_DEF_LDFLAGS], [$GNUTLS_LDFLAGS]) + AC_SUBST([SSL_DEF_INCLUDES], [$GNUTLS_INCLUDES]) + AC_SUBST([SSL_DEF_CFLAGS], [$GNUTLS_CFLAGS]) + AC_SUBST([SSL_DEF_LIBS], [$GNUTLS_LIBS]) + ], + [AC_MSG_ERROR([unable to set default ssl library])] +) +AM_CONDITIONAL([SSL_DEF_OPENSSL], [test "x$ssl_impl" = "xopenssl"]) +dnl currently unused, for additional ssl implementations +dnl AM_CONDITIONAL([SSL_DEF_GNUTLS], [test "x$ssl_impl" = "xgnutls"]) + PKG_CHECK_MODULES([JANSSON], [jansson >= 2.0]) PKG_CHECK_MODULES([CHECK], [check >= 0.9.4], [true], [true]) @@ -44,6 +122,13 @@ DX_PDF_FEATURE(OFF) DX_PS_FEATURE(OFF) DX_INIT_DOXYGEN($PACKAGE_NAME, doxygen.cfg) + +AM_COND_IF([MULTI_SSL], [ + AM_COND_IF([HAVE_OPENSSL], + [AC_CONFIG_FILES([libjwt/libjwt-ossl.pc])]) + AM_COND_IF([HAVE_GNUTLS], + [AC_CONFIG_FILES([libjwt/libjwt-gnutls.pc])]) + ]) AC_CONFIG_FILES([ Makefile include/Makefile diff --git a/libjwt/Makefile.am b/libjwt/Makefile.am index 7621428..b837d53 100644 --- a/libjwt/Makefile.am +++ b/libjwt/Makefile.am @@ -4,17 +4,51 @@ lib_LTLIBRARIES = libjwt.la libjwt_la_SOURCES = jwt.c base64.c -if HAVE_OPENSSL +if SSL_DEF_OPENSSL libjwt_la_SOURCES += jwt-openssl.c else +## SSL_DEF_GNUTLS libjwt_la_SOURCES += jwt-gnutls.c endif +if MULTI_SSL +if HAVE_OPENSSL +lib_LTLIBRARIES += libjwt-ossl.la +libjwt_ossl_la_SOURCES = jwt.c base64.c jwt-openssl.c +endif +if HAVE_GNUTLS +lib_LTLIBRARIES += libjwt-gnutls.la +libjwt_gnutls_la_SOURCES = jwt.c base64.c jwt-gnutls.c +endif +endif + # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html -libjwt_la_LDFLAGS = -version-info 11:0:9 $(OPENSSL_LDFLAGS) $(GNUTLS_LDFLAGS) $(JANSSON_LDFLAGS) -no-undefined -libjwt_la_CPPFLAGS = -I$(top_srcdir)/include $(OPENSSL_INCLUDES) $(GNUTLS_INCLUDES) $(CODE_COVERAGE_CPPFLAGS) -Wall -libjwt_la_CFLAGS = $(JANSSON_CFLAGS) $(OPENSSL_CFLAGS) $(GNUTLS_CFLAGS) $(CODE_COVERAGE_CFLAGS) -D_GNU_SOURCE -libjwt_la_LIBADD = $(JANSSON_LIBS) $(OPENSSL_LIBS) $(GNUTLS_LIBS) $(CODE_COVERAGE_LDFLAGS) +libjwt_la_LDFLAGS = -version-info $(LIBJWT_LTVERSION) $(SSL_DEF_LDFLAGS) $(JANSSON_LDFLAGS) -no-undefined +libjwt_la_CPPFLAGS = -I$(top_srcdir)/include $(SSL_DEF_INCLUDES) $(CODE_COVERAGE_CPPFLAGS) -Wall +libjwt_la_CFLAGS = $(JANSSON_CFLAGS) $(SSL_DEF_CFLAGS) $(CODE_COVERAGE_CFLAGS) -D_GNU_SOURCE +libjwt_la_LIBADD = $(JANSSON_LIBS) $(SSL_DEF_LIBS) $(CODE_COVERAGE_LDFLAGS) +if MULTI_SSL +if HAVE_OPENSSL +libjwt_ossl_la_LDFLAGS = -version-info $(LIBJWT_LTVERSION) $(OPENSSL_LDFLAGS) $(JANSSON_LDFLAGS) -no-undefined +libjwt_ossl_la_CPPFLAGS = -I$(top_srcdir)/include $(OPENSSL_INCLUDES) $(CODE_COVERAGE_CPPFLAGS) -Wall +libjwt_ossl_la_CFLAGS = $(JANSSON_CFLAGS) $(OPENSSL_CFLAGS) $(CODE_COVERAGE_CFLAGS) -D_GNU_SOURCE +libjwt_ossl_la_LIBADD = $(JANSSON_LIBS) $(OPENSSL_LIBS) $(CODE_COVERAGE_LDFLAGS) +endif +if HAVE_GNUTLS +libjwt_gnutls_la_LDFLAGS = -version-info $(LIBJWT_LTVERSION) $(GNUTLS_LDFLAGS) $(JANSSON_LDFLAGS) -no-undefined +libjwt_gnutls_la_CPPFLAGS = -I$(top_srcdir)/include $(GNUTLS_INCLUDES) $(CODE_COVERAGE_CPPFLAGS) -Wall +libjwt_gnutls_la_CFLAGS = $(JANSSON_CFLAGS) $(GNUTLS_CFLAGS) $(CODE_COVERAGE_CFLAGS) -D_GNU_SOURCE +libjwt_gnutls_la_LIBADD = $(JANSSON_LIBS) $(GNUTLS_LIBS) $(CODE_COVERAGE_LDFLAGS) +endif +endif pkgconfiglibdir = $(libdir)/pkgconfig pkgconfiglib_DATA = libjwt.pc +if MULTI_SSL +if HAVE_OPENSSL +pkgconfiglib_DATA += libjwt-ossl.pc +endif +if HAVE_GNUTLS +pkgconfiglib_DATA += libjwt-gnutls.pc +endif +endif diff --git a/libjwt/libjwt-gnutls.pc.in b/libjwt/libjwt-gnutls.pc.in new file mode 100644 index 0000000..63962ee --- /dev/null +++ b/libjwt/libjwt-gnutls.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: @PACKAGE_NAME@ +Description: JWT C Library +Version: @PACKAGE_VERSION@ + +Cflags: -I${includedir} +Libs: -L${libdir} -ljwt-gnutls +Libs.private: @JANSSON_LIBS@ @GNUTLS_LIBS@ diff --git a/libjwt/libjwt-ossl.pc.in b/libjwt/libjwt-ossl.pc.in new file mode 100644 index 0000000..98c0ebe --- /dev/null +++ b/libjwt/libjwt-ossl.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: @PACKAGE_NAME@ +Description: JWT C Library +Version: @PACKAGE_VERSION@ + +Cflags: -I${includedir} +Libs: -L${libdir} -ljwt-ossl +Libs.private: @JANSSON_LIBS@ @OPENSSL_LIBS@ diff --git a/libjwt/libjwt.pc.in b/libjwt/libjwt.pc.in index 0c81d36..0bb64f4 100644 --- a/libjwt/libjwt.pc.in +++ b/libjwt/libjwt.pc.in @@ -9,4 +9,4 @@ Version: @PACKAGE_VERSION@ Cflags: -I${includedir} Libs: -L${libdir} -ljwt -Libs.private: @JANSSON_LIBS@ @OPENSSL_LIBS@ +Libs.private: @JANSSON_LIBS@ @SSL_DEF_LIBS@ diff --git a/tests/Makefile.am b/tests/Makefile.am index 58860ac..57a6444 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -10,6 +10,14 @@ TESTS = \ jwt_ec \ jwt_validate +if MULTI_SSL +if HAVE_OPENSSL +include ossl_tests.mk +endif +if HAVE_GNUTLS +include gnutls_tests.mk +endif +endif check_PROGRAMS = $(TESTS) AM_CPPFLAGS = -I$(top_srcdir)/include diff --git a/tests/gnutls_tests.mk b/tests/gnutls_tests.mk new file mode 100644 index 0000000..b16b8ef --- /dev/null +++ b/tests/gnutls_tests.mk @@ -0,0 +1,32 @@ +## for jwttest in $(jwttests) +## do +## TESTS += $(sslimpl)_$(jwttest) +## $(sslimpl)_$(jwttest)_SOURCES = $(jwttest).c +## $(sslimpl)_$(jwttest)_LDADD = -ljwt-$(sslimpl) $(CHECK_LIBS) +## done + +TESTS += gnutls_jwt_new +gnutls_jwt_new_SOURCES = jwt_new.c +gnutls_jwt_new_LDADD = -ljwt-gnutls $(CHECK_LIBS) +TESTS += gnutls_jwt_grant +gnutls_jwt_grant_SOURCES = jwt_grant.c +gnutls_jwt_grant_LDADD = -ljwt-gnutls $(CHECK_LIBS) +TESTS += gnutls_jwt_header +gnutls_jwt_header_SOURCES = jwt_header.c +gnutls_jwt_header_LDADD = -ljwt-gnutls $(CHECK_LIBS) +TESTS += gnutls_jwt_dump +gnutls_jwt_dump_SOURCES = jwt_dump.c +gnutls_jwt_dump_LDADD = -ljwt-gnutls $(CHECK_LIBS) +TESTS += gnutls_jwt_encode +gnutls_jwt_encode_SOURCES = jwt_encode.c +gnutls_jwt_encode_LDADD = -ljwt-gnutls $(CHECK_LIBS) +TESTS += gnutls_jwt_rsa +gnutls_jwt_rsa_SOURCES = jwt_rsa.c +gnutls_jwt_rsa_LDADD = -ljwt-gnutls $(CHECK_LIBS) +TESTS += gnutls_jwt_ec +gnutls_jwt_ec_SOURCES = jwt_ec.c +gnutls_jwt_ec_LDADD = -ljwt-gnutls $(CHECK_LIBS) +TESTS += gnutls_jwt_validate +gnutls_jwt_validate_SOURCES = jwt_validate.c +gnutls_jwt_validate_LDADD = -ljwt-gnutls $(CHECK_LIBS) + diff --git a/tests/ossl_tests.mk b/tests/ossl_tests.mk new file mode 100644 index 0000000..5c360c4 --- /dev/null +++ b/tests/ossl_tests.mk @@ -0,0 +1,32 @@ +## for jwttest in $(jwttests) +## do +## TESTS += $(sslimpl)_$(jwttest) +## $(sslimpl)_$(jwttest)_SOURCES = $(jwttest).c +## $(sslimpl)_$(jwttest)_LDADD = -ljwt-$(sslimpl) $(CHECK_LIBS) +## done + +TESTS += ossl_jwt_new +ossl_jwt_new_SOURCES = jwt_new.c +ossl_jwt_new_LDADD = -ljwt-ossl $(CHECK_LIBS) +TESTS += ossl_jwt_grant +ossl_jwt_grant_SOURCES = jwt_grant.c +ossl_jwt_grant_LDADD = -ljwt-ossl $(CHECK_LIBS) +TESTS += ossl_jwt_header +ossl_jwt_header_SOURCES = jwt_header.c +ossl_jwt_header_LDADD = -ljwt-ossl $(CHECK_LIBS) +TESTS += ossl_jwt_dump +ossl_jwt_dump_SOURCES = jwt_dump.c +ossl_jwt_dump_LDADD = -ljwt-ossl $(CHECK_LIBS) +TESTS += ossl_jwt_encode +ossl_jwt_encode_SOURCES = jwt_encode.c +ossl_jwt_encode_LDADD = -ljwt-ossl $(CHECK_LIBS) +TESTS += ossl_jwt_rsa +ossl_jwt_rsa_SOURCES = jwt_rsa.c +ossl_jwt_rsa_LDADD = -ljwt-ossl $(CHECK_LIBS) +TESTS += ossl_jwt_ec +ossl_jwt_ec_SOURCES = jwt_ec.c +ossl_jwt_ec_LDADD = -ljwt-ossl $(CHECK_LIBS) +TESTS += ossl_jwt_validate +ossl_jwt_validate_SOURCES = jwt_validate.c +ossl_jwt_validate_LDADD = -ljwt-ossl $(CHECK_LIBS) +