changeset 264:9bbbabb6f077

cmake: make macros simpler
author David Demelier <markand@malikania.fr>
date Wed, 09 Dec 2020 21:22:21 +0100
parents cd5bdb995052
children 11db1d425502
files CMakeLists.txt cmake/MolkoDefineExecutable.cmake cmake/MolkoDefineLibrary.cmake doc/docs/cmake/MolkoDefineLibrary.md extern/libgreatest/CMakeLists.txt extern/libsqlite/CMakeLists.txt libmlk-adventure/CMakeLists.txt libmlk-adventure/adventure/actions/teleport.c libmlk-adventure/adventure/state/mainmenu.c libmlk-adventure/adventure/state/map.c libmlk-core/CMakeLists.txt libmlk-data/CMakeLists.txt libmlk-rpg/CMakeLists.txt libmlk-ui/CMakeLists.txt
diffstat 14 files changed, 121 insertions(+), 141 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Tue Dec 08 17:00:03 2020 +0100
+++ b/CMakeLists.txt	Wed Dec 09 21:22:21 2020 +0100
@@ -16,7 +16,7 @@
 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #
 
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.19)
 project(molko)
 
 set(CMAKE_C_STANDARD 11)
--- a/cmake/MolkoDefineExecutable.cmake	Tue Dec 08 17:00:03 2020 +0100
+++ b/cmake/MolkoDefineExecutable.cmake	Wed Dec 09 21:22:21 2020 +0100
@@ -80,17 +80,8 @@
 
 	add_executable(${EXE_TARGET} ${EXE_SOURCES} ${OUTPUTS})
 	target_compile_definitions(${EXE_TARGET} PRIVATE ${EXE_FLAGS})
