From a61375da3d5d0e12568b6ee3c7f0b8b1144c257e Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Sat, 23 Nov 2024 12:46:11 +0000 Subject: [PATCH 1/2] Split more things into libraries This does not fully address the issue of most everything being a giant library but it's a start. Note that the libraries are OBJECT libraries, so they may (and currently do) contain references to missing symbols. Also fixes the implementation of transitive dependency support for OBJECT libraries. --- CMake/functions/devilutionx_library.cmake | 8 +- CMake/functions/object_libraries.cmake | 60 +++ CMake/platforms/uwp_lib.cmake | 5 + CMake/platforms/windows.cmake | 3 + CMake/platforms/windows9x.cmake | 1 + CMakeLists.txt | 14 +- Source/CMakeLists.txt | 599 +++++++++++++++------- Source/platform/android/CMakeLists.txt | 6 +- Source/platform/vita/CMakeLists.txt | 5 +- test/CMakeLists.txt | 30 +- uwp-project/devilutionx.vcxproj | 8 +- 11 files changed, 521 insertions(+), 218 deletions(-) create mode 100644 CMake/functions/object_libraries.cmake diff --git a/CMake/functions/devilutionx_library.cmake b/CMake/functions/devilutionx_library.cmake index 0ba57e24844..f40fa6a0910 100644 --- a/CMake/functions/devilutionx_library.cmake +++ b/CMake/functions/devilutionx_library.cmake @@ -1,5 +1,6 @@ include(functions/genex) include(functions/set_relative_file_macro) +include(functions/object_libraries) # This function is equivalent to `add_library` but applies DevilutionX-specific # compilation flags to it. @@ -68,12 +69,7 @@ function(add_devilutionx_library NAME) set_relative_file_macro(${NAME}) endfunction() -# Same as add_devilutionx_library(${NAME} OBJECT) with an additional -# workaround for https://gitlab.kitware.com/cmake/cmake/-/issues/18090, -# allowing this object library to be "linked" to other object libraries. +# Same as add_devilutionx_library(${NAME} OBJECT). function(add_devilutionx_object_library NAME) add_devilutionx_library(${NAME} OBJECT ${ARGN}) - - # See https://gitlab.kitware.com/cmake/cmake/-/issues/18090 - target_sources(${NAME} INTERFACE $) endfunction() diff --git a/CMake/functions/object_libraries.cmake b/CMake/functions/object_libraries.cmake new file mode 100644 index 00000000000..b85dc71b05d --- /dev/null +++ b/CMake/functions/object_libraries.cmake @@ -0,0 +1,60 @@ +# CMake has limited support for object libraries. +# +# The main limitation of CMake object libraries is the lack +# of transitive dependency support. +# The functions here provide a workaround for that. +# +# Use `target_link_dependencies` instead of `target_link_libraries` +# +# https://gitlab.kitware.com/cmake/cmake/-/issues/18090#note_861617 +# +# At the end of the main `CMakeLists.txt`, call `resolve_target_link_dependencies()`. + +# Behaves like target_link_libraries, but propagates OBJECT libraries' objects +# up to the first non-object library. +function(target_link_dependencies TARGET) + # The library we're linking may not have been defined yet, + # so we record it for now and resolve it later. + set_property(TARGET ${TARGET} APPEND PROPERTY LINKED_DEPENDENCIES ${ARGN}) + set_property(GLOBAL APPEND PROPERTY TARGETS_WITH_LINKED_DEPENDENCIES "${TARGET}") +endfunction() + +# Actually resolves the linked dependencies. +function(resolve_target_link_dependencies) + set(MODES PUBLIC PRIVATE INTERFACE) + get_property(TARGETS GLOBAL PROPERTY TARGETS_WITH_LINKED_DEPENDENCIES) + foreach(TARGET ${TARGETS}) + get_target_property(TARGET_TYPE ${TARGET} TYPE) + get_target_property(LINKED_DEPENDENCIES ${TARGET} LINKED_DEPENDENCIES) + set(MODE PUBLIC) + foreach(ARG ${LINKED_DEPENDENCIES}) + if(ARG IN_LIST MODES) + set(MODE ${ARG}) + continue() + endif() + set(LIBRARY "${ARG}") + if(TARGET ${LIBRARY}) + # When linking two OBJECT libraries together, record the input library objects in + # a custom target property "LINKED_OBJECTS" together with any other existing ones + # from the input library's LINKED_OBJECTS property. + # Accumulate LINKED_OBJECTS until reaching a non-object target, and add them as + # extra sources - this will de-duplicate the list and link it into the target. + get_target_property(LIBRARY_TYPE ${LIBRARY} TYPE) + + if(LIBRARY_TYPE STREQUAL "OBJECT_LIBRARY") + if(TARGET_TYPE STREQUAL "INTERFACE_LIBRARY") + message(FATAL_ERROR "OBJECT to INTERFACE library linking is not supported.") + endif() + get_target_property(LIBRARY_LINKED_OBJECTS ${LIBRARY} LINKED_OBJECTS) + if(TARGET_TYPE STREQUAL "OBJECT_LIBRARY") + set_property(TARGET ${TARGET} APPEND PROPERTY LINKED_OBJECTS $) + elseif(NOT LIBRARY_LINKED_OBJECTS STREQUAL "LIBRARY_LINKED_OBJECTS-NOTFOUND") + target_sources(${TARGET} PRIVATE ${LIBRARY_LINKED_OBJECTS}) + endif() + endif() + endif() + target_link_libraries(${TARGET} ${MODE} "${LIBRARY}") + endforeach() + endforeach() + set_property(GLOBAL PROPERTY TARGETS_WITH_LINKED_DEPENDENCIES) +endfunction() diff --git a/CMake/platforms/uwp_lib.cmake b/CMake/platforms/uwp_lib.cmake index 4f93f528a7a..2b74fd13a4a 100644 --- a/CMake/platforms/uwp_lib.cmake +++ b/CMake/platforms/uwp_lib.cmake @@ -25,3 +25,8 @@ set(DEVILUTIONX_STATIC_ZLIB ON) # not really necessary but a good measure for SDL related stuff set(WINDOWS_STORE ON) + +add_library(uwp_defs INTERFACE) +target_compile_definitions(uwp_defs INTERFACE __UWP__=1) +set(DEVILUTIONX_PLATFORM_ASSETS_LINK_LIBRARIES uwp_defs) +set(DEVILUTIONX_PLATFORM_LINK_LIBRARIES uwp_defs) diff --git a/CMake/platforms/windows.cmake b/CMake/platforms/windows.cmake index 90cd4445c3e..766d81a45d2 100644 --- a/CMake/platforms/windows.cmake +++ b/CMake/platforms/windows.cmake @@ -2,6 +2,9 @@ set(ASAN OFF) set(UBSAN OFF) set(DIST ON) +set(DEVILUTIONX_PLATFORM_FILE_UTIL_LINK_LIBRARIES shlwapi) +set(DEVILUTIONX_PLATFORM_ASSETS_LINK_LIBRARIES find_steam_game) + list(APPEND DEVILUTIONX_PLATFORM_LINK_LIBRARIES find_steam_game shlwapi diff --git a/CMake/platforms/windows9x.cmake b/CMake/platforms/windows9x.cmake index d070cbe06d0..326fefea58c 100644 --- a/CMake/platforms/windows9x.cmake +++ b/CMake/platforms/windows9x.cmake @@ -19,6 +19,7 @@ set(DEVILUTIONX_WINDOWS_NO_WCHAR ON) # MinGW force-defines `_WIN32_WINNT=0xa00` if it isn't defined, so define it as 0. add_definitions(-DWINVER=0x0500 -D_WIN32_WINDOWS=0x0500 -D_WIN32_WINNT=0) +set(DEVILUTIONX_PLATFORM_FILE_UTIL_LINK_LIBRARIES shlwapi) list(APPEND DEVILUTIONX_PLATFORM_LINK_LIBRARIES shlwapi wsock32 diff --git a/CMakeLists.txt b/CMakeLists.txt index 9eb7d73fafe..15b7469ac14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -335,7 +335,7 @@ endif() if(ANDROID) add_library(${BIN_TARGET} SHARED Source/main.cpp) elseif(UWP_LIB) - add_custom_target(${BIN_TARGET}) # we only need libdevilutionx + set(BIN_TARGET libdevilutionx) else() add_executable(${BIN_TARGET} WIN32 @@ -355,7 +355,7 @@ else() endif() if(NOT UWP_LIB) - target_link_libraries(${BIN_TARGET} PRIVATE libdevilutionx) + target_link_dependencies(${BIN_TARGET} PRIVATE libdevilutionx) endif() if(GPERF) @@ -506,10 +506,6 @@ if(NINTENDO_3DS) add_cia_target(${BIN_TARGET} ${APP_RSF} ${APP_BANNER} ${APP_AUDIO}) endif() -if(UWP_LIB) - target_compile_definitions(libdevilutionx PRIVATE __UWP__=1) -endif() - if(NXDK) target_link_libraries(${BIN_TARGET} PRIVATE "${NXDK_DIR}/lib/libnxdk_automount_d.lib") target_link_options(${BIN_TARGET} PRIVATE "-include:_automount_d_drive") @@ -669,3 +665,9 @@ if(CPACK AND (APPLE OR BUILD_ASSETS_MPQ OR SRC_DIST)) set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) include(CPack) endif() + +resolve_target_link_dependencies() +if(UWP_LIB) + get_target_property(_linked_objects libdevilutionx LINKED_OBJECTS) + target_sources(libdevilutionx PRIVATE ${_linked_objects}) +endif() diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 3bd75d38f7a..4ece6b536e3 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -13,43 +13,24 @@ set(libdevilutionx_SRCS diablo.cpp diablo_msg.cpp doom.cpp - game_mode.cpp gamemenu.cpp gmenu.cpp - headless_mode.cpp help.cpp hwcursor.cpp - init.cpp interfac.cpp inv.cpp - itemdat.cpp - items.cpp - lighting.cpp loadsave.cpp menu.cpp minitext.cpp misdat.cpp missiles.cpp - monstdat.cpp - monster.cpp movie.cpp msg.cpp - multi.cpp nthread.cpp - objdat.cpp - objects.cpp - options.cpp - pack.cpp pfile.cpp - player.cpp - playerdat.cpp plrmsg.cpp portal.cpp - quests.cpp restrict.cpp - spelldat.cpp - spells.cpp - stores.cpp sync.cpp textdat.cpp tmsg.cpp @@ -67,10 +48,6 @@ set(libdevilutionx_SRCS controls/modifier_hints.cpp controls/plrctrls.cpp - data/file.cpp - data/parser.cpp - data/record_reader.cpp - DiabloUI/button.cpp DiabloUI/credits.cpp DiabloUI/credits_lines.cpp @@ -99,9 +76,7 @@ set(libdevilutionx_SRCS engine/actor_position.cpp engine/animationinfo.cpp - engine/assets.cpp engine/backbuffer_state.cpp - engine/direction.cpp engine/dx.cpp engine/events.cpp engine/load_cel.cpp @@ -109,15 +84,11 @@ set(libdevilutionx_SRCS engine/load_clx.cpp engine/load_pcx.cpp engine/palette.cpp - engine/path.cpp - engine/random.cpp engine/sound_position.cpp - engine/surface.cpp engine/ticks.cpp engine/trn.cpp engine/render/automap_render.cpp - engine/render/clx_render.cpp engine/render/dun_render.cpp engine/render/primitive_render.cpp engine/render/scrollrt.cpp @@ -125,12 +96,6 @@ set(libdevilutionx_SRCS items/validation.cpp - levels/crypt.cpp - levels/drlg_l1.cpp - levels/drlg_l2.cpp - levels/drlg_l3.cpp - levels/drlg_l4.cpp - levels/gendung.cpp levels/reencode_dun_cels.cpp levels/setmaps.cpp levels/themes.cpp @@ -184,7 +149,6 @@ set(libdevilutionx_SRCS utils/display.cpp utils/language.cpp utils/logged_fstream.cpp - utils/paths.cpp utils/pcx_to_clx.cpp utils/sdl_bilinear_scale.cpp utils/sdl_thread.cpp @@ -208,38 +172,391 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set_source_files_properties(${_optimize_in_debug_srcs} PROPERTIES COMPILE_OPTIONS "-O2") endif() +# We need to define all the object libraries first +# because our workaround for transitive dependency support +# requires targets to exist when calling `target_link_dependencies` +# (see object_libraries.cmake). + +add_devilutionx_object_library(libdevilutionx_assets + engine/assets.cpp + utils/paths.cpp +) +target_link_dependencies(libdevilutionx_assets PUBLIC + DevilutionX::SDL + fmt::fmt + tl + libdevilutionx_headless_mode + libdevilutionx_game_mode + libdevilutionx_mpq + libdevilutionx_sdl2_to_1_2_backports + libdevilutionx_sound + libdevilutionx_strings + ${DEVILUTIONX_PLATFORM_ASSETS_LINK_LIBRARIES} +) + +add_devilutionx_object_library(libdevilutionx_clx_render + engine/render/clx_render.cpp +) +target_link_dependencies(libdevilutionx_clx_render PUBLIC + DevilutionX::SDL + fmt::fmt + libdevilutionx_lighting + libdevilutionx_strings +) + +add_devilutionx_object_library(libdevilutionx_codec + codec.cpp + sha.cpp +) +target_link_dependencies(libdevilutionx_codec PRIVATE + DevilutionX::SDL + libdevilutionx_log +) + +add_devilutionx_object_library(libdevilutionx_crawl + crawl.cpp +) +target_link_dependencies(libdevilutionx_crawl PUBLIC + tl +) + +add_devilutionx_object_library(libdevilutionx_direction + engine/direction.cpp +) + +add_devilutionx_object_library(libdevilutionx_surface + engine/surface.cpp +) +target_link_dependencies(libdevilutionx_surface PUBLIC + DevilutionX::SDL +) + +add_devilutionx_object_library(libdevilutionx_file_util + utils/file_util.cpp +) +target_link_dependencies(libdevilutionx_file_util PRIVATE + DevilutionX::SDL + libdevilutionx_log + ${DEVILUTIONX_PLATFORM_FILE_UTIL_LINK_LIBRARIES} +) + +add_devilutionx_object_library(libdevilutionx_format_int + utils/format_int.cpp +) +target_link_dependencies(libdevilutionx_format_int PUBLIC + libdevilutionx_strings +) + +add_devilutionx_object_library(libdevilutionx_game_mode + game_mode.cpp +) + +add_devilutionx_object_library(libdevilutionx_gendung + levels/crypt.cpp + levels/drlg_l1.cpp + levels/drlg_l2.cpp + levels/drlg_l3.cpp + levels/drlg_l4.cpp + levels/gendung.cpp +) +target_link_dependencies(libdevilutionx_gendung PUBLIC + DevilutionX::SDL + fmt::fmt + tl + libdevilutionx_assets + libdevilutionx_items + libdevilutionx_monster + libdevilutionx_random +) + +add_devilutionx_object_library(libdevilutionx_headless_mode + headless_mode.cpp +) + +add_devilutionx_object_library(libdevilutionx_init + init.cpp +) +target_link_dependencies(libdevilutionx_init PUBLIC + libdevilutionx_assets + libdevilutionx_config +) + +add_devilutionx_object_library(libdevilutionx_lighting + lighting.cpp +) +target_link_dependencies(libdevilutionx_lighting PUBLIC + DevilutionX::SDL + fmt::fmt + tl +) + +add_devilutionx_object_library(libdevilutionx_items + itemdat.cpp + items.cpp +) +target_link_dependencies(libdevilutionx_items PUBLIC + DevilutionX::SDL + tl + libdevilutionx_headless_mode + libdevilutionx_sound + libdevilutionx_spells + libdevilutionx_stores + libdevilutionx_strings +) + +add_devilutionx_object_library(libdevilutionx_ini + utils/ini.cpp +) +target_link_dependencies(libdevilutionx_ini PUBLIC + fmt::fmt + tl + unordered_dense::unordered_dense + libdevilutionx_strings + libdevilutionx_utf8 +) + +# We use an INTERFACE library rather than an OBJECT library +# because `libdevilutionx_log` does not have any sources. +add_library(libdevilutionx_log INTERFACE) +target_include_directories(libdevilutionx_log INTERFACE + ${PROJECT_SOURCE_DIR}/Source) +target_link_libraries(libdevilutionx_log INTERFACE + DevilutionX::SDL + fmt::fmt +) +target_sources(libdevilutionx_log INTERFACE $) + +add_devilutionx_object_library(libdevilutionx_level_objects + objdat.cpp + objects.cpp +) +target_link_dependencies(libdevilutionx_level_objects PUBLIC + DevilutionX::SDL + unordered_dense::unordered_dense + tl + libdevilutionx_direction + libdevilutionx_headless_mode + libdevilutionx_monster + libdevilutionx_options + libdevilutionx_player + libdevilutionx_random + libdevilutionx_txtdata +) + +add_devilutionx_object_library(libdevilutionx_monster + monstdat.cpp + monster.cpp +) +target_link_dependencies(libdevilutionx_monster PUBLIC + DevilutionX::SDL + tl + libdevilutionx_game_mode + libdevilutionx_headless_mode + libdevilutionx_sound + libdevilutionx_txtdata +) + +add_devilutionx_object_library(libdevilutionx_parse_int + utils/parse_int.cpp +) +target_link_dependencies(libdevilutionx_parse_int PUBLIC + tl +) + if(SUPPORTS_MPQ) - list(APPEND libdevilutionx_DEPS libmpq) - list(APPEND libdevilutionx_SRCS + add_devilutionx_object_library(libdevilutionx_mpq mpq/mpq_common.cpp mpq/mpq_reader.cpp mpq/mpq_sdl_rwops.cpp - mpq/mpq_writer.cpp) + mpq/mpq_writer.cpp + ) + target_link_dependencies(libdevilutionx_mpq PUBLIC + DevilutionX::SDL + fmt::fmt + tl + libmpq + libdevilutionx_file_util + libdevilutionx_pkware_encrypt + libdevilutionx_strings + ) +else() + add_library(libdevilutionx_mpq INTERFACE) endif() +add_devilutionx_object_library(libdevilutionx_multiplayer + multi.cpp + pack.cpp +) +target_link_dependencies(libdevilutionx_multiplayer PUBLIC + libdevilutionx_config + libdevilutionx_items +) + +add_devilutionx_object_library(libdevilutionx_options + options.cpp +) +target_link_dependencies(libdevilutionx_options PUBLIC + DevilutionX::SDL + SDL_audiolib::SDL_audiolib + fmt::fmt + tl + ${LUA_LIBRARIES} + sol2::sol2 + libdevilutionx_game_mode + libdevilutionx_strings + libdevilutionx_ini +) + +add_devilutionx_object_library(libdevilutionx_pathfinding + engine/path.cpp +) +target_link_dependencies(libdevilutionx_pathfinding PUBLIC + tl + libdevilutionx_crawl + libdevilutionx_direction + libdevilutionx_gendung + libdevilutionx_level_objects +) + if(SUPPORTS_MPQ OR NOT NONET) - list(APPEND libdevilutionx_DEPS PKWare) - list(APPEND libdevilutionx_SRCS encrypt.cpp) + add_devilutionx_object_library(libdevilutionx_pkware_encrypt + encrypt.cpp + ) + target_link_dependencies(libdevilutionx_pkware_encrypt PUBLIC + DevilutionX::SDL + PKWare + ) +else() + add_library(libdevilutionx_pkware_encrypt INTERFACE) endif() -if(IOS) - list(APPEND libdevilutionx_SRCS platform/ios/ios_paths.m) -endif() +add_devilutionx_object_library(libdevilutionx_player + player.cpp + playerdat.cpp +) +target_link_dependencies(libdevilutionx_player PUBLIC + DevilutionX::SDL + fmt::fmt + tl + unordered_dense::unordered_dense + libdevilutionx_game_mode +) -if(NOT DISABLE_DEMOMODE) - list(APPEND libdevilutionx_SRCS engine/demomode.cpp) -endif() +add_devilutionx_object_library(libdevilutionx_quests + quests.cpp +) +target_link_dependencies(libdevilutionx_quests PUBLIC + libdevilutionx_surface + libdevilutionx_gendung +) + +add_devilutionx_object_library(libdevilutionx_random + engine/random.cpp +) + +add_devilutionx_object_library(libdevilutionx_spells + spelldat.cpp + spells.cpp +) +target_link_dependencies(libdevilutionx_spells PUBLIC + tl + libdevilutionx_player + libdevilutionx_txtdata +) + +add_devilutionx_object_library(libdevilutionx_txtdata + data/file.cpp + data/parser.cpp + data/record_reader.cpp +) +target_link_dependencies(libdevilutionx_txtdata PUBLIC + fmt::fmt + tl + libdevilutionx_assets + libdevilutionx_strings +) + +add_devilutionx_object_library(libdevilutionx_utf8 + utils/utf8.cpp +) +target_link_dependencies(libdevilutionx_utf8 PRIVATE + hoehrmann_utf8 +) if(NOSOUND) - list(APPEND libdevilutionx_SRCS + add_devilutionx_object_library(libdevilutionx_sound effects_stubs.cpp - engine/sound_stubs.cpp) + engine/sound_stubs.cpp + ) else() - list(APPEND libdevilutionx_SRCS + add_devilutionx_object_library(libdevilutionx_sound effects.cpp engine/sound.cpp utils/push_aulib_decoder.cpp - utils/soundsample.cpp) + utils/soundsample.cpp + ) + target_link_dependencies(libdevilutionx_sound PUBLIC + DevilutionX::SDL + SDL_audiolib::SDL_audiolib + fmt::fmt + tl + unordered_dense::unordered_dense + libdevilutionx_sdl2_to_1_2_backports + ) +endif() + +add_devilutionx_object_library(libdevilutionx_stores + stores.cpp +) +target_link_dependencies(libdevilutionx_stores PUBLIC + DevilutionX::SDL + fmt::fmt + tl + libdevilutionx_clx_render + libdevilutionx_options + libdevilutionx_sound + libdevilutionx_strings +) + +add_devilutionx_object_library(libdevilutionx_strings + utils/str_cat.cpp + utils/str_case.cpp +) +target_link_dependencies(libdevilutionx_strings PRIVATE + fmt::fmt) + +add_devilutionx_object_library(libdevilutionx_utils_console + utils/console.cpp +) + +if(USE_SDL1) + add_devilutionx_library(libdevilutionx_sdl2_to_1_2_backports STATIC + utils/sdl2_to_1_2_backports.cpp + ) + target_link_dependencies(libdevilutionx_sdl2_to_1_2_backports PRIVATE + libdevilutionx_utils_console + fmt::fmt + ) + target_link_libraries(DevilutionX::SDL INTERFACE + libdevilutionx_sdl2_to_1_2_backports + ) + if(APPLE) + enable_language(OBJC) + target_sources(libdevilutionx_sdl2_to_1_2_backports PRIVATE + platform/macos_sdl1/SDL_filesystem.m) + target_link_libraries(libdevilutionx_sdl2_to_1_2_backports PRIVATE + "-framework Foundation") + endif() +else() + add_library(libdevilutionx_sdl2_to_1_2_backports INTERFACE) +endif() + +if(IOS) + list(APPEND libdevilutionx_SRCS platform/ios/ios_paths.m) +endif() + +if(NOT DISABLE_DEMOMODE) + list(APPEND libdevilutionx_SRCS engine/demomode.cpp) endif() if(NOT NONET) @@ -287,21 +604,63 @@ if(DEVILUTIONX_SCREENSHOT_FORMAT STREQUAL DEVILUTIONX_SCREENSHOT_FORMAT_PNG) ) endif() -add_devilutionx_library(libdevilutionx OBJECT ${libdevilutionx_SRCS}) +add_devilutionx_object_library(libdevilutionx ${libdevilutionx_SRCS}) target_include_directories(libdevilutionx PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) - -if(SCREEN_READER_INTEGRATION AND NOT WIN32) - target_include_directories(libdevilutionx PUBLIC ${Speechd_INCLUDE_DIRS}) -endif() +target_link_dependencies(libdevilutionx PUBLIC + Threads::Threads + DevilutionX::SDL + fmt::fmt + libsmackerdec + ${LUA_LIBRARIES} + sol2::sol2 + tl + unordered_dense::unordered_dense + libdevilutionx_assets + libdevilutionx_clx_render + libdevilutionx_codec + libdevilutionx_config + libdevilutionx_crawl + libdevilutionx_direction + libdevilutionx_surface + libdevilutionx_file_util + libdevilutionx_format_int + libdevilutionx_game_mode + libdevilutionx_gendung + libdevilutionx_headless_mode + libdevilutionx_ini + libdevilutionx_init + libdevilutionx_items + libdevilutionx_level_objects + libdevilutionx_lighting + libdevilutionx_monster + libdevilutionx_mpq + libdevilutionx_multiplayer + libdevilutionx_options + libdevilutionx_parse_int + libdevilutionx_pathfinding + libdevilutionx_pkware_encrypt + libdevilutionx_player + libdevilutionx_quests + libdevilutionx_random + libdevilutionx_sound + libdevilutionx_spells + libdevilutionx_stores + libdevilutionx_strings + libdevilutionx_txtdata + libdevilutionx_utf8 + libdevilutionx_utils_console +) # Use file GENERATE instead of configure_file because configure_file # does not support generator expressions. get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +add_library(libdevilutionx_config INTERFACE) if(is_multi_config) set(CONFIG_PATH $/config.h) - target_include_directories(libdevilutionx PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/$) + target_include_directories(libdevilutionx_config INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/$) else() set(CONFIG_PATH config.h) + target_include_directories(libdevilutionx_config INTERFACE ${CMAKE_CURRENT_BINARY_DIR}) endif() file(GENERATE OUTPUT ${CONFIG_PATH} CONTENT "#pragma once @@ -317,132 +676,12 @@ if(DISCORD_INTEGRATION) target_link_libraries(libdevilutionx PRIVATE discord discord_game_sdk) endif() -target_link_libraries(libdevilutionx PUBLIC ${LUA_LIBRARIES} sol2::sol2) - -if(SCREEN_READER_INTEGRATION AND WIN32) - target_compile_definitions(libdevilutionx PRIVATE Tolk) -endif() - -add_devilutionx_object_library(libdevilutionx_utils_console - utils/console.cpp -) - -if(USE_SDL1) - add_devilutionx_library(libdevilutionx_sdl2_to_1_2_backports STATIC - utils/sdl2_to_1_2_backports.cpp - ) - target_link_libraries(libdevilutionx_sdl2_to_1_2_backports PRIVATE - libdevilutionx_utils_console - fmt::fmt - ) - target_link_libraries(DevilutionX::SDL INTERFACE - libdevilutionx_sdl2_to_1_2_backports - ) - if(APPLE) - enable_language(OBJC) - target_sources(libdevilutionx_sdl2_to_1_2_backports PRIVATE - platform/macos_sdl1/SDL_filesystem.m) - target_link_libraries(libdevilutionx_sdl2_to_1_2_backports PRIVATE - "-framework Foundation") - endif() -endif() - -add_devilutionx_object_library(libdevilutionx_codec - codec.cpp - sha.cpp -) -target_link_libraries(libdevilutionx_codec PRIVATE - DevilutionX::SDL - libdevilutionx_log -) - -add_devilutionx_object_library(libdevilutionx_crawl - crawl.cpp -) -target_link_libraries(libdevilutionx_crawl PUBLIC - tl -) - -add_devilutionx_object_library(libdevilutionx_file_util - utils/file_util.cpp -) -target_link_libraries(libdevilutionx_file_util PRIVATE - DevilutionX::SDL - libdevilutionx_log - ${DEVILUTIONX_PLATFORM_LINK_LIBRARIES} -) - -add_devilutionx_object_library(libdevilutionx_format_int - utils/format_int.cpp -) -target_link_libraries(libdevilutionx_format_int PUBLIC - libdevilutionx_strings -) - -add_devilutionx_object_library(libdevilutionx_ini - utils/ini.cpp -) -target_link_libraries(libdevilutionx_ini PUBLIC - fmt::fmt - tl - unordered_dense::unordered_dense - libdevilutionx_strings - libdevilutionx_utf8 -) - -add_library(libdevilutionx_log INTERFACE) -target_include_directories(libdevilutionx_log INTERFACE - ${PROJECT_SOURCE_DIR}/Source) -target_link_libraries(libdevilutionx_log INTERFACE - DevilutionX::SDL - fmt::fmt - libdevilutionx_strings -) - -add_devilutionx_object_library(libdevilutionx_parse_int - utils/parse_int.cpp -) -target_link_libraries(libdevilutionx_parse_int PUBLIC - tl -) - -add_devilutionx_object_library(libdevilutionx_utf8 - utils/utf8.cpp -) -target_link_libraries(libdevilutionx_utf8 PRIVATE - hoehrmann_utf8 -) - -add_devilutionx_object_library(libdevilutionx_strings - utils/str_cat.cpp - utils/str_case.cpp -) -target_link_libraries(libdevilutionx_strings PRIVATE - fmt::fmt) - -target_link_libraries(libdevilutionx PUBLIC - Threads::Threads - DevilutionX::SDL - fmt::fmt - libsmackerdec - tl - unordered_dense::unordered_dense - libdevilutionx_codec - libdevilutionx_crawl - libdevilutionx_format_int - libdevilutionx_file_util - libdevilutionx_ini - libdevilutionx_parse_int - libdevilutionx_strings - libdevilutionx_utf8 - libdevilutionx_utils_console - ${libdevilutionx_DEPS} -) - if(SCREEN_READER_INTEGRATION) if(WIN32) + target_compile_definitions(libdevilutionx PRIVATE Tolk) target_link_libraries(libdevilutionx PUBLIC Tolk) else() + target_include_directories(libdevilutionx PUBLIC ${Speechd_INCLUDE_DIRS}) target_link_libraries(libdevilutionx PUBLIC speechd) endif() endif() @@ -476,7 +715,7 @@ foreach(path ${DEVILUTIONX_PLATFORM_SUBDIRECTORIES}) add_subdirectory(${path}) endforeach() -target_link_libraries(libdevilutionx PUBLIC ${DEVILUTIONX_PLATFORM_LINK_LIBRARIES}) +target_link_dependencies(libdevilutionx PUBLIC ${DEVILUTIONX_PLATFORM_LINK_LIBRARIES}) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9 AND NOT AMIGA) diff --git a/Source/platform/android/CMakeLists.txt b/Source/platform/android/CMakeLists.txt index 1562f2cd3c0..053208efaf4 100644 --- a/Source/platform/android/CMakeLists.txt +++ b/Source/platform/android/CMakeLists.txt @@ -1,7 +1,7 @@ include(functions/devilutionx_library) add_devilutionx_object_library(libdevilutionx_android android.cpp) -target_link_libraries(libdevilutionx_android PUBLIC +target_link_dependencies(libdevilutionx_android PUBLIC DevilutionX::SDL - fmt::fmt - tl + libdevilutionx_init + libdevilutionx_mpq ) diff --git a/Source/platform/vita/CMakeLists.txt b/Source/platform/vita/CMakeLists.txt index 2f7d5c0bd86..be9b3fcd90d 100644 --- a/Source/platform/vita/CMakeLists.txt +++ b/Source/platform/vita/CMakeLists.txt @@ -18,12 +18,9 @@ endif() target_link_libraries(libdevilutionx_vita PUBLIC DevilutionX::SDL - SDL_audiolib ScePower_stub SceAppUtil_stub SceNet_stub SceNetCtl_stub - fmt::fmt - tl - unordered_dense::unordered_dense + libdevilutionx_options ) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a8d4f3e46f8..fa7d506dbfb 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -2,12 +2,12 @@ include(GoogleTest) add_library(libdevilutionx_so SHARED) set_target_properties(libdevilutionx_so PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) -target_link_libraries(libdevilutionx_so PUBLIC libdevilutionx) -target_include_directories(libdevilutionx_so INTERFACE "${PROJECT_SOURCE_DIR}/Source") + +target_link_dependencies(libdevilutionx_so PUBLIC libdevilutionx) set_target_properties(libdevilutionx_so PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) -add_library(test_main STATIC main.cpp) -target_link_libraries(test_main PUBLIC libdevilutionx_so GTest::gtest GTest::gmock) +add_library(test_main OBJECT main.cpp) +target_link_dependencies(test_main PUBLIC libdevilutionx_so GTest::gtest GTest::gmock) set(tests animationinfo_test @@ -87,16 +87,16 @@ target_sources(app_fatal_for_testing INTERFACE $) -target_link_libraries(codec_test PRIVATE libdevilutionx_codec app_fatal_for_testing) -target_link_libraries(clx_render_benchmark PRIVATE libdevilutionx_so) -target_link_libraries(crawl_test PRIVATE libdevilutionx_crawl) -target_link_libraries(crawl_benchmark PRIVATE libdevilutionx_crawl) -target_link_libraries(dun_render_benchmark PRIVATE libdevilutionx_so) -target_link_libraries(file_util_test PRIVATE libdevilutionx_file_util app_fatal_for_testing) -target_link_libraries(format_int_test PRIVATE libdevilutionx_format_int language_for_testing) -target_link_libraries(ini_test PRIVATE libdevilutionx_ini app_fatal_for_testing) -target_link_libraries(parse_int_test PRIVATE libdevilutionx_parse_int) -target_link_libraries(str_cat_test PRIVATE libdevilutionx_strings) -target_link_libraries(utf8_test PRIVATE libdevilutionx_utf8) +target_link_dependencies(codec_test PRIVATE libdevilutionx_codec app_fatal_for_testing) +target_link_dependencies(clx_render_benchmark PRIVATE libdevilutionx_so) +target_link_dependencies(crawl_test PRIVATE libdevilutionx_crawl) +target_link_dependencies(crawl_benchmark PRIVATE libdevilutionx_crawl) +target_link_dependencies(dun_render_benchmark PRIVATE libdevilutionx_so) +target_link_dependencies(file_util_test PRIVATE libdevilutionx_file_util app_fatal_for_testing) +target_link_dependencies(format_int_test PRIVATE libdevilutionx_format_int language_for_testing) +target_link_dependencies(ini_test PRIVATE libdevilutionx_ini app_fatal_for_testing) +target_link_dependencies(parse_int_test PRIVATE libdevilutionx_parse_int) +target_link_dependencies(str_cat_test PRIVATE libdevilutionx_strings) +target_link_dependencies(utf8_test PRIVATE libdevilutionx_utf8) target_include_directories(writehero_test PRIVATE ../3rdParty/PicoSHA2) diff --git a/uwp-project/devilutionx.vcxproj b/uwp-project/devilutionx.vcxproj index b389bf0f7b5..4bac7a8ec31 100644 --- a/uwp-project/devilutionx.vcxproj +++ b/uwp-project/devilutionx.vcxproj @@ -79,8 +79,8 @@ pch.h $(IntDir)pch.pch - ..\Source;..\build\SDL\include;..\build\_deps\sdl_audiolib-src\include;..\build\_deps\sdl_audiolib-build;..\build\_deps\unordered_dense-src\include;..\3rdParty\tl;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + ..\Source;..\build\SDL\include;..\build\_deps\sdl_audiolib-src\include;..\build\_deps\sdl_audiolib-build;..\build\_deps\unordered_dense-src\include;..\build\_deps\libfmt-src\include;..\3rdParty\tl;%(AdditionalIncludeDirectories) + /utf-8 /bigobj %(AdditionalOptions) 4453;28204 _DEBUG;__UWP__=1;%(PreprocessorDefinitions) NotUsing @@ -98,11 +98,11 @@ pch.h $(IntDir)pch.pch - /bigobj %(AdditionalOptions) + /utf-8 /bigobj %(AdditionalOptions) 4453;28204 NDEBUG;__UWP__=1;%(PreprocessorDefinitions) NotUsing - ..\Source;..\build\SDL\include;..\build\_deps\sdl_audiolib-src\include;..\build\_deps\sdl_audiolib-build;..\build\_deps\unordered_dense-src\include;..\3rdParty\tl;%(AdditionalIncludeDirectories) + ..\Source;..\build\SDL\include;..\build\_deps\sdl_audiolib-src\include;..\build\_deps\sdl_audiolib-build;..\build\_deps\unordered_dense-src\include;..\build\_deps\libfmt-src\include;..\3rdParty\tl;%(AdditionalIncludeDirectories) stdcpp17 From bad71dca4f37c984a8e0b541a84f447eea5c3b80 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Sun, 24 Nov 2024 21:25:50 +0000 Subject: [PATCH 2/2] Bump macOS target to 10.13.0 Apparently required for `std::visit` --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 15b7469ac14..cf242316f8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -393,9 +393,9 @@ if(APPLE) set(MACOSX_BUNDLE_REQUIRED_PLATFORM IPhoneOS) set_target_properties(${BIN_TARGET} PROPERTIES XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2") set(CMAKE_OSX_DEPLOYMENT_TARGET "9.0") - elseif(DARWIN_MAJOR_VERSION GREATER_EQUAL 16) + elseif(DARWIN_MAJOR_VERSION GREATER_EQUAL 17) set(MACOSX_BUNDLE_REQUIRED_PLATFORM Carbon) - set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12.0") + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13.0") endif() if(DARWIN_MAJOR_VERSION VERSION_LESS 9) # Finder on OSX Tiger can only handle icns files with up to 128x128 icons.