summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Kundiman <erik@megapahit.org>2025-07-07 22:32:30 +0800
committerErik Kundiman <erik@megapahit.org>2025-07-07 22:32:30 +0800
commit2c3bebeec7c7490b5f2f22ee542ba99aeebfcb19 (patch)
tree1fe9a6ad1f96a37291c9c9a859c7fee16bde3b83
parentdba8e9044e589e25665c7bb32adef811903dec86 (diff)
Get the viewer installable on Debian arm64
The Debian version supported is 13 (trixie), because that's the version I could install on my M1, hence the Boost default version is 1.83 & we can use system's OpenJPEG 2.5.3. Somehow CMake's FindOpenGL wasn't effective, but we can get around this by setting the GL libraries paths when running cmake. Debian aarch64 suffers from the same problem Fedora aarch64 had when compiling libcurl, and it's assumed that it's Linux aarch64 thing. When trying to build ColladaDOM when building the viewer, it couldn't find Boost somehow, so building ColladaDOM is done in configuration stage instead. Upstream Variables.cmake is full of assumptions regarding architecture, and ARCH is used in many places already for Debian/Ubuntu, so we have to make sure ARCH is set with the correct value at the root level. Pipewire on trixie is also too new, so it's cancelled here. Some dependencies have the t64 suffixes on them, just like the currently supported Ubuntu (because I guess 24.04 *is*, based on trixie). The executable still crashes when launched on my M1, however, but we'll commit the progress so far for now.
-rw-r--r--README.md14
-rw-r--r--indra/cmake/CURL.cmake2
-rw-r--r--indra/cmake/LLPrimitive.cmake2
-rw-r--r--indra/cmake/OpenJPEG.cmake4
-rw-r--r--indra/cmake/Variables.cmake1
-rw-r--r--indra/cmake/WebRTC.cmake2
-rw-r--r--indra/llprimitive/CMakeLists.txt4
-rw-r--r--indra/media_plugins/cef/CMakeLists.txt4
-rw-r--r--indra/newview/CMakeLists.txt14
9 files changed, 34 insertions, 13 deletions
diff --git a/README.md b/README.md
index e32fda0b45..d174a1d828 100644
--- a/README.md
+++ b/README.md
@@ -37,7 +37,19 @@ $ sudo pacman -U megapahit-`cat newview/viewer_version.txt|sed 's/\(.*\)\./\1-/'
$ megapahit
```
-### Debian
+### Debian aarch64
+
+```
+$ sudo apt install cmake pkg-config libxml2-utils libalut-dev libaprutil1-dev libboost-fiber-dev libboost-json-dev libboost-program-options-dev libboost-regex-dev libboost-url-dev libexpat1-dev libfltk1.3-dev libfontconfig-dev libfreetype-dev libglu1-mesa-dev libhunspell-dev libjpeg-dev libmeshoptimizer-dev libminizip-dev libnghttp2-dev libopenjp2-7-dev libpipewire-0.3-dev libpng-dev libsdl2-dev libvlc-dev libvlccore-dev libvorbis-dev libxft-dev libxml2-dev libxxhash-dev
+$ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1"
+$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON -DOPENGL_glu_LIBRARY:FILEPATH=/usr/lib/aarch64-linux-gnu/libGLU.so -DOPENGL_glx_LIBRARY:FILEPATH=/usr/lib/aarch64-linux-gnu/libGLX.so -DOPENGL_opengl_LIBRARY:FILEPATH=/usr/lib/aarch64-linux-gnu/libOpenGL.so ../indra
+$ make -j`nproc`
+$ cpack -G DEB
+$ sudo apt install ./megapahit-`cat newview/viewer_version.txt`-Linux.deb
+$ megapahit
+```
+
+### Debian x86-64
```
$ sudo apt install cmake pkg-config libxml2-utils libalut-dev libaprutil1-dev libboost-fiber1.81-dev libboost-json1.81-dev libboost-program-options1.81-dev libboost-regex1.81-dev libboost-url1.81-dev libexpat1-dev libfltk1.3-dev libfontconfig-dev libfreetype-dev libglu1-mesa-dev libhunspell-dev libjpeg-dev libmeshoptimizer-dev libminizip-dev libnghttp2-dev libpipewire-0.3-dev libpng-dev libsdl2-dev libvlc-dev libvlccore-dev libvorbis-dev libxft-dev libxml2-dev libxxhash-dev
diff --git a/indra/cmake/CURL.cmake b/indra/cmake/CURL.cmake
index 211c3ae9a0..f8048ab324 100644
--- a/indra/cmake/CURL.cmake
+++ b/indra/cmake/CURL.cmake
@@ -37,7 +37,7 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA
INPUT ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1.tar.gz
DESTINATION ${CMAKE_BINARY_DIR}
)
- if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64 AND (${LINUX_DISTRO} MATCHES fedora))
+ if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)
execute_process(
COMMAND sed -i netrc.c -e "s/defined(HAVE_GETPWUID_R)/0/g" netrc.c
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1/curl/lib
diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake
index e6adea477f..b092f064c2 100644
--- a/indra/cmake/LLPrimitive.cmake
+++ b/indra/cmake/LLPrimitive.cmake
@@ -18,7 +18,7 @@ if( USE_CONAN )
"${CONAN_INCLUDE_DIRS_COLLADADOM}/collada-dom/1.4/" )
endif()
-if (LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD)
+if (LINUX AND NOT (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES aarch64) OR CMAKE_SYSTEM_NAME MATCHES FreeBSD)
# Build of the collada-dom for Linux and FreeBSD is done in
# indra/llprimitive/CMakeLists.txt
return()
diff --git a/indra/cmake/OpenJPEG.cmake b/indra/cmake/OpenJPEG.cmake
index 5729f6a10e..94dcde0d5c 100644
--- a/indra/cmake/OpenJPEG.cmake
+++ b/indra/cmake/OpenJPEG.cmake
@@ -19,7 +19,7 @@ if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKIN
DESTINATION ${CMAKE_BINARY_DIR}
)
- if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu))
+ if (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR (${LINUX_DISTRO} MATCHES ubuntu))
try_compile(OPENJPEG_RESULT
PROJECT OPENJPEG
SOURCE_DIR ${CMAKE_BINARY_DIR}/openjpeg-2.5.3
@@ -61,7 +61,7 @@ if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKIN
file(WRITE ${PREBUILD_TRACKING_DIR}/openjpeg_installed "${openjpeg_installed}")
endif ()
-if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu))
+if (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR (${LINUX_DISTRO} MATCHES ubuntu))
target_link_libraries(ll::openjpeg INTERFACE openjp2 )
else ()
include(FindPkgConfig)
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index c287f135fe..0720bbf53b 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -118,6 +118,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
else (ADDRESS_SIZE EQUAL 32)
set(DEB_ARCHITECTURE amd64)
set(FIND_LIBRARY_USE_LIB64_PATHS ON)
+ set(ARCH ${CMAKE_SYSTEM_PROCESSOR})
endif (ADDRESS_SIZE EQUAL 32)
execute_process(COMMAND dpkg-architecture -a${DEB_ARCHITECTURE} -qDEB_HOST_MULTIARCH
diff --git a/indra/cmake/WebRTC.cmake b/indra/cmake/WebRTC.cmake
index 5a750fe7f3..a7f43be13e 100644
--- a/indra/cmake/WebRTC.cmake
+++ b/indra/cmake/WebRTC.cmake
@@ -6,7 +6,7 @@ include_guard()
add_library( ll::webrtc INTERFACE IMPORTED )
target_include_directories( ll::webrtc SYSTEM INTERFACE "${LIBS_PREBUILT_DIR}/include/webrtc" "${LIBS_PREBUILT_DIR}/include/webrtc/third_party/abseil-cpp")
-if (${LINUX_DISTRO} MATCHES debian OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64 OR WINDOWS)
+if (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES x86-64 OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64 OR WINDOWS)
use_prebuilt_binary(webrtc)
elseif (NOT (CMAKE_SYSTEM_NAME MATCHES FreeBSD OR ($ENV{MSYSTEM_CARCH} MATCHES aarch64)))
target_compile_definitions(ll::webrtc INTERFACE CM_WEBRTC=1)
diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt
index 00d821c470..627f3513dc 100644
--- a/indra/llprimitive/CMakeLists.txt
+++ b/indra/llprimitive/CMakeLists.txt
@@ -11,7 +11,7 @@ include(LLPrimitive)
include(GLM)
include(TinyGLTF)
-if(LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD )
+if (LINUX AND NOT (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES aarch64) OR CMAKE_SYSTEM_NAME MATCHES FreeBSD)
set_property(DIRECTORY APPEND
PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/../patches/collada-dom-v2.3-r8.patch)
prepare_thirdparty(
@@ -30,7 +30,7 @@ if(LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD )
${colladadom_SOURCE_DIR}/include/1.4
)
target_link_libraries( ll::colladadom INTERFACE collada14dom )
-endif(LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD )
+endif ()
set(llprimitive_SOURCE_FILES
lldaeloader.cpp
diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt
index 97b82ba050..304d387eea 100644
--- a/indra/media_plugins/cef/CMakeLists.txt
+++ b/indra/media_plugins/cef/CMakeLists.txt
@@ -49,7 +49,7 @@ if (LINUX)
linux/volume_catcher_pipewire.cpp
)
- if (NOT (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu)))
+ if (NOT (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR (${LINUX_DISTRO} MATCHES ubuntu)))
message( "Building with Linux volume catcher for PulseAudio only and cancelling PipeWire" )
list(REMOVE_ITEM LINUX_VOLUME_CATCHER linux/volume_catcher_pipewire.cpp)
endif ()
@@ -76,7 +76,7 @@ add_library(media_plugin_cef
${media_plugin_cef_SOURCE_FILES}
)
-if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu))
+if (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR (${LINUX_DISTRO} MATCHES ubuntu))
target_compile_definitions(media_plugin_cef PRIVATE USE_VOLUME_CATCHER_PW=1)
endif ()
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 66806dccea..5e9a59a0e5 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -2280,8 +2280,11 @@ if (LINUX)
)
elseif (${LINUX_DISTRO} MATCHES debian OR ${LINUX_DISTRO} MATCHES ubuntu)
set(CPACK_BINARY_DEB ON CACHE BOOL "Able to package Debian DEB.")
- set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE amd64
- CACHE STRING "Debian package architecture.")
+ if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)
+ set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE arm64 CACHE STRING "Debian package architecture.")
+ elseif (CMAKE_SYSTEM_PROCESSOR MATCHES x86_64)
+ set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE amd64 CACHE STRING "Debian package architecture.")
+ endif ()
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_COMMENT}
CACHE STRING "Debian package description.")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER $ENV{USER}@${VIEWER_PACKAGE_DOMAIN_NAME}
@@ -2289,8 +2292,13 @@ if (LINUX)
set(CPACK_DEBIAN_PACKAGE_SECTION net
CACHE STRING "Debian package section.")
if (${LINUX_DISTRO} MATCHES debian)
- set(CPACK_DEBIAN_PACKAGE_DEPENDS "libalut0, libaprutil1, libboost-fiber1.81.0, libboost-filesystem1.81.0, libboost-program-options1.81.0, libboost-regex1.81.0, libboost-thread1.81.0, libboost-url1.81.0, libexpat1, libfltk1.3, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1, libnghttp2-14, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base"
+ if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)
+ set(CPACK_DEBIAN_PACKAGE_DEPENDS "libalut0, libaprutil1t64, libboost-fiber1.83.0, libboost-filesystem1.83.0, libboost-program-options1.83.0, libboost-regex1.83.0, libboost-thread1.83.0, libboost-url1.83.0, libexpat1, libfltk1.3t64, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1t64, libnghttp2-14, libopenjp2-7, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base"
+ CACHE STRING "Debian package dependencies.")
+ else ()
+ set(CPACK_DEBIAN_PACKAGE_DEPENDS "libalut0, libaprutil1, libboost-fiber1.81.0, libboost-filesystem1.81.0, libboost-program-options1.81.0, libboost-regex1.81.0, libboost-thread1.81.0, libboost-url1.81.0, libexpat1, libfltk1.3, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1, libnghttp2-14, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base"
CACHE STRING "Debian package dependencies.")
+ endif ()
else ()
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libaprutil1t64, libboost-fiber1.83.0, libboost-filesystem1.83.0, libboost-program-options1.83.0, libboost-regex1.83.0, libboost-thread1.83.0, libboost-url1.83.0, libexpat1, libfltk1.3t64, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1, libnghttp2-14, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base"
CACHE STRING "Debian package dependencies.")