@@ -99,7 +99,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL Android)
9999endif ()
100100
101101if (
102- ((APPLE AND NOT IOS ) OR WIN32 OR ANDROID )
102+ (DEFINED ENV{BUILDENV_URL} OR (APPLE AND NOT IOS ) OR WIN32 OR ANDROID )
103103 AND NOT IS_DIRECTORY "${MIXXX_VCPKG_ROOT} "
104104)
105105 if (NOT DEFINED BUILDENV_BASEPATH)
@@ -403,6 +403,7 @@ endif()
403403include (CMakeDependentOption )
404404
405405option (QT6 "Build with Qt6" ON )
406+ option (MIXXX_APPIMAGE "Build for AppImage distribution (bundle dlopen dependencies)" OFF )
406407cmake_dependent_option (
407408 QML
408409 "Build with QML"
@@ -540,6 +541,19 @@ include(GNUInstallDirs)
540541include (DefaultOption )
541542include (IsStaticLibrary )
542543
544+ if (DEFINED MIXXX_VCPKG_ROOT AND UNIX AND NOT APPLE )
545+ # Prepend system paths to find the system's shared GLib instead of the
546+ # vcpkg static GLib (which causes constructor-ordering issues when linked
547+ # alongside static FFmpeg via LINK_GROUP:RESCAN).
548+ # CMAKE_LIBRARY_ARCHITECTURE is set automatically on Debian-based systems.
549+ if (CMAKE_LIBRARY_ARCHITECTURE )
550+ list (PREPEND CMAKE_PREFIX_PATH
551+ "/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE } "
552+ "/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE } /cmake"
553+ )
554+ endif ()
555+ endif ()
556+
543557# Verify VCPKG settings
544558if (DEFINED _VCPKG_INSTALLED_DIR)
545559 if (NOT EXISTS "${_VCPKG_INSTALLED_DIR} /${VCPKG_TARGET_TRIPLET} " )
@@ -2632,6 +2646,19 @@ if(UNIX AND NOT APPLE)
26322646 DESTINATION "${CMAKE_INSTALL_DATADIR} /applications"
26332647 )
26342648
2649+ # AppImage desktop file (simplified Exec=mixxx)
2650+ if (MIXXX_APPIMAGE)
2651+ set (MIXXX_APPIMAGE_DESKTOP_FILE "${CMAKE_CURRENT_BINARY_DIR } /mixxx-appimage.desktop" )
2652+ file (READ "${CMAKE_CURRENT_SOURCE_DIR } /res/linux/org.mixxx.Mixxx.desktop" MIXXX_APPIMAGE_DESKTOP_CONTENT )
2653+ string (REGEX REPLACE "\n Exec=[^\n ]*" "\n Exec=mixxx" MIXXX_APPIMAGE_DESKTOP_CONTENT "${MIXXX_APPIMAGE_DESKTOP_CONTENT} " )
2654+ file (WRITE "${MIXXX_APPIMAGE_DESKTOP_FILE} " "${MIXXX_APPIMAGE_DESKTOP_CONTENT} " )
2655+ install (
2656+ FILES "${MIXXX_APPIMAGE_DESKTOP_FILE} "
2657+ DESTINATION "${CMAKE_INSTALL_DATADIR} /applications"
2658+ RENAME "mixxx-appimage.desktop"
2659+ )
2660+ endif ()
2661+
26352662 # Icon files for menu entry
26362663 install (
26372664 DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR } /res/images/icons/"
@@ -2843,7 +2870,19 @@ if(FFMPEG)
28432870 __STDC_FORMAT_MACROS
28442871 )
28452872
2846- target_link_libraries (mixxx-lib PRIVATE FFmpeg::FFmpeg )
2873+ # Static FFmpeg libraries have cross-references (e.g. libavformat references
2874+ # av_adts_header_parse from libavcodec). LINK_GROUP:RESCAN wraps them in
2875+ # --start-group/--end-group so the GNU linker resolves these. Harmless for
2876+ # shared builds; Apple's ld64 does not support the group flags.
2877+ if (UNIX AND NOT APPLE )
2878+ target_link_libraries (
2879+ mixxx-lib
2880+ PRIVATE
2881+ "$<LINK_GROUP :RESCAN ,FFmpeg ::avformat ,FFmpeg ::avcodec ,FFmpeg ::avutil ,FFmpeg ::swresample >"
2882+ )
2883+ else ()
2884+ target_link_libraries (mixxx-lib PRIVATE FFmpeg::FFmpeg )
2885+ endif ()
28472886 target_include_directories (mixxx-lib PUBLIC "${FFmpeg_INCLUDE_DIRS} " )
28482887endif ()
28492888
@@ -5009,6 +5048,37 @@ else()
50095048 message (STATUS "Could NOT find fdk-aac (FdkAac_FOUND is FALSE)" )
50105049endif ()
50115050
5051+ # Bundle codec libraries that Mixxx loads at runtime via QLibrary (dlopen).
5052+ # The vcpkg buildenv provides static (.a) versions, but QLibrary needs the
5053+ # shared (.so.*) files with versioned sonames (e.g. libfaad.so.2).
5054+ if (MIXXX_APPIMAGE)
5055+ set (_suffixes "${CMAKE_FIND_LIBRARY_SUFFIXES } " )
5056+
5057+ # libfaad: loader always expects libfaad.so.2
5058+ set (CMAKE_FIND_LIBRARY_SUFFIXES ".so.2" )
5059+ find_library (FAAD_LIBRARY NAMES faad )
5060+ if (FAAD_LIBRARY)
5061+ install (FILES "${FAAD_LIBRARY} " DESTINATION "${CMAKE_INSTALL_LIBDIR} " )
5062+ endif ()
5063+
5064+ # libfdk-aac: loader probes .so.1 first, then .so.2 — try both
5065+ unset (FDKAAC_LIBRARY CACHE )
5066+ foreach (_soname IN ITEMS 1 2)
5067+ set (CMAKE_FIND_LIBRARY_SUFFIXES ".so.${_soname} " )
5068+ find_library (FDKAAC_LIBRARY NAMES fdk-aac )
5069+ if (FDKAAC_LIBRARY)
5070+ break ()
5071+ endif ()
5072+ endforeach ()
5073+ if (FDKAAC_LIBRARY)
5074+ install (FILES "${FDKAAC_LIBRARY} " DESTINATION "${CMAKE_INSTALL_LIBDIR} " )
5075+ else ()
5076+ message (WARNING "libfdk-aac not found — fdk-aac encoding will be unavailable in the AppImage" )
5077+ endif ()
5078+
5079+ set (CMAKE_FIND_LIBRARY_SUFFIXES "${_suffixes} " )
5080+ endif ()
5081+
50125082# Google PerfTools
50135083option (GPERFTOOLS "Google PerfTools libtcmalloc linkage" OFF )
50145084option (GPERFTOOLSPROFILER "Google PerfTools libprofiler linkage" OFF )
0 commit comments