changeset 710:a17de53db29b

Misc: export libraries Export all libraries with CMake and install headers. While here, build Duktape as object library to avoid exporting it. Don't mix static/dynamic libraries anymore. closes #867 closes #439
author David Demelier <markand@malikania.fr>
date Sat, 07 Jul 2018 14:03:04 +0200
parents 1b04ffb2b35e
children fc66cc9706a7
files CMakeLists.txt cmake/IrccdSystem.cmake cmake/export/CMakeLists.txt cmake/export/irccd-config.cmake cmake/function/IrccdDefineExecutable.cmake cmake/function/IrccdDefineLibrary.cmake extern/duktape/CMakeLists.txt extern/json/CMakeLists.txt irccd/CMakeLists.txt irccdctl/CMakeLists.txt libcommon/CMakeLists.txt libirccd-js/CMakeLists.txt libirccd-test/CMakeLists.txt libirccd/CMakeLists.txt libirccd/irccd/daemon/plugin.cpp libirccd/irccd/daemon/service/plugin_service.cpp libirccdctl/CMakeLists.txt
diffstat 17 files changed, 195 insertions(+), 57 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Sat Jul 07 10:59:19 2018 +0200
+++ b/CMakeLists.txt	Sat Jul 07 14:03:04 2018 +0200
@@ -49,7 +49,7 @@
 # win32                     - Additional files for Windows platform.
 #
 
-cmake_minimum_required(VERSION 3.3)
+cmake_minimum_required(VERSION 3.10)
 project(irccd CXX)
 
 # Helper to set global internal variables.
@@ -115,6 +115,8 @@
     add_subdirectory(tests)
 endif ()
 
+add_subdirectory(cmake/export)
+
 message("Compiling with the following flags:")
 message("    General flags:    ${CMAKE_CXX_FLAGS}")
 message("    Debug flags:      ${CMAKE_CXX_FLAGS_DEBUG}")
--- a/cmake/IrccdSystem.cmake	Sat Jul 07 10:59:19 2018 +0200
+++ b/cmake/IrccdSystem.cmake	Sat Jul 07 14:03:04 2018 +0200
@@ -197,3 +197,8 @@
     ${CMAKE_BINARY_DIR}
     ${CMAKE_BINARY_DIR}/irccd
 )
