diff --git a/libpurple/protocols/irc/irc.h b/libpurple/protocols/irc/irc.h
--- a/libpurple/protocols/irc/irc.h
+++ b/libpurple/protocols/irc/irc.h
@@ -26,9 +26,7 @@
 
 #include <config.h>
 
-#ifdef HAVE_CYRUS_SASL
 #include <sasl/sasl.h>
-#endif
 
 #include <purple.h>
 
@@ -97,13 +95,11 @@
 	char *mode_chars;
 	char *reqnick;
 	gboolean nickused;
-#ifdef HAVE_CYRUS_SASL
 	sasl_conn_t *sasl_conn;
 	const char *current_mech;
 	GString *sasl_mechs;
 	gboolean mech_works;
 	sasl_callback_t *sasl_cb;
-#endif
 };
 
 struct irc_buddy {
@@ -181,14 +177,12 @@
 void irc_msg_wallops(struct irc_conn *irc, const char *name, const char *from, char **args);
 void irc_msg_whois(struct irc_conn *irc, const char *name, const char *from, char **args);
 void irc_msg_who(struct irc_conn *irc, const char *name, const char *from, char **args);
-#ifdef HAVE_CYRUS_SASL
 void irc_msg_cap(struct irc_conn *irc, const char *name, const char *from, char **args);
 void irc_msg_auth(struct irc_conn *irc, char *arg);
 void irc_msg_authenticate(struct irc_conn *irc, const char *name, const char *from, char **args);
 void irc_msg_authok(struct irc_conn *irc, const char *name, const char *from, char **args);
 void irc_msg_authtryagain(struct irc_conn *irc, const char *name, const char *from, char **args);
 void irc_msg_authfail(struct irc_conn *irc, const char *name, const char *from, char **args);
-#endif
 
 void irc_cmd_table_build(struct irc_conn *irc);
 
# HG changeset patch
# Node ID 07f2e71134d1
# Parent  74a04628357f
diff --git a/libpurple/protocols/irc/irc.c b/libpurple/protocols/irc/irc.c
--- a/libpurple/protocols/irc/irc.c
+++ b/libpurple/protocols/irc/irc.c
@@ -413,7 +413,6 @@
 	option = purple_account_option_bool_new(_("Use SSL"), "ssl", FALSE);
 	opts = g_list_append(opts, option);
 
-#ifdef HAVE_CYRUS_SASL
 	option = purple_account_option_bool_new(_("Authenticate with SASL"),
 	                                        "sasl", FALSE);
 	opts = g_list_append(opts, option);
@@ -422,7 +421,6 @@
 	                                          "unencrypted connection"),
 	                                        "auth_plain_in_clear", FALSE);
 	opts = g_list_append(opts, option);
-#endif
 
 	return opts;
 }
@@ -601,16 +599,12 @@
 	const char *nickname, *identname, *realname;
 	struct irc_conn *irc = purple_connection_get_protocol_data(gc);
 	const char *pass = purple_connection_get_password(gc);
-#ifdef HAVE_CYRUS_SASL
 	const gboolean use_sasl = purple_account_get_bool(irc->account, "sasl", FALSE);
