#============================================================================ # Copyright (C) 2013 - 2018, OpenJK contributors # # This file is part of the OpenJK source code. # # OpenJK is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . #============================================================================ # Make sure the user is not executing this script directly if(NOT InOpenJK) message(FATAL_ERROR "Use the top-level cmake script!") endif(NOT InOpenJK) # Add Game Project if(BuildSPGame) add_subdirectory("${SPDir}/game") endif(BuildSPGame) # Add Modular Renderer project add_subdirectory("${SPDir}/rd-vanilla") # Add Engine Project if(BuildSPEngine OR BuildJK2SPEngine) # Libraries if(WIN32) set(SPEngineLibraries "winmm") endif(WIN32) # Defines set(SPEngineDefines ${SharedDefines} "_JK2EXE") # it's called JK2EXE but it really just means Singleplayer Exe # OpenXR defines used by set(SPEngineDefines ${SPEngineDefines} "JKXR_CLIENT") set(SPEngineDefines ${SPEngineDefines} "XR_USE_PLATFORM_WIN32") set(SPEngineDefines ${SPEngineDefines} "XR_USE_GRAPHICS_API_OPENGL") set(SPEngineIncludeDirectories ${SPEngineIncludeDirectories} ${SharedDir} ${CMAKE_BINARY_DIR}/shared ${SPDir} "${GSLIncludeDirectory}" "${JKXRDir}" "${OpenXRLibDir}" "${OpenGLExternalIncludeDir}" ) # Dependencies # OpenAL (is optionally included for Windows) if(MSVC AND NOT WIN64) if(UseInternalOpenAL) # There's a libs/OpenAL32.lib # (mrw) TODO Is this actually required on windows? It is loaded at runtime, should not be linked? find_library(OpenALLibrary NAMES OpenAL32 PATHS "${OpenJKLibDir}") if(NOT OpenALLibrary) message(FATAL_ERROR "UseInternalOpenAL enabled, but lib/OpenAL32.lib not found!") endif(NOT OpenALLibrary) set(SPEngineLibraries ${SPEngineLibraries} ${OpenALLibrary}) else(UseInternalOpenAL) find_package(OpenAL REQUIRED) set(SPEngineIncludeDirectories ${SPEngineIncludeDirectories} ${OPENAL_INCLUDE_DIR}) set(SPEngineLibraries ${SPEngineLibraries} ${OPENAL_LIBRARY}) endif(UseInternalOpenAL) set(SPEngineEAXFiles "${SPDir}/client/eax/eax.h" "${SPDir}/client/eax/EaxMan.h" ) source_group("eax" FILES ${SPEngineEAXFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineEAXFiles}) endif() if(UseInternalSDL2) if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(SPEngineLibraries ${SPEngineLibraries} ${OpenJKLibDir}/SDL2/lib/x86/SDL2main.lib ${OpenJKLibDir}/SDL2/lib/x86/SDL2.lib ) else() set(SPEngineLibraries ${SPEngineLibraries} ${OpenJKLibDir}/SDL2/lib/x64/SDL2main.lib ${OpenJKLibDir}/SDL2/lib/x64/SDL2.lib ) endif() set(SPEngineIncludeDirectories ${SPEngineIncludeDirectories} ${OpenJKLibDir}/SDL2/include ) else() find_package(SDL2 REQUIRED CONFIG) if (TARGET SDL2::SDL2) set(SDL2_INCLUDE_DIRS "") set(SDL2_LIBRARIES SDL2::SDL2) endif() string(STRIP ${SDL2_LIBRARIES} SDL2_LIBRARIES) set(SPEngineIncludeDirectories ${SPEngineIncludeDirectories} ${SDL2_INCLUDE_DIRS}) set(SPEngineLibraries ${SPEngineLibraries} ${SDL2_LIBRARIES}) endif() # OpenGL needed in the SP engine now for JKXR find_package(OpenGL REQUIRED) set(SPEngineIncludeDirectories ${SPEngineIncludeDirectories} ${OPENGL_INCLUDE_DIR}) set(SPEngineLibraries ${SPEngineLibraries} ${OPENGL_LIBRARIES}) # OpenXR library - switch between debug/release set(SPEngineLibraries ${SPEngineLibraries} ${OpenJKLibDir}/openxr/lib/x64/openxr_loader$<$:d>.lib ) # Source Files # Client files set(SPEngineClientFiles "${SPDir}/client/keys.h" "${SPDir}/client/keycodes.h" "${SPDir}/client/cl_cgame.cpp" "${SPDir}/client/cl_cin.cpp" "${SPDir}/client/cl_console.cpp" "${SPDir}/client/cl_input.cpp" "${SPDir}/client/cl_keys.cpp" "${SPDir}/client/cl_main.cpp" "${SPDir}/client/cl_mp3.cpp" "${SPDir}/client/cl_parse.cpp" "${SPDir}/client/cl_scrn.cpp" "${SPDir}/client/cl_ui.cpp" "${SPDir}/client/cl_mp3.h" "${SPDir}/client/client.h" "${SPDir}/client/client_ui.h" "${SPDir}/client/snd_ambient.cpp" "${SPDir}/client/snd_dma.cpp" "${SPDir}/client/snd_mem.cpp" "${SPDir}/client/snd_mix.cpp" "${SPDir}/client/snd_music.cpp" "${SPDir}/client/snd_ambient.h" "${SPDir}/client/snd_local.h" "${SPDir}/client/snd_music.h" "${SPDir}/client/snd_public.h" "${SPDir}/client/vmachine.cpp" "${SPDir}/client/vmachine.h" ) source_group("client" FILES ${SPEngineClientFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineClientFiles}) # qcommon files set(SPEngineCommonFiles "${SPDir}/qcommon/cm_load.cpp" "${SPDir}/qcommon/cm_patch.cpp" "${SPDir}/qcommon/cm_polylib.cpp" "${SPDir}/qcommon/cm_test.cpp" "${SPDir}/qcommon/cm_trace.cpp" "${SPDir}/qcommon/cm_local.h" "${SPDir}/qcommon/cm_patch.h" "${SPDir}/qcommon/cm_polylib.h" "${SPDir}/qcommon/cm_public.h" "${SPDir}/qcommon/cmd.cpp" "${SPDir}/qcommon/common.cpp" "${SPDir}/qcommon/cvar.cpp" "${SPDir}/qcommon/files.cpp" "${SPDir}/qcommon/md4.cpp" "${SPDir}/qcommon/msg.cpp" "${SPDir}/qcommon/net_chan.cpp" "${SPDir}/qcommon/q_shared.cpp" "${SPDir}/qcommon/q_shared.h" "${SPDir}/qcommon/sstring.h" "${SPDir}/qcommon/stringed_ingame.cpp" "${SPDir}/qcommon/stringed_interface.cpp" "${SPDir}/qcommon/stringed_ingame.h" "${SPDir}/qcommon/stringed_interface.h" "${SPDir}/qcommon/strip.cpp" "${SPDir}/qcommon/persistence.cpp" "${SPDir}/qcommon/tags.h" "${SPDir}/qcommon/z_memman_pc.cpp" "${SPDir}/qcommon/qfiles.h" "${SPDir}/qcommon/qcommon.h" "${SPDir}/qcommon/stv_version.h" "${SPDir}/qcommon/timing.h" "${SPDir}/qcommon/MiniHeap.h" "${SPDir}/qcommon/ojk_i_saved_game.h" "${SPDir}/qcommon/ojk_saved_game.h" "${SPDir}/qcommon/ojk_saved_game.cpp" "${SPDir}/qcommon/ojk_saved_game_helper.h" "${SPDir}/qcommon/ojk_saved_game_helper_fwd.h" "${SPDir}/qcommon/ojk_scope_guard.h" ${SharedCommonFiles} ) source_group("common" FILES ${SPEngineCommonFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineCommonFiles}) set(SPEngineCommonSafeFiles "${SharedDir}/qcommon/safe/files.cpp" "${SharedDir}/qcommon/safe/files.h" ${SharedCommonSafeFiles} "${SPDir}/qcommon/safe/memory.h" ) source_group("common/safe" FILES ${SPEngineCommonSafeFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineCommonSafeFiles}) # Server files set(SPEngineServerFiles "${SPDir}/server/exe_headers.cpp" "${SPDir}/server/sv_ccmds.cpp" "${SPDir}/server/sv_client.cpp" "${SPDir}/server/sv_game.cpp" "${SPDir}/server/sv_init.cpp" "${SPDir}/server/sv_main.cpp" "${SPDir}/server/sv_savegame.cpp" "${SPDir}/server/sv_snapshot.cpp" "${SPDir}/server/sv_world.cpp" "${SPDir}/server/exe_headers.h" "${SPDir}/server/server.h" ) source_group("server" FILES ${SPEngineServerFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineServerFiles}) # Game files set(SPEngineGameFiles "${SPDir}/game/genericparser2.cpp" "${SPDir}/game/channels.h" "${SPDir}/game/anims.h" "${SPDir}/game/b_public.h" "${SPDir}/game/bg_public.h" "${SPDir}/game/bset.h" "${SPDir}/game/bstate.h" "${SPDir}/game/common_headers.h" "${SPDir}/game/g_functions.h" "${SPDir}/game/g_items.h" "${SPDir}/game/g_local.h" "${SPDir}/game/g_nav.h" "${SPDir}/game/g_public.h" "${SPDir}/game/g_shared.h" "${SPDir}/game/genericparser2.h" "${SPDir}/game/statindex.h" "${SPDir}/game/teams.h" "${SPDir}/game/weapons.h" "${SPDir}/game/surfaceflags.h" "${SPDir}/game/ghoul2_shared.h" ) source_group("game" FILES ${SPEngineGameFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineGameFiles}) # MP3 files set(SPEngineMP3Files "${SPDir}/mp3code/cdct.c" "${SPDir}/mp3code/csbt.c" "${SPDir}/mp3code/csbtb.c" "${SPDir}/mp3code/csbtl3.c" "${SPDir}/mp3code/cup.c" "${SPDir}/mp3code/cupini.c" "${SPDir}/mp3code/cupl1.c" "${SPDir}/mp3code/cupl3.c" "${SPDir}/mp3code/cwin.c" "${SPDir}/mp3code/cwinb.c" "${SPDir}/mp3code/cwinm.c" "${SPDir}/mp3code/hwin.c" "${SPDir}/mp3code/l3dq.c" "${SPDir}/mp3code/l3init.c" "${SPDir}/mp3code/mdct.c" "${SPDir}/mp3code/mhead.c" "${SPDir}/mp3code/msis.c" "${SPDir}/mp3code/towave.c" "${SPDir}/mp3code/uph.c" "${SPDir}/mp3code/upsf.c" "${SPDir}/mp3code/wavep.c" "${SPDir}/mp3code/config.h" "${SPDir}/mp3code/htable.h" "${SPDir}/mp3code/jdw.h" "${SPDir}/mp3code/l3.h" "${SPDir}/mp3code/mhead.h" "${SPDir}/mp3code/mp3struct.h" "${SPDir}/mp3code/port.h" "${SPDir}/mp3code/small_header.h" "${SPDir}/mp3code/tableawd.h" ) source_group("mp3" FILES ${SPEngineMP3Files}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineMP3Files}) set(SPEngineRendererFiles "${SPDir}/rd-common/mdx_format.h" "${SPDir}/rd-common/tr_public.h" "${SPDir}/rd-common/tr_types.h" ) source_group("renderer" FILES ${SPEngineRendererFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineRendererFiles}) # UI files set(SPEngineUIFiles "${SPDir}/ui/ui_atoms.cpp" "${SPDir}/ui/ui_connect.cpp" "${SPDir}/ui/ui_main.cpp" "${SPDir}/ui/ui_saber.cpp" "${SPDir}/ui/ui_shared.cpp" "${SPDir}/ui/ui_syscalls.cpp" "${SPDir}/ui/gameinfo.h" "${SPDir}/ui/menudef.h" "${SPDir}/ui/ui_local.h" "${SPDir}/ui/ui_public.h" "${SPDir}/ui/ui_shared.h" ) source_group("ui" FILES ${SPEngineUIFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineUIFiles}) # Ghoul2 files set(SPEngineGhoul2Files "${SPDir}/ghoul2/G2.h" "${SPDir}/ghoul2/ghoul2_gore.h" ) source_group("ghoul2" FILES ${SPEngineGhoul2Files}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineGhoul2Files}) # JKXR files set(SPEngineJKXRFiles "${CMAKE_SOURCE_DIR}/JKXR/windows/JKXR_SurfaceView.cpp" "${CMAKE_SOURCE_DIR}/JKXR/windows/TBXR_Common.cpp" "${CMAKE_SOURCE_DIR}/JKXR/windows/TBXR_Common.h" "${CMAKE_SOURCE_DIR}/JKXR/OpenXrInput.cpp" "${CMAKE_SOURCE_DIR}/JKXR/VrClientInfo.h" "${CMAKE_SOURCE_DIR}/JKXR/VrCommon.h" "${CMAKE_SOURCE_DIR}/JKXR/VrInputCommon.cpp" "${CMAKE_SOURCE_DIR}/JKXR/VrInputDefault.cpp" "${CMAKE_SOURCE_DIR}/JKXR/VrInputWeaponAlign.cpp" "${CMAKE_SOURCE_DIR}/JKXR/VrCvars.h" "${CMAKE_SOURCE_DIR}/JKXR/VrInput.h" "${CMAKE_SOURCE_DIR}/JKXR/VrTBDC.h" ) source_group("JKXR" FILES ${SPEngineJKXRFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineJKXRFiles}) # Server files set(SPEngineCGameFiles "${SPDir}/cgame/cg_public.h" "${SPDir}/cgame/animtable.h" ) source_group("cgame" FILES ${SPEngineCGameFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineCGameFiles}) if(WIN32) set(SPEngineWin32Files "${SPDir}/win32/resource.h" "${SPDir}/win32/winquake.rc" "${SharedDir}/sys/win_manifest.manifest" ) source_group("win32" FILES ${SPEngineWin32Files}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineWin32Files}) endif() set(SPEngineSysFiles "${SharedDir}/sys/sys_main.cpp" "${SharedDir}/sys/sys_event.cpp" "${SharedDir}/sys/sys_local.h" "${SharedDir}/sys/sys_public.h" "${SharedDir}/sys/sys_loadlib.h" "${SharedDir}/sys/con_local.h" "${SharedDir}/sys/con_log.cpp" "${SharedDir}/sdl/sdl_qgl.h" "${SharedDir}/sdl/sdl_sound.cpp" "${SharedDir}/sdl/sdl_input.cpp" "${SharedDir}/sdl/sdl_window.cpp" "${SharedDir}/sdl/sdl_icon.h" ) if(WIN32) set(SPEngineSysFiles ${SPEngineSysFiles} "${SharedDir}/sys/sys_win32.cpp" "${SharedDir}/sys/con_passive.cpp" ) else() set(SPEngineSysFiles ${SPEngineSysFiles} "${SharedDir}/sys/sys_unix.cpp" "${SharedDir}/sys/con_tty.cpp" ) endif() source_group("sys" FILES ${SPEngineSysFiles}) set(SPEngineFiles ${SPEngineFiles} ${SPEngineSysFiles}) # Transparently use our bundled minizip. list(APPEND SPEngineIncludeDirectories ${MINIZIP_INCLUDE_DIRS}) list(APPEND SPEngineLibraries ${MINIZIP_LIBRARIES}) # Transparently use either bundled or system zlib. list(APPEND SPEngineIncludeDirectories ${ZLIB_INCLUDE_DIR}) list(APPEND SPEngineLibraries ${ZLIB_LIBRARIES}) # project macro so we can invoke it twice: for jk2 and for ja function(add_sp_project ProjectName Label SPDirName InstallDir Component) if(MakeApplicationBundles) set_source_files_properties(${SPDirName}/macosx/OpenJK.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) set(SPEngineFiles ${SPEngineFiles} ${SPDirName}/macosx/OpenJK.icns) set_source_files_properties(${SPDirName}/macosx/English.lproj/InfoPlist.strings PROPERTIES MACOSX_PACKAGE_LOCATION Resources/English.lproj) set(SPEngineFiles ${SPEngineFiles} ${SPDirName}/macosx/English.lproj/InfoPlist.strings) endif(MakeApplicationBundles) if(WIN32) add_executable(${ProjectName} WIN32 ${SPEngineFiles}) if(UseInternalSDL2) if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(SPEngineExtraInstallFiles ${OpenJKLibDir}/SDL2/bin/x86/SDL2.dll ) else() set(SPEngineExtraInstallFiles ${OpenJKLibDir}/SDL2/bin/x64/SDL2.dll ) endif() endif() else(WIN32) if(MakeApplicationBundles) add_executable(${ProjectName} MACOSX_BUNDLE ${SPEngineFiles}) set_target_properties(${ProjectName} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${SPDirName}/macosx/OpenJKInfo.plist") else(MakeApplicationBundles) add_executable(${ProjectName} ${SPEngineFiles}) endif(MakeApplicationBundles) endif(WIN32) if(MakeApplicationBundles) install(CODE " include(BundleUtilities) set(BU_CHMOD_BUNDLE_ITEMS ON) fixup_bundle(\"${CMAKE_BINARY_DIR}/${ProjectName}.app\" \"\" \"\") " COMPONENT Runtime) install(TARGETS ${ProjectName} BUNDLE DESTINATION ${InstallDir} COMPONENT ${Component}) else(MakeApplicationBundles) install(TARGETS ${ProjectName} RUNTIME DESTINATION ${InstallDir} COMPONENT ${Component}) if(SPEngineExtraInstallFiles) install(FILES ${SPEngineExtraInstallFiles} DESTINATION ${InstallDir} COMPONENT ${Component}) endif() endif(MakeApplicationBundles) set_target_properties(${ProjectName} PROPERTIES COMPILE_DEFINITIONS "${SPEngineDefines}") # Hide symbols not explicitly marked public. set_property(TARGET ${ProjectName} APPEND PROPERTY COMPILE_OPTIONS ${OPENJK_VISIBILITY_FLAGS}) set_target_properties(${ProjectName} PROPERTIES INCLUDE_DIRECTORIES "${SPEngineIncludeDirectories}") set_target_properties(${ProjectName} PROPERTIES PROJECT_LABEL ${Label}) if(SPEngineLibraries) target_link_libraries(${ProjectName} ${SPEngineLibraries}) endif(SPEngineLibraries) endfunction(add_sp_project) if(BuildSPEngine) add_sp_project(${SPEngine} "SP Client" ${SPDir} ${JKAInstallDir} ${JKASPClientComponent}) endif(BuildSPEngine) if(BuildJK2SPEngine) set(SPEngineDefines ${SPEngineDefines} "JK2_MODE") add_sp_project(${JK2SPEngine} "JK2 SP Client" ${JK2SPDir} ${JK2InstallDir} ${JK2SPClientComponent}) endif(BuildJK2SPEngine) endif(BuildSPEngine OR BuildJK2SPEngine)