Browse Source

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.
pull/7636/head
Gleb Mazovetskiy 1 year ago
parent
commit
7d4332c78c
  1. 8
      CMake/functions/devilutionx_library.cmake
  2. 60
      CMake/functions/object_libraries.cmake
  3. 5
      CMake/platforms/uwp_lib.cmake
  4. 3
      CMake/platforms/windows.cmake
  5. 1
      CMake/platforms/windows9x.cmake
  6. 14
      CMakeLists.txt
  7. 599
      Source/CMakeLists.txt
  8. 6
      Source/platform/android/CMakeLists.txt
  9. 5
      Source/platform/vita/CMakeLists.txt
  10. 30
      test/CMakeLists.txt
  11. 8
      uwp-project/devilutionx.vcxproj

8
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 $<TARGET_OBJECTS:${NAME}>)
endfunction()

60
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 $<TARGET_OBJECTS:${LIBRARY}>)
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()

5
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)

3
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

1
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

14
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()

599
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 $<TARGET_OBJECTS:libdevilutionx_strings>)
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>/config.h)
target_include_directories(libdevilutionx PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>)
target_include_directories(libdevilutionx_config INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>)
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)

6
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
)

5
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
)

30
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_OBJECTS:app_fatal_for_te
add_library(language_for_testing OBJECT language_for_testing.cpp)
target_sources(language_for_testing INTERFACE $<TARGET_OBJECTS:language_for_testing>)
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)

8
uwp-project/devilutionx.vcxproj

@ -79,8 +79,8 @@
<ClCompile>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalIncludeDirectories>..\Source;..\build\SDL\include;..\build\_deps\sdl_audiolib-src\include;..\build\_deps\sdl_audiolib-build;..\build\_deps\unordered_dense-src\include;..\3rdParty\tl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<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)</AdditionalIncludeDirectories>
<AdditionalOptions>/utf-8 /bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<PreprocessorDefinitions>_DEBUG;__UWP__=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
@ -98,11 +98,11 @@
<ClCompile>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>/utf-8 /bigobj %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>
<PreprocessorDefinitions>NDEBUG;__UWP__=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<AdditionalIncludeDirectories>..\Source;..\build\SDL\include;..\build\_deps\sdl_audiolib-src\include;..\build\_deps\sdl_audiolib-build;..\build\_deps\unordered_dense-src\include;..\3rdParty\tl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<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)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
</ItemDefinitionGroup>

Loading…
Cancel
Save