changeset 1098:6c15d37b7518

cmake: switch back to CMake because of portability issues
author David Demelier <markand@malikania.fr>
date Wed, 22 Sep 2021 15:44:36 +0200
parents 617c88eb9da9
children 2c0eea3af7df
files .hgignore CMakeLists.txt cmake/IrccdDefinePlugin.cmake examples/CMakeLists.txt extern/libduktape/CMakeLists.txt extern/libgreatest/CMakeLists.txt extern/libketopt/CMakeLists.txt extern/libutlist/CMakeLists.txt irccd/CMakeLists.txt irccdctl/CMakeLists.txt lib/CMakeLists.txt lib/irccd/config.h.in lib/irccd/server.c man/CMakeLists.txt plugins/CMakeLists.txt plugins/ask/CMakeLists.txt plugins/auth/CMakeLists.txt plugins/hangman/CMakeLists.txt plugins/history/CMakeLists.txt plugins/joke/CMakeLists.txt plugins/links/CMakeLists.txt plugins/logger/CMakeLists.txt plugins/plugin/CMakeLists.txt plugins/roulette/CMakeLists.txt plugins/tictactoe/CMakeLists.txt tests/CMakeLists.txt tests/data/example-dl-plugin.c tests/test-dl-plugin.c
diffstat 28 files changed, 946 insertions(+), 68 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Mon Sep 20 10:06:54 2021 +0200
+++ b/.hgignore	Wed Sep 22 15:44:36 2021 +0200
@@ -1,53 +1,13 @@
-# temporary files.
-\.a$
-\.d$
-\.o$
-\.so$
+# CMake files.
+^build
 
 # vim/emacs specific.
 ^tags$
-^cscope\.out$
 ^tags\.lock$
 ^tags\.temp$
+^cscope\.out$
 \.swp$
 \.swo$
 
-# executables.
-^irccd/irccd$
-^irccdctl/irccdctl$
-
-# generated files.
-^irccd/conf\.c$
-^irccd/conf\.h$
-^irccd/lex\.c$
-^lib/irccd/config\.h$
-
 # macOS specific.
 \.DS_Store$
