summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorMike <contact@mikelittman.me>2026-10-05 01:44:55 -0500
committerGitHub <noreply@github.com>2026-10-05 14:44:55 +0800
commit62e2d529558ba086708025b394aa790e49076c77 (patch)
tree45a987f422b39153a36e831cf2f5b44ecb2a3b11 /indra
parentf1abdac1b155e8834acf4539a9ec00fab729d006 (diff)
Add a Homebrew macOS build beside MacPorts (#29)
Darwin CMake keeps the MacPorts Boost 1.88 -mt paths when that prefix is present. Otherwise, or when DARWIN_PACKAGE_MANAGER=homebrew, it uses brew prefixes, unsuffixed Boost libraries, and no boost_system link. Media-plugin install names, the app bundle, and freealut follow the same split. The viewer no longer links libvlc, so a finished app does not need the VLC disk image mounted.
Diffstat (limited to 'indra')
-rw-r--r--indra/cmake/Boost.cmake16
-rw-r--r--indra/cmake/DarwinPackages.cmake100
-rw-r--r--indra/cmake/Hunspell.cmake4
-rw-r--r--indra/cmake/LLPrimitive.cmake34
-rw-r--r--indra/cmake/OPENAL.cmake35
-rw-r--r--indra/cmake/Variables.cmake2
-rw-r--r--indra/cmake/xxHash.cmake4
-rw-r--r--indra/llplugin/slplugin/CMakeLists.txt2
-rw-r--r--indra/llwebrtc/CMakeLists.txt2
-rw-r--r--indra/media_plugins/cef/CMakeLists.txt66
-rw-r--r--indra/media_plugins/libvlc/CMakeLists.txt72
-rw-r--r--indra/newview/CMakeLists.txt11
-rw-r--r--indra/newview/FixBundle.cmake.in120
-rw-r--r--indra/newview/FixBundleRun.cmake3
14 files changed, 411 insertions, 60 deletions
diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake
index e260d28453..8fb359b963 100644
--- a/indra/cmake/Boost.cmake
+++ b/indra/cmake/Boost.cmake
@@ -7,9 +7,17 @@ include_guard()
add_library( ll::boost INTERFACE IMPORTED )
if (DARWIN)
- target_include_directories( ll::boost SYSTEM INTERFACE /opt/local/libexec/boost/1.88/include)
- target_link_directories( ll::boost INTERFACE /opt/local/libexec/boost/1.88/lib)
- set(sfx -mt)
+ include(DarwinPackages)
+ if (DARWIN_USE_HOMEBREW)
+ # Homebrew Boost has unsuffixed library names. Boost.System is header-only.
+ target_include_directories( ll::boost SYSTEM INTERFACE "${DARWIN_BOOST_PREFIX}/include")
+ target_link_directories( ll::boost INTERFACE "${DARWIN_BOOST_PREFIX}/lib")
+ set(sfx "")
+ else ()
+ target_include_directories( ll::boost SYSTEM INTERFACE /opt/local/libexec/boost/1.88/include)
+ target_link_directories( ll::boost INTERFACE /opt/local/libexec/boost/1.88/lib)
+ set(sfx -mt)
+ endif ()
elseif (WINDOWS)
target_include_directories( ll::boost SYSTEM INTERFACE ${prefix_result}/../include)
target_link_directories( ll::boost INTERFACE ${prefix_result})
@@ -66,7 +74,7 @@ if (NOT (${LINUX_DISTRO} MATCHES freedesktop OR (${LINUX_DISTRO} MATCHES debian
else ()
target_link_libraries( ll::boost INTERFACE boost_regex${sfx})
endif ()
- if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES fedora) OR DARWIN)
+ if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES fedora) OR (DARWIN AND NOT DARWIN_USE_HOMEBREW))
target_link_libraries( ll::boost INTERFACE boost_system${sfx})
endif ()
target_compile_definitions( ll::boost INTERFACE BOOST_BIND_GLOBAL_PLACEHOLDERS )
diff --git a/indra/cmake/DarwinPackages.cmake b/indra/cmake/DarwinPackages.cmake
new file mode 100644
index 0000000000..86632034ba
--- /dev/null
+++ b/indra/cmake/DarwinPackages.cmake
@@ -0,0 +1,100 @@
+# -*- cmake -*-
+#
+# Choose the Darwin dependency provider.
+# MacPorts stays the default when Boost 1.88 is installed at the path the
+# rest of the build has always used. Homebrew is selected otherwise, or when
+# DARWIN_PACKAGE_MANAGER is set to "homebrew".
+include_guard(GLOBAL)
+
+if (NOT DARWIN)
+ return()
+endif ()
+
+if (EXISTS "/opt/local/libexec/boost/1.88")
+ set(_darwin_pkg_default macports)
+else ()
+ set(_darwin_pkg_default homebrew)
+endif ()
+
+set(DARWIN_PACKAGE_MANAGER "${_darwin_pkg_default}" CACHE STRING
+ "Darwin dependency provider: macports or homebrew")
+set_property(CACHE DARWIN_PACKAGE_MANAGER PROPERTY STRINGS macports homebrew)
+
+if (DARWIN_PACKAGE_MANAGER STREQUAL "homebrew")
+ set(DARWIN_USE_HOMEBREW TRUE)
+ find_program(BREW_EXECUTABLE brew REQUIRED)
+ execute_process(
+ COMMAND "${BREW_EXECUTABLE}" --prefix
+ OUTPUT_VARIABLE DARWIN_HOMEBREW_PREFIX
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ COMMAND_ERROR_IS_FATAL ANY
+ )
+ execute_process(
+ COMMAND "${BREW_EXECUTABLE}" --prefix boost
+ OUTPUT_VARIABLE DARWIN_BOOST_PREFIX
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ COMMAND_ERROR_IS_FATAL ANY
+ )
+ execute_process(
+ COMMAND "${BREW_EXECUTABLE}" --prefix libnghttp2
+ OUTPUT_VARIABLE DARWIN_NGHTTP2_PREFIX
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ COMMAND_ERROR_IS_FATAL ANY
+ )
+ execute_process(
+ COMMAND "${BREW_EXECUTABLE}" --prefix apr
+ OUTPUT_VARIABLE DARWIN_APR_PREFIX
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ COMMAND_ERROR_IS_FATAL ANY
+ )
+ execute_process(
+ COMMAND "${BREW_EXECUTABLE}" --prefix apr-util
+ OUTPUT_VARIABLE DARWIN_APRUTIL_PREFIX
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ COMMAND_ERROR_IS_FATAL ANY
+ )
+ execute_process(
+ COMMAND "${BREW_EXECUTABLE}" --prefix icu4c@78
+ OUTPUT_VARIABLE DARWIN_ICU_PREFIX
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ COMMAND_ERROR_IS_FATAL ANY
+ )
+ # The macOS apr-1.pc points at /usr/include/apr-1, which is not on disk
+ # (headers live in the SDK). Prefer the Homebrew apr pkg-config files.
+ # openal-soft is keg-only, so its openal.pc is absent from the default
+ # pkg-config path until this directory is prepended. freealut.pc requires it.
+ set(_darwin_pkgconfig_dirs
+ "${DARWIN_APR_PREFIX}/lib/pkgconfig"
+ "${DARWIN_APRUTIL_PREFIX}/lib/pkgconfig"
+ )
+ execute_process(
+ COMMAND "${BREW_EXECUTABLE}" --prefix openal-soft
+ OUTPUT_VARIABLE _darwin_openal_prefix
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ RESULT_VARIABLE _darwin_openal_rc
+ )
+ if (_darwin_openal_rc EQUAL 0 AND EXISTS "${_darwin_openal_prefix}/lib/pkgconfig")
+ list(APPEND _darwin_pkgconfig_dirs "${_darwin_openal_prefix}/lib/pkgconfig")
+ endif ()
+ list(JOIN _darwin_pkgconfig_dirs ":" _darwin_pkgconfig_prefix)
+ set(ENV{PKG_CONFIG_PATH} "${_darwin_pkgconfig_prefix}:$ENV{PKG_CONFIG_PATH}")
+ if (NOT CMAKE_PREFIX_PATH MATCHES "(^|;)${DARWIN_HOMEBREW_PREFIX}(;|$)")
+ list(PREPEND CMAKE_PREFIX_PATH "${DARWIN_HOMEBREW_PREFIX}")
+ endif ()
+ # llmath headers include glm directly. A private include dir keeps Homebrew
+ # OpenSSL and other linked headers off the global search path.
+ if (EXISTS "${DARWIN_HOMEBREW_PREFIX}/include/glm/vec3.hpp")
+ set(_darwin_glm_include "${CMAKE_BINARY_DIR}/homebrew-includes")
+ file(MAKE_DIRECTORY "${_darwin_glm_include}")
+ file(REMOVE "${_darwin_glm_include}/glm")
+ file(CREATE_LINK "${DARWIN_HOMEBREW_PREFIX}/include/glm" "${_darwin_glm_include}/glm" SYMBOLIC)
+ include_directories(SYSTEM "${_darwin_glm_include}")
+ endif ()
+ set(DARWIN_BOOST_LIBRARY_SUFFIX "")
+else ()
+ set(DARWIN_USE_HOMEBREW FALSE)
+ set(DARWIN_BOOST_PREFIX "/opt/local/libexec/boost/1.88")
+ set(DARWIN_BOOST_LIBRARY_SUFFIX "-mt")
+endif ()
+
+message(STATUS "Darwin package manager: ${DARWIN_PACKAGE_MANAGER} (Boost ${DARWIN_BOOST_PREFIX}, suffix '${DARWIN_BOOST_LIBRARY_SUFFIX}')")
diff --git a/indra/cmake/Hunspell.cmake b/indra/cmake/Hunspell.cmake
index b063363bc0..be7e5b6b81 100644
--- a/indra/cmake/Hunspell.cmake
+++ b/indra/cmake/Hunspell.cmake
@@ -6,6 +6,10 @@ include_guard()
use_prebuilt_binary(dictionaries)
add_library( ll::hunspell INTERFACE IMPORTED )
+if (DARWIN_USE_HOMEBREW)
+ # hunspell.pc's -I points at include/hunspell, while the viewer includes <hunspell/hunspell.hxx>.
+ target_include_directories(ll::hunspell SYSTEM INTERFACE "${DARWIN_HOMEBREW_PREFIX}/include")
+endif ()
use_system_binary(hunspell)
use_prebuilt_binary(libhunspell)
diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake
index 144f92118b..ddcc621239 100644
--- a/indra/cmake/LLPrimitive.cmake
+++ b/indra/cmake/LLPrimitive.cmake
@@ -59,6 +59,9 @@ elseif (${LINUX_DISTRO} MATCHES freedesktop)
set(Minizip_LIBRARY_DIRS ${ARCH_PREBUILT_DIRS_RELEASE})
endif ()
pkg_search_module(Libxml2 REQUIRED libxml-2.0)
+if (Minizip_LIBRARY_DIRS)
+ target_link_directories(ll::minizip-ng INTERFACE ${Minizip_LIBRARY_DIRS})
+endif ()
target_link_libraries( ll::minizip-ng INTERFACE ${Minizip_LIBRARIES} )
target_link_libraries( ll::libxml INTERFACE ${Libxml2_LIBRARIES} )
if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/colladadom_installed OR NOT ${colladadom_installed} EQUAL 0)
@@ -102,9 +105,16 @@ if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKIN
)
endif ()
if (DARWIN)
- set(BOOST_CFLAGS -I${Libxml2_LIBRARY_DIRS}exec/boost/1.88/include)
- set(BOOST_LIBS -L${Minizip_LIBRARY_DIRS}exec/boost/1.88/lib)
- set(BOOST_LIBRARY_SUFFIX -mt)
+ include(DarwinPackages)
+ if (DARWIN_USE_HOMEBREW)
+ set(BOOST_CFLAGS -I${DARWIN_BOOST_PREFIX}/include)
+ set(BOOST_LIBS -L${DARWIN_BOOST_PREFIX}/lib)
+ set(BOOST_LIBRARY_SUFFIX "")
+ else ()
+ set(BOOST_CFLAGS -I${Libxml2_LIBRARY_DIRS}exec/boost/1.88/include)
+ set(BOOST_LIBS -L${Minizip_LIBRARY_DIRS}exec/boost/1.88/lib)
+ set(BOOST_LIBRARY_SUFFIX -mt)
+ endif ()
elseif (WINDOWS)
set(BOOST_CFLAGS -I${prefix_result}/../include)
set(BOOST_LIBS -L${prefix_result})
@@ -134,6 +144,20 @@ if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKIN
set(BOOST_LIBS -L${ARCH_PREBUILT_DIRS_RELEASE})
endif ()
file(MAKE_DIRECTORY ${LIBS_PREBUILT_DIR}/include/collada/1.4)
+ if (DARWIN AND DARWIN_USE_HOMEBREW)
+ # Boost.System is header-only here, so colladaDOM must not link it.
+ set(_collada_boost_system "")
+ if (Libxml2_INCLUDE_DIRS)
+ set(_collada_extra_cflags "-I${Libxml2_INCLUDE_DIRS}")
+ else ()
+ # A bare -I (empty Libxml2_INCLUDE_DIRS from the macOS libxml pc)
+ # would consume Boost_CFLAGS as its argument.
+ set(_collada_extra_cflags "")
+ endif ()
+ else ()
+ set(_collada_boost_system "boost_system${BOOST_LIBRARY_SUFFIX}")
+ set(_collada_extra_cflags "-I${Libxml2_INCLUDE_DIRS}")
+ endif ()
try_compile(COLLADADOM_RESULT
PROJECT colladadom
SOURCE_DIR ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r11
@@ -147,10 +171,10 @@ if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKIN
-DCMAKE_CXX_STANDARD:STRING=17
-DCMAKE_CXX_FLAGS:STRING=-I${Minizip_INCLUDE_DIRS}
-DBoost_CFLAGS:STRING=${BOOST_CFLAGS}
- -DEXTRA_COMPILE_FLAGS:STRING=-I${Libxml2_INCLUDE_DIRS}
+ -DEXTRA_COMPILE_FLAGS:STRING=${_collada_extra_cflags}
"-DCMAKE_SHARED_LINKER_FLAGS:STRING=-L${Minizip_LIBRARY_DIRS} ${BOOST_LIBS}"
-DBoost_FILESYSTEM_LIBRARY:STRING=boost_filesystem${BOOST_LIBRARY_SUFFIX}
- -DBoost_SYSTEM_LIBRARY:STRING=boost_system${BOOST_LIBRARY_SUFFIX}
+ -DBoost_SYSTEM_LIBRARY:STRING=${_collada_boost_system}
-DZLIB_LIBRARIES:STRING=${Libxml2_LIBRARIES}
-DOPT_COLLADA14:BOOL=ON
-DCOLLADA_DOM_INCLUDE_INSTALL_DIR:PATH=${LIBS_PREBUILT_DIR}/include/collada
diff --git a/indra/cmake/OPENAL.cmake b/indra/cmake/OPENAL.cmake
index 4c4be1a71e..408542fc88 100644
--- a/indra/cmake/OPENAL.cmake
+++ b/indra/cmake/OPENAL.cmake
@@ -62,6 +62,41 @@ if (USE_OPENAL)
target_link_libraries(ll::openal INTERFACE ${OPENAL_LIBRARY} ${ALUT_LIBRARY})
else ()
pkg_search_module(Openal REQUIRED freealut)
+ if (DARWIN)
+ include(DarwinPackages)
+ endif ()
+ # Homebrew freealut is built against Apple's OpenAL.framework. The
+ # viewer links openal-soft, so alutInit and alGenSources talk to
+ # different libraries and wind playback never gets a source.
+ if (DARWIN_USE_HOMEBREW)
+ set(_openal_soft "${DARWIN_HOMEBREW_PREFIX}/opt/openal-soft/lib/libopenal.1.dylib")
+ find_library(_homebrew_alut
+ NAMES libalut.0.dylib alut
+ PATHS ${Openal_LIBRARY_DIRS}
+ NO_DEFAULT_PATH
+ REQUIRED)
+ execute_process(
+ COMMAND otool -L "${_homebrew_alut}"
+ OUTPUT_VARIABLE _alut_deps
+ COMMAND_ERROR_IS_FATAL ANY)
+ if (_alut_deps MATCHES "/System/Library/Frameworks/OpenAL.framework/Versions/A/OpenAL")
+ set(_alut_dir "${CMAKE_BINARY_DIR}/openal-compat")
+ file(MAKE_DIRECTORY "${_alut_dir}")
+ set(_alut_rewritten "${_alut_dir}/libalut.0.dylib")
+ execute_process(COMMAND "${CMAKE_COMMAND}" -E copy "${_homebrew_alut}" "${_alut_rewritten}")
+ execute_process(
+ COMMAND install_name_tool
+ -change /System/Library/Frameworks/OpenAL.framework/Versions/A/OpenAL "${_openal_soft}"
+ -id "${_alut_rewritten}"
+ "${_alut_rewritten}"
+ COMMAND_ERROR_IS_FATAL ANY)
+ execute_process(
+ COMMAND codesign -f -s - "${_alut_rewritten}"
+ COMMAND_ERROR_IS_FATAL ANY)
+ list(TRANSFORM Openal_LIBRARIES REPLACE "^alut$" "${_alut_rewritten}")
+ message(STATUS "freealut retargeted onto openal-soft: ${_alut_rewritten}")
+ endif ()
+ endif ()
endif ()
target_include_directories(ll::openal SYSTEM INTERFACE ${Openal_INCLUDE_DIRS})
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index 3137dfbd7f..0d68559718 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -240,6 +240,8 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
else()
set(LL_MACOS_TEST_ARCHITECTURE "x86_64")
endif()
+
+ include(DarwinPackages)
endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
# Default deploy grid
diff --git a/indra/cmake/xxHash.cmake b/indra/cmake/xxHash.cmake
index 72758fa067..a4b86f65fc 100644
--- a/indra/cmake/xxHash.cmake
+++ b/indra/cmake/xxHash.cmake
@@ -5,6 +5,10 @@ include(Prebuilt)
include(FindPkgConfig)
pkg_check_modules(Xxhash REQUIRED libxxhash)
+if (DARWIN_USE_HOMEBREW AND Xxhash_INCLUDE_DIRS)
+ # hbxxh.cpp includes <xxhash.h>. Homebrew does not put that directory on the default search path.
+ include_directories(SYSTEM ${Xxhash_INCLUDE_DIRS})
+endif ()
return ()
use_prebuilt_binary(xxhash)
diff --git a/indra/llplugin/slplugin/CMakeLists.txt b/indra/llplugin/slplugin/CMakeLists.txt
index 68b009db0f..a32dc4cbe6 100644
--- a/indra/llplugin/slplugin/CMakeLists.txt
+++ b/indra/llplugin/slplugin/CMakeLists.txt
@@ -74,7 +74,7 @@ endif ()
if (CMAKE_BUILD_TYPE MATCHES Release AND (CMAKE_CXX_COMPILER_ID STREQUAL Clang OR CMAKE_CXX_COMPILER_ID MATCHES GNU))
add_custom_command(
TARGET ${PROJECT_NAME} POST_BUILD
- COMMAND ${CMAKE_STRIP} ${PROJECT_NAME}
+ COMMAND ${CMAKE_STRIP} "$<TARGET_FILE:${PROJECT_NAME}>"
)
endif ()
diff --git a/indra/llwebrtc/CMakeLists.txt b/indra/llwebrtc/CMakeLists.txt
index 59e44eb9ca..ffea44d09d 100644
--- a/indra/llwebrtc/CMakeLists.txt
+++ b/indra/llwebrtc/CMakeLists.txt
@@ -84,7 +84,7 @@ ADD_CUSTOM_COMMAND(TARGET llwebrtc POST_BUILD
if (CMAKE_BUILD_TYPE MATCHES Release AND (CMAKE_CXX_COMPILER_ID STREQUAL Clang OR CMAKE_CXX_COMPILER_ID MATCHES GNU))
add_custom_command(
TARGET ${PROJECT_NAME} POST_BUILD
- COMMAND ${CMAKE_STRIP} lib${PROJECT_NAME}.so
+ COMMAND ${CMAKE_STRIP} "$<TARGET_FILE:${PROJECT_NAME}>"
)
endif ()
diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt
index 88ce911dc4..e622cff2e6 100644
--- a/indra/media_plugins/cef/CMakeLists.txt
+++ b/indra/media_plugins/cef/CMakeLists.txt
@@ -104,27 +104,49 @@ elseif (DARWIN)
LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
)
- add_custom_command(TARGET ${PROJECT_NAME}
- POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL}
- -change "/opt/local/lib/libnghttp2.14.dylib" "@loader_path/libnghttp2.14.dylib"
- -change "/opt/local/lib/libaprutil-1.0.dylib" "@loader_path/libaprutil-1.0.dylib"
- -change "/opt/local/lib/libiconv.2.dylib" "@loader_path/libiconv.2.dylib"
- -change "/opt/local/lib/libapr-1.0.dylib" "@loader_path/libapr-1.0.dylib"
- -change "/opt/local/lib/libz.1.dylib" "@loader_path/libz.1.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_context-mt.dylib" "@loader_path/libboost_context-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_fiber-mt.dylib" "@loader_path/libboost_fiber-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_filesystem-mt.dylib" "@loader_path/libboost_filesystem-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_process-mt.dylib" "@loader_path/libboost_process-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_program_options-mt.dylib" "@loader_path/libboost_program_options-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_thread-mt.dylib" "@loader_path/libboost_thread-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_url-mt.dylib" "@loader_path/libboost_url-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_regex-mt.dylib" "@loader_path/libboost_regex-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_system-mt.dylib" "@loader_path/libboost_system-mt.dylib"
- -change "/opt/local/lib/libexpat.1.dylib" "@loader_path/libexpat.1.dylib"
- "$<TARGET_FILE:${PROJECT_NAME}>"
- VERBATIM
- COMMENT "Fixing paths to CEF media plugin dependencies"
- )
+ if (DARWIN_USE_HOMEBREW)
+ # Homebrew Boost has no -mt suffix and no libboost_system. iconv, expat,
+ # and zlib resolve to macOS system dylibs and stay absolute.
+ add_custom_command(TARGET ${PROJECT_NAME}
+ POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL}
+ -change "${DARWIN_NGHTTP2_PREFIX}/lib/libnghttp2.14.dylib" "@loader_path/libnghttp2.14.dylib"
+ -change "${DARWIN_APRUTIL_PREFIX}/lib/libaprutil-1.0.dylib" "@loader_path/libaprutil-1.0.dylib"
+ -change "${DARWIN_APR_PREFIX}/lib/libapr-1.0.dylib" "@loader_path/libapr-1.0.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_context.dylib" "@loader_path/libboost_context.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_fiber.dylib" "@loader_path/libboost_fiber.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_filesystem.dylib" "@loader_path/libboost_filesystem.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_process.dylib" "@loader_path/libboost_process.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_program_options.dylib" "@loader_path/libboost_program_options.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_thread.dylib" "@loader_path/libboost_thread.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_url.dylib" "@loader_path/libboost_url.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_regex.dylib" "@loader_path/libboost_regex.dylib"
+ "$<TARGET_FILE:${PROJECT_NAME}>"
+ VERBATIM
+ COMMENT "Fixing paths to CEF media plugin dependencies"
+ )
+ else ()
+ add_custom_command(TARGET ${PROJECT_NAME}
+ POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL}
+ -change "/opt/local/lib/libnghttp2.14.dylib" "@loader_path/libnghttp2.14.dylib"
+ -change "/opt/local/lib/libaprutil-1.0.dylib" "@loader_path/libaprutil-1.0.dylib"
+ -change "/opt/local/lib/libiconv.2.dylib" "@loader_path/libiconv.2.dylib"
+ -change "/opt/local/lib/libapr-1.0.dylib" "@loader_path/libapr-1.0.dylib"
+ -change "/opt/local/lib/libz.1.dylib" "@loader_path/libz.1.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_context-mt.dylib" "@loader_path/libboost_context-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_fiber-mt.dylib" "@loader_path/libboost_fiber-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_filesystem-mt.dylib" "@loader_path/libboost_filesystem-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_process-mt.dylib" "@loader_path/libboost_process-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_program_options-mt.dylib" "@loader_path/libboost_program_options-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_thread-mt.dylib" "@loader_path/libboost_thread-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_url-mt.dylib" "@loader_path/libboost_url-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_regex-mt.dylib" "@loader_path/libboost_regex-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_system-mt.dylib" "@loader_path/libboost_system-mt.dylib"
+ -change "/opt/local/lib/libexpat.1.dylib" "@loader_path/libexpat.1.dylib"
+ "$<TARGET_FILE:${PROJECT_NAME}>"
+ VERBATIM
+ COMMENT "Fixing paths to CEF media plugin dependencies"
+ )
+ endif ()
elseif (LINUX)
target_link_options(media_plugin_cef PRIVATE "LINKER:--build-id")
@@ -133,7 +155,7 @@ endif ()
if (CMAKE_BUILD_TYPE MATCHES Release AND (CMAKE_CXX_COMPILER_ID STREQUAL Clang OR CMAKE_CXX_COMPILER_ID MATCHES GNU))
add_custom_command(
TARGET ${PROJECT_NAME} POST_BUILD
- COMMAND ${CMAKE_STRIP} lib${PROJECT_NAME}.so
+ COMMAND ${CMAKE_STRIP} "$<TARGET_FILE:${PROJECT_NAME}>"
)
endif ()
diff --git a/indra/media_plugins/libvlc/CMakeLists.txt b/indra/media_plugins/libvlc/CMakeLists.txt
index 32a108429e..61801fbcb7 100644
--- a/indra/media_plugins/libvlc/CMakeLists.txt
+++ b/indra/media_plugins/libvlc/CMakeLists.txt
@@ -47,36 +47,60 @@ if (DARWIN)
LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
)
- add_custom_command(TARGET ${PROJECT_NAME}
- POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL}
- -change "/opt/local/lib/libnghttp2.14.dylib" "@loader_path/libnghttp2.14.dylib"
- -change "/opt/local/lib/libaprutil-1.0.dylib" "@loader_path/libaprutil-1.0.dylib"
- -change "/opt/local/lib/libiconv.2.dylib" "@loader_path/libiconv.2.dylib"
- -change "/opt/local/lib/libapr-1.0.dylib" "@loader_path/libapr-1.0.dylib"
- -change "/opt/local/lib/libz.1.dylib" "@loader_path/libz.1.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_context-mt.dylib" "@loader_path/libboost_context-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_fiber-mt.dylib" "@loader_path/libboost_fiber-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_filesystem-mt.dylib" "@loader_path/libboost_filesystem-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_process-mt.dylib" "@loader_path/libboost_process-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_program_options-mt.dylib" "@loader_path/libboost_program_options-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_thread-mt.dylib" "@loader_path/libboost_thread-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_url-mt.dylib" "@loader_path/libboost_url-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_regex-mt.dylib" "@loader_path/libboost_regex-mt.dylib"
- -change "/opt/local/libexec/boost/1.88/lib/libboost_system-mt.dylib" "@loader_path/libboost_system-mt.dylib"
- -change "/opt/local/lib/libexpat.1.dylib" "@loader_path/libexpat.1.dylib"
- -change "@rpath/libvlc.dylib" "@loader_path/plugins/libvlc.dylib"
- -change "@rpath/libvlccore.dylib" "@loader_path/plugins/libvlccore.dylib"
- "$<TARGET_FILE:${PROJECT_NAME}>"
- VERBATIM
- COMMENT "Fixing paths to LibVLC media plugin dependencies"
- )
+ if (DARWIN_USE_HOMEBREW)
+ # Homebrew Boost has no -mt suffix and no libboost_system. iconv, expat,
+ # and zlib resolve to macOS system dylibs and stay absolute.
+ add_custom_command(TARGET ${PROJECT_NAME}
+ POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL}
+ -change "${DARWIN_NGHTTP2_PREFIX}/lib/libnghttp2.14.dylib" "@loader_path/libnghttp2.14.dylib"
+ -change "${DARWIN_APRUTIL_PREFIX}/lib/libaprutil-1.0.dylib" "@loader_path/libaprutil-1.0.dylib"
+ -change "${DARWIN_APR_PREFIX}/lib/libapr-1.0.dylib" "@loader_path/libapr-1.0.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_context.dylib" "@loader_path/libboost_context.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_fiber.dylib" "@loader_path/libboost_fiber.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_filesystem.dylib" "@loader_path/libboost_filesystem.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_process.dylib" "@loader_path/libboost_process.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_program_options.dylib" "@loader_path/libboost_program_options.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_thread.dylib" "@loader_path/libboost_thread.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_url.dylib" "@loader_path/libboost_url.dylib"
+ -change "${DARWIN_BOOST_PREFIX}/lib/libboost_regex.dylib" "@loader_path/libboost_regex.dylib"
+ -change "@rpath/libvlc.dylib" "@loader_path/plugins/libvlc.dylib"
+ -change "@rpath/libvlccore.dylib" "@loader_path/plugins/libvlccore.dylib"
+ "$<TARGET_FILE:${PROJECT_NAME}>"
+ VERBATIM
+ COMMENT "Fixing paths to LibVLC media plugin dependencies"
+ )
+ else ()
+ add_custom_command(TARGET ${PROJECT_NAME}
+ POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL}
+ -change "/opt/local/lib/libnghttp2.14.dylib" "@loader_path/libnghttp2.14.dylib"
+ -change "/opt/local/lib/libaprutil-1.0.dylib" "@loader_path/libaprutil-1.0.dylib"
+ -change "/opt/local/lib/libiconv.2.dylib" "@loader_path/libiconv.2.dylib"
+ -change "/opt/local/lib/libapr-1.0.dylib" "@loader_path/libapr-1.0.dylib"
+ -change "/opt/local/lib/libz.1.dylib" "@loader_path/libz.1.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_context-mt.dylib" "@loader_path/libboost_context-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_fiber-mt.dylib" "@loader_path/libboost_fiber-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_filesystem-mt.dylib" "@loader_path/libboost_filesystem-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_process-mt.dylib" "@loader_path/libboost_process-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_program_options-mt.dylib" "@loader_path/libboost_program_options-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_thread-mt.dylib" "@loader_path/libboost_thread-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_url-mt.dylib" "@loader_path/libboost_url-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_regex-mt.dylib" "@loader_path/libboost_regex-mt.dylib"
+ -change "/opt/local/libexec/boost/1.88/lib/libboost_system-mt.dylib" "@loader_path/libboost_system-mt.dylib"
+ -change "/opt/local/lib/libexpat.1.dylib" "@loader_path/libexpat.1.dylib"
+ -change "@rpath/libvlc.dylib" "@loader_path/plugins/libvlc.dylib"
+ -change "@rpath/libvlccore.dylib" "@loader_path/plugins/libvlccore.dylib"
+ "$<TARGET_FILE:${PROJECT_NAME}>"
+ VERBATIM
+ COMMENT "Fixing paths to LibVLC media plugin dependencies"
+ )
+ endif ()
endif (DARWIN)
if (CMAKE_BUILD_TYPE MATCHES Release AND (CMAKE_CXX_COMPILER_ID STREQUAL Clang OR CMAKE_CXX_COMPILER_ID MATCHES GNU))
add_custom_command(
TARGET ${PROJECT_NAME} POST_BUILD
- COMMAND ${CMAKE_STRIP} lib${PROJECT_NAME}.so
+ COMMAND ${CMAKE_STRIP} "$<TARGET_FILE:${PROJECT_NAME}>"
)
endif ()
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 9f55838a8a..8cfffb06a3 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1944,7 +1944,7 @@ endif ()
if (CMAKE_BUILD_TYPE MATCHES Release AND (CMAKE_CXX_COMPILER_ID STREQUAL Clang OR CMAKE_CXX_COMPILER_ID MATCHES GNU))
add_custom_command(
TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND ${CMAKE_STRIP} ${VIEWER_BINARY_NAME}
+ COMMAND ${CMAKE_STRIP} "$<TARGET_FILE:${VIEWER_BINARY_NAME}>"
)
endif ()
@@ -2258,7 +2258,14 @@ target_link_libraries(${VIEWER_BINARY_NAME}
)
if (ENABLE_MEDIA_PLUGINS)
- target_link_libraries(${VIEWER_BINARY_NAME} ll::libvlc )
+ if (DARWIN)
+ # Version macros only. Linking ll::libvlc records the mounted VLC disk
+ # image as an rpath, so the running viewer keeps that image busy.
+ target_include_directories(${VIEWER_BINARY_NAME} SYSTEM PRIVATE
+ $<TARGET_PROPERTY:ll::libvlc,INTERFACE_INCLUDE_DIRECTORIES>)
+ else ()
+ target_link_libraries(${VIEWER_BINARY_NAME} ll::libvlc )
+ endif ()
if (NOT (CMAKE_SYSTEM_NAME MATCHES FreeBSD))
target_link_libraries(${VIEWER_BINARY_NAME} ll::cef )
endif ()
diff --git a/indra/newview/FixBundle.cmake.in b/indra/newview/FixBundle.cmake.in
index 40593720fc..bf9ff67830 100644
--- a/indra/newview/FixBundle.cmake.in
+++ b/indra/newview/FixBundle.cmake.in
@@ -1,5 +1,112 @@
include(BundleUtilities)
+if ("@DARWIN_USE_HOMEBREW@" STREQUAL "TRUE")
+set(dirs
+ @DARWIN_BOOST_PREFIX@/lib
+ @DARWIN_NGHTTP2_PREFIX@/lib
+ @DARWIN_APR_PREFIX@/lib
+ @DARWIN_APRUTIL_PREFIX@/lib
+ @DARWIN_ICU_PREFIX@/lib
+ @DARWIN_HOMEBREW_PREFIX@/lib
+ )
+# Homebrew dylibs have no -mt suffix and no libboost_system. iconv, expat,
+# and zlib stay macOS system libraries. Transitive Boost deps use @loader_path.
+file(CREATE_LINK
+ "../../../../Frameworks/libnghttp2.14.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libnghttp2.14.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libaprutil-1.0.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libaprutil-1.0.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libapr-1.0.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libapr-1.0.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libboost_atomic.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_atomic.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libboost_chrono.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_chrono.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libboost_container.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_container.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libboost_context.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_context.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libboost_date_time.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_date_time.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libboost_fiber.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_fiber.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libboost_filesystem.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_filesystem.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libboost_process.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_process.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libboost_program_options.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_program_options.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libboost_thread.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_thread.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libboost_url.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_url.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libboost_regex.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_regex.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libicudata.78.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libicudata.78.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libicui18n.78.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libicui18n.78.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/libicuuc.78.dylib"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libicuuc.78.dylib"
+ SYMBOLIC
+ )
+file(CREATE_LINK
+ "../../../../Frameworks/Chromium Embedded Framework.framework"
+ "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework"
+ SYMBOLIC
+ )
+else ()
set(dirs
/opt/local/lib
)
@@ -109,8 +216,12 @@ file(CREATE_LINK
"${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework"
SYMBOLIC
)
+endif ()
-fixup_bundle(${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/MacOS/${VIEWER_CHANNEL} "" "${dirs}")
+# configure_file clears variable references, so the fixup call that reads
+# dirs lives in FixBundleRun.cmake. _fixup_app is substituted here.
+set(_fixup_app "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/MacOS/${VIEWER_CHANNEL}")
+include("${CMAKE_CURRENT_SOURCE_DIR}/FixBundleRun.cmake")
file(CHMOD
"${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper"
@@ -121,6 +232,12 @@ file(CHMOD
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)
+if ("@DARWIN_USE_HOMEBREW@" STREQUAL "TRUE")
+execute_process(
+ COMMAND hdiutil detach /Volumes/VLC\ media\ player
+ ERROR_QUIET
+ )
+else ()
execute_process(
COMMAND hdiutil detach /Volumes/VLC\ media\ player
COMMAND lipo libalut.0.dylib
@@ -249,3 +366,4 @@ execute_process(
WORKING_DIRECTORY ${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Frameworks
ERROR_QUIET
)
+endif ()
diff --git a/indra/newview/FixBundleRun.cmake b/indra/newview/FixBundleRun.cmake
new file mode 100644
index 0000000000..72bb9df321
--- /dev/null
+++ b/indra/newview/FixBundleRun.cmake
@@ -0,0 +1,3 @@
+# Included by the configured FixBundle.cmake. ${dirs} must be expanded here:
+# CMake 4 configure_file clears ${dirs} in the .in file.
+fixup_bundle("${_fixup_app}" "" "${dirs}")