Mercurial > irccd
changeset 823:d76699e13156
cmake: use GetPrerequisites, closes #988 @1h
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 21 Dec 2018 14:32:57 +0100 |
parents | 5120b9793d1f |
children | 06cc2f95f479 |
files | CMakeLists.txt cmake/function/IrccdDefineExecutable.cmake cmake/function/IrccdDefineLibrary.cmake cmake/function/IrccdDefinePlugin.cmake cmake/function/IrccdInstallDependencies.cmake cmake/function/dependencies.cmake.in cmake/windows/CMakeLists.txt cmake/windows/vc_redist.x64.exe |
diffstat | 8 files changed, 128 insertions(+), 168 deletions(-) [+] |
line wrap: on
line diff
--- a/CMakeLists.txt Fri Nov 30 14:06:13 2018 +0100 +++ b/CMakeLists.txt Fri Dec 21 14:32:57 2018 +0100 @@ -53,6 +53,7 @@ project(irccd) include(GNUInstallDirs) +include(InstallRequiredSystemLibraries) # Helper to set global internal variables. function(setg var value) @@ -66,7 +67,6 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${irccd_SOURCE_DIR}/cmake/packages) set(CMAKE_POSITION_INDEPENDENT_CODE On) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS On) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) foreach (cfg ${CMAKE_CONFIGURATION_TYPES}) @@ -114,10 +114,6 @@ add_subdirectory(cmake/export) -if (CMAKE_SYSTEM_NAME MATCHES "Windows") - add_subdirectory(cmake/windows) -endif () - message("Compiling with the following flags:") message(" General flags: ${CMAKE_CXX_FLAGS}") message(" Debug flags: ${CMAKE_CXX_FLAGS_DEBUG}") @@ -141,21 +137,5 @@ endforeach () message("") -if (CMAKE_SYSTEM_NAME MATCHES "Windows") - message("Installing these DLLs:") - foreach (name ${IRCCD_DLLS}) - irccd_indent_message(" ${name}: " "${${name}}" 30) - endforeach () - message("") - - if (IRCCD_DLLS_NOT_FOUND) - message("The following DLLs were not found:") - foreach (name ${IRCCD_DLLS_NOT_FOUND}) - message(" ${name}") - endforeach () - message("") - endif () -endif () - include(cmake/IrccdPackage.cmake) include(CPack)
--- a/cmake/function/IrccdDefineExecutable.cmake Fri Nov 30 14:06:13 2018 +0100 +++ b/cmake/function/IrccdDefineExecutable.cmake Fri Dec 21 14:32:57 2018 +0100 @@ -33,6 +33,8 @@ # Create an executable that can be installed or not. # +include(${CMAKE_CURRENT_LIST_DIR}/IrccdInstallDependencies.cmake) + function(irccd_define_executable) set(options EXPORT) set(oneValueArgs DESCRIPTION TARGET) @@ -41,13 +43,13 @@ cmake_parse_arguments(EXE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if (NOT EXE_TARGET) - message(FATAL_ERROR "Please set TARGET") + message(FATAL_ERROR "Argument TARGET required") endif () if (NOT EXE_SOURCES) - message(FATAL_ERROR "Please set SOURCES") + message(FATAL_ERROR "Argument SOURCES required") endif () if (NOT EXE_DESCRIPTION) - message(FATAL_ERROR "DESCRIPTION required") + message(FATAL_ERROR "Argument DESCRIPTION required") endif () add_executable(${EXE_TARGET} ${EXE_SOURCES}) @@ -84,4 +86,6 @@ setg(CPACK_COMPONENT_${CMP}_DISPLAY_NAME "${EXE_TARGET} executable") setg(CPACK_COMPONENT_${CMP}_DESCRIPTION ${EXE_DESCRIPTION}) setg(CPACK_COMPONENT_${CMP}_GROUP "Applications") + + irccd_install_dependencies(${EXE_TARGET}) endfunction()
--- a/cmake/function/IrccdDefineLibrary.cmake Fri Nov 30 14:06:13 2018 +0100 +++ b/cmake/function/IrccdDefineLibrary.cmake Fri Dec 21 14:32:57 2018 +0100 @@ -32,6 +32,8 @@ # ) # +include(${CMAKE_CURRENT_LIST_DIR}/IrccdInstallDependencies.cmake) + function(irccd_define_library) set(options EXPORT) set(oneValueArgs TARGET) @@ -76,6 +78,8 @@ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ) + + irccd_install_dependencies(${LIB_TARGET}) endif () if (LIB_HEADERS)
--- a/cmake/function/IrccdDefinePlugin.cmake Fri Nov 30 14:06:13 2018 +0100 +++ b/cmake/function/IrccdDefinePlugin.cmake Fri Dec 21 14:32:57 2018 +0100 @@ -57,6 +57,8 @@ # uppercase NAME value. # +include(${CMAKE_CURRENT_LIST_DIR}/IrccdInstallDependencies.cmake) + function(_irccd_define_javascript_plugin) if (NOT PLG_SCRIPT) message(FATAL_ERROR "Missing SCRIPT parameter") @@ -114,6 +116,8 @@ COMPONENT ${PLG_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/irccd ) + + irccd_install_dependencies(plugin-${PLG_NAME}) endfunction() function(irccd_define_plugin)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmake/function/IrccdInstallDependencies.cmake Fri Dec 21 14:32:57 2018 +0100 @@ -0,0 +1,59 @@ +# +# CMakeLists.txt -- CMake build system for irccd +# +# Copyright (c) 2016-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. +# + +# +# irccd_install_dependencies(target) +# ---------------------------------- +# +# Create an install rule to add runtime dependencies for the given target. +# +# This function is no-op on non Windows systems. +# + +include(GNUInstallDirs) + +set(IRCCD_MID_FILE ${CMAKE_CURRENT_LIST_DIR}/dependencies.cmake.in) + +function(irccd_install_dependencies target) + if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(TARGET ${target}) + set(BINDIR ${CMAKE_INSTALL_BINDIR}) + + # Change TARGET and PREFIX in dependencies.cmake + configure_file( + ${IRCCD_MID_FILE} + ${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake.in + @ONLY + ) + + # Generate a file with target file name changed. + file( + GENERATE + OUTPUT + ${CMAKE_CURRENT_BINARY_DIR}/dependencies-$<CONFIG>.cmake + INPUT + ${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake.in + ) + + # Execute installation of dependencies at install step. + install( + CODE "include(\"${CMAKE_CURRENT_BINARY_DIR}/dependencies-\${CMAKE_INSTALL_CONFIG_NAME\}.cmake\")\n" + COMPONENT Core + ) + endif () +endfunction()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmake/function/dependencies.cmake.in Fri Dec 21 14:32:57 2018 +0100 @@ -0,0 +1,53 @@ +# +# CMakeLists.txt -- CMake build system for irccd +# +# Copyright (c) 2016-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(GetPrerequisites) + +set(TARGET $<TARGET_FILE:@TARGET@>) +set(BINDIR @CMAKE_INSTALL_BINDIR@) + +get_prerequisites( + ${TARGET} + DEPENDENCIES + 1 1 + "" + "@CMAKE_BINARY_DIR@/bin;@CMAKE_BINARY_DIR@/bin/$<CONFIG>" +) + +foreach (dep ${DEPENDENCIES}) + # + # Our libraries may already been installed, check the presence to + # avoid recopying them. + # + if (NOT EXISTS ${CMAKE_INSTALL_PREFIX}/${BINDIR}/${dep}) + gp_resolve_item( + ${TARGET} + ${dep} + "" + "@CMAKE_BINARY_DIR@/bin;@CMAKE_BINARY_DIR@/bin/$<CONFIG>" + dll + ) + + if (EXISTS ${dll}) + message(STATUS "Installing dependency ${dll}") + file(INSTALL ${dll} DESTINATION ${CMAKE_INSTALL_PREFIX}/${BINDIR}) + else () + message(WARNING "Dependency ${dep} not found") + endif () + endif () +endforeach ()
--- a/cmake/windows/CMakeLists.txt Fri Nov 30 14:06:13 2018 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,144 +0,0 @@ -# -# 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. -# - -project(windows) - -# -# MinGW libraries. -# ------------------------------------------------------------------- -# - -if (MINGW) - # debug libraries - set(BOOST_CHRONO_DLL_DEBUG libboost_chrono-mt.dll) - set(BOOST_DATE_TIME_DLL_DEBUG libboost_date_time-mt.dll) - set(BOOST_FILESYSTEM_DLL_DEBUG libboost_filesystem-mt.dll) - set(BOOST_SYSTEM_DLL_DEBUG libboost_system-mt.dll) - set(BOOST_TIMER_DLL_DEBUG libboost_timer-mt.dll) - set(BOOST_UNIT_TEST_FRAMEWORK_DLL_DEBUG libboost_unit_test_framework-mt.dll) - set(CRYPTO_DLL_DEBUG libcrypto-1_1-x64.dll) - set(SSL_DLL_DEBUG libssl-1_1-x64.dll) - - # MinGW specific. - set(LIBGCC_DLL_DEBUG libgcc_s_seh-1.dll) - set(LIBWINPTHREAD_DLL_DEBUG libwinpthread-1.dll) - set(LIBSTDCPP_DLL_DEBUG libstdc++-6.dll) - list(APPEND DLLS LIBGCC_DLL LIBWINPTHREAD_DLL LIBSTDCPP_DLL) - - # release libraries use the same. - set(BOOST_CHRONO_DLL_RELEASE ${BOOST_CHRONO_DLL_DEBUG}) - set(BOOST_DATE_TIME_DLL_RELEASE ${BOOST_DATE_TIME_DLL_DEBUG}) - set(BOOST_FILESYSTEM_DLL_RELEASE ${BOOST_FILESYSTEM_DLL_DEBUG}) - set(BOOST_SYSTEM_DLL_RELEASE ${BOOST_SYSTEM_DLL_DEBUG}) - set(BOOST_TIMER_DLL_RELEASE ${BOOST_TIMER_DLL_DEBUG}) - set(BOOST_UNIT_TEST_FRAMEWORK_DLL_RELEASE ${BOOST_UNIT_TEST_FRAMEWORK_DLL_DEBUG}) - set(CRYPTO_DLL_RELEASE ${CRYPTO_DLL_DEBUG}) - set(SSL_DLL_RELEASE ${SSL_DLL_DEBUG}) - set(LIBGCC_DLL_RELEASE ${LIBGCC_DLL_DEBUG}) - set(LIBWINPTHREAD_DLL_RELEASE ${LIBWINPTHREAD_DLL_DEBUG}) - set(LIBSTDCPP_DLL_RELEASE ${LIBSTDCPP_DLL_DEBUG}) -elseif (MSVC) - # debug libraries - set(BOOST_CHRONO_DLL_DEBUG boost_chrono-vc141-mt-gd-x64-1_68.dll) - set(BOOST_DATE_TIME_DLL_DEBUG boost_date_time-vc141-mt-gd-x64-1_68.dll) - set(BOOST_FILESYSTEM_DLL_DEBUG boost_filesystem-vc141-mt-gd-x64-1_68.dll) - set(BOOST_SYSTEM_DLL_DEBUG boost_system-vc141-mt-gd-x64-1_68.dll) - set(BOOST_TIMER_DLL_DEBUG boost_timer-vc141-mt-gd-x64-1_68.dll) - set(BOOST_UNIT_TEST_FRAMEWORK_DLL_DEBUG boost_unit_test_framework-vc141-mt-gd-x64-1_68.dll) - set(CRYPTO_DLL_DEBUG libcrypto-1_1-x64.dll) - set(SSL_DLL_DEBUG libssl-1_1-x64.dll) - - # release libraries - set(BOOST_CHRONO_DLL_RELEASE boost_chrono-vc141-mt-x64-1_68.dll) - set(BOOST_DATE_TIME_DLL_RELEASE boost_date_time-vc141-mt-x64-1_68.dll) - set(BOOST_FILESYSTEM_DLL_RELEASE boost_filesystem-vc141-mt-x64-1_68.dll) - set(BOOST_SYSTEM_DLL_RELEASE boost_system-vc141-mt-x64-1_68.dll) - set(BOOST_TIMER_DLL_RELEASE boost_timer-vc141-mt-x64-1_68.dll) - set(BOOST_UNIT_TEST_FRAMEWORK_DLL_RELEASE boost_unit_test_framework-vc141-mt-x64-1_68.dll) - set(CRYPTO_DLL_RELEASE libcrypto-1_1-x64.dll) - set(SSL_DLL_RELEASE libssl-1_1-x64.dll) -endif () - -list( - APPEND - DLLS - BOOST_CHRONO_DLL - BOOST_DATE_TIME_DLL - BOOST_FILESYSTEM_DLL - BOOST_SYSTEM_DLL - BOOST_UNIT_TEST_FRAMEWORK_DLL -) - -if (IRCCD_HAVE_SSL) - list(APPEND DLLS CRYPTO_DLL SSL_DLL) -endif () -if (IRCCD_HAVE_JS) - list(APPEND DLLS BOOST_TIMER_DLL) -endif () - -# -# Find DLL to copy/install by iterating DLLS value. -# -# Creates a cache IRCCD_WITH_<NAME> variable with the path to the DLL if found, -# otherwise, set to not found. -# -# If found, IRCCD_WITH_<NAME> is appended to IRCCD_DLLS global variable and set -# as parent scope. -# -# If not found, IRCCD_WITH_<NAME> is appended to IRCCD_DLLS_NOT_FOUND variable. -# - -foreach (name ${DLLS}) - find_program( - IRCCD_WITH_${name}_DEBUG - NAMES ${${name}_DEBUG} - DOC "Path to ${name} DLL (Debug)" - ) - find_program( - IRCCD_WITH_${name}_RELEASE - NAMES ${${name}_RELEASE} - DOC "Path to ${name} DLL (Release)" - ) - - if (EXISTS ${IRCCD_WITH_${name}_DEBUG}) - install( - PROGRAMS - $<$<CONFIG:Debug>:${IRCCD_WITH_${name}_DEBUG}> - COMPONENT libirccd - DESTINATION bin - ) - list(APPEND FOUND IRCCD_WITH_${name}_DEBUG) - else () - list(APPEND NOT_FOUND IRCCD_WITH_${name}_DEBUG) - endif () - - if (EXISTS ${IRCCD_WITH_${name}_RELEASE}) - install( - PROGRAMS - $<$<CONFIG:Release>:${IRCCD_WITH_${name}_RELEASE}> - COMPONENT libirccd - DESTINATION bin - ) - list(APPEND FOUND IRCCD_WITH_${name}_RELEASE) - else () - list(APPEND NOT_FOUND IRCCD_WITH_${name}_RELEASE) - endif () -endforeach () - -setg(IRCCD_DLLS "${FOUND}") -setg(IRCCD_DLLS_NOT_FOUND "${NOT_FOUND}")