diff --git a/CMakeLists.txt b/CMakeLists.txt index a1d8ddcd1..3ca84721c 100644 --- a/CMakeLists.txt +++ b/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") diff --git a/extra/cmake/LoveMacros.cmake b/extra/cmake/LoveMacros.cmake new file mode 100644 index 000000000..ac962e78d --- /dev/null +++ b/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()