changeset 584:f2737a931658

cmake: start installing
author David Demelier <markand@malikania.fr>
date Sat, 18 Mar 2023 10:57:29 +0100
parents 5a4e5b852f8a
children 76ce31b0151f
files CMakeLists.txt cmake/MlkLibrary.cmake libmlk-core/CMakeLists.txt libmlk-core/libmlk-core-config.cmake libmlk-core/mlk/core/gamepad.c libmlk-util/CMakeLists.txt libmlk-util/libmlk-util-config.cmake
diffstat 7 files changed, 177 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Mon Mar 13 13:07:48 2023 +0100
+++ b/CMakeLists.txt	Sat Mar 18 10:57:29 2023 +0100
@@ -45,11 +45,25 @@
 	set(CMAKE_C_FLAGS "/D_CRT_SECURE_NO_WARNINGS ${CMAKE_C_FLAGS}")
 endif ()
 
-option(MLK_WITH_DOXYGEN "Enable doxygen documentation" On)
-option(MLK_WITH_EXAMPLES "Enable examples" On)
-option(MLK_WITH_NLS "Enable NLS support" Off)
-option(MLK_WITH_TESTS "Enable unit tests" On)
-option(MLK_WITH_TESTS_GRAPHICAL "Enable unit tests that requires graphical context" On)
+include(GNUInstallDirs)
+include(CMakePackageConfigHelpers)
+
+function(mlk_option name value type help)
+	set(${name} ${value} CACHE ${type} ${help})
+endfunction()
+
+mlk_option(MLK_WITH_DOXYGEN On
+    BOOL "Enable doxygen documentation")
+mlk_option(MLK_WITH_EXAMPLES On
+    BOOL "Enable examples")
+mlk_option(MLK_WITH_NLS Off
+    BOOL "Enable NLS support")
+mlk_option(MLK_WITH_TESTS On
+    BOOL "Enable unit tests")
+mlk_option(MLK_WITH_TESTS_GRAPHICAL On
+    BOOL "Enable unit tests that requires graphical context")
+mlk_option(MLK_WITH_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake"
+    STRING "Destination for CMake files")
 
 include(cmake/MlkBcc.cmake)
 include(cmake/MlkExecutable.cmake)
@@ -58,8 +72,6 @@
 include(cmake/MlkNls.cmake)
 include(cmake/MlkTileset.cmake)
 
-include(GNUInstallDirs)
-
 find_package(SDL2 REQUIRED COMPONENTS image ttf)
 find_package(OpenAL REQUIRED)
 find_package(SndFile REQUIRED)
@@ -97,3 +109,14 @@
 	add_subdirectory(libmlk-example)
 	add_subdirectory(examples)
 endif ()
+
+#
+# SDL2 is not always configured using CMake on some systems which means the
+# CMake configuration file isn't provided, so use our own...
+#
+install(
+	FILES
+		${CMAKE_SOURCE_DIR}/cmake/FindSDL2.cmake
+		${CMAKE_SOURCE_DIR}/cmake/FindSndFile.cmake
+	DESTINATION "${MLK_WITH_CMAKEDIR}/mlk"
+)
--- a/cmake/MlkLibrary.cmake	Mon Mar 13 13:07:48 2023 +0100
+++ b/cmake/MlkLibrary.cmake	Sat Mar 18 10:57:29 2023 +0100
@@ -22,9 +22,9 @@
 include(${CMAKE_CURRENT_LIST_DIR}/MlkTileset.cmake)
 
 function(mlk_library)
