[network-manager-applet/lr/pkcs11: 10/15] build: optionally build with the GCR support



commit b179a357db8c551d3e9e4f856328259f3cf3b454
Author: Lubomir Rintel <lkundrak v3 sk>
Date:   Sun Feb 19 13:14:52 2017 +0000

    build: optionally build with the GCR support
    
    This will be useful for the PKCS#11 token support.
    
    Unfortunatelly, GCR API is declared subject to change despite being in
    active use and not having changed in years. This is not a problem --
    if GCR ever deprecates this API, chances are it will provide a
    certificate chooser too and we'll be just able to drop ours. It doesn't
    seem like happening anytime soon.
    
    Let's do an extensive check of how good the available GCR version is and
    disable it if it's not good enough. We'll provide a sensible fallback
    anyway.

 Makefile.am  |    6 +++-
 configure.ac |   69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+), 2 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 048c58a..56bd483 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -523,13 +523,15 @@ src_libnma_libnma_la_CFLAGS = \
        "-I$(srcdir)/src/libnma" \
        $(GTK_CFLAGS) \
        $(LIBNM_CFLAGS) \
-       $(GUDEV_CFLAGS)
+       $(GUDEV_CFLAGS) \
+       $(GCR_CFLAGS)
 
 src_libnma_libnma_la_LIBADD = \
        src/wireless-security/libwireless-security-libnm.la \
        $(GTK_LIBS) \
        $(LIBNM_LIBS) \
-       $(GUDEV_LIBS)
+       $(GUDEV_LIBS) \
+       $(GCR_LIBS)
 
 EXTRA_src_libnma_libnma_la_DEPENDENCIES = src/libnma/libnma.ver
 
diff --git a/configure.ac b/configure.ac
index d73365e..9d5a2ac 100644
--- a/configure.ac
+++ b/configure.ac
@@ -165,6 +165,74 @@ else
 fi
 AM_CONDITIONAL(WITH_JANSSON, test "${with_team}" != "no")
 
+if (test "${with_gcr}" == "no"); then
+    have_gcr=no
+else
+    PKG_CHECK_MODULES(GCR,
+                      [gcr-3 >= 3.14, gck-1 >= 3.14],
+                      dnl GCR API is declared subject to change, do an extensive check of the prototypes
+                      GCR_CFLAGS="$GCR_CFLAGS -DGCR_API_SUBJECT_TO_CHANGE -DGCK_API_SUBJECT_TO_CHANGE"
+                      CFLAGS_SAVED="$CFLAGS"
+                      CFLAGS="$CFLAGS $GCR_CFLAGS"
+                      AC_MSG_CHECKING([for GCR usefulness])
+                      AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+                                        #include <gcr/gcr.h>
+                                        #include <gck/gck.h>
+
+                                        const GckAttribute *gck_attributes_find (GckAttributes *attrs, 
gulong attr_type);
+                                        gboolean gck_attributes_find_string (GckAttributes *attrs, gulong 
attr_type, gchar **value);
+                                        gboolean gck_attributes_find_ulong (GckAttributes *attrs, gulong 
attr_type, gulong *value);
+                                        GckAttributes *gck_attributes_new_empty (gulong first_type, ...);
+                                        void gck_attributes_unref (gpointer attrs);
+                                        void gck_builder_add_all (GckBuilder *builder, GckAttributes *attrs);
+                                        void gck_builder_add_only (GckBuilder *builder, GckAttributes 
*attrs, gulong only_type, ...);
+                                        GckAttributes *gck_builder_end (GckBuilder *builder);
+                                        GckBuilder *gck_builder_new (GckBuilderFlags flags);
+                                        void gck_enumerator_next_async (GckEnumerator *self, gint 
max_objects, GCancellable *cancellable,
+                                                                        GAsyncReadyCallback callback, 
gpointer user_data);
+                                        GList *gck_enumerator_next_finish (GckEnumerator *self, GAsyncResult 
*result, GError **error);
+                                        void gck_list_unref_free (GList *reflist);
+                                        GList *gck_modules_get_slots (GList *modules, gboolean 
token_present);
+                                        void gck_modules_initialize_registered_async (GCancellable 
*cancellable, GAsyncReadyCallback callback,
+                                                                                      gpointer user_data);
+                                        GList *gck_modules_initialize_registered_finish (GAsyncResult 
*result, GError **error);
+                                        void gck_object_get_async (GckObject *self, const gulong 
*attr_types, guint n_attr_types,
+                                                                   GCancellable *cancellable, 
GAsyncReadyCallback callback, gpointer user_data);
+                                        GckAttributes *gck_object_get_finish (GckObject *self, GAsyncResult 
*result, GError **error);
+                                        void gck_session_login_async (GckSession *self, gulong user_type, 
const guchar *pin,
+                                                                      gsize n_pin, GCancellable *cancellable,
+                                                                      GAsyncReadyCallback callback, gpointer 
user_data);
+                                        gboolean gck_session_login_finish (GckSession *self, GAsyncResult 
*result, GError **error);
+                                        GckSlotInfo *gck_slot_get_info (GckSlot *self);
+                                        GckTokenInfo *gck_slot_get_token_info (GckSlot *self);
+                                        void gck_slot_open_session_async (GckSlot *self, GckSessionOptions 
options, GCancellable *cancellable,
+                                                                          GAsyncReadyCallback callback, 
gpointer user_data);
+                                        GckSession *gck_slot_open_session_finish (GckSlot *self, 
GAsyncResult *result, GError **error);
+                                        void gck_token_info_free (GckTokenInfo *token_info);
+                                        gchar *gck_uri_build (GckUriData *uri_data, GckUriFlags flags);
+                                        void gck_uri_data_free (GckUriData *uri_data);
+                                        GckUriData *gck_uri_parse (const gchar *string, GckUriFlags flags, 
GError **error);
+                                        gchar *gcr_certificate_get_issuer_name (GcrCertificate *self);
+                                        gchar *gcr_certificate_get_subject_name (GcrCertificate *self);
+                                        GcrCertificate *gcr_simple_certificate_new (const guchar *data, 
gsize n_data);
+                                        ])],
+                                        have_gcr=yes,
+                                        have_gcr=no)
+                      AC_MSG_RESULT(${have_gcr})
+                      CFLAGS="$CFLAGS_SAVED",
+                      have_gcr=no);
+fi
+
+if (test "${have_gcr}" == "yes"); then
+     AC_DEFINE(WITH_GCR, 1, [Define if Gcr is available])
+else
+    if (test "${with_gcr}" == "yes"); then
+        AC_MSG_ERROR([gcr support was requested, but the gcr library is not available.])
+    fi
+    AC_DEFINE(WITH_GCR, 0, [Define if Gcr is available])
+fi
+AM_CONDITIONAL(WITH_GCR, test "${have_gcr}" == "yes")
+
 dnl Check for gobject introspection
 GOBJECT_INTROSPECTION_CHECK([0.9.6])
 
@@ -205,6 +273,7 @@ AC_OUTPUT
 
 echo ""
 echo "  Build legacy library libnm-gtk: --with-libnm-gtk=${with_libnm_gtk}"
+echo "  GCR: --with-gcr=$have_gcr"
 echo "  LTO: --enable-lto=$enable_lto"
 echo "  Linker garbage collection: --enable-ld-gc=$enable_ld_gc"
 echo ""


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]