cmake_minimum_required(VERSION 3.20) project(MoonWellWarcraftXL LANGUAGES CXX) # WarcraftXL is an untouched upstream v1.1 submodule. Every project-specific # feature below is built as a separately loaded Extensions//.dll. add_subdirectory(vendor/warcraftxl) set(WXL_CORE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/vendor/warcraftxl") set(WXL_EXTERNAL_MODULES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/vendor/modules") set(WXL_LOCAL_MODULES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/modules") function(wxl_add_external_extension extension_name extension_dir) if(NOT CMAKE_SIZEOF_VOID_P EQUAL 4) return() endif() file(GLOB_RECURSE extension_sources CONFIGURE_DEPENDS "${extension_dir}/src/*.cpp") if(NOT extension_sources) message(FATAL_ERROR "WarcraftXL extension '${extension_name}' has no sources in ${extension_dir}/src") endif() set(extension_shared_sources "") if(extension_name STREQUAL "wxl-modern-m2") file(GLOB_RECURSE extension_shared_sources CONFIGURE_DEPENDS "${WXL_CORE_DIR}/src/engine/assets/shared/models/m2/*.cpp") elseif(extension_name STREQUAL "wxl-modern-blp") file(GLOB_RECURSE extension_shared_sources CONFIGURE_DEPENDS "${WXL_CORE_DIR}/src/engine/assets/shared/textures/blp/*.cpp") endif() file(GLOB wxl_sdk_sources CONFIGURE_DEPENDS "${WXL_CORE_DIR}/src/game/*.cpp") add_library(${extension_name} SHARED ${extension_sources} ${extension_shared_sources} ${wxl_sdk_sources}) set_target_properties(${extension_name} PROPERTIES OUTPUT_NAME "${extension_name}" PREFIX "") target_include_directories(${extension_name} PRIVATE "${extension_dir}/src" "${WXL_CORE_DIR}/include" "${WXL_CORE_DIR}/src") target_compile_features(${extension_name} PRIVATE cxx_std_20) target_compile_definitions(${extension_name} PRIVATE WIN32_LEAN_AND_MEAN NOMINMAX _CRT_SECURE_NO_WARNINGS WXL_EXTENSION) if(CLIENT_PATH) add_custom_command(TARGET ${extension_name} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "${CLIENT_PATH}/Extensions/${extension_name}" COMMAND ${CMAKE_COMMAND} -E copy_if_different "$" "${CLIENT_PATH}/Extensions/${extension_name}/${extension_name}.dll" COMMENT "Deploy ${extension_name}.dll -> Extensions/${extension_name}") endif() endfunction() # Official WarcraftXL 1.1 extensions. wxl_add_external_extension(wxl-db2 "${WXL_EXTERNAL_MODULES_DIR}/wxl-db2") wxl_add_external_extension(wxl-modern-adt "${WXL_EXTERNAL_MODULES_DIR}/wxl-modern-adt") wxl_add_external_extension(wxl-modern-blp "${WXL_LOCAL_MODULES_DIR}/wxl-modern-blp") wxl_add_external_extension(wxl-modern-m2 "${WXL_EXTERNAL_MODULES_DIR}/wxl-modern-m2") wxl_add_external_extension(wxl-modern-wmo "${WXL_EXTERNAL_MODULES_DIR}/wxl-modern-wmo") wxl_add_external_extension(wxl-grasswind "${WXL_EXTERNAL_MODULES_DIR}/wxl-grasswind") wxl_add_external_extension(wxl-unit-outline "${WXL_EXTERNAL_MODULES_DIR}/wxl-unit-outline") # MoonWell-owned extensions. wxl-fdid-moonwell sorts after wxl-db2 and before # the modern asset extensions, so it can layer custom CSV mappings over wxl.fdid. wxl_add_external_extension(MoonWell "${WXL_LOCAL_MODULES_DIR}/moonwell") wxl_add_external_extension(wxl-fdid-moonwell "${WXL_LOCAL_MODULES_DIR}/moonwell-fdid") wxl_add_external_extension(wxl-moonwell-storage-fallback "${WXL_LOCAL_MODULES_DIR}/moonwell-storage-fallback") # Recovery loader retained for existing -NativeRenderer workflows. WarcraftXL # 1.1 already ships a native D3D9 forwarding proxy as its standard renderer. if(CMAKE_SIZEOF_VOID_P EQUAL 4) add_library(MoonWellLoader SHARED "${CMAKE_CURRENT_SOURCE_DIR}/loader/d3d9.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/loader/d3d9.def") set_target_properties(MoonWellLoader PROPERTIES OUTPUT_NAME "d3d9-native" PREFIX "" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/artifacts") target_compile_definitions(MoonWellLoader PRIVATE WIN32_LEAN_AND_MEAN NOMINMAX) endif()