Browse Source

Group liblove and lovedep projects in Visual Studio

Mark Jansen 1 year ago
parent
commit
ce173dd89b
2 changed files with 52 additions and 1 deletions
  1. 19 1
      CMakeLists.txt
  2. 33 0
      extra/cmake/LoveMacros.cmake

+ 19 - 1
CMakeLists.txt

@@ -30,6 +30,7 @@ project(love)
 set(CMAKE_MODULE_PATH "${love_SOURCE_DIR}/extra/cmake" ${CMAKE_MODULE_PATH})
 set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) # Needed for shared libs on Linux. (-fPIC).
 set(CMAKE_CXX_STANDARD 17)
+set_property(GLOBAL PROPERTY USE_FOLDERS ON)	# Allow grouping projects in Visual Studio
 
 if(APPLE)
 	message(WARNING "CMake is not an officially supported build system for love on Apple platforms.")
@@ -42,6 +43,8 @@ if(MINGW)
 	message(WARNING "Please see https://github.com/love2d/megasource")
 endif()
 
+include(LoveMacros)
+
 # Extract version.h contents.
 file(READ ${CMAKE_CURRENT_SOURCE_DIR}/src/common/version.h LOVE_VERSION_FILE_CONTENTS)
 
@@ -1915,7 +1918,7 @@ set_target_properties(liblove PROPERTIES
 	CXX_VISIBILITY_PRESET hidden
 	VISIBILITY_INLINES_HIDDEN ON
 	LIBRARY_OUTPUT_NAME "${LOVE_LIB_NAME}")
-target_link_libraries(liblove
+set(LIBLOVE_DEPENDENCIES
 	love_common
 	love_audio
 	love_data
@@ -1937,6 +1940,8 @@ target_link_libraries(liblove
 	love_touch
 	love_video
 	love_window
+)
+set(LIBLOVE_LIBRARIES
 	love_3p_box2d
 	love_3p_ddsparse
 	love_3p_enet
@@ -1953,11 +1958,24 @@ target_link_libraries(liblove
 	love_3p_wuff
 	love_3p_xxhash
 )
+target_link_libraries(liblove ${LIBLOVE_DEPENDENCIES} ${LIBLOVE_LIBRARIES})
 
 if(LOVE_EXTRA_DEPENDECIES)
 	add_dependencies(liblove ${LOVE_EXTRA_DEPENDECIES})
 endif()
 
+#
+# Group projects in Visual Studio
+#
+
+love_group_projects(NAME "liblove" NESTED TARGETS ${LIBLOVE_DEPENDENCIES})
+love_group_projects(NAME "liblove/libraries" NESTED TARGETS ${LIBLOVE_LIBRARIES})
+love_group_projects(NAME "liblove" TARGETS liblove ${LOVE_EXTRA_DEPENDECIES})
+
+love_group_projects(NAME "lovedep" TARGETS lovedep::SDL2 lovedep::Freetype lovedep::Harfbuzz lovedep::OpenAL lovedep::Modplug lovedep::Theora lovedep::Vorbis lovedep::Ogg lovedep::Zlib lovedep::Lua)
+love_group_projects(NAME "lovedep" TARGETS lua51 alcommon al-excommon harfbuzz-subset zlib)
+
+
 if(MSVC)
 	set_target_properties(liblove PROPERTIES RELEASE_OUTPUT_NAME "love" PDB_NAME "liblove" IMPORT_PREFIX "lib")
 	set_target_properties(liblove PROPERTIES DEBUG_OUTPUT_NAME "love" PDB_NAME "liblove" IMPORT_PREFIX "lib")

+ 33 - 0
extra/cmake/LoveMacros.cmake

@@ -0,0 +1,33 @@
+
+# Group all related stuff in folders in Visual Studio
+
+function(love_group_projects)
+	set(options NESTED)
+	set(oneValueArgs NAME)
+	set(multiValueArgs TARGETS)
+	cmake_parse_arguments(LOVE_GROUP "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+	foreach(TARGET_NAME ${LOVE_GROUP_TARGETS})
+		if (TARGET ${TARGET_NAME})
+			get_target_property(TARGET_TYPE ${TARGET_NAME} TYPE)
+			# If this is an interface target, walk the children
+			if (${TARGET_TYPE} STREQUAL "INTERFACE_LIBRARY")
+				get_target_property(TARGET_LIBS ${TARGET_NAME} INTERFACE_LINK_LIBRARIES)
+				foreach(TARGET_LIB ${TARGET_LIBS})
+					# Is this a target? (Could also be a .lib file)
+					if (TARGET ${TARGET_LIB})
+						# Do we want to nest per-project?
+						if (LOVE_GROUP_NESTED)
+							set_target_properties(${TARGET_LIB} PROPERTIES FOLDER "${LOVE_GROUP_NAME}/${TARGET_NAME}")
+						else()
+							set_target_properties(${TARGET_LIB} PROPERTIES FOLDER "${LOVE_GROUP_NAME}")
+						endif()
+					endif()
+				endforeach()
+			else()
+				# This is no interface library, so group it under the root 'NAME' node
+				set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "${LOVE_GROUP_NAME}")
+			endif()
+		endif()
+	endforeach()
+endfunction()