+
+install(
+    FILES ${CMAKE_BINARY_DIR}/irccd/sysconfig.hpp
+    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/irccd
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake/export/CMakeLists.txt	Sat Jul 07 14:03:04 2018 +0200
@@ -0,0 +1,40 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2018 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.
+#
+
+include(CMakePackageConfigHelpers)
+
+write_basic_package_version_file(
+    ${CMAKE_CURRENT_BINARY_DIR}/irccd-config-version.cmake
+    VERSION ${IRCCD_VERSION}
+    COMPATIBILITY SameMajorVersion
+)
+
+install(
+    EXPORT irccd-targets
+    FILE irccd-targets.cmake
+    NAMESPACE irccd::
+    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/irccd
+)
+
+install(
+    FILES
+        ${CMAKE_CURRENT_SOURCE_DIR}/irccd-config.cmake
+        ${CMAKE_CURRENT_BINARY_DIR}/irccd-config-version.cmake
+    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/irccd
+    COMPONENT Devel
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake/export/irccd-config.cmake	Sat Jul 07 14:03:04 2018 +0200
@@ -0,0 +1,25 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2018 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.
+#
+
+include(CMakeFindDependencyMacro)
+
+find_dependency(Boost COMPONENTS filesystem program_options system timer)
+find_dependency(Threads)
+find_dependency(OpenSSL)
+
+include("${CMAKE_CURRENT_LIST_DIR}/irccd-targets.cmake")
--- a/cmake/function/IrccdDefineExecutable.cmake	Sat Jul 07 10:59:19 2018 +0200
+++ b/cmake/function/IrccdDefineExecutable.cmake	Sat Jul 07 14:03:04 2018 +0200
@@ -22,6 +22,7 @@
 #
 # irccd_define_executable(
 #    TARGET target name
+#    EXPORT (Optional) export executable through CMake
 #    DESCRIPTION short description (Required if installed)
 #    SOURCES src1, src2, srcn
 #    FLAGS (Optional) C/C++ flags (without -D)
@@ -35,7 +36,7 @@
 include(${CMAKE_CURRENT_LIST_DIR}/IrccdVeraCheck.cmake)
 
 function(irccd_define_executable)
-    set(options "")
+    set(options EXPORT)
     set(oneValueArgs DESCRIPTION TARGET)
     set(multiValueArgs SOURCES FLAGS LIBRARIES INCLUDES OPTIONS)
 
@@ -71,11 +72,14 @@
         )
     endforeach()
 
-    install(
-        TARGETS ${EXE_TARGET}
-        COMPONENT ${EXE_TARGET}
-        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
-    )
+    if (EXE_EXPORT)
+        install(
+            TARGETS ${EXE_TARGET}
+            EXPORT irccd-targets
+            COMPONENT ${EXE_TARGET}
+            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+        )
+    endif ()
 
     # Put the application into a cpack group.
     string(TOUPPER ${EXE_TARGET} CMP)
--- a/cmake/function/IrccdDefineLibrary.cmake	Sat Jul 07 10:59:19 2018 +0200
+++ b/cmake/function/IrccdDefineLibrary.cmake	Sat Jul 07 14:03:04 2018 +0200
@@ -22,9 +22,11 @@
 #
 # irccd_define_library(
 #    TARGET target name
+#    EXPORT (Optional) set to true to export library through irccd
+#    EXTERN (Optional) set to true to mark library as external
+#    HEADERS (Optional) headers to install
+#    HEADERS_DIRECTORY (Optional) subdirectory where to install headers
 #    SOURCES src1, src2, srcn
-#    LOCAL (Optional) set to true to build a static library
-#    EXTERNAL (Optional) set to true if library is third party
 #    FLAGS (Optional) C/C++ flags (without -D)
 #    LIBRARIES (Optional) libraries to link
 #    LOCAL_INCLUDES (Optional) local includes for the target only
@@ -35,10 +37,9 @@
 include(${CMAKE_CURRENT_LIST_DIR}/IrccdVeraCheck.cmake)
 
 function(irccd_define_library)
-    set(options EXTERNAL LOCAL)
-    set(oneValueArgs TARGET)
-    set(multiValueArgs SOURCES FLAGS LIBRARIES LOCAL_INCLUDES PUBLIC_INCLUDES)
-    set(mandatory TARGET SOURCES)
+    set(options EXPORT)
+    set(oneValueArgs HEADERS_DIRECTORY TARGET)
+    set(multiValueArgs HEADERS SOURCES FLAGS LIBRARIES LOCAL_INCLUDES PUBLIC_INCLUDES)
 
     cmake_parse_arguments(LIB "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
 
@@ -48,11 +49,8 @@
     if (NOT LIB_SOURCES)
         message(FATAL_ERROR "Please set SOURCES")
     endif ()
-    if (LIB_LOCAL)
-        set(type STATIC)
-    endif ()
 
-    add_library(${LIB_TARGET} ${type} ${LIB_SOURCES})
+    add_library(${LIB_TARGET} ${LIB_SOURCES} ${LIB_HEADERS})
     target_include_directories(${LIB_TARGET} PRIVATE ${LIB_LOCAL_INCLUDES} PUBLIC ${LIB_PUBLIC_INCLUDES})
     target_compile_definitions(
         ${LIB_TARGET}
@@ -78,7 +76,28 @@
         )
     endforeach()
 
-    if (NOT ${LIB_EXTERNAL})
+    if (NOT ${LIB_EXTERN})
         irccd_vera_check(${LIB_TARGET} "${LIB_SOURCES}")
     endif ()
+
+    if (${LIB_EXPORT})
+        install(
+            TARGETS ${LIB_TARGET}
+            EXPORT irccd-targets
+            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+        )
+    endif ()
+
+    if (LIB_HEADERS)
+        if (NOT LIB_HEADERS_DIRECTORY)
+            message(FATAL_ERROR "HEADERS_DIRECTORY must be defined")
+        endif ()
+
+        install(
+            FILES ${LIB_HEADERS}
+            DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${LIB_HEADERS_DIRECTORY}
+        )
+    endif ()
 endfunction()
--- a/extern/duktape/CMakeLists.txt	Sat Jul 07 10:59:19 2018 +0200
+++ b/extern/duktape/CMakeLists.txt	Sat Jul 07 14:03:04 2018 +0200
@@ -18,7 +18,10 @@
 
 cmake_minimum_required(VERSION 3.0)
 project(duktape)
-add_library(libextern-duktape STATIC duk_config.h duktape.cpp duktape.h)
-target_include_directories(libextern-duktape PUBLIC ${duktape_SOURCE_DIR})
-target_compile_definitions(libextern-duktape PUBLIC DUK_OPT_CPP_EXCEPTIONS)
-set_target_properties(libextern-duktape PROPERTIES PREFIX "")
+add_library(libduktape OBJECT duktape.h duktape.cpp)
+install(
+    FILES
+        duktape.h
+        duk_config.h
+    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/irccd/extern
+)
--- a/extern/json/CMakeLists.txt	Sat Jul 07 10:59:19 2018 +0200
+++ b/extern/json/CMakeLists.txt	Sat Jul 07 14:03:04 2018 +0200
@@ -17,7 +17,12 @@
 #
 
 project(json)
-
-add_library(libextern-json INTERFACE)
-target_sources(libextern-json INTERFACE ${json_SOURCE_DIR}/json.hpp)
-target_include_directories(libextern-json INTERFACE ${json_SOURCE_DIR})
+add_library(libjson INTERFACE)
+target_include_directories(
+    libjson
+    INTERFACE
+        $<BUILD_INTERFACE:${json_SOURCE_DIR}>
+        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR/irccd/extern}>
+)
+install(TARGETS libjson EXPORT irccd-targets)
+install(FILES json.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/irccd/extern)
--- a/irccd/CMakeLists.txt	Sat Jul 07 10:59:19 2018 +0200
+++ b/irccd/CMakeLists.txt	Sat Jul 07 14:03:04 2018 +0200
@@ -20,6 +20,7 @@
 
 irccd_define_executable(
     TARGET irccd
+    EXPORT
     DESCRIPTION "The main irccd daemon."
     SOURCES CMakeLists.txt main.cpp
     INCLUDES ${irccd_SOURCE_DIR}
--- a/irccdctl/CMakeLists.txt	Sat Jul 07 10:59:19 2018 +0200
+++ b/irccdctl/CMakeLists.txt	Sat Jul 07 14:03:04 2018 +0200
@@ -88,6 +88,7 @@
 
 irccd_define_executable(
     TARGET irccdctl
+    EXPORT
     DESCRIPTION "Irccd controller."
     SOURCES ${SOURCES}
     LIBRARIES libirccdctl
--- a/libcommon/CMakeLists.txt	Sat Jul 07 10:59:19 2018 +0200
+++ b/libcommon/CMakeLists.txt	Sat Jul 07 14:03:04 2018 +0200
@@ -53,12 +53,14 @@
 
 irccd_define_library(
     TARGET libcommon
+    EXPORT
+    HEADERS ${HEADERS}
+    HEADERS_DIRECTORY irccd
     SOURCES
         ${libcommon_SOURCE_DIR}/CMakeLists.txt
-        ${HEADERS}
         ${SOURCES}
     LIBRARIES
-        libextern-json
+        libjson
         Threads::Threads
         Boost::filesystem
         Boost::system
@@ -72,4 +74,6 @@
     PUBLIC_INCLUDES
         $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>
         $<BUILD_INTERFACE:${libcommon_SOURCE_DIR}>
+        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/irccd/extern>
 )
--- a/libirccd-js/CMakeLists.txt	Sat Jul 07 10:59:19 2018 +0200
+++ b/libirccd-js/CMakeLists.txt	Sat Jul 07 14:03:04 2018 +0200
@@ -59,14 +59,19 @@
 
 irccd_define_library(
     TARGET libirccd-js
+    EXPORT
+    HEADERS ${HEADERS}
+    HEADERS_DIRECTORY irccd/js
     SOURCES
         ${libirccd-js_SOURCE_DIR}/CMakeLists.txt
-        ${HEADERS}
         ${SOURCES}
+        $<TARGET_OBJECTS:libduktape>
+    FLAGS
+        DUK_OPT_CPP_EXCEPTIONS
     LIBRARIES
         Boost::timer
-        libextern-duktape
         libirccd
     PUBLIC_INCLUDES
+        $<BUILD_INTERFACE:${duktape_SOURCE_DIR}>
         $<BUILD_INTERFACE:${libirccd-js_SOURCE_DIR}>
 )
--- a/libirccd-test/CMakeLists.txt	Sat Jul 07 10:59:19 2018 +0200
+++ b/libirccd-test/CMakeLists.txt	Sat Jul 07 14:03:04 2018 +0200
@@ -18,30 +18,47 @@
 
 project(libirccd-test)
 
+set(
+    HEADERS
+    ${libirccd-test_SOURCE_DIR}/irccd/test/cli_test.hpp
+    ${libirccd-test_SOURCE_DIR}/irccd/test/command_test.hpp
+    ${libirccd-test_SOURCE_DIR}/irccd/test/debug_server.hpp
+    ${libirccd-test_SOURCE_DIR}/irccd/test/journal_server.hpp
+    ${libirccd-test_SOURCE_DIR}/irccd/test/plugin_cli_test.hpp
+    ${libirccd-test_SOURCE_DIR}/irccd/test/rule_cli_test.hpp
+    $<$<BOOL:${IRCCD_HAVE_JS}>:${libirccd-test_SOURCE_DIR}/irccd/test/plugin_test.hpp>
+    $<$<BOOL:${IRCCD_HAVE_JS}>:${libirccd-test_SOURCE_DIR}/irccd/test/js_test.hpp>
+)
+
+set(
+    SOURCES
+    ${libirccd-test_SOURCE_DIR}/irccd/test/cli_test.cpp
+    ${libirccd-test_SOURCE_DIR}/irccd/test/debug_server.cpp
+    ${libirccd-test_SOURCE_DIR}/irccd/test/journal_server.cpp
+    ${libirccd-test_SOURCE_DIR}/irccd/test/plugin_cli_test.cpp
+    ${libirccd-test_SOURCE_DIR}/irccd/test/rule_cli_test.cpp
+    $<$<BOOL:${IRCCD_HAVE_JS}>:${libirccd-test_SOURCE_DIR}/irccd/test/plugin_test.cpp>
+)
+
+if (${IRCCD_HAVE_JS})
+    list(APPEND LIBRARIES libirccd-js)
+endif ()
+
 irccd_define_library(
     TARGET libirccd-test
-    SOURCES
-        ${libirccd-test_SOURCE_DIR}/irccd/test/cli_test.cpp
-        ${libirccd-test_SOURCE_DIR}/irccd/test/cli_test.hpp
-        ${libirccd-test_SOURCE_DIR}/irccd/test/command_test.hpp
-        ${libirccd-test_SOURCE_DIR}/irccd/test/debug_server.cpp
-        ${libirccd-test_SOURCE_DIR}/irccd/test/debug_server.hpp
-        ${libirccd-test_SOURCE_DIR}/irccd/test/journal_server.cpp
-        ${libirccd-test_SOURCE_DIR}/irccd/test/journal_server.hpp
-        ${libirccd-test_SOURCE_DIR}/irccd/test/plugin_cli_test.cpp
-        ${libirccd-test_SOURCE_DIR}/irccd/test/plugin_cli_test.hpp
-        ${libirccd-test_SOURCE_DIR}/irccd/test/rule_cli_test.cpp
-        ${libirccd-test_SOURCE_DIR}/irccd/test/rule_cli_test.hpp
-        $<$<BOOL:${IRCCD_HAVE_JS}>:${libirccd-test_SOURCE_DIR}/irccd/test/plugin_test.cpp>
-        $<$<BOOL:${IRCCD_HAVE_JS}>:${libirccd-test_SOURCE_DIR}/irccd/test/plugin_test.hpp>
-        $<$<BOOL:${IRCCD_HAVE_JS}>:${libirccd-test_SOURCE_DIR}/irccd/test/js_test.hpp>
+    EXPORT
+    HEADERS ${HEADERS}
+    HEADERS_DIRECTORY irccd/test
+    SOURCES ${SOURCES}
     LIBRARIES
-        $<$<BOOL:${IRCCD_HAVE_JS}>:libirccd-js>
+        ${LIBRARIES}
         libirccd
         libirccdctl
     PUBLIC_INCLUDES
         $<BUILD_INTERFACE:${libirccd-test_SOURCE_DIR}>
     FLAGS
-        IRCCD_EXECUTABLE="$<TARGET_FILE:irccd>"
-        IRCCDCTL_EXECUTABLE="$<TARGET_FILE:irccdctl>"
+        $<BUILD_INTERFACE:IRCCD_EXECUTABLE="$<TARGET_FILE:irccd>">
+        $<BUILD_INTERFACE:IRCCDCTL_EXECUTABLE="$<TARGET_FILE:irccdctl>">
+        $<INSTALL_INTERFACE:IRCCD_EXECUTABLE="$<TARGET_FILE:irccd::irccd>">
+        $<INSTALL_INTERFACE:IRCCDCTL_EXECUTABLE="$<TARGET_FILE:irccd::irccdctl>">
 )
--- a/libirccd/CMakeLists.txt	Sat Jul 07 10:59:19 2018 +0200
+++ b/libirccd/CMakeLists.txt	Sat Jul 07 14:03:04 2018 +0200
@@ -116,13 +116,14 @@
 
 irccd_define_library(
     TARGET libirccd
+    EXPORT
+    HEADERS ${HEADERS}
+    HEADERS_DIRECTORY irccd/daemon
     SOURCES
         ${libirccd_SOURCE_DIR}/CMakeLists.txt
-        ${HEADERS}
         ${SOURCES}
     LIBRARIES
         libcommon
     PUBLIC_INCLUDES
         $<BUILD_INTERFACE:${libirccd_SOURCE_DIR}>
-        $<INSTALL_INTERFACE:${WITH_INCLUDEDIR}>
 )
--- a/libirccd/irccd/daemon/plugin.cpp	Sat Jul 07 10:59:19 2018 +0200
+++ b/libirccd/irccd/daemon/plugin.cpp	Sat Jul 07 14:03:04 2018 +0200
@@ -16,9 +16,9 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <boost/filesystem.hpp>
+#include <sstream>
 
-#include <sstream>
+#include <boost/filesystem.hpp>
 
 #include <irccd/system.hpp>
 
@@ -52,7 +52,7 @@
             return plugin;
     }
 
-    throw plugin_error(plugin_error::not_found, name);
+    return nullptr;
 }
 
 plugin_error::plugin_error(error errc, std::string name, std::string message) noexcept
--- a/libirccd/irccd/daemon/service/plugin_service.cpp	Sat Jul 07 10:59:19 2018 +0200
+++ b/libirccd/irccd/daemon/service/plugin_service.cpp	Sat Jul 07 14:03:04 2018 +0200
@@ -147,10 +147,14 @@
 std::shared_ptr<plugin> plugin_service::find(const std::string& id)
 {
     for (const auto& loader : loaders_) {
-        auto plugin = loader->find(id);
+        try {
+            auto plugin = loader->find(id);
 
-        if (plugin)
-            return plugin;
+            if (plugin)
+                return plugin;
+        } catch (const std::exception& ex) {
+            irccd_.get_log().warning() << "plugin " << id << ": " << ex.what() << std::endl;
+        }
     }
 
     return nullptr;
--- a/libirccdctl/CMakeLists.txt	Sat Jul 07 10:59:19 2018 +0200
+++ b/libirccdctl/CMakeLists.txt	Sat Jul 07 14:03:04 2018 +0200
@@ -30,9 +30,11 @@
 
 irccd_define_library(
     TARGET libirccdctl
+    EXPORT
+    HEADERS ${HEADERS}
+    HEADERS_DIRECTORY irccd/ctl
     SOURCES
         ${libirccdctl_SOURCE_DIR}/CMakeLists.txt
-        ${HEADERS}
         ${SOURCES}
     LIBRARIES
         libirccd