cmake_minimum_required(VERSION 3.12) if (UNIX) # we want debug symbols even with Release builds string(APPEND CMAKE_CXX_FLAGS_RELEASE_INIT "-g -ffast-math") string(APPEND CMAKE_C_FLAGS_RELEASE_INIT "-g -ffast-math") elseif(MSVC) set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "" FORCE) endif() # find ordinary cmake includes list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/sys/cmake") # find third-party package modules list(PREPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/ThirdParty/cmake_find_package") include(CMakeDependentOption) include(ucm) include(PrecompiledHeader) include(SvnVersion) project(TheDarkMod) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) cmake_dependent_option(WITH_TOOLS "Compile with Tools" ON "MSVC" OFF) set(GAME_DIR "${PROJECT_SOURCE_DIR}/../darkmod" CACHE STRING "The directory where the game assets are stored") option(COPY_EXE "Copy executable to GAME_DIR after build" ON) set(THIRDPARTY_PLATFORM_OVERRIDE "" CACHE STRING "If you build conan dependencies yourself with custom platform_name, pass platform_name string here") if (UNIX) # configure sensible warnings add_compile_options( -Wall -Wno-unknown-pragmas # MSVC specific pragmas -Wno-unused-variable # too many -Wno-unused-but-set-variable -Wno-sign-compare # in particular, int/size_t conversions -Wno-class-memaccess # memcpy into custom structs ) # configure other compile options add_compile_options( -pipe -fno-strict-aliasing -fno-omit-frame-pointer # crashdumps! -fmessage-length=0 -fvisibility=hidden -fno-unsafe-math-optimizations -std=c++14 -msse2 ) # TODO: do we really want to keep using this # use old ABI for std::string and std::list to allow TDM to run on distros with old # glibcxx (e.g. Ubuntu 14.04). the old ABI is not fully compliant with C++11 standard. add_compile_definitions("_GLIBCXX_USE_CXX11_ABI=0") # ensure threading support in X add_compile_definitions(XTHREADS) # disable optimizations for certain problematic files set_property(SOURCE "idlib/Token.cpp" "idlib/bv/Frustum_gcc.cpp" PROPERTY COMPILE_OPTIONS -O1 ) set_property(SOURCE "tools/compilers/dmap/optimize_gcc.cpp" PROPERTY COMPILE_OPTIONS -O0 ) elseif (MSVC) add_compile_definitions("WIN32" _WINDOWS _CRT_SECURE_NO_DEPRECATE _CRT_NONSTDC_NO_DEPRECATE _ALLOW_KEYWORD_MACROS NO_WARN_MBCS_MFC_DEPRECATION _MBCS ) # disable certain warnings add_compile_options(/wd4127 /wd4458 /wd4267) add_compile_options(/MP /Gm-) ucm_add_flags(/GS- /Gy /Zi /GF /FC /Oi /Oy /Ot CONFIG Release) ucm_add_linker_flags(EXE /LARGEADDRESSAWARE /NXCOMPAT /SAFESEH:NO /STACK:16777216,16777216) if (CMAKE_SIZEOF_VOID_P EQUAL 4) add_compile_options(/arch:SSE2) endif() ucm_add_linker_flags(EXE "/DEBUG" CONFIG Release) endif () add_executable(TheDarkMod) get_svn_revision(SVNVERSION) configure_file("idlib/svnversion.cmake.h" "${PROJECT_SOURCE_DIR}/idlib/svnversion.h" @ONLY) # gather list of source files ucm_add_dirs( "cm" "framework" "game" "idlib" "renderer" "sound" "tests" "TypeInfo" "ui" "tools/compilers" TO TDM_SOURCE_FILES RECURSIVE ) ucm_add_files("sys/sys_local.cpp" "sys/sys_local.h" "sys/sys_public.h" "sys/sys_padinput.cpp" "sys/sys_padinput.h" TO TDM_SOURCE_FILES) if (WITH_TOOLS) ucm_add_dirs("tools" TO TDM_SOURCE_FILES RECURSIVE) ucm_remove_files( "tools/edit_stub.cpp" "tools/decl/DialogEntityDefEditor.cpp" "tools/common/RenderBumpFlatDialog.cpp" "tools/guied/GEWindowWrapper_stub.cpp" FROM TDM_SOURCE_FILES ) else () ucm_add_files("tools/guied/GEWindowWrapper_stub.cpp" TO TDM_SOURCE_FILES) add_compile_definitions(NO_MFC) endif () if (UNIX) ucm_add_dirs("sys/linux" "sys/posix" TO TDM_SOURCE_FILES RECURSIVE) ucm_remove_directories("idlib/sys/win32" FROM TDM_SOURCE_FILES) ucm_remove_files( "renderer/glad_wgl.c" "sys/linux/dedicated.cpp" "sys/linux/test_scheduler.c" "sys/posix/platform_osx.cpp" FROM TDM_SOURCE_FILES ) elseif (WIN32) ucm_add_dirs("sys/win32" TO TDM_SOURCE_FILES RECURSIVE) ucm_add_files("sys/win32/rc/doom.rc" TO TDM_SOURCE_FILES) ucm_remove_directories("idlib/sys/posix" FROM TDM_SOURCE_FILES) ucm_remove_files("renderer/glad_glx.c" "tools/compilers/dmap/optimize_gcc.cpp" "idlib/bv/Frustum_gcc.cpp" FROM TDM_SOURCE_FILES) endif () # blacklist dead code files that unfortunately still hang around the repository ucm_remove_directories("framework/async" FROM TDM_SOURCE_FILES) ucm_remove_files( "TypeInfo/main.cpp" "game/Game_network.cpp" "game/MultiplayerGame.cpp" "game/gamesys/Callbacks.cpp" "idlib/math/Simd_AltiVec.cpp" "renderer/draw_exp.cpp" "sys/win32/win_gamma.cpp" FROM TDM_SOURCE_FILES ) target_sources(TheDarkMod PRIVATE ${TDM_SOURCE_FILES}) if (MSVC) ucm_add_dirs("sys/msvc/natvis" TO TDM_NATVIS_FILES RECURSIVE ADDITIONAL_EXT "natvis") target_sources(TheDarkMod INTERFACE ${TDM_NATVIS_FILES}) endif () # configure precompiled header # note TypeInfo.cpp must be excluded from precompiled header because it uses some dirty hacks add_precompiled_header(TheDarkMod "idlib/precompiled.h" "idlib/precompiled.cpp" "precompiled.h" EXCLUDE "game/gamesys/TypeInfo.cpp" "idlib/Token.cpp" "idlib/bv/Frustum_gcc.cpp" "sys/win32/rc/CreateResourceIDs.cpp" ) add_compile_definitions( "ExtLibs=" IL_STATIC_LIB __DOOM__ CURL_STATICLIB AL_LIBTYPE_STATIC ) if (THIRDPARTY_PLATFORM_OVERRIDE) if (UNIX) set_target_properties(TheDarkMod PROPERTIES OUTPUT_NAME "thedarkmod.custom") elseif (MSVC) set_target_properties(TheDarkMod PROPERTIES OUTPUT_NAME "thedarkmod_custom.exe") endif () elseif (UNIX) if (CMAKE_SIZEOF_VOID_P EQUAL 8) # ffmpeg dep was compiled without -fPIC, so need to disable on 64bit builds set_target_properties(TheDarkMod PROPERTIES POSITION_INDEPENDENT_CODE OFF) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie") set_target_properties(TheDarkMod PROPERTIES OUTPUT_NAME "thedarkmod.x64") else () set_target_properties(TheDarkMod PROPERTIES OUTPUT_NAME "thedarkmod.x86") endif () elseif (MSVC) if (CMAKE_SIZEOF_VOID_P EQUAL 8) set_target_properties(TheDarkMod PROPERTIES OUTPUT_NAME "TheDarkModx64") else () set_target_properties(TheDarkMod PROPERTIES OUTPUT_NAME "TheDarkMod") endif () endif () ucm_set_runtime(STATIC) find_package(zlib REQUIRED) find_package(libcurl REQUIRED) find_package(openal REQUIRED) find_package(ogg REQUIRED) find_package(vorbis REQUIRED) find_package(devil REQUIRED) find_package(libjpeg REQUIRED) find_package(ffmpeg REQUIRED) find_package(pugixml REQUIRED) find_package(libpng REQUIRED) find_package(mbedtls REQUIRED) find_package(glfw REQUIRED) include_directories( "${PROJECT_SOURCE_DIR}" "${PROJECT_SOURCE_DIR}/idlib" "${PROJECT_SOURCE_DIR}/framework" "${PROJECT_SOURCE_DIR}/ThirdParty/artefacts/doctest/include" ${zlib_INCLUDE_DIRS} ${libcurl_INCLUDE_DIRS} ${openal_INCLUDE_DIRS} ${ogg_INCLUDE_DIRS} ${vorbis_INCLUDE_DIRS} ${devil_INCLUDE_DIRS} ${libjpeg_INCLUDE_DIRS} ${ffmpeg_INCLUDE_DIRS} ${pugixml_INCLUDE_DIRS} ${libpng_INCLUDE_DIRS} ${mbedtls_INCLUDE_DIRS} ${glfw_INCLUDE_DIRS} ) target_link_libraries(TheDarkMod ${zlib_LIBRARIES} ${libcurl_LIBRARIES} ${openal_LIBRARIES} ${vorbis_LIBRARIES} ${ogg_LIBRARIES} ${devil_LIBRARIES} ${libjpeg_LIBRARIES} ${ffmpeg_LIBRARIES} ${libpng_LIBRARIES} ${mbedtls_LIBRARIES} ${glfw_LIBRARIES} ) target_link_libraries(TheDarkMod debug ${pugixml_LIBRARIES_D} optimized ${pugixml_LIBRARIES}) if (WIN32) target_link_libraries(TheDarkMod ws2_32 iphlpapi winmm bcrypt dinput8 dbghelp) set_target_properties(TheDarkMod PROPERTIES WIN32_EXECUTABLE TRUE) elseif (UNIX) target_link_libraries(TheDarkMod pthread dl stdc++fs X11 Xext Xxf86vm) # strip debug symbols from executable and put them into a separate symbols file add_custom_command( TARGET TheDarkMod POST_BUILD COMMAND objcopy --only-keep-debug "$" "$.debug" ) add_custom_command( TARGET TheDarkMod POST_BUILD COMMAND strip --strip-debug --strip-unneeded "$" ) add_custom_command( TARGET TheDarkMod POST_BUILD COMMAND objcopy "--add-gnu-debuglink=$.debug" "$" ) endif () if (COPY_EXE) # copy produced executable to game directory '../darkmod' add_custom_command( TARGET TheDarkMod POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ "${GAME_DIR}" COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_SOURCE_DIR}/glprogs" "${GAME_DIR}/glprogs" ) if (UNIX) add_custom_command( TARGET TheDarkMod POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $.debug "${GAME_DIR}" ) endif() endif ()