# HG changeset patch # User David Demelier # Date 1530964984 -7200 # Node ID a17de53db29bf98ff6be2ad8861f3bcb25f12d43 # Parent 1b04ffb2b35e8e6e4305f99b855254af0376f9c7 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 diff -r 1b04ffb2b35e -r a17de53db29b CMakeLists.txt --- 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}") diff -r 1b04ffb2b35e -r a17de53db29b cmake/IrccdSystem.cmake --- 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 +) diff -r 1b04ffb2b35e -r a17de53db29b cmake/export/CMakeLists.txt --- /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 +# +# 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 +) diff -r 1b04ffb2b35e -r a17de53db29b cmake/export/irccd-config.cmake --- /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 +# +# 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") diff -r 1b04ffb2b35e -r a17de53db29b cmake/function/IrccdDefineExecutable.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) diff -r 1b04ffb2b35e -r a17de53db29b cmake/function/IrccdDefineLibrary.cmake --- 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() diff -r 1b04ffb2b35e -r a17de53db29b extern/duktape/CMakeLists.txt --- 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 +) diff -r 1b04ffb2b35e -r a17de53db29b extern/json/CMakeLists.txt --- 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 + $ + $ +) +install(TARGETS libjson EXPORT irccd-targets) +install(FILES json.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/irccd/extern) diff -r 1b04ffb2b35e -r a17de53db29b irccd/CMakeLists.txt --- 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} diff -r 1b04ffb2b35e -r a17de53db29b irccdctl/CMakeLists.txt --- 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 diff -r 1b04ffb2b35e -r a17de53db29b libcommon/CMakeLists.txt --- 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 $ $ + $ + $ ) diff -r 1b04ffb2b35e -r a17de53db29b libirccd-js/CMakeLists.txt --- 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} + $ + FLAGS + DUK_OPT_CPP_EXCEPTIONS LIBRARIES Boost::timer - libextern-duktape libirccd PUBLIC_INCLUDES + $ $ ) diff -r 1b04ffb2b35e -r a17de53db29b libirccd-test/CMakeLists.txt --- 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 + $<$:${libirccd-test_SOURCE_DIR}/irccd/test/plugin_test.hpp> + $<$:${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 + $<$:${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 - $<$:${libirccd-test_SOURCE_DIR}/irccd/test/plugin_test.cpp> - $<$:${libirccd-test_SOURCE_DIR}/irccd/test/plugin_test.hpp> - $<$:${libirccd-test_SOURCE_DIR}/irccd/test/js_test.hpp> + EXPORT + HEADERS ${HEADERS} + HEADERS_DIRECTORY irccd/test + SOURCES ${SOURCES} LIBRARIES - $<$:libirccd-js> + ${LIBRARIES} libirccd libirccdctl PUBLIC_INCLUDES $ FLAGS - IRCCD_EXECUTABLE="$" - IRCCDCTL_EXECUTABLE="$" + $"> + $"> + $"> + $"> ) diff -r 1b04ffb2b35e -r a17de53db29b libirccd/CMakeLists.txt --- 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 $ - $ ) diff -r 1b04ffb2b35e -r a17de53db29b libirccd/irccd/daemon/plugin.cpp --- 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 +#include -#include +#include #include @@ -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 diff -r 1b04ffb2b35e -r a17de53db29b libirccd/irccd/daemon/service/plugin_service.cpp --- 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_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; diff -r 1b04ffb2b35e -r a17de53db29b libirccdctl/CMakeLists.txt --- 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