-#endif
 
 	if (pass && *pass) {
-#ifdef HAVE_CYRUS_SASL
 		if (use_sasl)
 			buf = irc_format(irc, "vv:", "CAP", "REQ", "sasl");
-		else /* intended to fall through */
-#endif
+		else
 			buf = irc_format(irc, "v:", "PASS", pass);
 		if (irc_send(irc, buf) < 0) {
 			g_free(buf);
@@ -728,7 +722,6 @@
 	g_free(irc->mode_chars);
 	g_free(irc->reqnick);
 
-#ifdef HAVE_CYRUS_SASL
 	if (irc->sasl_conn) {
 		sasl_dispose(&irc->sasl_conn);
 		irc->sasl_conn = NULL;
@@ -736,7 +729,6 @@
 	g_free(irc->sasl_cb);
 	if(irc->sasl_mechs)
 		g_string_free(irc->sasl_mechs, TRUE);
-#endif
 
 
 	g_free(irc);
diff --git a/libpurple/protocols/irc/msgs.c b/libpurple/protocols/irc/msgs.c
--- a/libpurple/protocols/irc/msgs.c
+++ b/libpurple/protocols/irc/msgs.c
@@ -35,9 +35,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#ifdef HAVE_CYRUS_SASL
 #include <sasl/sasl.h>
-#endif
 
 static char *irc_mask_nick(const char *mask);
 static char *irc_mask_userhost(const char *mask);
@@ -49,9 +47,7 @@
                                    const char *from, const char *to,
                                    const char *rawmsg, gboolean notice);
 
-#ifdef HAVE_CYRUS_SASL
 static void irc_sasl_finish(struct irc_conn *irc);
-#endif
 
 static char *irc_mask_nick(const char *mask)
 {
@@ -1464,7 +1460,6 @@
 	g_free(msg);
 }
 
-#ifdef HAVE_CYRUS_SASL
 static int
 irc_sasl_cb_secret(sasl_conn_t *conn, void *ctx, int id, sasl_secret_t **secret)
 {
@@ -1862,4 +1857,3 @@
 	irc_send(irc, buf);
 	g_free(buf);
 }
-#endif
diff --git a/libpurple/protocols/irc/parse.c b/libpurple/protocols/irc/parse.c
--- a/libpurple/protocols/irc/parse.c
+++ b/libpurple/protocols/irc/parse.c
@@ -104,7 +104,6 @@
 	{ "501", "n:", 2, irc_msg_badmode },		/* Unknown mode flag		*/
 	{ "506", "nc:", 3, irc_msg_nosend },		/* Must identify to send	*/
 	{ "515", "nc:", 3, irc_msg_regonly },		/* Registration required	*/
-#ifdef HAVE_CYRUS_SASL
 	{ "903", "*", 0, irc_msg_authok},		/* SASL auth successful		*/
 	{ "904", "*", 0, irc_msg_authtryagain },	/* SASL auth failed, can recover*/
 	{ "905", "*", 0, irc_msg_authfail },		/* SASL auth failed		*/
@@ -112,7 +111,6 @@
 	{ "907", "*", 0, irc_msg_authfail },		/* SASL auth failed		*/
 	{ "cap", "vv:", 3, irc_msg_cap },		/* SASL capable			*/
 	{ "authenticate", ":", 1, irc_msg_authenticate }, /* SASL authenticate		*/
-#endif
 	{ "invite", "n:", 2, irc_msg_invite },		/* Invited			*/
 	{ "join", ":", 1, irc_msg_join },		/* Joined a channel		*/
 	{ "kick", "cn:", 3, irc_msg_kick },		/* KICK				*/
@@ -715,11 +713,9 @@
 		}
 		purple_connection_take_error(gc, error);
 		return;
-#ifdef HAVE_CYRUS_SASL
 	} else if (!strncmp(input, "AUTHENTICATE ", 13)) {
 		irc_msg_auth(irc, input + 13);
 		return;
-#endif
 	}
 
 	if (input[0] != ':' || (cur = strchr(input, ' ')) == NULL) {
diff --git a/libpurple/protocols/jabber/auth.h b/libpurple/protocols/jabber/auth.h
--- a/libpurple/protocols/jabber/auth.h
+++ b/libpurple/protocols/jabber/auth.h
@@ -56,9 +56,7 @@
 JabberSaslMech *jabber_auth_get_plain_mech(void);
 JabberSaslMech *jabber_auth_get_digest_md5_mech(void);
 JabberSaslMech **jabber_auth_get_scram_mechs(gint *count);
-#ifdef HAVE_CYRUS_SASL
 JabberSaslMech *jabber_auth_get_cyrus_mech(void);
-#endif
 JabberSaslMech *jabber_auth_get_webex_token_mech(void);
 
 void jabber_auth_add_mech(JabberSaslMech *);
diff --git a/libpurple/protocols/jabber/auth.c b/libpurple/protocols/jabber/auth.c
--- a/libpurple/protocols/jabber/auth.c
+++ b/libpurple/protocols/jabber/auth.c
@@ -73,7 +73,6 @@
 		_("Server requires plaintext authentication over an unencrypted stream"));
 }
 
