diff --git a/android/app/src/main/cpp/CMakeLists.txt b/android/app/src/main/cpp/CMakeLists.txt index 6965651297..aa5bee4132 100644 --- a/android/app/src/main/cpp/CMakeLists.txt +++ b/android/app/src/main/cpp/CMakeLists.txt @@ -76,6 +76,83 @@ FetchContent_Declare( ) FetchContent_MakeAvailable(tomlplusplus) +# --- libslirp (user-mode NAT networking) --- +set(LIBSLIRP_GIT_REV "26be815b86e8d49add8c9a8b320239b9594ff03d") +FetchContent_Declare( + libslirp + GIT_REPOSITORY "https://gitlab.freedesktop.org/slirp/libslirp.git" + GIT_TAG "${LIBSLIRP_GIT_REV}" + GIT_SHALLOW FALSE +) +FetchContent_GetProperties(libslirp) +if(NOT libslirp_POPULATED) + if(POLICY CMP0169) + cmake_policy(PUSH) + cmake_policy(SET CMP0169 OLD) + endif() + FetchContent_Populate(libslirp) + if(POLICY CMP0169) + cmake_policy(POP) + endif() +endif() + +set(LIBSLIRP_GENERATED_DIR "${CMAKE_BINARY_DIR}/libslirp-generated") +file(MAKE_DIRECTORY "${LIBSLIRP_GENERATED_DIR}") +file(STRINGS "${libslirp_SOURCE_DIR}/meson.build" LIBSLIRP_VERSION_LINE + REGEX "^[ ]*version : '[^']+'") +if(NOT LIBSLIRP_VERSION_LINE) + message(FATAL_ERROR "Failed to determine libslirp version from meson.build") +endif() +string(REGEX REPLACE ".*version : '([^']+)'.*" "\\1" + LIBSLIRP_VERSION "${LIBSLIRP_VERSION_LINE}") +string(REPLACE "." ";" LIBSLIRP_VERSION_COMPONENTS "${LIBSLIRP_VERSION}") +list(LENGTH LIBSLIRP_VERSION_COMPONENTS LIBSLIRP_VERSION_COMPONENT_COUNT) +if(NOT LIBSLIRP_VERSION_COMPONENT_COUNT EQUAL 3) + message(FATAL_ERROR "Unexpected libslirp version format: ${LIBSLIRP_VERSION}") +endif() +list(GET LIBSLIRP_VERSION_COMPONENTS 0 SLIRP_MAJOR_VERSION) +list(GET LIBSLIRP_VERSION_COMPONENTS 1 SLIRP_MINOR_VERSION) +list(GET LIBSLIRP_VERSION_COMPONENTS 2 SLIRP_MICRO_VERSION) +set(SLIRP_VERSION_STRING "\"${LIBSLIRP_VERSION}\"") +configure_file( + "${libslirp_SOURCE_DIR}/src/libslirp-version.h.in" + "${LIBSLIRP_GENERATED_DIR}/libslirp-version.h" + @ONLY +) +set(LIBSLIRP_SOURCES + "${libslirp_SOURCE_DIR}/src/arp_table.c" + "${libslirp_SOURCE_DIR}/src/bootp.c" + "${libslirp_SOURCE_DIR}/src/cksum.c" + "${libslirp_SOURCE_DIR}/src/dhcpv6.c" + "${libslirp_SOURCE_DIR}/src/dnssearch.c" + "${libslirp_SOURCE_DIR}/src/if.c" + "${libslirp_SOURCE_DIR}/src/ip6_icmp.c" + "${libslirp_SOURCE_DIR}/src/ip6_input.c" + "${libslirp_SOURCE_DIR}/src/ip6_output.c" + "${libslirp_SOURCE_DIR}/src/ip_icmp.c" + "${libslirp_SOURCE_DIR}/src/ip_input.c" + "${libslirp_SOURCE_DIR}/src/ip_output.c" + "${libslirp_SOURCE_DIR}/src/mbuf.c" + "${libslirp_SOURCE_DIR}/src/misc.c" + "${libslirp_SOURCE_DIR}/src/ncsi.c" + "${libslirp_SOURCE_DIR}/src/ndp_table.c" + "${libslirp_SOURCE_DIR}/src/sbuf.c" + "${libslirp_SOURCE_DIR}/src/slirp.c" + "${libslirp_SOURCE_DIR}/src/socket.c" + "${libslirp_SOURCE_DIR}/src/state.c" + "${libslirp_SOURCE_DIR}/src/stream.c" + "${libslirp_SOURCE_DIR}/src/tcp_input.c" + "${libslirp_SOURCE_DIR}/src/tcp_output.c" + "${libslirp_SOURCE_DIR}/src/tcp_subr.c" + "${libslirp_SOURCE_DIR}/src/tcp_timer.c" + "${libslirp_SOURCE_DIR}/src/tftp.c" + "${libslirp_SOURCE_DIR}/src/udp.c" + "${libslirp_SOURCE_DIR}/src/udp6.c" + "${libslirp_SOURCE_DIR}/src/util.c" + "${libslirp_SOURCE_DIR}/src/version.c" + "${libslirp_SOURCE_DIR}/src/vmstate.c" +) + # --- nv2a_vsh_cpu --- set(NV2A_VSH_CPU_GIT_REV "1115255708c10c4841b65dcd2223262e7a316598") set(nv2a_vsh_cpu_UNIT_TEST OFF CACHE BOOL "" FORCE) @@ -517,7 +594,6 @@ list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "ui[\\\\/]thirdparty[\\\\/]noc_file_ list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "ui[\\\\/]x_keymap\\.c$") list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "ui[\\\\/]vdagent\\.c$") list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "ui[\\\\/]xemu-os-utils-windows\\.c$") -list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "ui[\\\\/]xemu-net\\.c$") list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "util[\\\\/]aio-win32\\.c$") list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "util[\\\\/]atomic64\\.c$") list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "util[\\\\/]coroutine-ucontext\\.c$") @@ -550,7 +626,6 @@ list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "net[\\\\/]af-xdp\\.c$") list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "net[\\\\/]netmap\\.c$") list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "net[\\\\/]pcap\\.c$") list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "net[\\\\/]passt\\.c$") -list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "net[\\\\/]slirp\\.c$") list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "net[\\\\/]tap-bsd\\.c$") list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "net[\\\\/]tap-solaris\\.c$") list(FILTER XEMU_CORE_SOURCES EXCLUDE REGEX "net[\\\\/]tap-win32\\.c$") @@ -654,7 +729,6 @@ list(APPEND XEMU_CORE_SOURCES "${CMAKE_CURRENT_LIST_DIR}/watchdog_stub.c" "${CMAKE_CURRENT_LIST_DIR}/async_teardown_stub.c" "${CMAKE_CURRENT_LIST_DIR}/block_export_stub.c" - "${CMAKE_CURRENT_LIST_DIR}/xemu_net_stub.c" "${CMAKE_CURRENT_LIST_DIR}/xemu_notifications_stub.c" "${CMAKE_CURRENT_LIST_DIR}/xemu_snapshots_stub.c" "${CMAKE_CURRENT_LIST_DIR}/xemu_hud_stub.c" @@ -872,6 +946,7 @@ target_compile_definitions(xemu_core PRIVATE ANDROID __ANDROID__ XBOX + CONFIG_SLIRP CONFIG_SDL CONFIG_OPENGL $<$:CONFIG_VULKAN> @@ -916,6 +991,8 @@ target_include_directories(xemu_core PRIVATE "${GLIB_INSTALL_DIR}/include/glib-2.0" "${GLIB_INSTALL_DIR}/lib/glib-2.0/include" "${tomlplusplus_SOURCE_DIR}/include" + "${libslirp_SOURCE_DIR}/src" + "${LIBSLIRP_GENERATED_DIR}" $<$:${glslang_SOURCE_DIR}> $<$:${spirv_reflect_SOURCE_DIR}> $<$:${vma_SOURCE_DIR}/include> @@ -959,6 +1036,32 @@ set_target_properties(gthread-2.0 PROPERTIES IMPORTED_LOCATION "${GLIB_INSTALL_DIR}/lib/libgthread-2.0.a" ) +add_library(slirp_static STATIC + ${LIBSLIRP_SOURCES} +) +set_target_properties(slirp_static PROPERTIES + POSITION_INDEPENDENT_CODE ON +) +target_compile_definitions(slirp_static PRIVATE + BUILDING_LIBSLIRP + G_LOG_DOMAIN="Slirp" + GLIB_STATIC_COMPILATION + GIO_STATIC_COMPILATION + GMODULE_STATIC_COMPILATION + GI_STATIC_COMPILATION + GOBJECT_STATIC_COMPILATION +) +target_include_directories(slirp_static PRIVATE + "${libslirp_SOURCE_DIR}/src" + "${LIBSLIRP_GENERATED_DIR}" + "${GLIB_INSTALL_DIR}/include/glib-2.0" + "${GLIB_INSTALL_DIR}/lib/glib-2.0/include" +) +target_link_libraries(slirp_static PRIVATE + glib-2.0 +) +add_dependencies(slirp_static glib_ep) + add_library(xemu SHARED xemu_android.cpp android_crash_handler.cpp @@ -1025,6 +1128,7 @@ endif() target_link_libraries(xemu PRIVATE xemu_core + slirp_static iconv_stub glib-2.0 gobject-2.0 diff --git a/android/app/src/main/java/com/izzy2lost/x1box/GameLibraryActivity.kt b/android/app/src/main/java/com/izzy2lost/x1box/GameLibraryActivity.kt index 90fc375f18..2e8c8a338f 100644 --- a/android/app/src/main/java/com/izzy2lost/x1box/GameLibraryActivity.kt +++ b/android/app/src/main/java/com/izzy2lost/x1box/GameLibraryActivity.kt @@ -260,22 +260,8 @@ class GameLibraryActivity : AppCompatActivity() { return } - resolveConfiguredLocalHddFile()?.let { hddFile -> - runCatching { XboxInsigniaHelper.inspectDashboard(hddFile) } - .getOrNull() - ?.let { dashboardStatus -> - if (!dashboardStatus.looksRetailDashboardInstalled) { - val messageRes = if (dashboardStatus.hasAnyRetailDashboardFiles) { - R.string.library_boot_dashboard_incomplete_retail - } else { - R.string.library_boot_dashboard_missing_retail - } - Toast.makeText(this, getString(messageRes), Toast.LENGTH_LONG).show() - return - } - } - } - + // Custom dashboards can boot from an xboxdash.xbe alias even when the HDD + // does not look like a stock retail dashboard, so don't gate launch here. // MainActivity runs in :xemu, so the disc selection must be flushed before // the other process reads SharedPreferences during startup. val launchEditor = prefs.edit()