macro(runtime_add_list rel_path a_list) unset(tmp_list) foreach (path IN LISTS ${a_list}) if (IS_ABSOLUTE ${path}) list(APPEND tmp_list "${path}") else () list(APPEND tmp_list "${rel_path}/${path}") endif () endforeach (path) set(${a_list} "${tmp_list}" PARENT_SCOPE) endmacro(runtime_add_list) add_subdirectory(Audio) add_subdirectory(Character) add_subdirectory(Graphics) add_subdirectory(Collision) add_subdirectory(Camera) add_subdirectory(World) add_subdirectory(Weapon) add_subdirectory(AutoMapper) add_subdirectory(GuiSys) add_subdirectory(Input) add_subdirectory(Particle) if (WIN32) list(APPEND PLAT_SRCS CMemoryCardSysWin.cpp) else () list(APPEND PLAT_SRCS CMemoryCardSysNix.cpp) endif () find_package(Python3 COMPONENTS Interpreter REQUIRED) add_custom_command(OUTPUT TCastTo.hpp TCastTo.cpp DEPENDS MkCastTo.py COMMAND ${Python3_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/MkCastTo.py WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Generating cast functions") add_subdirectory(MP1) add_subdirectory(MP2) add_subdirectory(MP3) set(CAST_TO_SOURCES MkCastTo.py TCastTo.hpp TCastTo.cpp) set(RUNTIME_SOURCES_A RetroTypes.hpp RetroTypes.cpp ${CAST_TO_SOURCES} ${MP1_SOURCES} ${AUDIO_SOURCES} ${AUTOMAPPER_SOURCES} ${CAMERA_SOURCES} ${CHARACTER_SOURCES} ${COLLISION_SOURCES} ${GRAPHICS_SOURCES}) set(RUNTIME_SOURCES_B ${CAST_TO_SOURCES} ${GUISYS_SOURCES} ${INPUT_SOURCES} ${PARTICLE_SOURCES} ${WORLD_SOURCES} ${WEAPON_SOURCES} CInfiniteLoopDetector.hpp CInfiniteLoopDetector.cpp ConsoleVariables/FileStoreManager.hpp ConsoleVariables/FileStoreManager.cpp ConsoleVariables/CVar.hpp ConsoleVariables/CVar.cpp ConsoleVariables/CVarManager.hpp ConsoleVariables/CVarManager.cpp ConsoleVariables/CVarCommons.hpp ConsoleVariables/CVarCommons.cpp Tweaks/ITweak.hpp Tweaks/ITweakAutoMapper.hpp Tweaks/ITweakBall.hpp Tweaks/ITweakGame.hpp Tweaks/ITweakGui.hpp Tweaks/ITweakGuiColors.hpp Tweaks/ITweakGunRes.hpp Tweaks/ITweakParticle.hpp Tweaks/ITweakPlayer.hpp Tweaks/ITweakPlayerControl.hpp Tweaks/ITweakPlayerGun.hpp Tweaks/ITweakPlayerGun.cpp Tweaks/ITweakPlayerRes.hpp Tweaks/ITweakSlideShow.hpp Tweaks/ITweakTargeting.hpp IMain.hpp CStopwatch.hpp CStopwatch.cpp Streams/IOStreams.hpp Streams/IOStreams.cpp Streams/CMemoryStreamOut.hpp Streams/CMemoryStreamOut.cpp Streams/CInputStream.hpp Streams/CInputStream.cpp Streams/COutputStream.hpp Streams/COutputStream.cpp Streams/CMemoryInStream.hpp Streams/CZipInputStream.hpp Streams/CZipInputStream.cpp Streams/ContainerReaders.hpp Streams/CTextInStream.hpp Streams/CTextInStream.cpp Streams/CTextOutStream.hpp Streams/CTextOutStream.cpp Streams/CFileOutStream.hpp Streams/CFileOutStream.cpp CGameAllocator.hpp CGameAllocator.cpp CMemoryCardSys.hpp CMemoryCardSys.cpp CScannableObjectInfo.hpp CScannableObjectInfo.cpp CWorldSaveGameInfo.hpp CWorldSaveGameInfo.cpp CDependencyGroup.hpp CDependencyGroup.cpp CBasics.hpp CBasicsPC.cpp CIOWin.hpp CIOWinManager.hpp CIOWinManager.cpp CStateManager.hpp CStateManager.cpp CGameState.hpp CGameState.cpp CScriptMailbox.hpp CScriptMailbox.cpp CPlayerState.hpp CPlayerState.cpp CRandom16.hpp CRandom16.cpp CResFactory.hpp CResFactory.cpp CResLoader.hpp CResLoader.cpp CDvdRequest.hpp CDvdFile.hpp CDvdFile.cpp IObjectStore.hpp CSimplePool.hpp CSimplePool.cpp CGameOptions.hpp CGameOptions.cpp CStaticInterference.hpp CStaticInterference.cpp CCRC32.hpp CCRC32.cpp IFactory.hpp IObjFactory.hpp CObjectList.hpp CObjectList.cpp GameObjectLists.hpp GameObjectLists.cpp CSortedLists.hpp CSortedLists.cpp CArchitectureMessage.hpp CArchitectureQueue.hpp IObj.hpp IVParamObj.hpp CTimeProvider.hpp CTimeProvider.cpp CToken.hpp CToken.cpp CFactoryMgr.hpp CFactoryMgr.cpp CPakFile.hpp CPakFile.cpp CStringExtras.hpp CStringExtras.cpp CMainFlowBase.hpp CMainFlowBase.cpp CMFGameBase.hpp CInGameTweakManagerBase.hpp CGameDebug.hpp CGameHintInfo.hpp CGameHintInfo.cpp rstl.hpp GameGlobalObjects.hpp GameGlobalObjects.cpp GCNTypes.hpp CTextureCache.hpp CTextureCache.cpp CMayaSpline.hpp CMayaSpline.cpp ImGuiPlayerLoadouts.hpp ImGuiPlayerLoadouts.cpp ${PLAT_SRCS}) function(add_runtime_common_library name) add_library(${name} ${ARGN}) target_compile_definitions(${name} PUBLIC "-DMETAFORCE_TARGET_BYTE_ORDER=__BYTE_ORDER__") if (WINDOWS_STORE) set_property(TARGET ${name} PROPERTY VS_WINRT_COMPONENT TRUE) endif () endfunction() set(RUNTIME_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}) set(DISCORD_RPC_LIBRARY "") if (NOT GEKKO AND NOT NX AND NOT IOS AND NOT TVOS) set(DISCORD_RPC_LIBRARY "discord-rpc") endif() set(RUNTIME_LIBRARIES amuse zeus nod NESEmulator libjpeg-turbo jbus kabufuda logvisor OptickCore imgui_support aurora::aurora boo # TODO move audiodev ${DISCORD_RPC_LIBRARY} ${ZLIB_LIBRARIES} ) add_runtime_common_library(RuntimeCommon ${RUNTIME_SOURCES_A}) target_include_directories(RuntimeCommon PUBLIC ${RUNTIME_INCLUDES}) target_link_libraries(RuntimeCommon PUBLIC ${RUNTIME_LIBRARIES}) add_runtime_common_library(RuntimeCommonB ${RUNTIME_SOURCES_B}) target_include_directories(RuntimeCommonB PUBLIC ${RUNTIME_INCLUDES}) target_link_libraries(RuntimeCommonB PUBLIC ${RUNTIME_LIBRARIES}) if (WIN32) configure_file(platforms/win/metaforce.rc.in "${CMAKE_CURRENT_SOURCE_DIR}/platforms/win/metaforce.rc" @ONLY) set(PLAT_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/platforms/win/metaforce.rc" platforms/win/metaforce.manifest) if (WINDOWS_STORE) set(UWP_ASSETS platforms/win/Assets/LargeTile.scale-100.png platforms/win/Assets/LargeTile.scale-125.png platforms/win/Assets/LargeTile.scale-150.png platforms/win/Assets/LargeTile.scale-200.png platforms/win/Assets/LargeTile.scale-400.png platforms/win/Assets/SmallTile.scale-100.png platforms/win/Assets/SmallTile.scale-125.png platforms/win/Assets/SmallTile.scale-150.png platforms/win/Assets/SmallTile.scale-200.png platforms/win/Assets/SmallTile.scale-400.png platforms/win/Assets/SplashScreen.scale-100.png platforms/win/Assets/SplashScreen.scale-125.png platforms/win/Assets/SplashScreen.scale-150.png platforms/win/Assets/SplashScreen.scale-200.png platforms/win/Assets/SplashScreen.scale-400.png platforms/win/Assets/Square44x44Logo.scale-100.png platforms/win/Assets/Square44x44Logo.scale-125.png platforms/win/Assets/Square44x44Logo.scale-150.png platforms/win/Assets/Square44x44Logo.scale-200.png platforms/win/Assets/Square44x44Logo.scale-400.png platforms/win/Assets/Square44x44Logo.altform-unplated_targetsize-16.png platforms/win/Assets/Square44x44Logo.altform-unplated_targetsize-24.png platforms/win/Assets/Square44x44Logo.altform-unplated_targetsize-32.png platforms/win/Assets/Square44x44Logo.altform-unplated_targetsize-48.png platforms/win/Assets/Square44x44Logo.altform-unplated_targetsize-256.png platforms/win/Assets/Square150x150Logo.scale-100.png platforms/win/Assets/Square150x150Logo.scale-125.png platforms/win/Assets/Square150x150Logo.scale-150.png platforms/win/Assets/Square150x150Logo.scale-200.png platforms/win/Assets/Square150x150Logo.scale-400.png platforms/win/Assets/metaforce.scale-100.png platforms/win/Assets/metaforce.scale-125.png platforms/win/Assets/metaforce.scale-150.png platforms/win/Assets/metaforce.scale-200.png platforms/win/Assets/metaforce.scale-400.png platforms/win/Assets/WideTile.scale-100.png platforms/win/Assets/WideTile.scale-125.png platforms/win/Assets/WideTile.scale-150.png platforms/win/Assets/WideTile.scale-200.png platforms/win/Assets/WideTile.scale-400.png) set_property(SOURCE platforms/win/Package.appxmanifest PROPERTY VS_DEPLOYMENT_CONTENT 1) set_property(SOURCE ${UWP_ASSETS} PROPERTY VS_DEPLOYMENT_CONTENT 1) set_property(SOURCE ${UWP_ASSETS} PROPERTY VS_DEPLOYMENT_LOCATION "Assets") list(APPEND PLAT_SRCS ${UWP_ASSETS} platforms/win/Package.appxmanifest) endif () elseif (APPLE) # nothing elseif (UNIX) set(PLAT_LIBS rt) endif () add_executable(metaforce CMain.cpp ${PLAT_SRCS} ImGuiConsole.hpp ImGuiConsole.cpp ImGuiControllerConfig.hpp ImGuiControllerConfig.cpp ImGuiEntitySupport.hpp ImGuiEntitySupport.cpp) # RUNTIME_LIBRARIES repeated here for link ordering target_link_libraries(metaforce PUBLIC RuntimeCommon RuntimeCommonB ${RUNTIME_LIBRARIES} ${PLAT_LIBS} aurora::main) if (TARGET nfd) target_link_libraries(metaforce PRIVATE nfd) endif() target_compile_definitions(metaforce PUBLIC "-DMETAFORCE_TARGET_BYTE_ORDER=__BYTE_ORDER__") if (APPLE) if (TVOS) set(RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/platforms/tvos) set(INFO_PLIST ${RESOURCE_DIR}/Info.plist.in) file(GLOB_RECURSE RESOURCE_FILES "${RESOURCE_DIR}/Base.lproj/*") list(APPEND RESOURCE_FILES ${RESOURCE_DIR}/Assets.car) elseif (IOS) set(RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios) set(INFO_PLIST ${RESOURCE_DIR}/Info.plist.in) file(GLOB_RECURSE RESOURCE_FILES "${RESOURCE_DIR}/Base.lproj/*") list(APPEND RESOURCE_FILES ${RESOURCE_DIR}/Assets.car ${RESOURCE_DIR}/AppIcon60x60@2x.png ${RESOURCE_DIR}/AppIcon76x76@2x~ipad.png) else () set(RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos) set(INFO_PLIST ${RESOURCE_DIR}/Info.plist.in) set(RESOURCE_FILES ${RESOURCE_DIR}/mainicon.icns) endif () target_sources(metaforce PRIVATE ${RESOURCE_FILES}) # Add to resources, preserving directory structure foreach (FILE ${RESOURCE_FILES}) file(RELATIVE_PATH NEW_FILE "${RESOURCE_DIR}" ${FILE}) get_filename_component(NEW_FILE_PATH ${NEW_FILE} DIRECTORY) set_property(SOURCE ${FILE} PROPERTY MACOSX_PACKAGE_LOCATION "Resources/${NEW_FILE_PATH}") source_group("Resources/${NEW_FILE_PATH}" FILES "${FILE}") endforeach () set_target_properties( metaforce PROPERTIES MACOSX_BUNDLE TRUE MACOSX_BUNDLE_INFO_PLIST ${INFO_PLIST} MACOSX_BUNDLE_BUNDLE_NAME Metaforce MACOSX_BUNDLE_GUI_IDENTIFIER com.axiodl.Metaforce MACOSX_BUNDLE_BUNDLE_VERSION "${METAFORCE_VERSION_STRING}" MACOSX_BUNDLE_SHORT_VERSION_STRING "${METAFORCE_SHORT_VERSION_STRING}" OUTPUT_NAME Metaforce ) endif () if (WINDOWS_STORE) set_property(TARGET metaforce PROPERTY VS_WINRT_COMPONENT TRUE) # This should match the Package.appxmanifest set_property(TARGET metaforce PROPERTY VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION "10.0.14393.0") endif () if (EMSCRIPTEN) target_link_options(metaforce PRIVATE -sTOTAL_MEMORY=268435456 -sALLOW_MEMORY_GROWTH --preload-file "${CMAKE_SOURCE_DIR}/files@/") endif ()