cmake_minimum_required( VERSION 3.1.0 ) include(precompiled_headers) if( COMMAND cmake_policy ) cmake_policy( SET CMP0003 NEW ) endif() include( CheckCXXSourceCompiles ) include( CheckFunctionExists ) include( CheckCXXCompilerFlag ) include( CheckIncludeFile ) include( CheckIncludeFiles ) include( CheckLibraryExists ) include( FindPkgConfig ) if( DEM_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) option( NO_STRIP "Do not strip Release or MinSizeRel builds" ) # At least some versions of Xcode fail if you strip with the linker # instead of the separate strip utility. if( APPLE ) set( NO_STRIP ON ) endif() endif() # Build does not work with signed chars! Also set a stricter warning level, but silence the pointless and annoying parts of level 4 (Intentionally only for C++! The C code we use is too old and would warn too much) if (MSVC) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /J /W4 /wd4100 /wd4127 /wd4131 /wd4201 /wd4210 /wd4244 /wd4245 /wd4324 /wd4389 /wd4505 /wd4706 /wd4458 /wd4459" ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4189" ) # "unused initialized local variable" - useful warning that creates too much noise in external or macro based code. Can be enabled for cleanup passes on the code. else() set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funsigned-char -Wno-missing-braces -Wno-char-subscripts -Wno-unused-variable" ) endif() option( DYN_OPENAL "Dynamically load OpenAL" ON ) if( APPLE ) option( OSX_COCOA_BACKEND "Use native Cocoa backend instead of SDL" ON ) endif() target_architecture(TARGET_ARCHITECTURE) message(STATUS "Architecture is ${TARGET_ARCHITECTURE}") if ( ${TARGET_ARCHITECTURE} MATCHES "arm64" ) set (ARM64 aarch64) endif() # Right now only 64 bit is supported. if( ${TARGET_ARCHITECTURE} MATCHES "x86_64" ) set( X64 64 ) endif() if( X64 OR ${TARGET_ARCHITECTURE} MATCHES "i386" ) add_definitions( -DARCH_IA32 ) endif() if( NOT PROJECT_LIBRARIES ) set( PROJECT_LIBRARIES "" ) endif() if( WIN32 ) if( X64 ) set( WIN_TYPE Win64 ) set( XBITS x64 ) else() set( WIN_TYPE Win32 ) set( XBITS x86 ) endif() add_definitions( -D_WIN32 ) set( DX_dinput8_LIBRARY dinput8 ) set( PROJECT_LIBRARIES wsock32 winmm "${DX_dinput8_LIBRARY}" ole32 user32 gdi32 comctl32 comdlg32 ws2_32 setupapi oleaut32 dbghelp legacy_stdio_definitions ) if( NOT DEM_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) set( PROJECT_LIBRARIES ${PROJECT_LIBRARIES} DelayImp ) endif() if( DEM_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) if( DX_dxguid_LIBRARY ) list( APPEND PROJECT_LIBRARIES "${DX_dxguid_LIBRARY}" ) endif() endif() else() if( APPLE ) set( NO_GTK ON ) set( DYN_GTK OFF ) # Prevent inclusion of fp.h and FixMath.h from Carbon framework # Declarations from these files are not used but cause the following conflicts: # - redefinition of 'FixedToFloat' and 'FloatToFixed' macros # - redefinition of 'pi' as different kind of symbol add_definitions( -D__FP__ -D__FIXMATH__ ) else() option( NO_GTK "Disable GTK+ dialogs (Not applicable to Windows)" ) option( DYN_GTK "Load GTK+ at runtime instead of compile time" ON ) # Use GTK+ for the IWAD picker, if available. if( NOT NO_GTK ) pkg_check_modules( GTK3 gtk+-3.0 ) if( GTK3_FOUND ) if( NOT DYN_GTK ) set( PROJECT_LIBRARIES ${PROJECT_LIBRARIES} ${GTK3_LIBRARIES} ) endif() include_directories( ${GTK3_INCLUDE_DIRS} ) link_directories( ${GTK3_LIBRARY_DIRS} ) else() pkg_check_modules( GTK2 gtk+-2.0 ) if( GTK2_FOUND ) if( NOT DYN_GTK ) set( PROJECT_LIBRARIES ${PROJECT_LIBRARIES} ${GTK2_LIBRARIES} ) endif() include_directories( ${GTK2_INCLUDE_DIRS} ) link_directories( ${GTK2_LIBRARY_DIRS} ) else() set( NO_GTK ON ) endif() endif() endif() endif() if ( NOT WIN32 ) option( NO_SDL_JOYSTICK "Disable SDL joystick support (Not applicable to Windows)" OFF ) if ( NO_SDL_JOYSTICK ) add_definitions( -DNO_SDL_JOYSTICK=1 ) endif() endif() if( NO_GTK ) add_definitions( -DNO_GTK ) elseif( DYN_GTK ) add_definitions( -DDYN_GTK=1 ) else() add_definitions( -DDYN_GTK=0 ) endif() # Non-Windows version also needs SDL except native OS X backend if( NOT APPLE OR NOT OSX_COCOA_BACKEND ) find_package( SDL2 REQUIRED ) include_directories( "${SDL2_INCLUDE_DIR}" ) set( PROJECT_LIBRARIES ${PROJECT_LIBRARIES} "${SDL2_LIBRARY}" ) endif() find_path( FPU_CONTROL_DIR fpu_control.h ) if( FPU_CONTROL_DIR ) include_directories( ${FPU_CONTROL_DIR} ) add_definitions( -DHAVE_FPU_CONTROL ) endif() endif() if( NOT NO_OPENAL ) if ( NOT DYN_OPENAL ) # DYN_OPENAL uses local copies of the headers. find_package( OpenAL ) mark_as_advanced(CLEAR OPENAL_INCLUDE_DIR) if( OPENAL_INCLUDE_DIR ) include_directories( ${OPENAL_INCLUDE_DIR} ) mark_as_advanced(CLEAR OPENAL_LIBRARY) if( OPENAL_LIBRARY ) set( PROJECT_LIBRARIES ${OPENAL_LIBRARY} ${PROJECT_LIBRARIES} ) else() set( NO_OPENAL ON ) endif() else() set( NO_OPENAL ON ) endif() else() add_definitions( -DDYN_OPENAL ) endif() endif() if( NO_OPENAL ) add_definitions( -DNO_OPENAL=1 ) endif() # Decide on SSE setup if( X64 ) set( HAVE_MMX 1 ) else( X64 ) endif( X64 ) CHECK_CXX_SOURCE_COMPILES("#include int main() { concurrency::parallel_for(0, 1, 1, [](int) { } ); }" HAVE_PARALLEL_FOR) if( NOT HAVE_PARALLEL_FOR ) CHECK_CXX_SOURCE_COMPILES("#include int main() { dispatch_apply(1, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t) { }); }" HAVE_DISPATCH_APPLY) endif() # Set up flags for MSVC if (MSVC) set( CMAKE_CXX_FLAGS "/MP ${CMAKE_CXX_FLAGS}" ) endif (MSVC) # Set up flags for GCC if( DEM_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) if( PROFILE ) set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -pg" ) set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg" ) set( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -pg" ) set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -pg" ) endif() #set( REL_CXX_FLAGS "-fno-rtti" ) if( NOT PROFILE AND NOT APPLE ) # On OS X frame pointers are required for exception handling, at least with Clang set( REL_CXX_FLAGS "${REL_CXX_FLAGS} -fomit-frame-pointer" ) endif() set( CMAKE_CXX_FLAGS_RELEASE "${REL_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}" ) set( CMAKE_CXX_FLAGS_MINSIZEREL "${REL_CXX_FLAGS} ${CMAKE_CXX_FLAGS_MINSIZEREL}" ) set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${REL_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" ) # Support for the GCC/Clang sanitizers. set( WITH_ASAN 0 CACHE BOOL "Enable the Address Sanitizer") if( NOT CMAKE_COMPILER_IS_GNUCXX ) set( WITH_MSAN 0 CACHE BOOL "Enable the Memory Sanitizer") endif( NOT CMAKE_COMPILER_IS_GNUCXX ) set( WITH_UBSAN 0 CACHE BOOL "Enable the Undefined Behavior Sanitizer") if( WITH_MSAN ) if ( WITH_ASAN OR WITH_UBSAN ) message( SEND_ERROR "You can't use MSAN with either ASAN or UBSAN." ) endif ( WITH_ASAN OR WITH_UBSAN ) endif( WITH_MSAN ) set( SANITIZER_FLAG "" ) if( WITH_ASAN ) set( SANITIZER_FLAG "-fsanitize=address" ) if ( WITH_UBSAN ) set( SANITIZER_FLAG "${SANITIZER_FLAG},undefined" ) endif( WITH_UBSAN ) elseif( WITH_MSAN ) set( SANITIZER_FLAG "-fsanitize=memory" ) elseif( WITH_UBSAN ) set( SANITIZER_FLAG "-fsanitize=undefined" ) endif( WITH_ASAN ) set( CMAKE_CXX_FLAGS "${SANITIZER_FLAG} ${CMAKE_CXX_FLAGS}" ) set( CMAKE_C_FLAGS "${SANITIZER_FLAG} ${CMAKE_C_FLAGS}" ) set( CMAKE_EXE_LINKER_FLAGS "${SANITIZER_FLAG} ${CMAKE_EXE_LINKER_FLAGS}" ) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.5") set( CMAKE_C_FLAGS "-Wno-unused-result ${CMAKE_C_FLAGS}" ) set( CMAKE_CXX_FLAGS "-Wno-unused-result ${CMAKE_CXX_FLAGS}" ) endif() if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) if( APPLE OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "3.6" ) set( CMAKE_CXX_FLAGS "-Wno-inconsistent-missing-override ${CMAKE_CXX_FLAGS}" ) endif() endif() set( CMAKE_C_FLAGS "-Wall -Wextra -Wno-unused -Wno-unused-parameter -Wno-missing-field-initializers -ffp-contract=off ${CMAKE_C_FLAGS}" ) set( CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-unused -Wno-unused-parameter -Wno-missing-field-initializers -ffp-contract=off ${CMAKE_CXX_FLAGS}" ) if( NOT X64 AND NOT CAN_DO_MFPMATH ) set( CMAKE_C_FLAGS "-DNO_SSE ${CMAKE_C_FLAGS}" ) set( CMAKE_CXX_FLAGS "-DNO_SSE ${CMAKE_CXX_FLAGS}" ) endif() # Remove extra warnings when using the official DirectX headers. # Also, TDM-GCC 4.4.0 no longer accepts glibc-style printf formats as valid, # which is a royal pain. The previous version I had been using was fine with them. # MinGW: switch to the Windows Unicode API. if( WIN32 ) set( CMAKE_CXX_FLAGS "-Wno-unknown-pragmas -Wno-comment -Wno-format ${CMAKE_CXX_FLAGS}" ) set( CMAKE_CXX_FLAGS "-D_UNICODE -DUNICODE ${CMAKE_CXX_FLAGS}" ) set( CMAKE_CXX_FLAGS "-D_WIN32_WINNT=0x0600 ${CMAKE_CXX_FLAGS}" ) set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -municode" ) endif() # Detect FreeBSD and add flags if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC" ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC" ) endif() if(${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ljemalloc") endif() if( NOT NO_STRIP ) set (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -s" ) set (CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} -s" ) endif() endif() # Check for thread_local keyword, it's optional at the moment #CHECK_CXX_SOURCE_COMPILES("thread_local int i; int main() { i = 0; }" # HAVE_THREAD_LOCAL) #if( NOT HAVE_THREAD_LOCAL ) # message( SEND_ERROR "C++ compiler doesn't support thread_local storage duration specifier" ) #endif() # Check for functions that may or may not exist. require_stricmp() require_strnicmp() if( NOT MSVC ) add_definitions( -D__forceinline=inline ) endif() if( UNIX ) CHECK_LIBRARY_EXISTS( rt clock_gettime "" CLOCK_GETTIME_IN_RT ) if( NOT CLOCK_GETTIME_IN_RT ) CHECK_FUNCTION_EXISTS( clock_gettime CLOCK_GETTIME_EXISTS ) if( NOT CLOCK_GETTIME_EXISTS ) message( STATUS "Could not find clock_gettime. Timing statistics will not be available." ) add_definitions( -DNO_CLOCK_GETTIME ) endif() else() set( PROJECT_LIBRARIES ${PROJECT_LIBRARIES} rt ) endif() endif() # Flags # Update gitinfo.h add_custom_target( revision_check ALL COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_SOURCE_DIR}/tools/updaterevision/UpdateRevision.cmake" source/gitinfo.h WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) # required libraries set( PROJECT_LIBRARIES ${PROJECT_LIBRARIES} "${ZLIB_LIBRARIES}" "${JPEG_LIBRARIES}" "${BZIP2_LIBRARIES}" "${CMAKE_DL_LIBS}" "${TESS_LIBRARIES}" "${DRPC_LIBRARIES}") if (HAVE_VULKAN) set( PROJECT_LIBRARIES ${PROJECT_LIBRARIES} "glslang" "SPIRV" "OGLCompiler") endif() # ZMUSIC if( MSVC ) find_package( ZMusic ) else() find_package( ZMusic REQUIRED ) endif() message("Building for target architecture: ${TARGET_ARCHITECTURE}") if( MSVC AND NOT ZMUSIC_FOUND ) # Use prebuilt library set( ZMUSIC_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../bin/windows/zmusic" ) set( ZMUSIC_INCLUDE_DIR ${ZMUSIC_ROOT_PATH}/include ) set( ZMUSIC_LIBRARIES zmusiclite ) if( X64 ) link_directories( ${ZMUSIC_ROOT_PATH}/64bit ) elseif( ARM64 ) link_directories( ${ZMUSIC_ROOT_PATH}/arm64 ) else() link_directories( ${ZMUSIC_ROOT_PATH}/32bit ) endif() set( ZMUSIC_FOUND TRUE ) endif() # VPX if( MSVC AND NOT VPX_FOUND ) # Use prebuilt library set( VPX_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../bin/Windows/vpx" ) set( VPX_INCLUDE_DIR ${VPX_ROOT_PATH}/include ) set( VPX_LIBRARIES libvpx ) if ( NOT ARM64 ) set (VPX_LIBRARIES ${VPX_LIBRARIES} libcompat-to-msvc ) endif() if( ARM64 ) link_directories( ${VPX_ROOT_PATH}/lib/arm64 ) elseif( X64 ) link_directories( ${VPX_ROOT_PATH}/lib/64 ) else() link_directories( ${VPX_ROOT_PATH}/lib/32 ) # Workaround for "error LNK2026: module unsafe for SAFESEH image." set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO" ) endif() set( VPX_FOUND TRUE ) endif() if( VPX_FOUND ) add_definitions( "-DUSE_LIBVPX=1" ) include_directories( "${VPX_INCLUDE_DIR}" ) set( PROJECT_LIBRARIES ${PROJECT_LIBRARIES} ${VPX_LIBRARIES} ) else() message( SEND_ERROR "Could not find libvpx" ) endif() include_directories( "${ZLIB_INCLUDE_DIR}" "${ZMUSIC_INCLUDE_DIR}" "${BZIP2_INCLUDE_DIR}" "${LZMA_INCLUDE_DIR}" "${JPEG_INCLUDE_DIR}" "${GDTOA_INCLUDE_DIR}" "${TESS_INCLUDE_DIR}" "${DRPC_INCLUDE_DIR}" ) if (WIN32) include_directories( "platform/win32" ) endif() if( ${HAVE_VM_JIT} ) add_definitions( -DHAVE_VM_JIT ) include_directories( "${ASMJIT_INCLUDE_DIR}" ) set( PROJECT_LIBRARIES ${PROJECT_LIBRARIES} "${ASMJIT_LIBRARIES}") endif() # Start defining source files for ZDoom set( PLAT_WIN32_SOURCES platform/win32/i_steam.cpp common/platform/win32/hardware.cpp common/platform/win32/i_input.cpp common/platform/win32/i_keyboard.cpp common/platform/win32/i_mouse.cpp common/platform/win32/i_dijoy.cpp common/platform/win32/i_rawps2.cpp common/platform/win32/i_xinput.cpp common/platform/win32/i_main.cpp common/platform/win32/i_mainwindow.cpp common/platform/win32/i_system.cpp common/platform/win32/i_specialpaths.cpp common/platform/win32/st_start.cpp common/platform/win32/gl_sysfb.cpp common/platform/win32/base_sysfb.cpp common/platform/win32/win32basevideo.cpp common/platform/win32/win32glvideo.cpp ) if (HAVE_VULKAN) set (PLAT_WIN32_SOURCES ${PLAT_WIN32_SOURCES} common/platform/win32/win32vulkanvideo.cpp ) endif() # todo: implement an actual crash catcher for ARM # for now this is purely experimental if (NOT ${TARGET_ARCHITECTURE} MATCHES "arm" ) set (PLAT_WIN32_SOURCES ${PLAT_WIN32_SOURCES} common/platform/win32/i_crash.cpp ) endif() if (MSVC AND ${TARGET_ARCHITECTURE} MATCHES "arm") set (PLAT_WIN32_SOURCES ${PLAT_WIN32_SOURCES} common/platform/win32/i_crash_arm.cpp ) add_definitions( -DNO_SSE -D__ARM__ -DRAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN) endif() set( PLAT_POSIX_SOURCES platform/posix/i_steam.cpp common/platform/posix/i_system_posix.cpp ) set( PLAT_SDL_SOURCES common/platform/posix/sdl/crashcatcher.c common/platform/posix/sdl/hardware.cpp common/platform/posix/sdl/i_gui.cpp common/platform/posix/sdl/i_input.cpp common/platform/posix/sdl/i_joystick.cpp common/platform/posix/sdl/i_main.cpp common/platform/posix/sdl/i_system.cpp common/platform/posix/sdl/sdlglvideo.cpp common/platform/posix/sdl/st_start.cpp ) set( PLAT_UNIX_SOURCES common/platform/posix/unix/i_specialpaths.cpp common/platform/posix/unix/gtk_dialogs.cpp ) set( PLAT_OSX_SOURCES common/platform/posix/osx/iwadpicker_cocoa.mm common/platform/posix/osx/i_specialpaths.mm platform/posix/osx/raze.icns ) set( PLAT_COCOA_SOURCES common/platform/posix/cocoa/i_input.mm common/platform/posix/cocoa/i_joystick.cpp common/platform/posix/cocoa/i_main.mm common/platform/posix/cocoa/i_system.mm common/platform/posix/cocoa/i_video.mm common/platform/posix/cocoa/st_console.mm common/platform/posix/cocoa/st_start.mm ) if( WIN32 ) set( SYSTEM_SOURCES_DIR common/platform/win32 ) set( SYSTEM_SOURCES ${PLAT_WIN32_SOURCES} ) set( OTHER_SYSTEM_SOURCES ${PLAT_POSIX_SOURCES} ${PLAT_SDL_SOURCES} ${PLAT_OSX_SOURCES} ${PLAT_COCOA_SOURCES} ${PLAT_UNIX_SOURCES} ) set( SYSTEM_SOURCES ${SYSTEM_SOURCES} platform/win32/gameres.rc ) elseif( APPLE ) if( OSX_COCOA_BACKEND ) set( SYSTEM_SOURCES_DIR common/platform/posix common/platform/posix/cocoa ) set( SYSTEM_SOURCES ${PLAT_COCOA_SOURCES} ) set( OTHER_SYSTEM_SOURCES ${PLAT_WIN32_SOURCES} ${PLAT_SDL_SOURCES} ${PLAT_UNIX_SOURCES} ) else() set( SYSTEM_SOURCES_DIR common/platform/posix common/platform/posix/sdl ) set( SYSTEM_SOURCES ${PLAT_SDL_SOURCES} ) set( PLAT_OSX_SOURCES ${PLAT_OSX_SOURCES} common/platform/posix/sdl/i_system.mm ) set( OTHER_SYSTEM_SOURCES ${PLAT_WIN32_SOURCES} ${PLAT_COCOA_SOURCES} ${PLAT_UNIX_SOURCES} ) endif() set( SYSTEM_SOURCES ${SYSTEM_SOURCES} ${PLAT_POSIX_SOURCES} ${PLAT_OSX_SOURCES} ) set_source_files_properties( platform/posix/osx/${PROJECT_NAME}.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) set_source_files_properties( common/platform/posix/osx/iwadpicker_cocoa.mm PROPERTIES COMPILE_FLAGS -fobjc-exceptions ) else() set( SYSTEM_SOURCES_DIR common/platform/posix common/platform/posix/sdl ) set( SYSTEM_SOURCES ${PLAT_POSIX_SOURCES} ${PLAT_SDL_SOURCES} ${PLAT_UNIX_SOURCES} ) set( OTHER_SYSTEM_SOURCES ${PLAT_WIN32_SOURCES} ${PLAT_OSX_SOURCES} ${PLAT_COCOA_SOURCES} ) endif() if( HAVE_MMX ) add_definitions( -DHAVE_MMX=1 ) set( SYSTEM_SOURCES ${SYSTEM_SOURCES} common/textures/hires/hqnx_asm/hq2x_asm.cpp common/textures/hires/hqnx_asm/hq3x_asm.cpp common/textures/hires/hqnx_asm/hq4x_asm.cpp common/textures/hires/hqnx_asm/hqnx_asm_Image.cpp) if( DEM_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) set_source_files_properties( common/textures/hires/hqnx_asm/hq2x_asm.cpp common/textures/hires/hqnx_asm/hq3x_asm.cpp common/textures/hires/hqnx_asm/hq4x_asm.cpp common/textures/hires/hqresize.cpp PROPERTIES COMPILE_FLAGS "-mmmx" ) endif( DEM_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) endif( HAVE_MMX ) if( HAVE_PARALLEL_FOR ) add_definitions( -DHAVE_PARALLEL_FOR=1 ) elseif( HAVE_DISPATCH_APPLY ) add_definitions( -DHAVE_DISPATCH_APPLY=1 ) else() option( NO_OPENMP "Disable usage of OpenMP" OFF ) if( NOT NO_OPENMP ) include( FindOpenMP ) if( OPENMP_FOUND ) set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}" ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}" ) endif( OPENMP_FOUND ) endif( NOT NO_OPENMP ) endif() add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zcc-parse.c ${CMAKE_CURRENT_BINARY_DIR}/zcc-parse.h COMMAND lemon -C${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/common/scripting/frontend/zcc-parse.lemon DEPENDS lemon ${CMAKE_CURRENT_SOURCE_DIR}/common/scripting/frontend/zcc-parse.lemon ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h COMMAND re2c --no-generation-date -s -o ${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h ${CMAKE_CURRENT_SOURCE_DIR}/common/engine/sc_man_scanner.re DEPENDS re2c ${CMAKE_CURRENT_SOURCE_DIR}/common/engine/sc_man_scanner.re ) include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) #option( SEND_ANON_STATS "Enable sending of anonymous hardware statistics" ON ) #if( NOT SEND_ANON_STATS ) # add_definitions( -DNO_SEND_STATS ) #endif() # Project files should be aware of the header files. We can GLOB these since # there's generally a new cpp for every header so this file will get changed file( GLOB HEADER_FILES build/include/*.h core/*.h core/2d/*.h core/utility/*.h core/utility/rapidjson/*.h core/console/*.h core/music/*.h core/menu/*.h core/input/*.h core/rendering/*.h core/rendering/scene/*.h common/audio/sound/thirdparty/*.h common/audio/sound/*.h common/audio/music/*.h* common/2d/*.h common/console/*.h common/cutscenes/*.h common/utility/*.h common/engine/*.h common/menu/*.h common/statusbar/*.h common/fonts/*.h common/objects/*.h common/filesystem/*.h common/platform/posix/cocoa/*.h common/platform/posix/sdl/*.h common/platform/win32/*.h common/models/*.h common/textures/*.h common/startscreen/*.h common/textures/hires/hqnx/*.h common/textures/hires/hqnx_asm/*.h common/textures/hires/xbr/*.h common/thirdparty/*.h common/thirdparty/rapidjson/*.h common/thirdparty/math/*h common/thirdparty/libsmackerdec/include/*.h common/rendering/*.h common/rendering/gl_load/*.h common/rendering/hwrenderer/*.h common/rendering/hwrenderer/data/*.h common/rendering/vulkan/*.h common/rendering/vulkan/system/*.h common/rendering/vulkan/renderer/*.h common/rendering/vulkan/shaders/*.h common/rendering/vulkan/textures/*.h common/scripting/core/*h common/scripting/vm/*h common/scripting/jit/*h common/scripting/interface/*.h common/scripting/backend/*.h common/scripting/frontend/*.h games/duke/src/*.h games/blood/src/*.h games/sw/src/*.h games/exhumed/src/*.h build/src/*.h platform/win32/*.h platform/posix/*.h thirdparty/include/*.h thirdparty/include/*.hpp thirdparty/imgui/*.h core/textures/*.h core/textures/formats/*.h ) # These files will be flagged as "headers" so that they appear in project files # without being compiled. set( NOT_COMPILED_SOURCE_FILES ${OTHER_SYSTEM_SOURCES} sc_man_scanner.h common/engine/sc_man_scanner.re common/scripting/frontend/zcc-parse.lemon zcc-parse.c zcc-parse.h common/platform/win32/zutil.natvis common/rendering/vulkan/thirdparty/vk_mem_alloc/vk_mem_alloc.natvis # Blood games/blood/src/actor.cpp games/blood/src/ai.cpp games/blood/src/aibat.cpp games/blood/src/aibeast.cpp games/blood/src/aiboneel.cpp games/blood/src/aiburn.cpp games/blood/src/aicaleb.cpp games/blood/src/aicerber.cpp games/blood/src/aicult.cpp games/blood/src/aigarg.cpp games/blood/src/aighost.cpp games/blood/src/aigilbst.cpp games/blood/src/aihand.cpp games/blood/src/aihound.cpp games/blood/src/aiinnoc.cpp games/blood/src/aipod.cpp games/blood/src/airat.cpp games/blood/src/aispid.cpp games/blood/src/aitchern.cpp games/blood/src/aiunicult.cpp games/blood/src/aizomba.cpp games/blood/src/aizombf.cpp games/blood/src/animatesprite.cpp games/blood/src/asound.cpp games/blood/src/barf.cpp games/blood/src/blood.cpp games/blood/src/callback.cpp games/blood/src/choke.cpp games/blood/src/controls.cpp games/blood/src/db.cpp games/blood/src/dude.cpp games/blood/src/d_menu.cpp games/blood/src/endgame.cpp games/blood/src/eventq.cpp games/blood/src/fire.cpp games/blood/src/fx.cpp games/blood/src/gameutil.cpp games/blood/src/gib.cpp games/blood/src/globals.cpp games/blood/src/hudsprites.cpp games/blood/src/inifile.cpp games/blood/src/levels.cpp games/blood/src/loadsave.cpp games/blood/src/messages.cpp games/blood/src/mirrors.cpp games/blood/src/misc.cpp games/blood/src/nnexts.cpp games/blood/src/nnsprinsect.cpp games/blood/src/osdcmd.cpp games/blood/src/player.cpp games/blood/src/prediction.cpp games/blood/src/preload.cpp games/blood/src/qav.cpp games/blood/src/sbar.cpp games/blood/src/sectorfx.cpp games/blood/src/seq.cpp games/blood/src/sfx.cpp games/blood/src/sound.cpp games/blood/src/tile.cpp games/blood/src/trig.cpp games/blood/src/triggers.cpp games/blood/src/view.cpp games/blood/src/warp.cpp games/blood/src/weapon.cpp # Duke games/duke/src/actors.cpp games/duke/src/actors_d.cpp games/duke/src/actors_lava.cpp games/duke/src/actors_r.cpp games/duke/src/animatesprites_d.cpp games/duke/src/animatesprites_r.cpp games/duke/src/bowling.cpp games/duke/src/ccmds.cpp games/duke/src/cheats.cpp games/duke/src/dispatch.cpp games/duke/src/d_menu.cpp games/duke/src/flags_d.cpp games/duke/src/flags_r.cpp games/duke/src/game.cpp games/duke/src/gamedef.cpp games/duke/src/gameexec.cpp games/duke/src/gameloop.cpp games/duke/src/gamevar.cpp games/duke/src/game_misc.cpp games/duke/src/global.cpp games/duke/src/hudweapon_d.cpp games/duke/src/hudweapon_r.cpp games/duke/src/input.cpp games/duke/src/noise.cpp games/duke/src/player.cpp games/duke/src/player_d.cpp games/duke/src/player_r.cpp games/duke/src/player_w.cpp games/duke/src/prediction.cpp games/duke/src/premap.cpp games/duke/src/premap_d.cpp games/duke/src/premap_r.cpp games/duke/src/render.cpp games/duke/src/savegame.cpp games/duke/src/sbar.cpp games/duke/src/sectors.cpp games/duke/src/sectors_d.cpp games/duke/src/sectors_r.cpp games/duke/src/sounds.cpp games/duke/src/spawn.cpp games/duke/src/spawn_d.cpp games/duke/src/spawn_r.cpp games/duke/src/vmexports.cpp # Shadow Warrior games/sw/src/actor.cpp games/sw/src/ai.cpp games/sw/src/break.cpp games/sw/src/bunny.cpp games/sw/src/cache.cpp games/sw/src/cheats.cpp games/sw/src/colormap.cpp games/sw/src/coolg.cpp games/sw/src/coolie.cpp games/sw/src/copysect.cpp games/sw/src/draw.cpp games/sw/src/d_menu.cpp games/sw/src/eel.cpp games/sw/src/game.cpp games/sw/src/girlninj.cpp games/sw/src/goro.cpp games/sw/src/hornet.cpp games/sw/src/input.cpp games/sw/src/interpso.cpp games/sw/src/inv.cpp games/sw/src/jsector.cpp games/sw/src/jweapon.cpp games/sw/src/lava.cpp games/sw/src/light.cpp games/sw/src/mclip.cpp games/sw/src/menus.cpp games/sw/src/miscactr.cpp games/sw/src/morph.cpp games/sw/src/network.cpp games/sw/src/ninja.cpp games/sw/src/osdcmds.cpp games/sw/src/panel.cpp games/sw/src/player.cpp games/sw/src/predict.cpp games/sw/src/quake.cpp games/sw/src/ripper.cpp games/sw/src/ripper2.cpp games/sw/src/rooms.cpp games/sw/src/rotator.cpp games/sw/src/save.cpp games/sw/src/saveable.cpp games/sw/src/sbar.cpp games/sw/src/scrip2.cpp games/sw/src/sector.cpp games/sw/src/serp.cpp games/sw/src/skel.cpp games/sw/src/skull.cpp games/sw/src/slidor.cpp games/sw/src/sounds.cpp games/sw/src/spike.cpp games/sw/src/sprite.cpp games/sw/src/sumo.cpp games/sw/src/text.cpp games/sw/src/track.cpp games/sw/src/vator.cpp games/sw/src/vis.cpp games/sw/src/wallmove.cpp games/sw/src/warp.cpp games/sw/src/weapon.cpp games/sw/src/zilla.cpp games/sw/src/zombie.cpp # Exhumed games/exhumed/src/2d.cpp games/exhumed/src/anims.cpp games/exhumed/src/anubis.cpp games/exhumed/src/bubbles.cpp games/exhumed/src/bullet.cpp games/exhumed/src/cd.cpp games/exhumed/src/cheats.cpp games/exhumed/src/d_menu.cpp games/exhumed/src/enginesubs.cpp games/exhumed/src/exhumed.cpp games/exhumed/src/fish.cpp games/exhumed/src/gameloop.cpp games/exhumed/src/grenade.cpp games/exhumed/src/gun.cpp games/exhumed/src/init.cpp games/exhumed/src/input.cpp games/exhumed/src/items.cpp games/exhumed/src/lavadude.cpp games/exhumed/src/light.cpp games/exhumed/src/lighting.cpp games/exhumed/src/lion.cpp games/exhumed/src/map.cpp games/exhumed/src/menu.cpp games/exhumed/src/move.cpp games/exhumed/src/movie.cpp games/exhumed/src/mummy.cpp games/exhumed/src/object.cpp games/exhumed/src/osdcmds.cpp games/exhumed/src/player.cpp games/exhumed/src/queen.cpp games/exhumed/src/ra.cpp games/exhumed/src/ramses.cpp games/exhumed/src/random.cpp games/exhumed/src/rat.cpp games/exhumed/src/rex.cpp games/exhumed/src/roach.cpp games/exhumed/src/runlist.cpp games/exhumed/src/save.cpp games/exhumed/src/scorp.cpp games/exhumed/src/sequence.cpp games/exhumed/src/set.cpp games/exhumed/src/snake.cpp games/exhumed/src/sound.cpp games/exhumed/src/spider.cpp games/exhumed/src/status.cpp games/exhumed/src/switch.cpp games/exhumed/src/view.cpp games/exhumed/src/wasp.cpp ) set( VM_JIT_SOURCES common/scripting/jit/jit.cpp common/scripting/jit/jit_runtime.cpp common/scripting/jit/jit_call.cpp common/scripting/jit/jit_flow.cpp common/scripting/jit/jit_load.cpp common/scripting/jit/jit_math.cpp common/scripting/jit/jit_move.cpp common/scripting/jit/jit_store.cpp ) # Enable fast math for some sources where performance matters (or where the PCH must not be used.) set( FASTMATH_SOURCES common/rendering/gl_load/gl_load.c common/textures/hires/hqnx/init.cpp common/textures/hires/hqnx/hq2x.cpp common/textures/hires/hqnx/hq3x.cpp common/textures/hires/hqnx/hq4x.cpp common/textures/hires/xbr/xbrz.cpp common/textures/hires/xbr/xbrz_old.cpp common/utility/matrix.cpp ) #Vulkan stuff must go into a separate list because it needs to be disabled for some platforms set (VULKAN_SOURCES common/rendering/vulkan/system/vk_device.cpp common/rendering/vulkan/system/vk_swapchain.cpp common/rendering/vulkan/system/vk_builders.cpp common/rendering/vulkan/system/vk_framebuffer.cpp common/rendering/vulkan/system/vk_commandbuffer.cpp common/rendering/vulkan/system/vk_hwbuffer.cpp common/rendering/vulkan/system/vk_buffer.cpp common/rendering/vulkan/renderer/vk_renderstate.cpp common/rendering/vulkan/renderer/vk_renderpass.cpp common/rendering/vulkan/renderer/vk_streambuffer.cpp common/rendering/vulkan/renderer/vk_postprocess.cpp common/rendering/vulkan/renderer/vk_pprenderstate.cpp common/rendering/vulkan/renderer/vk_descriptorset.cpp common/rendering/vulkan/renderer/vk_raytrace.cpp common/rendering/vulkan/shaders/vk_shader.cpp common/rendering/vulkan/shaders/vk_ppshader.cpp common/rendering/vulkan/textures/vk_samplers.cpp common/rendering/vulkan/textures/vk_hwtexture.cpp common/rendering/vulkan/textures/vk_pptexture.cpp common/rendering/vulkan/textures/vk_imagetransition.cpp common/rendering/vulkan/textures/vk_renderbuffers.cpp common/rendering/vulkan/textures/vk_texture.cpp common/rendering/vulkan/thirdparty/volk/volk.c common/rendering/vulkan/thirdparty/vk_mem_alloc/vk_mem_alloc.cpp ) if (HAVE_GLES2) set (GLES_SOURCES common/rendering/gles/gles_system.cpp common/rendering/gles/gles_renderer.cpp common/rendering/gles/gles_framebuffer.cpp common/rendering/gles/gles_renderstate.cpp common/rendering/gles/gles_renderbuffers.cpp common/rendering/gles/gles_postprocess.cpp common/rendering/gles/gles_postprocessstate.cpp common/rendering/gles/gles_buffers.cpp common/rendering/gles/gles_hwtexture.cpp common/rendering/gles/gles_shader.cpp common/rendering/gles/gles_shaderprogram.cpp common/rendering/gles/gles_samplers.cpp common/rendering/gles/glad/src/glad.c ) set (FASTMATH_SOURCES ${FASTMATH_SOURCES} ${GLES_SOURCES}) endif() if (HAVE_VULKAN) set (FASTMATH_SOURCES ${FASTMATH_SOURCES} ${VULKAN_SOURCES}) endif() set (FASTMATH_SOURCES ${FASTMATH_SOURCES}) set (PCH_SOURCES common/thirdparty/richpresence.cpp thirdparty/src/md4.cpp # Todo: Split out the license-safe code from this. build/src/clip.cpp build/src/mdsprite.cpp core/actorinfo.cpp core/zcc_compile_raze.cpp core/vmexports.cpp core/thingdef_data.cpp core/thingdef_properties.cpp core/actorlist.cpp core/automap.cpp core/cheats.cpp core/cheathandler.cpp core/rts.cpp core/ct_chat.cpp core/d_net.cpp core/d_protocol.cpp core/mainloop.cpp core/gameconfigfile.cpp core/gamecvars.cpp core/gamecontrol.cpp core/gamehud.cpp core/gamefuncs.cpp core/gameinput.cpp core/g_mapinfo.cpp core/interpolate.cpp core/inputstate.cpp core/maphack.cpp core/mapinfo.cpp core/maploader.cpp core/searchpaths.cpp core/screenjob.cpp core/initfs.cpp core/statistics.cpp core/secrets.cpp core/savegamehelp.cpp core/precache.cpp core/psky.cpp core/quotes.cpp core/screenshot.cpp core/sectorgeometry.cpp core/razefont.cpp core/raze_music.cpp core/raze_sound.cpp core/palette.cpp core/zcompile.cpp core/statusbar2.cpp core/gi.cpp core/defparser.cpp core/rendering/hw_entrypoint.cpp core/rendering/hw_models.cpp core/rendering/hw_voxels.cpp core/rendering/hw_palmanager.cpp core/rendering/hw_sections.cpp core/rendering/hw_vertexmap.cpp core/rendering/scene/hw_clipper.cpp core/rendering/scene/hw_walls.cpp core/rendering/scene/hw_walls_vertex.cpp core/rendering/scene/hw_flats.cpp core/rendering/scene/hw_sprites.cpp core/rendering/scene/hw_drawlistadd.cpp core/rendering/scene/hw_drawlist.cpp core/rendering/scene/hw_drawinfo.cpp core/rendering/scene/hw_bunchdrawer.cpp core/rendering/scene/hw_portal.cpp core/rendering/scene/hw_skyportal.cpp core/rendering/scene/hw_sky.cpp core/rendering/scene/hw_setcolor.cpp core/rendering/scene/hw_lighting.cpp core/r_data/gldefs.cpp core/console/c_notifybuffer.cpp core/console/d_event.cpp common/audio/sound/i_sound.cpp common/audio/sound/oalsound.cpp common/audio/sound/s_environment.cpp common/audio/sound/s_sound.cpp common/audio/sound/s_reverbedit.cpp common/audio/music/music_midi_base.cpp common/audio/music/music.cpp common/audio/music/i_music.cpp common/audio/music/i_soundfont.cpp common/audio/music/music_config.cpp common/2d/v_2ddrawer.cpp common/2d/v_drawtext.cpp common/2d/v_draw.cpp common/2d/wipe.cpp common/thirdparty/gain_analysis.cpp common/thirdparty/sfmt/SFMT.cpp common/startscreen/startscreen.cpp common/startscreen/startscreen_heretic.cpp common/startscreen/startscreen_hexen.cpp common/startscreen/startscreen_strife.cpp common/startscreen/startscreen_generic.cpp common/startscreen/endoom.cpp common/fonts/singlelumpfont.cpp common/fonts/singlepicfont.cpp common/fonts/specialfont.cpp common/fonts/font.cpp common/fonts/hexfont.cpp common/fonts/v_font.cpp common/fonts/v_text.cpp common/textures/hw_ihwtexture.cpp common/textures/hw_material.cpp common/textures/bitmap.cpp common/textures/m_png.cpp common/textures/texture.cpp common/textures/gametexture.cpp common/textures/image.cpp common/textures/imagetexture.cpp common/textures/texturemanager.cpp common/textures/multipatchtexturebuilder.cpp common/textures/skyboxtexture.cpp common/textures/animtexture.cpp common/textures/v_collection.cpp common/textures/animlib.cpp common/textures/formats/automaptexture.cpp common/textures/formats/brightmaptexture.cpp common/textures/formats/buildtexture.cpp common/textures/formats/ddstexture.cpp common/textures/formats/flattexture.cpp common/textures/formats/fontchars.cpp common/textures/formats/imgztexture.cpp common/textures/formats/jpegtexture.cpp common/textures/formats/md5check.cpp common/textures/formats/multipatchtexture.cpp common/textures/formats/patchtexture.cpp common/textures/formats/pcxtexture.cpp common/textures/formats/pngtexture.cpp common/textures/formats/rawpagetexture.cpp common/textures/formats/startuptexture.cpp common/textures/formats/emptytexture.cpp common/textures/formats/shadertexture.cpp common/textures/formats/tgatexture.cpp common/textures/formats/stbtexture.cpp common/textures/formats/anmtexture.cpp common/textures/formats/startscreentexture.cpp common/textures/hires/hqresize.cpp common/models/models_md3.cpp common/models/models_md2.cpp common/models/models_voxel.cpp common/models/models_ue1.cpp common/models/models_obj.cpp common/models/models_iqm.cpp common/models/model.cpp common/models/voxels.cpp common/console/c_commandline.cpp common/console/c_buttons.cpp common/console/c_bind.cpp common/console/c_enginecmds.cpp common/console/c_consolebuffer.cpp common/console/c_cvars.cpp common/console/c_dispatch.cpp common/console/c_commandbuffer.cpp common/console/c_console.cpp common/console/c_notifybufferbase.cpp common/console/c_tabcomplete.cpp common/console/c_expr.cpp common/cutscenes/playmve.cpp common/cutscenes/movieplayer.cpp common/cutscenes/screenjob.cpp common/utility/engineerrors.cpp common/utility/i_module.cpp common/utility/gitinfo.cpp common/utility/m_alloc.cpp common/utility/utf8.cpp common/utility/palette.cpp common/utility/files.cpp common/utility/files_decompress.cpp common/utility/memarena.cpp common/utility/cmdlib.cpp common/utility/configfile.cpp common/utility/i_time.cpp common/utility/m_argv.cpp common/utility/s_playlist.cpp common/utility/zstrformat.cpp common/utility/name.cpp common/utility/r_memory.cpp common/thirdparty/base64.cpp common/thirdparty/md5.cpp common/thirdparty/superfasthash.cpp common/thirdparty/libsmackerdec/src/BitReader.cpp common/thirdparty/libsmackerdec/src/FileStream.cpp common/thirdparty/libsmackerdec/src/HuffmanVLC.cpp common/thirdparty/libsmackerdec/src/LogError.cpp common/thirdparty/libsmackerdec/src/SmackerDecoder.cpp common/filesystem/filesystem.cpp common/filesystem/ancientzip.cpp common/filesystem/file_7z.cpp common/filesystem/file_grp.cpp common/filesystem/file_lump.cpp common/filesystem/file_rff.cpp common/filesystem/file_wad.cpp common/filesystem/file_zip.cpp common/filesystem/file_pak.cpp common/filesystem/file_whres.cpp common/filesystem/file_ssi.cpp common/filesystem/file_directory.cpp common/filesystem/resourcefile.cpp common/engine/cycler.cpp common/engine/d_event.cpp common/engine/date.cpp common/engine/stats.cpp common/engine/sc_man.cpp common/engine/palettecontainer.cpp common/engine/stringtable.cpp common/engine/i_net.cpp common/engine/i_interface.cpp common/engine/renderstyle.cpp common/engine/v_colortables.cpp common/engine/serializer.cpp common/engine/m_joy.cpp common/engine/m_random.cpp common/objects/autosegs.cpp common/objects/dobject.cpp common/objects/dobjgc.cpp common/objects/dobjtype.cpp common/menu/joystickmenu.cpp common/menu/menu.cpp common/menu/messagebox.cpp common/menu/optionmenu.cpp common/menu/resolutionmenu.cpp common/menu/menudef.cpp common/menu/savegamemanager.cpp common/statusbar/base_sbar.cpp common/rendering/v_framebuffer.cpp common/rendering/v_video.cpp common/rendering/r_thread.cpp common/rendering/r_videoscale.cpp common/rendering/hwrenderer/hw_draw2d.cpp common/rendering/hwrenderer/data/hw_clock.cpp common/rendering/hwrenderer/data/hw_skydome.cpp common/rendering/hwrenderer/data/flatvertices.cpp common/rendering/hwrenderer/data/hw_viewpointbuffer.cpp common/rendering/hwrenderer/data/hw_modelvertexbuffer.cpp common/rendering/hwrenderer/data/hw_cvars.cpp common/rendering/hwrenderer/data/hw_vrmodes.cpp common/rendering/hwrenderer/data/hw_lightbuffer.cpp common/rendering/hwrenderer/data/hw_bonebuffer.cpp common/rendering/hwrenderer/data/hw_aabbtree.cpp common/rendering/hwrenderer/data/hw_shadowmap.cpp common/rendering/hwrenderer/data/hw_shaderpatcher.cpp common/rendering/hwrenderer/postprocessing/hw_postprocessshader.cpp common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp common/rendering/hwrenderer/postprocessing/hw_postprocess_cvars.cpp common/rendering/hwrenderer/postprocessing/hw_postprocessshader_ccmds.cpp common/rendering/gl_load/gl_interface.cpp common/rendering/gl/gl_renderer.cpp common/rendering/gl/gl_stereo3d.cpp common/rendering/gl/gl_framebuffer.cpp common/rendering/gl/gl_renderstate.cpp common/rendering/gl/gl_renderbuffers.cpp common/rendering/gl/gl_postprocess.cpp common/rendering/gl/gl_postprocessstate.cpp common/rendering/gl/gl_debug.cpp common/rendering/gl/gl_buffers.cpp common/rendering/gl/gl_hwtexture.cpp common/rendering/gl/gl_samplers.cpp common/rendering/gl/gl_shader.cpp common/rendering/gl/gl_shaderprogram.cpp common/scripting/core/dictionary.cpp common/scripting/core/dynarrays.cpp common/scripting/core/symbols.cpp common/scripting/core/types.cpp common/scripting/core/scopebarrier.cpp common/scripting/core/vmdisasm.cpp common/scripting/core/imports.cpp common/scripting/vm/vmexec.cpp common/scripting/vm/vmframe.cpp common/scripting/interface/stringformat.cpp common/scripting/interface/vmnatives.cpp common/scripting/frontend/ast.cpp common/scripting/frontend/zcc_compile.cpp common/scripting/frontend/zcc_parser.cpp common/scripting/backend/vmbuilder.cpp common/scripting/backend/codegen.cpp core/textures/buildtiles.cpp core/textures/skytexture.cpp core/textures/hightile.cpp core/music/s_advsound.cpp core/menu/loadsavemenu.cpp core/menu/usermap.cpp core/menu/razemenu.cpp #Duke is split because Duke and RR need different constants. games/duke/all.cpp games/duke/all_d.cpp games/duke/all_r.cpp games/exhumed/all.cpp games/blood/all.cpp games/sw/all.cpp ) if( ${HAVE_VM_JIT} ) set( PCH_SOURCES ${PCH_SOURCES} ${VM_JIT_SOURCES} ) else() set( NOT_COMPILED_SOURCE_FILES ${NOT_COMPILED_SOURCE_FILES} ${VM_JIT_SOURCES} ) endif() macro( use_precompiled_header ) if( MSVC ) enable_precompiled_headers( "${ARGV0}/g_pch.h" PCH_SOURCES ) else() # Temporary solution for compilers other than MSVC set_source_files_properties( ${PCH_SOURCES} PROPERTIES COMPILE_FLAGS "-include g_pch.h" ) endif() endmacro() use_precompiled_header(".") add_executable( ${PROJECT_NAME} WIN32 MACOSX_BUNDLE ${HEADER_FILES} ${NOT_COMPILED_SOURCE_FILES} ${SYSTEM_SOURCES} ${FASTMATH_SOURCES} ${PCH_SOURCES} common/utility/x86.cpp common/thirdparty/strnatcmp.c common/utility/zstring.cpp common/utility/findfile.cpp common/thirdparty/math/asin.c common/thirdparty/math/atan.c common/thirdparty/math/const.c common/thirdparty/math/cosh.c common/thirdparty/math/exp.c common/thirdparty/math/isnan.c common/thirdparty/math/log.c common/thirdparty/math/log10.c common/thirdparty/math/mtherr.c common/thirdparty/math/polevl.c common/thirdparty/math/pow.c common/thirdparty/math/powi.c common/thirdparty/math/sin.c common/thirdparty/math/sinh.c common/thirdparty/math/sqrt.c common/thirdparty/math/tan.c common/thirdparty/math/tanh.c common/thirdparty/math/fastsin.cpp ) #set_source_files_properties( ${FASTMATH_SOURCES} PROPERTIES COMPILE_FLAGS ${DEM_FASTMATH_FLAG} ) set_source_files_properties( xlat/parse_xlat.cpp PROPERTIES OBJECT_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/xlat_parser.c" ) set_source_files_properties( common/engine/sc_man.cpp PROPERTIES OBJECT_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h" ) set_source_files_properties( ${NOT_COMPILED_SOURCE_FILES} PROPERTIES HEADER_FILE_ONLY TRUE ) if(${CMAKE_SYSTEM_NAME} STREQUAL "SunOS") # [BL] Solaris requires these to be explicitly linked. set( PROJECT_LIBRARIES ${PROJECT_LIBRARIES} nsl socket) endif() if( UNIX ) find_package( Backtrace ) if(Backtrace_FOUND) set( PROJECT_LIBRARIES ${PROJECT_LIBRARIES} ${Backtrace_LIBRARIES} ) endif() endif() target_link_libraries( ${PROJECT_NAME} ${PROJECT_LIBRARIES} ${ZMUSIC_LIBRARIES} gdtoa lzma ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} build/include libxmp-lite/include libxmp-lite/include/libxmp-lite thirdparty/include thirdparty/imgui core core/2d core/fonts core/utility core/console core/textures core/music core/dobject core/menu core/input core/rendering core/rendering/scene platform common/audio/sound common/audio/music common/2d common/cutscenes common/thirdparty/libsmackerdec/include common/thirdparty common/textures common/textures/formats common/textures/hires common/textures common/models common/filesystem common/utility common/console common/engine common/menu common/statusbar common/fonts common/objects common/startscreen common/rendering common/rendering/hwrenderer common/rendering/hwrenderer/data common/rendering/gl_load common/rendering/gl common/rendering/gles common/rendering/gles/glad/include common/rendering/gles/Mali_OpenGL_ES_Emulator/include common/rendering/vulkan/thirdparty common/scripting/vm common/scripting/jit common/scripting/core common/scripting/interface common/scripting/frontend common/scripting/backend ../libraries/glslang/glslang/Public ../libraries/glslang/spirv ${CMAKE_BINARY_DIR}/libraries/gdtoa ${SYSTEM_SOURCES_DIR} ) if (NOT WIN32) include_directories(platform/posix) endif() add_dependencies( ${PROJECT_NAME} revision_check ) # Due to some quirks, we need to do this in this order if( NOT COMPILE_OUTPUT_OLDSTYLE ) # RUNTIME_OUTPUT_DIRECTORY does not exist in CMake 2.4. # Linux distributions are slow to adopt 2.6. :( set_target_properties( ${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${COMPILE_OUTPUT_DIRECTORY} ) set_target_properties( ${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME} ) else() set_target_properties( ${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_NAME ${PROJECT_NAME} RUNTIME_OUTPUT_DIRECTORY_RELEASE ${COMPILE_OUTPUT_DIRECTORY} RUNTIME_OUTPUT_NAME_DEBUG ${PROJECT_NAME}d RUNTIME_OUTPUT_DIRECTORY_DEBUG ${COMPILE_OUTPUT_DIRECTORY} RUNTIME_OUTPUT_NAME_MINSIZEREL ${PROJECT_NAME}msr RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${COMPILE_OUTPUT_DIRECTORY} RUNTIME_OUTPUT_NAME_RELWITHDEBINFO ${PROJECT_NAME}rd RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${COMPILE_OUTPUT_DIRECTORY} ) endif() if( MSVC ) option( COMPILE_GENERATE_MAPFILE "Generate .map file for debugging." OFF ) set( LINKERSTUFF "/MANIFEST:NO" ) if( COMPILE_GENERATE_MAPFILE ) set( LINKERSTUFF "${LINKERSTUFF} /MAP" ) endif() set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS ${LINKERSTUFF}) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND "mt.exe" -manifest \"${CMAKE_CURRENT_SOURCE_DIR}\\common\\platform\\win32\\manifest.xml\" -outputresource:\"$\"\;\#1 COMMENT "Adding manifest..." ) endif() if( NOT WIN32 AND NOT APPLE ) FILE( WRITE ${CMAKE_CURRENT_BINARY_DIR}/link-make "if [ ! -e ${COMPILE_OUTPUT_DIRECTORY}/${PROJECT_NAME} ]; then ln -sf ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME} ${COMPILE_OUTPUT_DIRECTORY}/${PROJECT_NAME}; fi" ) add_custom_command( TARGET ${PROJECT_NAME} POST_BUILD COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/link-make COMMAND ${CMAKE_CURRENT_BINARY_DIR}/link-make ) IF ("${INSTALL_RPATH}" STREQUAL "") set_target_properties(${PROJECT_NAME} PROPERTIES #allow libzmusic.so.1 library in same folder as executable at runtime INSTALL_RPATH "\$ORIGIN" BUILD_WITH_INSTALL_RPATH ON ) endif() endif() add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/soundfont/${PROJECT_NAME}.sf2 $/soundfonts/${PROJECT_NAME}.sf2 ) if( CMAKE_COMPILER_IS_GNUCXX ) # GCC misoptimizes this file endif() if( DEM_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) # Need to enable intrinsics for these files. set_property( SOURCE common/utility/palette.cpp common/utility/x86.cpp APPEND_STRING PROPERTY COMPILE_FLAGS " ${SSE2_ENABLE}" ) endif() if( APPLE ) set( LINK_FRAMEWORKS "-framework Cocoa -framework IOKit -framework OpenGL") if( HAVE_VULKAN ) set( LINK_FRAMEWORKS "${LINK_FRAMEWORKS} -framework QuartzCore" ) endif() set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "${LINK_FRAMEWORKS}" MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/platform/posix/osx/${PROJECT_NAME}-info.plist" XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "" ) # Dymanic libraries like libvulkan.dylib or libMoltenVK.dylib will be loaded by dlopen() # if placed in the directory with the main executable set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rpath @executable_path" ) endif() if( WIN32 ) set( INSTALL_PATH . CACHE STRING "Directory where the executable will be placed during install." ) else() set( INSTALL_PATH bin CACHE STRING "Directory where the executable will be placed during install." ) endif() install(TARGETS ${PROJECT_NAME} DESTINATION ${INSTALL_PATH} COMPONENT "Game executable") source_group("Games" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/games/.+") source_group("Games\\Duke" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/games/duke/.+") source_group("Games\\Duke\\Source" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/games/duke/src/.+") source_group("Games\\Blood" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/games/blood/.+") source_group("Games\\Blood\\Source" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/games/blood/src.+") source_group("Games\\Shadow Warrior" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/games/sw/+") source_group("Games\\Shadow Warrior\\Source" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/games/sw/src/+") source_group("Games\\Exhumed" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/games/exhumed/.+") source_group("Games\\Exhumed\\Source" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/games/exhumed/src/.+") source_group("Core" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/core/.+") source_group("Core\\Textures" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/core/textures/.+") source_group("Core\\Textures\\Formats" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/core/textures/formats/.+") source_group("Core\\Utility" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/core/utility/.+") source_group("Core\\2D" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/core/2d/.+") source_group("Core\\Console" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/core/console/.+") source_group("Core\\DObject" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/core/dobject/.+") source_group("Core\\Menu" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/core/menu/.+") source_group("Core\\Rendering" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/core/rendering/.+") source_group("Core\\Rendering\\Scene" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/core/rendering/scene/.+") source_group("Platform" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/platform/.+") source_group("Platform\\Win32" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/platform/win32/.+") source_group("Platform\\POSIX" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/platform/posix/.+") source_group("Common" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/.+") source_group("Common\\Audio" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/audio/.+") source_group("Common\\Audio\\Sound" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/audio/sound/.+") source_group("Common\\Audio\\Sound\\Third-party" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/audio/sound/thirdparty/.+") source_group("Common\\Audio\\Music" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/audio/music.+") source_group("Common\\Console" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/console/.+") source_group("Common\\Utility" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/utility/.+") source_group("Common\\Engine" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/engine/.+") source_group("Common\\2D" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/2d/.+") source_group("Common\\Cutscenes" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/cutscenes/.+") source_group("Common\\Objects" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/objects/.+") source_group("Common\\Menu" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/menu/.+") source_group("Common\\Fonts" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/fonts/.+") source_group("Common\\File System" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/filesystem/.+") source_group("Common\\Scripting" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/scripting/.+") source_group("Common\\Scripting\\Interface" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/scripting/interface/.+") source_group("Common\\Scripting\\Frontend" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/scripting/frontend/.+" FILES ${CMAKE_CURRENT_BINARY_DIR}/zcc-parse.c ${CMAKE_CURRENT_BINARY_DIR}/zcc-parse.h) source_group("Common\\Scripting\\Backend" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/scripting/backend/.+") source_group("Common\\Scripting\\Core" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/scripting/core/.+") source_group("Common\\Scripting\\JIT" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/scripting/jit/.+") source_group("Common\\Scripting\\VM" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/scripting/vm/.+") source_group("Common\\Platforms\\Cocoa Files" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/platform/posix/cocoa/.+") source_group("Common\\Platforms\\OS X Files" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/platform/posix/osx/.+") source_group("Common\\Platforms\\Unix Files" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/platform/posix/unix/.+") source_group("Common\\Platforms\\SDL Files" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/platform/posix/sdl/.+") source_group("Common\\Platforms\\Win32 Files" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/platform/win32/.+") source_group("Common\\Rendering" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/.+") source_group("Common\\Rendering\\Hardware Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/hwrenderer/.+") source_group("Common\\Rendering\\Hardware Renderer\\Data" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/hwrenderer/data/.+") source_group("Common\\Rendering\\Hardware Renderer\\Postprocessing" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/hwrenderer/postprocessing/.+") source_group("Common\\Rendering\\OpenGL Loader" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/gl_load/.+") source_group("Common\\Rendering\\OpenGL Backend" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/gl/.+") source_group("Common\\Rendering\\GLES Backend" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/gles/.+") source_group("Common\\Rendering\\Vulkan Renderer\\System" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/vulkan/system/.+") source_group("Common\\Rendering\\Vulkan Renderer\\Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/vulkan/renderer/.+") source_group("Common\\Rendering\\Vulkan Renderer\\Shaders" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/vulkan/shaders/.+") source_group("Common\\Rendering\\Vulkan Renderer\\Textures" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/vulkan/textures/.+") source_group("Common\\Rendering\\Vulkan Renderer\\Third Party" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/vulkan/thirdparty/.+") source_group("Common\\Rendering\\Vulkan Renderer\\Third Party\\Volk" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/vulkan/thirdparty/volk/.+") source_group("Common\\Rendering\\Vulkan Renderer\\Third Party\\Vk_Mem_Alloc" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/rendering/vulkan/thirdparty/vk_mem_alloc.+") source_group("Common\\Models" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/models/.+") source_group("Common\\Textures" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/textures/.+") source_group("Common\\Textures\\Hires" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/textures/hires/.+") source_group("Common\\Textures\\Hires\\HQ Resize" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/textures/hires/hqnx/.+") source_group("Common\\Textures\\Hires\\HQ Resize MMX version" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/textures/hires/hqnx_asm/.+") source_group("Common\\Textures\\Hires\\XBRZ" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/textures/hires/xbr/.+") source_group("Common\\Textures\\Formats" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/textures/formats/.+") source_group("Common\\Third Party" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/thirdparty/.+") source_group("Common\\Third Party\\Math" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/thirdparty/math/.+") source_group("Common\\Third Party\\RapidJSON" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/thirdparty/rapidjson/.+") source_group("Common\\Third Party\\SFMT" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/common/thirdparty/sfmt/.+") source_group("Utility\\Smackerdec" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/smackerdec/.+") source_group("Utility\\Smackerdec\\Headers" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/libsmackerdec/include/.+") source_group("Utility\\Smackerdec\\Sources" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/libsmackerdec/src/.+") source_group("Utility\\Third Party" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/.+") source_group("Utility\\Third Party Headers" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/include/.+") source_group("Utility\\Third Party Sources" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/src/.+") source_group("Utility\\RapidJSON" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/utility/rapidjson/.+") source_group("Build Engine" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/build/.+") source_group("Build Engine\\Headers" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/build/include/.+") source_group("Build Engine\\Sources" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/build/src/.+") unset( PCH_SOURCES ) unset( HEADER_FILES ) unset( NOT_COMPILED_SOURCE_FILES )