mirror of
https://github.com/dhewm/dhewm3.git
synced 2024-12-11 13:30:59 +00:00
6181f24c44
Refactored the pseudo-custom SDL_main code a bit: SDL_win32_main.c is now only used for SDL1.2, SDL2 and SDL3 have a WinMain() function in win_main.cpp that works pretty much like the SDL2 SDL_main or SDL3 SDL_RunApp() code - except that the argv[] strings passed to the Doom3 main() function (now renamed to SDL_main()) are encoded in ANSI instead of UTF-8, so paths passed as commandline arguments, like dhewm3 +set fs_basepath C:\SüperGämes\Doom3 work with the Win32 ANSI function used by Doom3 to handle paths and files. For this I also moved the stdout/stderr redirection code from SDL_win32_main.c to win_main.cpp and cleaned it up a bit
1397 lines
42 KiB
CMake
1397 lines
42 KiB
CMake
cmake_minimum_required(VERSION 2.6...3.22 FATAL_ERROR)
|
|
project(dhewm3)
|
|
|
|
# TODO
|
|
|
|
# osx: place game .dylib's in the bundle (next to the binary)
|
|
# osx: -weak_framework ?
|
|
|
|
# maybe add these as options:
|
|
# TARGET_MONO
|
|
# SETUP
|
|
# SDK -D_D3SDK
|
|
|
|
# don't add these as options, but document them?
|
|
# IDNET_HOST -DIDNET_HOST=\\"%s\\"' % IDNET_HOST
|
|
# DEBUG_MEMORY -DID_DEBUG_MEMORY', '-DID_REDIRECT_NEWDELETE
|
|
# LIBC_MALLOC -DUSE_LIBC_MALLOC=0
|
|
# ID_NOLANADDRESS -DID_NOLANADDRESS
|
|
|
|
# fallback for cmake versions without add_compile_options
|
|
if(NOT COMMAND add_compile_options)
|
|
function(add_compile_options)
|
|
foreach(arg ${ARGN})
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${arg}" PARENT_SCOPE)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${arg}" PARENT_SCOPE)
|
|
endforeach()
|
|
endfunction()
|
|
endif()
|
|
|
|
option(LINUX_RELEASE_BINS "Set RPATH to \$ORIGIN/libs/ for Linux binary releases" OFF)
|
|
|
|
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/sys/cmake")
|
|
|
|
if(LINUX_RELEASE_BINS)
|
|
message(STATUS "Setting RPATH to \$ORIGIN/libs/ so you can put dependencies in there")
|
|
set(CMAKE_SKIP_RPATH OFF CACHE BOOL "Skip RPATH" FORCE)
|
|
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
|
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
|
set(CMAKE_INSTALL_RPATH "$ORIGIN/libs")
|
|
set(ldflags "${ldflags} -Wl,-z,origin") # not sure this is even needed, but shouldn't hurt
|
|
else()
|
|
set(CMAKE_SKIP_RPATH ON CACHE BOOL "Skip RPATH" FORCE)
|
|
endif()
|
|
|
|
set(DHEWM3BINARY "dhewm3")
|
|
|
|
include(CheckCXXCompilerFlag)
|
|
include(GNUInstallDirs OPTIONAL RESULT_VARIABLE GNUINSTALLDIRS)
|
|
include(TestBigEndian)
|
|
|
|
option(CORE "Build the core" ON)
|
|
option(BASE "Build the base game code" ON)
|
|
option(D3XP "Build the d3xp game code" ON)
|
|
if(MSVC)
|
|
option(TOOLS "Build the tools game code (Visual Studio+SDL2/SDL3 only)" OFF)
|
|
endif()
|
|
option(DEDICATED "Build the dedicated server" OFF)
|
|
option(ONATIVE "Optimize for the host CPU" OFF)
|
|
option(SDL2 "Use SDL2 instead of SDL1.2" ON)
|
|
option(SDL3 "Use SDL3 instead of SDL2 or SDL1.2" OFF)
|
|
option(IMGUI "Build with Dear ImGui integration - requires SDL2/SDL3 and C++11" ON)
|
|
option(REPRODUCIBLE_BUILD "Replace __DATE__ and __TIME__ by hardcoded values for reproducible builds" OFF)
|
|
|
|
option(HARDLINK_GAME "Compile gamecode into executable (no game DLLs)" OFF)
|
|
|
|
if(NOT MSVC) # GCC/clang or compatible, hopefully
|
|
option(FORCE_COLORED_OUTPUT "Always produce ANSI-colored compiler warnings/errors (GCC/Clang only; esp. useful with ninja)." OFF)
|
|
option(ASAN "Enable GCC/Clang Adress Sanitizer (ASan)" OFF) # TODO: MSVC might also support this, somehow?
|
|
option(UBSAN "Enable GCC/Clang Undefined Behavior Sanitizer (UBSan), implies HARDLINK_GAME" OFF)
|
|
|
|
if(UBSAN AND NOT HARDLINK_GAME)
|
|
message(STATUS "UBSAN requires linking the gamecode into the executable, will enable HARDLINK_GAME")
|
|
set(HARDLINK_GAME ON)
|
|
endif()
|
|
endif()
|
|
|
|
if(NOT CMAKE_SYSTEM_PROCESSOR)
|
|
message(FATAL_ERROR "No target CPU architecture set")
|
|
endif()
|
|
|
|
if(NOT CMAKE_SYSTEM_NAME)
|
|
message(FATAL_ERROR "No target OS set")
|
|
endif()
|
|
|
|
# target cpu
|
|
set(cpu ${CMAKE_SYSTEM_PROCESSOR})
|
|
|
|
# Originally, ${CMAKE_SYSTEM_PROCESSOR} was supposed to contain the *target* CPU, according to CMake's documentation.
|
|
# As far as I can tell this has always been broken (always returns host CPU) at least on Windows
|
|
# (see e.g. https://cmake.org/pipermail/cmake-developers/2014-September/011405.html) and wasn't reliable on
|
|
# other systems either, for example on Linux with 32bit userland but 64bit kernel it returned the kernel CPU type
|
|
# (e.g. x86_64 instead of i686). Instead of fixing this, CMake eventually updated their documentation in 3.20,
|
|
# now it's officially the same as CMAKE_HOST_SYSTEM_PROCESSOR except when cross-compiling (where it's explicitly set)
|
|
# So we gotta figure out the actual target CPU type ourselves.. (why am I sticking to this garbage buildsystem?)
|
|
if(NOT (CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_SYSTEM_PROCESSOR))
|
|
# special case: cross-compiling, here CMAKE_SYSTEM_PROCESSOR should be correct, hopefully
|
|
# (just leave cpu at ${CMAKE_SYSTEM_PROCESSOR})
|
|
elseif(MSVC)
|
|
# because all this wasn't ugly enough, it turned out that, unlike standalone CMake, Visual Studio's
|
|
# integrated CMake doesn't set CMAKE_GENERATOR_PLATFORM, so I gave up on guessing the CPU arch here
|
|
# and moved the CPU detection to MSVC-specific code in neo/sys/platform.h
|
|
else() # not MSVC and not cross-compiling, assume GCC or clang (-compatible), seems to work for MinGW as well
|
|
execute_process(COMMAND ${CMAKE_C_COMPILER} "-dumpmachine"
|
|
RESULT_VARIABLE cc_dumpmachine_res
|
|
OUTPUT_VARIABLE cc_dumpmachine_out)
|
|
if(cc_dumpmachine_res EQUAL 0)
|
|
string(STRIP ${cc_dumpmachine_out} cc_dumpmachine_out) # get rid of trailing newline
|
|
message(STATUS "`${CMAKE_C_COMPILER} -dumpmachine` says: \"${cc_dumpmachine_out}\"")
|
|
# gcc -dumpmachine and clang -dumpmachine seem to print something like "x86_64-linux-gnu" (gcc)
|
|
# or "x64_64-pc-linux-gnu" (clang) or "i686-w64-mingw32" (32bit mingw-w64) i.e. starting with the CPU,
|
|
# then "-" and then OS or whatever - so use everything up to first "-"
|
|
string(REGEX MATCH "^[^-]+" cpu ${cc_dumpmachine_out})
|
|
message(STATUS " => CPU architecture extracted from that: \"${cpu}\"")
|
|
else()
|
|
message(WARNING "${CMAKE_C_COMPILER} -dumpmachine failed with error (code) ${cc_dumpmachine_res}")
|
|
message(WARNING "will use the (sometimes incorrect) CMAKE_SYSTEM_PROCESSOR (${cpu}) to determine D3_ARCH")
|
|
endif()
|
|
endif()
|
|
|
|
if(cpu STREQUAL "powerpc")
|
|
set(cpu "ppc")
|
|
elseif(cpu STREQUAL "aarch64")
|
|
# "arm64" is more obvious, and some operating systems (like macOS) use it instead of "aarch64"
|
|
set(cpu "arm64")
|
|
elseif(cpu MATCHES "i.86")
|
|
set(cpu "x86")
|
|
elseif(cpu MATCHES "[aA][mM][dD]64" OR cpu MATCHES "[xX]64")
|
|
set(cpu "x86_64")
|
|
elseif(cpu MATCHES "[aA][rR][mM].*") # some kind of arm..
|
|
# On 32bit Raspbian gcc -dumpmachine returns sth starting with "arm-",
|
|
# while clang -dumpmachine says "arm6k-..." - try to unify that to "arm"
|
|
if(CMAKE_SIZEOF_VOID_P EQUAL 8) # sizeof(void*) == 8 => must be arm64
|
|
set(cpu "arm64")
|
|
else() # should be 32bit arm then (probably "armv7l" "armv6k" or sth like that)
|
|
set(cpu "arm")
|
|
endif()
|
|
endif()
|
|
|
|
# target os
|
|
if(APPLE)
|
|
set(os "macosx")
|
|
else()
|
|
string(TOLOWER "${CMAKE_SYSTEM_NAME}" os)
|
|
endif()
|
|
|
|
add_definitions(-DD3_OSTYPE="${os}" -DD3_SIZEOFPTR=${CMAKE_SIZEOF_VOID_P})
|
|
|
|
if(MSVC)
|
|
# for MSVC D3_ARCH is set in code (in neo/sys/platform.h)
|
|
message(STATUS "Setting -DD3_SIZEOFPTR=${CMAKE_SIZEOF_VOID_P} -DD3_OSTYPE=\"${os}\" - NOT setting D3_ARCH, because we're targeting MSVC (VisualC++)")
|
|
# make sure ${cpu} isn't (cant't be) used by CMake when building with MSVC
|
|
unset(cpu)
|
|
else()
|
|
add_definitions(-DD3_ARCH="${cpu}")
|
|
message(STATUS "Setting -DD3_ARCH=\"${cpu}\" -DD3_SIZEOFPTR=${CMAKE_SIZEOF_VOID_P} -DD3_OSTYPE=\"${os}\" ")
|
|
|
|
if(cpu MATCHES ".*64.*" AND NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
# tough luck if some CPU architecture has "64" in its name but uses 32bit pointers
|
|
message(SEND_ERROR "CMake thinks sizeof(void*) == 4, but the target CPU ${cpu} looks like a 64bit CPU!")
|
|
message(FATAL_ERROR "If you're building in a 32bit chroot on a 64bit host, switch to it with 'linux32 chroot' or at least call cmake with linux32 (or your OSs equivalent)!")
|
|
endif()
|
|
endif()
|
|
|
|
# build type
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
|
|
endif()
|
|
|
|
# precompiled libraries from the dhewm3-libs repo
|
|
if(DHEWM3LIBS)
|
|
if(CMAKE_CROSSCOMPILING)
|
|
set(CMAKE_FIND_ROOT_PATH ${DHEWM3LIBS})
|
|
else()
|
|
set(ENV{CMAKE_PREFIX_PATH} ${DHEWM3LIBS})
|
|
endif()
|
|
|
|
# these are too stupid, give them a hint
|
|
set(ENV{OPENALDIR} ${DHEWM3LIBS})
|
|
set(ENV{SDLDIR} ${DHEWM3LIBS})
|
|
set(ENV{SDL2DIR} ${DHEWM3LIBS})
|
|
endif()
|
|
|
|
if(CMAKE_MAJOR_VERSION LESS 3 OR ( CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION LESS 8 ))
|
|
# cmake < 3.8 doesn't support source_group(TREE ...) so replace it with a dummy
|
|
# (it's only cosmetical anyway, to make source files show up properly in Visual Studio)
|
|
function(source_group)
|
|
endfunction()
|
|
message(STATUS "Using CMake < 3.8, doesn't support source_group(TREE ...), replacing it with a dummy")
|
|
message(STATUS " (this is only relevants for IDEs, doesn't matter for just compiling dhewm3)")
|
|
#else()
|
|
# message(STATUS "Using CMake >= 3.8, supports source_group(TREE ...)")
|
|
endif()
|
|
|
|
# libs
|
|
find_package(OpenAL REQUIRED)
|
|
include_directories(${OPENAL_INCLUDE_DIR})
|
|
|
|
if (SDL3)
|
|
if(SDL2)
|
|
message(WARNING "You enabled both SDL2 and SDL3. Only one can be used at a time, disabling SDL2")
|
|
set(SDL2 OFF CACHE BOOL "Use SDL2 (make sure SDL3 is disabled!)" FORCE)
|
|
endif()
|
|
# 1. Look for a SDL3 package,
|
|
# 2. look for the SDL3-shared component, and
|
|
# 3. fail if the shared component cannot be found.
|
|
find_package(SDL3 REQUIRED CONFIG REQUIRED COMPONENTS SDL3-shared)
|
|
# TODO: include dirs?
|
|
set(SDLx_LIBRARY SDL3::SDL3)
|
|
add_definitions(-DD3_SDL3=1)
|
|
elseif (SDL2)
|
|
# skip SDL2main
|
|
if(APPLE OR WIN32)
|
|
set(SDL2_BUILDING_LIBRARY TRUE)
|
|
endif()
|
|
find_package(SDL2 REQUIRED)
|
|
include_directories(${SDL2_INCLUDE_DIR})
|
|
set(SDLx_LIBRARY ${SDL2_LIBRARY})
|
|
else()
|
|
# skip SDLmain
|
|
if(APPLE OR WIN32)
|
|
set(SDL_BUILDING_LIBRARY TRUE)
|
|
endif()
|
|
find_package(SDL REQUIRED)
|
|
include_directories(${SDL_INCLUDE_DIR})
|
|
set(SDLx_LIBRARY ${SDL_LIBRARY})
|
|
endif()
|
|
|
|
if(REPRODUCIBLE_BUILD)
|
|
# don't use __DATE__ and __TIME__ macros so builds are reproducible
|
|
add_definitions(-DID_REPRODUCIBLE_BUILD)
|
|
endif()
|
|
|
|
if(IMGUI)
|
|
if(SDL2 OR SDL3)
|
|
# we need C++11 for ImGui
|
|
set (CMAKE_CXX_STANDARD 11)
|
|
message(STATUS "Dear ImGui integration enabled")
|
|
else()
|
|
message(WARNING "Disabling IMGUI because SDL1.2 is used - it needs SDL2 or SDL3!")
|
|
set(IMGUI OFF)
|
|
add_definitions(-DIMGUI_DISABLE)
|
|
endif()
|
|
else()
|
|
message(STATUS "Dear ImGui integration disabled")
|
|
add_definitions(-DIMGUI_DISABLE)
|
|
endif()
|
|
|
|
find_package(CURL QUIET)
|
|
if(CURL_FOUND)
|
|
set(ID_ENABLE_CURL ON)
|
|
include_directories(${CURL_INCLUDE_DIR})
|
|
message(STATUS "libcurl found and enabled")
|
|
else()
|
|
message(WARNING "libcurl not found, server downloads won't be available (apart from that dhewm3 will work)")
|
|
set(ID_ENABLE_CURL OFF)
|
|
set(CURL_LIBRARY "")
|
|
endif()
|
|
|
|
set(D3_COMPILER_IS_CLANG FALSE)
|
|
set(D3_COMPILER_IS_GCC_OR_CLANG FALSE)
|
|
|
|
if(MSVC)
|
|
# This is required for tools on windows.
|
|
find_package(MFC)
|
|
|
|
if(TOOLS AND NOT MFC_FOUND)
|
|
message(SEND_ERROR "MFC ('Microsoft Foundation Classes for C++') couldn't be found, but is needed for TOOLS!")
|
|
message(FATAL_ERROR "If you're using VS2013, you'll also need the 'Multibyte MFC Library for Visual Studio 2013': https://www.microsoft.com/en-us/download/details.aspx?id=40770 (VS2015 and 2017 include that in the default MFC package)")
|
|
endif()
|
|
|
|
else() # not MSVC
|
|
|
|
if(NOT WIN32)
|
|
# libbacktrace support - TODO: might work with MinGW? we don't have a crash handler for win32 though..
|
|
include(CheckCSourceCompiles)
|
|
set(CMAKE_REQUIRED_LIBRARIES backtrace)
|
|
check_c_source_compiles( "#include <backtrace.h>
|
|
int main() { backtrace_create_state(NULL, 0, NULL, NULL); return 0; }" HAVE_LIBBACKTRACE )
|
|
unset(CMAKE_REQUIRED_LIBRARIES)
|
|
|
|
if(HAVE_LIBBACKTRACE)
|
|
set(sys_libs ${sys_libs} backtrace)
|
|
add_definitions(-DD3_HAVE_LIBBACKTRACE)
|
|
message(STATUS "Using libbacktrace")
|
|
else()
|
|
message(WARNING "libbacktrace wasn't found. It's not required but recommended, because it provides useful backtraces if dhewm3 crashes")
|
|
endif()
|
|
|
|
# check if our SDL2 supports X11 in SDL_syswm so we can use it for DPI scaling ImGui
|
|
if(SDL2) # TODO: SDL3? Or just kick this feature?
|
|
set(CMAKE_REQUIRED_LIBRARIES SDL2)
|
|
check_c_source_compiles( "#include <SDL_syswm.h>
|
|
int main() { SDL_SysWMinfo wmInfo = {}; wmInfo.info.x11.display = NULL; return 0; }" HAVE_SDL_X11)
|
|
unset(CMAKE_REQUIRED_LIBRARIES)
|
|
|
|
if(HAVE_SDL_X11)
|
|
message(STATUS "This SDL2 has X11 support")
|
|
add_definitions(-DD3_SDL_X11)
|
|
endif()
|
|
endif()
|
|
endif() # NOT WIN32
|
|
|
|
# check if this is some kind of clang (Clang, AppleClang, whatever)
|
|
# (convert compiler ID to lowercase so we match Clang, clang, AppleClang etc, regardless of case)
|
|
string(TOLOWER ${CMAKE_CXX_COMPILER_ID} compiler_id_lower)
|
|
if(compiler_id_lower MATCHES ".*clang.*")
|
|
message(STATUS "Compiler \"${CMAKE_CXX_COMPILER_ID}\" detected as some kind of clang")
|
|
set(D3_COMPILER_IS_CLANG TRUE)
|
|
set(D3_COMPILER_IS_GCC_OR_CLANG TRUE)
|
|
elseif(CMAKE_COMPILER_IS_GNUCC)
|
|
set(D3_COMPILER_IS_GCC_OR_CLANG TRUE)
|
|
endif()
|
|
unset(compiler_id_lower)
|
|
|
|
endif() # not MSVC
|
|
|
|
TEST_BIG_ENDIAN(is_big_endian)
|
|
if(is_big_endian)
|
|
message(STATUS "Detected Big Endian architecture, setting -DD3_IS_BIG_ENDIAN=1")
|
|
add_definitions(-DD3_IS_BIG_ENDIAN=1)
|
|
else()
|
|
message(STATUS "Detected Little Endian architecture, setting -DD3_IS_BIG_ENDIAN=0")
|
|
add_definitions(-DD3_IS_BIG_ENDIAN=0)
|
|
endif()
|
|
|
|
# compiler specific flags
|
|
if(D3_COMPILER_IS_GCC_OR_CLANG)
|
|
add_compile_options(-pipe)
|
|
add_compile_options(-Wall)
|
|
|
|
if(NOT CMAKE_CROSSCOMPILING AND ONATIVE)
|
|
add_compile_options(-march=native)
|
|
elseif(NOT APPLE AND cpu STREQUAL "x86")
|
|
add_compile_options(-march=pentium3)
|
|
endif()
|
|
|
|
if(FORCE_COLORED_OUTPUT)
|
|
if(CMAKE_COMPILER_IS_GNUCC)
|
|
add_compile_options (-fdiagnostics-color=always)
|
|
elseif (D3_COMPILER_IS_CLANG)
|
|
add_compile_options (-fcolor-diagnostics)
|
|
endif ()
|
|
endif ()
|
|
|
|
set(CMAKE_C_FLAGS_DEBUG "-g -ggdb -D_DEBUG -O0")
|
|
set(CMAKE_C_FLAGS_DEBUGALL "-g -ggdb -D_DEBUG")
|
|
set(CMAKE_C_FLAGS_PROFILE "-g -ggdb -D_DEBUG -O1 -fno-omit-frame-pointer")
|
|
set(CMAKE_C_FLAGS_RELEASE "-O2 -fno-math-errno -fno-trapping-math -ffinite-math-only -fomit-frame-pointer")
|
|
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -ggdb -O2 -fno-math-errno -fno-trapping-math -ffinite-math-only -fno-omit-frame-pointer")
|
|
set(CMAKE_C_FLAGS_MINSIZEREL "-Os -fno-math-errno -fno-trapping-math -ffinite-math-only -fomit-frame-pointer")
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUGALL ${CMAKE_C_FLAGS_DEBUGALL})
|
|
set(CMAKE_CXX_FLAGS_PROFILE ${CMAKE_C_FLAGS_PROFILE})
|
|
|
|
add_compile_options(-fno-strict-aliasing)
|
|
# dear idiot compilers, don't fuck up math code with useless FMA "optimizations"
|
|
# (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100839)
|
|
CHECK_CXX_COMPILER_FLAG("-ffp-contract=off" cxx_has_fp-contract)
|
|
if(cxx_has_fp-contract)
|
|
add_compile_options(-ffp-contract=off)
|
|
endif()
|
|
|
|
if(ASAN)
|
|
# if this doesn't work, ASan might not be available on your platform, don't set ASAN then..
|
|
add_compile_options(-fsanitize=address)
|
|
set(sys_libs ${sys_libs} -fsanitize=address)
|
|
endif()
|
|
if(UBSAN)
|
|
# if this doesn't work, UBSan might not be available on your platform, don't set UBSAN then..
|
|
add_compile_options(-fsanitize=undefined)
|
|
set(sys_libs ${sys_libs} -fsanitize=undefined)
|
|
endif()
|
|
|
|
if(NOT AROS)
|
|
CHECK_CXX_COMPILER_FLAG("-fvisibility=hidden" cxx_has_fvisibility)
|
|
if(NOT cxx_has_fvisibility)
|
|
message(FATAL_ERROR "Compiler does not support -fvisibility")
|
|
endif()
|
|
add_compile_options(-fvisibility=hidden)
|
|
endif()
|
|
|
|
# TODO fix these warnings
|
|
add_compile_options(-Wno-sign-compare)
|
|
add_compile_options(-Wno-switch)
|
|
|
|
CHECK_CXX_COMPILER_FLAG("-Woverloaded-virtual" cxx_has_Woverload_virtual)
|
|
if(cxx_has_Woverload_virtual)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual")
|
|
endif()
|
|
|
|
# shut up about using memcpy() on classes, in the cases doom3 uses it it seems to be fine
|
|
CHECK_CXX_COMPILER_FLAG("-Wno-class-memaccess" cxx_has_Wno-class-memaccess)
|
|
if(cxx_has_Wno-class-memaccess)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-class-memaccess")
|
|
endif()
|
|
|
|
# ignore warnings about variables named "requires" for now (in C++20 it's a keyword,
|
|
# but currently we don't even use C++11 features)
|
|
CHECK_CXX_COMPILER_FLAG("-Wno-c++20-compat" cxx_has_Wno-cpp20-compat)
|
|
if(cxx_has_Wno-cpp20-compat)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-c++20-compat")
|
|
endif()
|
|
|
|
if(AROS)
|
|
set(CMAKE_SHARED_LIBRARY_SUFFIX ".aros-${cpu}")
|
|
add_definitions(-DIOAPI_NO_64)
|
|
elseif(APPLE)
|
|
add_definitions(-DMACOS_X=1)
|
|
|
|
if(cpu STREQUAL "x86_64")
|
|
add_compile_options(-arch x86_64 -mmacosx-version-min=10.7)
|
|
set(ldflags "${ldflags} -arch x86_64 -mmacosx-version-min=10.7")
|
|
elseif(cpu STREQUAL "arm64")
|
|
add_compile_options(-arch arm64 -mmacosx-version-min=10.7)
|
|
set(ldflags "${ldflags} -arch arm64 -mmacosx-version-min=10.7")
|
|
elseif(cpu STREQUAL "x86")
|
|
CHECK_CXX_COMPILER_FLAG("-arch i386" cxx_has_arch_i386)
|
|
if(cxx_has_arch_i386)
|
|
add_compile_options(-arch i386)
|
|
set(ldflags "${ldflags} -arch i386")
|
|
endif()
|
|
|
|
add_compile_options(-mmacosx-version-min=10.4)
|
|
set(ldflags "${ldflags} -mmacosx-version-min=10.4")
|
|
elseif(cpu STREQUAL "ppc")
|
|
CHECK_CXX_COMPILER_FLAG("-arch ppc" cxx_has_arch_ppc)
|
|
if(cxx_has_arch_ppc)
|
|
add_compile_options(-arch ppc -mone-byte-bool)
|
|
set(ldflags "${ldflags} -arch ppc -mone-byte-bool")
|
|
endif()
|
|
|
|
add_compile_options(-mmacosx-version-min=10.4)
|
|
set(ldflags "${ldflags} -mmacosx-version-min=10.4")
|
|
else()
|
|
message(FATAL_ERROR "Unsupported CPU architecture for OSX")
|
|
endif()
|
|
|
|
set(sys_libs ${sys_libs} "-framework Carbon -framework Cocoa -framework IOKit")
|
|
elseif(WIN32)
|
|
# use 8MB stack instead of 1MB, so big models don't overflow it with _alloca()
|
|
set(ldflags "${ldflags} -static-libgcc -static-libstdc++ -Wl,--stack,8388608")
|
|
elseif(os STREQUAL "linux")
|
|
set(sys_libs ${sys_libs} dl)
|
|
elseif(os STREQUAL "freebsd")
|
|
find_library(EXECINFO_LIBRARIES execinfo /usr/lib /usr/local/lib)
|
|
set(sys_libs ${sys_libs} ${EXECINFO_LIBRARIES})
|
|
endif()
|
|
elseif(MSVC)
|
|
add_compile_options(/MP) # parallel build (use all cores, or as many as configured in VS)
|
|
|
|
add_compile_options(/W3) # TODO: was /W4, caused trouble with VS2019 (and/or its integrated CMake? or only HarrieVG's setup?)
|
|
add_compile_options(/we4840) # treat as error when passing a class to a vararg-function (probably printf-like)
|
|
# treat several kinds of truncating int<->pointer conversions as errors (for more 64bit-safety)
|
|
add_compile_options(/we4306 /we4311 /we4312 /we4302)
|
|
# ignore the following warnings:
|
|
add_compile_options(/wd4100) # unreferenced formal parameter
|
|
add_compile_options(/wd4127) # conditional expression is constant
|
|
add_compile_options(/wd4244) # possible loss of data
|
|
add_compile_options(/wd4245) # signed/unsigned mismatch
|
|
add_compile_options(/wd4267) # possible loss of data
|
|
add_compile_options(/wd4714) # 'function' marked as __forceinline not inlined
|
|
add_compile_options(/wd4996) # 'function': was declared deprecated
|
|
add_compile_options(/wd4068) # unknown pragma
|
|
add_compile_options(/wd4458) # declaration of 'variable' hides class member
|
|
add_definitions(-D_ALLOW_KEYWORD_MACROS) # because of the "#define private public" and "#define protected public" in TypeInfo.cpp
|
|
set(CMAKE_C_FLAGS_DEBUG "-D_DEBUG /Od /Zi /MDd")
|
|
set(CMAKE_C_FLAGS_RELEASE "/Ox /Oy /MD")
|
|
set(CMAKE_C_FLAGS_RELWITHDEBINFO "/Ox /Oy /Zi /MD")
|
|
set(CMAKE_C_FLAGS_MINSIZEREL "/Ox /Oy /Os /MD")
|
|
# use 8MB stack instead of 1MB, so big models don't overflow it with _alloca()
|
|
set(ldflags "${ldflags} /STACK:8388608")
|
|
else()
|
|
message(FATAL_ERROR "Unsupported compiler")
|
|
endif()
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
|
|
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO})
|
|
# disable assertions in release builds
|
|
set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${CMAKE_C_FLAGS_RELEASE}")
|
|
set(CMAKE_CXX_FLAGS_MINSIZEREL "-DNDEBUG ${CMAKE_C_FLAGS_MINSIZEREL}")
|
|
|
|
# mingw and msvc
|
|
if(WIN32)
|
|
add_definitions(-DWINVER=0x0501)
|
|
add_definitions(-D_WIN32_WINNT=0x0501)
|
|
|
|
set(sys_libs ${sys_libs}
|
|
winmm
|
|
iphlpapi
|
|
wsock32
|
|
ole32
|
|
)
|
|
endif()
|
|
|
|
# optimize this source file even in debug builds, to make speed (esp. loading times) more bearable
|
|
# used for libs integrated here like stb_* and miniz(ip)
|
|
if(CMAKE_MAJOR_VERSION LESS 3 OR ( CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION LESS 11 ))
|
|
function(always_optimize_sourcefile srcfilename)
|
|
if(MSVC)
|
|
set_source_files_properties(${srcfilename} PROPERTIES COMPILE_FLAGS "/Ox")
|
|
else()
|
|
set_source_files_properties(${srcfilename} PROPERTIES COMPILE_FLAGS "-O2")
|
|
endif()
|
|
endfunction()
|
|
else()
|
|
function(always_optimize_sourcefile srcfilename)
|
|
if(MSVC)
|
|
set_source_files_properties(${srcfilename} PROPERTIES COMPILE_OPTIONS "/Ox")
|
|
else()
|
|
set_source_files_properties(${srcfilename} PROPERTIES COMPILE_OPTIONS "-O2")
|
|
endif()
|
|
endfunction()
|
|
endif()
|
|
|
|
# fallback for cmake versions without GNUInstallDirs
|
|
if(GNUINSTALLDIRS MATCHES "NOTFOUND")
|
|
set(CMAKE_INSTALL_BINDIR "bin"
|
|
CACHE PATH "user executables (bin)")
|
|
set(CMAKE_INSTALL_LIBDIR "lib${LIB_SUFFIX}"
|
|
CACHE PATH "object code libraries (lib${LIB_SUFFIX})")
|
|
set(CMAKE_INSTALL_DATAROOTDIR "share"
|
|
CACHE PATH "read-only architecture-independent data root (share)")
|
|
set(CMAKE_INSTALL_DATADIR "${CMAKE_INSTALL_DATAROOTDIR}"
|
|
CACHE PATH "read-only architecture-independent data (DATAROOTDIR)")
|
|
|
|
mark_as_advanced(CMAKE_INSTALL_BINDIR CMAKE_INSTALL_LIBDIR CMAKE_INSTALL_DATAROOTDIR CMAKE_INSTALL_DATADIR)
|
|
foreach(dir BINDIR LIBDIR DATAROOTDIR DATADIR)
|
|
if(NOT IS_ABSOLUTE ${CMAKE_INSTALL_${dir}})
|
|
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${dir}}")
|
|
else()
|
|
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_${dir}}")
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
|
|
set(bindir "${CMAKE_INSTALL_FULL_BINDIR}")
|
|
set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}/dhewm3")
|
|
set(datadir "${CMAKE_INSTALL_FULL_DATADIR}/dhewm3")
|
|
|
|
configure_file(
|
|
"${CMAKE_SOURCE_DIR}/config.h.in"
|
|
"${CMAKE_BINARY_DIR}/config.h"
|
|
)
|
|
|
|
if(NOT MSVC)
|
|
message(STATUS "Building ${CMAKE_BUILD_TYPE} for ${os}-${cpu}")
|
|
endif()
|
|
|
|
if(NOT APPLE AND NOT WIN32)
|
|
message(STATUS "The install target will use the following directories:")
|
|
message(STATUS " Binary directory: ${bindir}")
|
|
message(STATUS " Library directory: ${libdir}")
|
|
message(STATUS " Data directory: ${datadir}")
|
|
endif()
|
|
|
|
set(src_renderer
|
|
renderer/Cinematic.cpp
|
|
renderer/GuiModel.cpp
|
|
renderer/Image_files.cpp
|
|
renderer/Image_init.cpp
|
|
renderer/Image_load.cpp
|
|
renderer/Image_process.cpp
|
|
renderer/Image_program.cpp
|
|
renderer/Interaction.cpp
|
|
renderer/Material.cpp
|
|
renderer/MegaTexture.cpp
|
|
renderer/Model.cpp
|
|
renderer/ModelDecal.cpp
|
|
renderer/ModelManager.cpp
|
|
renderer/ModelOverlay.cpp
|
|
renderer/Model_beam.cpp
|
|
renderer/Model_ase.cpp
|
|
renderer/Model_liquid.cpp
|
|
renderer/Model_lwo.cpp
|
|
renderer/Model_ma.cpp
|
|
renderer/Model_md3.cpp
|
|
renderer/Model_md5.cpp
|
|
renderer/Model_prt.cpp
|
|
renderer/Model_sprite.cpp
|
|
renderer/RenderEntity.cpp
|
|
renderer/RenderSystem.cpp
|
|
renderer/RenderSystem_init.cpp
|
|
renderer/RenderWorld.cpp
|
|
renderer/RenderWorld_demo.cpp
|
|
renderer/RenderWorld_load.cpp
|
|
renderer/RenderWorld_portals.cpp
|
|
renderer/VertexCache.cpp
|
|
renderer/draw_arb2.cpp
|
|
renderer/draw_common.cpp
|
|
renderer/tr_backend.cpp
|
|
renderer/tr_deform.cpp
|
|
renderer/tr_font.cpp
|
|
renderer/tr_guisurf.cpp
|
|
renderer/tr_light.cpp
|
|
renderer/tr_lightrun.cpp
|
|
renderer/tr_main.cpp
|
|
renderer/tr_orderIndexes.cpp
|
|
renderer/tr_polytope.cpp
|
|
renderer/tr_render.cpp
|
|
renderer/tr_rendertools.cpp
|
|
renderer/tr_shadowbounds.cpp
|
|
renderer/tr_stencilshadow.cpp
|
|
renderer/tr_subview.cpp
|
|
renderer/tr_trace.cpp
|
|
renderer/tr_trisurf.cpp
|
|
renderer/tr_turboshadow.cpp
|
|
|
|
renderer/stblib_impls.c
|
|
)
|
|
|
|
always_optimize_sourcefile(renderer/stblib_impls.c)
|
|
|
|
# I'm a bit sloppy with headers and just glob them in..
|
|
# they're only handled in CMake at all so they turn up in Visual Studio solutions..
|
|
|
|
# globs all the headers from ${PATHPREFIX}/ and adds them to ${SRCLIST}
|
|
function(add_globbed_headers SRCLIST PATHPREFIX)
|
|
file(GLOB_RECURSE tmp_hdrs RELATIVE "${CMAKE_SOURCE_DIR}" "${PATHPREFIX}/*.h")
|
|
set(${SRCLIST} ${tmp_hdrs} ${${SRCLIST}} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
add_globbed_headers(src_renderer "renderer")
|
|
|
|
set(src_framework
|
|
framework/CVarSystem.cpp
|
|
framework/CmdSystem.cpp
|
|
framework/Common.cpp
|
|
framework/Compressor.cpp
|
|
framework/Console.cpp
|
|
framework/DemoFile.cpp
|
|
framework/DeclAF.cpp
|
|
framework/DeclEntityDef.cpp
|
|
framework/DeclFX.cpp
|
|
framework/DeclManager.cpp
|
|
framework/DeclParticle.cpp
|
|
framework/DeclPDA.cpp
|
|
framework/DeclSkin.cpp
|
|
framework/DeclTable.cpp
|
|
framework/Dhewm3SettingsMenu.cpp
|
|
framework/EditField.cpp
|
|
framework/EventLoop.cpp
|
|
framework/File.cpp
|
|
framework/FileSystem.cpp
|
|
framework/KeyInput.cpp
|
|
framework/UsercmdGen.cpp
|
|
framework/Session_menu.cpp
|
|
framework/Session.cpp
|
|
framework/async/AsyncClient.cpp
|
|
framework/async/AsyncNetwork.cpp
|
|
framework/async/AsyncServer.cpp
|
|
framework/async/MsgChannel.cpp
|
|
framework/async/NetworkSystem.cpp
|
|
framework/async/ServerScan.cpp
|
|
framework/miniz/miniz.c
|
|
framework/minizip/ioapi.c
|
|
framework/minizip/unzip.cpp
|
|
)
|
|
|
|
always_optimize_sourcefile(framework/miniz/miniz.c)
|
|
always_optimize_sourcefile(framework/minizip/ioapi.c)
|
|
always_optimize_sourcefile(framework/minizip/unzip.cpp)
|
|
|
|
add_globbed_headers(src_framework "framework")
|
|
|
|
set(src_cm
|
|
cm/CollisionModel_contacts.cpp
|
|
cm/CollisionModel_contents.cpp
|
|
cm/CollisionModel_debug.cpp
|
|
cm/CollisionModel_files.cpp
|
|
cm/CollisionModel_load.cpp
|
|
cm/CollisionModel_rotate.cpp
|
|
cm/CollisionModel_trace.cpp
|
|
cm/CollisionModel_translate.cpp
|
|
)
|
|
|
|
add_globbed_headers(src_cm "cm")
|
|
|
|
set(src_dmap
|
|
tools/compilers/dmap/dmap.cpp
|
|
tools/compilers/dmap/facebsp.cpp
|
|
tools/compilers/dmap/gldraw.cpp
|
|
tools/compilers/dmap/glfile.cpp
|
|
tools/compilers/dmap/leakfile.cpp
|
|
tools/compilers/dmap/map.cpp
|
|
tools/compilers/dmap/optimize.cpp
|
|
tools/compilers/dmap/output.cpp
|
|
tools/compilers/dmap/portals.cpp
|
|
tools/compilers/dmap/shadowopt3.cpp
|
|
tools/compilers/dmap/tritjunction.cpp
|
|
tools/compilers/dmap/tritools.cpp
|
|
tools/compilers/dmap/ubrush.cpp
|
|
tools/compilers/dmap/usurface.cpp
|
|
)
|
|
|
|
add_globbed_headers(src_dmap "tools/compilers/dmap")
|
|
|
|
set(src_aas
|
|
tools/compilers/aas/AASBuild.cpp
|
|
tools/compilers/aas/AASBuild_file.cpp
|
|
tools/compilers/aas/AASBuild_gravity.cpp
|
|
tools/compilers/aas/AASBuild_ledge.cpp
|
|
tools/compilers/aas/AASBuild_merge.cpp
|
|
tools/compilers/aas/AASCluster.cpp
|
|
tools/compilers/aas/AASFile.cpp
|
|
tools/compilers/aas/AASFile_optimize.cpp
|
|
tools/compilers/aas/AASFile_sample.cpp
|
|
tools/compilers/aas/AASReach.cpp
|
|
tools/compilers/aas/AASFileManager.cpp
|
|
tools/compilers/aas/Brush.cpp
|
|
tools/compilers/aas/BrushBSP.cpp
|
|
)
|
|
|
|
add_globbed_headers(src_aas "tools/compilers/aas")
|
|
|
|
set(src_roq
|
|
tools/compilers/roqvq/NSBitmapImageRep.cpp
|
|
tools/compilers/roqvq/codec.cpp
|
|
tools/compilers/roqvq/roq.cpp
|
|
tools/compilers/roqvq/roqParam.cpp
|
|
)
|
|
|
|
add_globbed_headers(src_roq "tools/compilers/roqvq")
|
|
|
|
set(src_renderbump
|
|
tools/compilers/renderbump/renderbump.cpp
|
|
)
|
|
|
|
add_globbed_headers(src_renderbump "tools/compilers/renderbump")
|
|
|
|
set(src_snd
|
|
sound/snd_cache.cpp
|
|
sound/snd_decoder.cpp
|
|
sound/snd_efxfile.cpp
|
|
sound/snd_emitter.cpp
|
|
sound/snd_shader.cpp
|
|
sound/snd_system.cpp
|
|
sound/snd_wavefile.cpp
|
|
sound/snd_world.cpp
|
|
|
|
sound/stbvorbis_impl.c
|
|
)
|
|
|
|
always_optimize_sourcefile(sound/stbvorbis_impl.c)
|
|
|
|
add_globbed_headers(src_snd "sound")
|
|
|
|
set(src_ui
|
|
ui/BindWindow.cpp
|
|
ui/ChoiceWindow.cpp
|
|
ui/DeviceContext.cpp
|
|
ui/EditWindow.cpp
|
|
ui/FieldWindow.cpp
|
|
ui/GameBearShootWindow.cpp
|
|
ui/GameBustOutWindow.cpp
|
|
ui/GameSSDWindow.cpp
|
|
ui/GuiScript.cpp
|
|
ui/ListGUI.cpp
|
|
ui/ListWindow.cpp
|
|
ui/MarkerWindow.cpp
|
|
ui/RegExp.cpp
|
|
ui/RenderWindow.cpp
|
|
ui/SimpleWindow.cpp
|
|
ui/SliderWindow.cpp
|
|
ui/UserInterface.cpp
|
|
ui/Window.cpp
|
|
ui/Winvar.cpp
|
|
)
|
|
|
|
add_globbed_headers(src_ui "ui")
|
|
|
|
set(src_idlib
|
|
idlib/bv/Bounds.cpp
|
|
idlib/bv/Frustum.cpp
|
|
idlib/bv/Sphere.cpp
|
|
idlib/bv/Box.cpp
|
|
idlib/geometry/DrawVert.cpp
|
|
idlib/geometry/Winding2D.cpp
|
|
idlib/geometry/Surface_SweptSpline.cpp
|
|
idlib/geometry/Winding.cpp
|
|
idlib/geometry/Surface.cpp
|
|
idlib/geometry/Surface_Patch.cpp
|
|
idlib/geometry/TraceModel.cpp
|
|
idlib/geometry/JointTransform.cpp
|
|
idlib/hashing/CRC32.cpp
|
|
idlib/hashing/MD4.cpp
|
|
idlib/hashing/MD5.cpp
|
|
idlib/math/Angles.cpp
|
|
idlib/math/Lcp.cpp
|
|
idlib/math/Math.cpp
|
|
idlib/math/Matrix.cpp
|
|
idlib/math/Ode.cpp
|
|
idlib/math/Plane.cpp
|
|
idlib/math/Pluecker.cpp
|
|
idlib/math/Polynomial.cpp
|
|
idlib/math/Quat.cpp
|
|
idlib/math/Rotation.cpp
|
|
idlib/math/Simd.cpp
|
|
idlib/math/Simd_Generic.cpp
|
|
idlib/math/Simd_AltiVec.cpp
|
|
idlib/math/Simd_MMX.cpp
|
|
idlib/math/Simd_3DNow.cpp
|
|
idlib/math/Simd_SSE.cpp
|
|
idlib/math/Simd_SSE2.cpp
|
|
idlib/math/Simd_SSE3.cpp
|
|
idlib/math/Vector.cpp
|
|
idlib/BitMsg.cpp
|
|
idlib/LangDict.cpp
|
|
idlib/Lexer.cpp
|
|
idlib/Lib.cpp
|
|
idlib/containers/HashIndex.cpp
|
|
idlib/Dict.cpp
|
|
idlib/Str.cpp
|
|
idlib/Parser.cpp
|
|
idlib/MapFile.cpp
|
|
idlib/CmdArgs.cpp
|
|
idlib/Token.cpp
|
|
idlib/Base64.cpp
|
|
idlib/Timer.cpp
|
|
idlib/Heap.cpp
|
|
)
|
|
|
|
add_globbed_headers(src_idlib "idlib")
|
|
|
|
if(IMGUI)
|
|
|
|
if(SDL3)
|
|
set(src_imgui libs/imgui/backends/imgui_impl_sdl3.cpp)
|
|
else()
|
|
set(src_imgui libs/imgui/backends/imgui_impl_sdl2.cpp)
|
|
endif()
|
|
|
|
set(src_imgui ${src_imgui}
|
|
libs/imgui/backends/imgui_impl_opengl2.cpp
|
|
|
|
libs/imgui/imgui.h
|
|
libs/imgui/imgui.cpp
|
|
libs/imgui/imgui_draw.cpp
|
|
libs/imgui/imgui_tables.cpp
|
|
libs/imgui/imgui_widgets.cpp
|
|
|
|
libs/imgui/imgui_demo.cpp
|
|
|
|
sys/sys_imgui.h
|
|
sys/sys_imgui.cpp
|
|
sys/imgui_savestyle.cpp
|
|
)
|
|
else()
|
|
set(src_imgui sys/sys_imgui.h)
|
|
endif()
|
|
|
|
|
|
set(src_game
|
|
game/AF.cpp
|
|
game/AFEntity.cpp
|
|
game/Actor.cpp
|
|
game/Camera.cpp
|
|
game/Entity.cpp
|
|
game/BrittleFracture.cpp
|
|
game/Fx.cpp
|
|
game/GameEdit.cpp
|
|
game/Game_local.cpp
|
|
game/Game_network.cpp
|
|
game/Item.cpp
|
|
game/IK.cpp
|
|
game/Light.cpp
|
|
game/Misc.cpp
|
|
game/Mover.cpp
|
|
game/Moveable.cpp
|
|
game/MultiplayerGame.cpp
|
|
game/Player.cpp
|
|
game/PlayerIcon.cpp
|
|
game/PlayerView.cpp
|
|
game/Projectile.cpp
|
|
game/Pvs.cpp
|
|
game/SecurityCamera.cpp
|
|
game/SmokeParticles.cpp
|
|
game/Sound.cpp
|
|
game/Target.cpp
|
|
game/Trigger.cpp
|
|
game/Weapon.cpp
|
|
game/WorldSpawn.cpp
|
|
game/ai/AAS.cpp
|
|
game/ai/AAS_debug.cpp
|
|
game/ai/AAS_pathing.cpp
|
|
game/ai/AAS_routing.cpp
|
|
game/ai/AI.cpp
|
|
game/ai/AI_events.cpp
|
|
game/ai/AI_pathing.cpp
|
|
game/ai/AI_Vagary.cpp
|
|
game/gamesys/DebugGraph.cpp
|
|
game/gamesys/Class.cpp
|
|
game/gamesys/Event.cpp
|
|
game/gamesys/SaveGame.cpp
|
|
game/gamesys/SysCmds.cpp
|
|
game/gamesys/SysCvar.cpp
|
|
game/gamesys/TypeInfo.cpp
|
|
game/anim/Anim.cpp
|
|
game/anim/Anim_Blend.cpp
|
|
game/anim/Anim_Import.cpp
|
|
game/anim/Anim_Testmodel.cpp
|
|
game/script/Script_Compiler.cpp
|
|
game/script/Script_Interpreter.cpp
|
|
game/script/Script_Program.cpp
|
|
game/script/Script_Thread.cpp
|
|
game/physics/Clip.cpp
|
|
game/physics/Force.cpp
|
|
game/physics/Force_Constant.cpp
|
|
game/physics/Force_Drag.cpp
|
|
game/physics/Force_Field.cpp
|
|
game/physics/Force_Spring.cpp
|
|
game/physics/Physics.cpp
|
|
game/physics/Physics_AF.cpp
|
|
game/physics/Physics_Actor.cpp
|
|
game/physics/Physics_Base.cpp
|
|
game/physics/Physics_Monster.cpp
|
|
game/physics/Physics_Parametric.cpp
|
|
game/physics/Physics_Player.cpp
|
|
game/physics/Physics_RigidBody.cpp
|
|
game/physics/Physics_Static.cpp
|
|
game/physics/Physics_StaticMulti.cpp
|
|
game/physics/Push.cpp
|
|
)
|
|
|
|
add_globbed_headers(src_game "game")
|
|
|
|
set(src_d3xp
|
|
d3xp/AF.cpp
|
|
d3xp/AFEntity.cpp
|
|
d3xp/Actor.cpp
|
|
d3xp/Camera.cpp
|
|
d3xp/Entity.cpp
|
|
d3xp/BrittleFracture.cpp
|
|
d3xp/Fx.cpp
|
|
d3xp/GameEdit.cpp
|
|
d3xp/Game_local.cpp
|
|
d3xp/Game_network.cpp
|
|
d3xp/Item.cpp
|
|
d3xp/IK.cpp
|
|
d3xp/Light.cpp
|
|
d3xp/Misc.cpp
|
|
d3xp/Mover.cpp
|
|
d3xp/Moveable.cpp
|
|
d3xp/MultiplayerGame.cpp
|
|
d3xp/Player.cpp
|
|
d3xp/PlayerIcon.cpp
|
|
d3xp/PlayerView.cpp
|
|
d3xp/Projectile.cpp
|
|
d3xp/Pvs.cpp
|
|
d3xp/SecurityCamera.cpp
|
|
d3xp/SmokeParticles.cpp
|
|
d3xp/Sound.cpp
|
|
d3xp/Target.cpp
|
|
d3xp/Trigger.cpp
|
|
d3xp/Weapon.cpp
|
|
d3xp/WorldSpawn.cpp
|
|
d3xp/ai/AAS.cpp
|
|
d3xp/ai/AAS_debug.cpp
|
|
d3xp/ai/AAS_pathing.cpp
|
|
d3xp/ai/AAS_routing.cpp
|
|
d3xp/ai/AI.cpp
|
|
d3xp/ai/AI_events.cpp
|
|
d3xp/ai/AI_pathing.cpp
|
|
d3xp/ai/AI_Vagary.cpp
|
|
d3xp/gamesys/DebugGraph.cpp
|
|
d3xp/gamesys/Class.cpp
|
|
d3xp/gamesys/Event.cpp
|
|
d3xp/gamesys/SaveGame.cpp
|
|
d3xp/gamesys/SysCmds.cpp
|
|
d3xp/gamesys/SysCvar.cpp
|
|
d3xp/gamesys/TypeInfo.cpp
|
|
d3xp/anim/Anim.cpp
|
|
d3xp/anim/Anim_Blend.cpp
|
|
d3xp/anim/Anim_Import.cpp
|
|
d3xp/anim/Anim_Testmodel.cpp
|
|
d3xp/script/Script_Compiler.cpp
|
|
d3xp/script/Script_Interpreter.cpp
|
|
d3xp/script/Script_Program.cpp
|
|
d3xp/script/Script_Thread.cpp
|
|
d3xp/physics/Clip.cpp
|
|
d3xp/physics/Force.cpp
|
|
d3xp/physics/Force_Constant.cpp
|
|
d3xp/physics/Force_Drag.cpp
|
|
d3xp/physics/Force_Field.cpp
|
|
d3xp/physics/Force_Spring.cpp
|
|
d3xp/physics/Physics.cpp
|
|
d3xp/physics/Physics_AF.cpp
|
|
d3xp/physics/Physics_Actor.cpp
|
|
d3xp/physics/Physics_Base.cpp
|
|
d3xp/physics/Physics_Monster.cpp
|
|
d3xp/physics/Physics_Parametric.cpp
|
|
d3xp/physics/Physics_Player.cpp
|
|
d3xp/physics/Physics_RigidBody.cpp
|
|
d3xp/physics/Physics_Static.cpp
|
|
d3xp/physics/Physics_StaticMulti.cpp
|
|
d3xp/physics/Push.cpp
|
|
d3xp/Grabber.cpp
|
|
d3xp/physics/Force_Grab.cpp
|
|
)
|
|
|
|
add_globbed_headers(src_d3xp "d3xp")
|
|
|
|
set(src_debuggerServer
|
|
tools/debugger/DebuggerBreakpoint.h
|
|
tools/debugger/DebuggerBreakpoint.cpp
|
|
tools/debugger/DebuggerServer.h
|
|
tools/debugger/DebuggerServer.cpp
|
|
tools/debugger/DebuggerScript.h
|
|
tools/debugger/DebuggerScript.cpp
|
|
tools/debugger/DebuggerMessages.h
|
|
tools/debugger/debugger.cpp
|
|
)
|
|
|
|
set(src_core
|
|
${src_renderer}
|
|
${src_framework}
|
|
${src_cm}
|
|
${src_dmap}
|
|
${src_aas}
|
|
${src_roq}
|
|
${src_renderbump}
|
|
${src_snd}
|
|
${src_ui}
|
|
${src_tools}
|
|
)
|
|
|
|
set(src_stub_openal sys/stub/openal_stub.cpp)
|
|
set(src_stub_gl sys/stub/stub_gl.cpp)
|
|
|
|
|
|
set(src_tools
|
|
tools/guied/GEWindowWrapper_stub.cpp
|
|
)
|
|
|
|
# TODO: add_globbed_headers(src_tools "tools/guied")
|
|
|
|
# Begin normal tools code
|
|
if (TOOLS AND MFC_FOUND AND MSVC)
|
|
set(ALLOWRESOURCES ON)
|
|
# Common files.
|
|
file(GLOB src_comafx "tools/comafx/*.cpp")
|
|
add_globbed_headers(src_comafx "tools/comafx")
|
|
file(GLOB_RECURSE src_tools_common "tools/common/*.cpp")
|
|
add_globbed_headers(src_tools_common "tools/common")
|
|
|
|
#Compilers.
|
|
# DG: this is always added, why add it again? file(GLOB src_compiler_renderbump "neo/tools/compilers/renderbump/*.cpp")
|
|
file(GLOB src_compiler_roqvq "tools/compilers/roqvq/*.cpp") # FIXME: some of those were added before
|
|
add_globbed_headers(src_compiler_roqvq "tools/compilers/roqvq")
|
|
#tools
|
|
# Articulated Frame editor.
|
|
file(GLOB src_afeditor "tools/af/*.cpp")
|
|
add_globbed_headers(src_afeditor "tools/af")
|
|
# Declaration editor
|
|
file(GLOB src_decleditor "tools/decl/*.cpp")
|
|
add_globbed_headers(src_decleditor "tools/decl")
|
|
# GUI Editor.
|
|
file(GLOB src_gui_editor "tools/guied/*.cpp")
|
|
add_globbed_headers(src_gui_editor "tools/guied")
|
|
# Material editor
|
|
file(GLOB src_materialeditor "tools/materialeditor/*.cpp")
|
|
add_globbed_headers(src_materialeditor "tools/materialeditor")
|
|
# Particle Editor
|
|
file(GLOB src_particleeditor "tools/particle/*.cpp")
|
|
add_globbed_headers(src_particleeditor "tools/particle")
|
|
# PDA editor
|
|
file(GLOB src_pdaeditor "tools/pda/*.cpp")
|
|
add_globbed_headers(src_pdaeditor "tools/pda")
|
|
# Radiant ( Map editor )
|
|
file(GLOB src_map_editor "tools/radiant/*.cpp")
|
|
add_globbed_headers(src_map_editor "tools/radiant")
|
|
# Script editor
|
|
file(GLOB src_script_editor "tools/script/*.cpp")
|
|
add_globbed_headers(src_script_editor "tools/script")
|
|
# Script Debugger
|
|
set(src_debuggerClient
|
|
tools/debugger/DebuggerClient.h
|
|
tools/debugger/DebuggerClient.cpp
|
|
tools/debugger/DebuggerApp.h
|
|
tools/debugger/DebuggerApp.cpp
|
|
tools/debugger/DebuggerQuickWatchDlg.h
|
|
tools/debugger/DebuggerQuickWatchDlg.cpp
|
|
tools/debugger/DebuggerWindow.h
|
|
tools/debugger/DebuggerWindow.cpp
|
|
tools/debugger/DebuggerFindDlg.h
|
|
tools/debugger/DebuggerFindDlg.cpp
|
|
)
|
|
set(src_script_debugger
|
|
${src_debuggerServer}
|
|
${src_debuggerClient}
|
|
)
|
|
# sound editor?
|
|
file(GLOB src_sound_editor "tools/sound/*.cpp")
|
|
add_globbed_headers(src_sound_editor "tools/sound")
|
|
|
|
|
|
# The numerous tools in a nice list.
|
|
list(APPEND src_editor_tools
|
|
${src_comafx}
|
|
${src_tools_common}
|
|
${src_compiler_renderbump}
|
|
${src_afeditor}
|
|
${src_decleditor}
|
|
${src_gui_editor}
|
|
${src_materialeditor}
|
|
${src_particleeditor}
|
|
${src_pdaeditor}
|
|
${src_map_editor}
|
|
${src_script_editor}
|
|
${src_sound_editor}
|
|
${src_script_debugger}
|
|
"tools/edit_public.h"
|
|
"tools/edit_gui_common.h"
|
|
)
|
|
SET(CMAKE_MFC_FLAG 2)
|
|
set(TOOLS_DEFINES "ID_ALLOW_TOOLS;_AFXDLL")
|
|
else()
|
|
set(src_editor_tools "tools/edit_stub.cpp" "tools/edit_public.h" "tools/debugger/debugger_common.h")
|
|
list(APPEND src_editor_tools
|
|
${src_debuggerServer}
|
|
)
|
|
endif()
|
|
|
|
|
|
if(AROS)
|
|
set(DHEWM3BINARY "ADoom3")
|
|
set(sys_libs ${sys_libs} dll)
|
|
|
|
set(src_arosdll
|
|
sys/aros/dll/dllstartup.c
|
|
sys/aros/dll/dll.c
|
|
sys/aros/dll/dllimport.c
|
|
)
|
|
|
|
set(src_sys_base
|
|
sys/cpu.cpp
|
|
sys/threads.cpp
|
|
sys/events.cpp
|
|
sys/sys_local.cpp
|
|
sys/aros/aros_net.cpp
|
|
sys/aros/aros_signal.cpp
|
|
sys/aros/aros_main.cpp
|
|
sys/aros/aros_dos.cpp
|
|
)
|
|
|
|
set(src_sys_core
|
|
sys/glimp.cpp
|
|
)
|
|
elseif(APPLE)
|
|
set(OSX_RESOURCE_FILES
|
|
"${CMAKE_SOURCE_DIR}/sys/osx/Doom3.icns"
|
|
"${CMAKE_SOURCE_DIR}/sys/osx/Doom 3.rsrc"
|
|
)
|
|
|
|
set_source_files_properties(${OSX_RESOURCE_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
|
|
|
|
set(src_sys_base
|
|
sys/cpu.cpp
|
|
sys/threads.cpp
|
|
sys/events.cpp
|
|
sys/sys_local.cpp
|
|
sys/posix/posix_net.cpp
|
|
sys/posix/posix_main.cpp
|
|
)
|
|
|
|
set(src_sys_core
|
|
sys/glimp.cpp
|
|
sys/osx/DOOMController.mm
|
|
sys/osx/macosx_misc.mm
|
|
sys/osx/SDLMain.m
|
|
${OSX_RESOURCE_FILES}
|
|
)
|
|
elseif(WIN32)
|
|
|
|
set(src_sys_base
|
|
sys/cpu.cpp
|
|
sys/threads.cpp
|
|
sys/events.cpp
|
|
sys/sys_local.cpp
|
|
sys/win32/win_input.cpp
|
|
sys/win32/win_main.cpp
|
|
sys/win32/win_net.cpp
|
|
sys/win32/win_shared.cpp
|
|
sys/win32/win_syscon.cpp
|
|
)
|
|
|
|
if(NOT SDL2 AND NOT SDL3)
|
|
# only SDL1.2 still uses SDL_win32_main.c
|
|
set(src_sys_base ${src_sys_base} sys/win32/SDL_win32_main.c)
|
|
endif()
|
|
|
|
# adding the few relevant headers in sys/ manually..
|
|
set(src_sys_base ${src_sys_base}
|
|
sys/platform.h
|
|
sys/sys_local.h
|
|
sys/sys_public.h
|
|
sys/win32/win_local.h
|
|
)
|
|
|
|
set(src_sys_core
|
|
sys/glimp.cpp
|
|
)
|
|
|
|
if(TOOLS)
|
|
set(src_sys_core ${src_sys_core} "sys/win32/rc/doom.rc")
|
|
else()
|
|
# adding both .rc files breaks the build, but I think it only contains the icon
|
|
# and doom.rc also contains that (+icons for editor etc, AFAIK), so this is fine
|
|
set(src_sys_core ${src_sys_core} "${CMAKE_SOURCE_DIR}/sys/win32/rc/dhewm3.rc" )
|
|
endif()
|
|
|
|
else()
|
|
set(src_sys_base
|
|
sys/cpu.cpp
|
|
sys/threads.cpp
|
|
sys/events.cpp
|
|
sys/sys_local.cpp
|
|
sys/posix/posix_net.cpp
|
|
sys/posix/posix_main.cpp
|
|
sys/linux/main.cpp
|
|
)
|
|
|
|
set(src_sys_core
|
|
sys/glimp.cpp
|
|
)
|
|
endif()
|
|
|
|
include_directories(${CMAKE_BINARY_DIR})
|
|
include_directories(${CMAKE_SOURCE_DIR})
|
|
|
|
add_library(idlib STATIC ${src_idlib})
|
|
if(SDL3)
|
|
target_link_libraries(idlib SDL3::Headers) # so it can use SDL_Endian.h
|
|
endif()
|
|
if (AROS)
|
|
add_library(dll STATIC ${src_arosdll})
|
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "i386")
|
|
set(AROS_ARCH "x86")
|
|
else()
|
|
set(AROS_ARCH ${CMAKE_SYSTEM_PROCESSOR})
|
|
endif()
|
|
else()
|
|
if(D3_COMPILER_IS_GCC_OR_CLANG AND NOT MINGW)
|
|
set_target_properties(idlib PROPERTIES COMPILE_FLAGS "-fPIC")
|
|
endif()
|
|
endif()
|
|
|
|
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} PREFIX neo FILES ${src_idlib})
|
|
|
|
if(HARDLINK_GAME)
|
|
if(BASE)
|
|
set(src_core ${src_core} ${src_game})
|
|
set(game_includes "${CMAKE_SOURCE_DIR}/game")
|
|
if(D3XP)
|
|
message(WARNING "hardlinking the base game, d3xp will not be supported (disable BASE for D3XP support with HARDLINK_GAME)")
|
|
endif()
|
|
|
|
elseif(D3XP)
|
|
set(src_core ${src_core} ${src_d3xp})
|
|
set(game_includes "${CMAKE_SOURCE_DIR}/d3xp")
|
|
endif()
|
|
endif()# HARDLINK_GAME
|
|
|
|
if(CORE)
|
|
add_executable(${DHEWM3BINARY} WIN32 MACOSX_BUNDLE
|
|
${src_core}
|
|
${src_sys_base}
|
|
${src_sys_core}
|
|
${src_imgui}
|
|
${src_editor_tools}
|
|
)
|
|
|
|
if(MSVC AND CMAKE_MAJOR_VERSION GREATER 3 OR ( CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION GREATER_EQUAL 6 ))
|
|
# CMake >= 3.6 supports setting the default project started for debugging (instead of trying to launch ALL_BUILD ...)
|
|
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${DHEWM3BINARY})
|
|
endif()
|
|
|
|
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} PREFIX neo FILES ${src_core} ${src_sys_base} ${src_sys_core} ${src_imgui} ${src_editor_tools})
|
|
|
|
target_include_directories(${DHEWM3BINARY} PRIVATE "${CMAKE_SOURCE_DIR}/libs/imgui")
|
|
|
|
if(HARDLINK_GAME)
|
|
set_target_properties(${DHEWM3BINARY} PROPERTIES COMPILE_DEFINITIONS "${TOOLS_DEFINES}")
|
|
target_include_directories(${DHEWM3BINARY} PRIVATE ${game_includes})
|
|
else()
|
|
set_target_properties(${DHEWM3BINARY} PROPERTIES COMPILE_DEFINITIONS "__DOOM_DLL__;${TOOLS_DEFINES}")
|
|
endif()
|
|
set_target_properties(${DHEWM3BINARY} PROPERTIES LINK_FLAGS "${ldflags}")
|
|
set_target_properties(${DHEWM3BINARY} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${PROJECT_SOURCE_DIR}/sys/osx/Info.plist)
|
|
|
|
target_link_libraries(${DHEWM3BINARY}
|
|
idlib
|
|
${OPENAL_LIBRARY}
|
|
${CURL_LIBRARY}
|
|
${SDLx_LIBRARY}
|
|
${sys_libs}
|
|
)
|
|
|
|
if(NOT APPLE AND NOT WIN32)
|
|
install(TARGETS ${DHEWM3BINARY}
|
|
RUNTIME DESTINATION "${bindir}"
|
|
LIBRARY DESTINATION "${libdir}"
|
|
ARCHIVE DESTINATION "${libdir}"
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
if(DEDICATED)
|
|
add_executable(${DHEWM3BINARY}ded WIN32 MACOSX_BUNDLE
|
|
${src_core}
|
|
${src_stub_openal}
|
|
${src_stub_gl}
|
|
${src_sys_base}
|
|
${src_debuggerServer}
|
|
)
|
|
|
|
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} PREFIX neo FILES ${src_core} ${src_sys_base} ${src_stub_openal} ${src_stub_gl} ${src_debuggerServer})
|
|
|
|
if(HARDLINK_GAME)
|
|
set_target_properties(${DHEWM3BINARY}ded PROPERTIES COMPILE_DEFINITIONS "IMGUI_DISABLE;ID_DEDICATED")
|
|
target_include_directories(${DHEWM3BINARY}ded PRIVATE ${game_includes})
|
|
else()
|
|
set_target_properties(${DHEWM3BINARY}ded PROPERTIES COMPILE_DEFINITIONS "IMGUI_DISABLE;ID_DEDICATED;__DOOM_DLL__")
|
|
endif()
|
|
set_target_properties(${DHEWM3BINARY}ded PROPERTIES LINK_FLAGS "${ldflags}")
|
|
target_link_libraries(${DHEWM3BINARY}ded
|
|
idlib
|
|
${CURL_LIBRARY}
|
|
${SDLx_LIBRARY}
|
|
${sys_libs}
|
|
)
|
|
|
|
if(NOT APPLE AND NOT WIN32)
|
|
install(TARGETS ${DHEWM3BINARY}ded
|
|
RUNTIME DESTINATION "${bindir}"
|
|
LIBRARY DESTINATION "${libdir}"
|
|
ARCHIVE DESTINATION "${libdir}"
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
if(BASE AND NOT HARDLINK_GAME)
|
|
if (AROS)
|
|
add_executable(base sys/aros/dll/dllglue.c ${src_game})
|
|
set_target_properties(base PROPERTIES OUTPUT_NAME "base.aros-${AROS_ARCH}")
|
|
else()
|
|
add_library(base SHARED ${src_game})
|
|
endif()
|
|
|
|
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} PREFIX neo FILES ${src_game})
|
|
|
|
set_target_properties(base PROPERTIES PREFIX "")
|
|
set_target_properties(base PROPERTIES COMPILE_DEFINITIONS "GAME_DLL")
|
|
target_include_directories(base PRIVATE "${CMAKE_SOURCE_DIR}/game")
|
|
set_target_properties(base PROPERTIES LINK_FLAGS "${ldflags}")
|
|
set_target_properties(base PROPERTIES INSTALL_NAME_DIR "@executable_path")
|
|
if (AROS)
|
|
target_link_libraries(base idlib dll)
|
|
else()
|
|
target_link_libraries(base idlib)
|
|
endif()
|
|
|
|
if(NOT APPLE AND NOT WIN32)
|
|
install(TARGETS base
|
|
RUNTIME DESTINATION "${bindir}"
|
|
LIBRARY DESTINATION "${libdir}"
|
|
ARCHIVE DESTINATION "${libdir}"
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
if(D3XP AND NOT HARDLINK_GAME)
|
|
if (AROS)
|
|
add_executable(d3xp sys/aros/dll/dllglue.c ${src_d3xp})
|
|
set_target_properties(d3xp PROPERTIES OUTPUT_NAME "d3xp.aros-${AROS_ARCH}")
|
|
else()
|
|
add_library(d3xp SHARED ${src_d3xp})
|
|
endif()
|
|
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} PREFIX neo FILES ${src_d3xp})
|
|
set_target_properties(d3xp PROPERTIES PREFIX "")
|
|
set_target_properties(d3xp PROPERTIES COMPILE_DEFINITIONS "GAME_DLL;_D3XP;CTF")
|
|
target_include_directories(d3xp PRIVATE "${CMAKE_SOURCE_DIR}/d3xp")
|
|
set_target_properties(d3xp PROPERTIES LINK_FLAGS "${ldflags}")
|
|
set_target_properties(d3xp PROPERTIES INSTALL_NAME_DIR "@executable_path")
|
|
if (AROS)
|
|
target_link_libraries(d3xp idlib dll)
|
|
else()
|
|
target_link_libraries(d3xp idlib)
|
|
endif()
|
|
|
|
if(NOT APPLE AND NOT WIN32)
|
|
install(TARGETS d3xp
|
|
RUNTIME DESTINATION "${bindir}"
|
|
LIBRARY DESTINATION "${libdir}"
|
|
ARCHIVE DESTINATION "${libdir}"
|
|
)
|
|
endif()
|
|
endif()
|