-	set(options "")
-	set(oneValueArgs "NAME;FOLDER;TYPE")
-	set(multiValueArgs "SOURCES;ASSETS;LANGS;LIBRARIES;INCLUDES;FLAGS;OPTIONS;MAPS;TILESETS")
+	set(options "INSTALL")
+	set(oneValueArgs "NAME;FOLDER;TYPE;HEADERS_DIRECTORY")
+	set(multiValueArgs "SOURCES;ASSETS;LANGS;HEADERS;LIBRARIES;INCLUDES;FLAGS;OPTIONS;MAPS;TILESETS")
 
 	cmake_parse_arguments(LIB "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
 
@@ -75,4 +75,44 @@
 	endif ()
 
 	set_target_properties(${LIB_NAME} PROPERTIES PREFIX "")
+
+	if (LIB_INSTALL)
+		write_basic_package_version_file(
+			${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}-config-version.cmake
+			VERSION ${CMAKE_PROJECT_VERSION}
+			COMPATIBILITY SameMajorVersion
+                )
+                configure_file(
+                	${CMAKE_CURRENT_SOURCE_DIR}/${LIB_NAME}-config.cmake
+                	${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}-config.cmake
+                	@ONLY
+                )
+		install(
+			TARGETS ${LIB_NAME}
+			EXPORT ${LIB_NAME}-targets
+			RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+			LIBRARY DESTINATION ${CMAKE_INSTALL_BINDIR}
+			ARCHIVE DESTINATION ${CMAKE_INSTALL_BINDIR}
+			INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+		)
+		install(
+			EXPORT ${LIB_NAME}-targets
+			FILE ${LIB_NAME}-targets.cmake
+			NAMESPACE mlk::
+			DESTINATION ${MLK_WITH_CMAKEDIR}/${LIB_NAME}
+		)
+		install(
+			FILES
+	                	${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}-config.cmake
+				${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}-config-version.cmake
+			DESTINATION ${MLK_WITH_CMAKEDIR}/${LIB_NAME}
+		)
+
+		if (LIB_HEADERS AND LIB_HEADERS_DIRECTORY)
+			install(
+				FILES ${LIB_HEADERS}
+				DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${LIB_HEADERS_DIRECTORY}
+			)
+		endif ()
+	endif ()
 endfunction()
--- a/libmlk-core/CMakeLists.txt	Mon Mar 13 13:07:48 2023 +0100
+++ b/libmlk-core/CMakeLists.txt	Sat Mar 18 10:57:29 2023 +0100
@@ -20,62 +20,68 @@
 
 set(
 	SOURCES
+	${libmlk-core_SOURCE_DIR}/mlk/core/game.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/sprite.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/trace.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/maths.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/sys.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/util.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/drawable-stack.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/action-script.c
-	${libmlk-core_SOURCE_DIR}/mlk/core/action-script.h
+	${libmlk-core_SOURCE_DIR}/mlk/core/state.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/texture.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/font.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/painter.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/panic.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/gamepad.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/image.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/alloc.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/clock.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/action-stack.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/core.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/animation.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/err.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/music.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/sound.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/event.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/drawable.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/action.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/window.c
+)
+
+set(
+	HEADERS
+	${libmlk-core_SOURCE_DIR}/mlk/core/action-script.h
 	${libmlk-core_SOURCE_DIR}/mlk/core/action-stack.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/action.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/action.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/alloc.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/alloc.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/animation.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/animation.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/clock.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/clock.h
 	${libmlk-core_SOURCE_DIR}/mlk/core/color.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/core.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/core.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/drawable-stack.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/drawable-stack.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/drawable.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/drawable.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/err.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/err.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/event.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/event.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/font.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/font.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/game.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/game.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/image.c
+	${libmlk-core_SOURCE_DIR}/mlk/core/gamepad.h
 	${libmlk-core_SOURCE_DIR}/mlk/core/image.h
 	${libmlk-core_SOURCE_DIR}/mlk/core/key.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/maths.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/maths.h
 	${libmlk-core_SOURCE_DIR}/mlk/core/mouse.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/music.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/music.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/painter.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/painter.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/panic.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/panic.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/sound.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/sound.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/sprite.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/sprite.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/state.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/state.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/sys.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/sys.h
 	${libmlk-core_SOURCE_DIR}/mlk/core/sys_p.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/texture.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/texture.h
 	${libmlk-core_SOURCE_DIR}/mlk/core/texture_p.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/trace.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/trace.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/util.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/util.h
-	${libmlk-core_SOURCE_DIR}/mlk/core/window.c
 	${libmlk-core_SOURCE_DIR}/mlk/core/window.h
 	${libmlk-core_SOURCE_DIR}/mlk/core/window_p.h
 )
@@ -89,14 +95,6 @@
 	list(APPEND LIBRARIES ${Intl_LIBRARIES})
 endif ()
 
-if (MLK_WITH_ZSTD)
-	list(APPEND LIBRARIES ZSTD::ZSTD)
-endif ()
-
-if (MLK_WITH_ZIP)
-	list(APPEND LIBRARIES Libzip::Libzip)
-endif ()
-
 if (CMAKE_SYSTEM_NAME MATCHES "Windows")
 	list(APPEND LIBRARIES shlwapi)
 endif ()
@@ -107,8 +105,11 @@
 
 mlk_library(
 	NAME libmlk-core
-	SOURCES ${SOURCES} ${NLS}
+	SOURCES ${HEADERS} ${NLS} ${SOURCES}
+	HEADERS ${HEADERS}
+	HEADERS_DIRECTORY mlk/core
 	LANGS ${NLS}
+	INSTALL
 	LIBRARIES
 		PUBLIC
 			${LIBRARIES}
@@ -120,8 +121,8 @@
 			libmlk-util
 	INCLUDES
 		PUBLIC
+			$<BUILD_INTERFACE:${libmlk-core_SOURCE_DIR}>
 			${OPENAL_INCLUDE_DIR}
-			$<BUILD_INTERFACE:${libmlk-core_SOURCE_DIR}>
 )
 
 source_group(TREE ${libmlk-core_SOURCE_DIR} FILES ${SOURCES} ${NLS})
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libmlk-core/libmlk-core-config.cmake	Sat Mar 18 10:57:29 2023 +0100
@@ -0,0 +1,23 @@
+#
+# libmlk-core-config.cmake -- export file for libmlk-core
+#
+# Copyright (c) 2020-2023 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(libmlk-util)
+
+include("${CMAKE_CURRENT_LIST_DIR}/libmlk-core-targets.cmake")
--- a/libmlk-core/mlk/core/gamepad.c	Mon Mar 13 13:07:48 2023 +0100
+++ b/libmlk-core/mlk/core/gamepad.c	Sat Mar 18 10:57:29 2023 +0100
@@ -32,7 +32,7 @@
 	memset(pad, 0, sizeof (*pad));
 
 	if (!(pad->handle = SDL_GameControllerOpen(idx)))
-		return MLK_ERR_SDL;
+		return mlk_errf("%s", SDL_GetError());
 
 	return 0;
 }
