diff options
| author | Mike <contact@mikelittman.me> | 2026-10-05 01:44:55 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-10-05 14:44:55 +0800 |
| commit | 62e2d529558ba086708025b394aa790e49076c77 (patch) | |
| tree | 45a987f422b39153a36e831cf2f5b44ecb2a3b11 /indra | |
| parent | f1abdac1b155e8834acf4539a9ec00fab729d006 (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.cmake | 16 | ||||
| -rw-r--r-- | indra/cmake/DarwinPackages.cmake | 100 | ||||
| -rw-r--r-- | indra/cmake/Hunspell.cmake | 4 | ||||
| -rw-r--r-- | indra/cmake/LLPrimitive.cmake | 34 | ||||
| -rw-r--r-- | indra/cmake/OPENAL.cmake | 35 | ||||
| -rw-r--r-- | indra/cmake/Variables.cmake | 2 | ||||
| -rw-r--r-- | indra/cmake/xxHash.cmake | 4 | ||||
| -rw-r--r-- | indra/llplugin/slplugin/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/llwebrtc/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/media_plugins/cef/CMakeLists.txt | 66 | ||||
| -rw-r--r-- | indra/media_plugins/libvlc/CMakeLists.txt | 72 | ||||
| -rw-r--r-- | indra/newview/CMakeLists.txt | 11 | ||||
| -rw-r--r-- | indra/newview/FixBundle.cmake.in | 120 | ||||
| -rw-r--r-- | indra/newview/FixBundleRun.cmake | 3 |
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}") |