-\.dSYM
-
-# tests files.
-^tests/test-bot$
-^tests/test-channel$
-^tests/test-dl-plugin$
-^tests/test-event$
-^tests/test-jsapi-chrono$
-^tests/test-jsapi-directory$
-^tests/test-jsapi-file$
-^tests/test-jsapi-irccd$
-^tests/test-jsapi-system$
-^tests/test-jsapi-timer$
-^tests/test-jsapi-unicode$
-^tests/test-jsapi-util$
-^tests/test-log$
-^tests/test-plugin-ask$
-^tests/test-plugin-auth$
-^tests/test-plugin-hangman$
-^tests/test-plugin-history$
-^tests/test-plugin-joke$
-^tests/test-plugin-logger$
-^tests/test-plugin-plugin$
-^tests/test-plugin-tictactoe$
-^tests/test-rule$
-^tests/test-subst$
-^tests/test-util$
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,75 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+cmake_minimum_required(VERSION 2.20)
+cmake_policy(SET CMP0048 NEW)
+project(irccd
+	LANGUAGES C
+	DESCRIPTION "IRC Client Daemon"
+	HOMEPAGE_URL "http://projects.malikania.fr/irccd"
+	VERSION 4.0.0
+)
+
+set_property(GLOBAL PROPERTY USE_FOLDERS On)
+
+set(CMAKE_C_STANDARD 11)
+set(CMAKE_C_STANDARD_REQUIRED On)
+set(CMAKE_C_EXTENSIONS Off)
+
+if (CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
+	set(CMAKE_C_FLAGS "-Wall -Wextra -pedantic ${CMAKE_C_FLAGS}")
+endif ()
+
+option(IRCCD_WITH_EXAMPLES "Enable example files" On)
+option(IRCCD_WITH_JS "Enable Javascript" On)
+option(IRCCD_WITH_MAN "Enable manual pages" On)
+option(IRCCD_WITH_SSL "Enable SSL (requires OpenSSL)" On)
+option(IRCCD_WITH_TESTS "Enable unit tests" On)
+
+include(GNUInstallDirs)
+
+include(cmake/IrccdDefinePlugin.cmake)
+
+if (IRCCD_WITH_SSL)
+	find_package(OpenSSL REQUIRED)
+endif ()
+
+if (IRCCD_WITH_JS)
+	add_subdirectory(extern/libduktape)
+endif ()
+
+add_subdirectory(extern/libutlist)
+add_subdirectory(extern/libketopt)
+
+add_subdirectory(lib)
+add_subdirectory(irccd)
+add_subdirectory(irccdctl)
+add_subdirectory(plugins)
+
+if (IRCCD_WITH_EXAMPLES)
+	add_subdirectory(examples)
+endif ()
+if (IRCCD_WITH_MAN)
+	add_subdirectory(man)
+endif ()
+
+if (IRCCD_WITH_TESTS)
+	enable_testing()
+	add_subdirectory(extern/libgreatest)
+	add_subdirectory(tests)
+endif ()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake/IrccdDefinePlugin.cmake	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,85 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+function(irccd_define_native_plugin)
+	set(options "")
+	set(oneValueArgs "MAN;NAME")
+	set(multiValueArgs "FLAGS;INCLUDES;LIBRARIES;SOURCES")
+
+	cmake_parse_arguments(PLG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+	if (NOT PLG_NAME)
+		message(FATAL_ERROR "Missing NAME")
+	elseif (NOT PLG_SOURCES)
+		message(FATAL_ERROR "Missing SOURCES")
+	endif ()
+
+	add_library(irccd-plugin-${PLG_NAME} MODULE ${PLG_SOURCES} ${PLG_MAN})
+	target_link_libraries(irccd-plugin-${PLG_NAME} irccd)
+
+	if (PLG_FLAGS)
+		target_compile_definitions(irccd-plugin-${PLG_NAME} ${PLG_FLAGS})
+	endif ()
+	if (PLG_INCLUDES)
+		target_include_directories(irccd-plugin-${PLG_NAME} ${PLG_INCLUDES})
+	endif ()
+	if (PLG_LIBRARIES)
+		target_link_libraries(irccd-plugin-${PLG_NAME} ${PLG_LIBRARIES})
+	endif ()
+
+	set_target_properties(
+		irccd-plugin-${PLG_NAME}
+		PROPERTIES
+			OUTPUT_NAME ${PLG_NAME}
+			PREFIX ""
+			FOLDER plugins
+	)
+
+	install(
+		TARGETS irccd-plugin-${PLG_NAME}
+		LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/irccd
+	)
+
+	if (PLG_MAN)
+		install(
+			FILES ${PLG_MAN}
+			DESTINATION ${CMAKE_INSTALL_MANDIR}/man7
+			RENAME irccd-plugin-${PLG_NAME}.7
+		)
+	endif ()
+endfunction()
+
+function(irccd_define_javascript_plugin)
+	set(options "")
+	set(oneValueArgs "MAN;NAME")
+	set(multiValueArgs "SCRIPT")
+
+	cmake_parse_arguments(PLG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+	add_custom_target(irccd-plugin-${PLG_NAME} SOURCES ${PLG_SCRIPT})
+	set_target_properties(irccd-plugin-${PLG_NAME} PROPERTIES FOLDER plugins)
+	install(FILES ${PLG_SCRIPT} DESTINATION ${CMAKE_INSTALL_LIBDIR}/irccd)
+
+	if (PLG_MAN)
+		install(
+			FILES ${PLG_MAN}
+			DESTINATION ${CMAKE_INSTALL_MANDIR}/man7
+			RENAME irccd-plugin-${PLG_NAME}.7
+		)
+	endif ()
+endfunction()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,28 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(examples)
+
+set(
+	FILES
+	${examples_SOURCE_DIR}/sample-plugin.c
+	${examples_SOURCE_DIR}/sample-plugin.js
+)
+
+add_custom_target(doc SOURCES ${FILES})
+install(FILES ${FILES} DESTINATION ${CMAKE_INSTALL_DOCDIR})
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extern/libduktape/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,34 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(libirccd-duktape)
+
+set(
+	SOURCES
+	${libirccd-duktape_SOURCE_DIR}/duktape.c
+	${libirccd-duktape_SOURCE_DIR}/duk_config.h
+	${libirccd-duktape_SOURCE_DIR}/duktape.h
+)
+
+add_library(libirccd-duktape STATIC ${SOURCES})
+target_include_directories(
+	libirccd-duktape
+	PUBLIC
+		$<BUILD_INTERFACE:${libirccd-duktape_SOURCE_DIR}>
+)
+set_target_properties(libirccd-duktape PROPERTIES PREFIX "" FOLDER extern)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extern/libgreatest/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,23 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(libirccd-greatest)
+
+add_library(libirccd-greatest INTERFACE ${libirccd-greatest_SOURCE_DIR}/greatest.h)
+target_include_directories(libirccd-greatest INTERFACE $<BUILD_INTERFACE:${libirccd-greatest_SOURCE_DIR}>)
+set_target_properties(libirccd-greatest PROPERTIES FOLDER extern)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extern/libketopt/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,23 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(libirccd-ketopt)
+
+add_library(libirccd-ketopt INTERFACE ${libirccd-ketopt_SOURCE_DIR}/ketopt.h)
+target_include_directories(libirccd-ketopt INTERFACE $<BUILD_INTERFACE:${libirccd-ketopt_SOURCE_DIR}>)
+set_target_properties(libirccd-ketopt PROPERTIES FOLDER extern)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extern/libutlist/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,27 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(libirccd-utlist)
+
+add_library(libirccd-utlist INTERFACE ${libirccd-utlist_SOURCE_DIR}/utlist.h)
+target_include_directories(
+	libirccd-utlist
+	INTERFACE
+		$<BUILD_INTERFACE:${libirccd-utlist_SOURCE_DIR}>
+)
+set_target_properties(libirccd-utlist PROPERTIES FOLDER extern)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/irccd/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,102 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(irccd)
+
+set(
+	SOURCES
+	${irccd_SOURCE_DIR}/dl-plugin.c
+	${irccd_SOURCE_DIR}/dl-plugin.h
+	${irccd_SOURCE_DIR}/js-plugin.c
+	${irccd_SOURCE_DIR}/js-plugin.h
+	${irccd_SOURCE_DIR}/jsapi-chrono.c
+	${irccd_SOURCE_DIR}/jsapi-chrono.h
+	${irccd_SOURCE_DIR}/jsapi-directory.c
+	${irccd_SOURCE_DIR}/jsapi-directory.h
+	${irccd_SOURCE_DIR}/jsapi-file.c
+	${irccd_SOURCE_DIR}/jsapi-file.h
+	${irccd_SOURCE_DIR}/jsapi-hook.c
+	${irccd_SOURCE_DIR}/jsapi-hook.h
+	${irccd_SOURCE_DIR}/jsapi-irccd.c
+	${irccd_SOURCE_DIR}/jsapi-irccd.h
+	${irccd_SOURCE_DIR}/jsapi-logger.c
+	${irccd_SOURCE_DIR}/jsapi-logger.h
+	${irccd_SOURCE_DIR}/jsapi-plugin.c
+	${irccd_SOURCE_DIR}/jsapi-plugin.h
+	${irccd_SOURCE_DIR}/jsapi-rule.c
+	${irccd_SOURCE_DIR}/jsapi-rule.h
+	${irccd_SOURCE_DIR}/jsapi-server.c
+	${irccd_SOURCE_DIR}/jsapi-server.h
+	${irccd_SOURCE_DIR}/jsapi-system.c
+	${irccd_SOURCE_DIR}/jsapi-system.h
+	${irccd_SOURCE_DIR}/jsapi-timer.c
+	${irccd_SOURCE_DIR}/jsapi-timer.h
+	${irccd_SOURCE_DIR}/jsapi-unicode.c
+	${irccd_SOURCE_DIR}/jsapi-unicode.h
+	${irccd_SOURCE_DIR}/jsapi-util.c
+	${irccd_SOURCE_DIR}/jsapi-util.h
+	${irccd_SOURCE_DIR}/peer.c
+	${irccd_SOURCE_DIR}/peer.h
+	${irccd_SOURCE_DIR}/transport.c
+	${irccd_SOURCE_DIR}/transport.h
+	${irccd_SOURCE_DIR}/unicode.c
+	${irccd_SOURCE_DIR}/unicode.h
+)
+
+find_package(BISON REQUIRED)
+find_package(FLEX REQUIRED)
+
+bison_target(yacc ${irccd_SOURCE_DIR}/conf.y
+	${irccd_BINARY_DIR}/conf.c
+	DEFINES_FILE ${irccd_BINARY_DIR}/conf.h
+)
+flex_target(lex ${irccd_SOURCE_DIR}/lex.l ${irccd_BINARY_DIR}/lex.c)
+add_flex_bison_dependency(lex yacc)
+
+# Intermediate library (for unit tests purposes).
+add_library(
+	irccd-static OBJECT
+	${SOURCES}
+	${irccd_BINARY_DIR}/lex.c
+	${irccd_BINARY_DIR}/conf.c
+	${irccd_BINARY_DIR}/conf.h
+)
+target_include_directories(irccd-static
+	PRIVATE $<BUILD_INTERFACE:${irccd_SOURCE_DIR}>
+	PUBLIC $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}>
+)
+target_link_libraries(irccd-static libirccd-static)
+set_target_properties(irccd-static PROPERTIES PREFIX "")
+
+# Final irccd executable.
+add_executable(irccd ${irccd_SOURCE_DIR}/main.c)
+target_link_libraries(irccd irccd-static)
+set_target_properties(irccd PROPERTIES ENABLE_EXPORTS On)
+
+# Installation.
+install(TARGETS irccd RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+
+# Source grouping.
+source_group(TREE ${irccd_SOURCE_DIR} FILES ${SOURCES} ${irccd_SOURCE_DIR}/main.c)
+source_group(
+	build
+	FILES
+		${irccd_BINARY_DIR}/lex.c
+		${irccd_BINARY_DIR}/conf.c
+		${irccd_BINARY_DIR}/conf.h
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/irccdctl/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,24 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(irccdctl)
+
+add_executable(irccdctl ${irccdctl_SOURCE_DIR}/irccdctl.c)
+target_link_libraries(irccdctl libirccd-static libirccd-ketopt)
+source_group(TREE ${irccdctl_SOURCE_DIR} FILES ${irccdctl_SOURCE_DIR}/irccdctl.c)
+install(TARGETS irccdctl DESTINATION ${CMAKE_INSTALL_BINDIR})
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,74 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(libirccd)
+
+set(
+	SOURCES
+	${irccd_SOURCE_DIR}/extern/libbsd/strlcpy.c
+	${irccd_SOURCE_DIR}/extern/libbsd/strlcat.c
+	${irccd_SOURCE_DIR}/extern/libbsd/reallocarray.c
+	${libirccd_SOURCE_DIR}/irccd/channel.c
+	${libirccd_SOURCE_DIR}/irccd/channel.h
+	${libirccd_SOURCE_DIR}/irccd/conn.c
+	${libirccd_SOURCE_DIR}/irccd/conn.h
+	${libirccd_SOURCE_DIR}/irccd/event.c
+	${libirccd_SOURCE_DIR}/irccd/event.h
+	${libirccd_SOURCE_DIR}/irccd/hook.c
+	${libirccd_SOURCE_DIR}/irccd/hook.h
+	${libirccd_SOURCE_DIR}/irccd/irccd.c
+	${libirccd_SOURCE_DIR}/irccd/irccd.h
+	${libirccd_SOURCE_DIR}/irccd/limits.h
+	${libirccd_SOURCE_DIR}/irccd/log.c
+	${libirccd_SOURCE_DIR}/irccd/log.h
+	${libirccd_SOURCE_DIR}/irccd/plugin.c
+	${libirccd_SOURCE_DIR}/irccd/plugin.h
+	${libirccd_SOURCE_DIR}/irccd/rule.c
+	${libirccd_SOURCE_DIR}/irccd/rule.h
+	${libirccd_SOURCE_DIR}/irccd/server.c
+	${libirccd_SOURCE_DIR}/irccd/server.h
+	${libirccd_SOURCE_DIR}/irccd/subst.c
+	${libirccd_SOURCE_DIR}/irccd/subst.h
+	${libirccd_SOURCE_DIR}/irccd/util.c
+	${libirccd_SOURCE_DIR}/irccd/util.h
+)
+
+configure_file(
+	${libirccd_SOURCE_DIR}/irccd/config.h.in
+	${libirccd_BINARY_DIR}/irccd/config.h
+)
+
+add_library(libirccd-static STATIC ${SOURCES})
+target_link_libraries(libirccd-static PUBLIC libirccd-utlist)
+target_include_directories(
+	libirccd-static
+	PUBLIC
+		$<BUILD_INTERFACE:${libirccd_SOURCE_DIR}>
+		$<BUILD_INTERFACE:${libirccd_BINARY_DIR}>
+		$<BUILD_INTERFACE:${libirccd_BINARY_DIR}/irccd>
+	PRIVATE
+		$<BUILD_INTERFACE:${libirccd_BINARY_DIR}/irccd>
+)
+set_target_properties(libirccd-static PROPERTIES PREFIX "")
+
+if (IRCCD_WITH_JS)
+	target_link_libraries(libirccd-static PUBLIC libirccd-duktape)
+endif ()
+if (IRCCD_WITH_SSL)
+	target_link_libraries(libirccd-static PUBLIC OpenSSL::SSL OpenSSL::Crypto)
+endif ()
--- a/lib/irccd/config.h.in	Mon Sep 20 10:06:54 2021 +0200
+++ b/lib/irccd/config.h.in	Wed Sep 22 15:44:36 2021 +0200
@@ -19,17 +19,17 @@
 #ifndef IRCCD_CONFIG_H
 #define IRCCD_CONFIG_H
 
-#define IRCCD_VERSION_MAJOR     @MAJOR@
-#define IRCCD_VERSION_MINOR     @MINOR@
-#define IRCCD_VERSION_PATCH     @PATCH@
-#define IRCCD_VERSION           "@MAJOR@.@MINOR@.@PATCH@"
+#define IRCCD_VERSION_MAJOR     @irccd_VERSION_MAJOR@
+#define IRCCD_VERSION_MINOR     @irccd_VERSION_MINOR@
+#define IRCCD_VERSION_PATCH     @irccd_VERSION_PATCH@
+#define IRCCD_VERSION           "@irccd_VERSION@"
 
-#define IRCCD_CACHEDIR          "@VARDIR@/cache/irccd"
-#define IRCCD_SYSCONFDIR        "@ETCDIR@"
-#define IRCCD_LIBDIR            "@LIBDIR@"
-#define IRCCD_DATADIR           "@SHAREDIR@/irccd"
+#define IRCCD_CACHEDIR          "@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/cache/irccd"
+#define IRCCD_SYSCONFDIR        "@CMAKE_INSTALL_FULL_SYSCONFDIR@"
+#define IRCCD_LIBDIR            "@CMAKE_INSTALL_FULL_LIBDIR@"
+#define IRCCD_DATADIR           "@CMAKE_INSTALL_FULL_DATADIR@/irccd"
 
-@define WITH_JS@
-@define WITH_SSL@
+#cmakedefine IRCCD_WITH_JS
+#cmakedefine IRCCD_WITH_SSL
 
 #endif /* !IRCCD_CONFIG_H */
--- a/lib/irccd/server.c	Mon Sep 20 10:06:54 2021 +0200
+++ b/lib/irccd/server.c	Wed Sep 22 15:44:36 2021 +0200
@@ -817,7 +817,7 @@
 			fail(s);
 		} else if (irc_conn_flush(s->conn, pfd) < 0) {
 			irc_log_warn("server %s: %s", s->name, strerror(errno));
-			return fail(s);
+			fail(s);
 		}
 		break;
 	case IRC_SERVER_STATE_CONNECTING:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/man/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,76 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(man)
+
+set(
+	MANPAGES_1
+	${man_SOURCE_DIR}/irccdctl.1
+	${man_SOURCE_DIR}/irccd.1
+)
+
+set(
+	MANPAGES_3
+	${man_SOURCE_DIR}/irccd-api-chrono.3
+	${man_SOURCE_DIR}/irccd-api-directory.3
+	${man_SOURCE_DIR}/irccd-api-file.3
+	${man_SOURCE_DIR}/irccd-api-hook.3
+	${man_SOURCE_DIR}/irccd-api-logger.3
+	${man_SOURCE_DIR}/irccd-api-plugin.3
+	${man_SOURCE_DIR}/irccd-api-rule.3
+	${man_SOURCE_DIR}/irccd-api-server.3
+	${man_SOURCE_DIR}/irccd-api-system.3
+	${man_SOURCE_DIR}/irccd-api-timer.3
+	${man_SOURCE_DIR}/irccd-api-unicode.3
+	${man_SOURCE_DIR}/irccd-api-util.3
+	${man_SOURCE_DIR}/irccd-api.3
+	${man_SOURCE_DIR}/libirccd-channel.3
+	${man_SOURCE_DIR}/libirccd-event.3
+	${man_SOURCE_DIR}/libirccd-hook.3
+	${man_SOURCE_DIR}/libirccd-log.3
+	${man_SOURCE_DIR}/libirccd-rule.3
+	${man_SOURCE_DIR}/libirccd-server.3
+	${man_SOURCE_DIR}/libirccd-subst.3
+	${man_SOURCE_DIR}/libirccd-util.3
+	${man_SOURCE_DIR}/libirccd.3
+)
+
+set(
+	MANPAGES_5
+	${man_SOURCE_DIR}/irccd.conf.5
+)
+
+set(
+	MANPAGES_7
+	${man_SOURCE_DIR}/irccd-ipc.7
+	${man_SOURCE_DIR}/irccd-templates.7
+)
+
+add_custom_target(
+	man
+	SOURCES
+		${MANPAGES_1}
+		${MANPAGES_3}
+		${MANPAGES_5}
+		${MANPAGES_7}
+)
+
+install(FILES ${MANPAGES_1} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
+install(FILES ${MANPAGES_3} DESTINATION ${CMAKE_INSTALL_MANDIR}/man3)
+install(FILES ${MANPAGES_5} DESTINATION ${CMAKE_INSTALL_MANDIR}/man5)
+install(FILES ${MANPAGES_7} DESTINATION ${CMAKE_INSTALL_MANDIR}/man7)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,28 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(plugins)
+
+foreach (p ask auth hangman history joke links logger plugin roulette tictactoe)
+	string(TOUPPER ${p} var)
+	option(IRCCD_WITH_PLUGIN_${var} "Enable ${p} plugin" On)
+
+	if (IRCCD_WITH_PLUGIN_${var})
+		add_subdirectory(${p})
+	endif ()
+endforeach ()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/ask/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,25 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(plugin-ask)
+
+irccd_define_javascript_plugin(
+	NAME ask
+	SCRIPT ${plugin-ask_SOURCE_DIR}/ask.js
+	MAN ${plugin-ask_SOURCE_DIR}/ask.7
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/auth/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,25 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(plugin-auth)
+
+irccd_define_javascript_plugin(
+	NAME auth
+	SCRIPT ${plugin-auth_SOURCE_DIR}/auth.js
+	MAN ${plugin-auth_SOURCE_DIR}/auth.7
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/hangman/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,25 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(plugin-hangman)
+
+irccd_define_javascript_plugin(
+	NAME hangman
+	SCRIPT ${plugin-hangman_SOURCE_DIR}/hangman.js
+	MAN ${plugin-hangman_SOURCE_DIR}/hangman.7
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/history/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,25 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(plugin-history)
+
+irccd_define_javascript_plugin(
+	NAME history
+	SCRIPT ${plugin-history_SOURCE_DIR}/history.js
+	MAN ${plugin-history_SOURCE_DIR}/history.7
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/joke/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,25 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(plugin-joke)
+
+irccd_define_javascript_plugin(
+	NAME joke
+	SCRIPT ${plugin-joke_SOURCE_DIR}/joke.js
+	MAN ${plugin-joke_SOURCE_DIR}/joke.7
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/links/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,28 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(plugin-links)
+
+find_package(CURL REQUIRED)
+
+irccd_define_native_plugin(
+	NAME links
+	MAN ${plugin-links_SOURCE_DIR}/links.7
+	SOURCES ${plugin-links_SOURCE_DIR}/links.c
+	LIBRARIES CURL::libcurl
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/logger/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,25 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(plugin-logger)
+
+irccd_define_javascript_plugin(
+	NAME logger
+	SCRIPT ${plugin-logger_SOURCE_DIR}/logger.js
+	MAN ${plugin-logger_SOURCE_DIR}/logger.7
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/plugin/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,25 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(plugin-plugin)
+
+irccd_define_javascript_plugin(
+	NAME plugin
+	SCRIPT ${plugin-plugin_SOURCE_DIR}/plugin.js
+	MAN ${plugin-plugin_SOURCE_DIR}/plugin.7
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/roulette/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,25 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(plugin-roulette)
+
+irccd_define_javascript_plugin(
+	NAME roulette
+	SCRIPT ${plugin-roulette_SOURCE_DIR}/roulette.js
+	MAN ${plugin-roulette_SOURCE_DIR}/roulette.7
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/tictactoe/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,25 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(plugin-tictactoe)
+
+irccd_define_javascript_plugin(
+	NAME tictactoe
+	SCRIPT ${plugin-tictactoe_SOURCE_DIR}/tictactoe.js
+	MAN ${plugin-tictactoe_SOURCE_DIR}/tictactoe.7
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/CMakeLists.txt	Wed Sep 22 15:44:36 2021 +0200
@@ -0,0 +1,66 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+project(tests)
+
+set(
+	TESTS
+	bot
+	channel
+	dl-plugin
+	event
+	jsapi-chrono
+	jsapi-directory
+	jsapi-file
+	jsapi-irccd
+	jsapi-system
+	jsapi-timer
+	jsapi-unicode
+	jsapi-util
+	log
+	plugin-ask
+	plugin-auth
+	plugin-hangman
+	plugin-history
+	plugin-joke
+	plugin-logger
+	plugin-plugin
+	plugin-tictactoe
+	rule
+	subst
+	util
+)
+
+foreach (t ${TESTS})
+	add_executable(test-${t} ${tests_SOURCE_DIR}/test-${t}.c)
+	add_test(NAME test-${t} COMMAND test-${t})
+	set_target_properties(test-${t} PROPERTIES FOLDER tests ENABLE_EXPORTS On)
+	target_link_libraries(test-${t} irccd-static libirccd-greatest)
+	target_compile_definitions(test-${t} PRIVATE TOP="${CMAKE_SOURCE_DIR}")
+endforeach ()
+
+#
+# Test: dl-plugin
+#
+# We need a sample plugin to open.
+#
+add_library(plugin-dl-example MODULE ${tests_SOURCE_DIR}/data/example-dl-plugin.c)
+add_dependencies(test-dl-plugin plugin-dl-example)
+set_target_properties(plugin-dl-example PROPERTIES PREFIX "" FOLDER tests)
+target_compile_definitions(test-dl-plugin PRIVATE EXAMPLE_DL_PLUGIN="$<TARGET_FILE:plugin-dl-example>")
+target_link_libraries(plugin-dl-example irccd)
--- a/tests/data/example-dl-plugin.c	Mon Sep 20 10:06:54 2021 +0200
+++ b/tests/data/example-dl-plugin.c	Wed Sep 22 15:44:36 2021 +0200
@@ -85,76 +85,76 @@
 }
 
 void
-example_dl_plugin_set_option(const char *key, const char *value)
+plugin_dl_example_set_option(const char *key, const char *value)
 {
 	set(options, IRC_UTIL_SIZE(options), key, value);
 }
 
 const char *
-example_dl_plugin_get_option(const char *key)
+plugin_dl_example_get_option(const char *key)
 {
 	return get(options, IRC_UTIL_SIZE(options), key);
 }
 
 const char **
-example_dl_plugin_get_options(void)
+plugin_dl_example_get_options(void)
 {
 	return options_list;
 }
 
 void
-example_dl_plugin_set_template(const char *key, const char *value)
+plugin_dl_example_set_template(const char *key, const char *value)
 {
 	set(templates, IRC_UTIL_SIZE(templates), key, value);
 }
 
 const char *
-example_dl_plugin_get_template(const char *key)
+plugin_dl_example_get_template(const char *key)
 {
 	return get(templates, IRC_UTIL_SIZE(templates), key);
 }
 
 const char **
-example_dl_plugin_get_templates(void)
+plugin_dl_example_get_templates(void)
 {
 	return templates_list;
 }
 
 void
-example_dl_plugin_set_path(const char *key, const char *value)
+plugin_dl_example_set_path(const char *key, const char *value)
 {
 	set(paths, IRC_UTIL_SIZE(paths), key, value);
 }
 
 const char *
-example_dl_plugin_get_path(const char *key)
+plugin_dl_example_get_path(const char *key)
 {
 	return get(paths, IRC_UTIL_SIZE(paths), key);
 }
 
 const char **
-example_dl_plugin_get_paths(void)
+plugin_dl_example_get_paths(void)
 {
 	return paths_list;
 }
 
 void
-example_dl_plugin_event(const struct irc_event *ev)
+plugin_dl_example_event(const struct irc_event *ev)
 {
 	irc_server_send(ev->server, "EVENT");
 }
 
 void
-example_dl_plugin_load(void)
+plugin_dl_example_load(void)
 {
 }
 
 void
-example_dl_plugin_reload(void)
+plugin_dl_example_reload(void)
 {
 }
 
 void
-example_dl_plugin_unload(void)
+plugin_dl_example_unload(void)
 {
 }
--- a/tests/test-dl-plugin.c	Mon Sep 20 10:06:54 2021 +0200
+++ b/tests/test-dl-plugin.c	Wed Sep 22 15:44:36 2021 +0200
@@ -37,7 +37,7 @@
 	(void)udata;
 
 	/* TODO: No idea how to stop greatest from here. */
-	if ((plugin = dl_plugin_open("example", TOP "/tests/data/example-dl-plugin.so")) == NULL)
+	if ((plugin = dl_plugin_open("example", EXAMPLE_DL_PLUGIN)) == NULL)
 		irc_util_die("dlopen: %s\n", strerror(errno));
 }