-#ifdef HAVE_CYRUS_SASL
 static void
 auth_old_pass_cb(PurpleConnection *gc, PurpleRequestFields *fields)
 {
@@ -122,7 +121,6 @@
 	/* Disable the account as the user has cancelled connecting */
 	purple_account_set_enabled(purple_connection_get_account(gc), FALSE);
 }
-#endif
 
 void
 jabber_auth_start(JabberStream *js, PurpleXmlNode *packet)
@@ -366,17 +364,14 @@
 		js->user->resource = g_strdup("Home");
 	}
 
-#ifdef HAVE_CYRUS_SASL
-	/* If we have Cyrus SASL, then passwords will have been set
-	 * to OPTIONAL for this protocol. So, we need to do our own
-	 * password prompting here
+	/* With Cyrus SASL, passwords are optional for this protocol. So, we need to
+	 * do our own password prompting here
 	 */
 
 	if (!purple_connection_get_password(js->gc)) {
 		purple_account_request_password(account, G_CALLBACK(auth_old_pass_cb), G_CALLBACK(auth_no_pass_cb), js->gc);
 		return;
 	}
-#endif
 	iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:auth");
 
 	query = purple_xmlnode_get_child(iq->node, "query");
@@ -519,9 +514,7 @@
 
 	jabber_auth_add_mech(jabber_auth_get_plain_mech());
 	jabber_auth_add_mech(jabber_auth_get_digest_md5_mech());
-#ifdef HAVE_CYRUS_SASL
 	jabber_auth_add_mech(jabber_auth_get_cyrus_mech());
-#endif
 #ifdef HAVE_WEBEX_TOKEN
 	jabber_auth_add_mech(jabber_auth_get_webex_token_mech());
 #endif
diff --git a/libpurple/protocols/jabber/jabber.h b/libpurple/protocols/jabber/jabber.h
--- a/libpurple/protocols/jabber/jabber.h
+++ b/libpurple/protocols/jabber/jabber.h
@@ -69,9 +69,7 @@
 #include "buddy.h"
 #include "bosh.h"
 
-#ifdef HAVE_CYRUS_SASL
 #include <sasl/sasl.h>
-#endif
 
 #define CAPS0115_NODE "https://pidgin.im/"
 
@@ -196,7 +194,6 @@
 
 	char *serverFQDN;
 
-#ifdef HAVE_CYRUS_SASL
 	sasl_conn_t *sasl;
 	sasl_callback_t *sasl_cb;
 	sasl_secret_t *sasl_secret;
@@ -208,7 +205,6 @@
 	GString *sasl_mechs;
 
 	gchar *sasl_password;
-#endif
 
 	gboolean unregistration;
 	PurpleAccountUnregistrationCb unregistration_cb;
diff --git a/libpurple/protocols/jabber/jabber.c b/libpurple/protocols/jabber/jabber.c
--- a/libpurple/protocols/jabber/jabber.c
+++ b/libpurple/protocols/jabber/jabber.c
@@ -463,7 +463,6 @@
 
 	/* If we've got a security layer, we need to encode the data,
 	 * splitting it on the maximum buffer length negotiated */
-#ifdef HAVE_CYRUS_SASL
 	if (js->sasl_maxbuf>0) {
 		int pos = 0;
 
@@ -502,7 +501,6 @@
 		}
 		return;
 	}
-#endif
 
 	if (js->bosh)
 		jabber_bosh_connection_send(js->bosh, data);
@@ -618,7 +616,6 @@
 		}
 
 		purple_connection_update_last_received(gc);