-	target_include_directories(
-		${EXE_TARGET}
-		PRIVATE
-			${CMAKE_CURRENT_BINARY_DIR}
-			${EXE_INCLUDES}
-	)
-	target_link_libraries(
-		${EXE_TARGET}
-		PRIVATE
-			${EXE_LIBRARIES}
-	)
+	target_include_directories(${EXE_TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${EXE_INCLUDES})
+	target_link_libraries(${EXE_TARGET} PRIVATE ${EXE_LIBRARIES})
 
 	if (EXE_FOLDER)
 		set_target_properties(${EXE_TARGET} PROPERTIES FOLDER ${EXE_FOLDER})
--- a/cmake/MolkoDefineLibrary.cmake	Tue Dec 08 17:00:03 2020 +0100
+++ b/cmake/MolkoDefineLibrary.cmake	Wed Dec 09 21:22:21 2020 +0100
@@ -30,12 +30,9 @@
 #   EXTERNAL            (Optional) set to true for external libraries
 #   FOLDER              (Optional) optional subfolder to organize
 #   TYPE                (Optional) type of library
-#   ASSETS              (Optional) list of assets
 #   LIBRARIES           (Optional) libraries to link
-#   PRIVATE_FLAGS       (Optional) C flags (without -D)
-#   PRIVATE_INCLUDES    (Optional) local includes for the target only
-#   PUBLIC_FLAGS        (Optional) C flags (without -D)
-#   PUBLIC_INCLUDES     (Optional) includes to share with target dependencies
+#   FLAGS               (Optional) C flags (without -D)
+#   INCLUDES            (Optional) local includes for the target only
 # )
 # ```
 #
@@ -52,25 +49,27 @@
 # Optional argument *EXTERNAL* should be set for targets that are not
 # maintained here (e.g. third party libraries embedded).
 #
-# Optional argument *PRIVATE_FLAGS*, *PUBLIC_FLAGS*, *PRIVATE_INCLUDES*,
-# *PUBLIC_INCLUDES*, *LIBRARIES* may be passed to set compile flags, includes
-# and libraries respectively.
-#
-# The arguments *ASSETS* contains a list of assets to be converted during the
-# build. The file hierarchy is conserved in the `${CMAKE_CURRENT_BINARY_DIR}`.
+# The optional arguments *LIBRARIES*, *FLAGS* and *INCLUDES* are passed to the
+# respective CMake command [target_link_libraries][],
+# [target_compile_definitions][] and [target_include_directories][]
+# respectively. As such, it is necessary to specify the scope (PUBLIC, PRIVATE
+# or INTERFACE) for every argument.
 #
 # If *FOLDER* option is set, it is organized into its name under the IDE if
 # supported.
 #
+# [target_compile_definitions]: https://cmake.org/cmake/help/latest/command/target_compile_definitions.html
+# [target_include_directories]: https://cmake.org/cmake/help/latest/command/target_include_directories.html
+# [target_link_libraries]: https://cmake.org/cmake/help/latest/command/target_link_libraries.html
+#
 
-include(${CMAKE_CURRENT_LIST_DIR}/MolkoBuildAssets.cmake)
 include(${CMAKE_CURRENT_LIST_DIR}/MolkoSetCompilerFlags.cmake)
 include(${CMAKE_CURRENT_LIST_DIR}/MolkoSetBuildDirectories.cmake)
 
 function(molko_define_library)
 	set(options EXTERNAL)
 	set(oneValueArgs FOLDER TARGET TYPE)
-	set(multiValueArgs ASSETS LIBRARIES PRIVATE_FLAGS PRIVATE_INCLUDES PUBLIC_FLAGS PUBLIC_INCLUDES SOURCES TRANSLATIONS)
+	set(multiValueArgs ASSETS FLAGS INCLUDES LIBRARIES SOURCES TRANSLATIONS)
 
 	cmake_parse_arguments(LIB "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
 
@@ -83,71 +82,47 @@
 
 	molko_build_assets("${LIB_ASSETS}" ASSETS_OUTPUTS)
 
-	if (${LIB_TYPE} MATCHES "INTERFACE")
-		add_library(${LIB_TARGET} INTERFACE)
-		target_sources(
-			${LIB_TARGET}
-			INTERFACE
-				${ASSETS_OUTPUTS}
-				${LIB_SOURCES}
-				${NLS_OUTPUTS}
-		)
-		target_include_directories(
-			${LIB_TARGET}
-			INTERFACE
-				${LIB_PRIVATE_INCLUDES}
-				${LIB_PUBLIC_INCLUDES}
+	if (LIB_TRANSLATIONS)
+		molko_build_translations(
+			TARGET ${LIB_TARGET}
+			TRANSLATIONS ${LIB_TRANSLATIONS}
+			SOURCES ${LIB_SOURCES}
+			OUTPUTS NLS_OUTPUTS
 		)
-	else ()
-		if (LIB_TRANSLATIONS)
-			molko_build_translations(
-				TARGET ${LIB_TARGET}
-				TRANSLATIONS ${LIB_TRANSLATIONS}
-				SOURCES ${LIB_SOURCES}
-				OUTPUTS NLS_OUTPUTS
-			)
-		endif ()
+	endif ()
 
-		add_library(
-			${LIB_TARGET}
-			${ASSETS_OUTPUTS}
-			${LIB_SOURCES}
-			${LIB_TYPE}
-			${NLS_OUTPUTS}
-		)
+	add_library(
+		${LIB_TARGET}
+		${LIB_TYPE}
+		${ASSETS_OUTPUTS}
+		${LIB_SOURCES}
+		${NLS_OUTPUTS}
+	)
 
-		target_include_directories(
-			${LIB_TARGET}
-			PRIVATE
-				${LIB_PRIVATE_INCLUDES}
-			PUBLIC
-				$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
-				${LIB_PUBLIC_INCLUDES}
-		)
-		target_compile_definitions(
-			${LIB_TARGET}
-			PRIVATE
-				${LIB_PRIVATE_FLAGS}
-			PUBLIC
-				${LIB_PUBLIC_FLAGS}
-		)
+	if (NOT LIB_TYPE OR NOT ${LIB_TYPE} MATCHES INTERFACE)
+		molko_set_build_directories(${LIB_TARGET})
+		target_include_directories(${LIB_TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
+	endif ()
+
+	if (LIB_INCLUDES)
+		target_include_directories(${LIB_TARGET} ${LIB_INCLUDES})
+	endif ()
+	if (LIB_FLAGS)
+		target_compile_definitions(${LIB_TARGET} ${LIB_FLAGS})
+	endif ()
+	if (LIB_LIBRARIES)
 		target_link_libraries(${LIB_TARGET} ${LIB_LIBRARIES})
-		set_target_properties(
-			${LIB_TARGET}
-			PROPERTIES
-				PREFIX ""
-				IMPORT_PREFIX ""
-				C_EXTENSIONS Off
-				C_STANDARD 11
-				C_STANDARD_REQUIRED On
-		)
+	endif ()
 
-		if (NOT ${LIB_EXTERNAL})
-			molko_set_compiler_flags(${LIB_TARGET})
-		endif ()
-
-		molko_set_build_directories(${LIB_TARGET})
-	endif ()
+	set_target_properties(
+		${LIB_TARGET}
+		PROPERTIES
+			PREFIX ""
+			IMPORT_PREFIX ""
+			C_EXTENSIONS Off
+			C_STANDARD 11
+			C_STANDARD_REQUIRED On
+	)
 
 	if (LIB_FOLDER)
 		set_target_properties(${LIB_TARGET} PROPERTIES FOLDER ${LIB_FOLDER})
--- a/doc/docs/cmake/MolkoDefineLibrary.md	Tue Dec 08 17:00:03 2020 +0100
+++ b/doc/docs/cmake/MolkoDefineLibrary.md	Wed Dec 09 21:22:21 2020 +0100
@@ -11,12 +11,9 @@
 EXTERNAL            (Optional) set to true for external libraries
 FOLDER              (Optional) optional subfolder to organize
 TYPE                (Optional) type of library
-ASSETS              (Optional) list of assets
 LIBRARIES           (Optional) libraries to link
-PRIVATE_FLAGS       (Optional) C flags (without -D)
-PRIVATE_INCLUDES    (Optional) local includes for the target only
-PUBLIC_FLAGS        (Optional) C flags (without -D)
-PUBLIC_INCLUDES     (Optional) includes to share with target dependencies
+FLAGS               (Optional) C flags (without -D)
+INCLUDES            (Optional) local includes for the target only
 )
 ```
 
@@ -33,13 +30,16 @@
 Optional argument *EXTERNAL* should be set for targets that are not
 maintained here (e.g. third party libraries embedded).
 
-Optional argument *PRIVATE_FLAGS*, *PUBLIC_FLAGS*, *PRIVATE_INCLUDES*,
-*PUBLIC_INCLUDES*, *LIBRARIES* may be passed to set compile flags, includes
-and libraries respectively.
-
-The arguments *ASSETS* contains a list of assets to be converted during the
-build. The file hierarchy is conserved in the `${CMAKE_CURRENT_BINARY_DIR}`.
+The optional arguments *LIBRARIES*, *FLAGS* and *INCLUDES* are passed to the
+respective CMake command [target_link_libraries][],
+[target_compile_definitions][] and [target_include_directories][]
+respectively. As such, it is necessary to specify the scope (PUBLIC, PRIVATE
+or INTERFACE) for every argument.
 
 If *FOLDER* option is set, it is organized into its name under the IDE if
 supported.
 
+[target_compile_definitions]: https://cmake.org/cmake/help/latest/command/target_compile_definitions.html
+[target_include_directories]: https://cmake.org/cmake/help/latest/command/target_include_directories.html
+[target_link_libraries]: https://cmake.org/cmake/help/latest/command/target_link_libraries.html
+
--- a/extern/libgreatest/CMakeLists.txt	Tue Dec 08 17:00:03 2020 +0100
+++ b/extern/libgreatest/CMakeLists.txt	Wed Dec 09 21:22:21 2020 +0100
@@ -23,6 +23,5 @@
 	TYPE INTERFACE
 	SOURCES greatest.h
 	EXTERNAL
-	PUBLIC_INCLUDES
-		$<BUILD_INTERFACE:${libgreatest_SOURCE_DIR}>
+	INCLUDES INTERFACE $<BUILD_INTERFACE:${libgreatest_SOURCE_DIR}>
 )
--- a/extern/libsqlite/CMakeLists.txt	Tue Dec 08 17:00:03 2020 +0100
+++ b/extern/libsqlite/CMakeLists.txt	Wed Dec 09 21:22:21 2020 +0100
@@ -23,15 +23,17 @@
 	SOURCES sqlite3.c sqlite3.h
 	EXTERNAL
 	FOLDER extern
-	PUBLIC_FLAGS
-		SQLITE_THREADSAFE=0
-		SQLITE_DEFAULT_MEMSTATUS=0
-		SQLITE_DEFAULT_FOREIGN_KEYS=1
-		SQLITE_OMIT_DEPRECATED
-		SQLITE_OMIT_LOAD_EXTENSION
-		$<$<CONFIG:Debug>:SQLITE_DEBUG>
-		$<$<CONFIG:Debug>:SQLITE_MEMDEBUG>
-	PUBLIC_INCLUDES
-		$<BUILD_INTERFACE:${libsqlite_SOURCE_DIR}>
-		$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+	FLAGS
+		PRIVATE
+			SQLITE_THREADSAFE=0
+			SQLITE_DEFAULT_MEMSTATUS=0
+			SQLITE_DEFAULT_FOREIGN_KEYS=1
+			SQLITE_OMIT_DEPRECATED
+			SQLITE_OMIT_LOAD_EXTENSION
+			$<$<CONFIG:Debug>:SQLITE_DEBUG>
+			$<$<CONFIG:Debug>:SQLITE_MEMDEBUG>
+	INCLUDES
+		PUBLIC
+			$<BUILD_INTERFACE:${libsqlite_SOURCE_DIR}>
+			$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
 )
--- a/libmlk-adventure/CMakeLists.txt	Tue Dec 08 17:00:03 2020 +0100
+++ b/libmlk-adventure/CMakeLists.txt	Wed Dec 09 21:22:21 2020 +0100
@@ -48,12 +48,9 @@
 	TARGET libmlk-adventure
 	TRANSLATIONS fr
 	SOURCES ${SOURCES} ${PO}
-	LIBRARIES libmlk-core libmlk-ui libmlk-rpg libmlk-data
-	PRIVATE_INCLUDES
-		${libadventure_SOURCE_DIR}/adventure
-	PUBLIC_INCLUDES
-		$<BUILD_INTERFACE:${libadventure_SOURCE_DIR}>
-	PRIVATE_FLAGS DIRECTORY="${libadventure_SOURCE_DIR}/adventure/assets"
+	FLAGS PRIVATE _BSD_SOURCE
+	LIBRARIES PUBLIC libmlk-core libmlk-ui libmlk-rpg libmlk-data
+	INCLUDES PUBLIC $<BUILD_INTERFACE:${libadventure_SOURCE_DIR}>
 )
 
 source_group(TREE ${libadventure_SOURCE_DIR} FILES ${SOURCES})
--- a/libmlk-adventure/adventure/actions/teleport.c	Tue Dec 08 17:00:03 2020 +0100
+++ b/libmlk-adventure/adventure/actions/teleport.c	Wed Dec 09 21:22:21 2020 +0100
@@ -33,7 +33,8 @@
 
 #include <rpg/map.h>
 
-#include "molko.h"
+#include <adventure/molko.h>
+
 #include "teleport.h"
 
 struct teleport {
--- a/libmlk-adventure/adventure/state/mainmenu.c	Tue Dec 08 17:00:03 2020 +0100
+++ b/libmlk-adventure/adventure/state/mainmenu.c	Wed Dec 09 21:22:21 2020 +0100
@@ -37,8 +37,8 @@
 #include <ui/theme.h>
 
 #include <adventure/molko.h>
+#include <adventure/adventure_p.h>
 
-#include "adventure_p.h"
 #include "mainmenu.h"
 
 struct self {
--- a/libmlk-adventure/adventure/state/map.c	Tue Dec 08 17:00:03 2020 +0100
+++ b/libmlk-adventure/adventure/state/map.c	Wed Dec 09 21:22:21 2020 +0100
@@ -34,7 +34,8 @@
 #include <adventure/actions/spawner.h>
 #include <adventure/actions/teleport.h>
 
-#include "molko.h"
+#include <adventure/molko.h>
+
 #include "map.h"
 
 struct self {
--- a/libmlk-core/CMakeLists.txt	Tue Dec 08 17:00:03 2020 +0100
+++ b/libmlk-core/CMakeLists.txt	Wed Dec 09 21:22:21 2020 +0100
@@ -115,22 +115,26 @@
 	ASSETS ${ASSETS}
 	TRANSLATIONS fr
 	LIBRARIES
-		${LIBS}
-		$<$<BOOL:${LIBM}>:m>
-		libcompat
-		libsqlite
-		SDL2::SDL2
-		SDL2::image
-		SDL2::mixer
-		SDL2::ttf
-	PRIVATE_FLAGS
-		BINDIR="${CMAKE_INSTALL_BINDIR}"
-		PREFIX="${CMAKE_INSTALL_PREFIX}"
-		SHAREDIR="${CMAKE_INSTALL_DATADIR}"
-	PUBLIC_INCLUDES
-		${INCS}
-		$<BUILD_INTERFACE:${libmlk-core_SOURCE_DIR}>
-		$<BUILD_INTERFACE:${libmlk-core_BINARY_DIR}>
+		PUBLIC
+			${LIBS}
+			$<$<BOOL:${LIBM}>:m>
+			libcompat
+			libsqlite
+			SDL2::SDL2
+			SDL2::image
+			SDL2::mixer
+			SDL2::ttf
+	FLAGS
+		PRIVATE
+			_BSD_SOURCE
+			BINDIR="${CMAKE_INSTALL_BINDIR}"
+			PREFIX="${CMAKE_INSTALL_PREFIX}"
+			SHAREDIR="${CMAKE_INSTALL_DATADIR}"
+	INCLUDES
+		PUBLIC
+			${INCS}
+			$<BUILD_INTERFACE:${libmlk-core_SOURCE_DIR}>
+			$<BUILD_INTERFACE:${libmlk-core_BINARY_DIR}>
 )
 
 source_group(TREE ${libmlk-core_SOURCE_DIR} FILES ${SOURCES})
--- a/libmlk-data/CMakeLists.txt	Tue Dec 08 17:00:03 2020 +0100
+++ b/libmlk-data/CMakeLists.txt	Wed Dec 09 21:22:21 2020 +0100
@@ -99,4 +99,8 @@
 	TILESETS ${TILESETS}
 )
 
-add_library(libmlk-data INTERFACE ${directories} ${objects})
+molko_define_library(
+	TARGET libmlk-data
+	TYPE INTERFACE
+	SOURCES ${directories} ${objects}
+)
--- a/libmlk-rpg/CMakeLists.txt	Tue Dec 08 17:00:03 2020 +0100
+++ b/libmlk-rpg/CMakeLists.txt	Wed Dec 09 21:22:21 2020 +0100
@@ -82,10 +82,15 @@
 	TRANSLATIONS fr
 	SOURCES ${SOURCES} ${PO}
 	LIBRARIES
-		libmlk-core
-		libmlk-ui
-	PUBLIC_INCLUDES
-		$<BUILD_INTERFACE:${libmlk-rpg_SOURCE_DIR}>
+		PUBLIC
+			libmlk-core
+			libmlk-ui
+	FLAGS
+		PRIVATE
+			_BSD_SOURCE
+	INCLUDES
+		PUBLIC
+			$<BUILD_INTERFACE:${libmlk-rpg_SOURCE_DIR}>
 )
 
 source_group(TREE ${libmlk-rpg_SOURCE_DIR} FILES ${SOURCES})
--- a/libmlk-ui/CMakeLists.txt	Tue Dec 08 17:00:03 2020 +0100
+++ b/libmlk-ui/CMakeLists.txt	Wed Dec 09 21:22:21 2020 +0100
@@ -59,8 +59,9 @@
 	ASSETS ${ASSETS}
 	LIBRARIES
 		libmlk-core
-	PUBLIC_INCLUDES
-		$<BUILD_INTERFACE:${libmlk-ui_SOURCE_DIR}>
+	INCLUDES
+		PUBLIC
+			$<BUILD_INTERFACE:${libmlk-ui_SOURCE_DIR}>
 )
 
 source_group(TREE ${libmlk-ui_SOURCE_DIR} FILES ${SOURCES})