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}")
Binary file cmake/windows/vc_redist.x64.exe has changed