Browse Source

Merge pull request #2051 from learn-more/vs_grouping

Group liblove and lovedep projects in Visual Studio
Sasha Szpakowski 1 year ago
parent
commit
8ceae23aa3
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_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_POSITION_INDEPENDENT_CODE TRUE) # Needed for shared libs on Linux. (-fPIC).
 set(CMAKE_CXX_STANDARD 17)
 set(CMAKE_CXX_STANDARD 17)
+set_property(GLOBAL PROPERTY USE_FOLDERS ON)	# Allow grouping projects in Visual Studio
 
 
 if(APPLE)
 if(APPLE)
 	message(WARNING "CMake is not an officially supported build system for love on Apple platforms.")
 	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")
 	message(WARNING "Please see https://github.com/love2d/megasource")
 endif()
 endif()
 
 
+include(LoveMacros)
+
 # Extract version.h contents.
 # Extract version.h contents.
 file(READ ${CMAKE_CURRENT_SOURCE_DIR}/src/common/version.h LOVE_VERSION_FILE_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
 	CXX_VISIBILITY_PRESET hidden
 	VISIBILITY_INLINES_HIDDEN ON
 	VISIBILITY_INLINES_HIDDEN ON
 	LIBRARY_OUTPUT_NAME "${LOVE_LIB_NAME}")
 	LIBRARY_OUTPUT_NAME "${LOVE_LIB_NAME}")
-target_link_libraries(liblove
+set(LIBLOVE_DEPENDENCIES
 	love_common
 	love_common
 	love_audio
 	love_audio
 	love_data
 	love_data
@@ -1937,6 +1940,8 @@ target_link_libraries(liblove
 	love_touch
 	love_touch
 	love_video
 	love_video
 	love_window
 	love_window
+)
+set(LIBLOVE_LIBRARIES
 	love_3p_box2d
 	love_3p_box2d
 	love_3p_ddsparse
 	love_3p_ddsparse
 	love_3p_enet
 	love_3p_enet
@@ -1953,11 +1958,24 @@ target_link_libraries(liblove
 	love_3p_wuff
 	love_3p_wuff
 	love_3p_xxhash
 	love_3p_xxhash
 )
 )
+target_link_libraries(liblove ${LIBLOVE_DEPENDENCIES} ${LIBLOVE_LIBRARIES})
 
 
 if(LOVE_EXTRA_DEPENDECIES)
 if(LOVE_EXTRA_DEPENDECIES)
 	add_dependencies(liblove ${LOVE_EXTRA_DEPENDECIES})
 	add_dependencies(liblove ${LOVE_EXTRA_DEPENDECIES})
 endif()
 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)
 if(MSVC)
 	set_target_properties(liblove PROPERTIES RELEASE_OUTPUT_NAME "love" PDB_NAME "liblove" IMPORT_PREFIX "lib")
 	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")
 	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()