]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
cmake: add Unix build wiring
authorStefan Reinauer <stefan.reinauer@coreboot.org>
Thu, 4 Jun 2026 15:00:35 +0000 (08:00 -0700)
committerStefan <stefan.reinauer@coreboot.org>
Sun, 14 Jun 2026 04:50:59 +0000 (21:50 -0700)
Add the CMake build graph for the Unix target, optional feature probes,
test targets, and package staging rules.

This ties the shared emulator sources and od-unix backends together for
macOS and Linux builds.

CMakeLists.txt [new file with mode: 0644]
od-unix/sysconfig.h

diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..779a0f0
--- /dev/null
@@ -0,0 +1,1821 @@
+cmake_minimum_required(VERSION 3.20)
+
+if(CMAKE_HOST_APPLE)
+    set(WINUAE_UNIX_DEFAULT_MACOS_DEPLOYMENT_TARGET "13.0")
+    set(WINUAE_UNIX_MACOS_DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/../winuae-macos-deps" CACHE PATH "Private macOS dependency prefix built by tools/macos-build-deps.sh")
+    set(WINUAE_QEMU_UAE_DEPS_PREFIX "${WINUAE_UNIX_MACOS_DEPS_PREFIX}" CACHE PATH "Private macOS GLib prefix for the QEMU-UAE plugin")
+    if(NOT DEFINED CMAKE_OSX_DEPLOYMENT_TARGET)
+        set(CMAKE_OSX_DEPLOYMENT_TARGET "${WINUAE_UNIX_DEFAULT_MACOS_DEPLOYMENT_TARGET}" CACHE STRING "Minimum macOS version for WinUAE Unix builds")
+    elseif(CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "")
+        set(CMAKE_OSX_DEPLOYMENT_TARGET "${WINUAE_UNIX_DEFAULT_MACOS_DEPLOYMENT_TARGET}" CACHE STRING "Minimum macOS version for WinUAE Unix builds" FORCE)
+    endif()
+endif()
+
+project(winuae_unix_port LANGUAGES C CXX)
+
+include(GNUInstallDirs)
+include(CTest)
+
+set(WINUAE_UNIX_TEST_TARGETS)
+function(winuae_unix_register_test target)
+    list(APPEND WINUAE_UNIX_TEST_TARGETS "${target}")
+    set(WINUAE_UNIX_TEST_TARGETS "${WINUAE_UNIX_TEST_TARGETS}" PARENT_SCOPE)
+    if(BUILD_TESTING)
+        add_test(NAME ${target} COMMAND $<TARGET_FILE:${target}>)
+        set_tests_properties(${target} PROPERTIES LABELS "unix")
+    endif()
+endfunction()
+
+function(winuae_unix_imported_location target out_var)
+    foreach(prop IMPORTED_LOCATION_RELEASE IMPORTED_LOCATION_RELWITHDEBINFO IMPORTED_LOCATION_MINSIZEREL IMPORTED_LOCATION_DEBUG IMPORTED_LOCATION)
+        get_target_property(location "${target}" "${prop}")
+        if(location AND NOT location MATCHES "-NOTFOUND$" AND EXISTS "${location}")
+            set("${out_var}" "${location}" PARENT_SCOPE)
+            return()
+        endif()
+    endforeach()
+    set("${out_var}" "" PARENT_SCOPE)
+endfunction()
+
+function(winuae_unix_macos_find_qt_frameworks out_var)
+    set(prefix_candidates ${CMAKE_PREFIX_PATH})
+    if(WINUAE_UNIX_MACOS_DEPS_PREFIX)
+        list(APPEND prefix_candidates "${WINUAE_UNIX_MACOS_DEPS_PREFIX}")
+    endif()
+    list(REMOVE_DUPLICATES prefix_candidates)
+
+    foreach(prefix IN LISTS prefix_candidates)
+        if(EXISTS "${prefix}/lib/QtWidgets.framework/QtWidgets"
+                AND EXISTS "${prefix}/lib/QtGui.framework/QtGui"
+                AND EXISTS "${prefix}/lib/QtCore.framework/QtCore")
+            if(NOT TARGET winuae_unix_qt_frameworks)
+                add_library(winuae_unix_qt_frameworks INTERFACE)
+                target_include_directories(winuae_unix_qt_frameworks INTERFACE
+                    "${prefix}/lib/QtWidgets.framework/Headers"
+                    "${prefix}/lib/QtGui.framework/Headers"
+                    "${prefix}/lib/QtCore.framework/Headers"
+                )
+                target_compile_definitions(winuae_unix_qt_frameworks INTERFACE
+                    QT_WIDGETS_LIB
+                    QT_GUI_LIB
+                    QT_CORE_LIB
+                )
+                target_compile_options(winuae_unix_qt_frameworks INTERFACE
+                    "-F${prefix}/lib"
+                )
+                target_link_options(winuae_unix_qt_frameworks INTERFACE
+                    "-F${prefix}/lib"
+                )
+                target_link_libraries(winuae_unix_qt_frameworks INTERFACE
+                    "${prefix}/lib/QtWidgets.framework"
+                    "${prefix}/lib/QtGui.framework"
+                    "${prefix}/lib/QtCore.framework"
+                )
+            endif()
+            if(EXISTS "${prefix}/bin/macdeployqt")
+                set(MACDEPLOYQT_EXECUTABLE "${prefix}/bin/macdeployqt" CACHE FILEPATH "macdeployqt executable" FORCE)
+            endif()
+            set("${out_var}" winuae_unix_qt_frameworks PARENT_SCOPE)
+            return()
+        endif()
+    endforeach()
+
+    set("${out_var}" "" PARENT_SCOPE)
+endfunction()
+
+function(winuae_unix_find_lzma_sdk out_var)
+    set(WINUAE_LZMA_SDK_CANDIDATES
+        "${WINUAE_LZMA_SDK_DIR}/C"
+        "${WINUAE_LZMA_SDK_DIR}"
+    )
+    foreach(candidate IN LISTS WINUAE_LZMA_SDK_CANDIDATES)
+        if(EXISTS "${candidate}/7z/7zVersion.h")
+            set(WINUAE_LZMA_SDK_SOURCE_DIR "${candidate}")
+            break()
+        endif()
+    endforeach()
+
+    if(NOT WINUAE_LZMA_SDK_SOURCE_DIR)
+        if(NOT WINUAE_LZMA_SDK_FETCH)
+            message(FATAL_ERROR
+                "7-Zip/LZMA SDK ${WINUAE_LZMA_SDK_VERSION} was not found in "
+                "${WINUAE_LZMA_SDK_DIR}. Enable WINUAE_LZMA_SDK_FETCH or "
+                "pre-seed WINUAE_LZMA_SDK_DIR with the SDK archive contents."
+            )
+        endif()
+
+        message(STATUS
+            "Fetching 7-Zip/LZMA SDK ${WINUAE_LZMA_SDK_VERSION} into "
+            "${WINUAE_LZMA_SDK_DIR}"
+        )
+        execute_process(
+            COMMAND sh "${CMAKE_CURRENT_SOURCE_DIR}/tools/fetch-lzma-sdk.sh"
+                    "${WINUAE_LZMA_SDK_DIR}"
+                    "${WINUAE_LZMA_SDK_URL}"
+                    "${WINUAE_LZMA_SDK_VERSION}"
+                    "${WINUAE_LZMA_SDK_SHA256}"
+            RESULT_VARIABLE WINUAE_LZMA_SDK_FETCH_RESULT
+            OUTPUT_VARIABLE WINUAE_LZMA_SDK_FETCH_OUTPUT
+            ERROR_VARIABLE WINUAE_LZMA_SDK_FETCH_ERROR
+            OUTPUT_STRIP_TRAILING_WHITESPACE
+            ERROR_STRIP_TRAILING_WHITESPACE
+        )
+        if(NOT WINUAE_LZMA_SDK_FETCH_RESULT EQUAL 0)
+            message(FATAL_ERROR
+                "Failed to fetch 7-Zip/LZMA SDK "
+                "${WINUAE_LZMA_SDK_VERSION}: "
+                "${WINUAE_LZMA_SDK_FETCH_ERROR}\n"
+                "${WINUAE_LZMA_SDK_FETCH_OUTPUT}"
+            )
+        endif()
+
+        foreach(candidate IN LISTS WINUAE_LZMA_SDK_CANDIDATES)
+            if(EXISTS "${candidate}/7z/7zVersion.h")
+                set(WINUAE_LZMA_SDK_SOURCE_DIR "${candidate}")
+                break()
+            endif()
+        endforeach()
+    endif()
+
+    if(NOT WINUAE_LZMA_SDK_SOURCE_DIR)
+        message(FATAL_ERROR
+            "7-Zip/LZMA SDK ${WINUAE_LZMA_SDK_VERSION} was fetched, but "
+            "no 7z/7zVersion.h was found in ${WINUAE_LZMA_SDK_DIR}."
+        )
+    endif()
+
+    file(STRINGS "${WINUAE_LZMA_SDK_SOURCE_DIR}/7z/7zVersion.h"
+        WINUAE_LZMA_SDK_VERSION_LINES
+        REGEX "^#define MY_VERSION \"${WINUAE_LZMA_SDK_VERSION}\""
+    )
+    if(NOT WINUAE_LZMA_SDK_VERSION_LINES)
+        message(FATAL_ERROR
+            "Expected 7-Zip/LZMA SDK ${WINUAE_LZMA_SDK_VERSION}, but "
+            "${WINUAE_LZMA_SDK_SOURCE_DIR}/7z/7zVersion.h did not match."
+        )
+    endif()
+
+    set("${out_var}" "${WINUAE_LZMA_SDK_SOURCE_DIR}" PARENT_SCOPE)
+endfunction()
+
+option(WINUAE_UNIX_BUILD_EXECUTABLE "Link the initial Unix command-line executable" ON)
+option(WINUAE_UNIX_WITH_SDL3 "Build the Unix SDL3 video/audio backend" ON)
+option(WINUAE_UNIX_WITH_SLIRP "Build built-in SLIRP user-mode networking and A2065 Ethernet support" ON)
+option(WINUAE_UNIX_WITH_SANA2 "Build uaenet.device SANA-II networking on top of the Unix Ethernet backend" ON)
+option(WINUAE_UNIX_WITH_UAENET_PCAP "Build native libpcap and TAP/TUN packet networking for A2065 and uaenet.device" ON)
+option(WINUAE_UNIX_WITH_PROWIZARD "Build Pro-Wizard module ripper support" ON)
+option(WINUAE_UNIX_WITH_QT_UI "Build the optional Unix Qt configuration UI" ON)
+option(WINUAE_UNIX_WITH_INTEGRATED_QT_UI "Allow winuae_unix to host the Unix Qt frontend" ON)
+option(WINUAE_UNIX_WITH_LIBPNG "Build optional PNG screenshot support when libpng is available" ON)
+option(WINUAE_UNIX_WITH_ARCHIVES "Build bundled ZIP/LHA/LZX/DMS/WRP archive support" ON)
+option(WINUAE_UNIX_WITH_CHD "Build CHD hardfile and CD image support" ON)
+option(WINUAE_UNIX_WITH_CHD_FLAC "Build CHD FLAC codecs when a compatible libFLAC is available" ON)
+option(WINUAE_UNIX_WITH_LIBMPEG2 "Build CD32 FMV video decode support when libmpeg2 is available" ON)
+option(WINUAE_UNIX_WITH_BSDSOCKET "Build bsdsocket.library on top of POSIX sockets" ON)
+option(WINUAE_UNIX_WITH_UAESCSI "Build uaescsi.device using the shared CD/tape SCSI emulation layer" ON)
+option(WINUAE_UNIX_WITH_UAESERIAL "Build uaeserial.device on top of the Unix serial backend" ON)
+option(WINUAE_UNIX_WITH_SAMPLER "Build SDL3 recording support for the parallel-port sampler" ON)
+option(WINUAE_UNIX_WITH_NATIVE_HARDDRIVES "Build Unix raw hard-drive enumeration and read-only open support" ON)
+option(WINUAE_UNIX_WITH_NATIVE_CD "Build Unix native CD/DVD drive access" ON)
+option(WINUAE_UNIX_WITH_NATIVE_SCSI "Build native SCSI/tape passthrough (macOS SCSITaskLib, Linux SG_IO)" ON)
+option(WINUAE_UNIX_WITH_MIDI "Build native Unix MIDI support" ON)
+option(WINUAE_UNIX_WITH_MIDIEMU "Build Munt MT-32/CM-32L MIDI emulation when mt32emu is available" ON)
+option(WINUAE_UNIX_WITH_CPUBOARD "Build shared non-PPC CPU accelerator board support" ON)
+option(WINUAE_UNIX_WITH_PPC_QEMU "Build Unix PPC accelerator support through the qemu-uae plugin ABI" ON)
+option(WINUAE_UNIX_BUILD_QEMU_UAE_PLUGIN "Build the sibling qemu-uae plugin for Unix packaging" ON)
+option(WINUAE_UNIX_WITH_DSP "Build shared DSP3210 accelerator support" ON)
+option(WINUAE_UNIX_WITH_AVIOUTPUT "Build Unix screenshot and video/audio capture output support" ON)
+option(WINUAE_UNIX_WITH_OPENGL_SHADER_PIPELINE "Build OpenGL-backed Unix shader/filter presentation support" ON)
+option(WINUAE_LZMA_SDK_FETCH "Fetch the 7-Zip/LZMA SDK into WINUAE_LZMA_SDK_DIR when missing" ON)
+
+set(WINUAE_LZMA_SDK_VERSION "16.04" CACHE STRING "7-Zip/LZMA SDK version used by archive and CHD support")
+set(WINUAE_LZMA_SDK_URL "https://www.7-zip.org/a/lzma1604.7z"
+    CACHE STRING "URL for the 7-Zip/LZMA SDK archive")
+set(WINUAE_LZMA_SDK_SHA256 "edf8690e9d5ae0dbe80751e3df247bb4e1b497b100c4af5b95fc50a5c2e5b04f"
+    CACHE STRING "Expected SHA-256 for the 7-Zip/LZMA SDK archive")
+set(WINUAE_LZMA_SDK_DIR "${CMAKE_BINARY_DIR}/_deps/lzma-sdk/${WINUAE_LZMA_SDK_VERSION}"
+    CACHE PATH "Local cache directory for the 7-Zip/LZMA SDK")
+
+set(WINUAE_QEMU_UAE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../qemu-uae-v11.0"
+    CACHE PATH "QEMU-UAE plugin source directory")
+set(WINUAE_QEMU_UAE_PLUGIN_FILE "" CACHE FILEPATH "Prebuilt qemu-uae.so plugin to install or bundle")
+set(WINUAE_UNIX_INSTALL_PLUGINDIR_RELATIVE "${CMAKE_INSTALL_LIBDIR}/winuae/plugins"
+    CACHE STRING "Relative Unix install directory for runtime plugins")
+
+if(IS_ABSOLUTE "${WINUAE_UNIX_INSTALL_PLUGINDIR_RELATIVE}")
+    message(FATAL_ERROR "WINUAE_UNIX_INSTALL_PLUGINDIR_RELATIVE must be relative")
+endif()
+
+set(WINUAE_UNIX_TARGET_ARCHES "${CMAKE_SYSTEM_PROCESSOR}")
+if(APPLE AND CMAKE_OSX_ARCHITECTURES)
+    set(WINUAE_UNIX_TARGET_ARCHES ${CMAKE_OSX_ARCHITECTURES})
+endif()
+
+set(WINUAE_UNIX_JIT_TARGET_SUPPORTED OFF)
+foreach(WINUAE_UNIX_TARGET_ARCH IN LISTS WINUAE_UNIX_TARGET_ARCHES)
+    if(WINUAE_UNIX_TARGET_ARCH MATCHES "^(aarch64|arm64|x86_64|amd64|AMD64)$")
+        set(WINUAE_UNIX_JIT_TARGET_SUPPORTED ON)
+    endif()
+endforeach()
+
+set(WINUAE_UNIX_WITH_JIT_DEFAULT ${WINUAE_UNIX_JIT_TARGET_SUPPORTED})
+option(WINUAE_UNIX_WITH_JIT "Build JIT support for Unix targets where a backend is available" ${WINUAE_UNIX_WITH_JIT_DEFAULT})
+
+set(WINUAE_UNIX_VERSION_MAJOR 0)
+set(WINUAE_UNIX_VERSION_MINOR 0)
+set(WINUAE_UNIX_VERSION_REVISION 0)
+file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/include/options.h" WINUAE_UNIX_VERSION_LINES REGEX "^#define UAE(MAJOR|MINOR|SUBREV) [0-9]+")
+foreach(WINUAE_UNIX_VERSION_LINE IN LISTS WINUAE_UNIX_VERSION_LINES)
+    if(WINUAE_UNIX_VERSION_LINE MATCHES "^#define UAEMAJOR +([0-9]+)")
+        set(WINUAE_UNIX_VERSION_MAJOR "${CMAKE_MATCH_1}")
+    elseif(WINUAE_UNIX_VERSION_LINE MATCHES "^#define UAEMINOR +([0-9]+)")
+        set(WINUAE_UNIX_VERSION_MINOR "${CMAKE_MATCH_1}")
+    elseif(WINUAE_UNIX_VERSION_LINE MATCHES "^#define UAESUBREV +([0-9]+)")
+        set(WINUAE_UNIX_VERSION_REVISION "${CMAKE_MATCH_1}")
+    endif()
+endforeach()
+set(WINUAE_UNIX_VERSION "${WINUAE_UNIX_VERSION_MAJOR}.${WINUAE_UNIX_VERSION_MINOR}.${WINUAE_UNIX_VERSION_REVISION}")
+
+find_package(ZLIB REQUIRED)
+if(WINUAE_UNIX_WITH_LIBPNG)
+    if(APPLE AND CMAKE_PREFIX_PATH)
+        unset(PNG_LIBRARY CACHE)
+        unset(PNG_LIBRARY_RELEASE CACHE)
+        unset(PNG_LIBRARY_DEBUG CACHE)
+        unset(PNG_PNG_INCLUDE_DIR CACHE)
+    endif()
+    find_package(PNG QUIET)
+endif()
+find_package(PkgConfig QUIET)
+
+set(CMAKE_C_STANDARD 11)
+set(CMAKE_C_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS ON)
+
+add_library(winuae_core OBJECT)
+
+target_compile_definitions(winuae_core PRIVATE
+    UAE_TARGET_UNIX=1
+    UAE_NOGUI=1
+    WINUAE_UNIX_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}"
+    WINUAE_UNIX_INSTALL_DATA_DIR="${CMAKE_INSTALL_FULL_DATADIR}/winuae"
+    WINUAE_UNIX_INSTALL_DATADIR_RELATIVE="${CMAKE_INSTALL_DATADIR}/winuae"
+    WINUAE_UNIX_INSTALL_PLUGINDIR_RELATIVE="${WINUAE_UNIX_INSTALL_PLUGINDIR_RELATIVE}"
+)
+
+target_include_directories(winuae_core PRIVATE
+    "${CMAKE_CURRENT_SOURCE_DIR}/od-unix"
+    "${CMAKE_CURRENT_SOURCE_DIR}/od-unix/include"
+    "${CMAKE_CURRENT_SOURCE_DIR}"
+    "${CMAKE_CURRENT_SOURCE_DIR}/include"
+    "${CMAKE_CURRENT_SOURCE_DIR}/archivers"
+    "${CMAKE_CURRENT_SOURCE_DIR}/archivers/dms"
+    "${CMAKE_CURRENT_SOURCE_DIR}/archivers/lha"
+    "${CMAKE_CURRENT_SOURCE_DIR}/archivers/lzx"
+    "${CMAKE_CURRENT_SOURCE_DIR}/archivers/mp2"
+    "${CMAKE_CURRENT_SOURCE_DIR}/archivers/wrp"
+    "${CMAKE_CURRENT_SOURCE_DIR}/archivers/zip"
+)
+
+if(WINUAE_UNIX_WITH_ARCHIVES OR WINUAE_UNIX_WITH_CHD)
+    winuae_unix_find_lzma_sdk(WINUAE_LZMA_SDK_SOURCE_DIR)
+    set(WINUAE_LZMA_SDK_7Z_DIR "${WINUAE_LZMA_SDK_SOURCE_DIR}/7z")
+    target_include_directories(winuae_core PRIVATE "${WINUAE_LZMA_SDK_SOURCE_DIR}")
+    target_compile_definitions(winuae_core PRIVATE
+        _7ZIP_ST=1
+        UAE_7Z_SDK_1604=1
+    )
+endif()
+
+target_compile_options(winuae_core PRIVATE
+    $<$<COMPILE_LANGUAGE:CXX>:-Wno-c++11-narrowing>
+    $<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-narrowing>
+    $<$<COMPILE_LANGUAGE:CXX>:-Wno-deprecated-declarations>
+    $<$<COMPILE_LANGUAGE:CXX>:-Wno-deprecated-register>
+    $<$<COMPILE_LANGUAGE:CXX>:-Wno-format-security>
+    $<$<COMPILE_LANGUAGE:CXX>:-Wno-multichar>
+    $<$<COMPILE_LANGUAGE:CXX>:-Wno-register>
+    $<$<COMPILE_LANGUAGE:CXX>:-Wno-unused-value>
+)
+
+set(WINUAE_UNIX_EXTRA_SOURCES)
+set(WINUAE_UNIX_EXTRA_LIBRARIES)
+set(WINUAE_UNIX_EXTRA_LIBRARY_DIRS)
+set(WINUAE_UNIX_ENABLE_SANA2 OFF)
+set(WINUAE_UNIX_ENABLE_UAENET_PCAP OFF)
+set(WINUAE_UNIX_ENABLE_BSDSOCKET OFF)
+set(WINUAE_UNIX_ENABLE_UAESCSI OFF)
+set(WINUAE_UNIX_ENABLE_UAESERIAL OFF)
+set(WINUAE_UNIX_ENABLE_SAMPLER OFF)
+set(WINUAE_UNIX_ENABLE_NATIVE_HARDDRIVES OFF)
+set(WINUAE_UNIX_ENABLE_NATIVE_CD OFF)
+set(WINUAE_UNIX_ENABLE_NATIVE_SCSI OFF)
+set(WINUAE_UNIX_ENABLE_MIDI OFF)
+set(WINUAE_UNIX_ENABLE_MIDIEMU OFF)
+set(WINUAE_UNIX_ENABLE_CPUBOARD OFF)
+set(WINUAE_UNIX_ENABLE_PPC OFF)
+set(WINUAE_UNIX_ENABLE_DSP OFF)
+set(WINUAE_UNIX_ENABLE_SNDBOARD OFF)
+set(WINUAE_UNIX_ENABLE_PCI OFF)
+set(WINUAE_UNIX_ENABLE_GFXBOARD OFF)
+set(WINUAE_UNIX_ENABLE_X86 OFF)
+set(WINUAE_UNIX_ENABLE_DRACO OFF)
+set(WINUAE_UNIX_ENABLE_PCEM OFF)
+set(WINUAE_UNIX_ENABLE_JIT OFF)
+set(WINUAE_UNIX_ENABLE_AVIOUTPUT OFF)
+set(WINUAE_UNIX_ENABLE_SHADER_PIPELINE OFF)
+set(WINUAE_UNIX_MIDI_LIBRARIES)
+set(WINUAE_UNIX_MIDI_INCLUDE_DIRS)
+set(WINUAE_UNIX_MIDI_LIBRARY_DIRS)
+set(WINUAE_UNIX_MIDI_COMPILE_OPTIONS)
+set(WINUAE_UNIX_MIDI_QT_DEFINITIONS)
+
+set(WINUAE_UNIX_PCEM_COMMON_SOURCES
+    od-unix/pcem_wincompat.cpp
+    pcem/pcemglue.cpp
+    pcem/timer.cpp
+)
+
+set(WINUAE_UNIX_PCEM_VIDEO_SOURCES
+    pcem/vid_bt482_ramdac.cpp
+    pcem/vid_cl5429.cpp
+    pcem/vid_et4000.cpp
+    pcem/vid_et4000w32.cpp
+    pcem/vid_inmos.cpp
+    pcem/vid_mga.cpp
+    pcem/vid_ncr.cpp
+    pcem/vid_permedia2.cpp
+    pcem/vid_s3.cpp
+    pcem/vid_s3_virge.cpp
+    pcem/vid_sc1502x_ramdac.cpp
+    pcem/vid_sdac_ramdac.cpp
+    pcem/vid_svga.cpp
+    pcem/vid_svga_render.cpp
+    pcem/vid_tvp3026_ramdac.cpp
+    pcem/vid_voodoo.cpp
+    pcem/vid_voodoo_banshee.cpp
+    pcem/vid_voodoo_banshee_blitter.cpp
+    pcem/vid_voodoo_blitter.cpp
+    pcem/vid_voodoo_display.cpp
+    pcem/vid_voodoo_fb.cpp
+    pcem/vid_voodoo_fifo.cpp
+    pcem/vid_voodoo_reg.cpp
+    pcem/vid_voodoo_render.cpp
+    pcem/vid_voodoo_setup.cpp
+    pcem/vid_voodoo_texture.cpp
+    qemuvga/cirrus_vga.cpp
+    qemuvga/es1370.cpp
+    qemuvga/ne2000.cpp
+    qemuvga/qemu.cpp
+    qemuvga/qemuuaeglue.cpp
+    qemuvga/vga.cpp
+)
+
+set(WINUAE_UNIX_PCEM_X86_SOURCES
+    pcem/386.cpp
+    pcem/386_common.cpp
+    pcem/386_dynarec.cpp
+    pcem/808x.cpp
+    pcem/cpu.cpp
+    pcem/dma.cpp
+    pcem/dosbox/dbopl.cpp
+    pcem/dosbox/nukedopl.cpp
+    pcem/keyboard.cpp
+    pcem/keyboard_at.cpp
+    pcem/mem.cpp
+    pcem/mouse_ps2.cpp
+    pcem/mouse_serial.cpp
+    pcem/nvr.cpp
+    pcem/pcemrtc.cpp
+    pcem/pic.cpp
+    pcem/pit.cpp
+    pcem/serial.cpp
+    pcem/sound_cms.cpp
+    pcem/sound_dbopl.cpp
+    pcem/sound_mpu401_uart.cpp
+    pcem/sound_opl.cpp
+    pcem/sound_sb.cpp
+    pcem/sound_sb_dsp.cpp
+    pcem/sound_speaker.cpp
+    pcem/x86seg.cpp
+    pcem/x87.cpp
+    pcem/x87_timings.cpp
+)
+
+set(WINUAE_UNIX_PCEM_DRACO_SOURCES
+    pcem/keyboard.cpp
+    pcem/keyboard_at.cpp
+    pcem/keyboard_at_draco.cpp
+    pcem/mouse_serial.cpp
+    pcem/serial.cpp
+)
+
+set(WINUAE_UNIX_USE_LIBPNG OFF)
+if(WINUAE_UNIX_WITH_LIBPNG AND PNG_FOUND)
+    set(WINUAE_UNIX_USE_LIBPNG ON)
+    if(APPLE)
+        set(WINUAE_UNIX_PNG_LIBRARY "")
+        get_target_property(WINUAE_UNIX_PNG_LIBRARY_RELEASE PNG::PNG IMPORTED_LOCATION_RELEASE)
+        get_target_property(WINUAE_UNIX_PNG_LIBRARY_DEFAULT PNG::PNG IMPORTED_LOCATION)
+        if(WINUAE_UNIX_PNG_LIBRARY_RELEASE AND EXISTS "${WINUAE_UNIX_PNG_LIBRARY_RELEASE}")
+            set(WINUAE_UNIX_PNG_LIBRARY "${WINUAE_UNIX_PNG_LIBRARY_RELEASE}")
+        elseif(WINUAE_UNIX_PNG_LIBRARY_DEFAULT AND EXISTS "${WINUAE_UNIX_PNG_LIBRARY_DEFAULT}")
+            set(WINUAE_UNIX_PNG_LIBRARY "${WINUAE_UNIX_PNG_LIBRARY_DEFAULT}")
+        elseif(PNG_LIBRARY_RELEASE AND EXISTS "${PNG_LIBRARY_RELEASE}")
+            set(WINUAE_UNIX_PNG_LIBRARY "${PNG_LIBRARY_RELEASE}")
+        endif()
+        if(WINUAE_UNIX_PNG_LIBRARY)
+            execute_process(
+                COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/macos-check-deployment-target.sh" "${WINUAE_UNIX_PNG_LIBRARY}" "${CMAKE_OSX_DEPLOYMENT_TARGET}"
+                RESULT_VARIABLE WINUAE_UNIX_PNG_DEPLOYMENT_RESULT
+                OUTPUT_VARIABLE WINUAE_UNIX_PNG_DEPLOYMENT_OUTPUT
+                ERROR_VARIABLE WINUAE_UNIX_PNG_DEPLOYMENT_ERROR
+                OUTPUT_STRIP_TRAILING_WHITESPACE
+                ERROR_STRIP_TRAILING_WHITESPACE
+            )
+            if(NOT WINUAE_UNIX_PNG_DEPLOYMENT_RESULT EQUAL 0)
+                message(STATUS "libpng is newer than CMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}; PNG screenshots disabled. ${WINUAE_UNIX_PNG_DEPLOYMENT_ERROR}")
+                set(WINUAE_UNIX_USE_LIBPNG OFF)
+            endif()
+        else()
+            message(WARNING "libpng was found but its imported library path was not available; PNG screenshots disabled")
+            set(WINUAE_UNIX_USE_LIBPNG OFF)
+        endif()
+    endif()
+endif()
+
+if(WINUAE_UNIX_USE_LIBPNG)
+    target_compile_definitions(winuae_core PRIVATE WINUAE_UNIX_WITH_LIBPNG=1)
+    target_link_libraries(winuae_core PRIVATE PNG::PNG)
+    list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES PNG::PNG)
+endif()
+
+if(APPLE)
+    target_compile_definitions(winuae_core PRIVATE WINUAE_UNIX_WITH_IMAGEIO=1)
+    list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES
+        "-framework CoreFoundation"
+        "-framework CoreGraphics"
+        "-framework ImageIO"
+    )
+endif()
+
+if(WINUAE_UNIX_WITH_ARCHIVES)
+    target_compile_definitions(winuae_core PRIVATE
+        WINUAE_UNIX_WITH_ARCHIVES=1
+        A_ZIP=1
+        A_7Z=1
+        A_LHA=1
+        A_LZX=1
+        A_DMS=1
+        A_WRP=1
+    )
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+        zfile_archive.cpp
+        archivers/zip/ioapi.cpp
+        archivers/zip/unzip.cpp
+        archivers/zip/zip.cpp
+        "${WINUAE_LZMA_SDK_7Z_DIR}/7zAlloc.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/7zArcIn.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/7zBuf.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/7zBuf2.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/7zCrc.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/7zCrcOpt.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/7zDec.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/7zFile.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/7zStream.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Aes.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/AesOpt.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Alloc.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Bcj2.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Bra.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Bra86.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/BraIA64.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/CpuArch.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Delta.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/LzFind.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Lzma2Dec.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Lzma2Enc.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Lzma86Dec.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Lzma86Enc.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/LzmaDec.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/LzmaEnc.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/LzmaLib.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Ppmd7.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Ppmd7Dec.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Ppmd7Enc.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Sha256.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Sort.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/Xz.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/XzCrc64.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/XzCrc64Opt.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/XzDec.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/XzEnc.c"
+        "${WINUAE_LZMA_SDK_7Z_DIR}/XzIn.c"
+        archivers/lha/crcio.cpp
+        archivers/lha/dhuf.cpp
+        archivers/lha/header.cpp
+        archivers/lha/huf.cpp
+        archivers/lha/larc.cpp
+        archivers/lha/lhamaketbl.cpp
+        archivers/lha/lharc.cpp
+        archivers/lha/shuf.cpp
+        archivers/lha/slide.cpp
+        archivers/lha/uae_lha.cpp
+        archivers/lha/util.cpp
+        archivers/lzx/unlzx.cpp
+        archivers/dms/crc_csum.cpp
+        archivers/dms/getbits.cpp
+        archivers/dms/maketbl.cpp
+        archivers/dms/pfile.cpp
+        archivers/dms/tables.cpp
+        archivers/dms/u_deep.cpp
+        archivers/dms/u_heavy.cpp
+        archivers/dms/u_init.cpp
+        archivers/dms/u_medium.cpp
+        archivers/dms/u_quick.cpp
+        archivers/dms/u_rle.cpp
+        archivers/wrp/warp.cpp
+    )
+endif()
+
+if(WINUAE_UNIX_WITH_CHD)
+    target_compile_definitions(winuae_core PRIVATE
+        WINUAE_UNIX_WITH_CHD=1
+        WITH_CHD=1
+    )
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+        archivers/chd/astring.cpp
+        archivers/chd/chd.cpp
+        archivers/chd/chdcdrom.cpp
+        archivers/chd/chdcodec.cpp
+        archivers/chd/chdglue.cpp
+        archivers/chd/corealloc.cpp
+        archivers/chd/harddisk.cpp
+        archivers/chd/hashing.cpp
+        archivers/chd/huffman.cpp
+        archivers/chd/md5.cpp
+        archivers/chd/sha1.cpp
+        od-unix/chd_unix_time.cpp
+        od-unix/chd_unix_work.cpp
+    )
+    if(NOT WINUAE_UNIX_WITH_ARCHIVES)
+        list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+            "${WINUAE_LZMA_SDK_7Z_DIR}/LzmaDec.c"
+            "${WINUAE_LZMA_SDK_7Z_DIR}/LzmaEnc.c"
+            "${WINUAE_LZMA_SDK_7Z_DIR}/LzFind.c"
+        )
+    endif()
+
+    set(WINUAE_UNIX_CHD_FLAC_OK OFF)
+    if(WINUAE_UNIX_WITH_CHD_FLAC AND PkgConfig_FOUND)
+        pkg_check_modules(FLAC QUIET flac)
+        if(FLAC_FOUND)
+            set(WINUAE_UNIX_CHD_FLAC_OK ON)
+            if(APPLE)
+                unset(WINUAE_UNIX_FLAC_LIBRARY CACHE)
+                find_library(WINUAE_UNIX_FLAC_LIBRARY NAMES FLAC PATHS ${FLAC_LIBRARY_DIRS} NO_DEFAULT_PATH)
+                if(WINUAE_UNIX_FLAC_LIBRARY)
+                    execute_process(
+                        COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/macos-check-deployment-target.sh" "${WINUAE_UNIX_FLAC_LIBRARY}" "${CMAKE_OSX_DEPLOYMENT_TARGET}"
+                        RESULT_VARIABLE WINUAE_UNIX_FLAC_DEPLOYMENT_RESULT
+                        OUTPUT_VARIABLE WINUAE_UNIX_FLAC_DEPLOYMENT_OUTPUT
+                        ERROR_VARIABLE WINUAE_UNIX_FLAC_DEPLOYMENT_ERROR
+                        OUTPUT_STRIP_TRAILING_WHITESPACE
+                        ERROR_STRIP_TRAILING_WHITESPACE
+                    )
+                    if(NOT WINUAE_UNIX_FLAC_DEPLOYMENT_RESULT EQUAL 0)
+                        message(STATUS "libFLAC is newer than CMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}; CHD FLAC codecs disabled. ${WINUAE_UNIX_FLAC_DEPLOYMENT_ERROR}")
+                        set(WINUAE_UNIX_CHD_FLAC_OK OFF)
+                    endif()
+                else()
+                    message(STATUS "libFLAC was found by pkg-config but not as a library path; CHD FLAC codecs disabled")
+                    set(WINUAE_UNIX_CHD_FLAC_OK OFF)
+                endif()
+            endif()
+        endif()
+    endif()
+
+    if(WINUAE_UNIX_CHD_FLAC_OK)
+        target_compile_definitions(winuae_core PRIVATE WITH_CHD_FLAC=1)
+        target_include_directories(winuae_core PRIVATE ${FLAC_INCLUDE_DIRS})
+        target_compile_options(winuae_core PRIVATE ${FLAC_CFLAGS_OTHER})
+        list(APPEND WINUAE_UNIX_EXTRA_SOURCES archivers/chd/flac.cpp)
+        list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES ${FLAC_LIBRARIES})
+        list(APPEND WINUAE_UNIX_EXTRA_LIBRARY_DIRS ${FLAC_LIBRARY_DIRS})
+    else()
+        target_compile_definitions(winuae_core PRIVATE WITH_CHD_FLAC=0)
+    endif()
+endif()
+
+set(WINUAE_UNIX_LIBMPEG2_OK OFF)
+set(WINUAE_UNIX_LIBMPEG2_FOUND OFF)
+if(WINUAE_UNIX_WITH_LIBMPEG2 AND PkgConfig_FOUND)
+    pkg_check_modules(LIBMPEG2 QUIET libmpeg2 libmpeg2convert)
+    if(LIBMPEG2_FOUND)
+        set(WINUAE_UNIX_LIBMPEG2_FOUND ON)
+        set(WINUAE_UNIX_LIBMPEG2_OK ON)
+        if(APPLE)
+            unset(WINUAE_UNIX_LIBMPEG2_LIBRARY CACHE)
+            unset(WINUAE_UNIX_LIBMPEG2CONVERT_LIBRARY CACHE)
+            find_library(WINUAE_UNIX_LIBMPEG2_LIBRARY
+                NAMES mpeg2
+                PATHS ${LIBMPEG2_LIBRARY_DIRS}
+                NO_DEFAULT_PATH
+            )
+            find_library(WINUAE_UNIX_LIBMPEG2CONVERT_LIBRARY
+                NAMES mpeg2convert
+                PATHS ${LIBMPEG2_LIBRARY_DIRS}
+                NO_DEFAULT_PATH
+            )
+            if(WINUAE_UNIX_LIBMPEG2_LIBRARY AND WINUAE_UNIX_LIBMPEG2CONVERT_LIBRARY)
+                foreach(WINUAE_UNIX_LIBMPEG2_CHECK_LIBRARY IN ITEMS WINUAE_UNIX_LIBMPEG2_LIBRARY WINUAE_UNIX_LIBMPEG2CONVERT_LIBRARY)
+                    execute_process(
+                        COMMAND
+                            "${CMAKE_CURRENT_SOURCE_DIR}/tools/macos-check-deployment-target.sh"
+                            "${${WINUAE_UNIX_LIBMPEG2_CHECK_LIBRARY}}"
+                            "${CMAKE_OSX_DEPLOYMENT_TARGET}"
+                        RESULT_VARIABLE WINUAE_UNIX_LIBMPEG2_DEPLOYMENT_RESULT
+                        OUTPUT_VARIABLE WINUAE_UNIX_LIBMPEG2_DEPLOYMENT_OUTPUT
+                        ERROR_VARIABLE WINUAE_UNIX_LIBMPEG2_DEPLOYMENT_ERROR
+                        OUTPUT_STRIP_TRAILING_WHITESPACE
+                        ERROR_STRIP_TRAILING_WHITESPACE
+                    )
+                    if(NOT WINUAE_UNIX_LIBMPEG2_DEPLOYMENT_RESULT EQUAL 0)
+                        message(STATUS
+                            "libmpeg2 is newer than "
+                            "CMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}; "
+                            "CD32 FMV video decode disabled. "
+                            "${WINUAE_UNIX_LIBMPEG2_DEPLOYMENT_ERROR}"
+                        )
+                        set(WINUAE_UNIX_LIBMPEG2_OK OFF)
+                    endif()
+                endforeach()
+            else()
+                message(STATUS
+                    "libmpeg2 was found by pkg-config but not as library "
+                    "paths; CD32 FMV video decode disabled"
+                )
+                set(WINUAE_UNIX_LIBMPEG2_OK OFF)
+            endif()
+        endif()
+    endif()
+endif()
+
+if(WINUAE_UNIX_LIBMPEG2_OK)
+    target_compile_definitions(winuae_core PRIVATE WITH_LIBMPEG2=1)
+    target_include_directories(winuae_core PRIVATE ${LIBMPEG2_INCLUDE_DIRS})
+    target_compile_options(winuae_core PRIVATE ${LIBMPEG2_CFLAGS_OTHER})
+    if(APPLE)
+        list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES
+            "${WINUAE_UNIX_LIBMPEG2_LIBRARY}"
+            "${WINUAE_UNIX_LIBMPEG2CONVERT_LIBRARY}"
+        )
+    else()
+        list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES ${LIBMPEG2_LIBRARIES})
+    endif()
+    list(APPEND WINUAE_UNIX_EXTRA_LIBRARY_DIRS ${LIBMPEG2_LIBRARY_DIRS})
+elseif(WINUAE_UNIX_WITH_LIBMPEG2 AND NOT WINUAE_UNIX_LIBMPEG2_FOUND)
+    message(STATUS "libmpeg2 development package not found; CD32 FMV video decode disabled")
+endif()
+
+set(WINUAE_UNIX_MT32EMU_OK OFF)
+set(WINUAE_UNIX_MT32EMU_FOUND OFF)
+if(WINUAE_UNIX_WITH_MIDIEMU AND PkgConfig_FOUND)
+    pkg_check_modules(MT32EMU QUIET mt32emu)
+    if(MT32EMU_FOUND)
+        set(WINUAE_UNIX_MT32EMU_FOUND ON)
+        set(WINUAE_UNIX_MT32EMU_OK ON)
+        if(APPLE)
+            unset(WINUAE_UNIX_MT32EMU_LIBRARY CACHE)
+            find_library(WINUAE_UNIX_MT32EMU_LIBRARY
+                NAMES mt32emu
+                PATHS ${MT32EMU_LIBRARY_DIRS}
+                NO_DEFAULT_PATH
+            )
+            if(WINUAE_UNIX_MT32EMU_LIBRARY)
+                execute_process(
+                    COMMAND
+                        "${CMAKE_CURRENT_SOURCE_DIR}/tools/macos-check-deployment-target.sh"
+                        "${WINUAE_UNIX_MT32EMU_LIBRARY}"
+                        "${CMAKE_OSX_DEPLOYMENT_TARGET}"
+                    RESULT_VARIABLE WINUAE_UNIX_MT32EMU_DEPLOYMENT_RESULT
+                    OUTPUT_VARIABLE WINUAE_UNIX_MT32EMU_DEPLOYMENT_OUTPUT
+                    ERROR_VARIABLE WINUAE_UNIX_MT32EMU_DEPLOYMENT_ERROR
+                    OUTPUT_STRIP_TRAILING_WHITESPACE
+                    ERROR_STRIP_TRAILING_WHITESPACE
+                )
+                if(NOT WINUAE_UNIX_MT32EMU_DEPLOYMENT_RESULT EQUAL 0)
+                    message(STATUS
+                        "libmt32emu is newer than "
+                        "CMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}; "
+                        "Munt MIDI emulation disabled. "
+                        "${WINUAE_UNIX_MT32EMU_DEPLOYMENT_ERROR}"
+                    )
+                    set(WINUAE_UNIX_MT32EMU_OK OFF)
+                endif()
+            else()
+                message(STATUS
+                    "mt32emu was found by pkg-config but not as a library "
+                    "path; Munt MIDI emulation disabled"
+                )
+                set(WINUAE_UNIX_MT32EMU_OK OFF)
+            endif()
+        endif()
+    endif()
+endif()
+
+if(WINUAE_UNIX_WITH_NATIVE_HARDDRIVES)
+    set(WINUAE_UNIX_ENABLE_NATIVE_HARDDRIVES ON)
+    target_compile_definitions(winuae_core PRIVATE WINUAE_UNIX_WITH_NATIVE_HARDDRIVES=1)
+endif()
+
+if(WINUAE_UNIX_WITH_MIDI)
+    if(APPLE)
+        set(WINUAE_UNIX_ENABLE_MIDI ON)
+        target_compile_definitions(winuae_core PRIVATE WITH_MIDI=1 WINUAE_UNIX_WITH_COREMIDI=1)
+        list(APPEND WINUAE_UNIX_EXTRA_SOURCES od-unix/midi.cpp)
+        list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES "-framework CoreMIDI" "-framework CoreFoundation")
+        list(APPEND WINUAE_UNIX_MIDI_LIBRARIES "-framework CoreMIDI" "-framework CoreFoundation")
+        list(APPEND WINUAE_UNIX_MIDI_QT_DEFINITIONS UAE_UNIX_WITH_COREMIDI=1)
+    elseif(PkgConfig_FOUND)
+        pkg_check_modules(ALSA QUIET alsa)
+        if(ALSA_FOUND)
+            set(WINUAE_UNIX_ENABLE_MIDI ON)
+            target_compile_definitions(winuae_core PRIVATE WITH_MIDI=1 WINUAE_UNIX_WITH_ALSA_MIDI=1)
+            target_include_directories(winuae_core PRIVATE ${ALSA_INCLUDE_DIRS})
+            target_compile_options(winuae_core PRIVATE ${ALSA_CFLAGS_OTHER})
+            list(APPEND WINUAE_UNIX_EXTRA_SOURCES od-unix/midi.cpp)
+            list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES ${ALSA_LIBRARIES})
+            list(APPEND WINUAE_UNIX_EXTRA_LIBRARY_DIRS ${ALSA_LIBRARY_DIRS})
+            list(APPEND WINUAE_UNIX_MIDI_LIBRARIES ${ALSA_LIBRARIES})
+            list(APPEND WINUAE_UNIX_MIDI_INCLUDE_DIRS ${ALSA_INCLUDE_DIRS})
+            list(APPEND WINUAE_UNIX_MIDI_LIBRARY_DIRS ${ALSA_LIBRARY_DIRS})
+            list(APPEND WINUAE_UNIX_MIDI_COMPILE_OPTIONS ${ALSA_CFLAGS_OTHER})
+            list(APPEND WINUAE_UNIX_MIDI_QT_DEFINITIONS UAE_UNIX_WITH_ALSA_MIDI=1)
+        else()
+            message(STATUS "ALSA development package not found; native Unix MIDI disabled")
+        endif()
+    else()
+        message(STATUS "pkg-config not available; native Unix MIDI disabled")
+    endif()
+endif()
+
+if(WINUAE_UNIX_WITH_MIDIEMU AND WINUAE_UNIX_ENABLE_MIDI)
+    if(WINUAE_UNIX_MT32EMU_OK)
+        set(WINUAE_UNIX_ENABLE_MIDIEMU ON)
+        target_compile_definitions(winuae_core PRIVATE WITH_MIDIEMU=1)
+        target_include_directories(winuae_core PRIVATE ${MT32EMU_INCLUDE_DIRS})
+        target_compile_options(winuae_core PRIVATE ${MT32EMU_CFLAGS_OTHER})
+        list(APPEND WINUAE_UNIX_EXTRA_SOURCES midiemu.cpp)
+        if(APPLE)
+            list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES "${WINUAE_UNIX_MT32EMU_LIBRARY}")
+        else()
+            list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES ${MT32EMU_LIBRARIES})
+        endif()
+        list(APPEND WINUAE_UNIX_EXTRA_LIBRARY_DIRS ${MT32EMU_LIBRARY_DIRS})
+    elseif(NOT WINUAE_UNIX_MT32EMU_FOUND)
+        message(STATUS "mt32emu development package not found; Munt MIDI emulation disabled")
+    endif()
+elseif(WINUAE_UNIX_WITH_MIDIEMU AND NOT WINUAE_UNIX_ENABLE_MIDI)
+    message(STATUS "Native Unix MIDI disabled; Munt MIDI emulation disabled")
+endif()
+
+if(WINUAE_UNIX_WITH_CPUBOARD)
+    set(WINUAE_UNIX_ENABLE_CPUBOARD ON)
+    target_compile_definitions(winuae_core PRIVATE WITH_CPUBOARD=1)
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES cpuboard.cpp)
+endif()
+
+if(WINUAE_UNIX_WITH_PPC_QEMU)
+    set(WINUAE_UNIX_ENABLE_PPC ON)
+    target_compile_definitions(winuae_core PRIVATE WITH_PPC=1 WITH_QEMU_CPU=1)
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+        ppc/ppc.cpp
+        ppc/ppcd.cpp
+        qemuvga/qemu.cpp
+    )
+endif()
+
+if(WINUAE_UNIX_WITH_DSP)
+    set(WINUAE_UNIX_ENABLE_DSP ON)
+    target_compile_definitions(winuae_core PRIVATE WITH_DSP=1)
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+        dsp3210/DSP3210_emulation.cpp
+        dsp3210/dsp_glue.cpp
+    )
+endif()
+
+set(WINUAE_UNIX_ENABLE_SNDBOARD ON)
+set(WINUAE_UNIX_ENABLE_PCI ON)
+target_compile_definitions(winuae_core PRIVATE
+    WITH_SNDBOARD=1
+    WITH_TOCCATA=1
+    WITH_PCI=1
+)
+list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+    sndboard.cpp
+    od-unix/sndboard_host.cpp
+    pci.cpp
+    qemuvga/es1370.cpp
+    qemuvga/ne2000.cpp
+    qemuvga/qemuuaeglue.cpp
+)
+
+set(WINUAE_UNIX_ENABLE_GFXBOARD ON)
+target_compile_definitions(winuae_core PRIVATE GFXBOARD=1)
+set(WINUAE_UNIX_ENABLE_PCEM ON)
+list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+    gfxboard.cpp
+    pci.cpp
+    mame/a2410.cpp
+    mame/tm34010/tms34010.cpp
+    ${WINUAE_UNIX_PCEM_COMMON_SOURCES}
+    ${WINUAE_UNIX_PCEM_VIDEO_SOURCES}
+)
+
+set(WINUAE_UNIX_ENABLE_X86 ON)
+set(WINUAE_UNIX_ENABLE_PCEM ON)
+target_compile_definitions(winuae_core PRIVATE WITH_X86=1)
+list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+    x86.cpp
+    ${WINUAE_UNIX_PCEM_COMMON_SOURCES}
+    ${WINUAE_UNIX_PCEM_X86_SOURCES}
+)
+
+set(WINUAE_UNIX_ENABLE_DRACO ON)
+set(WINUAE_UNIX_ENABLE_PCEM ON)
+target_compile_definitions(winuae_core PRIVATE WITH_DRACO=1)
+list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+    draco.cpp
+    ${WINUAE_UNIX_PCEM_COMMON_SOURCES}
+    ${WINUAE_UNIX_PCEM_DRACO_SOURCES}
+)
+
+if(WINUAE_UNIX_ENABLE_PCEM)
+    target_compile_definitions(winuae_core PRIVATE WINUAE_UNIX_WITH_PCEM=1)
+    target_compile_options(winuae_core PRIVATE
+        $<$<COMPILE_LANGUAGE:CXX>:-include>
+        $<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/od-unix/pcem_wincompat.h>
+    )
+endif()
+
+if(WINUAE_UNIX_ENABLE_PPC OR WINUAE_UNIX_ENABLE_GFXBOARD OR WINUAE_UNIX_ENABLE_X86 OR WINUAE_UNIX_ENABLE_DRACO)
+    target_compile_definitions(winuae_core PRIVATE UAE=)
+endif()
+
+if(WINUAE_UNIX_WITH_AVIOUTPUT)
+    set(WINUAE_UNIX_ENABLE_AVIOUTPUT ON)
+    target_compile_definitions(winuae_core PRIVATE AVIOUTPUT=1)
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES od-unix/avioutput.cpp)
+endif()
+
+if(WINUAE_UNIX_WITH_OPENGL_SHADER_PIPELINE AND WINUAE_UNIX_WITH_SDL3)
+    find_package(OpenGL QUIET)
+    if(OpenGL_FOUND)
+        set(WINUAE_UNIX_ENABLE_SHADER_PIPELINE ON)
+        target_compile_definitions(winuae_core PRIVATE WINUAE_UNIX_WITH_OPENGL_SHADER_PIPELINE=1)
+        list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES OpenGL::GL)
+    else()
+        message(STATUS "OpenGL development package not found; Unix shader pipeline disabled")
+    endif()
+endif()
+
+if(WINUAE_UNIX_WITH_JIT)
+    if(WINUAE_UNIX_JIT_TARGET_SUPPORTED)
+        set(WINUAE_UNIX_ENABLE_JIT ON)
+        target_compile_definitions(winuae_core PRIVATE
+            JIT=1
+            USE_JIT_FPU=1
+            NOFLAGS_SUPPORT_GENCOMP=1
+            SAHF_SETO_PROFITABLE=1
+        )
+        list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+            jit/compemu.cpp
+            jit/compemu_fpp.cpp
+            jit/compemu_support.cpp
+            jit/compstbl.cpp
+        )
+    else()
+        message(STATUS "JIT is currently enabled only for Unix ARM64 and x86_64 builds; disabling JIT for ${CMAKE_SYSTEM_PROCESSOR}")
+    endif()
+endif()
+
+if(WINUAE_UNIX_WITH_SLIRP)
+    target_compile_definitions(winuae_core PRIVATE
+        A2065=1
+        WITH_SLIRP=1
+        WITH_BUILTIN_SLIRP=1
+    )
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+        a2065.cpp
+        slirp_uae.cpp
+        slirp/bootp.cpp
+        slirp/cksum.cpp
+        slirp/if.cpp
+        slirp/ip_icmp.cpp
+        slirp/ip_input.cpp
+        slirp/ip_output.cpp
+        slirp/mbuf.cpp
+        slirp/misc.cpp
+        slirp/sbuf.cpp
+        slirp/slirp.cpp
+        slirp/slirpdebug.cpp
+        slirp/socket.cpp
+        slirp/tcp_input.cpp
+        slirp/tcp_output.cpp
+        slirp/tcp_subr.cpp
+        slirp/tcp_timer.cpp
+        slirp/tftp.cpp
+        slirp/udp.cpp
+    )
+endif()
+
+if(WINUAE_UNIX_WITH_SANA2)
+    if(WINUAE_UNIX_WITH_SLIRP)
+        set(WINUAE_UNIX_ENABLE_SANA2 ON)
+        target_compile_definitions(winuae_core PRIVATE SANA2=1)
+        list(APPEND WINUAE_UNIX_EXTRA_SOURCES sana2.cpp)
+    else()
+        message(STATUS "uaenet.device requires the Unix Ethernet backend; disabling WINUAE_UNIX_WITH_SANA2")
+    endif()
+endif()
+
+if(WINUAE_UNIX_WITH_UAENET_PCAP)
+    set(WINUAE_UNIX_PCAP_FOUND OFF)
+    if(PkgConfig_FOUND)
+        pkg_check_modules(PCAP QUIET libpcap)
+        if(PCAP_FOUND)
+            set(WINUAE_UNIX_PCAP_FOUND ON)
+            target_include_directories(winuae_core PRIVATE ${PCAP_INCLUDE_DIRS})
+            target_compile_options(winuae_core PRIVATE ${PCAP_CFLAGS_OTHER})
+            list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES ${PCAP_LIBRARIES})
+            list(APPEND WINUAE_UNIX_EXTRA_LIBRARY_DIRS ${PCAP_LIBRARY_DIRS})
+        endif()
+    endif()
+    if(NOT WINUAE_UNIX_PCAP_FOUND)
+        find_path(WINUAE_UNIX_PCAP_INCLUDE_DIR NAMES pcap/pcap.h pcap.h)
+        find_library(WINUAE_UNIX_PCAP_LIBRARY NAMES pcap)
+        if(WINUAE_UNIX_PCAP_INCLUDE_DIR AND WINUAE_UNIX_PCAP_LIBRARY)
+            set(WINUAE_UNIX_PCAP_FOUND ON)
+            target_include_directories(winuae_core PRIVATE "${WINUAE_UNIX_PCAP_INCLUDE_DIR}")
+            list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES "${WINUAE_UNIX_PCAP_LIBRARY}")
+        endif()
+    endif()
+    if(WINUAE_UNIX_PCAP_FOUND)
+        set(WINUAE_UNIX_ENABLE_UAENET_PCAP ON)
+        target_compile_definitions(winuae_core PRIVATE WITH_UAENET_PCAP=1)
+        list(APPEND WINUAE_UNIX_EXTRA_SOURCES od-unix/uaenet_unix.cpp)
+    else()
+        message(STATUS "libpcap was not found; disabling native Unix packet networking")
+    endif()
+endif()
+
+if(WINUAE_UNIX_WITH_BSDSOCKET)
+    set(WINUAE_UNIX_ENABLE_BSDSOCKET ON)
+    target_compile_definitions(winuae_core PRIVATE BSDSOCKET=1)
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES od-unix/bsdsock_unix.cpp)
+endif()
+
+if(WINUAE_UNIX_WITH_UAESCSI)
+    set(WINUAE_UNIX_ENABLE_UAESCSI ON)
+    target_compile_definitions(winuae_core PRIVATE SCSIEMU=1)
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES scsiemul.cpp)
+endif()
+
+if(WINUAE_UNIX_WITH_NATIVE_CD)
+    if(APPLE OR CMAKE_SYSTEM_NAME STREQUAL "Linux")
+        set(WINUAE_UNIX_ENABLE_NATIVE_CD ON)
+        target_compile_definitions(winuae_core PRIVATE WITH_SCSI_IOCTL=1)
+        list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+            od-unix/blkdev_unix_ioctl.cpp
+            od-unix/cda_play.cpp
+        )
+        if(APPLE)
+            list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES
+                "-framework CoreFoundation"
+                "-framework DiskArbitration"
+                "-framework IOKit"
+            )
+        endif()
+    else()
+        message(STATUS "Native Unix CD/DVD access is implemented for macOS and Linux only")
+    endif()
+endif()
+
+if(WINUAE_UNIX_WITH_NATIVE_SCSI)
+    if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+        set(WINUAE_UNIX_ENABLE_NATIVE_SCSI ON)
+        target_compile_definitions(winuae_core PRIVATE WITH_SCSI_SPTI=1)
+        list(APPEND WINUAE_UNIX_EXTRA_SOURCES od-unix/blkdev_unix_sg.cpp)
+    elseif(APPLE)
+        set(WINUAE_UNIX_ENABLE_NATIVE_SCSI ON)
+        target_compile_definitions(winuae_core PRIVATE WITH_SCSI_SPTI=1)
+        list(APPEND WINUAE_UNIX_EXTRA_SOURCES od-unix/blkdev_unix_scsi_macos.cpp)
+        list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES
+            "-framework CoreFoundation"
+            "-framework IOKit"
+        )
+    else()
+        message(STATUS "Native Unix SCSI/tape passthrough is implemented for macOS SCSITaskLib and Linux SG_IO only")
+    endif()
+endif()
+
+if(WINUAE_UNIX_WITH_UAESERIAL)
+    set(WINUAE_UNIX_ENABLE_UAESERIAL ON)
+    target_compile_definitions(winuae_core PRIVATE UAESERIAL=1)
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+        uaeserial.cpp
+        od-unix/uaeserial_host.cpp
+    )
+endif()
+
+target_compile_definitions(winuae_core PRIVATE NCR=1 NCR9X=1)
+set_source_files_properties(ncr_scsi.cpp ncr9x_scsi.cpp PROPERTIES COMPILE_DEFINITIONS WITH_QEMU_CPU=1)
+list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+    ncr_scsi.cpp
+    ncr9x_scsi.cpp
+    qemuvga/esp.cpp
+    qemuvga/lsi53c710.cpp
+    qemuvga/lsi53c895a.cpp
+    qemuvga/qemuuaeglue.cpp
+)
+
+if(WINUAE_UNIX_WITH_PROWIZARD)
+    target_compile_definitions(winuae_core PRIVATE PROWIZARD=1)
+    target_include_directories(winuae_core PRIVATE
+        "${CMAKE_CURRENT_SOURCE_DIR}/prowizard/include"
+    )
+    set(WINUAE_UNIX_PROWIZARD_C_SOURCES
+        prowizard/misc/misc.c
+        prowizard/prowiz.c
+        prowizard/misc/testbag.c
+        prowizard/rippers/AC1D_packer.c
+        prowizard/rippers/AMOS-MusicBank.c
+        prowizard/rippers/AMOS-PowerPackerBank.c
+        prowizard/rippers/BP-Soundmonitor.c
+        prowizard/rippers/BSI-FutureComposer.c
+        prowizard/rippers/Bytekiller.c
+        prowizard/rippers/ChipTracker.c
+        prowizard/rippers/Crunchmania-Address.c
+        prowizard/rippers/Crunchmania-Simple.c
+        prowizard/rippers/datacrunchers.c
+        prowizard/rippers/DefjamCruncher32-pro.c
+        prowizard/rippers/DigiBooster17.c
+        prowizard/rippers/DigitalIllusion.c
+        prowizard/rippers/DoubleAction.c
+        prowizard/rippers/Dragpack100.c
+        prowizard/rippers/Dragpack252.c
+        prowizard/rippers/EurekaPacker.c
+        prowizard/rippers/FastTracker2.c
+        prowizard/rippers/FC-M-Packer.c
+        prowizard/rippers/FuchsTracker.c
+        prowizard/rippers/FutureComposer13.c
+        prowizard/rippers/FutureComposer14.c
+        prowizard/rippers/FuzzacPacker.c
+        prowizard/rippers/GMC.c
+        prowizard/rippers/GNUPacker12.c
+        prowizard/rippers/GnuPlayer.c
+        prowizard/rippers/GPMO.c
+        prowizard/rippers/HeatseekerMC10.c
+        prowizard/rippers/HornetPacker.c
+        prowizard/rippers/HQC2.c
+        prowizard/rippers/JamCracker.c
+        prowizard/rippers/KefrensSoundMachine.c
+        prowizard/rippers/MasterCruncher30-Address.c
+        prowizard/rippers/MaxPacker12.c
+        prowizard/rippers/MED-Octamed.c
+        prowizard/rippers/MegaCruncher-Object.c
+        prowizard/rippers/MegaCruncher.c
+        prowizard/rippers/MOD-compatible.c
+        prowizard/rippers/ModuleProtector.c
+        prowizard/rippers/Mugician.c
+        prowizard/rippers/Newtron.c
+        prowizard/rippers/NewtronOld.c
+        prowizard/rippers/NoiseFromHeaven.c
+        prowizard/rippers/NoisePacker1.c
+        prowizard/rippers/NoisePacker2.c
+        prowizard/rippers/NoiseRunner.c
+        prowizard/rippers/NovoTrade.c
+        prowizard/rippers/NP3.c
+        prowizard/rippers/PhaPacker.c
+        prowizard/rippers/PolkaPacker.c
+        prowizard/rippers/PowerMusic.c
+        prowizard/rippers/PowerPacker23.c
+        prowizard/rippers/PowerPacker30.c
+        prowizard/rippers/PowerPacker40-library.c
+        prowizard/rippers/PowerPacker40.c
+        prowizard/rippers/Promizer01.c
+        prowizard/rippers/Promizer10c.c
+        prowizard/rippers/Promizer18a.c
+        prowizard/rippers/Promizer20.c
+        prowizard/rippers/Promizer40.c
+        prowizard/rippers/ProPacker10.c
+        prowizard/rippers/ProPacker21.c
+        prowizard/rippers/ProPacker30.c
+        prowizard/rippers/Prorunner10.c
+        prowizard/rippers/Prorunner20.c
+        prowizard/rippers/QuadraComposer.c
+        prowizard/rippers/RelokIt10.c
+        prowizard/rippers/SGT-Packer.c
+        prowizard/rippers/skizzo.c
+        prowizard/rippers/SkytPacker.c
+        prowizard/rippers/SoundFX.c
+        prowizard/rippers/SoundTracker.c
+        prowizard/rippers/SoundTracker26.c
+        prowizard/rippers/SpikeCruncher.c
+        prowizard/rippers/StartrekkerPack.c
+        prowizard/rippers/StimPacker.c
+        prowizard/rippers/StoneArtsPlayer.c
+        prowizard/rippers/StoneCracker270.c
+        prowizard/rippers/StoneCracker299.c
+        prowizard/rippers/StoneCracker299b.c
+        prowizard/rippers/StoneCracker299d.c
+        prowizard/rippers/StoneCracker300.c
+        prowizard/rippers/StoneCracker310.c
+        prowizard/rippers/SuperCruncher27.c
+        prowizard/rippers/SyncroPacker46.c
+        prowizard/rippers/TetraPack102.c
+        prowizard/rippers/TetraPack21.c
+        prowizard/rippers/TetraPack22.c
+        prowizard/rippers/TheDarkDemon.c
+        prowizard/rippers/ThePlayer22a.c
+        prowizard/rippers/ThePlayer30a.c
+        prowizard/rippers/ThePlayer40.c
+        prowizard/rippers/ThePlayer41a.c
+        prowizard/rippers/ThePlayer50a.c
+        prowizard/rippers/ThePlayer60a.c
+        prowizard/rippers/ThePlayer61a.c
+        prowizard/rippers/TimeCruncher17.c
+        prowizard/rippers/TitanicsPlayer.c
+        prowizard/rippers/TMK.c
+        prowizard/rippers/TNMCruncher.c
+        prowizard/rippers/TrackerPacker1.c
+        prowizard/rippers/TrackerPacker2.c
+        prowizard/rippers/TrackerPacker3.c
+        prowizard/rippers/TryItCruncher101.c
+        prowizard/rippers/TurboSqueezer61.c
+        prowizard/rippers/UnicTracker.c
+        prowizard/rippers/UnicTracker2.c
+        prowizard/rippers/WantonPacker.c
+        prowizard/rippers/XannPlayer.c
+        prowizard/rippers/ZenPacker.c
+    )
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES
+        moduleripper.cpp
+        ${WINUAE_UNIX_PROWIZARD_C_SOURCES}
+    )
+    set_source_files_properties(${WINUAE_UNIX_PROWIZARD_C_SOURCES}
+        PROPERTIES LANGUAGE CXX
+    )
+endif()
+
+if(WINUAE_UNIX_WITH_SDL3)
+    find_package(SDL3 CONFIG QUIET)
+    if(TARGET SDL3::SDL3)
+        set(WINUAE_UNIX_SDL3_TARGET SDL3::SDL3)
+    elseif(TARGET SDL3::SDL3-shared)
+        set(WINUAE_UNIX_SDL3_TARGET SDL3::SDL3-shared)
+    elseif(TARGET SDL3-static)
+        set(WINUAE_UNIX_SDL3_TARGET SDL3-static)
+    elseif(TARGET SDL3)
+        set(WINUAE_UNIX_SDL3_TARGET SDL3)
+    endif()
+    if(WINUAE_UNIX_SDL3_TARGET AND APPLE)
+        winuae_unix_imported_location("${WINUAE_UNIX_SDL3_TARGET}" WINUAE_UNIX_SDL3_IMPORTED_LIBRARY)
+        if(WINUAE_UNIX_SDL3_IMPORTED_LIBRARY)
+            execute_process(
+                COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/macos-check-deployment-target.sh" "${WINUAE_UNIX_SDL3_IMPORTED_LIBRARY}" "${CMAKE_OSX_DEPLOYMENT_TARGET}"
+                RESULT_VARIABLE WINUAE_UNIX_SDL3_DEPLOYMENT_RESULT
+                OUTPUT_VARIABLE WINUAE_UNIX_SDL3_DEPLOYMENT_OUTPUT
+                ERROR_VARIABLE WINUAE_UNIX_SDL3_DEPLOYMENT_ERROR
+                OUTPUT_STRIP_TRAILING_WHITESPACE
+                ERROR_STRIP_TRAILING_WHITESPACE
+            )
+            if(NOT WINUAE_UNIX_SDL3_DEPLOYMENT_RESULT EQUAL 0)
+                message(STATUS "SDL3 is newer than CMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}; ignoring package target. ${WINUAE_UNIX_SDL3_DEPLOYMENT_ERROR}")
+                unset(WINUAE_UNIX_SDL3_TARGET)
+                set(SDL3_FOUND OFF)
+            endif()
+        endif()
+    endif()
+    if(NOT WINUAE_UNIX_SDL3_TARGET)
+        find_path(WINUAE_UNIX_SDL3_INCLUDE_DIR NAMES SDL3/SDL.h)
+        find_library(WINUAE_UNIX_SDL3_FALLBACK_LIBRARY NAMES SDL3 SDL3.0)
+        if(WINUAE_UNIX_SDL3_INCLUDE_DIR AND WINUAE_UNIX_SDL3_FALLBACK_LIBRARY)
+            set(WINUAE_UNIX_SDL3_FALLBACK_OK ON)
+            if(APPLE)
+                execute_process(
+                    COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/macos-check-deployment-target.sh" "${WINUAE_UNIX_SDL3_FALLBACK_LIBRARY}" "${CMAKE_OSX_DEPLOYMENT_TARGET}"
+                    RESULT_VARIABLE WINUAE_UNIX_SDL3_FALLBACK_DEPLOYMENT_RESULT
+                    OUTPUT_VARIABLE WINUAE_UNIX_SDL3_FALLBACK_DEPLOYMENT_OUTPUT
+                    ERROR_VARIABLE WINUAE_UNIX_SDL3_FALLBACK_DEPLOYMENT_ERROR
+                    OUTPUT_STRIP_TRAILING_WHITESPACE
+                    ERROR_STRIP_TRAILING_WHITESPACE
+                )
+                if(NOT WINUAE_UNIX_SDL3_FALLBACK_DEPLOYMENT_RESULT EQUAL 0)
+                    message(STATUS "SDL3 library is newer than CMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}; SDL3 disabled. ${WINUAE_UNIX_SDL3_FALLBACK_DEPLOYMENT_ERROR}")
+                    set(WINUAE_UNIX_SDL3_FALLBACK_OK OFF)
+                endif()
+            endif()
+            if(WINUAE_UNIX_SDL3_FALLBACK_OK)
+                add_library(WINUAE::SDL3 UNKNOWN IMPORTED)
+                set_target_properties(WINUAE::SDL3 PROPERTIES
+                    IMPORTED_LOCATION "${WINUAE_UNIX_SDL3_FALLBACK_LIBRARY}"
+                    INTERFACE_INCLUDE_DIRECTORIES "${WINUAE_UNIX_SDL3_INCLUDE_DIR}"
+                )
+                set(WINUAE_UNIX_SDL3_TARGET WINUAE::SDL3)
+                message(STATUS "Using SDL3 library: ${WINUAE_UNIX_SDL3_FALLBACK_LIBRARY}")
+            endif()
+        endif()
+    endif()
+    if(NOT WINUAE_UNIX_SDL3_TARGET AND PkgConfig_FOUND AND NOT APPLE)
+        pkg_check_modules(SDL3 QUIET sdl3)
+    endif()
+endif()
+
+if(WINUAE_UNIX_SDL3_TARGET)
+    target_compile_definitions(winuae_core PRIVATE UAE_UNIX_WITH_SDL3=1)
+    target_link_libraries(winuae_core PRIVATE ${WINUAE_UNIX_SDL3_TARGET})
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES od-unix/video_sdl.cpp)
+    list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES ${WINUAE_UNIX_SDL3_TARGET})
+elseif(SDL3_FOUND)
+    target_compile_definitions(winuae_core PRIVATE UAE_UNIX_WITH_SDL3=1)
+    target_include_directories(winuae_core PRIVATE ${SDL3_INCLUDE_DIRS})
+    target_compile_options(winuae_core PRIVATE ${SDL3_CFLAGS_OTHER})
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES od-unix/video_sdl.cpp)
+    list(APPEND WINUAE_UNIX_EXTRA_LIBRARIES ${SDL3_LIBRARIES})
+    list(APPEND WINUAE_UNIX_EXTRA_LIBRARY_DIRS ${SDL3_LIBRARY_DIRS})
+else()
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES od-unix/video_null.cpp)
+endif()
+
+if(WINUAE_UNIX_WITH_SAMPLER AND (WINUAE_UNIX_SDL3_TARGET OR SDL3_FOUND))
+    set(WINUAE_UNIX_ENABLE_SAMPLER ON)
+    target_compile_definitions(winuae_core PRIVATE WINUAE_UNIX_WITH_SAMPLER=1)
+    list(APPEND WINUAE_UNIX_EXTRA_SOURCES od-unix/sampler_sdl.cpp)
+endif()
+
+set(WINUAE_CORE_SOURCES
+    a2091.cpp
+    akiko.cpp
+    amax.cpp
+    ar.cpp
+    arcadia.cpp
+    aros.rom.cpp
+    audio.cpp
+    autoconf.cpp
+    blitfunc.cpp
+    blitops.cpp
+    blittable.cpp
+    blitter.cpp
+    blkdev.cpp
+    blkdev_cdimage.cpp
+    bsdsocket.cpp
+    calc.cpp
+    cd32_fmv.cpp
+    cd32_fmv_genlock.cpp
+    cdrom.cpp
+    cdtv.cpp
+    cdtvcr.cpp
+    cfgfile.cpp
+    cia.cpp
+    consolehook.cpp
+    cpudefs.cpp
+    cpustbl.cpp
+    cpuemu_0.cpp
+    cpuemu_11.cpp
+    cpuemu_13.cpp
+    cpuemu_20.cpp
+    cpuemu_21.cpp
+    cpuemu_22.cpp
+    cpuemu_23.cpp
+    cpuemu_24.cpp
+    cpuemu_31.cpp
+    cpuemu_32.cpp
+    cpuemu_33.cpp
+    cpuemu_34.cpp
+    cpuemu_35.cpp
+    cpuemu_40.cpp
+    cpuemu_50.cpp
+    cpummu.cpp
+    cpummu30.cpp
+    crc32.cpp
+    custom.cpp
+    debug.cpp
+    debugmem.cpp
+    def_icons.cpp
+    devices.cpp
+    disasm.cpp
+    disk.cpp
+    diskutil.cpp
+    dlopen.cpp
+    dongle.cpp
+    drawing.cpp
+    driveclick.cpp
+    enforcer.cpp
+    ethernet.cpp
+    events.cpp
+    expansion.cpp
+    fdi2raw.cpp
+    filesys.cpp
+    flashrom.cpp
+    fpp.cpp
+    fpp_native.cpp
+    fpp_softfloat.cpp
+    framebufferboards.cpp
+    fsdb.cpp
+    fsdb_unix.cpp
+    gayle.cpp
+    gfxlib.cpp
+    gfxutil.cpp
+    hardfile.cpp
+    hrtmon.rom.cpp
+    ide.cpp
+    idecontrollers.cpp
+    identify.cpp
+    ini.cpp
+    inputdevice.cpp
+    inputrecord.cpp
+    isofs.cpp
+    kbmcu/8048/co8048.cpp
+    kbmcu/keyboard_mcu_6500_1.cpp
+    kbmcu/keyboard_mcu_6805.cpp
+    kbmcu/keyboard_mcu_d8039hlc.cpp
+    kbmcu/m6805/m68emu.cpp
+    kbmcu/m6805/m68_ops.cpp
+    keybuf.cpp
+    logging.cpp
+    main.cpp
+    memory.cpp
+    missing.cpp
+    mos6502.cpp
+    native2amiga.cpp
+    newcpu.cpp
+    newcpu_common.cpp
+    readcpu.cpp
+    rommgr.cpp
+    rtc.cpp
+    savestate.cpp
+    scp.cpp
+    scsi.cpp
+    scsitape.cpp
+    statusline.cpp
+    test_card.cpp
+    tinyxml2.cpp
+    traps.cpp
+    uaeexe.cpp
+    uaelib.cpp
+    uaeresource.cpp
+    vm.cpp
+    writelog.cpp
+    zfile.cpp
+    archivers/mp2/kjmp2.cpp
+    softfloat/softfloat.cpp
+    softfloat/softfloat_decimal.cpp
+    softfloat/softfloat_fpsp.cpp
+    od-unix/charset.cpp
+    od-unix/clipboard.cpp
+    od-unix/config.cpp
+    od-unix/driveclick.cpp
+    od-unix/dlopen.cpp
+    od-unix/filesys_host.cpp
+    od-unix/graphics.cpp
+    od-unix/gui.cpp
+    od-unix/hardfile_host.cpp
+    od-unix/input.cpp
+    od-unix/logging.cpp
+    od-unix/mman.cpp
+    od-unix/path_expand.cpp
+    od-unix/parallel.cpp
+    od-unix/romscan.cpp
+    od-unix/rtg.cpp
+    od-unix/screenshot.cpp
+    od-unix/serial.cpp
+    od-unix/sound.cpp
+    od-unix/stubs.cpp
+    od-unix/support.cpp
+    od-unix/threading.cpp
+    od-unix/time.cpp
+)
+
+list(REMOVE_DUPLICATES WINUAE_UNIX_EXTRA_SOURCES)
+list(APPEND WINUAE_CORE_SOURCES ${WINUAE_UNIX_EXTRA_SOURCES})
+target_sources(winuae_core PRIVATE ${WINUAE_CORE_SOURCES})
+
+if(WINUAE_UNIX_BUILD_EXECUTABLE)
+    add_executable(winuae_unix $<TARGET_OBJECTS:winuae_core>)
+    if(WINUAE_UNIX_EXTRA_LIBRARY_DIRS)
+        target_link_directories(winuae_unix PRIVATE ${WINUAE_UNIX_EXTRA_LIBRARY_DIRS})
+    endif()
+    target_link_libraries(winuae_unix PRIVATE pthread ${CMAKE_DL_LIBS} ZLIB::ZLIB ${WINUAE_UNIX_EXTRA_LIBRARIES})
+
+    function(add_winuae_unix_smoke_target target script)
+        add_custom_target(${target}
+            COMMAND "${CMAKE_COMMAND}" -E env
+                "WINUAE_BUILD_DIR=${CMAKE_BINARY_DIR}"
+                "${CMAKE_CURRENT_SOURCE_DIR}/tools/${script}"
+            DEPENDS winuae_unix
+            WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+            COMMENT "Running ${script}"
+            VERBATIM
+        )
+    endfunction()
+
+    add_winuae_unix_smoke_target(winuae_unix_smoke_a1200 unix-smoke-a1200.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_a2065 unix-smoke-a2065.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_sana2 unix-smoke-sana2.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_driveclick unix-smoke-driveclick.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_sound_boards unix-smoke-sound-boards.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_rtg_z3 unix-smoke-rtg-z3.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_uaegfx unix-smoke-uaegfx.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_p96_guest unix-smoke-p96-guest.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_p96_guest_800x600 unix-smoke-p96-guest-800x600.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_p96_guest_16bit_modes unix-smoke-p96-guest-16bit-modes.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_p96_guest_15bit_open unix-smoke-p96-guest-15bit-open.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_p96_guest_16bit_open unix-smoke-p96-guest-16bit-open.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_p96_guest_24bit_open unix-smoke-p96-guest-24bit-open.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_p96_guest_32bit_open unix-smoke-p96-guest-32bit-open.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_p96_guest_draw_8bit unix-smoke-p96-guest-draw-8bit.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_p96_guest_draw_16bit unix-smoke-p96-guest-draw-16bit.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_p96_guest_z3 unix-smoke-p96-guest-z3.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_a4091_hdf unix-smoke-a4091-hdf.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_alfapower_hdf unix-smoke-alfapower-hdf.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_ripple_hdf unix-smoke-ripple-hdf.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_serial_tcp unix-smoke-serial-tcp.sh)
+    add_winuae_unix_smoke_target(winuae_unix_smoke_path_config unix-smoke-path-config.sh)
+    if(WINUAE_UNIX_ENABLE_JIT)
+        add_winuae_unix_smoke_target(winuae_unix_smoke_jit unix-smoke-jit.sh)
+    endif()
+    add_custom_target(winuae_unix_smoke_basic
+        DEPENDS winuae_unix_smoke_a1200 winuae_unix_smoke_path_config
+    )
+endif()
+
+add_executable(winuae_unix_path_expand_test EXCLUDE_FROM_ALL
+    od-unix/path_expand.cpp
+    od-unix/path_expand_test.cpp
+)
+target_include_directories(winuae_unix_path_expand_test PRIVATE
+    "${CMAKE_CURRENT_SOURCE_DIR}/od-unix"
+    "${CMAKE_CURRENT_SOURCE_DIR}/include"
+)
+winuae_unix_register_test(winuae_unix_path_expand_test)
+
+add_executable(winuae_unix_threading_test EXCLUDE_FROM_ALL
+    od-unix/threading.cpp
+    od-unix/threading_test.cpp
+)
+target_include_directories(winuae_unix_threading_test PRIVATE
+    "${CMAKE_CURRENT_SOURCE_DIR}/od-unix"
+    "${CMAKE_CURRENT_SOURCE_DIR}"
+    "${CMAKE_CURRENT_SOURCE_DIR}/include"
+)
+target_link_libraries(winuae_unix_threading_test PRIVATE pthread)
+winuae_unix_register_test(winuae_unix_threading_test)
+
+if(WINUAE_UNIX_WITH_INTEGRATED_QT_UI AND NOT WINUAE_UNIX_WITH_QT_UI)
+    message(STATUS
+        "WINUAE_UNIX_WITH_INTEGRATED_QT_UI requires "
+        "WINUAE_UNIX_WITH_QT_UI; disabling integrated Qt UI"
+    )
+    set(WINUAE_UNIX_WITH_INTEGRATED_QT_UI OFF)
+endif()
+
+if(WINUAE_UNIX_WITH_QT_UI)
+    if(APPLE)
+        winuae_unix_macos_find_qt_frameworks(WINUAE_UNIX_QT_WIDGETS_TARGET)
+    endif()
+    if(NOT WINUAE_UNIX_QT_WIDGETS_TARGET)
+        find_package(Qt6 COMPONENTS Widgets QUIET)
+        if(Qt6_FOUND)
+            set(WINUAE_UNIX_QT_WIDGETS_TARGET Qt6::Widgets)
+        endif()
+    endif()
+    if(NOT WINUAE_UNIX_QT_WIDGETS_TARGET)
+        find_package(Qt5 COMPONENTS Widgets QUIET)
+        if(Qt5_FOUND)
+            set(WINUAE_UNIX_QT_WIDGETS_TARGET Qt5::Widgets)
+        endif()
+    endif()
+
+    if(WINUAE_UNIX_QT_WIDGETS_TARGET)
+        add_library(winuae_unix_qt_frontend STATIC
+            od-unix/qt/config.cpp
+            od-unix/qt/launcher.cpp
+            od-unix/qt/launcher_bridge.cpp
+            od-unix/qt/mount_config.cpp
+            od-unix/qt/path_utils.cpp
+            od-unix/qt/prefs_adapter.cpp
+        )
+        target_include_directories(winuae_unix_qt_frontend PRIVATE
+            "${CMAKE_CURRENT_SOURCE_DIR}/od-unix"
+            "${CMAKE_CURRENT_SOURCE_DIR}"
+            "${CMAKE_CURRENT_SOURCE_DIR}/include"
+        )
+        target_compile_definitions(winuae_unix_qt_frontend PRIVATE
+            WINUAE_UNIX_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}"
+            WINUAE_UNIX_INSTALL_DATA_DIR="${CMAKE_INSTALL_FULL_DATADIR}/winuae"
+            WINUAE_UNIX_INSTALL_DATADIR_RELATIVE="${CMAKE_INSTALL_DATADIR}/winuae"
+            WINUAE_UNIX_VERSION_MAJOR=${WINUAE_UNIX_VERSION_MAJOR}
+            WINUAE_UNIX_VERSION_MINOR=${WINUAE_UNIX_VERSION_MINOR}
+            WINUAE_UNIX_VERSION_REVISION=${WINUAE_UNIX_VERSION_REVISION}
+            UAE_UNIX_WITH_SANA2=$<BOOL:${WINUAE_UNIX_ENABLE_SANA2}>
+            UAE_UNIX_WITH_UAENET_PCAP=$<BOOL:${WINUAE_UNIX_ENABLE_UAENET_PCAP}>
+            UAE_UNIX_WITH_BSDSOCKET=$<BOOL:${WINUAE_UNIX_ENABLE_BSDSOCKET}>
+            UAE_UNIX_WITH_UAESCSI=$<BOOL:${WINUAE_UNIX_ENABLE_UAESCSI}>
+            UAE_UNIX_WITH_SAMPLER=$<BOOL:${WINUAE_UNIX_ENABLE_SAMPLER}>
+            UAE_UNIX_WITH_NATIVE_HARDDRIVES=$<BOOL:${WINUAE_UNIX_ENABLE_NATIVE_HARDDRIVES}>
+            UAE_UNIX_WITH_NATIVE_SCSI=$<BOOL:${WINUAE_UNIX_ENABLE_NATIVE_SCSI}>
+            UAE_UNIX_WITH_MIDI=$<BOOL:${WINUAE_UNIX_ENABLE_MIDI}>
+            UAE_UNIX_WITH_DSP=$<BOOL:${WINUAE_UNIX_ENABLE_DSP}>
+            UAE_UNIX_WITH_SNDBOARD=$<BOOL:${WINUAE_UNIX_ENABLE_SNDBOARD}>
+            UAE_UNIX_WITH_GFXBOARD=$<BOOL:${WINUAE_UNIX_ENABLE_GFXBOARD}>
+            UAE_UNIX_WITH_X86=$<BOOL:${WINUAE_UNIX_ENABLE_X86}>
+            UAE_UNIX_WITH_DRACO=$<BOOL:${WINUAE_UNIX_ENABLE_DRACO}>
+            UAE_UNIX_WITH_JIT=$<BOOL:${WINUAE_UNIX_ENABLE_JIT}>
+            UAE_UNIX_WITH_AVIOUTPUT=$<BOOL:${WINUAE_UNIX_ENABLE_AVIOUTPUT}>
+            UAE_UNIX_WITH_SHADER_PIPELINE=$<BOOL:${WINUAE_UNIX_ENABLE_SHADER_PIPELINE}>
+            ${WINUAE_UNIX_MIDI_QT_DEFINITIONS}
+        )
+        if(WINUAE_UNIX_MIDI_INCLUDE_DIRS)
+            target_include_directories(winuae_unix_qt_frontend PRIVATE ${WINUAE_UNIX_MIDI_INCLUDE_DIRS})
+        endif()
+        if(WINUAE_UNIX_MIDI_COMPILE_OPTIONS)
+            target_compile_options(winuae_unix_qt_frontend PRIVATE ${WINUAE_UNIX_MIDI_COMPILE_OPTIONS})
+        endif()
+        target_link_libraries(winuae_unix_qt_frontend PUBLIC ${WINUAE_UNIX_QT_WIDGETS_TARGET})
+        if(WINUAE_UNIX_MIDI_LIBRARY_DIRS)
+            target_link_directories(winuae_unix_qt_frontend PUBLIC ${WINUAE_UNIX_MIDI_LIBRARY_DIRS})
+        endif()
+        if(WINUAE_UNIX_MIDI_LIBRARIES)
+            target_link_libraries(winuae_unix_qt_frontend PUBLIC ${WINUAE_UNIX_MIDI_LIBRARIES})
+        endif()
+        if(WINUAE_UNIX_SDL3_TARGET)
+            target_compile_definitions(winuae_unix_qt_frontend PRIVATE UAE_UNIX_WITH_SDL3=1)
+            target_link_libraries(winuae_unix_qt_frontend PUBLIC ${WINUAE_UNIX_SDL3_TARGET})
+        elseif(SDL3_FOUND)
+            target_compile_definitions(winuae_unix_qt_frontend PRIVATE UAE_UNIX_WITH_SDL3=1)
+            target_include_directories(winuae_unix_qt_frontend PRIVATE ${SDL3_INCLUDE_DIRS})
+            target_compile_options(winuae_unix_qt_frontend PRIVATE ${SDL3_CFLAGS_OTHER})
+            target_link_libraries(winuae_unix_qt_frontend PUBLIC ${SDL3_LIBRARIES})
+            if(SDL3_LIBRARY_DIRS)
+                target_link_directories(winuae_unix_qt_frontend PUBLIC ${SDL3_LIBRARY_DIRS})
+            endif()
+        endif()
+
+        add_executable(winuae_unix_qt_config_test EXCLUDE_FROM_ALL
+            od-unix/qt/config.cpp
+            od-unix/qt/config_roundtrip_test.cpp
+        )
+        target_link_libraries(winuae_unix_qt_config_test PRIVATE ${WINUAE_UNIX_QT_WIDGETS_TARGET})
+        winuae_unix_register_test(winuae_unix_qt_config_test)
+
+        add_executable(winuae_unix_qt_mount_config_test EXCLUDE_FROM_ALL
+            od-unix/qt/mount_config.cpp
+            od-unix/qt/mount_config_test.cpp
+        )
+        target_link_libraries(winuae_unix_qt_mount_config_test PRIVATE ${WINUAE_UNIX_QT_WIDGETS_TARGET})
+        winuae_unix_register_test(winuae_unix_qt_mount_config_test)
+
+        add_executable(winuae_unix_qt_prefs_adapter_test EXCLUDE_FROM_ALL
+            od-unix/qt/config.cpp
+            od-unix/qt/prefs_adapter.cpp
+            od-unix/qt/prefs_adapter_test.cpp
+        )
+        target_include_directories(winuae_unix_qt_prefs_adapter_test PRIVATE
+            "${CMAKE_CURRENT_SOURCE_DIR}/od-unix"
+            "${CMAKE_CURRENT_SOURCE_DIR}"
+            "${CMAKE_CURRENT_SOURCE_DIR}/include"
+        )
+        target_link_libraries(winuae_unix_qt_prefs_adapter_test PRIVATE ${WINUAE_UNIX_QT_WIDGETS_TARGET})
+        winuae_unix_register_test(winuae_unix_qt_prefs_adapter_test)
+
+        add_executable(winuae_unix_qt_path_utils_test EXCLUDE_FROM_ALL
+            od-unix/qt/path_utils.cpp
+            od-unix/qt/path_utils_test.cpp
+        )
+        target_link_libraries(winuae_unix_qt_path_utils_test PRIVATE ${WINUAE_UNIX_QT_WIDGETS_TARGET})
+        winuae_unix_register_test(winuae_unix_qt_path_utils_test)
+
+        if(WINUAE_UNIX_WITH_INTEGRATED_QT_UI)
+            target_compile_definitions(winuae_core PRIVATE WINUAE_UNIX_WITH_INTEGRATED_QT_UI=1)
+            if(TARGET winuae_unix)
+                target_link_libraries(winuae_unix PRIVATE winuae_unix_qt_frontend)
+            endif()
+        endif()
+    else()
+        message(STATUS "Qt Widgets not found; skipping Unix Qt targets")
+    endif()
+endif()
+
+if(WINUAE_UNIX_TEST_TARGETS)
+    add_custom_target(winuae_unix_tests
+        DEPENDS ${WINUAE_UNIX_TEST_TARGETS}
+    )
+    if(BUILD_TESTING)
+        add_custom_target(winuae_unix_check
+            COMMAND "${CMAKE_CTEST_COMMAND}" --output-on-failure
+            DEPENDS winuae_unix_tests
+            WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
+            COMMENT "Running Unix host tests"
+            VERBATIM
+        )
+    endif()
+endif()
+
+add_custom_target(winuae_unix_linux_package_metadata_check
+    COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/unix-check-linux-package-metadata.sh" "${CMAKE_CURRENT_SOURCE_DIR}"
+    COMMENT "Checking Linux install and package metadata"
+    VERBATIM
+)
+
+if(APPLE)
+    add_custom_target(winuae_unix_macos_deps
+        COMMAND "${CMAKE_COMMAND}" -E env
+            "WINUAE_MACOS_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}"
+            "${CMAKE_CURRENT_SOURCE_DIR}/tools/macos-build-deps.sh" "${WINUAE_UNIX_MACOS_DEPS_PREFIX}"
+        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+        COMMENT "Building private macOS dependencies for deployment target ${CMAKE_OSX_DEPLOYMENT_TARGET}"
+        VERBATIM
+    )
+    add_custom_target(winuae_unix_macos_qemu_deps
+        COMMAND "${CMAKE_COMMAND}" -E env
+            "WINUAE_MACOS_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}"
+            "${CMAKE_CURRENT_SOURCE_DIR}/tools/macos-build-qemu-deps.sh" "${WINUAE_QEMU_UAE_DEPS_PREFIX}"
+        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+        COMMENT "Building private macOS QEMU-UAE dependencies for deployment target ${CMAKE_OSX_DEPLOYMENT_TARGET}"
+        VERBATIM
+    )
+endif()
+
+if(WINUAE_QEMU_UAE_PLUGIN_FILE)
+    get_filename_component(WINUAE_QEMU_UAE_PLUGIN_PATH
+        "${WINUAE_QEMU_UAE_PLUGIN_FILE}" ABSOLUTE
+        BASE_DIR "${CMAKE_BINARY_DIR}")
+else()
+    set(WINUAE_QEMU_UAE_PLUGIN_PATH "${CMAKE_BINARY_DIR}/qemu-uae.so")
+endif()
+if(UNIX
+    AND WINUAE_UNIX_WITH_PPC_QEMU
+    AND WINUAE_UNIX_BUILD_QEMU_UAE_PLUGIN
+    AND EXISTS "${WINUAE_QEMU_UAE_SOURCE_DIR}/configure-qemu-uae")
+    add_custom_target(winuae_unix_qemu_uae_plugin
+        COMMAND "${CMAKE_COMMAND}" -E env
+            "WINUAE_MACOS_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}"
+            "QEMU_UAE_DEPS_PREFIX=${WINUAE_QEMU_UAE_DEPS_PREFIX}"
+            "${CMAKE_CURRENT_SOURCE_DIR}/tools/build-qemu-uae.sh"
+            "${WINUAE_QEMU_UAE_SOURCE_DIR}"
+            "${WINUAE_QEMU_UAE_PLUGIN_PATH}"
+        WORKING_DIRECTORY "${WINUAE_QEMU_UAE_SOURCE_DIR}"
+        COMMENT "Building QEMU-UAE PPC plugin"
+        VERBATIM
+    )
+endif()
+
+if(WINUAE_UNIX_WITH_PPC_QEMU)
+    if(WINUAE_QEMU_UAE_PLUGIN_FILE)
+        if(NOT EXISTS "${WINUAE_QEMU_UAE_PLUGIN_PATH}")
+            message(FATAL_ERROR
+                "WINUAE_QEMU_UAE_PLUGIN_FILE does not exist: "
+                "${WINUAE_QEMU_UAE_PLUGIN_PATH}")
+        endif()
+    endif()
+    set(WINUAE_UNIX_QEMU_UAE_PACKAGE_CHECK_DEPS)
+    if(TARGET winuae_unix_qemu_uae_plugin)
+        list(APPEND WINUAE_UNIX_QEMU_UAE_PACKAGE_CHECK_DEPS
+            winuae_unix_qemu_uae_plugin)
+    endif()
+    add_custom_target(winuae_unix_qemu_uae_package_check
+        COMMAND sh "${CMAKE_CURRENT_SOURCE_DIR}/tools/require-qemu-uae-plugin.sh"
+                "${WINUAE_QEMU_UAE_PLUGIN_PATH}"
+        DEPENDS ${WINUAE_UNIX_QEMU_UAE_PACKAGE_CHECK_DEPS}
+        COMMENT "Checking packaged QEMU-UAE PPC plugin"
+        VERBATIM
+    )
+endif()
+
+if(TARGET winuae_unix AND NOT APPLE)
+    install(PROGRAMS "$<TARGET_FILE:winuae_unix>"
+        DESTINATION "${CMAKE_INSTALL_BINDIR}"
+        RENAME winuae
+    )
+    install(FILES README_unix.md
+        DESTINATION "${CMAKE_INSTALL_DOCDIR}"
+    )
+    install(DIRECTORY od-win32/resources/
+        DESTINATION "${CMAKE_INSTALL_DATADIR}/winuae/od-win32/resources"
+        PATTERN "*.rc" EXCLUDE
+        PATTERN "*.manifest" EXCLUDE
+        PATTERN "resource.h" EXCLUDE
+    )
+    if(WINUAE_UNIX_WITH_PPC_QEMU)
+        install(FILES "${WINUAE_QEMU_UAE_PLUGIN_PATH}"
+            DESTINATION "${WINUAE_UNIX_INSTALL_PLUGINDIR_RELATIVE}"
+        )
+    endif()
+    if(NOT APPLE)
+        install(FILES od-unix/share/applications/net.winuae.WinUAE.desktop
+            DESTINATION "${CMAKE_INSTALL_DATADIR}/applications"
+        )
+        install(FILES od-unix/share/mime/packages/net.winuae.WinUAE.xml
+            DESTINATION "${CMAKE_INSTALL_DATADIR}/mime/packages"
+        )
+        install(FILES od-win32/resources/amiga.png
+            DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/256x256/apps"
+            RENAME winuae.png
+        )
+        install(FILES od-win32/resources/amiga.png
+            DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/256x256/mimetypes"
+            RENAME application-x-winuae-config.png
+        )
+    endif()
+endif()
+
+if(APPLE AND TARGET winuae_unix)
+    set(WINUAE_UNIX_MACOS_APP_DEPS winuae_unix)
+    if(TARGET winuae_unix_qemu_uae_plugin)
+        list(APPEND WINUAE_UNIX_MACOS_APP_DEPS winuae_unix_qemu_uae_plugin)
+    endif()
+    if(TARGET winuae_unix_qemu_uae_package_check)
+        list(APPEND WINUAE_UNIX_MACOS_APP_DEPS
+            winuae_unix_qemu_uae_package_check)
+    endif()
+    add_custom_target(winuae_unix_macos_app
+        COMMAND "${CMAKE_COMMAND}" -E env
+            "WINUAE_QEMU_UAE_PLUGIN=${WINUAE_QEMU_UAE_PLUGIN_PATH}"
+            "${CMAKE_CURRENT_SOURCE_DIR}/tools/macos-bundle.sh" "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/package"
+        DEPENDS ${WINUAE_UNIX_MACOS_APP_DEPS}
+        COMMENT "Creating WinUAE.app"
+        VERBATIM
+    )
+    add_custom_target(winuae_unix_macos_dmg
+        COMMAND "${CMAKE_COMMAND}" -E env
+            "WINUAE_QEMU_UAE_PLUGIN=${WINUAE_QEMU_UAE_PLUGIN_PATH}"
+            "${CMAKE_CURRENT_SOURCE_DIR}/tools/macos-dmg.sh" "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/package"
+        DEPENDS winuae_unix_macos_app
+        COMMENT "Creating WinUAE drag-install DMG"
+        VERBATIM
+    )
+    if(TARGET winuae_unix_qt_frontend AND WINUAE_UNIX_WITH_INTEGRATED_QT_UI)
+        add_custom_target(winuae_unix_macos_app_smoke
+            COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/macos-smoke-app.sh" "${CMAKE_BINARY_DIR}/package/WinUAE.app"
+            DEPENDS winuae_unix_macos_app
+            COMMENT "Smoke testing packaged WinUAE.app Qt launch"
+            VERBATIM
+        )
+        add_custom_target(winuae_unix_macos_release_check
+            COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/macos-smoke-app.sh" "${CMAKE_BINARY_DIR}/package/WinUAE.app"
+            DEPENDS winuae_unix_macos_dmg
+            COMMENT "Release checking packaged WinUAE DMG and Qt app launch"
+            VERBATIM
+        )
+    else()
+        add_custom_target(winuae_unix_macos_release_check
+            COMMAND "${CMAKE_COMMAND}" -E echo "Qt integrated UI is disabled; release check is limited to DMG verification"
+            DEPENDS winuae_unix_macos_dmg
+            COMMENT "Release checking packaged WinUAE DMG"
+            VERBATIM
+        )
+    endif()
+endif()
+
+if(NOT APPLE)
+    set(CPACK_PACKAGE_NAME "WinUAE")
+    set(CPACK_PACKAGE_VENDOR "WinUAE")
+    set(CPACK_PACKAGE_VERSION "${WINUAE_UNIX_VERSION}")
+    set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "WinUAE Unix port")
+    set(CPACK_PACKAGE_CONTACT "https://www.winuae.net/")
+    set(CPACK_PACKAGE_FILE_NAME "WinUAE-${WINUAE_UNIX_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
+    set(CPACK_PACKAGING_INSTALL_PREFIX "/usr")
+    set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README_unix.md")
+    set(CPACK_GENERATOR "TGZ")
+    if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+        list(APPEND CPACK_GENERATOR "DEB")
+        set(CPACK_DEBIAN_PACKAGE_NAME "winuae")
+        set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
+        set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://www.winuae.net/")
+        set(CPACK_DEBIAN_PACKAGE_MAINTAINER "WinUAE")
+        set(CPACK_DEBIAN_PACKAGE_SECTION "emulators")
+        set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
+        set(CPACK_DEBIAN_PACKAGE_RECOMMENDS
+            "desktop-file-utils, shared-mime-info, hicolor-icon-theme"
+        )
+        set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
+        set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
+            "${CMAKE_CURRENT_SOURCE_DIR}/packaging/debian/postinst"
+            "${CMAKE_CURRENT_SOURCE_DIR}/packaging/debian/postrm"
+        )
+    endif()
+    include(CPack)
+    if(TARGET package AND TARGET winuae_unix)
+        add_dependencies(package winuae_unix)
+    endif()
+    if(TARGET package AND TARGET winuae_unix_qemu_uae_plugin)
+        add_dependencies(package winuae_unix_qemu_uae_plugin)
+    endif()
+    if(TARGET package AND TARGET winuae_unix_qemu_uae_package_check)
+        add_dependencies(package winuae_unix_qemu_uae_package_check)
+    endif()
+endif()
index 78c4d1d6e63517031d94d3fe01cbefe24108f867..ce32c241ef6722eaf2292b05cf04d9d8b8bada55 100644 (file)
 typedef long uae_atomic;
 typedef int boolean;
 
-#ifdef WINUAE_UNIX_WITH_GFXBOARD
+#ifdef GFXBOARD
 typedef int8_t INT8;
 typedef uint8_t UINT8;
 typedef int16_t INT16;