-#ifdef HAVE_CYRUS_SASL
 		if (js->sasl_maxbuf > 0) {
 			const char *out;
 			unsigned int olen;
@@ -643,7 +640,6 @@
 			}
 			return G_SOURCE_CONTINUE;
 		}
-#endif
 		buf[len] = '\0';
 		purple_debug_misc("jabber", "Recv (%" G_GSSIZE_FORMAT "): %s", len,
 		                  buf);
@@ -1588,7 +1584,6 @@
 
 	if (js->auth_mech && js->auth_mech->dispose)
 		js->auth_mech->dispose(js);
-#ifdef HAVE_CYRUS_SASL
 	if(js->sasl)
 		sasl_dispose(&js->sasl);
 	if(js->sasl_mechs)
@@ -1597,7 +1592,6 @@
 	/* Note: _not_ g_free.  See auth_cyrus.c:jabber_sasl_cb_secret */
 	free(js->sasl_secret);
 	g_free(js->sasl_password);
-#endif
 	g_free(js->serverFQDN);
 	g_list_free_full(js->commands, (GDestroyNotify)jabber_adhoc_commands_free);
 	g_free(js->server_name);
@@ -3638,7 +3632,6 @@
 	const gchar *type = "pc"; /* default client type, if unknown or
 								unspecified */
 	const gchar *ui_name = NULL;
-#ifdef HAVE_CYRUS_SASL
 	/* We really really only want to do this once per process */
 	static gboolean sasl_initialized = FALSE;
 #ifdef _WIN32
@@ -3646,10 +3639,8 @@
 	gchar *sasldir;
 #endif
 	int ret;
-#endif
 
 	/* XXX - If any other plugin wants SASL this won't be good ... */
-#ifdef HAVE_CYRUS_SASL
 	if (!sasl_initialized) {
 		sasl_initialized = TRUE;
 #ifdef _WIN32
@@ -3667,7 +3658,6 @@
 		SetErrorMode(old_error_mode);
 #endif
 	}
-#endif
 
 	jabber_cmds = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, cmds_free_func);
 
diff --git a/libpurple/protocols/jabber/xmpp.c b/libpurple/protocols/jabber/xmpp.c
--- a/libpurple/protocols/jabber/xmpp.c
+++ b/libpurple/protocols/jabber/xmpp.c
@@ -129,11 +129,8 @@
 	PurpleProtocolOptions options;
 
 	options = OPT_PROTO_CHAT_TOPIC | OPT_PROTO_UNIQUE_CHATNAME |
-	          OPT_PROTO_MAIL_CHECK | OPT_PROTO_SLASH_COMMANDS_NATIVE;
-
-#ifdef HAVE_CYRUS_SASL
-	options |= OPT_PROTO_PASSWORD_OPTIONAL;
-#endif
+	          OPT_PROTO_MAIL_CHECK | OPT_PROTO_SLASH_COMMANDS_NATIVE |
+	          OPT_PROTO_PASSWORD_OPTIONAL;
 
 	return PURPLE_PROTOCOL(g_object_new(
 		XMPP_TYPE_PROTOCOL,
diff --git a/meson.build b/meson.build
--- a/meson.build
+++ b/meson.build
@@ -577,8 +577,7 @@
 	conf.set('HAVE_' + func.to_upper(),
 	    compiler.has_function(func))
 endforeach
-sasl = dependency('libsasl2', version : '>= 2.0', required : get_option('cyrus-sasl'))
-conf.set('HAVE_CYRUS_SASL', sasl.found())
+sasl = dependency('libsasl2', version : '>= 2.0')
 
 #######################################################################
 # Check for external libzephyr
diff --git a/meson_options.txt b/meson_options.txt
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -40,9 +40,6 @@
 option('avahi', type : 'feature',
        description : 'compile with avahi (required for Bonjour support)')
 
-option('cyrus-sasl', type : 'feature',
-       description : 'enable Cyrus SASL support for XMPP/IRC')
-
 option('dynamic-prpls', type : 'string', value: 'all',
        description : 'specify which protocols to build dynamically')
 
