Browse Source

Build each module as its own static library

Which means everything still mostly behaves the same, except we now have
cmake targets which we can manipulate, rather than a bunch of global
variables.

For ease of use I've matched the existing variables, so love.event is
split into love_event_root and love_event_sdl, and there is a separate
(pseudo) target love_event which combines them both.

I have also simplified the windows-specific additions to liblove.
Instead of altering the variables, they now just add to the liblove
target.

Unfortunately, it does mean we lose the global include directory list,
so we need to add dependencies on a per-module basis. The upside is that
this more accurately models the dependencies. If you remove a module,
its dependencies should now automatically go unused.
Bart van Strien 1 year ago
parent
commit
89cffddb15
1 changed files with 295 additions and 228 deletions
  1. 295 228
      CMakeLists.txt

+ 295 - 228
CMakeLists.txt

@@ -247,7 +247,7 @@ endfunction()
 # common
 #
 
-set(LOVE_SRC_COMMON
+add_library(love_common STATIC
 	src/common/android.cpp
 	src/common/android.h
 	src/common/b64.cpp
@@ -297,23 +297,27 @@ set(LOVE_SRC_COMMON
 	src/common/Vector.h
 	src/common/version.h
 )
+target_link_libraries(love_common PUBLIC
+	lovedep::Lua
+	lovedep::SDL2
+)
 
 if (APPLE)
-	set(LOVE_SRC_COMMON ${LOVE_SRC_COMMON}
+	target_sources(love_common PRIVATE
 		src/common/macos.mm
 	)
-	set(LOVE_LINK_LIBRARIES ${LOVE_LINK_LIBRARIES} objc)
-	set(LOVE_LINK_LIBRARIES ${LOVE_LINK_LIBRARIES} "-framework CoreFoundation")
-	set(LOVE_LINK_LIBRARIES ${LOVE_LINK_LIBRARIES} "-framework AppKit")
+	target_link_libraries(love_common PUBLIC
+		objc
+		"-framework CoreFoundation"
+		"-framework AppKit"
+	)
 endif()
 
-source_group("common" FILES ${LOVE_SRC_COMMON})
-
 #
 # love.audio
 #
 
-set(LOVE_SRC_MODULE_AUDIO_ROOT
+add_library(love_audio_root STATIC
 	src/modules/audio/Audio.cpp
 	src/modules/audio/Audio.h
 	src/modules/audio/Source.cpp
@@ -331,8 +335,12 @@ set(LOVE_SRC_MODULE_AUDIO_ROOT
 	src/modules/audio/wrap_RecordingDevice.cpp
 	src/modules/audio/wrap_RecordingDevice.h
 )
+target_link_libraries(love_audio_root PUBLIC
+	lovedep::Lua
+	lovedep::OpenAL
+)
 
-set(LOVE_SRC_MODULE_AUDIO_NULL
+add_library(love_audio_null STATIC
 	src/modules/audio/null/Audio.cpp
 	src/modules/audio/null/Audio.h
 	src/modules/audio/null/Source.cpp
@@ -341,7 +349,7 @@ set(LOVE_SRC_MODULE_AUDIO_NULL
 	src/modules/audio/null/RecordingDevice.h
 )
 
-set(LOVE_SRC_MODULE_AUDIO_OPENAL
+add_library(love_audio_openal STATIC
 	src/modules/audio/openal/Audio.cpp
 	src/modules/audio/openal/Audio.h
 	src/modules/audio/openal/Pool.cpp
@@ -355,22 +363,22 @@ set(LOVE_SRC_MODULE_AUDIO_OPENAL
 	src/modules/audio/openal/Effect.cpp
 	src/modules/audio/openal/Effect.h
 )
-
-set(LOVE_SRC_MODULE_AUDIO
-	${LOVE_SRC_MODULE_AUDIO_ROOT}
-	${LOVE_SRC_MODULE_AUDIO_NULL}
-	${LOVE_SRC_MODULE_AUDIO_OPENAL}
+target_link_libraries(love_audio_openal PUBLIC
+	lovedep::OpenAL
 )
 
-source_group("modules\\audio" FILES ${LOVE_SRC_MODULE_AUDIO_ROOT})
-source_group("modules\\audio\\null" FILES ${LOVE_SRC_MODULE_AUDIO_NULL})
-source_group("modules\\audio\\openal" FILES ${LOVE_SRC_MODULE_AUDIO_OPENAL})
+add_library(love_audio INTERFACE)
+target_link_libraries(love_audio INTERFACE
+	love_audio_root
+	love_audio_null
+	love_audio_openal
+)
 
 #
 # love.data
 #
 
-set(LOVE_SRC_MODULE_DATA
+add_library(love_data STATIC
 	src/modules/data/ByteData.cpp
 	src/modules/data/ByteData.h
 	src/modules/data/CompressedData.cpp
@@ -396,38 +404,45 @@ set(LOVE_SRC_MODULE_DATA
 	src/modules/data/wrap_DataView.cpp
 	src/modules/data/wrap_DataView.h
 )
-
-source_group("modules\\data" FILES ${LOVE_SRC_MODULE_DATA})
+target_link_libraries(love_data PUBLIC
+	lovedep::Lua
+	lovedep::Zlib
+)
 
 #
 # love.event
 #
 
-set(LOVE_SRC_MODULE_EVENT_ROOT
+add_library(love_event_root STATIC
 	src/modules/event/Event.cpp
 	src/modules/event/Event.h
 	src/modules/event/wrap_Event.cpp
 	src/modules/event/wrap_Event.h
 )
+target_link_libraries(love_event_root PUBLIC
+	lovedep::Lua
+	lovedep::SDL2
+)
 
-set(LOVE_SRC_MODULE_EVENT_SDL
+add_library(love_event_sdl STATIC
 	src/modules/event/sdl/Event.cpp
 	src/modules/event/sdl/Event.h
 )
-
-set(LOVE_SRC_MODULE_EVENT
-	${LOVE_SRC_MODULE_EVENT_ROOT}
-	${LOVE_SRC_MODULE_EVENT_SDL}
+target_link_libraries(love_event_sdl PUBLIC
+	lovedep::SDL2
 )
 
-source_group("modules\\event" FILES ${LOVE_SRC_MODULE_EVENT_ROOT})
-source_group("modules\\event\\sdl" FILES ${LOVE_SRC_MODULE_EVENT_SDL})
+add_library(love_event INTERFACE)
+target_link_libraries(love_event INTERFACE
+	love_event_root
+	love_event_sdl
+)
 
 #
 # love.filesystem
 #
 
-set(LOVE_SRC_MODULE_FILESYSTEM_ROOT
+add_library(love_filesystem_root STATIC
 	src/modules/filesystem/File.cpp
 	src/modules/filesystem/File.h
 	src/modules/filesystem/FileData.cpp
@@ -445,8 +460,12 @@ set(LOVE_SRC_MODULE_FILESYSTEM_ROOT
 	src/modules/filesystem/wrap_NativeFile.cpp
 	src/modules/filesystem/wrap_NativeFile.h
 )
+target_link_libraries(love_filesystem_root PUBLIC
+	lovedep::Lua
+	lovedep::SDL2
+)
 
-set(LOVE_SRC_MODULE_FILESYSTEM_PHYSFS
+add_library(love_filesystem_physfs STATIC
 	src/modules/filesystem/physfs/File.cpp
 	src/modules/filesystem/physfs/File.h
 	src/modules/filesystem/physfs/Filesystem.cpp
@@ -454,20 +473,23 @@ set(LOVE_SRC_MODULE_FILESYSTEM_PHYSFS
 	src/modules/filesystem/physfs/PhysfsIo.h
 	src/modules/filesystem/physfs/PhysfsIo.cpp
 )
+if(ANDROID)
+	target_link_libraries(love_filesystem_physfs PUBLIC
+		lovedep::SDL2
+	)
+endif()
 
-set(LOVE_SRC_MODULE_FILESYSTEM
-	${LOVE_SRC_MODULE_FILESYSTEM_ROOT}
-	${LOVE_SRC_MODULE_FILESYSTEM_PHYSFS}
+add_library(love_filesystem INTERFACE)
+target_link_libraries(love_filesystem INTERFACE
+	love_filesystem_root
+	love_filesystem_physfs
 )
 
-source_group("modules\\filesystem" FILES ${LOVE_SRC_MODULE_FILESYSTEM_ROOT})
-source_group("modules\\filesystem\\physfs" FILES ${LOVE_SRC_MODULE_FILESYSTEM_PHYSFS})
-
 #
 # love.font
 #
 
-set(LOVE_SRC_MODULE_FONT_ROOT
+add_library(love_font_root STATIC
 	src/modules/font/BMFontRasterizer.cpp
 	src/modules/font/BMFontRasterizer.h
 	src/modules/font/Font.cpp
@@ -491,8 +513,12 @@ set(LOVE_SRC_MODULE_FONT_ROOT
 	src/modules/font/wrap_Rasterizer.cpp
 	src/modules/font/wrap_Rasterizer.h
 )
+target_link_libraries(love_font_root PUBLIC
+	lovedep::Lua
+	lovedep::Freetype
+)
 
-set(LOVE_SRC_MODULE_FONT_FREETYPE
+add_library(love_font_freetype STATIC
 	src/modules/font/freetype/Font.cpp
 	src/modules/font/freetype/Font.h
 	src/modules/font/freetype/HarfbuzzShaper.cpp
@@ -500,20 +526,22 @@ set(LOVE_SRC_MODULE_FONT_FREETYPE
 	src/modules/font/freetype/TrueTypeRasterizer.cpp
 	src/modules/font/freetype/TrueTypeRasterizer.h
 )
-
-set(LOVE_SRC_MODULE_FONT
-	${LOVE_SRC_MODULE_FONT_ROOT}
-	${LOVE_SRC_MODULE_FONT_FREETYPE}
+target_link_libraries(love_font_freetype PUBLIC
+	lovedep::Freetype
+	lovedep::Harfbuzz
 )
 
-source_group("modules\\font" FILES ${LOVE_SRC_MODULE_FONT_ROOT})
-source_group("modules\\font\\freetype" FILES ${LOVE_SRC_MODULE_FONT_FREETYPE})
+add_library(love_font INTERFACE)
+target_link_libraries(love_font INTERFACE
+	love_font_root
+	love_font_freetype
+)
 
 #
 # love.graphics
 #
 
-set(LOVE_SRC_MODULE_GRAPHICS_ROOT
+add_library(love_graphics_root STATIC
 	src/modules/graphics/Buffer.cpp
 	src/modules/graphics/Buffer.h
 	src/modules/graphics/Deprecations.cpp
@@ -580,8 +608,11 @@ set(LOVE_SRC_MODULE_GRAPHICS_ROOT
 	src/modules/graphics/wrap_Video.cpp
 	src/modules/graphics/wrap_Video.h
 )
+target_link_libraries(love_graphics_root PUBLIC
+	lovedep::Lua
+)
 
-set(LOVE_SRC_MODULE_GRAPHICS_OPENGL
+add_library(love_graphics_opengl STATIC
 	src/modules/graphics/opengl/Buffer.cpp
 	src/modules/graphics/opengl/Buffer.h
 	src/modules/graphics/opengl/FenceSync.cpp
@@ -601,8 +632,11 @@ set(LOVE_SRC_MODULE_GRAPHICS_OPENGL
 	src/modules/graphics/opengl/Texture.cpp
 	src/modules/graphics/opengl/Texture.h
 )
+target_link_libraries(love_graphics_opengl PUBLIC
+	lovedep::SDL2
+)
 
-set(LOVE_SRC_MODULE_GRAPHICS_VULKAN
+add_library(love_graphics_vulkan STATIC
 	src/modules/graphics/vulkan/Graphics.h
 	src/modules/graphics/vulkan/Graphics.cpp
 	src/modules/graphics/vulkan/GraphicsReadback.h
@@ -619,23 +653,24 @@ set(LOVE_SRC_MODULE_GRAPHICS_VULKAN
 	src/modules/graphics/vulkan/Texture.cpp
 	src/modules/graphics/vulkan/Vulkan.h
 	src/modules/graphics/vulkan/Vulkan.cpp
-	src/modules/graphics/vulkan/VulkanWrapper.h)
-
-set(LOVE_SRC_MODULE_GRAPHICS
-	${LOVE_SRC_MODULE_GRAPHICS_ROOT}
-	${LOVE_SRC_MODULE_GRAPHICS_OPENGL}
-	${LOVE_SRC_MODULE_GRAPHICS_VULKAN}
+	src/modules/graphics/vulkan/VulkanWrapper.h
+)
+target_link_libraries(love_graphics_vulkan PUBLIC
+	lovedep::SDL2
 )
 
-source_group("modules\\graphics" FILES ${LOVE_SRC_MODULE_GRAPHICS_ROOT})
-source_group("modules\\graphics\\opengl" FILES ${LOVE_SRC_MODULE_GRAPHICS_OPENGL})
-source_group("modules\\graphics\\vulkan" FILES ${LOVE_SRC_MODULE_GRAPHICS_VULKAN})
+add_library(love_graphics INTERFACE)
+target_link_libraries(love_graphics INTERFACE
+	love_graphics_root
+	love_graphics_opengl
+	love_graphics_vulkan
+)
 
 #
 # love.image
 #
 
-set(LOVE_SRC_MODULE_IMAGE_ROOT
+add_library(love_image_root STATIC
 	src/modules/image/CompressedImageData.cpp
 	src/modules/image/CompressedImageData.h
 	src/modules/image/CompressedSlice.cpp
@@ -655,8 +690,11 @@ set(LOVE_SRC_MODULE_IMAGE_ROOT
 	src/modules/image/wrap_ImageData.cpp
 	src/modules/image/wrap_ImageData.h
 )
+target_link_libraries(love_image_root PUBLIC
+	lovedep::Lua
+)
 
-set(LOVE_SRC_MODULE_IMAGE_MAGPIE
+add_library(love_image_magpie STATIC
 	src/modules/image/magpie/ASTCHandler.cpp
 	src/modules/image/magpie/ASTCHandler.h
 	src/modules/image/magpie/ddsHandler.cpp
@@ -674,20 +712,21 @@ set(LOVE_SRC_MODULE_IMAGE_MAGPIE
 	src/modules/image/magpie/STBHandler.cpp
 	src/modules/image/magpie/STBHandler.h
 )
-
-set(LOVE_SRC_MODULE_IMAGE
-	${LOVE_SRC_MODULE_IMAGE_ROOT}
-	${LOVE_SRC_MODULE_IMAGE_MAGPIE}
+target_link_libraries(love_image_magpie PUBLIC
+	lovedep::Zlib
 )
 
-source_group("modules\\image" FILES ${LOVE_SRC_MODULE_IMAGE_ROOT})
-source_group("modules\\image\\magpie" FILES ${LOVE_SRC_MODULE_IMAGE_MAGPIE})
+add_library(love_image INTERFACE)
+target_link_libraries(love_image INTERFACE
+	love_image_root
+	love_image_magpie
+)
 
 #
 # love.joystick
 #
 
-set(LOVE_SRC_MODULE_JOYSTICK_ROOT
+add_library(love_joystick_root STATIC
 	src/modules/joystick/Joystick.cpp
 	src/modules/joystick/Joystick.h
 	src/modules/joystick/JoystickModule.h
@@ -696,51 +735,60 @@ set(LOVE_SRC_MODULE_JOYSTICK_ROOT
 	src/modules/joystick/wrap_JoystickModule.cpp
 	src/modules/joystick/wrap_JoystickModule.h
 )
+target_link_libraries(love_joystick_root PUBLIC
+	lovedep::Lua
+)
 
-set(LOVE_SRC_MODULE_JOYSTICK_SDL
+add_library(love_joystick_sdl STATIC
 	src/modules/joystick/sdl/Joystick.cpp
 	src/modules/joystick/sdl/Joystick.h
 	src/modules/joystick/sdl/JoystickModule.cpp
 	src/modules/joystick/sdl/JoystickModule.h
 )
-
-set(LOVE_SRC_MODULE_JOYSTICK
-	${LOVE_SRC_MODULE_JOYSTICK_ROOT}
-	${LOVE_SRC_MODULE_JOYSTICK_SDL}
+target_link_libraries(love_joystick_sdl PUBLIC
+	lovedep::SDL2
 )
 
-source_group("modules\\joystick" FILES ${LOVE_SRC_MODULE_JOYSTICK_ROOT})
-source_group("modules\\joystick\\sdl" FILES ${LOVE_SRC_MODULE_JOYSTICK_SDL})
+add_library(love_joystick INTERFACE)
+target_link_libraries(love_joystick INTERFACE
+	love_joystick_root
+	love_joystick_sdl
+)
 
 #
 # love.keyboard
 #
 
-set(LOVE_SRC_MODULE_KEYBOARD_ROOT
+add_library(love_keyboard_root STATIC
 	src/modules/keyboard/Keyboard.cpp
 	src/modules/keyboard/Keyboard.h
 	src/modules/keyboard/wrap_Keyboard.cpp
 	src/modules/keyboard/wrap_Keyboard.h
 )
+target_link_libraries(love_keyboard_root PUBLIC
+	lovedep::Lua
+	lovedep::SDL2
+)
 
-set(LOVE_SRC_MODULE_KEYBOARD_SDL
+add_library(love_keyboard_sdl STATIC
 	src/modules/keyboard/sdl/Keyboard.cpp
 	src/modules/keyboard/sdl/Keyboard.h
 )
-
-set(LOVE_SRC_MODULE_KEYBOARD
-	${LOVE_SRC_MODULE_KEYBOARD_ROOT}
-	${LOVE_SRC_MODULE_KEYBOARD_SDL}
+target_link_libraries(love_keyboard_sdl PUBLIC
+	lovedep::SDL2
 )
 
-source_group("modules\\keyboard" FILES ${LOVE_SRC_MODULE_KEYBOARD_ROOT})
-source_group("modules\\keyboard\\sdl" FILES ${LOVE_SRC_MODULE_KEYBOARD_SDL})
+add_library(love_keyboard INTERFACE)
+target_link_libraries(love_keyboard INTERFACE
+	love_keyboard_root
+	love_keyboard_sdl
+)
 
 #
 # love.math
 #
 
-set(LOVE_SRC_MODULE_MATH
+add_library(love_math STATIC
 	src/modules/math/BezierCurve.cpp
 	src/modules/math/BezierCurve.h
 	src/modules/math/MathModule.cpp
@@ -758,24 +806,15 @@ set(LOVE_SRC_MODULE_MATH
 	src/modules/math/wrap_Transform.cpp
 	src/modules/math/wrap_Transform.h
 )
-
-source_group("modules\\math" FILES ${LOVE_SRC_MODULE_MATH})
-
-#
-# love (module)
-#
-set(LOVE_SRC_MODULE_LOVE
-	src/modules/love/love.cpp
-	src/modules/love/love.h
+target_link_libraries(love_math PUBLIC
+	lovedep::Lua
 )
 
-source_group("modules\\love" FILES ${LOVE_SRC_MODULE_LOVE})
-
 #
 # love.mouse
 #
 
-set(LOVE_SRC_MODULE_MOUSE_ROOT
+add_library(love_mouse_root STATIC
 	src/modules/mouse/Cursor.cpp
 	src/modules/mouse/Cursor.h
 	src/modules/mouse/Mouse.h
@@ -784,27 +823,32 @@ set(LOVE_SRC_MODULE_MOUSE_ROOT
 	src/modules/mouse/wrap_Mouse.cpp
 	src/modules/mouse/wrap_Mouse.h
 )
+target_link_libraries(love_mouse_root PUBLIC
+	lovedep::Lua
+	lovedep::SDL2
+)
 
-set(LOVE_SRC_MODULE_MOUSE_SDL
+add_library(love_mouse_sdl STATIC
 	src/modules/mouse/sdl/Cursor.cpp
 	src/modules/mouse/sdl/Cursor.h
 	src/modules/mouse/sdl/Mouse.cpp
 	src/modules/mouse/sdl/Mouse.h
 )
-
-set(LOVE_SRC_MODULE_MOUSE
-	${LOVE_SRC_MODULE_MOUSE_ROOT}
-	${LOVE_SRC_MODULE_MOUSE_SDL}
+target_link_libraries(love_mouse_sdl PUBLIC
+	lovedep::SDL2
 )
 
-source_group("modules\\mouse" FILES ${LOVE_SRC_MODULE_MOUSE_ROOT})
-source_group("modules\\mouse\\sdl" FILES ${LOVE_SRC_MODULE_MOUSE_SDL})
+add_library(love_mouse INTERFACE)
+target_link_libraries(love_mouse INTERFACE
+	love_mouse_root
+	love_mouse_sdl
+)
 
 #
 # love.physics
 #
 
-set(LOVE_SRC_MODULE_PHYSICS_ROOT
+add_library(love_physics_root STATIC
 	src/modules/physics/Body.cpp
 	src/modules/physics/Body.h
 	src/modules/physics/Joint.cpp
@@ -813,7 +857,7 @@ set(LOVE_SRC_MODULE_PHYSICS_ROOT
 	src/modules/physics/Shape.h
 )
 
-set(LOVE_SRC_MODULE_PHYSICS_BOX2D
+add_library(love_physics_box2d STATIC
 	src/modules/physics/box2d/Body.cpp
 	src/modules/physics/box2d/Body.h
 	src/modules/physics/box2d/ChainShape.cpp
@@ -899,44 +943,50 @@ set(LOVE_SRC_MODULE_PHYSICS_BOX2D
 	src/modules/physics/box2d/wrap_World.cpp
 	src/modules/physics/box2d/wrap_World.h
 )
-
-set(LOVE_SRC_MODULE_PHYSICS
-	${LOVE_SRC_MODULE_PHYSICS_ROOT}
-	${LOVE_SRC_MODULE_PHYSICS_BOX2D}
+target_link_libraries(love_physics_box2d PUBLIC
+	lovedep::Lua
 )
 
-source_group("modules\\physics" FILES ${LOVE_SRC_MODULE_PHYSICS_ROOT})
-source_group("modules\\physics\\box2d" FILES ${LOVE_SRC_MODULE_PHYSICS_BOX2D})
+add_library(love_physics INTERFACE)
+target_link_libraries(love_physics INTERFACE
+	love_physics_root
+	love_physics_box2d
+)
 
 #
 # love.sensor
 #
 
-set(LOVE_SRC_MODULE_SENSOR_ROOT
+add_library(love_sensor_root STATIC
 	src/modules/sensor/Sensor.cpp
 	src/modules/sensor/Sensor.h
 	src/modules/sensor/wrap_Sensor.cpp
 	src/modules/sensor/wrap_Sensor.h
 )
+target_link_libraries(love_sensor_root PUBLIC
+	lovedep::Lua
+	lovedep::SDL2
+)
 
-set(LOVE_SRC_MODULE_SENSOR_SDL
+add_library(love_sensor_sdl STATIC
 	src/modules/sensor/sdl/Sensor.cpp
 	src/modules/sensor/sdl/Sensor.h
 )
-
-set(LOVE_SRC_MODULE_SENSOR
-	${LOVE_SRC_MODULE_SENSOR_ROOT}
-	${LOVE_SRC_MODULE_SENSOR_SDL}
+target_link_libraries(love_sensor_sdl PUBLIC
+	lovedep::SDL2
 )
 
-source_group("modules\\sensor" FILES ${LOVE_SRC_MODULE_SENSOR_ROOT})
-source_group("modules\\sensor\\sdl" FILES ${LOVE_SRC_MODULE_SENSOR_SDL})
+add_library(love_sensor INTERFACE)
+target_link_libraries(love_sensor INTERFACE
+	love_sensor_root
+	love_sensor_sdl
+)
 
 #
 # love.sound
 #
 
-set(LOVE_SRC_MODULE_SOUND_ROOT
+add_library(love_sound_root STATIC
 	src/modules/sound/Decoder.cpp
 	src/modules/sound/Decoder.h
 	src/modules/sound/Sound.cpp
@@ -950,8 +1000,11 @@ set(LOVE_SRC_MODULE_SOUND_ROOT
 	src/modules/sound/wrap_SoundData.cpp
 	src/modules/sound/wrap_SoundData.h
 )
+target_link_libraries(love_sound_root PUBLIC
+	lovedep::Lua
+)
 
-set(LOVE_SRC_MODULE_SOUND_LULLABY
+add_library(love_sound_lullaby STATIC
 	src/modules/sound/lullaby/FLACDecoder.cpp
 	src/modules/sound/lullaby/FLACDecoder.h
 	src/modules/sound/lullaby/ModPlugDecoder.cpp
@@ -965,44 +1018,52 @@ set(LOVE_SRC_MODULE_SOUND_LULLABY
 	src/modules/sound/lullaby/WaveDecoder.cpp
 	src/modules/sound/lullaby/WaveDecoder.h
 )
-
-set(LOVE_SRC_MODULE_SOUND
-	${LOVE_SRC_MODULE_SOUND_ROOT}
-	${LOVE_SRC_MODULE_SOUND_LULLABY}
+target_link_libraries(love_sound_lullaby PUBLIC
+	lovedep::Modplug
+	lovedep::Vorbis
+	lovedep::Ogg
 )
 
-source_group("modules\\sound" FILES ${LOVE_SRC_MODULE_SOUND_ROOT})
-source_group("modules\\sound\\lullaby" FILES ${LOVE_SRC_MODULE_SOUND_LULLABY})
+add_library(love_sound INTERFACE)
+target_link_libraries(love_sound INTERFACE
+	love_sound_root
+	love_sound_lullaby
+)
 
 #
 # love.system
 #
 
-set(LOVE_SRC_MODULE_SYSTEM_ROOT
+add_library(love_system_root STATIC
 	src/modules/system/System.cpp
 	src/modules/system/System.h
 	src/modules/system/wrap_System.cpp
 	src/modules/system/wrap_System.h
 )
+target_link_libraries(love_system_root PUBLIC
+	lovedep::Lua
+	lovedep::SDL2
+)
 
-set(LOVE_SRC_MODULE_SYSTEM_SDL
+add_library(love_system_sdl STATIC
 	src/modules/system/sdl/System.cpp
 	src/modules/system/sdl/System.h
 )
-
-set(LOVE_SRC_MODULE_SYSTEM
-	${LOVE_SRC_MODULE_SYSTEM_ROOT}
-	${LOVE_SRC_MODULE_SYSTEM_SDL}
+target_link_libraries(love_system_sdl PUBLIC
+	lovedep::SDL2
 )
 
-source_group("modules\\system" FILES ${LOVE_SRC_MODULE_SYSTEM_ROOT})
-source_group("modules\\system\\sdl" FILES ${LOVE_SRC_MODULE_SYSTEM_SDL})
+add_library(love_system INTERFACE)
+target_link_libraries(love_system INTERFACE
+	love_system_root
+	love_system_sdl
+)
 
 #
 # love.thread
 #
 
-set(LOVE_SRC_MODULE_THREAD_ROOT
+add_library(love_thread_root STATIC
 	src/modules/thread/Channel.cpp
 	src/modules/thread/Channel.h
 	src/modules/thread/LuaThread.cpp
@@ -1019,63 +1080,72 @@ set(LOVE_SRC_MODULE_THREAD_ROOT
 	src/modules/thread/wrap_ThreadModule.cpp
 	src/modules/thread/wrap_ThreadModule.h
 )
+target_link_libraries(love_thread_root PUBLIC
+	lovedep::Lua
+)
 
-set(LOVE_SRC_MODULE_THREAD_SDL
+add_library(love_thread_sdl STATIC
 	src/modules/thread/sdl/Thread.cpp
 	src/modules/thread/sdl/Thread.h
 	src/modules/thread/sdl/threads.cpp
 	src/modules/thread/sdl/threads.h
 )
-
-set(LOVE_SRC_MODULE_THREAD
-	${LOVE_SRC_MODULE_THREAD_ROOT}
-	${LOVE_SRC_MODULE_THREAD_SDL}
+target_link_libraries(love_thread_sdl PUBLIC
+	lovedep::SDL2
 )
 
-source_group("modules\\thread" FILES ${LOVE_SRC_MODULE_THREAD_ROOT})
-source_group("modules\\thread\\sdl" FILES ${LOVE_SRC_MODULE_THREAD_SDL})
+add_library(love_thread INTERFACE)
+target_link_libraries(love_thread INTERFACE
+	love_thread_root
+	love_thread_sdl
+)
 
 #
 # love.timer
 #
 
-set(LOVE_SRC_MODULE_TIMER
+add_library(love_timer STATIC
 	src/modules/timer/Timer.cpp
 	src/modules/timer/Timer.h
 	src/modules/timer/wrap_Timer.cpp
 	src/modules/timer/wrap_Timer.h
 )
-
-source_group("modules\\timer" FILES ${LOVE_SRC_MODULE_TIMER})
+target_link_libraries(love_timer PUBLIC
+	lovedep::Lua
+)
 
 #
 # love.touch
 #
 
-set(LOVE_SRC_MODULE_TOUCH_ROOT
+add_library(love_touch_root STATIC
 	src/modules/touch/Touch.h
 	src/modules/touch/wrap_Touch.cpp
 	src/modules/touch/wrap_Touch.h
 )
+target_link_libraries(love_touch_root PUBLIC
+	lovedep::Lua
+	lovedep::SDL2
+)
 
-set(LOVE_SRC_MODULE_TOUCH_SDL
+add_library(love_touch_sdl STATIC
 	src/modules/touch/sdl/Touch.cpp
 	src/modules/touch/sdl/Touch.h
 )
-
-set(LOVE_SRC_MODULE_TOUCH
-	${LOVE_SRC_MODULE_TOUCH_ROOT}
-	${LOVE_SRC_MODULE_TOUCH_SDL}
+target_link_libraries(love_touch_sdl PUBLIC
+	lovedep::SDL2
 )
 
-source_group("modules\\touch" FILES ${LOVE_SRC_MODULE_TOUCH_ROOT})
-source_group("modules\\touch\\sdl" FILES ${LOVE_SRC_MODULE_TOUCH_SDL})
-
+add_library(love_touch INTERFACE)
+target_link_libraries(love_touch INTERFACE
+	love_touch_root
+	love_touch_sdl
+)
 #
 # love.video
 #
 
-set(LOVE_SRC_MODULE_VIDEO_ROOT
+add_library(love_video_root STATIC
 	src/modules/video/Video.h
 	src/modules/video/VideoStream.cpp
 	src/modules/video/VideoStream.h
@@ -1084,8 +1154,13 @@ set(LOVE_SRC_MODULE_VIDEO_ROOT
 	src/modules/video/wrap_VideoStream.cpp
 	src/modules/video/wrap_VideoStream.h
 )
+target_link_libraries(love_video_root PUBLIC
+	lovedep::Lua
+	lovedep::Theora
+	lovedep::Ogg
+)
 
-set(LOVE_SRC_MODULE_VIDEO_THEORA
+add_library(love_video_theora STATIC
 	src/modules/video/theora/Video.cpp
 	src/modules/video/theora/Video.h
 	src/modules/video/theora/OggDemuxer.cpp
@@ -1093,38 +1168,45 @@ set(LOVE_SRC_MODULE_VIDEO_THEORA
 	src/modules/video/theora/TheoraVideoStream.cpp
 	src/modules/video/theora/TheoraVideoStream.h
 )
-
-set(LOVE_SRC_MODULE_VIDEO
-	${LOVE_SRC_MODULE_VIDEO_ROOT}
-	${LOVE_SRC_MODULE_VIDEO_THEORA}
+target_link_libraries(love_video_theora PUBLIC
+	lovedep::Theora
+	lovedep::Ogg
 )
 
-source_group("modules\\video" FILES ${LOVE_SRC_MODULE_VIDEO_ROOT})
-source_group("modules\\video\\theora" FILES ${LOVE_SRC_MODULE_VIDEO_THEORA})
+add_library(love_video INTERFACE)
+target_link_libraries(love_video INTERFACE
+	love_video_root
+	love_video_theora
+)
 
 #
 # love.window
 #
 
-set(LOVE_SRC_MODULE_WINDOW_ROOT
+add_library(love_window_root STATIC
 	src/modules/window/Window.cpp
 	src/modules/window/Window.h
 	src/modules/window/wrap_Window.cpp
 	src/modules/window/wrap_Window.h
 )
+target_link_libraries(love_window_root PUBLIC
+	lovedep::Lua
+	lovedep::SDL2
+)
 
-set(LOVE_SRC_MODULE_WINDOW_SDL
+add_library(love_window_sdl STATIC
 	src/modules/window/sdl/Window.cpp
 	src/modules/window/sdl/Window.h
 )
-
-set(LOVE_SRC_MODULE_WINDOW
-	${LOVE_SRC_MODULE_WINDOW_ROOT}
-	${LOVE_SRC_MODULE_WINDOW_SDL}
+target_link_libraries(love_window_sdl PUBLIC
+	lovedep::SDL2
 )
 
-source_group("modules\\window" FILES ${LOVE_SRC_MODULE_WINDOW_ROOT})
-source_group("modules\\window\\sdl" FILES ${LOVE_SRC_MODULE_WINDOW_SDL})
+add_library(love_window INTERFACE)
+target_link_libraries(love_window INTERFACE
+	love_window_root
+	love_window_sdl
+)
 
 ###################################
 # Third-party libraries
@@ -1745,32 +1827,6 @@ add_library(love_3p_xxhash
 #
 # liblove
 #
-set(LOVE_LIB_SRC
-	${LOVE_SRC_COMMON}
-	# Modules
-	${LOVE_SRC_MODULE_AUDIO}
-	${LOVE_SRC_MODULE_DATA}
-	${LOVE_SRC_MODULE_EVENT}
-	${LOVE_SRC_MODULE_FILESYSTEM}
-	${LOVE_SRC_MODULE_FONT}
-	${LOVE_SRC_MODULE_GRAPHICS}
-	${LOVE_SRC_MODULE_IMAGE}
-	${LOVE_SRC_MODULE_JOYSTICK}
-	${LOVE_SRC_MODULE_KEYBOARD}
-	${LOVE_SRC_MODULE_LOVE}
-	${LOVE_SRC_MODULE_MATH}
-	${LOVE_SRC_MODULE_MOUSE}
-	${LOVE_SRC_MODULE_PHYSICS}
-	${LOVE_SRC_MODULE_SENSOR}
-	${LOVE_SRC_MODULE_SOUND}
-	${LOVE_SRC_MODULE_SYSTEM}
-	${LOVE_SRC_MODULE_THREAD}
-	${LOVE_SRC_MODULE_TIMER}
-	${LOVE_SRC_MODULE_TOUCH}
-	${LOVE_SRC_MODULE_VIDEO}
-	${LOVE_SRC_MODULE_WINDOW}
-)
-
 include_directories(
 	BEFORE
 	src
@@ -1781,45 +1837,43 @@ include_directories(
 
 link_directories(${LOVE_LINK_DIRS})
 
-set(LOVE_RC)
-
-if(MSVC OR MINGW)
-	set(LOVE_LINK_LIBRARIES ${LOVE_LINK_LIBRARIES}
-		ws2_32${WIN32_LIB_EXT}
-		winmm${WIN32_LIB_EXT}
-		dwmapi${WIN32_LIB_EXT}
-	)
-
-	set(LOVE_RC
-		extra/windows/love.rc
-		extra/windows/love.ico
-	)
-
-	if(MINGW)
-		# UTF-16 flags passed to windres. windres invokes gcc as preprocessor
-		# -> gcc outputs utf8, so windres must read-in codepage 65001 (utf8)
-		set(CMAKE_RC_FLAGS ${CMAKE_RC_FLAGS} "-c 65001 --preprocessor-arg=-finput-charset=UTF-16LE")
-	endif()
+if(MINGW)
+	# UTF-16 flags passed to windres. windres invokes gcc as preprocessor
+	# -> gcc outputs utf8, so windres must read-in codepage 65001 (utf8)
+	set(CMAKE_RC_FLAGS ${CMAKE_RC_FLAGS} "-c 65001 --preprocessor-arg=-finput-charset=UTF-16LE")
 endif()
 
-add_library(liblove SHARED ${LOVE_LIB_SRC} ${LOVE_RC})
+add_library(liblove SHARED
+	src/modules/love/love.cpp
+	src/modules/love/love.h
+)
 set_target_properties(liblove PROPERTIES
 	C_VISIBILITY_PRESET hidden
 	CXX_VISIBILITY_PRESET hidden
 	VISIBILITY_INLINES_HIDDEN ON
 	LIBRARY_OUTPUT_NAME "${LOVE_LIB_NAME}")
 target_link_libraries(liblove
-	lovedep::SDL2
-	lovedep::Freetype
-	lovedep::Harfbuzz
-	lovedep::OpenAL
-	lovedep::Modplug
-	lovedep::Theora
-	lovedep::Vorbis
-	lovedep::Lua
-	lovedep::Ogg
-	lovedep::Zlib
-	lovedep::Lua
+	love_common
+	love_audio
+	love_data
+	love_event
+	love_filesystem
+	love_font
+	love_graphics
+	love_image
+	love_joystick
+	love_keyboard
+	love_math
+	love_mouse
+	love_physics
+	love_sensor
+	love_sound
+	love_system
+	love_thread
+	love_timer
+	love_touch
+	love_video
+	love_window
 	love_3p_box2d
 	love_3p_ddsparse
 	love_3p_enet
@@ -1846,6 +1900,19 @@ if(MSVC)
 	set_target_properties(liblove PROPERTIES DEBUG_OUTPUT_NAME "love" PDB_NAME "liblove" IMPORT_PREFIX "lib")
 endif()
 
+if(MSVC OR MINGW)
+	target_link_libraries(liblove
+		ws2_32${WIN32_LIB_EXT}
+		winmm${WIN32_LIB_EXT}
+		dwmapi${WIN32_LIB_EXT}
+	)
+
+	target_sources(liblove PUBLIC
+		extra/windows/love.rc
+		extra/windows/love.ico
+	)
+endif()
+
 #
 # love (executable)
 #
@@ -1856,7 +1923,7 @@ else()
 	add_executable(love WIN32)
 endif()
 
-target_sources(love PRIVATE src/love.cpp ${LOVE_RC})
+target_sources(love PRIVATE src/love.cpp)
 target_link_libraries(love liblove)
 set_target_properties(love PROPERTIES
 	C_VISIBILITY_PRESET hidden
@@ -1865,7 +1932,7 @@ set_target_properties(love PROPERTIES
 	OUTPUT_NAME ${LOVE_EXE_NAME})
 
 if(MSVC OR MINGW)
-	add_executable(lovec src/love.cpp ${LOVE_RC})
+	add_executable(lovec src/love.cpp)
 	target_link_libraries(lovec liblove)
 	set_target_properties(lovec PROPERTIES
 		OUTPUT_NAME ${LOVE_CONSOLE_EXE_NAME})