@@ -54,11 +54,11 @@
 	assert(it);
 
 	memset(it, 0, sizeof (*it));
-	it->idx = -1;
+	it->index = -1;
 
 	if ((it->end = SDL_NumJoysticks()) < 0) {
 		it->end = 0;
-		return MLK_ERR_SDL;
+		return mlk_errf("%s", SDL_GetError());
 	}
 
 	return 0;
@@ -71,16 +71,16 @@
 	 * Go to the next gamepad, we need to iterate because SDL can combines
 	 * joystick and game controllers with the same API.
 	 */
-	for (++it->idx; it->idx < it->end && !SDL_IsGameController(it->idx); ++it->idx)
+	for (++it->index; it->index < it->end && !SDL_IsGameController(it->index); ++it->index)
 		continue;
 
 	/* End of iteration. */
-	if (it->idx >= it->end) {
+	if (it->index >= it->end) {
 		memset(it, 0, sizeof (*it));
 		return 0;
 	}
 
-	it->name = SDL_GameControllerNameForIndex(it->idx);
+	it->name = SDL_GameControllerNameForIndex(it->index);
 
 	return 1;
 }
--- a/libmlk-util/CMakeLists.txt	Mon Mar 13 13:07:48 2023 +0100
+++ b/libmlk-util/CMakeLists.txt	Sat Mar 18 10:57:29 2023 +0100
@@ -25,7 +25,6 @@
 set(
 	SOURCES
 	${libmlk-util_SOURCE_DIR}/mlk/util/dir.c
-	${libmlk-util_SOURCE_DIR}/mlk/util/dir.h
 	${libmlk-util_SOURCE_DIR}/mlk/util/fmemopen.c
 	${libmlk-util_SOURCE_DIR}/mlk/util/openbsd/basename.c
 	${libmlk-util_SOURCE_DIR}/mlk/util/openbsd/dirname.c
@@ -34,6 +33,12 @@
 	${libmlk-util_SOURCE_DIR}/mlk/util/openbsd/strlcpy.c
 	${libmlk-util_SOURCE_DIR}/mlk/util/sysconfig.cmake.h
 	${libmlk-util_SOURCE_DIR}/mlk/util/util.c
+)
+
+set(
+	HEADERS
+	${libmlk-util_BINARY_DIR}/mlk/util/sysconfig.h
+	${libmlk-util_SOURCE_DIR}/mlk/util/dir.h
 	${libmlk-util_SOURCE_DIR}/mlk/util/util.h
 )
 
@@ -56,7 +61,9 @@
 mlk_library(
 	NAME libmlk-util
 	SOURCES ${SOURCES}
-	TYPE STATIC
+	INSTALL
+	HEADERS ${HEADERS}
+	HEADERS_DIRECTORY mlk/util
 	LIBRARIES ${LIBRARIES}
 	INCLUDES
 		PUBLIC
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libmlk-util/libmlk-util-config.cmake	Sat Mar 18 10:57:29 2023 +0100
@@ -0,0 +1,30 @@
+#
+# libmlk-util-config.cmake -- export file for libmlk-util
+#
+# Copyright (c) 2020-2023 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)
+
+set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/../mlk;${CMAKE_MODULE_PATH}")
+
+# Local modules.
+find_dependency(SDL2 COMPONENTS ttf image)
+find_dependency(SndFile)
+
+# External modules.
+find_dependency(OpenAL)
+
+include("${CMAKE_CURRENT_LIST_DIR}/libmlk-util-targets.cmake")