diff --git a/doc/contributions.txt b/doc/contributions.txt index 99c2242275d84c359d00313e68eadb5c830005fb..6e08cba599a4c2af8cd0f228622634e072619fe3 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -1130,6 +1130,7 @@ Nicky Dasmijn SL-14541 SL-16438 SL-17218 + SL-17238 SL-17585 Nicky Perian OPEN-1 diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 6e56a87ed9607aa3fea3096bfa1ac6c33f4e2f95..8b0328b62277e2fac140f39833886ecb4915e00c 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -3,21 +3,45 @@ # cmake_minimum_required should appear before any # other commands to guarantee full compatibility # with the version specified -cmake_minimum_required(VERSION 3.15.0 FATAL_ERROR) -cmake_policy(SET CMP0063 NEW) +## 3.8 added VS_DEBUGGER_WORKING_DIRECTORY support +## 3.13/12 is needed for add_link_options/add_compile_definitions +## 3.14 added FILE CREATE_LINK +## 3.16 is needed for target_precompile_headers +## Nicky: Ideally we want at least 3.21 for good preset support +## We're not there yet, but once done, there is a kludge in Linking.cmake +# "if(${CMAKE_VERSION} VERSION_LESS "3.20.0")" that can also be removed +cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR) +cmake_policy(SET CMP0091 NEW) set(ROOT_PROJECT_NAME "Alchemy" CACHE STRING "The root project/makefile/solution name. Defaults to Alchemy.") project(${ROOT_PROJECT_NAME}) -set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" "${CMAKE_CURRENT_BINARY_DIR}") -set(CMAKE_C_STANDARD 11) +include(conanbuildinfo OPTIONAL RESULT_VARIABLE USE_CONAN ) +if( USE_CONAN ) + set( USE_CONAN ON ) + set( USE_AUTOBUILD_3P OFF ) + conan_basic_setup(TARGETS NO_OUTPUT_DIRS) + add_compile_definitions(LL_USESYSTEMLIBS USE_CONAN NO_AUTOBUILD_3P) +else() + set( USE_CONAN OFF ) + set( USE_AUTOBUILD_3P ON ) +endif() + +# The viewer code base can now be successfully compiled with -std=c++14. But +# turning that on in the generic viewer-build-variables/variables file would +# potentially require tweaking each of our ~50 third-party library builds. +# Until we decide to set -std=c++14 in viewer-build-variables/variables, set +# it locally here: we want to at least prevent inadvertently reintroducing +# viewer code that would fail with C++14. if(MSVC) set(CMAKE_CXX_STANDARD 20) else() set(CMAKE_CXX_STANDARD 17) endif() +set(CMAKE_CXX_STANDARD_REQUIRED ON) set_property(GLOBAL PROPERTY USE_FOLDERS ON) @@ -26,6 +50,9 @@ if (NOT CMAKE_BUILD_TYPE) "Build type. One of: Debug Release RelWithDebInfo" FORCE) endif (NOT CMAKE_BUILD_TYPE) +set(Python3_FIND_VIRTUALENV FIRST) +find_package(Python3 COMPONENTS Interpreter) + include(Variables) include(BuildVersion) @@ -60,20 +87,16 @@ add_subdirectory(${LIBS_OPEN_PREFIX}llplugin) add_subdirectory(${LIBS_OPEN_PREFIX}llui) add_subdirectory(${LIBS_OPEN_PREFIX}viewer_components) +if( LL_TESTS ) # Legacy C++ tests. Build always, run if LL_TESTS is true. add_subdirectory(${VIEWER_PREFIX}test) +endif() if (ENABLE_MEDIA_PLUGINS) # viewer media plugins add_subdirectory(${LIBS_OPEN_PREFIX}media_plugins) endif (ENABLE_MEDIA_PLUGINS) -# sets the 'startup project' for debugging from visual studio. -set_property( - DIRECTORY ${VIEWER_PREFIX} - PROPERTY VS_STARTUP_PROJECT alchemy-bin - ) - if (USE_BUGSPLAT) if (BUGSPLAT_DB) message(STATUS "Building with BugSplat; database '${BUGSPLAT_DB}'") @@ -87,6 +110,12 @@ add_dependencies(viewer alchemy-bin) add_subdirectory(${VIEWER_PREFIX}doxygen EXCLUDE_FROM_ALL) +# sets the 'startup project' for debugging from visual studio. +set_property( + DIRECTORY ${VIEWER_PREFIX} + PROPERTY VS_STARTUP_PROJECT ${VIEWER_BINARY_NAME} + ) + if (LL_TESTS) # Define after the custom targets are created so # individual apps can add themselves as dependencies diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 08f6e88333ff2cdec74a9a9364b72b6120c93bee..3ec6db7e41ed87364da05c4022cc72ac83f1fe57 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -12,37 +12,33 @@ # Also realize that CMAKE_CXX_FLAGS may already be partially populated on # entry to this file. #***************************************************************************** - -if(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED) -set(${CMAKE_CURRENT_LIST_FILE}_INCLUDED "YES") +include_guard() include(CheckCXXCompilerFlag) include(Variables) include(SDL2) -set(Python3_FIND_VIRTUALENV FIRST) -find_package(Python3 COMPONENTS Interpreter) - # Portable compilation flags. -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DADDRESS_SIZE=${ADDRESS_SIZE}") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DADDRESS_SIZE=${ADDRESS_SIZE}") -set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -DLL_DEBUG=1") -set(CMAKE_CXX_FLAGS_RELEASE - "-DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -DNDEBUG") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO - "-DLL_RELEASE=1 -DNDEBUG -DLL_RELEASE_WITH_DEBUG_INFO=1") +add_compile_definitions( + ADDRESS_SIZE=${ADDRESS_SIZE} + $<$<CONFIG:Debug>:_DEBUG> + $<$<CONFIG:Debug>:LL_DEBUG=1> + $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:LL_RELEASE=1> + $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:NDEBUG> + $<$<CONFIG:RelWithDebInfo>:LL_RELEASE_WITH_DEBUG_INFO=1> + $<$<CONFIG:Release>:LL_RELEASE_FOR_DOWNLOAD=1> + ) # Configure crash reporting set(RELEASE_CRASH_REPORTING OFF CACHE BOOL "Enable use of crash reporting in release builds") set(NON_RELEASE_CRASH_REPORTING OFF CACHE BOOL "Enable use of crash reporting in developer builds") if(RELEASE_CRASH_REPORTING) - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DLL_SEND_CRASH_REPORTS=1") + add_compile_definitions( LL_SEND_CRASH_REPORTS=1) endif() if(NON_RELEASE_CRASH_REPORTING) - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DLL_SEND_CRASH_REPORTS=1") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DLL_SEND_CRASH_REPORTS=1") -endif() + add_compile_definitions( LL_SEND_CRASH_REPORTS=1) +endif() # Don't bother with a MinSizeRel build. set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release;Debug" CACHE STRING @@ -59,79 +55,91 @@ endif() # Warnings option(DISABLE_FATAL_WARNINGS "Disable warnings as errors" ON) +if(USE_LTO) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ${USE_LTO}) +endif() + # Platform-specific compilation flags. if (WINDOWS) # Don't build DLLs. set(BUILD_SHARED_LIBS OFF) + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL") if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + add_compile_options(/MP) elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m${ADDRESS_SIZE}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m${ADDRESS_SIZE}") + add_compile_options(-m${ADDRESS_SIZE}) endif () - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /EHsc -D_SCL_SECURE_NO_WARNINGS=1") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO - "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /Ob0 /EHsc -D_ITERATOR_DEBUG_LEVEL=0") + add_compile_definitions( + $<$<CONFIG:Debug>:_SCL_SECURE_NO_WARNINGS=1> + $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:_ITERATOR_DEBUG_LEVEL=0> + LL_WINDOWS=1 + NOMINMAX + UNICODE + _UNICODE + _CRT_SECURE_NO_WARNINGS + _CRT_NONSTDC_NO_DEPRECATE + _WINSOCK_DEPRECATED_NO_WARNINGS + _SILENCE_CXX20_CISO646_REMOVED_WARNING + ) + + add_compile_options( + $<$<CONFIG:Release>:/Zc:inline> + $<$<CONFIG:Release>:/fp:fast> + /Zi + /EHsc + /permissive- + /W3 + /c + /Zc:__cplusplus + /nologo + ) + + add_link_options( + /DEBUG:FULL + /IGNORE:4099 + ) + + if (ADDRESS_SIZE EQUAL 32) + add_compile_options(/arch:SSE2) + elseif (USE_AVX2) + add_compile_options(/arch:AVX2) + elseif (USE_AVX) + add_compile_options(/arch:AVX) + elseif (USE_SSE42) + add_compile_definitions(__SSE3__=1 __SSSE3__=1 __SSE4__=1 __SSE4_1__=1 __SSE4_2__=1) + else () + add_compile_definitions(__SSE3__=1 __SSSE3__=1 __SSE4__=1 __SSE4_1__=1) + endif () if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") - set(CMAKE_CXX_FLAGS_RELEASE - "${CMAKE_CXX_FLAGS_RELEASE} /O2 /Oi /Ot /Gy /Zi /MD /Ob3 /Oy- /Zc:inline /EHsc /fp:fast -D_ITERATOR_DEBUG_LEVEL=0") + add_compile_options(/Zc:externConstexpr /ZH:SHA_256) elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") - set(CMAKE_CXX_FLAGS_RELEASE - "${CMAKE_CXX_FLAGS_RELEASE} /clang:-Ofast /clang:-ffast-math /Oi /Ot /Gy /Zi /MD /Ob2 /Oy- /Zc:inline /EHsc /fp:fast -D_ITERATOR_DEBUG_LEVEL=0") + add_compile_options(/Qvec /Zc:dllexportInlines- /clang:-mprefer-vector-width=128 -fno-strict-aliasing -Wno-ignored-pragma-intrinsic -Wno-unused-local-typedef) endif() - if (ADDRESS_SIZE EQUAL 32) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE") - endif (ADDRESS_SIZE EQUAL 32) - - if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR FULL_DEBUG_SYMS OR USE_SENTRY) - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG:FULL") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG:FULL") - else () - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG:FASTLINK /IGNORE:4099") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG:FASTLINK /IGNORE:4099") - endif () + if(FAVOR_AMD AND FAVOR_INTEL) + message(FATAL_ERROR "Cannot enable FAVOR_AMD and FAVOR_INTEL at the same time") + elseif(FAVOR_AMD) + add_compile_options(/favor:AMD64) + elseif(FAVOR_INTEL) + add_compile_options(/favor:INTEL64) + endif() - set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /NODEFAULTLIB:LIBCMT") - set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:LIBCMT /NODEFAULTLIB:LIBCMTD /NODEFAULTLIB:MSVCRT") - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /NODEFAULTLIB:LIBCMT") - set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:LIBCMT /NODEFAULTLIB:LIBCMTD /NODEFAULTLIB:MSVCRT") - if (USE_LTO) - if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") - if(INCREMENTAL_LINK) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LTCG:incremental") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LTCG:incremental") - set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /LTCG") - else(INCREMENTAL_LINK) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LTCG") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LTCG") - set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /LTCG") - endif(INCREMENTAL_LINK) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /OPT:REF /OPT:ICF /INCREMENTAL:NO") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /OPT:REF /OPT:ICF /INCREMENTAL:NO") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL /Gy /Gw") - elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") - if(INCREMENTAL_LINK) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto=thin -fwhole-program-vtables /clang:-fforce-emit-vtables") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto=thin -fwhole-program-vtables /clang:-fforce-emit-vtables") - else(INCREMENTAL_LINK) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto=full -fwhole-program-vtables /clang:-fforce-emit-vtables") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto=full -fwhole-program-vtables /clang:-fforce-emit-vtables") - endif(INCREMENTAL_LINK) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /OPT:REF /OPT:ICF") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /OPT:REF /OPT:ICF") - endif() + add_link_options( + $<$<CONFIG:Release>:/OPT:REF> + $<$<CONFIG:Release>:/OPT:ICF> + ) elseif (INCREMENTAL_LINK) - set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /INCREMENTAL") - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /INCREMENTAL") + add_link_options($<$<CONFIG:Release>:/INCREMENTAL>) else () - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /OPT:REF /OPT:ICF /INCREMENTAL:NO") - set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /OPT:REF /OPT:ICF /INCREMENTAL:NO") + add_link_options( + $<$<CONFIG:Release>:/OPT:REF> + $<$<CONFIG:Release>:/OPT:ICF> + $<$<CONFIG:Release>:/INCREMENTAL:NO> + ) endif () if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") @@ -144,241 +152,113 @@ if (WINDOWS) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /defaultlib:\"${CLANG_RT}\"") endif() - set(GLOBAL_CXX_FLAGS - "/GS /W3 /c /Zc:__cplusplus /Zc:forScope /Zc:rvalueCast /Zc:strictStrings /Zc:ternary /nologo" - ) - - if (ADDRESS_SIZE EQUAL 32) - set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /arch:SSE2") - elseif (USE_AVX2) - set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /arch:AVX2") - add_definitions(/DAL_AVX2=1 /DAL_AVX=1) - elseif (USE_AVX) - set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /arch:AVX") - add_definitions(/DAL_AVX=1) - elseif (USE_SSE42) - add_definitions(/D__SSE3__=1 /D__SSSE3__=1 /D__SSE4__=1 /D__SSE4_1__=1 /D__SSE4_2__=1) - else() - add_definitions(/D__SSE3__=1 /D__SSSE3__=1 /D__SSE4__=1 /D__SSE4_1__=1) - endif () - - if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") - set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /permissive- /Zc:externConstexpr /Zc:referenceBinding /ZH:SHA_256") - elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") - set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /Qvec /Zc:dllexportInlines- /clang:-mprefer-vector-width=128 -fno-strict-aliasing -Wno-ignored-pragma-intrinsic -Wno-unused-local-typedef") - endif() - - if(FAVOR_AMD AND FAVOR_INTEL) - message(FATAL_ERROR "Cannot enable FAVOR_AMD and FAVOR_INTEL at the same time") - elseif(FAVOR_AMD) - set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /favor:AMD64") - elseif(FAVOR_INTEL) - set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /favor:INTEL64") - endif() - if (NOT DISABLE_FATAL_WARNINGS) - set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /WX") + add_compile_options(/WX) endif (NOT DISABLE_FATAL_WARNINGS) - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${GLOBAL_CXX_FLAGS}" CACHE STRING "C++ compiler debug options" FORCE) - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${GLOBAL_CXX_FLAGS}" CACHE STRING "C++ compiler release-with-debug options" FORCE) - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${GLOBAL_CXX_FLAGS}" CACHE STRING "C++ compiler release options" FORCE) - - add_definitions( - /DLL_WINDOWS=1 - /DNOMINMAX - /DUNICODE - /D_UNICODE - /D_CRT_SECURE_NO_WARNINGS - /D_CRT_NONSTDC_NO_DEPRECATE - /D_WINSOCK_DEPRECATED_NO_WARNINGS - /DBOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE - /DBOOST_ALLOW_DEPRECATED_HEADERS - /D_SILENCE_CXX20_CISO646_REMOVED_WARNING - ) - - # library linkage defines - add_definitions( - /DCURL_STATICLIB=1 - /DURI_STATIC_BUILD=1 - /DLIBXML_STATIC=1 - /DHUNSPELL_STATIC=1 - /DXML_STATIC=1 - /DXMLRPCEPI_STATIC=1 - /DAPR_DECLARE_STATIC=1 - /DAPU_DECLARE_STATIC=1 - /DAPI_DECLARE_STATIC=1 - ) + string(REPLACE "/Ob2" "/Ob3" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) + string(REPLACE "/Ob2" "/Ob3" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE}) # configure win32 API for 7 and above compatibility set(WINVER "0x0601" CACHE STRING "Win32 API Target version (see http://msdn.microsoft.com/en-us/library/aa383745%28v=VS.85%29.aspx)") - add_definitions("/DWINVER=${WINVER}" "/D_WIN32_WINNT=${WINVER}") + add_compile_definitions(WINVER=${WINVER} _WIN32_WINNT=${WINVER}) endif (WINDOWS) if (LINUX) set(CMAKE_SKIP_BUILD_RPATH TRUE) - - set(ALCHEMY_GLOBAL_DEFS "-DLL_LINUX=1 -DAPPID=secondlife -DLL_IGNORE_SIGCHLD -D_REENTRANT -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGSEAL_ENABLE -DGTK_DISABLE_SINGLE_INCLUDES") - set(ALCHEMY_GLOBAL_CFLAGS "-fvisibility=hidden -fexceptions -fno-math-errno -fno-strict-aliasing -fsigned-char -g -gz -pthread") + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + add_compile_definitions( + LL_LINUX=1 + APPID=secondlife + LL_IGNORE_SIGCHLD + _REENTRANT + $<$<CONFIG:Release>:_FORTIFY_SOURCE=2> + GDK_DISABLE_DEPRECATED + GTK_DISABLE_DEPRECATED + GSEAL_ENABLE + GTK_DISABLE_SINGLE_INCLUDES + ) + + add_compile_options( + $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:-fstack-protector> + -fvisibility=hidden + -fexceptions + -fno-math-errno + -fno-strict-aliasing + -fsigned-char + -g + -pthread + ) if (USE_AVX2) - set(ALCHEMY_GLOBAL_CFLAGS "${ALCHEMY_GLOBAL_CFLAGS} -mavx2") + add_compile_options(-mavx2) elseif (USE_AVX) - set(ALCHEMY_GLOBAL_CFLAGS "${ALCHEMY_GLOBAL_CFLAGS} -mavx") + add_compile_options(-mavx) elseif (USE_SSE42) - set(ALCHEMY_GLOBAL_CFLAGS "${ALCHEMY_GLOBAL_CFLAGS} -mfpmath=sse -msse -msse2 -msse3 -mssse3 -msse4 -msse4.1 -msse4.2") + add_compile_options(-mfpmath=sse -msse -msse2 -msse3 -mssse3 -msse4 -msse4.1 -msse4.2) else() - set(ALCHEMY_GLOBAL_CFLAGS "${ALCHEMY_GLOBAL_CFLAGS} -mfpmath=sse -msse -msse2 -msse3 -mssse3 -msse4 -msse4.1") + add_compile_options(-mfpmath=sse -msse -msse2 -msse3 -mssse3 -msse4 -msse4.1) endif () - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ALCHEMY_GLOBAL_DEFS} ${ALCHEMY_GLOBAL_CFLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ALCHEMY_GLOBAL_DEFS} ${ALCHEMY_GLOBAL_CFLAGS}") - - if (USE_LTO) - if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto=thin -fwhole-program-vtables -fforce-emit-vtables") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto=thin -fwhole-program-vtables -fforce-emit-vtables") - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto=auto -fno-fat-lto-objects") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto=auto -fno-fat-lto-objects") - endif () - endif (USE_LTO) - if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") if (USE_ASAN) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fsanitize-recover=address") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize-recover=address") + add_compile_options(-fsanitize=address -fsanitize-recover=address) link_libraries(-lasan) - endif (USE_ASAN) - - if (USE_LEAKSAN) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=leak") + elseif (USE_LEAKSAN) + add_compile_options(-fsanitize=leak) link_libraries(-llsan) - endif (USE_LEAKSAN) - - if (USE_UBSAN) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined -fno-sanitize=vptr") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize=vptr") + elseif (USE_UBSAN) + add_compile_options(-fsanitize=undefined -fno-sanitize=vptr) link_libraries(-lubsan) - endif (USE_UBSAN) - - if (USE_THDSAN) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread") - endif (USE_THDSAN) - endif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - - CHECK_CXX_COMPILER_FLAG(-Og HAS_DEBUG_OPTIMIZATION) - CHECK_CXX_COMPILER_FLAG(-fstack-protector HAS_STACK_PROTECTOR) - if (${CMAKE_BUILD_TYPE} STREQUAL "Release") - if (HAS_STACK_PROTECTOR) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector") + elseif (USE_THDSAN) + add_compile_options(-fsanitize=thread) endif () - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2") - endif (${CMAKE_BUILD_TYPE} STREQUAL "Release") - - if (HAS_DEBUG_OPTIMIZATION) - set(CMAKE_CXX_FLAGS_DEBUG "-Og ${CMAKE_CXX_FLAGS_DEBUG}") - else (HAS_DEBUG_OPTIMIZATION) - set(CMAKE_CXX_FLAGS_DEBUG "-O0 -fno-inline ${CMAKE_CXX_FLAGS_DEBUG}") - endif (HAS_DEBUG_OPTIMIZATION) + endif () if (USE_ASAN OR USE_LEAKSAN OR USE_UBSAN OR USE_THDSAN) - if (HAS_DEBUG_OPTIMIZATION) - set(CMAKE_CXX_FLAGS_RELEASE "-Og -fno-omit-frame-pointer ${CMAKE_CXX_FLAGS_RELEASE}") - else() - set(CMAKE_CXX_FLAGS_RELEASE "-O0 -fno-omit-frame-pointer ${CMAKE_CXX_FLAGS_RELEASE}") - endif() + add_compile_options(-Og -fno-omit-frame-pointer) else () - set(CMAKE_CXX_FLAGS_RELEASE "-O3 -ffast-math ${CMAKE_CXX_FLAGS_RELEASE}") + add_compile_options(-O3 -ffast-math) endif () - if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND USE_LTO) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=lld") - endif() - # Enable these flags so we have a read only GOT and some linking opts - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro -Wl,-z,now -Wl,--as-needed") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro -Wl,-z,now -Wl,--as-needed") -endif (LINUX) - + add_link_options("LINKER:-z,relro" "LINKER:-z,now" "LINKER:--as-needed") +endif () if (DARWIN) - add_definitions(-DLL_DARWIN=1 -DGL_SILENCE_DEPRECATION=1) - set(CMAKE_CXX_LINK_FLAGS "-Wl,-headerpad_max_install_names,-search_paths_first") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}") - set(DARWIN_extra_cstar_flags "-gdwarf-2") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 ${DARWIN_extra_cstar_flags}") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 ${DARWIN_extra_cstar_flags}") - # NOTE: it's critical that the optimization flag is put in front. - # NOTE: it's critical to have both CXX_FLAGS and C_FLAGS covered. - - add_definitions( - -DBOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE=1 - -DBOOST_ALLOW_DEPRECATED_HEADERS=1 - ) -endif (DARWIN) - + add_compile_definitions(LL_DARWIN=1 GL_SILENCE_DEPRECATION=1) + add_link_options("LINKER:-headerpad_max_install_names" "LINKER:-search_paths_first") + add_compile_options(-O3 -gdwarf-2) +endif () if (LINUX OR DARWIN) + add_compile_options(-Wall -Wno-sign-compare -Wno-reorder) if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set(GCC_WARNINGS "-Wall -Wno-sign-compare -Wno-unused-parameter -Wno-unused-but-set-parameter -Wno-ignored-qualifiers -Wno-unused-function") + add_compile_options(-Wno-unused-parameter -Wno-unused-but-set-parameter -Wno-ignored-qualifiers -Wno-unused-function) elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") - set(GCC_WARNINGS "-Wall -Wno-sign-compare -Wno-trigraphs -Wno-unused-local-typedef -Wno-unknown-warning-option") + add_compile_options(-Wno-trigraphs -Wno-unused-local-typedef -Wno-unknown-warning-option) endif() CHECK_CXX_COMPILER_FLAG(-Wdeprecated-copy HAS_DEPRECATED_COPY) if (HAS_DEPRECATED_COPY) - set(GCC_WARNINGS "${GCC_WARNINGS} -Wno-deprecated-copy") + add_compile_options(-Wno-deprecated-copy) endif() if (NOT DISABLE_FATAL_WARNINGS) - set(GCC_WARNINGS "${GCC_WARNINGS} -Werror") + add_compile_options(-Werror) endif (NOT DISABLE_FATAL_WARNINGS) - set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder") - - set(CMAKE_C_FLAGS "${GCC_WARNINGS} ${CMAKE_C_FLAGS}") - set(CMAKE_CXX_FLAGS "${GCC_CXX_WARNINGS} ${CMAKE_CXX_FLAGS}") - - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m${ADDRESS_SIZE}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m${ADDRESS_SIZE}") -endif (LINUX OR DARWIN) - -add_definitions(-DBOOST_BIND_GLOBAL_PLACEHOLDERS) - -add_definitions(-DOPENSSL_API_COMPAT=0x30000000L) - -if (USESYSTEMLIBS) - add_definitions(-DLL_USESYSTEMLIBS=1) -endif (USESYSTEMLIBS) + add_compile_options(-m${ADDRESS_SIZE}) +endif () option(RELEASE_SHOW_ASSERTS "Enable asserts in release builds" OFF) if(RELEASE_SHOW_ASSERTS) - add_definitions(-DRELEASE_SHOW_ASSERT=1) -else() - add_definitions(-URELEASE_SHOW_ASSERT) + add_compile_definitions(RELEASE_SHOW_ASSERT=1) endif() -if(HAVOK_TPV) - add_definitions(-DHAVOK_BUILD=1) -endif(HAVOK_TPV) - option(ENABLE_TIMING "Enable all fast timers" ON) if(ENABLE_TIMING) - add_definitions(-DAL_ENABLE_ALL_TIMERS=1) -else() - add_definitions(-DAL_ENABLE_ALL_TIMERS=0) -endif() - -if(SDL_FOUND) - add_definitions(-DLL_SDL=1) + add_compile_definitions(AL_ENABLE_ALL_TIMERS=1) endif() - - -endif(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED) - diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake index 94de0bec6d30edc25c55c8452ef1c9fb6c933277..63a026a7d20d07859e1595653fe352f130baf2c1 100644 --- a/indra/cmake/APR.cmake +++ b/indra/cmake/APR.cmake @@ -1,53 +1,40 @@ include(Linking) include(Prebuilt) -set(APR_FIND_QUIETLY ON) -set(APR_FIND_REQUIRED ON) +include_guard() -set(APRUTIL_FIND_QUIETLY ON) -set(APRUTIL_FIND_REQUIRED ON) +add_library( ll::apr INTERFACE IMPORTED ) -if (USESYSTEMLIBS) - include(FindAPR) -else (USESYSTEMLIBS) - use_prebuilt_binary(apr_suite) - if (WINDOWS) +use_system_binary( apr apr-util ) +use_prebuilt_binary(apr_suite) + +if (WINDOWS) set(APR_selector "") - set(APR_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/${APR_selector}apr-1.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/${APR_selector}apr-1.lib - ) - set(APRICONV_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/${APR_selector}apriconv-1.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/${APR_selector}apriconv-1.lib - ) - set(APRUTIL_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/${APR_selector}aprutil-1.lib ${APRICONV_LIBRARIES} - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/${APR_selector}aprutil-1.lib ${APRICONV_LIBRARIES} - ) - elseif(DARWIN) - set(APR_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libapr-1.a - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.a - ) - set(APRICONV_LIBRARIES iconv) - set(APRUTIL_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libaprutil-1.a ${APRICONV_LIBRARIES} - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.a ${APRICONV_LIBRARIES} - ) - else() - set(APR_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libapr-1.a - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.a - ) - set(APRUTIL_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libaprutil-1.a - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.a - ) - endif () - set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/apr-1) + target_link_libraries( ll::apr INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/${APR_selector}apr-1.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/${APR_selector}apr-1.lib + debug ${ARCH_PREBUILT_DIRS_DEBUG}/${APR_selector}apriconv-1.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/${APR_selector}apriconv-1.lib + debug ${ARCH_PREBUILT_DIRS_DEBUG}/${APR_selector}aprutil-1.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/${APR_selector}aprutil-1.lib + ) + target_compile_definitions( ll::apr INTERFACE APR_DECLARE_STATIC=1 APU_DECLARE_STATIC=1 API_DECLARE_STATIC=1) +elseif (DARWIN) + target_link_libraries( ll::apr INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libapr-1.a + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.a + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libaprutil-1.a + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.a + iconv + ) - if (LINUX) - list(APPEND APRUTIL_LIBRARIES rt) - endif (LINUX) -endif (USESYSTEMLIBS) +else() + target_link_libraries( ll::apr INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libapr-1.a + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.a + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libaprutil-1.a + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.a + rt + ) +endif () +target_include_directories( ll::apr SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/apr-1 ) diff --git a/indra/cmake/Atmosphere.cmake b/indra/cmake/Atmosphere.cmake deleted file mode 100644 index 9c14df2a11cc8e6167c76f4d846327d4f842d063..0000000000000000000000000000000000000000 --- a/indra/cmake/Atmosphere.cmake +++ /dev/null @@ -1,5 +0,0 @@ -# -*- cmake -*- -include(Prebuilt) -use_prebuilt_binary(libatmosphere) -set(LIBATMOSPHERE_LIBRARIES atmosphere) -set(LIBATMOSPHERE_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/atmosphere) diff --git a/indra/cmake/Audio.cmake b/indra/cmake/Audio.cmake index 87779a3ff2057622cfe913754370f255a3c90a95..06811b1df0b60bdc40d1ffc8db31ddea55162b10 100644 --- a/indra/cmake/Audio.cmake +++ b/indra/cmake/Audio.cmake @@ -2,40 +2,31 @@ include(Linking) include(Prebuilt) -if (USESYSTEMLIBS) - include(FindPkgConfig) - pkg_check_modules(OGG REQUIRED ogg) - pkg_check_modules(VORBIS REQUIRED vorbis) - pkg_check_modules(VORBISENC REQUIRED vorbisenc) - pkg_check_modules(VORBISFILE REQUIRED vorbisfile) -else (USESYSTEMLIBS) - use_prebuilt_binary(ogg_vorbis) - set(VORBIS_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) - set(VORBISENC_INCLUDE_DIRS ${VORBIS_INCLUDE_DIRS}) - set(VORBISFILE_INCLUDE_DIRS ${VORBIS_INCLUDE_DIRS}) +include_guard() +add_library( ll::vorbis INTERFACE IMPORTED ) - if (WINDOWS) - set(OGG_LIBRARIES +use_system_binary(vorbis) +use_prebuilt_binary(ogg_vorbis) +target_include_directories( ll::vorbis SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include ) + +if (WINDOWS) + target_link_libraries(ll::vorbis INTERFACE optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libogg.lib - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libogg.lib) - set(VORBIS_LIBRARIES + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libogg.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libvorbis.lib - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libvorbis.lib) - set(VORBISFILE_LIBRARIES + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libvorbis.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libvorbisfile.lib - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libvorbisfile.lib) - else (WINDOWS) - set(OGG_LIBRARIES - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libogg.a - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libogg.a) - set(VORBIS_LIBRARIES - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libvorbis.a - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libvorbis.a) - set(VORBISENC_LIBRARIES + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libvorbisfile.lib + ) +else (WINDOWS) + target_link_libraries(ll::vorbis INTERFACE optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libvorbisenc.a - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libvorbisenc.a) - set(VORBISFILE_LIBRARIES + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libvorbisenc.a optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libvorbisfile.a - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libvorbisfile.a) - endif (WINDOWS) -endif (USESYSTEMLIBS) + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libvorbisfile.a + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libvorbis.a + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libvorbis.a + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libogg.a + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libogg.a + ) +endif (WINDOWS) diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake index e2708e4e1827777998fa4b3ca1a5353c2a073fdf..0e07d2f11c207cbe941cb8164d7749cdc65f60c0 100644 --- a/indra/cmake/Boost.cmake +++ b/indra/cmake/Boost.cmake @@ -1,121 +1,81 @@ # -*- cmake -*- include(Prebuilt) -include(Linking) -set(Boost_FIND_QUIETLY ON) -set(Boost_FIND_REQUIRED ON) +include_guard() -if (USESYSTEMLIBS) - include(FindBoost) +add_library( ll::boost INTERFACE IMPORTED ) +if( USE_CONAN ) + target_link_libraries( ll::boost INTERFACE CONAN_PKG::boost ) + target_compile_definitions( ll::boost INTERFACE BOOST_ALLOW_DEPRECATED_HEADERS BOOST_BIND_GLOBAL_PLACEHOLDERS ) + return() +endif() - set(BOOST_CONTEXT_LIBRARY boost_context-mt) - set(BOOST_FIBER_LIBRARY boost_fiber-mt) - set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt) - set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt) - set(BOOST_REGEX_LIBRARY boost_regex-mt) - set(BOOST_SIGNALS_LIBRARY boost_signals-mt) - set(BOOST_SYSTEM_LIBRARY boost_system-mt) - set(BOOST_THREAD_LIBRARY boost_thread-mt) -else (USESYSTEMLIBS) - use_prebuilt_binary(boost) - set(Boost_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) +use_prebuilt_binary(boost) - # As of sometime between Boost 1.67 and 1.72, Boost libraries are suffixed - # with the address size. - set(addrsfx "-x${ADDRESS_SIZE}") +# As of sometime between Boost 1.67 and 1.72, Boost libraries are suffixed +# with the address size. +set(addrsfx "-x${ADDRESS_SIZE}") - if (WINDOWS) - set(BOOST_CONTEXT_LIBRARY +if (WINDOWS) + target_link_libraries( ll::boost INTERFACE optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libboost_context-mt${addrsfx}.lib - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_context-mt-gd${addrsfx}.lib) - set(BOOST_FIBER_LIBRARY + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_context-mt-gd${addrsfx}.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libboost_fiber-mt${addrsfx}.lib - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_fiber-mt-gd${addrsfx}.lib) - set(BOOST_FILESYSTEM_LIBRARY + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_fiber-mt-gd${addrsfx}.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libboost_filesystem-mt${addrsfx}.lib - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_filesystem-mt-gd${addrsfx}.lib) - set(BOOST_PROGRAM_OPTIONS_LIBRARY + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_filesystem-mt-gd${addrsfx}.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libboost_program_options-mt${addrsfx}.lib - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_program_options-mt-gd${addrsfx}.lib) - set(BOOST_REGEX_LIBRARY + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_program_options-mt-gd${addrsfx}.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libboost_regex-mt${addrsfx}.lib - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_regex-mt-gd${addrsfx}.lib) - set(BOOST_SIGNALS_LIBRARY - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libboost_signals-mt${addrsfx}.lib - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_signals-mt-gd${addrsfx}.lib) - set(BOOST_STACKTRACE_LIBRARY + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_regex-mt-gd${addrsfx}.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libboost_stacktrace_windbg-mt${addrsfx}.lib - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_stacktrace_windbg-mt-gd${addrsfx}.lib) - set(BOOST_SYSTEM_LIBRARY + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_stacktrace_windbg-mt-gd${addrsfx}.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libboost_system-mt${addrsfx}.lib - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_system-mt-gd${addrsfx}.lib) - set(BOOST_THREAD_LIBRARY + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_system-mt-gd${addrsfx}.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libboost_thread-mt${addrsfx}.lib - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_thread-mt-gd${addrsfx}.lib) - set(BOOST_WAVE_LIBRARY + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_thread-mt-gd${addrsfx}.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libboost_wave-mt${addrsfx}.lib - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_wave-mt-gd${addrsfx}.lib) - elseif (LINUX) - set(BOOST_CONTEXT_LIBRARY - optimized boost_context-mt${addrsfx} - debug boost_context-mt${addrsfx}-d) - set(BOOST_FIBER_LIBRARY + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libboost_wave-mt-gd${addrsfx}.lib + ) +elseif (LINUX) + target_link_libraries( ll::boost INTERFACE optimized boost_fiber-mt${addrsfx} - debug boost_fiber-mt${addrsfx}-d) - set(BOOST_FILESYSTEM_LIBRARY + debug boost_fiber-mt${addrsfx}-d + optimized boost_context-mt${addrsfx} + debug boost_context-mt${addrsfx}-d optimized boost_filesystem-mt${addrsfx} - debug boost_filesystem-mt${addrsfx}-d) - set(BOOST_PROGRAM_OPTIONS_LIBRARY + debug boost_filesystem-mt${addrsfx}-d optimized boost_program_options-mt${addrsfx} - debug boost_program_options-mt${addrsfx}-d) - set(BOOST_REGEX_LIBRARY + debug boost_program_options-mt${addrsfx}-d optimized boost_regex-mt${addrsfx} - debug boost_regex-mt${addrsfx}-d) - set(BOOST_SIGNALS_LIBRARY - optimized boost_signals-mt${addrsfx} - debug boost_signals-mt${addrsfx}-d) - set(BOOST_SYSTEM_LIBRARY - optimized boost_system-mt${addrsfx} - debug boost_system-mt${addrsfx}-d) - set(BOOST_THREAD_LIBRARY + debug boost_regex-mt${addrsfx}-d optimized boost_thread-mt${addrsfx} - debug boost_thread-mt${addrsfx}-d) - set(BOOST_WAVE_LIBRARY + debug boost_thread-mt${addrsfx}-d optimized boost_wave-mt${addrsfx} - debug boost_wave-mt${addrsfx}-d) - elseif (DARWIN) - set(BOOST_CONTEXT_LIBRARY + debug boost_wave-mt${addrsfx}-d + optimized boost_system-mt${addrsfx} + debug boost_system-mt${addrsfx}-d + rt + ) +elseif (DARWIN) + target_link_libraries( ll::boost INTERFACE optimized boost_context-mt - debug boost_context-mt-d) - set(BOOST_FIBER_LIBRARY + debug boost_context-mt-d optimized boost_fiber-mt - debug boost_fiber-mt-d) - set(BOOST_FILESYSTEM_LIBRARY + debug boost_fiber-mt-d optimized boost_filesystem-mt - debug boost_filesystem-mt-d) - set(BOOST_PROGRAM_OPTIONS_LIBRARY + debug boost_filesystem-mt-d optimized boost_program_options-mt - debug boost_program_options-mt-d) - set(BOOST_REGEX_LIBRARY + debug boost_program_options-mt-d optimized boost_regex-mt - debug boost_regex-mt-d) - set(BOOST_SIGNALS_LIBRARY - optimized boost_signals-mt - debug boost_signals-mt-d) - set(BOOST_SYSTEM_LIBRARY + debug boost_regex-mt-d optimized boost_system-mt - debug boost_system-mt-d) - set(BOOST_THREAD_LIBRARY + debug boost_system-mt-d optimized boost_thread-mt - debug boost_thread-mt-d) - set(BOOST_WAVE_LIBRARY + debug boost_thread-mt-d optimized boost_wave-mt - debug boost_wave-mt-d) - endif (WINDOWS) -endif (USESYSTEMLIBS) - -if (LINUX) - set(BOOST_SYSTEM_LIBRARY ${BOOST_SYSTEM_LIBRARY} rt) - set(BOOST_THREAD_LIBRARY ${BOOST_THREAD_LIBRARY} rt) -endif (LINUX) + debug boost_wave-mt-d + ) +endif (WINDOWS) +target_compile_definitions( ll::boost INTERFACE BOOST_ALLOW_DEPRECATED_HEADERS=1 BOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE=1 BOOST_BIND_GLOBAL_PLACEHOLDERS=1) diff --git a/indra/cmake/BuildPackagesInfo.cmake b/indra/cmake/BuildPackagesInfo.cmake index 8b3fc9576d843d8e74e4af76b49c54451dd24385..04edefcbfd328754083e99d8404aec9caf97211d 100644 --- a/indra/cmake/BuildPackagesInfo.cmake +++ b/indra/cmake/BuildPackagesInfo.cmake @@ -2,6 +2,8 @@ # Construct the version and copyright information based on package data. include(FindAutobuild) +include_guard() + # packages-formatter.py runs autobuild install --versions, which needs to know # the build_directory, which (on Windows) depends on AUTOBUILD_ADDRSIZE. # Within an autobuild build, AUTOBUILD_ADDRSIZE is already set. But when @@ -15,5 +17,5 @@ add_custom_command(OUTPUT packages-info.txt COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/cmake/run_build_test.py -DAUTOBUILD_ADDRSIZE=${ADDRESS_SIZE} -DAUTOBUILD=${AUTOBUILD_EXECUTABLE} ${Python3_EXECUTABLE} - ${CMAKE_SOURCE_DIR}/../scripts/packages-formatter.py "${VIEWER_CHANNEL}" "${VIEWER_SHORT_VERSION}" > packages-info.txt + ${CMAKE_SOURCE_DIR}/../scripts/packages-formatter.py "${VIEWER_CHANNEL}" "${VIEWER_SHORT_VERSION}" "${AUTOBUILD_INSTALL_DIR}" > packages-info.txt ) diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake index cc4b3bbc56df7a8a46e9440d56ef71e0f296768a..3f883e054031e6432aeffd206ae9b97e9bb0d208 100644 --- a/indra/cmake/BuildVersion.cmake +++ b/indra/cmake/BuildVersion.cmake @@ -1,5 +1,7 @@ # -*- cmake -*- +include_guard() + option(REVISION_FROM_VCS "Get current revision from vcs" ON) # Construct the viewer channel from environment variables or defaults if(NOT DEFINED VIEWER_CHANNEL) @@ -138,4 +140,19 @@ if (NOT DEFINED VIEWER_COMMIT_SHORT_SHA) else() set(VIEWER_COMMIT_SHORT_SHA 0) endif() -endif (NOT DEFINED VIEWER_COMMIT_SHORT_SHA) \ No newline at end of file +endif (NOT DEFINED VIEWER_COMMIT_SHORT_SHA) + +add_library( ll::versioninfo INTERFACE IMPORTED ) +target_compile_definitions( ll::versioninfo INTERFACE + $<$<CONFIG:Debug>:LLBUILD_CONFIG="Debug"> + $<$<CONFIG:RelWithDebInfo>:LLBUILD_CONFIG="RelWithDebInfo"> + $<$<CONFIG:Release>:LLBUILD_CONFIG="Release"> + LL_VIEWER_CHANNEL="${VIEWER_CHANNEL}" + LL_VIEWER_CHANNEL_CODENAME="${VIEWER_CHANNEL_CODENAME_INTERNAL}" + LL_VIEWER_CHANNEL_AND_VERSION="${VIEWER_VERSION_AND_CHANNEL}" + LL_VIEWER_VERSION_MAJOR=${VIEWER_VERSION_MAJOR} + LL_VIEWER_VERSION_MINOR=${VIEWER_VERSION_MINOR} + LL_VIEWER_VERSION_PATCH=${VIEWER_VERSION_PATCH} + LL_VIEWER_COMMIT_SHA="${VIEWER_COMMIT_LONG_SHA}" + LL_VIEWER_COMMIT_SHORT_SHA="${VIEWER_COMMIT_SHORT_SHA}" + ) \ No newline at end of file diff --git a/indra/cmake/CEFPlugin.cmake b/indra/cmake/CEFPlugin.cmake index 91ddbe9c4197f3a59d6a4ced4d6d66cad5e13fa8..7b75db06064732fe32dc26edbc06948f6f9aa25a 100644 --- a/indra/cmake/CEFPlugin.cmake +++ b/indra/cmake/CEFPlugin.cmake @@ -2,18 +2,14 @@ include(Linking) include(Prebuilt) -if (USESYSTEMLIBS) - set(CEFPLUGIN OFF CACHE BOOL - "CEFPLUGIN support for the llplugin/llmedia test apps.") -else (USESYSTEMLIBS) - use_prebuilt_binary(dullahan) - set(CEFPLUGIN ON CACHE BOOL - "CEFPLUGIN support for the llplugin/llmedia test apps.") - set(CEF_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/cef) -endif (USESYSTEMLIBS) +include_guard() +add_library( ll::cef INTERFACE IMPORTED ) + +use_prebuilt_binary(dullahan) +target_include_directories( ll::cef SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/cef) if (WINDOWS) - set(CEF_PLUGIN_LIBRARIES + target_link_libraries( ll::cef INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libcef.lib ${ARCH_PREBUILT_DIRS_RELEASE}/libcef_dll_wrapper.lib ${ARCH_PREBUILT_DIRS_RELEASE}/dullahan.lib @@ -24,14 +20,14 @@ elseif (DARWIN) message(FATAL_ERROR "AppKit not found") endif() - set(CEF_PLUGIN_LIBRARIES + target_link_libraries( ll::cef INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libcef_dll_wrapper.a ${ARCH_PREBUILT_DIRS_RELEASE}/libdullahan.a ${APPKIT_LIBRARY} ) elseif (LINUX) - set(CEF_PLUGIN_LIBRARIES + target_link_libraries( ll::cef INTERFACE dullahan cef cef_dll_wrapper.a diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index babfa6741d947067a7ec1747faedb0d112c9ff21..0262394e3e9fa1e7ca91624eb0b4271cf51c7ca1 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -5,104 +5,77 @@ include(00-Common) project(cmake) set(cmake_SOURCE_FILES - CMakeLists.txt - - 00-Common.cmake - APR.cmake - Audio.cmake - Boost.cmake - BuildPackagesInfo.cmake - BuildVersion.cmake - CEFPlugin.cmake - CMakeCopyIfDifferent.cmake - CURL.cmake - Copy3rdPartyLibs.cmake - DBusGlib.cmake - DeploySharedLibs.cmake - DiscordSDK.cmake - DragDrop.cmake - EXPAT.cmake - FindAPR.cmake - FindAutobuild.cmake - FindFMODSTUDIO.cmake - FindHUNSPELL.cmake - FindNDOF.cmake - FindOpenJPEG.cmake - FindURIPARSER.cmake - FindXmlRpcEpi.cmake - FindZLIBNG.cmake - FMODSTUDIO.cmake - FreeType.cmake - GLEXT.cmake - GStreamer010Plugin.cmake - Hunspell.cmake - JPEG.cmake - LibXML2.cmake - LLAddBuildTest.cmake - LLAppearance.cmake - LLAudio.cmake - LLCharacter.cmake - LLCommon.cmake - LLImage.cmake - LLImageJ2COJ.cmake - LLInventory.cmake - LLKDU.cmake - LLLogin.cmake - LLMath.cmake - LLMeshOptimizer.cmake - LLMessage.cmake - LLPhysicsExtensions.cmake - LLPlugin.cmake - LLPrimitive.cmake - LLRender.cmake - LLSharedLibs.cmake - LLTestCommand.cmake - LLUI.cmake - LLFileSystem.cmake - LLWindow.cmake - LLXML.cmake - Linking.cmake - MediaPluginBase.cmake - MESHOPTIMIZER.cmake - NDOF.cmake - OPENAL.cmake - OpenGL.cmake - OpenJPEG.cmake - OpenSSL.cmake - PNG.cmake - PluginAPI.cmake - Prebuilt.cmake - PulseAudio.cmake - SDL2.cmake - Sentry.cmake - TemplateCheck.cmake - Tut.cmake - UI.cmake - UnixInstall.cmake - URIPARSER.cmake - WebP.cmake - Variables.cmake - ViewerMiscLibs.cmake - VisualLeakDetector.cmake - LibVLCPlugin.cmake - XmlRpcEpi.cmake - XXHash.cmake - ZLIBNG.cmake - ) + CMakeLists.txt + 00-Common.cmake + APR.cmake + Audio.cmake + Boost.cmake + BuildPackagesInfo.cmake + BuildVersion.cmake + CEFPlugin.cmake + CMakeCopyIfDifferent.cmake + CURL.cmake + Copy3rdPartyLibs.cmake + DBusGlib.cmake + DeploySharedLibs.cmake + DiscordSDK.cmake + DragDrop.cmake + EXPAT.cmake + FindAutobuild.cmake + FMODSTUDIO.cmake + FreeType.cmake + GLEXT.cmake + Hunspell.cmake + LibXML2.cmake + LLAddBuildTest.cmake + LLAppearance.cmake + LLAudio.cmake + LLCommon.cmake + LLImage.cmake + LLKDU.cmake + LLPhysicsExtensions.cmake + LLPrimitive.cmake + LLSharedLibs.cmake + LLTestCommand.cmake + LLWindow.cmake + Linking.cmake + NDOF.cmake + NVAPI.cmake + OPENAL.cmake + OpenGL.cmake + OpenJPEG.cmake + OpenSSL.cmake + PNG.cmake + PluginAPI.cmake + Prebuilt.cmake + PulseAudio.cmake + SDL2.cmake + Sentry.cmake + TemplateCheck.cmake + Tut.cmake + UI.cmake + UnixInstall.cmake + URIPARSER.cmake + WebP.cmake + Variables.cmake + ViewerMiscLibs.cmake + VisualLeakDetector.cmake + LibVLCPlugin.cmake + XmlRpcEpi.cmake + XXHash.cmake + ZLIBNG.cmake + ) source_group("Shared Rules" FILES ${cmake_SOURCE_FILES}) set(master_SOURCE_FILES - ../CMakeLists.txt - ) + ../CMakeLists.txt + ) source_group("Master Rules" FILES ${master_SOURCE_FILES}) -set_source_files_properties(${cmake_SOURCE_FILES} ${master_SOURCE_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - add_library(cmake - cmake_dummy.cpp - ${cmake_SOURCE_FILES} - ${master_SOURCE_FILES} - ) + cmake_dummy.cpp + ${cmake_SOURCE_FILES} + ${master_SOURCE_FILES} + ) diff --git a/indra/cmake/CURL.cmake b/indra/cmake/CURL.cmake index 4b0f61e3e9950178584068c8a896e615e5d73115..30cb2bfcbfdbb8b7689950ef93415d4aa6fc99b7 100644 --- a/indra/cmake/CURL.cmake +++ b/indra/cmake/CURL.cmake @@ -2,31 +2,38 @@ include(Prebuilt) include(Linking) -set(CURL_FIND_QUIETLY ON) -set(CURL_FIND_REQUIRED ON) +include_guard() +add_library( ll::libcurl INTERFACE IMPORTED ) -if (USESYSTEMLIBS) - include(FindCURL) -else (USESYSTEMLIBS) - use_prebuilt_binary(curl) - if (WINDOWS) - set(CURL_LIBRARIES +use_system_binary(libcurl) +use_prebuilt_binary(curl) +if (WINDOWS) + target_link_libraries(ll::libcurl INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/libcurld.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libcurl.lib + ll::openssl + ll::nghttp2 + ll::zlib-ng Normaliz.lib Iphlpapi.lib ) - elseif(DARWIN) - set(CURL_LIBRARIES + target_compile_definitions( ll::libcurl INTERFACE CURL_STATICLIB=1) +elseif(DARWIN) + target_link_libraries(ll::libcurl INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/libcurld.a optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libcurl.a + ll::openssl + ll::nghttp2 + ll::zlib-ng resolv ) - else () - set(CURL_LIBRARIES +else () + target_link_libraries(ll::libcurl INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/libcurld.a optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libcurl.a + ll::openssl + ll::nghttp2 + ll::zlib-ng ) - endif () - set(CURL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) -endif (USESYSTEMLIBS) +endif () +target_include_directories( ll::libcurl SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index ea216de9127ad93c9ffa4c4a3078f2923cbc89cc..222017c55fec6ba54f142a10add144ba03d0cefd 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -5,9 +5,10 @@ # VisualStudio. include(CMakeCopyIfDifferent) -include(Linking) -include(DiscordSDK) +include(Prebuilt) include(FMODSTUDIO) +include(OPENAL) +include(DiscordSDK) include(Sentry) # When we copy our dependent libraries, we almost always want to copy them to @@ -16,50 +17,27 @@ include(Sentry) # copy_if_different commands. Encapsulate that usage. # Pass FROM_DIR, TARGETS and the files to copy. TO_DIR is implicit. # to_staging_dirs diverges from copy_if_different in that it appends to TARGETS. -MACRO(to_debug_staging_dirs from_dir targets) - foreach(staging_dir - "${SHARED_LIB_STAGING_DIR_DEBUG}") - copy_if_different("${from_dir}" "${staging_dir}" out_targets ${ARGN}) - list(APPEND "${targets}" "${out_targets}") - endforeach() -ENDMACRO(to_debug_staging_dirs from_dir to_dir targets) - -MACRO(to_relwithdeb_staging_dirs from_dir targets) - foreach(staging_dir - "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}") - copy_if_different("${from_dir}" "${staging_dir}" out_targets ${ARGN}) - list(APPEND "${targets}" "${out_targets}") - endforeach() -ENDMACRO(to_relwithdeb_staging_dirs from_dir to_dir targets) +macro(to_staging_dirs from_dir targets) + set( targetDir "${SHARED_LIB_STAGING_DIR}") + copy_if_different("${from_dir}" "${targetDir}" out_targets ${ARGN}) -MACRO(to_release_staging_dirs from_dir targets) - foreach(staging_dir - "${SHARED_LIB_STAGING_DIR_RELEASE}") - copy_if_different("${from_dir}" "${staging_dir}" out_targets ${ARGN}) list(APPEND "${targets}" "${out_targets}") - endforeach() -ENDMACRO(to_release_staging_dirs from_dir to_dir targets) +endmacro() ################################################################### # set up platform specific lists of files that need to be copied ################################################################### if(WINDOWS) - if(GEN_IS_MULTI_CONFIG) - set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}/Debug") - set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo") - set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}/Release") - elseif (UPPERCASE_CMAKE_BUILD_TYPE MATCHES DEBUG) - set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}") - elseif (UPPERCASE_CMAKE_BUILD_TYPE MATCHES RELWITHDEBINFO) - set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}") - elseif (UPPERCASE_CMAKE_BUILD_TYPE MATCHES RELEASE) - set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}") - endif() - #******************************* # VIVOX - *NOTE: no debug version set(vivox_lib_dir "${ARCH_PREBUILT_DIRS_RELEASE}") - set(slvoice_src_dir "${ARCH_PREBUILT_BIN_DIRS_RELEASE}") + + # ND, it seems there is no such thing defined. At least when building a viewer + # Does this maybe matter on some LL buildserver? Otherwise this and the snippet using slvoice_src_dir + # can all go + if( ARCH_PREBUILT_BIN_DIRS_RELEASE ) + set(slvoice_src_dir "${ARCH_PREBUILT_BIN_DIRS_RELEASE}") + endif() set(slvoice_files SLVoice.exe ) if (ADDRESS_SIZE EQUAL 64) list(APPEND vivox_libs @@ -90,28 +68,24 @@ if(WINDOWS) # Filenames are different for 32/64 bit BugSplat file and we don't # have any control over them so need to branch. - if (USE_SENTRY) + if (TARGET al::sentry) list(APPEND release_files sentry.dll) endif () - if (USE_FMODSTUDIO) + if (TARGET ll::fmodstudio) list(APPEND debug_files fmodL.dll) list(APPEND release_files fmod.dll) - endif (USE_FMODSTUDIO) + endif () - if (USE_OPENAL) + if (TARGET ll::openal) list(APPEND debug_files OpenAL32.dll alut.dll) list(APPEND release_files OpenAL32.dll alut.dll) endif () - if(USE_DISCORD) + if(TARGET al::discord-gamesdk) list(APPEND release_files discord_game_sdk.dll) endif() elseif(DARWIN) - set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}/Debug/Resources") - set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/Resources") - set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}/Release/Resources") - set(vivox_lib_dir "${ARCH_PREBUILT_DIRS_RELEASE}") set(slvoice_files SLVoice) set(vivox_libs @@ -126,22 +100,16 @@ elseif(DARWIN) libndofdev.dylib ) - if (USE_FMODSTUDIO) + if (TARGET ll::fmodstudio) list(APPEND debug_files libfmodL.dylib) list(APPEND release_files libfmod.dylib) - endif (USE_FMODSTUDIO) + endif () - if(USE_DISCORD) + if(TARGET al::discord-gamesdk) list(APPEND release_files discord_game_sdk.dylib) endif() elseif(LINUX) - # linux is weird, multiple side by side configurations aren't supported - # and we don't seem to have any debug shared libs built yet anyways... - set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}") - set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}") - set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}") - set(vivox_lib_dir "${ARCH_PREBUILT_DIRS_RELEASE}") set(vivox_libs libsndfile.so.1 @@ -161,18 +129,23 @@ elseif(LINUX) set(release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}") # *FIX - figure out what to do with duplicate libalut.so here -brad set(release_files - libopenal.so - libjpeg.so - libjpeg.so.8 - libjpeg.so.8.2.2 - ) + ${EXPAT_COPY} + ) - if (USE_FMODSTUDIO) + if( USE_AUTOBUILD_3P ) + list( APPEND release_files + libjpeg.so + libjpeg.so.8 + libjpeg.so.8.2.2 + ) + endif() + + if (TARGET ll::fmodstudio) list(APPEND debug_files libfmodL.so) list(APPEND release_files libfmod.so) - endif (USE_FMODSTUDIO) + endif () - if(USE_DISCORD) + if(TARGET al::discord-gamesdk) list(APPEND release_files libdiscord_game_sdk.so) endif() @@ -201,75 +174,33 @@ endif(WINDOWS) # Done building the file lists, now set up the copy commands. ################################################################ -if (GEN_IS_MULTI_CONFIG OR UPPERCASE_CMAKE_BUILD_TYPE MATCHES DEBUG) - copy_if_different( - ${slvoice_src_dir} - "${SHARED_LIB_STAGING_DIR_DEBUG}" - out_targets - ${slvoice_files} - ) - list(APPEND third_party_targets ${out_targets}) +# Curiously, slvoice_files are only copied to SHARED_LIB_STAGING_DIR_RELEASE. +# It's unclear whether this is oversight or intentional, but anyway leave the +# single copy_if_different command rather than using to_staging_dirs. - to_debug_staging_dirs( - ${vivox_lib_dir} - third_party_targets - ${vivox_libs} - ) - - to_debug_staging_dirs( - ${debug_src_dir} - third_party_targets - ${debug_files} - ) -endif() - -if (GEN_IS_MULTI_CONFIG OR UPPERCASE_CMAKE_BUILD_TYPE MATCHES RELWITHDEBINFO) +if( slvoice_src_dir ) copy_if_different( - ${slvoice_src_dir} - "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}" - out_targets - ${slvoice_files} - ) + ${slvoice_src_dir} + "${SHARED_LIB_STAGING_DIR}" + out_targets + ${slvoice_files} + ) list(APPEND third_party_targets ${out_targets}) - - to_relwithdeb_staging_dirs( - ${vivox_lib_dir} - third_party_targets - ${vivox_libs} - ) - - to_relwithdeb_staging_dirs( - ${release_src_dir} - third_party_targets - ${release_files} - ) -endif() - -if (GEN_IS_MULTI_CONFIG OR UPPERCASE_CMAKE_BUILD_TYPE MATCHES RELEASE) - copy_if_different( - ${slvoice_src_dir} - "${SHARED_LIB_STAGING_DIR_RELEASE}" - out_targets - ${slvoice_files} - ) - list(APPEND third_party_targets ${out_targets}) - - to_release_staging_dirs( - ${vivox_lib_dir} - third_party_targets - ${vivox_libs} - ) - - to_release_staging_dirs( - ${release_src_dir} - third_party_targets - ${release_files} - ) endif() -if(NOT USESYSTEMLIBS) - add_custom_target( - stage_third_party_libs ALL - DEPENDS ${third_party_targets} - ) -endif(NOT USESYSTEMLIBS) +to_staging_dirs( + ${vivox_lib_dir} + third_party_targets + ${vivox_libs} + ) + +to_staging_dirs( + ${release_src_dir} + third_party_targets + ${release_files} + ) + +add_custom_target( + stage_third_party_libs ALL + DEPENDS ${third_party_targets} +) diff --git a/indra/cmake/DBusGlib.cmake b/indra/cmake/DBusGlib.cmake index 5e46b6711a1363856fa425684dcec40865a9aa7c..c9b727ca9df7acec98b7dd28b3e5c43855df7a25 100644 --- a/indra/cmake/DBusGlib.cmake +++ b/indra/cmake/DBusGlib.cmake @@ -1,29 +1,14 @@ # -*- cmake -*- include(Prebuilt) -if (USESYSTEMLIBS) - include(FindPkgConfig) +add_library( ll::dbus INTERFACE IMPORTED) - pkg_check_modules(DBUSGLIB REQUIRED dbus-glib-1) +if( LINUX ) + # Only define this when not using the prebuild 3ps, lls prebuild is broken + if( NOT USE_AUTOBUILD_3P ) + target_compile_definitions( ll::dbus INTERFACE LL_DBUS_ENABLED ) + endif() + use_system_binary(dbus) -elseif (LINUX) use_prebuilt_binary(dbus_glib) - set(DBUSGLIB_FOUND ON FORCE BOOL) - set(DBUSGLIB_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include/dbus - ) - # We don't need to explicitly link against dbus-glib itself, because - # the viewer probes for the system's copy at runtime. - set(DBUSGLIB_LIBRARIES - gobject-2.0 - glib-2.0 - ) -endif (USESYSTEMLIBS) - -if (DBUSGLIB_FOUND) - set(DBUSGLIB ON CACHE BOOL "Build with dbus-glib message bus support.") -endif (DBUSGLIB_FOUND) - -if (DBUSGLIB) - add_definitions(-DLL_DBUS_ENABLED=1) -endif (DBUSGLIB) +endif() diff --git a/indra/cmake/DiscordSDK.cmake b/indra/cmake/DiscordSDK.cmake index 48fd0fdda5c61a1fa08f1263312262c677ebfab8..3d06b997a7835f93dcc8a46d0b2d3d441826cc5d 100644 --- a/indra/cmake/DiscordSDK.cmake +++ b/indra/cmake/DiscordSDK.cmake @@ -1,37 +1,47 @@ # -*- cmake -*- -include(Linking) include(Prebuilt) -include(Variables) + +include_guard() + +#Discord Integration +option(USE_DISCORD "Enable Discord client integration" OFF) + +if(DEFINED ENV{DISCORD_CLIENTID}) + set(DISCORD_CLIENTID $ENV{DISCORD_CLIENTID} CACHE STRING "Discord Client ID" FORCE) +else() + set(DISCORD_CLIENTID "" CACHE STRING "Discord Client ID") +endif() + +if (INSTALL_PROPRIETARY) + set(USE_DISCORD ON CACHE BOOL "Use Discord SDK" FORCE) + if (DISCORD_CLIENTID) + set(USE_DISCORD ON CACHE BOOL "Use Discord SDK" FORCE) + else () + set(USE_DISCORD OFF CACHE BOOL "Use Discord SDK" FORCE) + endif () +endif () if (USE_DISCORD) - if (STANDALONE) - # In that case, we use the version of the library installed on the system - set(DISCORD_FIND_REQUIRED ON) - include(FindFMODSTUDIO) - else (STANDALONE) + add_library( al::discord-gamesdk INTERFACE IMPORTED ) + use_prebuilt_binary(discord-gamesdk) if (WINDOWS) - set(DISCORD_LIBRARY + target_link_libraries( al::discord-gamesdk INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/discordgamesdk.lib ${ARCH_PREBUILT_DIRS_RELEASE}/discord_game_sdk.dll.lib) elseif (DARWIN) - set(DISCORD_LIBRARY + target_link_libraries( al::discord-gamesdk INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libdiscordgamesdk.a ${ARCH_PREBUILT_DIRS_RELEASE}/discord_game_sdk.dylib) elseif (LINUX) - set(DISCORD_LIBRARY + target_link_libraries( al::discord-gamesdk INTERFACE optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libdiscord_game_sdk.so optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libdiscordgamesdk.a) endif (WINDOWS) - set(DISCORD_LIBRARIES ${DISCORD_LIBRARY}) - set(DISCORD_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/discord/) - - add_definitions(-DUSE_DISCORD=1) - endif (STANDALONE) - - if(DISCORD_CLIENTID STREQUAL "") - message(FATAL_ERROR "You must set a ClientID with -DDISCORD_CLIENTID= to enable Discord integration") - endif() + target_include_directories( al::discord-gamesdk SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/discord/) + if(DISCORD_CLIENTID STREQUAL "") + message(FATAL_ERROR "You must set a ClientID with -DDISCORD_CLIENTID= to enable Discord integration") + endif() + target_compile_definitions( al::discord-gamesdk INTERFACE AL_DISCORD=1 DISCORD_CLIENTID=${DISCORD_CLIENTID}) endif (USE_DISCORD) - diff --git a/indra/cmake/DragDrop.cmake b/indra/cmake/DragDrop.cmake index 73ef59b18fc35724c94e0b8d4a5ade89e63aa246..26e7828830d75c6d4321de07767de2b92db2450e 100644 --- a/indra/cmake/DragDrop.cmake +++ b/indra/cmake/DragDrop.cmake @@ -1,20 +1,16 @@ # -*- cmake -*- - set(OS_DRAG_DROP ON CACHE BOOL "Build the viewer with OS level drag and drop turned on or off") - - if (OS_DRAG_DROP) +set(OS_DRAG_DROP ON CACHE BOOL "Build the viewer with OS level drag and drop turned on or off") +if (OS_DRAG_DROP) if (WINDOWS) - add_definitions(-DLL_OS_DRAGDROP_ENABLED=1) + add_definitions(-DLL_OS_DRAGDROP_ENABLED=1) endif (WINDOWS) - if (DARWIN) - add_definitions(-DLL_OS_DRAGDROP_ENABLED=1) + add_definitions(-DLL_OS_DRAGDROP_ENABLED=1) endif (DARWIN) - if (LINUX) - add_definitions(-DLL_OS_DRAGDROP_ENABLED=0) + add_definitions(-DLL_OS_DRAGDROP_ENABLED=1) endif (LINUX) - - endif (OS_DRAG_DROP) +endif (OS_DRAG_DROP) diff --git a/indra/cmake/EXPAT.cmake b/indra/cmake/EXPAT.cmake index 586fd09f2aa0e2dde76599ccb1bc70cf268cf50b..1a0b8789dc40e0f2b043262c9468dd2282b9c061 100644 --- a/indra/cmake/EXPAT.cmake +++ b/indra/cmake/EXPAT.cmake @@ -1,21 +1,19 @@ # -*- cmake -*- include(Prebuilt) -set(EXPAT_FIND_QUIETLY ON) -set(EXPAT_FIND_REQUIRED ON) +include_guard() +add_library( ll::expat INTERFACE IMPORTED ) -if (USESYSTEMLIBS) - include(FindEXPAT) -else (USESYSTEMLIBS) - use_prebuilt_binary(expat) - if (WINDOWS) - set(EXPAT_LIBRARIES +use_system_binary(expat) +use_prebuilt_binary(expat) +if (WINDOWS) + target_compile_definitions( ll::expat INTERFACE XML_STATIC=1) + target_link_libraries( ll::expat INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/libexpatd.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libexpat.lib) - else () - set(EXPAT_LIBRARIES +else () + target_link_libraries( ll::expat INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/libexpat.a optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libexpat.a) - endif () - set(EXPAT_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) -endif (USESYSTEMLIBS) +endif () +target_include_directories( ll::expat SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include ) diff --git a/indra/cmake/Epoxy.cmake b/indra/cmake/Epoxy.cmake deleted file mode 100644 index 6f68e01addcfa6ef57ab46531bfbd1638f907e0d..0000000000000000000000000000000000000000 --- a/indra/cmake/Epoxy.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# -*- cmake -*- -include(Linking) -include(Prebuilt) - -if (USESYSTEMLIBS) - include(FindPkgConfig) - - pkg_check_modules(EPOXY REQUIRED epoxy) -else (USESYSTEMLIBS) - #use_prebuilt_binary(libepoxy) - set(EPOXY_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/) - if (WINDOWS) - set(EPOXY_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/epoxy.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/epoxy.lib) - else () - set(EPOXY_LIBRARIES epoxy) - endif() -endif (USESYSTEMLIBS) \ No newline at end of file diff --git a/indra/cmake/ExamplePlugin.cmake b/indra/cmake/ExamplePlugin.cmake index 5d826c1f66f5eb8c4b5cf57a93463b8fb456b90d..62340354749812d51c7d5e143cc93c8de4d540b2 100644 --- a/indra/cmake/ExamplePlugin.cmake +++ b/indra/cmake/ExamplePlugin.cmake @@ -2,15 +2,5 @@ include(Linking) include(Prebuilt) -if (USESYSTEMLIBS) - set(EXAMPLEPLUGIN OFF CACHE BOOL +set(EXAMPLEPLUGIN ON CACHE BOOL "EXAMPLEPLUGIN support for the llplugin/llmedia test apps.") -else (USESYSTEMLIBS) - set(EXAMPLEPLUGIN ON CACHE BOOL - "EXAMPLEPLUGIN support for the llplugin/llmedia test apps.") -endif (USESYSTEMLIBS) - -if (WINDOWS) -elseif (DARWIN) -elseif (LINUX) -endif (WINDOWS) diff --git a/indra/cmake/FMODSTUDIO.cmake b/indra/cmake/FMODSTUDIO.cmake index ac4a59f86a497f0ac4b845539616ba4662b2c88b..4848017d3b141481bfb5173642468d43e3ee8c76 100644 --- a/indra/cmake/FMODSTUDIO.cmake +++ b/indra/cmake/FMODSTUDIO.cmake @@ -1,48 +1,50 @@ # -*- cmake -*- -include(Linking) -include(Prebuilt) -# FMOD can be set when launching the make using the argument -DUSE_FMODSTUDIO:BOOL=ON +include_guard() + +# FMODSTUDIO can be set when launching the make using the argument -DFMODSTUDIO:BOOL=ON # When building using proprietary binaries though (i.e. having access to LL private servers), # we always build with FMODSTUDIO. -# Open source devs should use the -DFMODSTUDIO:BOOL=ON then if they want to build with FMOD, whether -# they are using STANDALONE or not. if (INSTALL_PROPRIETARY) - set(USE_FMODSTUDIO ON CACHE BOOL "Use FMOD Studio audio subsystem" FORCE) + set(USE_FMODSTUDIO ON CACHE BOOL "Using FMODSTUDIO sound library.") endif (INSTALL_PROPRIETARY) +# ND: To streamline arguments passed, switch from FMODSTUDIO to USE_FMODSTUDIO +# To not break all old build scripts convert old arguments but warn about it +if(FMODSTUDIO) + message( WARNING "Use of the FMODSTUDIO argument is deprecated, please switch to USE_FMODSTUDIO") + set(USE_FMODSTUDIO ${FMODSTUDIO}) +endif() + if (USE_FMODSTUDIO) - if (STANDALONE) - # In that case, we use the version of the library installed on the system - set(FMODSTUDIO_FIND_REQUIRED ON) - include(FindFMODSTUDIO) - else (STANDALONE) - if (FMODSTUDIO_LIBRARY AND FMODSTUDIO_INCLUDE_DIR) - # If the path have been specified in the arguments, use that - set(FMODSTUDIO_LIBRARIES ${FMODSTUDIO_LIBRARY}) - MESSAGE(STATUS "Using FMODSTUDIO path: ${FMODSTUDIO_LIBRARIES}, ${FMODSTUDIO_INCLUDE_DIR}") - else (FMODSTUDIO_LIBRARY AND FMODSTUDIO_INCLUDE_DIR) - # If not, we're going to try to get the package listed in autobuild.xml - # Note: if you're not using INSTALL_PROPRIETARY, the package URL should be local (file:/// URL) - # as accessing the private LL location will fail if you don't have the credential - include(Prebuilt) - use_prebuilt_binary(fmodstudio) - if (WINDOWS) - set(FMODSTUDIO_LIBRARY + add_library( ll::fmodstudio INTERFACE IMPORTED ) + target_compile_definitions( ll::fmodstudio INTERFACE LL_FMODSTUDIO=1) + + if (FMODSTUDIO_LIBRARY AND FMODSTUDIO_INCLUDE_DIR) + # If the path have been specified in the arguments, use that + + target_link_libraries(ll::fmodstudio INTERFACE ${FMODSTUDIO_LIBRARY}) + target_include_directories( ll::fmodstudio SYSTEM INTERFACE ${FMODSTUDIO_INCLUDE_DIR}) + else (FMODSTUDIO_LIBRARY AND FMODSTUDIO_INCLUDE_DIR) + # If not, we're going to try to get the package listed in autobuild.xml + # Note: if you're not using INSTALL_PROPRIETARY, the package URL should be local (file:/// URL) + # as accessing the private LL location will fail if you don't have the credential + include(Prebuilt) + use_prebuilt_binary(fmodstudio) + if (WINDOWS) + target_link_libraries( ll::fmodstudio INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/fmodL_vc.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/fmod_vc.lib) - elseif (DARWIN) - set(FMODSTUDIO_LIBRARY - debug fmodL - optimized fmod) - elseif (LINUX) - set(FMODSTUDIO_LIBRARY - debug fmodL - optimized fmod) - endif (WINDOWS) - set(FMODSTUDIO_LIBRARIES ${FMODSTUDIO_LIBRARY}) - set(FMODSTUDIO_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/fmodstudio) - endif (FMODSTUDIO_LIBRARY AND FMODSTUDIO_INCLUDE_DIR) - endif (STANDALONE) -endif (USE_FMODSTUDIO) + elseif (DARWIN) + #despite files being called libfmod.dylib, we are searching for fmod + target_link_libraries( ll::fmodstudio INTERFACE fmod) + elseif (LINUX) + target_link_libraries( ll::fmodstudio INTERFACE fmod) + endif (WINDOWS) + + target_include_directories( ll::fmodstudio SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/fmodstudio) + endif (FMODSTUDIO_LIBRARY AND FMODSTUDIO_INCLUDE_DIR) +else() + set( USE_FMODSTUDIO "OFF") +endif () diff --git a/indra/cmake/FindAPR.cmake b/indra/cmake/FindAPR.cmake deleted file mode 100644 index 906b6c945204ba3b3dc7d078673308c9bbecb83c..0000000000000000000000000000000000000000 --- a/indra/cmake/FindAPR.cmake +++ /dev/null @@ -1,94 +0,0 @@ -# -*- cmake -*- - -# - Find Apache Portable Runtime -# Find the APR includes and libraries -# This module defines -# APR_INCLUDE_DIR and APRUTIL_INCLUDE_DIR, where to find apr.h, etc. -# APR_LIBRARIES and APRUTIL_LIBRARIES, the libraries needed to use APR. -# APR_FOUND and APRUTIL_FOUND, If false, do not try to use APR. -# also defined, but not for general use are -# APR_LIBRARY and APRUTIL_LIBRARY, where to find the APR library. - -# APR first. - -FIND_PATH(APR_INCLUDE_DIR apr.h -/usr/local/include/apr-1 -/usr/local/include/apr-1.0 -/usr/include/apr-1 -/usr/include/apr-1.0 -) - -SET(APR_NAMES ${APR_NAMES} apr-1) -FIND_LIBRARY(APR_LIBRARY - NAMES ${APR_NAMES} - PATHS /usr/lib /usr/local/lib - ) - -IF (APR_LIBRARY AND APR_INCLUDE_DIR) - SET(APR_LIBRARIES ${APR_LIBRARY}) - SET(APR_FOUND "YES") -ELSE (APR_LIBRARY AND APR_INCLUDE_DIR) - SET(APR_FOUND "NO") -ENDIF (APR_LIBRARY AND APR_INCLUDE_DIR) - - -IF (APR_FOUND) - IF (NOT APR_FIND_QUIETLY) - MESSAGE(STATUS "Found APR: ${APR_LIBRARIES}") - ENDIF (NOT APR_FIND_QUIETLY) -ELSE (APR_FOUND) - IF (APR_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find APR library") - ENDIF (APR_FIND_REQUIRED) -ENDIF (APR_FOUND) - -# Deprecated declarations. -SET (NATIVE_APR_INCLUDE_PATH ${APR_INCLUDE_DIR} ) -GET_FILENAME_COMPONENT (NATIVE_APR_LIB_PATH ${APR_LIBRARY} PATH) - -MARK_AS_ADVANCED( - APR_LIBRARY - APR_INCLUDE_DIR - ) - -# Next, APRUTIL. - -FIND_PATH(APRUTIL_INCLUDE_DIR apu.h -/usr/local/include/apr-1 -/usr/local/include/apr-1.0 -/usr/include/apr-1 -/usr/include/apr-1.0 -) - -SET(APRUTIL_NAMES ${APRUTIL_NAMES} aprutil-1) -FIND_LIBRARY(APRUTIL_LIBRARY - NAMES ${APRUTIL_NAMES} - PATHS /usr/lib /usr/local/lib - ) - -IF (APRUTIL_LIBRARY AND APRUTIL_INCLUDE_DIR) - SET(APRUTIL_LIBRARIES ${APRUTIL_LIBRARY}) - SET(APRUTIL_FOUND "YES") -ELSE (APRUTIL_LIBRARY AND APRUTIL_INCLUDE_DIR) - SET(APRUTIL_FOUND "NO") -ENDIF (APRUTIL_LIBRARY AND APRUTIL_INCLUDE_DIR) - - -IF (APRUTIL_FOUND) - IF (NOT APRUTIL_FIND_QUIETLY) - MESSAGE(STATUS "Found APRUTIL: ${APRUTIL_LIBRARIES}") - ENDIF (NOT APRUTIL_FIND_QUIETLY) -ELSE (APRUTIL_FOUND) - IF (APRUTIL_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find APRUTIL library") - ENDIF (APRUTIL_FIND_REQUIRED) -ENDIF (APRUTIL_FOUND) - -# Deprecated declarations. -SET (NATIVE_APRUTIL_INCLUDE_PATH ${APRUTIL_INCLUDE_DIR} ) -GET_FILENAME_COMPONENT (NATIVE_APRUTIL_LIB_PATH ${APRUTIL_LIBRARY} PATH) - -MARK_AS_ADVANCED( - APRUTIL_LIBRARY - APRUTIL_INCLUDE_DIR - ) diff --git a/indra/cmake/FindFMODSTUDIO.cmake b/indra/cmake/FindFMODSTUDIO.cmake deleted file mode 100644 index 4562b0ae450aeb2b27ad3905ead1a46ecb5c313b..0000000000000000000000000000000000000000 --- a/indra/cmake/FindFMODSTUDIO.cmake +++ /dev/null @@ -1,65 +0,0 @@ -# -*- cmake -*- - -# - Find FMODSTUDIO -# Find the FMODSTUDIO includes and library -# This module defines -# FMODSTUDIO_INCLUDE_DIR, where to find fmod.h and fmod_errors.h -# FMODSTUDIO_LIBRARIES, the libraries needed to use FMODSTUDIO. -# FMODSTUDIO, If false, do not try to use FMODSTUDIO. -# also defined, but not for general use are -# FMODSTUDIO_LIBRARY, where to find the FMODSTUDIO library. - -FIND_PATH(FMODSTUDIO_INCLUDE_DIR fmod.h PATH_SUFFIXES fmod) - -SET(FMODSTUDIO_NAMES ${FMODSTUDIO_NAMES} fmod fmod_vc) -FIND_LIBRARY(FMODSTUDIO_LIBRARY - NAMES ${FMODSTUDIO_NAMES} - PATH_SUFFIXES fmod - ) - -IF (FMODSTUDIO_SDK_DIR OR WINDOWS) - if(WINDOWS) - set(FMODSTUDIO_SDK_DIR "$ENV{PROGRAMFILES}/FMOD SoundSystem/FMOD Programmers API Windows" CACHE PATH "Path to FMODSTUDIO") - STRING(REGEX REPLACE "\\\\" "/" FMODSTUDIO_SDK_DIR ${FMODSTUDIO_SDK_DIR}) - endif(WINDOWS) - find_library(FMODSTUDIO_LIBRARY - fmod_vc fmodL_vc - PATHS - ${FMODSTUDIO_SDK_DIR}/api/lib - ${FMODSTUDIO_SDK_DIR}/api - ${FMODSTUDIO_SDK_DIR} - ) - find_path(FMODSTUDIO_INCLUDE_DIR fmod.h - ${FMODSTUDIO_SDK_DIR}/api/inc - ${FMODSTUDIO_SDK_DIR}/api - ${FMODSTUDIO_SDK_DIR} - ) - find_path(FMODSTUDIO_INCLUDE_DIR fmod.h - ${FMODSTUDIO_SDK_DIR}/api/inc - ${FMODSTUDIO_SDK_DIR}/api - ${FMODSTUDIO_SDK_DIR} - ) - IF (FMODSTUDIO_LIBRARY AND FMODSTUDIO_INCLUDE_DIR) - SET(FMODSTUDIO_LIBRARIES ${FMODSTUDIO_LIBRARY}) - SET(FMODSTUDIO_FOUND "YES") - endif (FMODSTUDIO_LIBRARY AND FMODSTUDIO_INCLUDE_DIR) -ENDIF (FMODSTUDIO_SDK_DIR OR WINDOWS) - -IF (FMODSTUDIO_FOUND) - IF (NOT FMODSTUDIO_FIND_QUIETLY) - MESSAGE(STATUS "Found FMODSTUDIO: ${FMODSTUDIO_LIBRARIES}") - ENDIF (NOT FMODSTUDIO_FIND_QUIETLY) -ELSE (FMODSTUDIO_FOUND) - IF (FMODSTUDIO_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find FMODSTUDIO library") - ENDIF (FMODSTUDIO_FIND_REQUIRED) -ENDIF (FMODSTUDIO_FOUND) - -# Deprecated declarations. -SET (NATIVE_FMODSTUDIO_INCLUDE_PATH ${FMODSTUDIO_INCLUDE_DIR} ) -GET_FILENAME_COMPONENT (NATIVE_FMODSTUDIO_LIB_PATH ${FMODSTUDIO_LIBRARY} PATH) - -MARK_AS_ADVANCED( - FMODSTUDIO_LIBRARY - FMODSTUDIO_INCLUDE_DIR - ) diff --git a/indra/cmake/FindGooglePerfTools.cmake b/indra/cmake/FindGooglePerfTools.cmake deleted file mode 100644 index bb125d538e04a7a5e45cac165ed407efb7fcf081..0000000000000000000000000000000000000000 --- a/indra/cmake/FindGooglePerfTools.cmake +++ /dev/null @@ -1,66 +0,0 @@ -# -*- cmake -*- - -# - Find Google perftools -# Find the Google perftools includes and libraries -# This module defines -# GOOGLE_PERFTOOLS_INCLUDE_DIR, where to find heap-profiler.h, etc. -# GOOGLE_PERFTOOLS_FOUND, If false, do not try to use Google perftools. -# also defined for general use are -# TCMALLOC_LIBRARIES, where to find the tcmalloc library. -# STACKTRACE_LIBRARIES, where to find the stacktrace library. -# PROFILER_LIBRARIES, where to find the profiler library. - -FIND_PATH(GOOGLE_PERFTOOLS_INCLUDE_DIR google/heap-profiler.h -/usr/local/include -/usr/include -) - -SET(TCMALLOC_NAMES ${TCMALLOC_NAMES} tcmalloc) -FIND_LIBRARY(TCMALLOC_LIBRARY - NAMES ${TCMALLOC_NAMES} - PATHS /usr/lib /usr/local/lib - ) - -IF (TCMALLOC_LIBRARY AND GOOGLE_PERFTOOLS_INCLUDE_DIR) - SET(TCMALLOC_LIBRARIES ${TCMALLOC_LIBRARY}) - SET(GOOGLE_PERFTOOLS_FOUND "YES") -ELSE (TCMALLOC_LIBRARY AND GOOGLE_PERFTOOLS_INCLUDE_DIR) - SET(GOOGLE_PERFTOOLS_FOUND "NO") -ENDIF (TCMALLOC_LIBRARY AND GOOGLE_PERFTOOLS_INCLUDE_DIR) - -SET(STACKTRACE_NAMES ${STACKTRACE_NAMES} stacktrace) -FIND_LIBRARY(STACKTRACE_LIBRARY - NAMES ${STACKTRACE_LIBRARY} - PATHS /usr/lib /usr/local/lib - ) - -IF (STACKTRACE_LIBRARY AND GOOGLE_PERFTOOLS_INCLUDE_DIR) - SET(STACKTRACE_LIBRARIES ${STACKTRACE_LIBRARY}) -ENDIF (STACKTRACE_LIBRARY AND GOOGLE_PERFTOOLS_INCLUDE_DIR) - -SET(PROFILER_NAMES ${PROFILER_NAMES} profiler) -FIND_LIBRARY(PROFILER_LIBRARY - NAMES ${PROFILER_LIBRARY} - PATHS /usr/lib /usr/local/lib - ) - -IF (PROFILER_LIBRARY AND GOOGLE_PERFTOOLS_INCLUDE_DIR) - SET(PROFILER_LIBRARIES ${PROFILER_LIBRARY}) -ENDIF (PROFILER_LIBRARY AND GOOGLE_PERFTOOLS_INCLUDE_DIR) - -IF (GOOGLE_PERFTOOLS_FOUND) - IF (NOT GOOGLE_PERFTOOLS_FIND_QUIETLY) - MESSAGE(STATUS "Found Google perftools: ${GOOGLE_PERFTOOLS_LIBRARIES}") - ENDIF (NOT GOOGLE_PERFTOOLS_FIND_QUIETLY) -ELSE (GOOGLE_PERFTOOLS_FOUND) - IF (GOOGLE_PERFTOOLS_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find Google perftools library") - ENDIF (GOOGLE_PERFTOOLS_FIND_REQUIRED) -ENDIF (GOOGLE_PERFTOOLS_FOUND) - -MARK_AS_ADVANCED( - TCMALLOC_LIBRARY - STACKTRACE_LIBRARY - PROFILER_LIBRARY - GOOGLE_PERFTOOLS_INCLUDE_DIR - ) diff --git a/indra/cmake/FindHUNSPELL.cmake b/indra/cmake/FindHUNSPELL.cmake deleted file mode 100644 index d411bdb9e5eba98c57ecca9f96c0cefc7f11a7f1..0000000000000000000000000000000000000000 --- a/indra/cmake/FindHUNSPELL.cmake +++ /dev/null @@ -1,38 +0,0 @@ -# -*- cmake -*- - -# - Find HUNSPELL -# This module defines -# HUNSPELL_INCLUDE_DIR, where to find libhunspell.h, etc. -# HUNSPELL_LIBRARY, the library needed to use HUNSPELL. -# HUNSPELL_FOUND, If false, do not try to use HUNSPELL. - -find_path(HUNSPELL_INCLUDE_DIR hunspell.h - PATH_SUFFIXES hunspell - ) - -set(HUNSPELL_NAMES ${HUNSPELL_NAMES} libhunspell-1.3 libhunspell) -find_library(HUNSPELL_LIBRARY - NAMES ${HUNSPELL_NAMES} - ) - -if (HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR) - set(HUNSPELL_FOUND "YES") -else (HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR) - set(HUNSPELL_FOUND "NO") -endif (HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR) - - -if (HUNSPELL_FOUND) - if (NOT HUNSPELL_FIND_QUIETLY) - message(STATUS "Found Hunspell: Library in '${HUNSPELL_LIBRARY}' and header in '${HUNSPELL_INCLUDE_DIR}' ") - endif (NOT HUNSPELL_FIND_QUIETLY) -else (HUNSPELL_FOUND) - if (HUNSPELL_FIND_REQUIRED) - message(FATAL_ERROR " * * *\nCould not find HUNSPELL library! * * *") - endif (HUNSPELL_FIND_REQUIRED) -endif (HUNSPELL_FOUND) - -mark_as_advanced( - HUNSPELL_LIBRARY - HUNSPELL_INCLUDE_DIR - ) diff --git a/indra/cmake/FindNDOF.cmake b/indra/cmake/FindNDOF.cmake deleted file mode 100644 index 6dcf590a53d5f77cb6614752d8f78f0ef0336f30..0000000000000000000000000000000000000000 --- a/indra/cmake/FindNDOF.cmake +++ /dev/null @@ -1,39 +0,0 @@ -# -*- cmake -*- - -# - Find NDOF -# Find the NDOF includes and library -# This module defines -# NDOF_INCLUDE_DIR, where to find ndofdev_external.h, etc. -# NDOF_LIBRARY, the library needed to use NDOF. -# NDOF_FOUND, If false, do not try to use NDOF. - -find_path(NDOF_INCLUDE_DIR ndofdev_external.h - PATH_SUFFIXES ndofdev - ) - -set(NDOF_NAMES ${NDOF_NAMES} ndofdev libndofdev) -find_library(NDOF_LIBRARY - NAMES ${NDOF_NAMES} - ) - -if (NDOF_LIBRARY AND NDOF_INCLUDE_DIR) - set(NDOF_FOUND "YES") -else (NDOF_LIBRARY AND NDOF_INCLUDE_DIR) - set(NDOF_FOUND "NO") -endif (NDOF_LIBRARY AND NDOF_INCLUDE_DIR) - - -if (NDOF_FOUND) - if (NOT NDOF_FIND_QUIETLY) - message(STATUS "Found NDOF: Library in '${NDOF_LIBRARY}' and header in '${NDOF_INCLUDE_DIR}' ") - endif (NOT NDOF_FIND_QUIETLY) -else (NDOF_FOUND) - if (NDOF_FIND_REQUIRED) - message(FATAL_ERROR " * * *\nCould not find NDOF library!\nIf you don't need Space Navigator Joystick support you can skip this test by configuring with -DNDOF:BOOL=OFF\n * * *") - endif (NDOF_FIND_REQUIRED) -endif (NDOF_FOUND) - -mark_as_advanced( - NDOF_LIBRARY - NDOF_INCLUDE_DIR - ) diff --git a/indra/cmake/FindOpenJPEG.cmake b/indra/cmake/FindOpenJPEG.cmake deleted file mode 100644 index 2d4353b54f991881e9620da269c8a86aee1433d5..0000000000000000000000000000000000000000 --- a/indra/cmake/FindOpenJPEG.cmake +++ /dev/null @@ -1,51 +0,0 @@ -# -*- cmake -*- - -# - Find OpenJPEG -# Find the OpenJPEG includes and library -# This module defines -# OPENJPEG_INCLUDE_DIR, where to find openjpeg.h, etc. -# OPENJPEG_LIBRARIES, the libraries needed to use OpenJPEG. -# OPENJPEG_FOUND, If false, do not try to use OpenJPEG. -# also defined, but not for general use are -# OPENJPEG_LIBRARY, where to find the OpenJPEG library. - -FIND_PATH(OPENJPEG_INCLUDE_DIR openjpeg.h -/usr/local/include/openjpeg -/usr/local/include -/usr/include/openjpeg -/usr/include -include/openjpeg -) - -SET(OPENJPEG_NAMES ${OPENJPEG_NAMES} openjp2) -FIND_LIBRARY(OPENJPEG_LIBRARY - NAMES ${OPENJPEG_NAMES} - PATHS /usr/lib /usr/local/lib - ) - -IF (OPENJPEG_LIBRARY AND OPENJPEG_INCLUDE_DIR) - SET(OPENJPEG_LIBRARIES ${OPENJPEG_LIBRARY}) - SET(OPENJPEG_FOUND "YES") -ELSE (OPENJPEG_LIBRARY AND OPENJPEG_INCLUDE_DIR) - SET(OPENJPEG_FOUND "NO") -ENDIF (OPENJPEG_LIBRARY AND OPENJPEG_INCLUDE_DIR) - - -IF (OPENJPEG_FOUND) - IF (NOT OPENJPEG_FIND_QUIETLY) - MESSAGE(STATUS "Found OpenJPEG: ${OPENJPEG_LIBRARIES}") - ENDIF (NOT OPENJPEG_FIND_QUIETLY) -ELSE (OPENJPEG_FOUND) - IF (OPENJPEG_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find OpenJPEG library") - ENDIF (OPENJPEG_FIND_REQUIRED) -ENDIF (OPENJPEG_FOUND) - -# Deprecated declarations. -SET (NATIVE_OPENJPEG_INCLUDE_PATH ${OPENJPEG_INCLUDE_DIR} ) -GET_FILENAME_COMPONENT (NATIVE_OPENJPEG_LIB_PATH ${OPENJPEG_LIBRARY} PATH) - -MARK_AS_ADVANCED( - OPENJPEG_LIBRARY - OPENJPEG_INCLUDE_DIR - ) diff --git a/indra/cmake/FindURIPARSER.cmake b/indra/cmake/FindURIPARSER.cmake deleted file mode 100644 index 8ab9f0f4ed267302b6e7b71b08c3edb903ebd556..0000000000000000000000000000000000000000 --- a/indra/cmake/FindURIPARSER.cmake +++ /dev/null @@ -1,46 +0,0 @@ -# -*- cmake -*- - -# - Find uriparser -# Find the URIPARSER includes and library -# This module defines -# URIPARSER_INCLUDE_DIRS, where to find uriparser.h, etc. -# URIPARSER_LIBRARIES, the libraries needed to use uriparser. -# URIPARSER_FOUND, If false, do not try to use uriparser. -# -# This FindURIPARSER is about 43 times as fast the one provided with cmake (2.8.x), -# because it doesn't look up the version of uriparser, resulting in a dramatic -# speed up for configure (from 4 minutes 22 seconds to 6 seconds). -# -# Note: Since this file is only used for standalone, the windows -# specific parts were left out. - -FIND_PATH(URIPARSER_INCLUDE_DIR uriparser/uri.h - NO_SYSTEM_ENVIRONMENT_PATH - ) - -FIND_LIBRARY(URIPARSER_LIBRARY uriparser) - -if (URIPARSER_LIBRARY AND URIPARSER_INCLUDE_DIR) - SET(URIPARSER_INCLUDE_DIRS ${URIPARSER_INCLUDE_DIR}) - SET(URIPARSER_LIBRARIES ${URIPARSER_LIBRARY}) - SET(URIPARSER_FOUND "YES") -else (URIPARSER_LIBRARY AND URIPARSER_INCLUDE_DIR) - SET(URIPARSER_FOUND "NO") -endif (URIPARSER_LIBRARY AND URIPARSER_INCLUDE_DIR) - -if (URIPARSER_FOUND) - if (NOT URIPARSER_FIND_QUIETLY) - message(STATUS "Found URIPARSER: ${URIPARSER_LIBRARIES}") - SET(URIPARSER_FIND_QUIETLY TRUE) - endif (NOT URIPARSER_FIND_QUIETLY) -else (URIPARSER_FOUND) - if (URIPARSER_FIND_REQUIRED) - message(FATAL_ERROR "Could not find URIPARSER library") - endif (URIPARSER_FIND_REQUIRED) -endif (URIPARSER_FOUND) - -mark_as_advanced( - URIPARSER_LIBRARY - URIPARSER_INCLUDE_DIR - ) - diff --git a/indra/cmake/FindXmlRpcEpi.cmake b/indra/cmake/FindXmlRpcEpi.cmake deleted file mode 100644 index ba217e74676f636b16403c9cd82a93952159a13a..0000000000000000000000000000000000000000 --- a/indra/cmake/FindXmlRpcEpi.cmake +++ /dev/null @@ -1,48 +0,0 @@ -# -*- cmake -*- - -# - Find XMLRPC-EPI -# Find the XMLRPC-EPI includes and library -# This module defines -# XMLRPCEPI_INCLUDE_DIR, where to find jpeglib.h, etc. -# XMLRPCEPI_LIBRARIES, the libraries needed to use XMLRPC-EPI. -# XMLRPCEPI_FOUND, If false, do not try to use XMLRPC-EPI. -# also defined, but not for general use are -# XMLRPCEPI_LIBRARY, where to find the XMLRPC-EPI library. - -FIND_PATH(XMLRPCEPI_INCLUDE_DIR xmlrpc-epi/xmlrpc.h -/usr/local/include -/usr/include -) - -SET(XMLRPCEPI_NAMES ${XMLRPCEPI_NAMES} xmlrpc-epi) -FIND_LIBRARY(XMLRPCEPI_LIBRARY - NAMES ${XMLRPCEPI_NAMES} - PATHS /usr/lib /usr/local/lib - ) - -IF (XMLRPCEPI_LIBRARY AND XMLRPCEPI_INCLUDE_DIR) - SET(XMLRPCEPI_LIBRARIES ${XMLRPCEPI_LIBRARY}) - SET(XMLRPCEPI_FOUND "YES") -ELSE (XMLRPCEPI_LIBRARY AND XMLRPCEPI_INCLUDE_DIR) - SET(XMLRPCEPI_FOUND "NO") -ENDIF (XMLRPCEPI_LIBRARY AND XMLRPCEPI_INCLUDE_DIR) - - -IF (XMLRPCEPI_FOUND) - IF (NOT XMLRPCEPI_FIND_QUIETLY) - MESSAGE(STATUS "Found XMLRPC-EPI: ${XMLRPCEPI_LIBRARIES}") - ENDIF (NOT XMLRPCEPI_FIND_QUIETLY) -ELSE (XMLRPCEPI_FOUND) - IF (XMLRPCEPI_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find XMLRPC-EPI library") - ENDIF (XMLRPCEPI_FIND_REQUIRED) -ENDIF (XMLRPCEPI_FOUND) - -# Deprecated declarations. -SET (NATIVE_XMLRPCEPI_INCLUDE_PATH ${XMLRPCEPI_INCLUDE_DIR} ) -GET_FILENAME_COMPONENT (NATIVE_XMLRPCEPI_LIB_PATH ${XMLRPCEPI_LIBRARY} PATH) - -MARK_AS_ADVANCED( - XMLRPCEPI_LIBRARY - XMLRPCEPI_INCLUDE_DIR - ) diff --git a/indra/cmake/FindZLIBNG.cmake b/indra/cmake/FindZLIBNG.cmake deleted file mode 100644 index 6e3c8cdddbfe283f10da559e345655f8dafe055e..0000000000000000000000000000000000000000 --- a/indra/cmake/FindZLIBNG.cmake +++ /dev/null @@ -1,46 +0,0 @@ -# -*- cmake -*- - -# - Find zlib-ng -# Find the ZLIB includes and library -# This module defines -# ZLIBNG_INCLUDE_DIRS, where to find zlib.h, etc. -# ZLIBNG_LIBRARIES, the libraries needed to use zlib. -# ZLIBNG_FOUND, If false, do not try to use zlib. -# -# This FindZLIBNG is about 43 times as fast the one provided with cmake (2.8.x), -# because it doesn't look up the version of zlib, resulting in a dramatic -# speed up for configure (from 4 minutes 22 seconds to 6 seconds). -# -# Note: Since this file is only used for standalone, the windows -# specific parts were left out. - -FIND_PATH(ZLIBNG_INCLUDE_DIR zlib.h - NO_SYSTEM_ENVIRONMENT_PATH - ) - -FIND_LIBRARY(ZLIBNG_LIBRARY z) - -if (ZLIBNG_LIBRARY AND ZLIBNG_INCLUDE_DIR) - SET(ZLIBNG_INCLUDE_DIRS ${ZLIBNG_INCLUDE_DIR}) - SET(ZLIBNG_LIBRARIES ${ZLIBNG_LIBRARY}) - SET(ZLIBNG_FOUND "YES") -else (ZLIBNG_LIBRARY AND ZLIBNG_INCLUDE_DIR) - SET(ZLIBNG_FOUND "NO") -endif (ZLINGB_LIBRARY AND ZLIBNG_INCLUDE_DIR) - -if (ZLIBNG_FOUND) - if (NOT ZLIBNG_FIND_QUIETLY) - message(STATUS "Found ZLIBNG: ${ZLIBNG_LIBRARIES}") - SET(ZLIBNG_FIND_QUIETLY TRUE) - endif (NOT ZLIBNG_FIND_QUIETLY) -else (ZLIBNG_FOUND) - if (ZLIBNG_FIND_REQUIRED) - message(FATAL_ERROR "Could not find ZLIBNG library") - endif (ZLIBNG_FIND_REQUIRED) -endif (ZLIBNG_FOUND) - -mark_as_advanced( - ZLIBNG_LIBRARY - ZLIBNG_INCLUDE_DIR - ) - diff --git a/indra/cmake/FreeType.cmake b/indra/cmake/FreeType.cmake index 5da33a88b3bcbdb4ffd2b4aeb8dc94746ea65301..1a6e6fa2f3727b86c50099f255793e561e043195 100644 --- a/indra/cmake/FreeType.cmake +++ b/indra/cmake/FreeType.cmake @@ -1,19 +1,25 @@ # -*- cmake -*- include(Prebuilt) -if (LINUX OR USESYSTEMLIBS) - include(FindPkgConfig) +include_guard() +add_library( ll::freetype INTERFACE IMPORTED ) - pkg_check_modules(FREETYPE REQUIRED freetype2) - pkg_check_modules(FONTCONFIG REQUIRED fontconfig) -else () - use_prebuilt_binary(freetype) - set(FREETYPE_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/freetype2) - if (WINDOWS) - set(FREETYPE_LIBRARIES +if(LINUX) + include(FindPkgConfig) + + pkg_check_modules(freetype2 REQUIRED IMPORTED_TARGET freetype2) + pkg_check_modules(fontconfig REQUIRED IMPORTED_TARGET fontconfig) + target_link_libraries( ll::freetype INTERFACE PkgConfig::freetype2 PkgConfig::fontconfig) + return() +endif() + +use_system_binary(freetype) +use_prebuilt_binary(freetype) +target_include_directories( ll::freetype SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/freetype2/) +if (WINDOWS) + target_link_libraries( ll::freetype INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/freetyped.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/freetype.lib) - else() - set(FREETYPE_LIBRARIES freetype) - endif() -endif () +else() + target_link_libraries( ll::freetype INTERFACE freetype) +endif() diff --git a/indra/cmake/GLEXT.cmake b/indra/cmake/GLEXT.cmake index 75a07c4d41c925a9cdbdb211192254e941ed0920..8308df6ee0a04ae534dd355b32a760248ae652e8 100644 --- a/indra/cmake/GLEXT.cmake +++ b/indra/cmake/GLEXT.cmake @@ -1,9 +1,13 @@ # -*- cmake -*- include(Prebuilt) +include(GLH) include(SDL2) -if (NOT USESYSTEMLIBS AND NOT SDL_FOUND) +add_library( ll::glext INTERFACE IMPORTED ) +if(NOT SDL_FOUND) +if (WINDOWS OR LINUX) + use_system_binary(glext) use_prebuilt_binary(glext) - use_prebuilt_binary(glh_linear) - set(GLEXT_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include) -endif () +endif (WINDOWS OR LINUX) +endif() + diff --git a/indra/cmake/GLH.cmake b/indra/cmake/GLH.cmake new file mode 100644 index 0000000000000000000000000000000000000000..0cefc3543ad158a9c30899620ad2680acfc1d248 --- /dev/null +++ b/indra/cmake/GLH.cmake @@ -0,0 +1,7 @@ +# -*- cmake -*- +include(Prebuilt) + +add_library( ll::glh_linear INTERFACE IMPORTED ) + +use_system_binary( glh_linear ) +use_prebuilt_binary(glh_linear) diff --git a/indra/cmake/GStreamer010Plugin.cmake b/indra/cmake/GStreamer010Plugin.cmake index 0657d37cf5ddf0048b1e35e8a84dfe2506d707c9..61f6f7403360ab62348f485d8135ab7b212234dc 100644 --- a/indra/cmake/GStreamer010Plugin.cmake +++ b/indra/cmake/GStreamer010Plugin.cmake @@ -1,38 +1,12 @@ # -*- cmake -*- include(Prebuilt) -include(LibXML2) +if (NOT LINUX) + return() +endif() -if (USESYSTEMLIBS) - include(FindPkgConfig) +add_library( ll::gstreamer INTERFACE IMPORTED ) +target_compile_definitions( ll::gstreamer INTERFACE LL_GSTREAMER010_ENABLED=1) +use_system_binary(gstreamer) - pkg_check_modules(GSTREAMER010 REQUIRED gstreamer-0.10) - pkg_check_modules(GSTREAMER010_PLUGINS_BASE REQUIRED gstreamer-plugins-base-0.10) -elseif (LINUX) - use_prebuilt_binary(gstreamer) - - set(GSTREAMER010_FOUND ON FORCE BOOL) - set(GSTREAMER010_PLUGINS_BASE_FOUND ON FORCE BOOL) - set(GSTREAMER010_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include/gstreamer-0.10 - ${LIBS_PREBUILT_DIR}/include/glib-2.0 - ${LIBXML2_INCLUDE_DIRS} - ) - # We don't need to explicitly link against gstreamer itself, because - # LLMediaImplGStreamer probes for the system's copy at runtime. - set(GSTREAMER010_LIBRARIES - gobject-2.0 - gmodule-2.0 - dl - gthread-2.0 - glib-2.0 - ) -endif () - -if (GSTREAMER010_FOUND AND GSTREAMER010_PLUGINS_BASE_FOUND) - set(GSTREAMER010 ON CACHE BOOL "Build with GStreamer-0.10 streaming media support.") -endif (GSTREAMER010_FOUND AND GSTREAMER010_PLUGINS_BASE_FOUND) - -if (GSTREAMER010) - add_definitions(-DLL_GSTREAMER010_ENABLED=1) -endif (GSTREAMER010) +use_prebuilt_binary(gstreamer) diff --git a/indra/cmake/Havok.cmake b/indra/cmake/Havok.cmake new file mode 100644 index 0000000000000000000000000000000000000000..652760e626c227fe0a4ab3f5d985dbf56044b534 --- /dev/null +++ b/indra/cmake/Havok.cmake @@ -0,0 +1,125 @@ +# -*- cmake -*- +include(Prebuilt) +include_guard() + +use_prebuilt_binary(havok-source) + +set(Havok_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/havok/Source) +list(APPEND Havok_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/havok/Demo) + +# HK_DISABLE_IMPLICIT_VVECTOR3_CONVERSION suppresses an intended conversion +# function which Xcode scolds us will unconditionally enter infinite +# recursion if called. This hides that function. +add_definitions("-DHK_DISABLE_IMPLICIT_VVECTOR3_CONVERSION") + +set(HAVOK_DEBUG_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-fulldebug) +set(HAVOK_RELEASE_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/release/havok) + +if (LL_DEBUG_HAVOK) + if (WIN32) + # Always link relwithdebinfo to havok-hybrid on windows. + set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-hybrid) + else (WIN32) + set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-fulldebug) + endif (WIN32) +else (LL_DEBUG_HAVOK) + set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/release/havok) +endif (LL_DEBUG_HAVOK) + +set(HAVOK_LIBS + hkBase + hkCompat + hkGeometryUtilities + hkInternal + hkSerialize + hkSceneData + hkpCollide + hkpUtilities + hkpConstraintSolver + hkpDynamics + hkpInternal + hkaiInternal + hkaiPathfinding + hkaiAiPhysicsBridge + hkcdInternal + hkcdCollide + hkpVehicle + hkVisualize + hkaiVisualize + hkgpConvexDecomposition +) + +unset(HK_DEBUG_LIBRARIES) +unset(HK_RELEASE_LIBRARIES) +unset(HK_RELWITHDEBINFO_LIBRARIES) + +if (DEBUG_PREBUILT) + # DEBUG_MESSAGE() displays debugging message + function(DEBUG_MESSAGE) + # prints message args separated by semicolons rather than spaces, + # but making it pretty is a lot more work + message(STATUS "${ARGN}") + endfunction(DEBUG_MESSAGE) +else (DEBUG_PREBUILT) + # without DEBUG_PREBUILT, DEBUG_MESSAGE() is a no-op + function(DEBUG_MESSAGE) + endfunction(DEBUG_MESSAGE) +endif (DEBUG_PREBUILT) + +# DEBUG_EXEC() reports each execute_process() before invoking +function(DEBUG_EXEC) + DEBUG_MESSAGE(${ARGN}) + execute_process(COMMAND ${ARGN}) +endfunction(DEBUG_EXEC) + +# *TODO: Figure out why we need to extract like this... +foreach(HAVOK_LIB ${HAVOK_LIBS}) + find_library(HAVOK_DEBUG_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_DEBUG_LIBRARY_PATH}) + find_library(HAVOK_RELEASE_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_RELEASE_LIBRARY_PATH}) + find_library(HAVOK_RELWITHDEBINFO_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_RELWITHDEBINFO_LIBRARY_PATH}) + + if(LINUX) + set(debug_dir "${HAVOK_DEBUG_LIBRARY_PATH}/${HAVOK_LIB}") + set(release_dir "${HAVOK_RELEASE_LIBRARY_PATH}/${HAVOK_LIB}") + set(relwithdebinfo_dir "${HAVOK_RELWITHDEBINFO_LIBRARY_PATH}/${HAVOK_LIB}") + + # Try to avoid extracting havok library each time we run cmake. + if("${havok_${HAVOK_LIB}_extracted}" STREQUAL "" AND EXISTS "${PREBUILD_TRACKING_DIR}/havok_${HAVOK_LIB}_extracted") + file(READ ${PREBUILD_TRACKING_DIR}/havok_${HAVOK_LIB}_extracted "havok_${HAVOK_LIB}_extracted") + DEBUG_MESSAGE("havok_${HAVOK_LIB}_extracted: \"${havok_${HAVOK_LIB}_extracted}\"") + endif("${havok_${HAVOK_LIB}_extracted}" STREQUAL "" AND EXISTS "${PREBUILD_TRACKING_DIR}/havok_${HAVOK_LIB}_extracted") + + if(${PREBUILD_TRACKING_DIR}/havok_source_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/havok_${HAVOK_LIB}_extracted OR NOT ${havok_${HAVOK_LIB}_extracted} EQUAL 0) + DEBUG_MESSAGE("Extracting ${HAVOK_LIB}...") + + foreach(lib ${debug_dir} ${release_dir} ${relwithdebinfo_dir}) + DEBUG_EXEC("mkdir" ${lib}) + DEBUG_EXEC("ar" "-xv" "../lib${HAVOK_LIB}.a" + WORKING_DIRECTORY ${lib}) + endforeach(lib) + + # Just assume success for now. + set(havok_${HAVOK_LIB}_extracted 0) + file(WRITE ${PREBUILD_TRACKING_DIR}/havok_${HAVOK_LIB}_extracted "${havok_${HAVOK_LIB}_extracted}") + + endif() + + file(GLOB extracted_debug "${debug_dir}/*.o") + file(GLOB extracted_release "${release_dir}/*.o") + file(GLOB extracted_relwithdebinfo "${relwithdebinfo_dir}/*.o") + + DEBUG_MESSAGE("extracted_debug ${debug_dir}/*.o") + DEBUG_MESSAGE("extracted_release ${release_dir}/*.o") + DEBUG_MESSAGE("extracted_relwithdebinfo ${relwithdebinfo_dir}/*.o") + + list(APPEND HK_DEBUG_LIBRARIES ${extracted_debug}) + list(APPEND HK_RELEASE_LIBRARIES ${extracted_release}) + list(APPEND HK_RELWITHDEBINFO_LIBRARIES ${extracted_relwithdebinfo}) + else(LINUX) + # Win32 + list(APPEND HK_DEBUG_LIBRARIES ${HAVOK_DEBUG_LIB_${HAVOK_LIB}}) + list(APPEND HK_RELEASE_LIBRARIES ${HAVOK_RELEASE_LIB_${HAVOK_LIB}}) + list(APPEND HK_RELWITHDEBINFO_LIBRARIES ${HAVOK_RELWITHDEBINFO_LIB_${HAVOK_LIB}}) + endif (LINUX) +endforeach(HAVOK_LIB) + diff --git a/indra/cmake/Hunspell.cmake b/indra/cmake/Hunspell.cmake index e8cd9ceaa7d90beabdf053e7b352582c9c685914..6cca9c00e57daf5cb31755d57f3429ff284a4e1f 100644 --- a/indra/cmake/Hunspell.cmake +++ b/indra/cmake/Hunspell.cmake @@ -2,31 +2,27 @@ include(Linking) include(Prebuilt) -set(HUNSPELL_FIND_QUIETLY ON) -set(HUNSPELL_FIND_REQUIRED ON) +include_guard() +use_prebuilt_binary(dictionaries) -if (USESYSTEMLIBS) - include(FindHUNSPELL) -else (USESYSTEMLIBS) - use_prebuilt_binary(libhunspell) - if (WINDOWS) - set(HUNSPELL_LIBRARY +add_library( ll::hunspell INTERFACE IMPORTED ) +use_system_binary(hunspell) +use_prebuilt_binary(libhunspell) +if (WINDOWS) + target_compile_definitions( ll::hunspell INTERFACE HUNSPELL_STATIC=1) + target_link_libraries( ll::hunspell INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/libhunspell.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libhunspell.lib ) - elseif(DARWIN) - set(HUNSPELL_LIBRARY +elseif(DARWIN) + target_link_libraries( ll::hunspell INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/libhunspell-1.7.a optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libhunspell-1.7.a ) - elseif(LINUX) - set(HUNSPELL_LIBRARY +elseif(LINUX) + target_link_libraries( ll::hunspell INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/libhunspell-1.7.a optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libhunspell-1.7.a ) - else() - message(FATAL_ERROR "Invalid platform") - endif() - set(HUNSPELL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/hunspell) - use_prebuilt_binary(dictionaries) -endif (USESYSTEMLIBS) +endif() +target_include_directories( ll::hunspell SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/hunspell) diff --git a/indra/cmake/JPEG.cmake b/indra/cmake/JPEG.cmake index 819a59af2a9e702f15ee9d6a34a1d78233bf1ea5..c13ea4fbade6dedae707c1e885332ceb9b5b013f 100644 --- a/indra/cmake/JPEG.cmake +++ b/indra/cmake/JPEG.cmake @@ -2,21 +2,19 @@ include(Prebuilt) include(Linking) -set(JPEG_FIND_QUIETLY ON) -set(JPEG_FIND_REQUIRED ON) -if (USESYSTEMLIBS) - include(FindJPEG) -else (USESYSTEMLIBS) - use_prebuilt_binary(libjpeg-turbo) - if (LINUX) - set(JPEG_LIBRARIES jpeg) - elseif (DARWIN) - set(JPEG_LIBRARIES jpeg) - elseif (WINDOWS) - set(JPEG_LIBRARIES +include_guard() +add_library( ll::libjpeg INTERFACE IMPORTED ) + +use_system_binary(libjpeg) +use_prebuilt_binary(libjpeg-turbo) +if (LINUX) + target_link_libraries( ll::libjpeg INTERFACE jpeg) +elseif (DARWIN) + target_link_libraries( ll::libjpeg INTERFACE jpeg) +elseif (WINDOWS) + target_link_libraries( ll::libjpeg INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/jpeg.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/jpeg.lib) - endif (LINUX) - set(JPEG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) -endif (USESYSTEMLIBS) +endif (LINUX) +target_include_directories( ll::libjpeg SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include) diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake index ce4a26c44d55fb6dad9d2c6f27df7e3e37a6ccb1..71fcb4c87b88427b208abbd2d668d143f0ceb2a9 100644 --- a/indra/cmake/LLAddBuildTest.cmake +++ b/indra/cmake/LLAddBuildTest.cmake @@ -17,99 +17,86 @@ MACRO(LL_ADD_PROJECT_UNIT_TESTS project sources) # * properties for each sourcefile passed in indicate what libs to link that file with (MAKE NO ASSUMPTIONS ASIDE FROM TUT) # # More info and examples at: https://wiki.secondlife.com/wiki/How_to_add_unit_tests_to_indra_code - # - # WARNING: do NOT modify this code without working with poppy - - # there is another branch that will conflict heavily with any changes here. - IF(LL_TEST_VERBOSE) - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} sources: ${sources}") - ENDIF(LL_TEST_VERBOSE) + # This here looks weird, but is needed. It will inject GoogleMock into projects that forgot to include `this` (LLAddBuildTest.cmake) + # But through some other means have access to this macro + + if(LL_TEST_VERBOSE) + message("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} sources: ${sources}") + endif() # Start with the header and project-wide setup before making targets #project(UNITTEST_PROJECT_${project}) # Setup includes, paths, etc - SET(alltest_SOURCE_FILES - ${CMAKE_SOURCE_DIR}/test/test.cpp - ${CMAKE_SOURCE_DIR}/test/lltut.cpp - ) - SET(alltest_DEP_TARGETS - # needed by the test harness itself - ${APRUTIL_LIBRARIES} - ${APR_LIBRARIES} - llcommon - ) - IF(NOT "${project}" STREQUAL "llmath") + set(alltest_SOURCE_FILES + ${CMAKE_SOURCE_DIR}/test/test.cpp + ${CMAKE_SOURCE_DIR}/test/lltut.cpp + ) + set(alltest_DEP_TARGETS + # needed by the test harness itself + llcommon + ) + + set(alltest_LIBRARIES + llcommon + ) + if(NOT "${project}" STREQUAL "llmath") # add llmath as a dep unless the tested module *is* llmath! - LIST(APPEND alltest_DEP_TARGETS - llmath - ) - ENDIF(NOT "${project}" STREQUAL "llmath") - SET(alltest_INCLUDE_DIRS - ${LLMATH_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LIBS_OPEN_DIR}/test - ) - SET(alltest_LIBRARIES - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - ${PTHREAD_LIBRARY} - ${WINDOWS_LIBRARIES} - ) + list(APPEND alltest_DEP_TARGETS llmath) + list(APPEND alltest_LIBRARIES llmath ) + endif() + # Headers, for convenience in targets. - SET(alltest_HEADER_FILES - ${CMAKE_SOURCE_DIR}/test/test.h - ) + set(alltest_HEADER_FILES ${CMAKE_SOURCE_DIR}/test/test.h) # start the source test executable definitions - SET(${project}_TEST_OUTPUT "") - FOREACH (source ${sources}) - STRING( REGEX REPLACE "(.*)\\.[^.]+$" "\\1" name ${source} ) - STRING( REGEX REPLACE ".*\\.([^.]+)$" "\\1" extension ${source} ) - IF(LL_TEST_VERBOSE) - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} individual source: ${source} (${name}.${extension})") - ENDIF(LL_TEST_VERBOSE) + set(${project}_TEST_OUTPUT "") + foreach (source ${sources}) + string( REGEX REPLACE "(.*)\\.[^.]+$" "\\1" name ${source} ) + string( REGEX REPLACE ".*\\.([^.]+)$" "\\1" extension ${source} ) + if(LL_TEST_VERBOSE) + message("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} individual source: ${source} (${name}.${extension})") + endif() # # Per-codefile additional / external source, header, and include dir property extraction # # Source GET_OPT_SOURCE_FILE_PROPERTY(${name}_test_additional_SOURCE_FILES ${source} LL_TEST_ADDITIONAL_SOURCE_FILES) - SET(${name}_test_SOURCE_FILES - ${source} - tests/${name}_test.${extension} - ${alltest_SOURCE_FILES} - ${${name}_test_additional_SOURCE_FILES} ) - IF(LL_TEST_VERBOSE) - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_SOURCE_FILES ${${name}_test_SOURCE_FILES}") - ENDIF(LL_TEST_VERBOSE) - - if (USE_SENTRY) - SET_PROPERTY(SOURCE ${${name}_test_SOURCE_FILES} - APPEND PROPERTY COMPILE_DEFINITIONS "${SENTRY_DEFINE}") - endif (USE_SENTRY) + set(${name}_test_SOURCE_FILES + ${source} + tests/${name}_test.${extension} + ${alltest_SOURCE_FILES} + ${${name}_test_additional_SOURCE_FILES} ) + if(LL_TEST_VERBOSE) + message("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_SOURCE_FILES ${${name}_test_SOURCE_FILES}") + endif() # Headers GET_OPT_SOURCE_FILE_PROPERTY(${name}_test_additional_HEADER_FILES ${source} LL_TEST_ADDITIONAL_HEADER_FILES) - SET(${name}_test_HEADER_FILES ${name}.h ${${name}_test_additional_HEADER_FILES}) - set_source_files_properties(${${name}_test_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) - LIST(APPEND ${name}_test_SOURCE_FILES ${${name}_test_HEADER_FILES}) - IF(LL_TEST_VERBOSE) - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_HEADER_FILES ${${name}_test_HEADER_FILES}") - ENDIF(LL_TEST_VERBOSE) - # Include dirs + set(${name}_test_HEADER_FILES ${name}.h ${${name}_test_additional_HEADER_FILES}) + list(APPEND ${name}_test_SOURCE_FILES ${${name}_test_HEADER_FILES}) + if(LL_TEST_VERBOSE) + message("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_HEADER_FILES ${${name}_test_HEADER_FILES}") + endif() + + # Setup target + add_executable(PROJECT_${project}_TEST_${name} ${${name}_test_SOURCE_FILES}) + + # Cannot declare a dependency on ${project} because the executable create above will later declare + # add_dependencies( ${project} ${project}_tests) + # as such grab ${project}'s interface include dirs and inject them here + get_property( ${name}_test_additional_INCLUDE_DIRS TARGET ${project} PROPERTY INTERFACE_INCLUDE_DIRECTORIES ) + target_include_directories (PROJECT_${project}_TEST_${name} PRIVATE ${${name}_test_additional_INCLUDE_DIRS} ) + GET_OPT_SOURCE_FILE_PROPERTY(${name}_test_additional_INCLUDE_DIRS ${source} LL_TEST_ADDITIONAL_INCLUDE_DIRS) - INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${${name}_test_additional_INCLUDE_DIRS} ) - IF(LL_TEST_VERBOSE) - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_INCLUDE_DIRS ${${name}_test_additional_INCLUDE_DIRS}") - ENDIF(LL_TEST_VERBOSE) + target_include_directories (PROJECT_${project}_TEST_${name} PRIVATE ${${name}_test_additional_INCLUDE_DIRS} ) + target_include_directories (PROJECT_${project}_TEST_${name} PRIVATE ${LIBS_OPEN_DIR}/test ) - # Setup target - ADD_EXECUTABLE(PROJECT_${project}_TEST_${name} ${${name}_test_SOURCE_FILES}) - SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}") + set_target_properties(PROJECT_${project}_TEST_${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}") if (DARWIN) - SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} + set_target_properties(PROJECT_${project}_TEST_${name} PROPERTIES BUILD_WITH_INSTALL_RPATH 1 INSTALL_RPATH "@executable_path/Resources" @@ -124,128 +111,118 @@ MACRO(LL_ADD_PROJECT_UNIT_TESTS project sources) GET_OPT_SOURCE_FILE_PROPERTY(${name}_test_additional_PROJECTS ${source} LL_TEST_ADDITIONAL_PROJECTS) # Libraries GET_OPT_SOURCE_FILE_PROPERTY(${name}_test_additional_LIBRARIES ${source} LL_TEST_ADDITIONAL_LIBRARIES) - IF(LL_TEST_VERBOSE) - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_PROJECTS ${${name}_test_additional_PROJECTS}") - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_LIBRARIES ${${name}_test_additional_LIBRARIES}") - ENDIF(LL_TEST_VERBOSE) + + if(LL_TEST_VERBOSE) + message("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_PROJECTS ${${name}_test_additional_PROJECTS}") + message("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_LIBRARIES ${${name}_test_additional_LIBRARIES}") + endif() + # Add to project - TARGET_LINK_LIBRARIES(PROJECT_${project}_TEST_${name} ${alltest_LIBRARIES} ${alltest_DEP_TARGETS} ${${name}_test_additional_PROJECTS} ${${name}_test_additional_LIBRARIES} ) + target_link_libraries(PROJECT_${project}_TEST_${name} PUBLIC ${alltest_LIBRARIES} ${${name}_test_additional_PROJECTS} ${${name}_test_additional_LIBRARIES} ) + add_dependencies( PROJECT_${project}_TEST_${name} ${alltest_DEP_TARGETS}) # Compile-time Definitions GET_OPT_SOURCE_FILE_PROPERTY(${name}_test_additional_CFLAGS ${source} LL_TEST_ADDITIONAL_CFLAGS) - SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} - PROPERTIES - COMPILE_FLAGS "${${name}_test_additional_CFLAGS}" - COMPILE_DEFINITIONS "LL_TEST=${name};LL_TEST_${name}") - IF(LL_TEST_VERBOSE) - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_CFLAGS ${${name}_test_additional_CFLAGS}") - ENDIF(LL_TEST_VERBOSE) - + set_target_properties(PROJECT_${project}_TEST_${name} + PROPERTIES + COMPILE_FLAGS "${${name}_test_additional_CFLAGS}" + COMPILE_DEFINITIONS "LL_TEST=${name};LL_TEST_${name}") + if(LL_TEST_VERBOSE) + message("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_CFLAGS ${${name}_test_additional_CFLAGS}") + endif() + # # Setup test targets # - SET(TEST_EXE $<TARGET_FILE:PROJECT_${project}_TEST_${name}>) - SET(TEST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/PROJECT_${project}_TEST_${name}_ok.txt) - SET(TEST_CMD ${TEST_EXE} --touch=${TEST_OUTPUT} --sourcedir=${CMAKE_CURRENT_SOURCE_DIR}) + set(TEST_EXE $<TARGET_FILE:PROJECT_${project}_TEST_${name}>) + set(TEST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/PROJECT_${project}_TEST_${name}_ok.txt) + set(TEST_CMD ${TEST_EXE} --touch=${TEST_OUTPUT} --sourcedir=${CMAKE_CURRENT_SOURCE_DIR}) # daveh - what configuration does this use? Debug? it's cmake-time, not build time. + poppy 2009-04-19 - IF(LL_TEST_VERBOSE) - MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_cmd = ${TEST_CMD}") - ENDIF(LL_TEST_VERBOSE) + if(LL_TEST_VERBOSE) + message(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_cmd = ${TEST_CMD}") + endif() SET_TEST_PATH(LD_LIBRARY_PATH) LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${TEST_CMD}) - IF(LL_TEST_VERBOSE) - MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_script = ${TEST_SCRIPT_CMD}") - ENDIF(LL_TEST_VERBOSE) - # Add test - ADD_CUSTOM_COMMAND( - OUTPUT ${TEST_OUTPUT} - COMMAND ${TEST_SCRIPT_CMD} - DEPENDS PROJECT_${project}_TEST_${name} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) + if(LL_TEST_VERBOSE) + message(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_script = ${TEST_SCRIPT_CMD}") + endif() + + # Add test + add_custom_command( + OUTPUT ${TEST_OUTPUT} + COMMAND ${TEST_SCRIPT_CMD} + DEPENDS PROJECT_${project}_TEST_${name} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) # Why not add custom target and add POST_BUILD command? # Slightly less uncertain behavior # (OUTPUT commands run non-deterministically AFAIK) + poppy 2009-04-19 - # > I did not use a post build step as I could not make it notify of a + # > I did not use a post build step as I could not make it notify of a # > failure after the first time you build and fail a test. - daveh 2009-04-20 - LIST(APPEND ${project}_TEST_OUTPUT ${TEST_OUTPUT}) - ENDFOREACH (source) + list(APPEND ${project}_TEST_OUTPUT ${TEST_OUTPUT}) + endforeach (source) # Add the test runner target per-project # (replaces old _test_ok targets all over the place) - ADD_CUSTOM_TARGET(${project}_tests ALL DEPENDS ${${project}_TEST_OUTPUT}) - ADD_DEPENDENCIES(${project} ${project}_tests) + add_custom_target(${project}_tests ALL DEPENDS ${${project}_TEST_OUTPUT}) + add_dependencies(${project} ${project}_tests) ENDMACRO(LL_ADD_PROJECT_UNIT_TESTS) #***************************************************************************** # GET_OPT_SOURCE_FILE_PROPERTY #***************************************************************************** MACRO(GET_OPT_SOURCE_FILE_PROPERTY var filename property) - GET_SOURCE_FILE_PROPERTY(${var} "${filename}" "${property}") - IF("${${var}}" MATCHES NOTFOUND) - SET(${var} "") - ENDIF("${${var}}" MATCHES NOTFOUND) + get_source_file_property(${var} "${filename}" "${property}") + if("${${var}}" MATCHES NOTFOUND) + set(${var} "") + endif() ENDMACRO(GET_OPT_SOURCE_FILE_PROPERTY) #***************************************************************************** # LL_ADD_INTEGRATION_TEST #***************************************************************************** -FUNCTION(LL_ADD_INTEGRATION_TEST - testname - additional_source_files - library_dependencies -# variable args - ) +FUNCTION(LL_ADD_INTEGRATION_TEST + testname + additional_source_files + library_dependencies + # variable args + ) if(TEST_DEBUG) message(STATUS "Adding INTEGRATION_TEST_${testname} - debug output is on") - endif(TEST_DEBUG) + endif() - SET(source_files - tests/${testname}_test.cpp - ${CMAKE_SOURCE_DIR}/test/test.cpp - ${CMAKE_SOURCE_DIR}/test/lltut.cpp - ${additional_source_files} - ) + set(source_files + tests/${testname}_test.cpp + ${CMAKE_SOURCE_DIR}/test/test.cpp + ${CMAKE_SOURCE_DIR}/test/lltut.cpp + ${additional_source_files} + ) - SET(libraries - ${library_dependencies} - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - ${PTHREAD_LIBRARY} - ) + set(libraries + ${library_dependencies} + ) # Add test executable build target if(TEST_DEBUG) message(STATUS "ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})") - endif(TEST_DEBUG) - ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files}) - SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}" - COMPILE_DEFINITIONS "LL_TEST=${testname};LL_TEST_${testname}" - ) - - if(USESYSTEMLIBS) - SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES COMPILE_FLAGS -I"${TUT_INCLUDE_DIR}") - endif(USESYSTEMLIBS) + endif() - if (USE_SENTRY) - SET_PROPERTY(SOURCE ${source_files} - APPEND PROPERTY COMPILE_DEFINITIONS "${SENTRY_DEFINE}") - endif (USE_SENTRY) + add_executable(INTEGRATION_TEST_${testname} ${source_files}) + set_target_properties(INTEGRATION_TEST_${testname} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}" + COMPILE_DEFINITIONS "LL_TEST=${testname};LL_TEST_${testname}" + ) - # The following was copied to llcorehttp/CMakeLists.txt's texture_load target. + # The following was copied to llcorehttp/CMakeLists.txt's texture_load target. # Any changes made here should be replicated there. if (WINDOWS) - SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} - PROPERTIES - LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:CONSOLE" - LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO" - LINK_FLAGS_RELEASE "" - ) - endif (WINDOWS) + set_target_properties(INTEGRATION_TEST_${testname} + PROPERTIES + LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:CONSOLE" + ) + endif () if (DARWIN) SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} @@ -258,14 +235,16 @@ FUNCTION(LL_ADD_INTEGRATION_TEST # Add link deps to the executable if(TEST_DEBUG) message(STATUS "TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries})") - endif(TEST_DEBUG) - TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries}) + endif() + + target_link_libraries(INTEGRATION_TEST_${testname} PUBLIC ${libraries}) + target_include_directories (INTEGRATION_TEST_${testname} PRIVATE ${LIBS_OPEN_DIR}/test ) # Create the test running command - SET(test_command ${ARGN}) - SET(TEST_EXE $<TARGET_FILE:INTEGRATION_TEST_${testname}>) - LIST(FIND test_command "{}" test_exe_pos) - IF(test_exe_pos LESS 0) + set(test_command ${ARGN}) + set(TEST_EXE $<TARGET_FILE:INTEGRATION_TEST_${testname}>) + list(FIND test_command "{}" test_exe_pos) + if(test_exe_pos LESS 0) # The {} marker means "the full pathname of the test executable." # test_exe_pos -1 means we didn't find it -- so append the test executable # name to $ARGN, the variable part of the arg list. This is convenient @@ -274,26 +253,26 @@ FUNCTION(LL_ADD_INTEGRATION_TEST # pathname of the test program as the last of its args. You need specify # {} only if the test program's pathname isn't the last argument in the # desired command line. - LIST(APPEND test_command "${TEST_EXE}") - ELSE (test_exe_pos LESS 0) + list(APPEND test_command "${TEST_EXE}") + else (test_exe_pos LESS 0) # Found {} marker at test_exe_pos. Remove the {}... - LIST(REMOVE_AT test_command test_exe_pos) + list(REMOVE_AT test_command test_exe_pos) # ...and replace it with the actual name of the test executable. - LIST(INSERT test_command test_exe_pos "${TEST_EXE}") - ENDIF (test_exe_pos LESS 0) + list(INSERT test_command test_exe_pos "${TEST_EXE}") + endif() SET_TEST_PATH(LD_LIBRARY_PATH) LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${test_command}) if(TEST_DEBUG) message(STATUS "TEST_SCRIPT_CMD: ${TEST_SCRIPT_CMD}") - endif(TEST_DEBUG) + endif() - ADD_CUSTOM_COMMAND( - TARGET INTEGRATION_TEST_${testname} - POST_BUILD - COMMAND ${TEST_SCRIPT_CMD} - ) + add_custom_command( + TARGET INTEGRATION_TEST_${testname} + POST_BUILD + COMMAND ${TEST_SCRIPT_CMD} + ) # Use CTEST? Not sure how to yet... # ADD_TEST(INTEGRATION_TEST_RUNNER_${testname} ${TEST_SCRIPT_CMD}) @@ -308,18 +287,14 @@ MACRO(SET_TEST_PATH LISTVAR) # We typically build/package only Release variants of third-party # libraries, so append the Release staging dir in case the library being # sought doesn't have a debug variant. - set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR} ${SHARED_LIB_STAGING_DIR}/Release) + set(${LISTVAR} ${SHARED_LIB_STAGING_DIR} ${SHARED_LIB_STAGING_DIR}/Release) ELSEIF(DARWIN) # We typically build/package only Release variants of third-party # libraries, so append the Release staging dir in case the library being # sought doesn't have a debug variant. - set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources ${SHARED_LIB_STAGING_DIR}/Release/Resources /usr/lib) + set(${LISTVAR} ${SHARED_LIB_STAGING_DIR} ${SHARED_LIB_STAGING_DIR}/Release/Resources /usr/lib) ELSE(WINDOWS) # Linux uses a single staging directory anyway. - IF (USESYSTEMLIBS) - set(${LISTVAR} ${CMAKE_BINARY_DIR}/llcommon /usr/lib /usr/local/lib) - ELSE (USESYSTEMLIBS) - set(${LISTVAR} ${SHARED_LIB_STAGING_DIR} /usr/lib) - ENDIF (USESYSTEMLIBS) + set(${LISTVAR} ${SHARED_LIB_STAGING_DIR} /usr/lib) ENDIF(WINDOWS) ENDMACRO(SET_TEST_PATH) diff --git a/indra/cmake/LLAppearance.cmake b/indra/cmake/LLAppearance.cmake index 675330ec72b59f2d1049ec7811f3e896b95b1863..bf34b13714a0d53b02023d259c3b6a47e43a5f63 100644 --- a/indra/cmake/LLAppearance.cmake +++ b/indra/cmake/LLAppearance.cmake @@ -2,26 +2,9 @@ include(Variables) include(Boost) -include(LLMessage) include(LLCoreHttp) -set(LLAPPEARANCE_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llappearance - ) -if (BUILD_HEADLESS) - set(LLAPPEARANCE_HEADLESS_LIBRARIES - llappearanceheadless - ) -endif (BUILD_HEADLESS) - -set(LLAPPEARANCE_LIBRARIES llappearance - llmessage - llcorehttp - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - ) diff --git a/indra/cmake/LLAudio.cmake b/indra/cmake/LLAudio.cmake index 1a9b1125bd5dc5dccb231cbead8d49cdb46cc5f6..c842c69bfeca8b96238d5386c3d341ab6fe44ef1 100644 --- a/indra/cmake/LLAudio.cmake +++ b/indra/cmake/LLAudio.cmake @@ -1,10 +1,3 @@ # -*- cmake -*- include(Audio) - -set(LLAUDIO_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llaudio - ) - -# be exhaustive here -set(LLAUDIO_LIBRARIES llaudio ${VORBISENC_LIBRARIES} ${VORBISFILE_LIBRARIES} ${VORBIS_LIBRARIES} ${OGG_LIBRARIES} ${OPENAL_LIBRARIES}) diff --git a/indra/cmake/LLCharacter.cmake b/indra/cmake/LLCharacter.cmake deleted file mode 100644 index 9b2f5c4956ac9d005334e8a6485b16bfef7cb194..0000000000000000000000000000000000000000 --- a/indra/cmake/LLCharacter.cmake +++ /dev/null @@ -1,7 +0,0 @@ -# -*- cmake -*- - -set(LLCHARACTER_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llcharacter - ) - -set(LLCHARACTER_LIBRARIES llcharacter) diff --git a/indra/cmake/LLCommon.cmake b/indra/cmake/LLCommon.cmake index 1c4db8532ed018314cb3e2b16d636e09d3c54296..9a4c56d99328bd3a93c8470af5bbb7473a1fa3c9 100644 --- a/indra/cmake/LLCommon.cmake +++ b/indra/cmake/LLCommon.cmake @@ -7,39 +7,4 @@ include(Tracy) include(XXHash) include(ZLIBNG) -set(LLCOMMON_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llcommon - ${APRUTIL_INCLUDE_DIR} - ${APR_INCLUDE_DIR} - ${Boost_INCLUDE_DIRS} - ) -set(LLCOMMON_SYSTEM_INCLUDE_DIRS - ${Boost_INCLUDE_DIRS} - ) - -if (LINUX) - # In order to support using ld.gold on linux, we need to explicitely - # specify all libraries that llcommon uses. - # llcommon uses `clock_gettime' which is provided by librt on linux. - set(LLCOMMON_LIBRARIES llcommon - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_THREAD_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - rt - ) -else (LINUX) - set(LLCOMMON_LIBRARIES llcommon - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_THREAD_LIBRARY} - ${BOOST_STACKTRACE_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - ${TRACY_LIBRARY} - ) -endif (LINUX) - -set(LLCOMMON_LINK_SHARED OFF CACHE BOOL "Build the llcommon target as a static library.") -if(LLCOMMON_LINK_SHARED) - add_definitions(-DLL_COMMON_LINK_SHARED=1) -endif(LLCOMMON_LINK_SHARED) +include(XmlRpcEpi) diff --git a/indra/cmake/LLCoreHttp.cmake b/indra/cmake/LLCoreHttp.cmake index 613453ab5d58dcffb5bb44f96f8435958627662d..22ed5fef9cbda11aea6f71ee031554595ba2c521 100644 --- a/indra/cmake/LLCoreHttp.cmake +++ b/indra/cmake/LLCoreHttp.cmake @@ -2,16 +2,4 @@ include(CURL) include(OpenSSL) -include(Boost) - -set(LLCOREHTTP_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llcorehttp - ${CURL_INCLUDE_DIRS} - ${OPENSSL_INCLUDE_DIRS} - ${BOOST_INCLUDE_DIRS} - ) - -set(LLCOREHTTP_LIBRARIES llcorehttp - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_SYSTEM_LIBRARY}) +include(NGHTTP2) diff --git a/indra/cmake/LLFileSystem.cmake b/indra/cmake/LLFileSystem.cmake deleted file mode 100644 index 5b50a10d5b3ef53bd3c5d09323253f0f78930aab..0000000000000000000000000000000000000000 --- a/indra/cmake/LLFileSystem.cmake +++ /dev/null @@ -1,8 +0,0 @@ -# -*- cmake -*- -include(Boost) - -set(LLFILESYSTEM_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llfilesystem - ) - -set(LLFILESYSTEM_LIBRARIES llfilesystem ${BOOST_FILESYSTEM_LIBRARY} ${BOOST_SYSTEM_LIBRARY}) diff --git a/indra/cmake/LLImage.cmake b/indra/cmake/LLImage.cmake index ec3da890811e8b27a1d41e0bef4f816bd10a3e72..8e0b44dfe491e3c93669ea9dccd62807dc272a99 100644 --- a/indra/cmake/LLImage.cmake +++ b/indra/cmake/LLImage.cmake @@ -1,11 +1,4 @@ # -*- cmake -*- -include(JPEG) +#include(JPEG) include(PNG) - -set(LLIMAGE_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llimage - ${JPEG_INCLUDE_DIRS} - ) - -set(LLIMAGE_LIBRARIES llimage) diff --git a/indra/cmake/LLImageJ2COJ.cmake b/indra/cmake/LLImageJ2COJ.cmake deleted file mode 100644 index 1bcf205f2dbae7d92bbc41a94301b9eac292cbab..0000000000000000000000000000000000000000 --- a/indra/cmake/LLImageJ2COJ.cmake +++ /dev/null @@ -1,5 +0,0 @@ -# -*- cmake -*- - -include(OpenJPEG) - -set(LLIMAGEJ2COJ_LIBRARIES llimagej2coj) diff --git a/indra/cmake/LLInventory.cmake b/indra/cmake/LLInventory.cmake deleted file mode 100644 index c3dc077a2bab4e41dd00b10fd5f5e74e10f58c31..0000000000000000000000000000000000000000 --- a/indra/cmake/LLInventory.cmake +++ /dev/null @@ -1,7 +0,0 @@ -# -*- cmake -*- - -set(LLINVENTORY_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llinventory - ) - -set(LLINVENTORY_LIBRARIES llinventory) diff --git a/indra/cmake/LLKDU.cmake b/indra/cmake/LLKDU.cmake index 111ed956e52fce47f564a35eeef64197b6475bda..966478ffba6a779459c8fd30e9af540b66688168 100644 --- a/indra/cmake/LLKDU.cmake +++ b/indra/cmake/LLKDU.cmake @@ -1,5 +1,5 @@ # -*- cmake -*- - +include(Prebuilt) # USE_KDU can be set when launching cmake as an option using the argument -DUSE_KDU:BOOL=ON # When building using proprietary binaries though (i.e. having access to LL private servers), # we always build with KDU @@ -7,18 +7,27 @@ # option(USE_KDU "Use Kakadu library." ON) #endif (INSTALL_PROPRIETARY) +include_guard() +add_library( ll::kdu INTERFACE IMPORTED ) + if (USE_KDU) - include(Prebuilt) use_prebuilt_binary(kdu) + + # Our KDU package is built with KDU_X86_INTRINSICS in its .vcxproj file. + # Unless that macro is also set for every consumer build, KDU freaks out, + # spamming the viewer log with alignment FUD. + target_compile_definitions( ll::kdu INTERFACE KDU_X86_INTRINSICS=1 KDU_NO_THREADS KDU_NO_AVX KDU_NO_AVX2) + if (WINDOWS) - set(KDU_LIBRARY + target_link_libraries( ll::kdu INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/kdud.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/kdu.lib ) else (WINDOWS) - set(KDU_LIBRARY libkdu.a) + target_link_libraries( ll::kdu INTERFACE libkdu.a) endif (WINDOWS) - set(KDU_INCLUDE_DIR ${AUTOBUILD_INSTALL_DIR}/include/kdu) - set(LLKDU_INCLUDE_DIRS ${LIBS_OPEN_DIR}/llkdu) - set(LLKDU_LIBRARIES llkdu) + + target_include_directories( ll::kdu SYSTEM INTERFACE + ${AUTOBUILD_INSTALL_DIR}/include/kdu + ) endif (USE_KDU) diff --git a/indra/cmake/LLLogin.cmake b/indra/cmake/LLLogin.cmake deleted file mode 100644 index 47d171876a00df3fea3bf61a794cb3ff81fcd07b..0000000000000000000000000000000000000000 --- a/indra/cmake/LLLogin.cmake +++ /dev/null @@ -1,7 +0,0 @@ -# -*- cmake -*- - -set(LLLOGIN_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/viewer_components/login - ) - -set(LLLOGIN_LIBRARIES lllogin) diff --git a/indra/cmake/LLMath.cmake b/indra/cmake/LLMath.cmake index 513ff9f81d30382ed3ae2e5f942e46d67634de1e..688e62e24ba154ff8b20bca87b7995b278377126 100644 --- a/indra/cmake/LLMath.cmake +++ b/indra/cmake/LLMath.cmake @@ -4,8 +4,3 @@ include(Variables) include(Mikktspace) include(MESHOPTIMIZER) -set(LLMATH_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llmath - ) - -set(LLMATH_LIBRARIES llmath) diff --git a/indra/cmake/LLMeshOptimizer.cmake b/indra/cmake/LLMeshOptimizer.cmake deleted file mode 100644 index b79944f61875a2cffef4f51e06a531fc5d4479c2..0000000000000000000000000000000000000000 --- a/indra/cmake/LLMeshOptimizer.cmake +++ /dev/null @@ -1,7 +0,0 @@ -# -*- cmake -*- - -set(LLMESHOPTIMIZER_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llmeshoptimizer - ) - -set(LLMESHOPTIMIZER_LIBRARIES llmeshoptimizer) diff --git a/indra/cmake/LLMessage.cmake b/indra/cmake/LLMessage.cmake deleted file mode 100644 index 7be53ec0ec3441a7534b27f70af158f88c69757d..0000000000000000000000000000000000000000 --- a/indra/cmake/LLMessage.cmake +++ /dev/null @@ -1,13 +0,0 @@ -# -*- cmake -*- - -include(CURL) -include(OpenSSL) -include(XmlRpcEpi) - -set(LLMESSAGE_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llmessage - ${CURL_INCLUDE_DIRS} - ${OPENSSL_INCLUDE_DIRS} - ) - -set(LLMESSAGE_LIBRARIES llmessage) diff --git a/indra/cmake/LLPhysicsExtensions.cmake b/indra/cmake/LLPhysicsExtensions.cmake index 513401d1962877000e47c9c1e89fe8cc89dbd766..5b9f18112bf353b593dc887ae059d58f838079c2 100644 --- a/indra/cmake/LLPhysicsExtensions.cmake +++ b/indra/cmake/LLPhysicsExtensions.cmake @@ -12,6 +12,9 @@ if (INSTALL_PROPRIETARY AND NOT LINUX) set(HAVOK_TPV ON CACHE BOOL "Use Havok physics library") endif () +include_guard() +add_library( llphysicsextensions_impl INTERFACE IMPORTED ) + # Note that the use_prebuilt_binary macros below do not in fact include binaries; # the llphysicsextensions_* packages are source only and are built here. @@ -21,21 +24,23 @@ if (HAVOK) include(Havok) use_prebuilt_binary(llphysicsextensions_source) set(LLPHYSICSEXTENSIONS_SRC_DIR ${LIBS_PREBUILT_DIR}/llphysicsextensions/src) - set(LLPHYSICSEXTENSIONS_LIBRARIES llphysicsextensions) - set(LLPHYSICSEXTENSIONS_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/llphysicsextensions) + target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensions) + target_include_directories( llphysicsextensions_impl INTERFACE ${LIBS_PREBUILT_DIR}/include/llphysicsextensions) + target_compile_definitions( llphysicsextensions_impl INTERFACE LL_HAVOK=1) elseif (HAVOK_TPV) use_prebuilt_binary(llphysicsextensions_tpv) if(WINDOWS) - set(LLPHYSICSEXTENSIONS_LIBRARIES ${ARCH_PREBUILT_DIRS}/llphysicsextensions_tpv.lib) + target_link_libraries( llphysicsextensions_impl INTERFACE ${ARCH_PREBUILT_DIRS}/llphysicsextensions_tpv.lib) else() - set(LLPHYSICSEXTENSIONS_LIBRARIES ${ARCH_PREBUILT_DIRS}/libllphysicsextensions_tpv.a) + target_link_libraries( llphysicsextensions_impl INTERFACE ${ARCH_PREBUILT_DIRS}/libllphysicsextensions_tpv.a) endif() - set(LLPHYSICSEXTENSIONS_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/llphysicsextensions) + target_include_directories( llphysicsextensions_impl INTERFACE ${LIBS_PREBUILT_DIR}/include/llphysicsextensions) + target_compile_definitions( llphysicsextensions_impl INTERFACE LL_HAVOK=1) else (HAVOK) if (NOT USE_LL_STUBS) use_prebuilt_binary( ndPhysicsStub ) if (WINDOWS) - set(LLPHYSICSEXTENSIONS_LIBRARIES + target_link_libraries( llphysicsextensions_impl INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/nd_hacdConvexDecomposition.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/nd_hacdConvexDecomposition.lib debug ${ARCH_PREBUILT_DIRS_DEBUG}/hacd.lib @@ -43,13 +48,13 @@ else (HAVOK) debug ${ARCH_PREBUILT_DIRS_DEBUG}/nd_Pathing.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/nd_Pathing.lib) else () - set(LLPHYSICSEXTENSIONS_LIBRARIES nd_hacdConvexDecomposition hacd nd_Pathing ) + target_link_libraries( llphysicsextensions_impl INTERFACE nd_hacdConvexDecomposition hacd nd_Pathing ) endif () - set(LLPHYSICSEXTENSIONS_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/ ) + target_include_directories( llphysicsextensions_impl INTERFACE ${LIBS_PREBUILT_DIR}/include/) else() use_prebuilt_binary(llphysicsextensions_stub) - set(LLPHYSICSEXTENSIONS_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/llphysicsextensions) set(LLPHYSICSEXTENSIONS_SRC_DIR ${LIBS_PREBUILT_DIR}/llphysicsextensions/stub) - set(LLPHYSICSEXTENSIONS_LIBRARIES llphysicsextensionsstub) + target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensionsstub) + target_include_directories( llphysicsextensions_impl INTERFACE ${LIBS_PREBUILT_DIR}/include/llphysicsextensions) endif() endif () diff --git a/indra/cmake/LLPlugin.cmake b/indra/cmake/LLPlugin.cmake deleted file mode 100644 index 399cb332dd4a3c911ab063d156f98fd22f16fbb8..0000000000000000000000000000000000000000 --- a/indra/cmake/LLPlugin.cmake +++ /dev/null @@ -1,14 +0,0 @@ -# -*- cmake -*- - - -set(LLPLUGIN_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llplugin - ) - -if (LINUX) - # In order to support using ld.gold on linux, we need to explicitely - # specify all libraries that llplugin uses. - set(LLPLUGIN_LIBRARIES llplugin pthread) -else (LINUX) - set(LLPLUGIN_LIBRARIES llplugin) -endif (LINUX) diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake index 654cc0419ba05a8b2752ab6b17346c5af8bf5498..34bf04df3a056132d73e48873c6ea7d92fa7158a 100644 --- a/indra/cmake/LLPrimitive.cmake +++ b/indra/cmake/LLPrimitive.cmake @@ -1,55 +1,37 @@ # -*- cmake -*- # these should be moved to their own cmake file -include(Linking) include(Prebuilt) include(Boost) include(LibXML2) include(URIPARSER) include(ZLIBNG) +include_guard() + +add_library( ll::colladadom INTERFACE IMPORTED ) + +# ND, needs fixup in collada conan pkg +if( USE_CONAN ) + target_include_directories( ll::colladadom SYSTEM INTERFACE + "${CONAN_INCLUDE_DIRS_COLLADADOM}/collada-dom/" + "${CONAN_INCLUDE_DIRS_COLLADADOM}/collada-dom/1.4/" ) +endif() + +use_system_binary( colladadom ) use_prebuilt_binary(colladadom) -use_prebuilt_binary(minizip-ng) # needed for colladadom -set(LLPRIMITIVE_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llprimitive - ) -if (WINDOWS) - set(LLPRIMITIVE_LIBRARIES - debug llprimitive - optimized llprimitive - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libcollada14dom23-sd.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libcollada14dom23-s.lib - ${BOOST_FILESYSTEM_LIBRARY} - ${BOOST_SYSTEM_LIBRARIES} - ${LIBXML2_LIBRARIES} - ${URIPARSER_LIBRARIES} - ${MINIZIP_LIBRARIES} - ${ZLIBNG_LIBRARIES} +target_include_directories( ll::colladadom SYSTEM INTERFACE + ${LIBS_PREBUILT_DIR}/include/collada + ${LIBS_PREBUILT_DIR}/include/collada/1.4 ) +if (WINDOWS) + target_link_libraries(ll::colladadom INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libcollada14dom23-sd.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libcollada14dom23-s.lib + ll::libxml2 ll::uriparser ll::minizip-ng ) elseif (DARWIN) - set(LLPRIMITIVE_LIBRARIES - llprimitive - debug collada14dom-d - optimized collada14dom - ${BOOST_FILESYSTEM_LIBRARY} - ${BOOST_SYSTEM_LIBRARIES} - ${LIBXML2_LIBRARIES} - ${URIPARSER_LIBRARIES} - ${MINIZIP_LIBRARIES} - ${ZLIBNG_LIBRARIES} - ) + target_link_libraries(ll::colladadom INTERFACE collada14dom ll::libxml2 ll::uriparser ll::minizip-ng) elseif (LINUX) - set(LLPRIMITIVE_LIBRARIES - llprimitive - debug collada14dom-d - optimized collada14dom - ${BOOST_FILESYSTEM_LIBRARY} - ${BOOST_SYSTEM_LIBRARIES} - ${LIBXML2_LIBRARIES} - ${URIPARSER_LIBRARIES} - ${MINIZIP_LIBRARIES} - ${ZLIBNG_LIBRARIES} - ) -endif (WINDOWS) - + target_link_libraries(ll::colladadom INTERFACE collada14dom ll::libxml2 ll::uriparser ll::minizip-ng) +endif() diff --git a/indra/cmake/LLRender.cmake b/indra/cmake/LLRender.cmake deleted file mode 100644 index b04fa14cc346d6ec2da7193ebc70b1b673ab3e98..0000000000000000000000000000000000000000 --- a/indra/cmake/LLRender.cmake +++ /dev/null @@ -1,20 +0,0 @@ -# -*- cmake -*- - -include(Variables) -include(FreeType) -include(GLEXT) - -set(LLRENDER_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llrender - ${GLEXT_INCLUDE_DIR} - ) - -if (BUILD_HEADLESS) - set(LLRENDER_HEADLESS_LIBRARIES - llrenderheadless - ) -endif (BUILD_HEADLESS) -set(LLRENDER_LIBRARIES - llrender - ) - diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake index 56412f81228ec8004831b6262d9ce6ec33e72635..54b19e9ee59a2d6d06f62e222f627643e7bce9fb 100644 --- a/indra/cmake/LLSharedLibs.cmake +++ b/indra/cmake/LLSharedLibs.cmake @@ -44,32 +44,3 @@ macro(ll_deploy_sharedlibs_command target_exe) endif(NOT DARWIN) endmacro(ll_deploy_sharedlibs_command) - -# ll_stage_sharedlib -# Performs config and adds a copy command for a sharedlib target. -macro(ll_stage_sharedlib DSO_TARGET) - # target gets written to the DLL staging directory. - # Also this directory is shared with RunBuildTest.cmake, y'know, for the tests. - set_target_properties(${DSO_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR}) - if(NOT WINDOWS) - get_target_property(DSO_PATH ${DSO_TARGET} LOCATION) - get_filename_component(DSO_FILE ${DSO_PATH} NAME) - if(DARWIN) - set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources) - else(DARWIN) - set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}) - endif(DARWIN) - - # *TODO - maybe make this a symbolic link? -brad - add_custom_command( - TARGET ${DSO_TARGET} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${DSO_PATH} - ${SHARED_LIB_STAGING_DIR_CONFIG}/${DSO_FILE} - COMMENT "Copying llcommon to the staging folder." - ) - endif(NOT WINDOWS) -endmacro(ll_stage_sharedlib) diff --git a/indra/cmake/LLUI.cmake b/indra/cmake/LLUI.cmake deleted file mode 100644 index 34de57108b787ff468f77ebae346030a49d7ff83..0000000000000000000000000000000000000000 --- a/indra/cmake/LLUI.cmake +++ /dev/null @@ -1,7 +0,0 @@ -# -*- cmake -*- - -set(LLUI_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llui - ) - -set(LLUI_LIBRARIES llui) diff --git a/indra/cmake/LLWindow.cmake b/indra/cmake/LLWindow.cmake index 20daeb87e226e824ed2750fa34a7df645d6e0e7f..b2c1792df1c5f32622cf6f1d0881d94930cd7eaf 100644 --- a/indra/cmake/LLWindow.cmake +++ b/indra/cmake/LLWindow.cmake @@ -2,20 +2,7 @@ include(Variables) include(GLEXT) +include(Prebuilt) include(SDL2) -set(LLWINDOW_INCLUDE_DIRS - ${GLEXT_INCLUDE_DIR} - ${SDL_INCLUDE_DIRS} - ${LIBS_OPEN_DIR}/llwindow - ) - -if (BUILD_HEADLESS) - set(LLWINDOW_HEADLESS_LIBRARIES - llwindowheadless - ) -endif (BUILD_HEADLESS) - - set(LLWINDOW_LIBRARIES - llwindow - ) +include_guard() diff --git a/indra/cmake/LLXML.cmake b/indra/cmake/LLXML.cmake deleted file mode 100644 index b093c762975efc4771464bc6e6efcadf28faff7f..0000000000000000000000000000000000000000 --- a/indra/cmake/LLXML.cmake +++ /dev/null @@ -1,14 +0,0 @@ -# -*- cmake -*- - -include(Boost) -include(EXPAT) - -set(LLXML_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/llxml - ${EXPAT_INCLUDE_DIRS} - ) -set(LLXML_SYSTEM_INCLUDE_DIRS - ${Boost_INCLUDE_DIRS} - ) - -set(LLXML_LIBRARIES llxml) diff --git a/indra/cmake/LibVLCPlugin.cmake b/indra/cmake/LibVLCPlugin.cmake index 199dfab02776c1b30f9d7a13204ee4313173ee73..cbc04d6fc5e65cfa736f52a8bfbe00106e394812 100644 --- a/indra/cmake/LibVLCPlugin.cmake +++ b/indra/cmake/LibVLCPlugin.cmake @@ -2,31 +2,34 @@ include(Linking) include(Prebuilt) -if (USESYSTEMLIBS OR LINUX) +include_guard() +add_library( ll::libvlc INTERFACE IMPORTED ) + +if(LINUX) include(FindPkgConfig) - pkg_check_modules(VLC REQUIRED libvlc) -else () - include(Prebuilt) + pkg_check_modules(libvlc REQUIRED IMPORTED_TARGET libvlc) + target_link_libraries( ll::libvlc INTERFACE PkgConfig::libvlc) + return() +endif() - use_prebuilt_binary(vlc-bin) - set(VLC_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/vlc) +use_prebuilt_binary(vlc-bin) +target_include_directories( ll::libvlc INTERFACE ${LIBS_PREBUILT_DIR}/include/vlc) - if (WINDOWS) - set(VLC_LIBRARIES - ${ARCH_PREBUILT_DIRS_RELEASE}/libvlc.lib - ${ARCH_PREBUILT_DIRS_RELEASE}/libvlccore.lib - ) - elseif (DARWIN) - set(VLC_LIBRARIES - libvlc.dylib - libvlccore.dylib - ) - elseif (LINUX) - # Specify a full path to make sure we get a static link - set(VLC_LIBRARIES - ${LIBS_PREBUILT_DIR}/lib/libvlc.a - ${LIBS_PREBUILT_DIR}/lib/libvlccore.a - ) - endif (WINDOWS) +if (WINDOWS) + target_link_libraries( ll::libvlc INTERFACE + ${ARCH_PREBUILT_DIRS_RELEASE}/libvlc.lib + ${ARCH_PREBUILT_DIRS_RELEASE}/libvlccore.lib + ) +elseif (DARWIN) + target_link_libraries( ll::libvlc INTERFACE + libvlc.dylib + libvlccore.dylib + ) +elseif (LINUX) +# Specify a full path to make sure we get a static link + target_link_libraries( ll::libvlc INTERFACE + ${LIBS_PREBUILT_DIR}/lib/libvlc.a + ${LIBS_PREBUILT_DIR}/lib/libvlccore.a + ) endif () diff --git a/indra/cmake/LibXML2.cmake b/indra/cmake/LibXML2.cmake index 49d91a18e4336daa75ba62565bb75854607c4ae9..47426e7f0ce4dda2c283c2b5534f8a6603b55239 100644 --- a/indra/cmake/LibXML2.cmake +++ b/indra/cmake/LibXML2.cmake @@ -1,22 +1,25 @@ # -*- cmake -*- + include(Prebuilt) -set(LIBXML2_FIND_QUIETLY ON) -set(LIBXML2_FIND_REQUIRED ON) +include_guard() +add_library( ll::libxml2 INTERFACE IMPORTED ) + +if(USE_CONAN ) + target_link_libraries( ll::libxml2 INTERFACE CONAN_PKG::libxml2 ) + return() +endif() + +use_prebuilt_binary(libxml2) +if (WINDOWS) + target_compile_definitions( ll::libxml2 INTERFACE LIBXML_STATIC=1) + target_link_libraries( ll::libxml2 INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libxml2.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libxml2.lib) +elseif(DARWIN) + target_link_libraries( ll::libxml2 INTERFACE xml2 iconv) +else() + target_link_libraries( ll::libxml2 INTERFACE xml2) +endif() -if(USESYSTEMLIBS) - include(FindLibXml2) -else(USESYSTEMLIBS) - use_prebuilt_binary(libxml2) - if(WINDOWS) - set(LIBXML2_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libxml2.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libxml2.lib - ) - elseif(DARWIN) - set(LIBXML2_LIBRARIES xml2 iconv) - else() - set(LIBXML2_LIBRARIES xml2) - endif() - set(LIBXML2_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libxml2) -endif(USESYSTEMLIBS) +target_include_directories( ll::libxml2 SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/libxml2) diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake index 35a6fc77706bbf8e646b03f5ec4a8c87ba622d27..be22b4a33fc4af4cd54168eb922cb61014b9957a 100644 --- a/indra/cmake/Linking.cmake +++ b/indra/cmake/Linking.cmake @@ -1,29 +1,31 @@ # -*- cmake -*- -if(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED) -set(${CMAKE_CURRENT_LIST_FILE}_INCLUDED "YES") - +include_guard() include(Variables) -set(ARCH_PREBUILT_DIRS ${AUTOBUILD_INSTALL_DIR}/lib) -set(ARCH_PREBUILT_DIRS_PLUGINS ${AUTOBUILD_INSTALL_DIR}/plugins) -set(ARCH_PREBUILT_DIRS_RELEASE ${AUTOBUILD_INSTALL_DIR}/lib/release) -set(ARCH_PREBUILT_DIRS_DEBUG ${AUTOBUILD_INSTALL_DIR}/lib/debug) -set(ARCH_PREBUILT_BIN_DIRS ${AUTOBUILD_INSTALL_DIR}/bin) -set(ARCH_PREBUILT_BIN_DIRS_RELEASE ${AUTOBUILD_INSTALL_DIR}/bin/release) -set(ARCH_PREBUILT_BIN_DIRS_DEBUG ${AUTOBUILD_INSTALL_DIR}/bin/debug) -if (WINDOWS) - set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs) - set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs) +if (WINDOWS OR DARWIN ) + # Kludge for older cmake versions, 3.20+ is needed to use a genex in add_custom_command( OUTPUT <var> ... ) + # Using this will work okay-ish, as Debug is not supported anyway. But for property multi config and also + # ninja support the genex version is preferred. + if(${CMAKE_VERSION} VERSION_LESS "3.20.0") + if(CMAKE_BUILD_TYPE MATCHES Release) + set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/Release) + elseif (CMAKE_BUILD_TYPE MATCHES RelWithDebInfo) + set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/RelWithDebInfo) + endif() + else() + set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>) + endif() + + if( DARWIN ) + set( SHARED_LIB_STAGING_DIR ${SHARED_LIB_STAGING_DIR}/Resources) + endif() + set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>) elseif (LINUX) set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/lib) set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/bin) -elseif (DARWIN) - set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs) - set(EXE_STAGING_DIR "${CMAKE_BINARY_DIR}/sharedlibs") -endif (WINDOWS) +endif () -if (NOT WINDOWS) # Autobuild packages must provide 'release' versions of libraries, but may provide versions for # specific build types. AUTOBUILD_LIBS_INSTALL_DIRS lists first the build type directory and then # the 'release' directory (as a default fallback). @@ -31,70 +33,68 @@ if (NOT WINDOWS) # windows) and CMAKE_BUILD_TYPE on Makefile based generators (like linux). The reason for this is # that CMAKE_BUILD_TYPE is essentially meaningless at configuration time for IDE generators and # CMAKE_CFG_INTDIR is meaningless at build time for Makefile generators -if(WINDOWS OR DARWIN) - # the cmake xcode and VS generators implicitly append ${CMAKE_CFG_INTDIR} to the library paths for us - # fortunately both windows and darwin are case insensitive filesystems so this works. - set(AUTOBUILD_LIBS_INSTALL_DIRS "${AUTOBUILD_INSTALL_DIR}/lib/") -else(WINDOWS OR DARWIN) - # else block is for linux and any other makefile based generators - string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_LOWER) - set(AUTOBUILD_LIBS_INSTALL_DIRS ${AUTOBUILD_INSTALL_DIR}/lib/${CMAKE_BUILD_TYPE_LOWER}) -endif(WINDOWS OR DARWIN) -if (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Release") - # When we're building something other than Release, append the - # packages/lib/release directory to deal with autobuild packages that don't - # provide (e.g.) lib/debug libraries. - list(APPEND AUTOBUILD_LIBS_INSTALL_DIRS ${ARCH_PREBUILT_DIRS_RELEASE}) -endif (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Release") +link_directories(${LIBS_PREBUILT_DIR}/lib/$<LOWER_CASE:$<CONFIG>>) +link_directories(${LIBS_PREBUILT_DIR}/lib/release) -link_directories(${AUTOBUILD_LIBS_INSTALL_DIRS}) -endif() +add_library( ll::oslibraries INTERFACE IMPORTED ) if (LINUX) - set(DL_LIBRARY dl) - set(RT_LIBRARY rt) - set(PTHREAD_LIBRARY pthread) -else (LINUX) - set(DL_LIBRARY "") - set(RT_LIBRARY "") - set(PTHREAD_LIBRARY "") -endif (LINUX) - -if (WINDOWS) - set(WINDOWS_LIBRARIES - advapi32 - shell32 - ws2_32 - mswsock - psapi - winmm - wldap32 - gdi32 - user32 - ole32 - dbghelp - ) + target_link_libraries( ll::oslibraries INTERFACE + dl + pthread + rt) +elseif (WINDOWS) + target_link_libraries( ll::oslibraries INTERFACE + advapi32 + shell32 + ws2_32 + mswsock + psapi + winmm + netapi32 + wldap32 + gdi32 + user32 + ole32 + dbghelp + Shlwapi + ) if(ASAN) if(ADDRESS_SIZE EQUAL 32) - set(WINDOWS_LIBRARIES - ${WINDOWS_LIBRARIES} + target_link_libraries( ll::oslibraries INTERFACE clang_rt.asan_dynamic_runtime_thunk-i386 clang_rt.asan_dynamic-i386 ) else(ADDRESS_SIZE EQUAL 32) - set(WINDOWS_LIBRARIES - ${WINDOWS_LIBRARIES} + target_link_libraries( ll::oslibraries INTERFACE clang_rt.asan_dynamic_runtime_thunk-x86_64 clang_rt.asan_dynamic-x86_64 ) endif(ADDRESS_SIZE EQUAL 32) endif(ASAN) -else (WINDOWS) - set(WINDOWS_LIBRARIES "") -endif (WINDOWS) - -mark_as_advanced(DL_LIBRARY RT_LIBRARY PTHREAD_LIBRARY WINDOWS_LIBRARIES) +else() + include(CMakeFindFrameworks) + find_library(COREFOUNDATION_LIBRARY CoreFoundation) + find_library(CARBON_LIBRARY Carbon) + find_library(COCOA_LIBRARY Cocoa) + find_library(IOKIT_LIBRARY IOKit) + + find_library(AGL_LIBRARY AGL) + find_library(APPKIT_LIBRARY AppKit) + find_library(COREAUDIO_LIBRARY CoreAudio) + + target_link_libraries( ll::oslibraries INTERFACE + ${COCOA_LIBRARY} + ${IOKIT_LIBRARY} + ${COREFOUNDATION_LIBRARY} + ${CARBON_LIBRARY} + ${AGL_LIBRARY} + ${APPKIT_LIBRARY} + ${COREAUDIO_LIBRARY} + ) +endif() + + -endif(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED) diff --git a/indra/cmake/MESHOPTIMIZER.cmake b/indra/cmake/MESHOPTIMIZER.cmake deleted file mode 100644 index c69f8a872be493a3eff60a7df059b3b8bb0fc0c2..0000000000000000000000000000000000000000 --- a/indra/cmake/MESHOPTIMIZER.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# -*- cmake -*- - -# include(Linking) -# include(Prebuilt) - -# use_prebuilt_binary(meshoptimizer) - -# if (WINDOWS) -# set(MESHOPTIMIZER_LIBRARIES meshoptimizer.lib) -# elseif (LINUX) -# set(MESHOPTIMIZER_LIBRARIES meshoptimizer.o) -# elseif (DARWIN) -# set(MESHOPTIMIZER_LIBRARIES libmeshoptimizer.a) -# endif (WINDOWS) - -# set(MESHOPTIMIZER_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/meshoptimizer) diff --git a/indra/cmake/MediaPluginBase.cmake b/indra/cmake/MediaPluginBase.cmake deleted file mode 100644 index 2be035b641450bd3a7b16adfd205b77685a1a2f0..0000000000000000000000000000000000000000 --- a/indra/cmake/MediaPluginBase.cmake +++ /dev/null @@ -1,8 +0,0 @@ -# -*- cmake -*- - - -set(MEDIA_PLUGIN_BASE_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/media_plugins/base/ - ) - -set(MEDIA_PLUGIN_BASE_LIBRARIES media_plugin_base) diff --git a/indra/cmake/NDOF.cmake b/indra/cmake/NDOF.cmake index ecce6fbfac22600e45a9928b01e856afeedfe791..e68aae2d7d6ad6fef92d044b1d730c36fc9dbce1 100644 --- a/indra/cmake/NDOF.cmake +++ b/indra/cmake/NDOF.cmake @@ -3,36 +3,24 @@ include(Prebuilt) set(NDOF ON CACHE BOOL "Use NDOF space navigator joystick library.") +include_guard() +add_library( ll::ndof INTERFACE IMPORTED ) + if (NDOF) - if (USESYSTEMLIBS) - set(NDOF_FIND_REQUIRED ON) - include(FindNDOF) - else (USESYSTEMLIBS) - if (WINDOWS OR DARWIN) - use_prebuilt_binary(libndofdev) - elseif (LINUX) - use_prebuilt_binary(open-libndofdev) - endif (WINDOWS OR DARWIN) + if (WINDOWS OR DARWIN) + use_prebuilt_binary(libndofdev) + elseif (LINUX) + use_prebuilt_binary(open-libndofdev) + endif (WINDOWS OR DARWIN) - if (WINDOWS) - set(NDOF_LIBRARY + if (WINDOWS) + target_link_libraries( ll::ndof INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/libndofdev.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libndofdev.lib) - elseif (DARWIN OR LINUX) - set(NDOF_LIBRARY ndofdev) - endif (WINDOWS) - - set(NDOF_INCLUDE_DIR ${ARCH_PREBUILT_DIRS}/include/ndofdev) - set(NDOF_FOUND 1) - endif (USESYSTEMLIBS) + elseif (DARWIN OR LINUX) + target_link_libraries( ll::ndof INTERFACE ndofdev) + endif (WINDOWS) + target_compile_definitions( ll::ndof INTERFACE LIB_NDOF=1) endif (NDOF) -if (NDOF_FOUND) - add_definitions(-DLIB_NDOF=1) - include_directories(${NDOF_INCLUDE_DIR}) -else (NDOF_FOUND) - message(STATUS "Building without N-DoF joystick support") - set(NDOF_INCLUDE_DIR "") - set(NDOF_LIBRARY "") -endif (NDOF_FOUND) diff --git a/indra/cmake/NGHTTP2.cmake b/indra/cmake/NGHTTP2.cmake index 321b969878e201ac6ecb24eeeda253477550da09..3d0279d210fb930913df61b0efdfa7eb7bf51978 100644 --- a/indra/cmake/NGHTTP2.cmake +++ b/indra/cmake/NGHTTP2.cmake @@ -1,22 +1,19 @@ -include(Prebuilt) include(Linking) +include(Prebuilt) -set(NGHTTP2_FIND_QUIETLY ON) -set(NGHTTP2_FIND_REQUIRED ON) +include_guard() +add_library( ll::nghttp2 INTERFACE IMPORTED ) -if (USESYSTEMLIBS) - include(FindNGHTTP2) -else (USESYSTEMLIBS) - use_prebuilt_binary(nghttp2) - if (WINDOWS) - set(NGHTTP2_LIBRARIES +use_system_binary(nghttp2) +use_prebuilt_binary(nghttp2) +if (WINDOWS) + target_link_libraries( ll::nghttp2 INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/nghttp2.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/nghttp2.lib - ) - elseif (DARWIN) - set(NGHTTP2_LIBRARIES libnghttp2.a) - else (WINDOWS) - set(NGHTTP2_LIBRARIES libnghttp2.a) - endif (WINDOWS) - set(NGHTTP2_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/nghttp2) -endif (USESYSTEMLIBS) + ) +elseif (DARWIN) + target_link_libraries( ll::nghttp2 INTERFACE libnghttp2.a) +else (WINDOWS) + target_link_libraries( ll::nghttp2 INTERFACE libnghttp2.a ) +endif (WINDOWS) +target_include_directories( ll::nghttp2 SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/nghttp2) diff --git a/indra/cmake/NVAPI.cmake b/indra/cmake/NVAPI.cmake index 660af3201b9b8cfec151d3fb01a07b669eb5ec1d..1c77ee2842fec018df90dcccac9e312f27792ff8 100644 --- a/indra/cmake/NVAPI.cmake +++ b/indra/cmake/NVAPI.cmake @@ -9,16 +9,14 @@ endif (INSTALL_PROPRIETARY) if (USE_NVAPI) if (WINDOWS) + add_library( ll::nvapi INTERFACE IMPORTED ) use_prebuilt_binary(nvapi) if (ADDRESS_SIZE EQUAL 32) - set(NVAPI_LIBRARY ${ARCH_PREBUILT_DIRS_RELEASE}/nvapi.lib) + target_link_libraries( ll::nvapi INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/nvapi.lib) elseif (ADDRESS_SIZE EQUAL 64) - set(NVAPI_LIBRARY ${ARCH_PREBUILT_DIRS_RELEASE}/nvapi64.lib) - endif (ADDRESS_SIZE EQUAL 32) - else (WINDOWS) - set(NVAPI_LIBRARY "") + target_link_libraries( ll::nvapi INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/nvapi64.lib) + endif (ADDRESS_SIZE EQUAL 32) + target_compile_definitions( ll::nvapi INTERFACE LL_NVAPI=1) endif (WINDOWS) -else (USE_NVAPI) - set(NVAPI_LIBRARY "") endif (USE_NVAPI) diff --git a/indra/cmake/OPENAL.cmake b/indra/cmake/OPENAL.cmake index dcf28e845bf8e5a7854cc27c7ac535b30af8fbe2..cf3a372b6195b3a0819660de7495f9af3cf3b636 100644 --- a/indra/cmake/OPENAL.cmake +++ b/indra/cmake/OPENAL.cmake @@ -2,31 +2,48 @@ include(Linking) include(Prebuilt) -option(USE_OPENAL "Enable OpenAL" ON) +include_guard() + +# ND: Turn this off by default, the openal code in the viewer isn't very well maintained, seems +# to have memory leaks, has no option to play music streams +# It probably makes sense to to completely remove it + +set(USE_OPENAL ON CACHE BOOL "Enable OpenAL") +# ND: To streamline arguments passed, switch from OPENAL to USE_OPENAL +# To not break all old build scripts convert old arguments but warn about it +if(OPENAL) + message( WARNING "Use of the OPENAL argument is deprecated, please switch to USE_OPENAL") + set(USE_OPENAL ${OPENAL}) +endif() + if (USE_OPENAL) - if (USESYSTEMLIBS) - pkg_check_modules(FREEALUT REQUIRED freealut) - pkg_check_modules(OPENAL REQUIRED openal) - else (USESYSTEMLIBS) - use_prebuilt_binary(openal) - if(WINDOWS) - set(OPENAL_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/OpenAL32.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/OpenAL32.lib) - set(FREEALUT_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/alut.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/alut.lib) - elseif (DARWIN) - set(OPENAL_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libopenal.dylib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libopenal.dylib) - set(FREEALUT_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libalut.dylib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libalut.dylib) - else() - set(OPENAL_LIBRARIES openal) - set(FREEALUT_LIBRARIES alut) - endif() - set(OPENAL_INCLUDE_DIRS "${LIBS_PREBUILT_DIR}/include/") - endif (USESYSTEMLIBS) -endif (USE_OPENAL) + add_library( ll::openal INTERFACE IMPORTED ) + target_include_directories( ll::openal SYSTEM INTERFACE "${LIBS_PREBUILT_DIR}/include/") + target_compile_definitions( ll::openal INTERFACE LL_OPENAL=1) + use_prebuilt_binary(openal) + + if(WINDOWS) + target_link_libraries( ll::openal INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/OpenAL32.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/OpenAL32.lib + debug ${ARCH_PREBUILT_DIRS_DEBUG}/alut.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/alut.lib + ) + elseif (DARWIN) + target_link_libraries( ll::openal INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libopenal.dylib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libopenal.dylib + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libalut.dylib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libalut.dylib + ) + elseif (LINUX) + target_link_libraries( ll::openal INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libopenal.so + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libopenal.so + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libalut.so + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libalut.so + ) + else() + message(FATAL_ERROR "OpenAL is not available for this platform") + endif() +endif () diff --git a/indra/cmake/OpenGL.cmake b/indra/cmake/OpenGL.cmake index 2259c992935ff42dbbf46eb4105467a7ec7584d8..5da923eb926b3b8eacff56d719cf83348c507899 100644 --- a/indra/cmake/OpenGL.cmake +++ b/indra/cmake/OpenGL.cmake @@ -2,11 +2,12 @@ include(Variables) include(Prebuilt) - -if (BUILD_HEADLESS) - SET(OPENGL_glu_LIBRARY GLU) - SET(OPENGL_HEADLESS_LIBRARIES OSMesa16 dl GLU) -endif (BUILD_HEADLESS) - include(FindOpenGL) +add_library( ll::opengl INTERFACE IMPORTED ) + +if(TARGET OpenGL::OpenGL) + target_link_libraries( ll::opengl INTERFACE OpenGL::OpenGL) +elseif(TARGET OpenGL::GL) + target_link_libraries( ll::opengl INTERFACE OpenGL::GL) +endif() \ No newline at end of file diff --git a/indra/cmake/OpenJPEG.cmake b/indra/cmake/OpenJPEG.cmake index e54683d6b4f0c31a9dc2d3e1a3798e4aefbd341e..32739d5786de349b03e602cd7e38ec4ed77b01c5 100644 --- a/indra/cmake/OpenJPEG.cmake +++ b/indra/cmake/OpenJPEG.cmake @@ -1,21 +1,17 @@ # -*- cmake -*- include(Prebuilt) -set(OPENJPEG_FIND_QUIETLY ON) -set(OPENJPEG_FIND_REQUIRED ON) +include_guard() +add_library( ll::openjpeg INTERFACE IMPORTED ) -if (USESYSTEMLIBS) - include(FindOpenJPEG) -else (USESYSTEMLIBS) - use_prebuilt_binary(openjpeg) - - if(WINDOWS) - set(OPENJPEG_LIBRARIES +use_system_binary(openjpeg) +use_prebuilt_binary(openjpeg) + +if(WINDOWS) + target_link_libraries(ll::openjpeg INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/openjp2.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/openjp2.lib) - else(WINDOWS) - set(OPENJPEG_LIBRARIES openjp2) - endif(WINDOWS) - - set(OPENJPEG_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/openjpeg) -endif (USESYSTEMLIBS) +else () + target_link_libraries(ll::openjpeg INTERFACE openjp2 ) +endif () +target_include_directories( ll::openjpeg SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/openjpeg) diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake index b7c6c5b8c6d4a4b66c98c0c051de95789fe68e1a..691b2d3169bbfc51ae9622fe331f8c1be1528015 100644 --- a/indra/cmake/OpenSSL.cmake +++ b/indra/cmake/OpenSSL.cmake @@ -1,30 +1,24 @@ # -*- cmake -*- include(Prebuilt) -include(Linking) -set(OpenSSL_FIND_QUIETLY ON) -set(OpenSSL_FIND_REQUIRED ON) +include_guard() +add_library( ll::openssl INTERFACE IMPORTED ) -if (USESYSTEMLIBS) - include(FindOpenSSL) -else (USESYSTEMLIBS) - use_prebuilt_binary(openssl) - if (WINDOWS) - set(SSL_LIBRARY +use_system_binary(openssl) +use_prebuilt_binary(openssl) +if (WINDOWS) + target_link_libraries(ll::openssl INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/libssl.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libssl.lib) - set(CRYPTO_LIBRARY + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libssl.lib debug ${ARCH_PREBUILT_DIRS_DEBUG}/libcrypto.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto.lib) - set(OPENSSL_LIBRARIES ${SSL_LIBRARY} ${CRYPTO_LIBRARY} Crypt32.lib) - else (WINDOWS) - set(OPENSSL_LIBRARIES ssl crypto) - endif (WINDOWS) - set(OPENSSL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) -endif (USESYSTEMLIBS) + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto.lib + Crypt32.lib + ) +elseif (LINUX) + target_link_libraries(ll::openssl INTERFACE ssl crypto dl) +else() + target_link_libraries(ll::openssl INTERFACE ssl crypto) +endif (WINDOWS) +target_include_directories( ll::openssl SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include) -if (LINUX) - set(CRYPTO_LIBRARIES crypto dl) -elseif (DARWIN) - set(CRYPTO_LIBRARIES crypto) -endif (LINUX) +target_compile_definitions( ll::openssl INTERFACE OPENSSL_API_COMPAT=0x30000000L) diff --git a/indra/cmake/PNG.cmake b/indra/cmake/PNG.cmake index 4f86ee8a34f6bef62c84121dfeb64dab180a1c2d..4c245d2153d28345d9dbbb0aaabd93465c12ba35 100644 --- a/indra/cmake/PNG.cmake +++ b/indra/cmake/PNG.cmake @@ -2,37 +2,17 @@ include(Linking) include(Prebuilt) -set(PNG_FIND_QUIETLY ON) -set(PNG_FIND_REQUIRED ON) +include_guard() +add_library( ll::libpng INTERFACE IMPORTED ) -if (USESYSTEMLIBS) - include(FindPNG) -else (USESYSTEMLIBS) - use_prebuilt_binary(libpng) - if (WINDOWS) - set(PNG_LIBRARIES +use_system_binary(libpng) +use_prebuilt_binary(libpng) +if (WINDOWS) + target_link_libraries(ll::libpng INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/libpng16d.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libpng16.lib ) - set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng16) - elseif(DARWIN) - set(PNG_LIBRARIES png16) - set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng16) - else() - # - # When we have updated static libraries in competition with older - # shared libraries and we want the former to win, we need to do some - # extra work. The *_PRELOAD_ARCHIVES settings are invoked early - # and will pull in the entire archive to the binary giving it - # priority in symbol resolution. Beware of cmake moving the - # achive load itself to another place on the link command line. If - # that happens, you can try something like -Wl,-lpng16 here to hide - # the archive. Also be aware that the linker will not tolerate a - # second whole-archive load of the archive. See viewer's - # CMakeLists.txt for more information. - # - set(PNG_PRELOAD_ARCHIVES -Wl,--whole-archive png16 -Wl,--no-whole-archive) - set(PNG_LIBRARIES png16) - set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng16) - endif() -endif (USESYSTEMLIBS) +else() + target_link_libraries(ll::libpng INTERFACE png16 ) +endif() +target_include_directories( ll::libpng SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/libpng16) diff --git a/indra/cmake/PluginAPI.cmake b/indra/cmake/PluginAPI.cmake index 879c8536e4a6591519ffeb674e908becd454087f..390854e756a7f443bea052a0a8522aa47d69eb75 100644 --- a/indra/cmake/PluginAPI.cmake +++ b/indra/cmake/PluginAPI.cmake @@ -1,15 +1,24 @@ # -*- cmake -*- +include_guard() + +add_library( ll::pluginlibraries INTERFACE IMPORTED ) + if (WINDOWS) - set(PLUGIN_API_WINDOWS_LIBRARIES + target_link_libraries( ll::pluginlibraries INTERFACE wsock32 ws2_32 psapi advapi32 user32 + wer ) -else (WINDOWS) - set(PLUGIN_API_WINDOWS_LIBRARIES "") +elseif (DARWIN) + include(CMakeFindFrameworks) + find_library(COCOA_LIBRARY Cocoa) + target_link_libraries( ll::pluginlibraries INTERFACE + ${COCOA_LIBRARY} + ) endif (WINDOWS) diff --git a/indra/cmake/Prebuilt.cmake b/indra/cmake/Prebuilt.cmake index c6ad7a2a99c254d2895c3b6099e7f60f5e0babc6..6e42e1d1b346b3d58d1c4a946f2051feb8fec862 100644 --- a/indra/cmake/Prebuilt.cmake +++ b/indra/cmake/Prebuilt.cmake @@ -1,7 +1,15 @@ # -*- cmake -*- +include_guard() -if(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED) -set(${CMAKE_CURRENT_LIST_FILE}_INCLUDED "YES") +include(Variables) + +set(ARCH_PREBUILT_DIRS ${LIBS_PREBUILT_DIR}/lib) +set(ARCH_PREBUILT_DIRS_PLUGINS ${LIBS_PREBUILT_DIR}/plugins) +set(ARCH_PREBUILT_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/lib/release) +set(ARCH_PREBUILT_DIRS_DEBUG ${LIBS_PREBUILT_DIR}/lib/debug) +set(ARCH_PREBUILT_BIN_DIRS ${LIBS_PREBUILT_DIR}/bin) +set(ARCH_PREBUILT_BIN_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/bin/release) +set(ARCH_PREBUILT_BIN_DIRS_DEBUG ${LIBS_PREBUILT_DIR}/bin/debug) include(FindAutobuild) @@ -22,42 +30,52 @@ endif ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${PREBUILD_TRACKING # of previous attempts is serialized in the file # ${PREBUILD_TRACKING_DIR}/${_binary}_installed) macro (use_prebuilt_binary _binary) - if (NOT DEFINED USESYSTEMLIBS_${_binary}) - set(USESYSTEMLIBS_${_binary} ${USESYSTEMLIBS}) - endif (NOT DEFINED USESYSTEMLIBS_${_binary}) + if( NOT DEFINED ${_binary}_installed ) + set( ${_binary}_installed "") + endif() - if (NOT USESYSTEMLIBS_${_binary}) if("${${_binary}_installed}" STREQUAL "" AND EXISTS "${PREBUILD_TRACKING_DIR}/${_binary}_installed") - file(READ ${PREBUILD_TRACKING_DIR}/${_binary}_installed "${_binary}_installed") - if(DEBUG_PREBUILT) - message(STATUS "${_binary}_installed: \"${${_binary}_installed}\"") - endif(DEBUG_PREBUILT) + file(READ ${PREBUILD_TRACKING_DIR}/${_binary}_installed "${_binary}_installed") + if(DEBUG_PREBUILT) + message(STATUS "${_binary}_installed: \"${${_binary}_installed}\"") + endif(DEBUG_PREBUILT) endif("${${_binary}_installed}" STREQUAL "" AND EXISTS "${PREBUILD_TRACKING_DIR}/${_binary}_installed") if(${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0) - if(DEBUG_PREBUILT) - message(STATUS "cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install + if(DEBUG_PREBUILT) + message(STATUS "cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install --install-dir=${AUTOBUILD_INSTALL_DIR} ${_binary} ") - endif(DEBUG_PREBUILT) - execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}" - install - -A${ADDRESS_SIZE} - --skip-source-environment - --install-dir=${AUTOBUILD_INSTALL_DIR} - ${_binary} - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - RESULT_VARIABLE ${_binary}_installed - ) - file(WRITE ${PREBUILD_TRACKING_DIR}/${_binary}_installed "${${_binary}_installed}") + endif(DEBUG_PREBUILT) + execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}" + install + -A${ADDRESS_SIZE} + --skip-source-environment + --install-dir=${AUTOBUILD_INSTALL_DIR} + ${_binary} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE ${_binary}_installed + ) + file(WRITE ${PREBUILD_TRACKING_DIR}/${_binary}_installed "${${_binary}_installed}") endif(${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0) if(NOT ${_binary}_installed EQUAL 0) - message(FATAL_ERROR - "Failed to download or unpack prebuilt '${_binary}'." - " Process returned ${${_binary}_installed}.") + message(FATAL_ERROR + "Failed to download or unpack prebuilt '${_binary}'." + " Process returned ${${_binary}_installed}.") endif (NOT ${_binary}_installed EQUAL 0) - endif (NOT USESYSTEMLIBS_${_binary}) endmacro (use_prebuilt_binary _binary) -endif(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED) +#Sadly we need a macro here, otherwise the return() will not properly work +macro ( use_system_binary package ) + if( USE_CONAN ) + target_link_libraries( ll::${package} INTERFACE CONAN_PKG::${package} ) + foreach( extra_pkg "${ARGN}" ) + if( extra_pkg ) + target_link_libraries( ll::${package} INTERFACE CONAN_PKG::${extra_pkg} ) + endif() + endforeach() + return() + endif() +endmacro() + diff --git a/indra/cmake/PulseAudio.cmake b/indra/cmake/PulseAudio.cmake index cce27f1bdd12afb10e018f9d530d93512fd92126..303db97db6c7967ec52f80283208ea961abb3009 100644 --- a/indra/cmake/PulseAudio.cmake +++ b/indra/cmake/PulseAudio.cmake @@ -1,28 +1,4 @@ # -*- cmake -*- include(Prebuilt) -set(PULSEAUDIO OFF CACHE BOOL "Build with PulseAudio support, if available.") - -if (PULSEAUDIO) - if (USESYSTEMLIBS) - include(FindPkgConfig) - - pkg_check_modules(PULSEAUDIO libpulse) - - elseif (LINUX) - use_prebuilt_binary(pulseaudio) - set(PULSEAUDIO_FOUND ON FORCE BOOL) - set(PULSEAUDIO_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include - ) - # We don't need to explicitly link against pulseaudio itself, because - # the viewer probes for the system's copy at runtime. - set(PULSEAUDIO_LIBRARIES - # none needed! - ) - endif (USESYSTEMLIBS) -endif (PULSEAUDIO) - -if (PULSEAUDIO_FOUND) - add_definitions(-DLL_PULSEAUDIO_ENABLED=1) -endif (PULSEAUDIO_FOUND) +message( FATAL_ERROR "Pulseaudio cmake file is broken" ) diff --git a/indra/cmake/SDL2.cmake b/indra/cmake/SDL2.cmake index 0519502b1f3837fcad9c5d6149b8f490685d3d3f..60ee44edb75070e9372ca7d2c5844f68544701e7 100644 --- a/indra/cmake/SDL2.cmake +++ b/indra/cmake/SDL2.cmake @@ -1,19 +1,33 @@ # -*- cmake -*- -if (USESYSTEMLIBS) - include(FindPkgConfig) - pkg_check_modules(SDL REQUIRED sdl2) -else () - include(Prebuilt) - if (LINUX) - use_prebuilt_binary(SDL2) - set (SDL_FOUND TRUE) - set (SDL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/SDL2) - if(WINDOWS) - set (SDL_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/SDL2d.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/SDL2.lib) - else() - set (SDL_LIBRARIES SDL2) - endif() - endif (LINUX) -endif () \ No newline at end of file +include(Prebuilt) + +include_guard() + +if(LINUX) +set(USE_SDL ON) +endif() + +if(USE_SDL) + +add_library( ll::SDL2 INTERFACE IMPORTED ) + +use_system_binary( SDL2 ) + +use_prebuilt_binary(SDL2) +if(WINDOWS) + target_link_libraries( ll::SDL2 INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/SDL2d.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/SDL2.lib) +elseif(LINUX) + target_link_libraries( ll::SDL2 INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libSDL2d.so + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libSDL2.so) +else() + target_link_libraries( ll::SDL2 INTERFACE SDL2) +endif() + +target_include_directories( ll::SDL2 SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/SDL2) + +target_compile_definitions( ll::SDL2 INTERFACE LL_SDL=1) + +endif() \ No newline at end of file diff --git a/indra/cmake/Sentry.cmake b/indra/cmake/Sentry.cmake index d76d47fb6488a9cb8df33fd6132aeba8366dbfa4..223cb383222bcc2a13cf343926ae24e9d8c60552 100644 --- a/indra/cmake/Sentry.cmake +++ b/indra/cmake/Sentry.cmake @@ -1,38 +1,37 @@ # -*- cmake -*- include(Linking) include(Prebuilt) -include(Variables) +include(CURL) +include(NGHTTP2) +include(OpenSSL) +include(ZLIBNG) + +include_guard() if (USE_SENTRY) - if (NOT USESYSTEMLIBS) - include(Prebuilt) - use_prebuilt_binary(sentry) - if (WINDOWS) - set(SENTRY_LIBRARIES ${ARCH_PREBUILT_DIRS_RELEASE}/sentry.lib) - elseif (DARWIN) - find_library(SENTRY_LIBRARIES Sentry REQUIRED - NO_DEFAULT_PATH PATHS "${ARCH_PREBUILT_DIRS_RELEASE}") - else () - include(CURL) - include(NGHTTP2) - include(OpenSSL) - include(ZLIBNG) - set(SENTRY_LIBRARIES - ${ARCH_PREBUILT_DIRS_RELEASE}/libsentry.a - ${ARCH_PREBUILT_DIRS_RELEASE}/libbreakpad_client.a - ${CURL_LIBRARIES} - ${NGHTTP2_LIBRARIES} - ${OPENSSL_LIBRARIES} - ${ZLIBNG_LIBRARIES}) - endif () + add_library( al::sentry INTERFACE IMPORTED ) + use_prebuilt_binary(sentry) + if (WINDOWS) + target_link_libraries( al::sentry INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/sentry.lib) + elseif (DARWIN) + find_library(SENTRY_LIBRARIES Sentry REQUIRED + NO_DEFAULT_PATH PATHS "${ARCH_PREBUILT_DIRS_RELEASE}") + target_link_libraries( al::sentry INTERFACE ${SENTRY_LIBRARIES}) else () - find_package(Sentry REQUIRED) + target_link_libraries( al::sentry INTERFACE + ${ARCH_PREBUILT_DIRS_RELEASE}/libsentry.a + ${ARCH_PREBUILT_DIRS_RELEASE}/libbreakpad_client.a + ll::libcurl + ll::openssl + ll::nghttp2 + ll::zlib-ng + ) endif () + target_include_directories( al::sentry SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/sentry) if(SENTRY_DSN STREQUAL "") message(FATAL_ERROR "You must set a DSN url with -DSENTRY_DSN= to enable sentry") endif() - set(SENTRY_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/sentry) - set(SENTRY_DEFINE "USE_SENTRY=1") + target_compile_definitions( al::sentry INTERFACE AL_SENTRY=1 SENTRY_DSN="${SENTRY_DSN}") endif () diff --git a/indra/cmake/Tracy.cmake b/indra/cmake/Tracy.cmake index 0cdc52ed4bf3f3eedb275931829dbce5dd21dbf8..34323e5d149e7ae6655b764cd00ed8eed6a63ea6 100644 --- a/indra/cmake/Tracy.cmake +++ b/indra/cmake/Tracy.cmake @@ -1,17 +1,18 @@ # -*- cmake -*- include(Prebuilt) +include_guard() +add_library( ll::tracy INTERFACE IMPORTED ) + set(USE_TRACY OFF CACHE BOOL "Use Tracy profiler.") if (USE_TRACY) - # use_prebuilt_binary(tracy) + #use_system_binary(tracy) + #use_prebuilt_binary(tracy) + + #target_include_directories( ll::tracy SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/tracy) - # See: indra/llcommon/llprofiler.h - add_definitions(-DLL_PROFILER_CONFIGURATION=3) - set(TRACY_LIBRARY TracyClient) -else (USE_TRACY) - # Tracy.cmake should not set LLCOMMON_INCLUDE_DIRS, let LLCommon.cmake do that - set(TRACY_INCLUDE_DIR "") - set(TRACY_LIBRARY "") +# See: indra/llcommon/llprofiler.h + target_compile_definitions(ll::tracy INTERFACE LL_PROFILER_CONFIGURATION=3 ) endif (USE_TRACY) diff --git a/indra/cmake/Tut.cmake b/indra/cmake/Tut.cmake index e11a3c3314c2862ecb4025d903ad1664bd651c7a..ad938308033e3fab73d43f2a533c4aa3d9a2536c 100644 --- a/indra/cmake/Tut.cmake +++ b/indra/cmake/Tut.cmake @@ -1,6 +1,4 @@ # -*- cmake -*- include(Prebuilt) -if (NOT USESYSTEMLIBS) - use_prebuilt_binary(tut) -endif(NOT USESYSTEMLIBS) +use_prebuilt_binary(tut) diff --git a/indra/cmake/UI.cmake b/indra/cmake/UI.cmake index 7b0d7f853dcdc4031b261804655d5fac42b34119..658627dc50b01d77ccaeab131509de1e15988e49 100644 --- a/indra/cmake/UI.cmake +++ b/indra/cmake/UI.cmake @@ -2,64 +2,56 @@ include(Prebuilt) include(FreeType) -if (LINUX) - include(FindPkgConfig) +add_library( ll::uilibraries INTERFACE IMPORTED ) - option(USE_X11 "Enable extra X11 support code" OFF) +if (LINUX) + target_compile_definitions(ll::uilibraries INTERFACE LL_GTK=1) - if (USESYSTEMLIBS) - set(PKGCONFIG_PACKAGES - atk - cairo - gdk-2.0 - gdk-pixbuf-2.0 - glib-2.0 - gmodule-2.0 - gtk+-2.0 - gthread-2.0 - pango - pangoft2 - pangox - ) + if(USE_X11) + target_compile_definitions(ll::uilibraries INTERFACE LL_X11=1 ) + endif() - if(USE_X11) - list(APPEND PKGCONFIG_PACKAGES - x11 - ) - endif() - - foreach(pkg ${PKGCONFIG_PACKAGES}) - pkg_check_modules(${pkg} REQUIRED ${pkg}) - include_directories(${${pkg}_INCLUDE_DIRS}) - link_directories(${${pkg}_LIBRARY_DIRS}) - list(APPEND UI_LIBRARIES ${${pkg}_LIBRARIES}) - add_definitions(${${pkg}_CFLAGS_OTHERS}) - endforeach(pkg) - else (USESYSTEMLIBS) - set(PKGCONFIG_PACKAGES - gdk-3.0 - gtk+-3.0 - ) + if( USE_CONAN ) + target_link_libraries( ll::uilibraries INTERFACE CONAN_PKG::gtk ) + return() + endif() - if(USE_X11) - list(APPEND PKGCONFIG_PACKAGES - x11 - ) - endif() + include(FindPkgConfig) - foreach(pkg ${PKGCONFIG_PACKAGES}) - pkg_check_modules(${pkg} REQUIRED ${pkg}) - include_directories(${${pkg}_INCLUDE_DIRS}) - link_directories(${${pkg}_LIBRARY_DIRS}) - list(APPEND UI_LIBRARIES ${${pkg}_LIBRARIES}) - add_definitions(${${pkg}_CFLAGS_OTHERS}) - endforeach(pkg) - endif (USESYSTEMLIBS) + set(PKGCONFIG_PACKAGES + gdk-3.0 + gtk+-3.0 + ) if(USE_X11) - add_definitions(-DLL_X11=1) + list(APPEND PKGCONFIG_PACKAGES + x11 + ) endif() - # Always enable gtk in linux - add_definitions(-DLL_GTK=1) -endif (LINUX) \ No newline at end of file + foreach(pkg ${PKGCONFIG_PACKAGES}) + pkg_check_modules(${pkg} REQUIRED IMPORTED_TARGET ${pkg}) + target_link_libraries( ll::uilibraries INTERFACE PkgConfig::${pkg}) + endforeach(pkg) +endif (LINUX) +if( WINDOWS ) + target_link_libraries( ll::uilibraries INTERFACE + opengl32 + comdlg32 + dxguid + kernel32 + odbc32 + odbccp32 + oleaut32 + shell32 + Vfw32 + wer + winspool + imm32 + ) +endif() + +target_include_directories( ll::uilibraries SYSTEM INTERFACE + ${LIBS_PREBUILT_DIR}/include + ) + diff --git a/indra/cmake/URIPARSER.cmake b/indra/cmake/URIPARSER.cmake index a1723f2cb1ade1a7911a9ba89f6635befd6e7bd5..cd5d9e598fbb10bac807ce462fdc2253c22897f1 100644 --- a/indra/cmake/URIPARSER.cmake +++ b/indra/cmake/URIPARSER.cmake @@ -1,35 +1,22 @@ # -*- cmake -*- -set(URIPARSER_FIND_QUIETLY ON) -set(URIPARSER_FIND_REQUIRED ON) +include_guard() include(Prebuilt) -if (USESYSTEMLIBS) - include(FindURIPARSER) -else (USESYSTEMLIBS) - use_prebuilt_binary(uriparser) - if (WINDOWS) - set(URIPARSER_LIBRARIES +add_library( ll::uriparser INTERFACE IMPORTED ) + +use_system_binary( uriparser ) + +use_prebuilt_binary(uriparser) +if (WINDOWS) + target_compile_definitions( ll::uriparser INTERFACE URI_STATIC_BUILD=1) + target_link_libraries( ll::uriparser INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/uriparser.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/uriparser.lib) - elseif (LINUX) - # - # When we have updated static libraries in competition with older - # shared libraries and we want the former to win, we need to do some - # extra work. The *_PRELOAD_ARCHIVES settings are invoked early - # and will pull in the entire archive to the binary giving it. - # priority in symbol resolution. Beware of cmake moving the - # achive load itself to another place on the link command line. If - # that happens, you can try something like -Wl,-luriparser here to hide - # the archive. Also be aware that the linker will not tolerate a - # second whole-archive load of the archive. See viewer's - # CMakeLists.txt for more information. - # - set(URIPARSER_PRELOAD_ARCHIVES -Wl,--whole-archive uriparser -Wl,--no-whole-archive) - set(URIPARSER_LIBRARIES uriparser) - elseif (DARWIN) - set(URIPARSER_LIBRARIES uriparser) - endif (WINDOWS) - set(URIPARSER_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/uriparser) -endif (USESYSTEMLIBS) +elseif (LINUX) + target_link_libraries( ll::uriparser INTERFACE uriparser) +elseif (DARWIN) + target_link_libraries( ll::uriparser INTERFACE liburiparser.dylib) +endif (WINDOWS) +target_include_directories( ll::uriparser SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/uriparser) diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 4352e12263142136266c0c2899d3ea48e335c5e1..81f91da21c9664a3998a55d32e4dd1ab758a8abc 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -9,21 +9,13 @@ # LINUX - Linux # WINDOWS - Windows +include_guard() # Relative and absolute paths to subtrees. -if(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED) -set(${CMAKE_CURRENT_LIST_FILE}_INCLUDED "YES") - if(NOT DEFINED COMMON_CMAKE_DIR) set(COMMON_CMAKE_DIR "${CMAKE_SOURCE_DIR}/cmake") endif(NOT DEFINED COMMON_CMAKE_DIR) -get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) -option(GEN_IS_MULTI_CONFIG "" ${_isMultiConfig}) -mark_as_advanced(GEN_IS_MULTI_CONFIG) - -string(TOUPPER "${CMAKE_BUILD_TYPE}" UPPERCASE_CMAKE_BUILD_TYPE) - set(LIBS_CLOSED_PREFIX) set(LIBS_OPEN_PREFIX) set(SCRIPTS_PREFIX ../scripts) @@ -57,29 +49,6 @@ set(VIEWER_SYMBOL_FILE "" CACHE STRING "Name of tarball into which to place symb option(USE_CEF "Enable CEF media plugin" ON) option(USE_VLC "Enable VLC media plugin" ON) -#Discord Integration -option(USE_DISCORD "Enable Discord client integration" OFF) - -if(DEFINED ENV{DISCORD_CLIENTID}) - set(DISCORD_CLIENTID $ENV{DISCORD_CLIENTID} CACHE STRING "Discord Client ID" FORCE) -else() - set(DISCORD_CLIENTID "" CACHE STRING "Discord Client ID") -endif() - -if (INSTALL_PROPRIETARY) - set(USE_DISCORD ON CACHE BOOL "Use Discord SDK" FORCE) - # Note that viewer_manifest.py makes decision based on SENTRY_DSN and not USE_SENTRY - if (DISCORD_CLIENTID) - set(USE_DISCORD ON CACHE BOOL "Use Discord SDK" FORCE) - else () - set(USE_DISCORD OFF CACHE BOOL "Use Discord SDK" FORCE) - endif () -endif () - -if (DEFINED ENV{USE_DISCORD}) - set(USE_DISCORD $ENV{USE_DISCORD} CACHE BOOL "" FORCE) -endif() - #Crash reporting option(USE_SENTRY "Use the Sentry crash reporting system" OFF) @@ -132,10 +101,8 @@ set(TEMPLATE_VERIFIER_MASTER_URL "https://git.alchemyviewer.org/alchemy/master-m # If someone has specified an address size, use that to determine the # architecture. Otherwise, let the architecture specify the address size. if (ADDRESS_SIZE EQUAL 32) - #message(STATUS "ADDRESS_SIZE is 32") set(ARCH i686) elseif (ADDRESS_SIZE EQUAL 64) - #message(STATUS "ADDRESS_SIZE is 64") set(ARCH x86_64) else (ADDRESS_SIZE EQUAL 32) #message(STATUS "ADDRESS_SIZE is UNDEFINED") @@ -154,15 +121,6 @@ endif (ADDRESS_SIZE EQUAL 32) if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") set(WINDOWS ON BOOL FORCE) - if (ADDRESS_SIZE EQUAL 64) - set(LL_ARCH ${ARCH}_win64) - set(LL_ARCH_DIR ${ARCH}-win64) - elseif (ADDRESS_SIZE EQUAL 32) - set(LL_ARCH ${ARCH}_win32) - set(LL_ARCH_DIR ${ARCH}-win32) - else() - message(FATAL_ERROR "Unkown Architecture!") - endif () endif (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") @@ -188,9 +146,6 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") endif (DPKG_RESULT EQUAL 0) - set(LL_ARCH ${ARCH}_linux) - set(LL_ARCH_DIR ${ARCH}-linux) - #if (INSTALL_PROPRIETARY) # Only turn on headless if we can find osmesa libraries. # include(FindPkgConfig) @@ -217,9 +172,6 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(CMAKE_XCODE_ATTRIBUTE_GCC_FAST_MATH NO) set(CMAKE_XCODE_ATTRIBUTE_GCC_STRICT_ALIASING NO) set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN YES) - if(USE_LTO) - set(CMAKE_XCODE_ATTRIBUTE_LLVM_LTO YES_THIN) - endif() set(CMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS YES) if(FULL_DEBUG_SYMS OR USE_SENTRY) @@ -258,9 +210,6 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(ADDRESS_SIZE 64) set(ARCH x86_64) set(CMAKE_OSX_ARCHITECTURES x86_64) - - set(LL_ARCH ${ARCH}_darwin) - set(LL_ARCH_DIR universal-darwin) endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # Default deploy grid @@ -278,7 +227,6 @@ if(DEFINED ENV{VIEWER_SIGNING_IDENTITY}) endif() set(VERSION_BUILD "0" CACHE STRING "Revision number passed in from the outside") -set(USESYSTEMLIBS OFF CACHE BOOL "Use libraries from your system rather than Linden-supplied prebuilt libraries.") set(USE_PRECOMPILED_HEADERS ON CACHE BOOL "Enable use of precompiled header directives where supported.") @@ -286,4 +234,5 @@ set(VIEWER_UPDATE_SERVICE "https://git.alchemyviewer.org/api/v4/projects/198/pac source_group("CMake Rules" FILES CMakeLists.txt) -endif(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED) +get_property(LL_GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake index 51e4ef3abacb14991a7646bbb4fe07c0a58211e0..9d3fbc4b3cd63432621ba385829be8e2b1066181 100644 --- a/indra/cmake/ViewerMiscLibs.cmake +++ b/indra/cmake/ViewerMiscLibs.cmake @@ -1,8 +1,6 @@ # -*- cmake -*- include(Prebuilt) +include_guard() -if (NOT USESYSTEMLIBS) - use_prebuilt_binary(libhunspell) - use_prebuilt_binary(slvoice) -endif(NOT USESYSTEMLIBS) +use_prebuilt_binary(slvoice) diff --git a/indra/cmake/WebP.cmake b/indra/cmake/WebP.cmake index e1fcaaa6dc055a22f043f4e55ce85331f17e038d..44309ad0781b653d5203639783daa9019bdb6088 100644 --- a/indra/cmake/WebP.cmake +++ b/indra/cmake/WebP.cmake @@ -1,23 +1,21 @@ # -*- cmake -*- -include(Linking) + +include_guard() + include(Prebuilt) -set(WEBP_FIND_QUIETLY ON) -set(WEBP_FIND_REQUIRED ON) +add_library( ll::libwebp INTERFACE IMPORTED ) + +use_system_binary( libwebp ) -if (USESYSTEMLIBS) - include(FindWEBP) -else (USESYSTEMLIBS) - use_prebuilt_binary(libwebp) - if (WINDOWS) - set(WEBP_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libwebp_debug.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libwebp.lib - ) - elseif(DARWIN) - set(WEBP_LIBRARIES webp) - else() - set(WEBP_LIBRARIES webp) - endif() - set(WEBP_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/webp) -endif (USESYSTEMLIBS) +use_prebuilt_binary(libwebp) +if(WINDOWS) + target_link_libraries( ll::libwebp INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libwebp_debug.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libwebp.lib + ) +else() + target_link_libraries( ll::libwebp INTERFACE webp) +endif() + +target_include_directories( ll::libwebp SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/webp) diff --git a/indra/cmake/XXHash.cmake b/indra/cmake/XXHash.cmake index ac35f6a56d4a8e110df23a63bd4c73f46a86e78b..6575c471a34da5fac964103d75dfeceb95757bc5 100644 --- a/indra/cmake/XXHash.cmake +++ b/indra/cmake/XXHash.cmake @@ -1,18 +1,20 @@ # -*- cmake -*- + +include_guard() + include(Prebuilt) -if (USESYSTEMLIBS) - find_package(xxHash 0.8.1 CONFIG REQUIRED) -else (USESYSTEMLIBS) - use_prebuilt_binary(xxhash) - - if(WINDOWS) - set(XXHASH_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/xxhash.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/xxhash.lib) - else(WINDOWS) - set(XXHASH_LIBRARIES xxhash) - endif(WINDOWS) +add_library( ll::xxhash INTERFACE IMPORTED ) + +use_system_binary( xxhash ) + +use_prebuilt_binary(xxhash) +# if(WINDOWS) +# target_link_libraries( ll::xxhash INTERFACE +# debug ${ARCH_PREBUILT_DIRS_DEBUG}/xxhash.lib +# optimized ${ARCH_PREBUILT_DIRS_RELEASE}/xxhash.lib) +# else() +# target_link_libraries( ll::xxhash INTERFACE xxhash) +# endif() - set(XXHASH_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/xxhash) -endif (USESYSTEMLIBS) + target_include_directories( ll::xxhash SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/xxhash) diff --git a/indra/cmake/XmlRpcEpi.cmake b/indra/cmake/XmlRpcEpi.cmake index 852412168963663275c62f53c229a6a99dc8f930..db6d77b71cd385c3f47ec650658d8b30600cebc1 100644 --- a/indra/cmake/XmlRpcEpi.cmake +++ b/indra/cmake/XmlRpcEpi.cmake @@ -1,23 +1,20 @@ # -*- cmake -*- include(Prebuilt) -set(XMLRPCEPI_FIND_QUIETLY ON) -set(XMLRPCEPI_FIND_REQUIRED ON) +include_guard() +add_library( ll::xmlrpc-epi INTERFACE IMPORTED ) -if (USESYSTEMLIBS) - include(FindXmlRpcEpi) -else (USESYSTEMLIBS) - use_prebuilt_binary(xmlrpc-epi) - if (WINDOWS) - set(XMLRPCEPI_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/xmlrpc-epid.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/xmlrpc-epi.lib - ) - else() - set(XMLRPCEPI_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libxmlrpc-epi.a - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libxmlrpc-epi.a - ) - endif (WINDOWS) - set(XMLRPCEPI_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) -endif (USESYSTEMLIBS) +use_system_binary( xmlrpc-epi ) + +use_prebuilt_binary(xmlrpc-epi) +if (WINDOWS) + target_compile_definitions( ll::xmlrpc-epi INTERFACE XMLRPCEPI_STATIC=1) + target_link_libraries(ll::xmlrpc-epi INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/xmlrpc-epid.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/xmlrpc-epi.lib) +else() + target_link_libraries(ll::xmlrpc-epi INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libxmlrpc-epi.a + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libxmlrpc-epi.a) +endif (WINDOWS) +target_include_directories( ll::xmlrpc-epi SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include) diff --git a/indra/cmake/ZLIBNG.cmake b/indra/cmake/ZLIBNG.cmake index 770017f0d1bfb3c0781c2cacbe4b44e1f4a0529e..4564d199d8377ebc1e6345fb8d69835802125186 100644 --- a/indra/cmake/ZLIBNG.cmake +++ b/indra/cmake/ZLIBNG.cmake @@ -1,43 +1,42 @@ # -*- cmake -*- -set(ZLIBNG_FIND_QUIETLY ON) -set(ZLIBNG_FIND_REQUIRED ON) - include(Prebuilt) -include(Linking) - -if (USESYSTEMLIBS) - include(FindZLIBNG) -else (USESYSTEMLIBS) - use_prebuilt_binary(zlib-ng) - use_prebuilt_binary(minizip-ng) - if (WINDOWS) - set(MINIZIP_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/libminizip.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libminizip.lib) - set(ZLIBNG_LIBRARIES +include_guard() +add_library( ll::zlib-ng INTERFACE IMPORTED ) + +if(USE_CONAN ) + target_link_libraries( ll::zlib-ng INTERFACE CONAN_PKG::zlib ) + return() +endif() + +use_prebuilt_binary(zlib-ng) +if (WINDOWS) + target_link_libraries( ll::zlib-ng INTERFACE debug ${ARCH_PREBUILT_DIRS_DEBUG}/zlibd.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/zlib.lib) - elseif (LINUX) - set(MINIZIP_LIBRARIES minizip) - # - # When we have updated static libraries in competition with older - # shared libraries and we want the former to win, we need to do some - # extra work. The *_PRELOAD_ARCHIVES settings are invoked early - # and will pull in the entire archive to the binary giving it - # priority in symbol resolution. Beware of cmake moving the - # achive load itself to another place on the link command line. If - # that happens, you can try something like -Wl,-lz here to hide - # the archive. Also be aware that the linker will not tolerate a - # second whole-archive load of the archive. See viewer's - # CMakeLists.txt for more information. - # - set(ZLIBNG_PRELOAD_ARCHIVES -Wl,--whole-archive z -Wl,--no-whole-archive) - set(ZLIBNG_LIBRARIES z) - elseif (DARWIN) - set(MINIZIP_LIBRARIES minizip) - set(ZLIBNG_LIBRARIES -Wl,-force_load,${ARCH_PREBUILT_DIRS_RELEASE}/libz.a) - endif (WINDOWS) - set(ZLIBNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/zlib-ng) -endif (USESYSTEMLIBS) +else() + target_link_libraries( ll::zlib-ng INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libz.a) +endif (WINDOWS) + +target_include_directories( ll::zlib-ng SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/zlib) + +add_library( ll::minizip-ng INTERFACE IMPORTED ) + +if(USE_CONAN ) + target_link_libraries( ll::minizip-ng INTERFACE CONAN_PKG::minizip-ng ) + return() +endif() + +use_prebuilt_binary(minizip-ng) +if (WINDOWS) + target_link_libraries( ll::minizip-ng INTERFACE + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libminizip.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libminizip.lib + ll::zlib-ng) +else() + target_link_libraries( ll::minizip-ng INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libminizip.a ll::zlib-ng) +endif (WINDOWS) + +target_include_directories( ll::minizip-ng SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/minizip) + diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py index 1e92868ae76fdfbad51d94e418d784b865ced85c..1f040bded519f85d81ac0ee7a5210f581b5113ea 100755 --- a/indra/cmake/run_build_test.py +++ b/indra/cmake/run_build_test.py @@ -73,7 +73,7 @@ def main(command, arguments=[], libpath=[], vars={}): if sys.platform == "win32": lpvars = ["PATH"] elif sys.platform == "darwin": - lpvars = ["LD_LIBRARY_PATH", "DYLD_LIBRARY_PATH"] + lpvars = ["LD_LIBRARY_PATH"] # , "DYLD_LIBRARY_PATH"] elif sys.platform.startswith("linux"): lpvars = ["LD_LIBRARY_PATH"] else: diff --git a/indra/deps/CMakeLists.txt b/indra/deps/CMakeLists.txt index d931f4d29bdb4422eea8b076de3ef8ec90bb46f8..174d35966314b45b260ace33c6c9f83dc325204f 100644 --- a/indra/deps/CMakeLists.txt +++ b/indra/deps/CMakeLists.txt @@ -1,10 +1,12 @@ + project(deps) include(00-Common) include(FetchContent) set(CMAKE_FOLDER "Third Party") -set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) +set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) set(deps_SOURCE_FILES CMakeLists.txt @@ -18,17 +20,6 @@ add_library(deps ${deps_SOURCE_FILES} ) - -if(${CMAKE_VERSION} VERSION_LESS 3.14) - macro(FetchContent_MakeAvailable NAME) - FetchContent_GetProperties(${NAME}) - if(NOT ${NAME}_POPULATED) - FetchContent_Populate(${NAME}) - add_subdirectory(${${NAME}_SOURCE_DIR} ${${NAME}_BINARY_DIR}) - endif() - endmacro() -endif() - FetchContent_Declare( meshoptimizer GIT_REPOSITORY https://git.alchemyviewer.org/alchemy/mirrors/meshoptimizer.git @@ -79,8 +70,7 @@ if(USE_TRACY) set(TRACY_ON_DEMAND ON) set(TRACY_ONLY_LOCALHOST ON) set(TRACY_FIBERS ON) - FetchContent_MakeAvailable (tracy) + FetchContent_MakeAvailable(tracy) endif() unset(CMAKE_FOLDER) -unset(CMAKE_POSITION_INDEPENDENT_CODE) diff --git a/indra/integration_tests/llimage_libtest/CMakeLists.txt b/indra/integration_tests/llimage_libtest/CMakeLists.txt index 138a4cf0f50f431d2d7b9dc2ee571bdd3dc53ea6..2b5130f195ecfc062f2406574ebda3e6ced271ee 100644 --- a/indra/integration_tests/llimage_libtest/CMakeLists.txt +++ b/indra/integration_tests/llimage_libtest/CMakeLists.txt @@ -12,16 +12,6 @@ include(LLImageJ2COJ) include(LLKDU) include(LLFileSystem) -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLFILESYSTEM_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ) - set(llimage_libtest_SOURCE_FILES llimage_libtest.cpp ) @@ -31,9 +21,6 @@ set(llimage_libtest_HEADER_FILES llimage_libtest.h ) -set_source_files_properties(${llimage_libtest_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llimage_libtest_SOURCE_FILES ${llimage_libtest_HEADER_FILES}) add_executable(llimage_libtest @@ -48,37 +35,21 @@ set_target_properties(llimage_libtest FALSE ) -# OS-specific libraries -if (DARWIN) - include(CMakeFindFrameworks) - find_library(COREFOUNDATION_LIBRARY CoreFoundation) - set(OS_LIBRARIES ${COREFOUNDATION_LIBRARY}) -elseif (WINDOWS) - set(OS_LIBRARIES) -elseif (LINUX) - set(OS_LIBRARIES) -else (DARWIN) - message(FATAL_ERROR "Unknown platform") -endif (DARWIN) - # Libraries on which this application depends on # Sort by high-level to low-level target_link_libraries(llimage_libtest - ${LEGACY_STDIO_LIBS} - ${LLCOMMON_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLIMAGE_LIBRARIES} - ${LLKDU_LIBRARIES} - ${KDU_LIBRARY} - ${LLIMAGEJ2COJ_LIBRARIES} - ${OS_LIBRARIES} - ) + llcommon + llfilesystem + llmath + llimage + llkdu + llimagej2coj + ) if (DARWIN) # Path inside the app bundle where we'll need to copy libraries set(LLIMAGE_LIBTEST_DESTINATION_DIR - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llimage_libtest.app/Contents/Resources + ${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>/llimage_libtest.app/Contents/Resources ) # Create the Contents/Resources directory add_custom_command( diff --git a/indra/integration_tests/llui_libtest/CMakeLists.txt b/indra/integration_tests/llui_libtest/CMakeLists.txt index 3957ede77f01d49af6eabc3cd7d389c223c4d8d8..d603e57aab87fab8bd8203bda2dbcd8df5750cd6 100644 --- a/indra/integration_tests/llui_libtest/CMakeLists.txt +++ b/indra/integration_tests/llui_libtest/CMakeLists.txt @@ -22,23 +22,6 @@ include(Hunspell) include(Linking) # include(Tut) -include_directories( - ${FREETYPE_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLUI_INCLUDE_DIRS} - ${LLFILESYSTEM_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ${LIBS_PREBUILD_DIR}/include/hunspell - ) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLXML_SYSTEM_INCLUDE_DIRS} - ) - set(llui_libtest_SOURCE_FILES llui_libtest.cpp llwidgetreg.cpp @@ -50,50 +33,26 @@ set(llui_libtest_HEADER_FILES llwidgetreg.h ) -set_source_files_properties(${llui_libtest_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llui_libtest_SOURCE_FILES ${llui_libtest_HEADER_FILES}) add_executable(llui_libtest ${llui_libtest_SOURCE_FILES}) -# Link with OS-specific libraries for LLWindow dependency -if (DARWIN) - find_library(COCOA_LIBRARY Cocoa) - find_library(IOKIT_LIBRARY IOKit) - set(OS_LIBRARIES ${COCOA_LIBRARY} ${IOKIT_LIBRARY}) -elseif (WINDOWS) - #ll_stack_trace needs this now... - list(APPEND WINDOWS_LIBRARIES dbghelp) - set(OS_LIBRARIES ${WINDOWS_LIBRARIES}) -elseif (LINUX) - set(OS_LIBRARIES) -else (DARWIN) - message(FATAL_ERROR "unknown platform") -endif (DARWIN) - # Libraries on which this library depends, needed for Linux builds # Sort by high-level to low-level target_link_libraries(llui_libtest - ${LEGACY_STDIO_LIBS} - llui - llinventory - llmessage - ${LLRENDER_LIBRARIES} - ${LLIMAGE_LIBRARIES} - ${LLKDU_LIBRARIES} - ${KDU_LIBRARY} - ${LLIMAGEJ2COJ_LIBRARIES} - ${OS_LIBRARIES} - ${GOOGLE_PERFTOOLS_LIBRARIES} - ${HUNSPELL_LIBRARY} - ) + llui + llinventory + llmessage + llrender + llimage + llkdu + llimagej2coj + ) if (WINDOWS) set_target_properties(llui_libtest PROPERTIES LINK_FLAGS "/NODEFAULTLIB:LIBCMT" - LINK_FLAGS_DEBUG "/NODEFAULTLIB:MSVCRT /NODEFAULTLIB:LIBCMTD" ) # Copy over OpenJPEG.dll @@ -101,7 +60,7 @@ if (WINDOWS) set(OPENJPEG_RELEASE "${ARCH_PREBUILT_DIRS_RELEASE}/openjp2.dll") add_custom_command( TARGET llui_libtest POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${OPENJPEG_RELEASE} ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Copying OpenJPEG DLLs to binary directory" ) diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index ee503df757f044eb018c9abc2705c6dcf0d50446..cb6fd0365ccfb02c1f16e91dfc2f9292251bde94 100755 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -127,7 +127,7 @@ def get_default_platform(dummy): but not application name (used internally)""", default=None), dict(name='configuration', - description="""The build configuration used.""", + description="""The build configurations sub directory used.""", default="Release"), dict(name='dest', description='Destination directory.', default=DEFAULT_SRCTREE), dict(name='grid', diff --git a/indra/llappearance/CMakeLists.txt b/indra/llappearance/CMakeLists.txt index 3ff420e40f5702e3ad2068707573dd90e176c975..8af61ebf8726ab7e7ecf734eb351cbf4d47e8491 100644 --- a/indra/llappearance/CMakeLists.txt +++ b/indra/llappearance/CMakeLists.txt @@ -4,30 +4,11 @@ project(llappearance) include(00-Common) include(LLCommon) -include(LLCharacter) include(LLImage) -include(LLInventory) -include(LLMath) -include(LLMessage) include(LLCoreHttp) -include(LLRender) -include(LLFileSystem) include(LLWindow) -include(LLXML) include(Linking) -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLCHARACTER_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLINVENTORY_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLFILESYSTEM_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ) - set(llappearance_SOURCE_FILES llavatarappearance.cpp llavatarjoint.cpp @@ -71,26 +52,23 @@ set(llappearance_HEADER_FILES llavatarappearancedefines.h ) -set_source_files_properties(${llappearance_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llappearance_SOURCE_FILES ${llappearance_HEADER_FILES}) add_library (llappearance ${llappearance_SOURCE_FILES}) target_link_libraries(llappearance - ${LLCHARACTER_LIBRARIES} - ${LLINVENTORY_LIBRARIES} - ${LLIMAGE_LIBRARIES} - ${LLRENDER_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLXML_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${LLCOMMON_LIBRARIES} + llcharacter + llinventory + llimage + llrender + llfilesystem + llmath + llxml + llmessage + llcorehttp + llcommon ) +target_include_directories( llappearance INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") target_precompile_headers(llappearance @@ -101,18 +79,17 @@ endif() if (BUILD_HEADLESS) add_library (llappearanceheadless ${llappearance_SOURCE_FILES}) - + target_include_directories( llappearanceheadless INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(llappearanceheadless - ${LLCHARACTER_LIBRARIES} - ${LLINVENTORY_LIBRARIES} - ${LLIMAGE_LIBRARIES} - ${LLRENDERHEADLESS_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLXML_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${LLCOMMON_LIBRARIES} + llcharacter + llinventory + llimage + llfilesystem + llmath + llxml + llmessage + llcorehttp + llcommon ) endif (BUILD_HEADLESS) diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt index 46c168467f2a671b357bad925376e715333e471b..81b6edea6eec6313373b3239da1c1fcf82f94a3a 100644 --- a/indra/llaudio/CMakeLists.txt +++ b/indra/llaudio/CMakeLists.txt @@ -7,23 +7,6 @@ include(LLAudio) include(FMODSTUDIO) include(OPENAL) include(LLCommon) -include(LLMath) -include(LLMessage) -include(LLFileSystem) - -include_directories( - ${LLAUDIO_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLMESSAGE_INCLUDE_DIRS} - ${LLFILESYSTEM_INCLUDE_DIRS} - ${OGG_INCLUDE_DIRS} - ${VORBISENC_INCLUDE_DIRS} - ${VORBISFILE_INCLUDE_DIRS} - ${VORBIS_INCLUDE_DIRS} - ${OPENAL_INCLUDE_DIRS} - ${FREEAULT_INCLUDE_DIRS} - ) set(llaudio_SOURCE_FILES llaudioengine.cpp @@ -43,10 +26,7 @@ set(llaudio_HEADER_FILES llwindgen.h ) -if (USE_FMODSTUDIO) - include_directories( - ${FMODSTUDIO_INCLUDE_DIR} - ) +if (TARGET ll::fmodstudio) list(APPEND llaudio_SOURCE_FILES llaudioengine_fmodstudio.cpp lllistener_fmodstudio.cpp @@ -58,14 +38,9 @@ if (USE_FMODSTUDIO) lllistener_fmodstudio.h llstreamingaudio_fmodstudio.h ) -endif (USE_FMODSTUDIO) - -if (USE_OPENAL) - include_directories( - ${OPENAL_LIBRARIES} - ${FREEALUT_LIBRARIES} - ) +endif () +if (TARGET ll::openal) list(APPEND llaudio_SOURCE_FILES llaudioengine_openal.cpp lllistener_openal.cpp @@ -75,29 +50,33 @@ if (USE_OPENAL) llaudioengine_openal.h lllistener_openal.h ) -endif (USE_OPENAL) - -set_source_files_properties(${llaudio_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) +endif () list(APPEND llaudio_SOURCE_FILES ${llaudio_HEADER_FILES}) add_library (llaudio ${llaudio_SOURCE_FILES}) -target_link_libraries( - llaudio - ${LLCOMMON_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${VORBISENC_LIBRARIES} - ${VORBISFILE_LIBRARIES} - ${VORBIS_LIBRARIES} - ${OGG_LIBRARIES} +target_include_directories( llaudio INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries( llaudio + PUBLIC + llcommon + llmath + llmessage + llfilesystem + ll::vorbis ) +if( TARGET ll::openal ) + target_link_libraries( llaudio PUBLIC ll::openal ) +endif() +if( TARGET ll::fmodstudio ) + target_link_libraries( llaudio PUBLIC ll::fmodstudio ) +endif() + if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") target_precompile_headers(llaudio PRIVATE [["linden_common.h"]] ) endif() + + diff --git a/indra/llcharacter/CMakeLists.txt b/indra/llcharacter/CMakeLists.txt index 2f0012c76d5e0298a0bd6ab97f11c327f3b58f30..619daa8c5d8019a822a8ed10e7b845d58f7285e2 100644 --- a/indra/llcharacter/CMakeLists.txt +++ b/indra/llcharacter/CMakeLists.txt @@ -4,22 +4,6 @@ project(llcharacter) include(00-Common) include(LLCommon) -include(LLMath) -include(LLMessage) -include(LLFileSystem) -include(LLXML) - -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLMESSAGE_INCLUDE_DIRS} - ${LLFILESYSTEM_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLXML_SYSTEM_INCLUDE_DIRS} - ) set(llcharacter_SOURCE_FILES llanimationstates.cpp @@ -69,20 +53,18 @@ set(llcharacter_HEADER_FILES llvisualparam.h ) -set_source_files_properties(${llcharacter_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llcharacter_SOURCE_FILES ${llcharacter_HEADER_FILES}) add_library (llcharacter ${llcharacter_SOURCE_FILES}) +target_include_directories( llcharacter INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries( - llcharacter - ${LLCOMMON_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLXML_LIBRARIES} + llcharacter + llcommon + llmath + llmessage + llfilesystem + llxml ) if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index b8ef0a5188416b5a8daf023522de2d1ce2f9a993..8448c460a94b194b9bf8ec11c1095cae8e3b64c4 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -12,23 +12,11 @@ include(LLSharedLibs) include(Copy3rdPartyLibs) include(ZLIBNG) include(URIPARSER) +include(Sentry) include(Tracy) include(OpenSSL) include(XXHash) -include_directories( - ${EXPAT_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${ZLIBNG_INCLUDE_DIRS} - ${URIPARSER_INCLUDE_DIRS} - ${XXHASH_INCLUDE_DIRS} - ) - -# add_executable(lltreeiterators lltreeiterators.cpp) -# -# target_link_libraries(lltreeiterators -# ${LLCOMMON_LIBRARIES}) set(llcommon_SOURCE_FILES commoncontrol.cpp @@ -274,11 +262,6 @@ set(llcommon_HEADER_FILES StackWalker.h ) -if (DARWIN) - list(APPEND llcommon_HEADER_FILES llsys_objc.h) - list(APPEND llcommon_SOURCE_FILES llsys_objc.mm) -endif (DARWIN) - if (DARWIN) list(APPEND llcommon_HEADER_FILES llsys_objc.h) list(APPEND llcommon_SOURCE_FILES llsys_objc.mm) @@ -287,44 +270,33 @@ if (DARWIN) PROPERTIES SKIP_PRECOMPILE_HEADERS TRUE) endif (DARWIN) -set_source_files_properties(${llcommon_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - -if (USE_SENTRY) - set_source_files_properties(${llcommon_SOURCE_FILES} - PROPERTIES COMPILE_DEFINITIONS "${SENTRY_DEFINE}") -endif (USE_SENTRY) - list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES}) add_library (llcommon ${llcommon_SOURCE_FILES}) -set_target_properties(llcommon PROPERTIES POSITION_INDEPENDENT_CODE TRUE) - target_link_libraries( - llcommon - PUBLIC - ${APRUTIL_LIBRARIES} - ${APR_LIBRARIES} - ${EXPAT_LIBRARIES} - ${OPENSSL_LIBRARIES} - ${ZLIBNG_LIBRARIES} - ${WINDOWS_LIBRARIES} - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_PROGRAM_OPTIONS_LIBRARY} - ${BOOST_REGEX_LIBRARY} - ${BOOST_STACKTRACE_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - ${GOOGLE_PERFTOOLS_LIBRARIES} - ${URIPARSER_LIBRARIES} - nlohmann_json::nlohmann_json - fmt::fmt - ${TRACY_LIBRARY} - ${DL_LIBRARY} - ${RT_LIBRARY} + llcommon + PUBLIC + ll::apr + ll::expat + ll::openssl + ll::zlib-ng + ll::boost + ll::uriparser + ll::oslibraries + ll::tracy + ll::xxhash + nlohmann_json::nlohmann_json + fmt::fmt ) +target_include_directories(llcommon INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(llcommon PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + +if(TARGET al::sentry) + target_compile_definitions(llcommon PRIVATE AL_SENTRY=1) +endif() + add_dependencies(llcommon stage_third_party_libs) if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") @@ -358,16 +330,7 @@ if (LL_TESTS) LL_ADD_PROJECT_UNIT_TESTS(llcommon "${llcommon_TEST_SOURCE_FILES}") #set(TEST_DEBUG on) - set(test_libs llcommon - ${LLCOMMON_LIBRARIES} - ${WINDOWS_LIBRARIES} - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_THREAD_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - ${OPENSSL_LIBRARIES} - ${ZLIBNG_LIBRARIES} - ) + set(test_libs llcommon) LL_ADD_INTEGRATION_TEST(bitpack "" "${test_libs}") LL_ADD_INTEGRATION_TEST(classic_callback "" "${test_libs}") LL_ADD_INTEGRATION_TEST(commonmisc "" "${test_libs}") diff --git a/indra/llcommon/apply.h b/indra/llcommon/apply.h new file mode 100644 index 0000000000000000000000000000000000000000..7c58d63bc03f4a45aac4db3fe1b20177ade5b652 --- /dev/null +++ b/indra/llcommon/apply.h @@ -0,0 +1,115 @@ +/** + * @file apply.h + * @author Nat Goodspeed + * @date 2022-06-18 + * @brief C++14 version of std::apply() + * + * $LicenseInfo:firstyear=2022&license=viewerlgpl$ + * Copyright (c) 2022, Linden Research, Inc. + * $/LicenseInfo$ + */ + +#if ! defined(LL_APPLY_H) +#define LL_APPLY_H + +#include <boost/type_traits/function_traits.hpp> +#include <tuple> + +namespace LL +{ + +/** + * USAGE NOTE: + * https://stackoverflow.com/a/40523474/5533635 + * + * If you're trying to pass apply() a variadic function, the compiler + * complains that it can't deduce the callable type, presumably because it + * doesn't know which arity to reify to pass. + * + * But it works to wrap the variadic function in a generic lambda, e.g.: + * + * @CODE + * LL::apply( + * [](auto&&... args) + * { + * return variadic(std::forward<decltype(args)>(args)...); + * }, + * args); + * @ENDCODE + * + * Presumably this is because there's only one instance of the generic lambda + * @em type, with a variadic <tt>operator()()</tt>. + * + * It's pointless to provide a wrapper @em function that implicitly supplies + * the generic lambda. You couldn't pass your variadic function to our wrapper + * function, for the same original reason! + * + * Instead we provide a wrapper @em macro. Sorry, Dr. Stroustrup. + */ +#define VAPPLY(FUNC, ARGS) \ + LL::apply( \ + [](auto&&... args) \ + { \ + return (FUNC)(std::forward<decltype(args)>(args)...); \ + }, \ + (ARGS)) + +#if __cplusplus >= 201703L + +// C++17 implementation +using std::apply; + +#else // C++14 + +// Derived from https://stackoverflow.com/a/20441189 +// and https://en.cppreference.com/w/cpp/utility/apply +template <typename CALLABLE, typename TUPLE, std::size_t... I> +auto apply_impl(CALLABLE&& func, TUPLE&& args, std::index_sequence<I...>) +{ + // call func(unpacked args) + return std::forward<CALLABLE>(func)(std::move(std::get<I>(args))...); +} + +template <typename CALLABLE, typename... ARGS> +auto apply(CALLABLE&& func, const std::tuple<ARGS...>& args) +{ + // std::index_sequence_for is the magic sauce here, generating an argument + // pack of indexes for each entry in args. apply_impl() can then pass + // those to std::get() to unpack args into individual arguments. + return apply_impl(std::forward<CALLABLE>(func), + args, + std::index_sequence_for<ARGS...>{}); +} + +// per https://stackoverflow.com/a/57510428/5533635 +template <typename CALLABLE, typename T, size_t SIZE> +auto apply(CALLABLE&& func, const std::array<T, SIZE>& args) +{ + return apply(std::forward<CALLABLE>(func), std::tuple_cat(args)); +} + +// per https://stackoverflow.com/a/28411055/5533635 +template <typename CALLABLE, typename T, std::size_t... I> +auto apply_impl(CALLABLE&& func, const std::vector<T>& args, std::index_sequence<I...>) +{ + return apply_impl(std::forward<CALLABLE>(func), + std::make_tuple(std::forward<T>(args[I])...), + I...); +} + +// this goes beyond C++17 std::apply() +template <typename CALLABLE, typename T> +auto apply(CALLABLE&& func, const std::vector<T>& args) +{ + constexpr auto arity = boost::function_traits<CALLABLE>::arity; + assert(args.size() == arity); + return apply_impl(std::forward<CALLABLE>(func), + args, + std::make_index_sequence<arity>()); +} + +#endif // C++14 + +} // namespace LL + +#endif /* ! defined(LL_APPLY_H) */ diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 78ad6ae4bfaf02a8ad132be39c9dfab60046a4eb..dee10cadf9514999ba989a76452a6f3f6c3ca097 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -374,13 +374,13 @@ void LLApp::setupErrorHandling(bool second_instance) #if defined(LL_WINDOWS) -#if LL_SEND_CRASH_REPORTS && ! defined(USE_SENTRY) +#if LL_SEND_CRASH_REPORTS && ! defined(AL_SENTRY) EnableCrashingOnCrashes(); // This sets a callback to handle w32 signals to the console window. // The viewer shouldn't be affected, sicne its a windowed app. SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ConsoleCtrlHandler, TRUE); -#endif // LL_SEND_CRASH_REPORTS && ! defined(USE_SENTRY) +#endif // LL_SEND_CRASH_REPORTS && ! defined(AL_SENTRY) #else // ! LL_WINDOWS // // Start up signal handling. @@ -391,9 +391,9 @@ void LLApp::setupErrorHandling(bool second_instance) setup_signals(); #endif // ! LL_WINDOWS -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) // do not start our own error thread -#else // ! USE_SENTRY +#else // ! AL_SENTRY startErrorThread(); #endif } @@ -638,16 +638,16 @@ void setup_signals() act.sa_flags = SA_SIGINFO; // Synchronous signals -#if !defined(USE_SENTRY) +#if !defined(AL_SENTRY) sigaction(SIGABRT, &act, NULL); #endif sigaction(SIGALRM, &act, NULL); -#if !defined(USE_SENTRY) +#if !defined(AL_SENTRY) sigaction(SIGBUS, &act, NULL); sigaction(SIGFPE, &act, NULL); #endif sigaction(SIGHUP, &act, NULL); -#if !defined(USE_SENTRY) +#if !defined(AL_SENTRY) sigaction(SIGILL, &act, NULL); sigaction(SIGPIPE, &act, NULL); sigaction(SIGSEGV, &act, NULL); @@ -681,16 +681,16 @@ void clear_signals() act.sa_flags = SA_SIGINFO; // Synchronous signals -#if !defined(USE_SENTRY) +#if !defined(AL_SENTRY) sigaction(SIGABRT, &act, NULL); #endif sigaction(SIGALRM, &act, NULL); -#if !defined(USE_SENTRY) +#if !defined(AL_SENTRY) sigaction(SIGBUS, &act, NULL); sigaction(SIGFPE, &act, NULL); #endif sigaction(SIGHUP, &act, NULL); -#if !defined(USE_SENTRY) +#if !defined(AL_SENTRY) sigaction(SIGILL, &act, NULL); sigaction(SIGPIPE, &act, NULL); sigaction(SIGSEGV, &act, NULL); diff --git a/indra/llcommon/llmutex.h b/indra/llcommon/llmutex.h index 8c5316549c0487c8abcdeba781e65ee9539b7cb1..32a2fc4a21a842034ef26cdd9a4389650ca876d3 100644 --- a/indra/llcommon/llmutex.h +++ b/indra/llcommon/llmutex.h @@ -30,7 +30,7 @@ #include "stdtypes.h" #include "llthread.h" -#include <shared_mutex> +#include <mutex> #include <condition_variable> //============================================================================ diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp index e40d95f9565cb8110956202aa1c7fe31366e36cf..c14d7bca21def7dd0f0cd51d1999b7ea04acb3a8 100644 --- a/indra/llcommon/llprocess.cpp +++ b/indra/llcommon/llprocess.cpp @@ -274,6 +274,14 @@ class ReadPipeImpl: public LLProcess::ReadPipe boost::bind(&ReadPipeImpl::tick, this, _1)); } + ~ReadPipeImpl() + { + if (mConnection.connected()) + { + mConnection.disconnect(); + } + } + // Much of the implementation is simply connecting the abstract virtual // methods with implementation data concealed from the base class. virtual std::istream& get_istream() { return mStream; } diff --git a/indra/llcommon/llsd.cpp b/indra/llcommon/llsd.cpp index 1d885ba28c53f2400967026159cf49770c3e571c..05157919ed88fbed630e799797e21d64fa346a90 100644 --- a/indra/llcommon/llsd.cpp +++ b/indra/llcommon/llsd.cpp @@ -31,7 +31,6 @@ #include "llsd.h" #include "llerror.h" -#include "llmath.h" #include "llformat.h" #include "llsdserialize.h" #include "stringize.h" @@ -259,10 +258,10 @@ namespace }; LLSD::Boolean ImplReal::asBoolean() const - { return !llisnan(mValue) && mValue != 0.0; } + { return !std::isnan(mValue) && mValue != 0.0; } LLSD::Integer ImplReal::asInteger() const - { return !llisnan(mValue) ? (LLSD::Integer)mValue : 0; } + { return !std::isnan(mValue) ? (LLSD::Integer)mValue : 0; } LLSD::String ImplReal::asString() const { return llformat("%lg", mValue); } diff --git a/indra/llcommon/llsd.h b/indra/llcommon/llsd.h index 3a44c75877996ff7b24c0ebff2ef1972f62d0ed4..7e6d675a8153468e6cedf68b37f16c3cceb7234a 100644 --- a/indra/llcommon/llsd.h +++ b/indra/llcommon/llsd.h @@ -36,6 +36,7 @@ #include "lldate.h" #include "lluri.h" #include "lluuid.h" +#include "llstring.h" /** LLSD provides a flexible data system similar to the data facilities of @@ -444,6 +445,49 @@ class LL_COMMON_API LLSD final static std::string typeString(Type type); // Return human-readable type as a string }; +struct llsd_select_bool +{ + LLSD::Boolean operator()(const LLSD& sd) const + { + return sd.asBoolean(); + } +}; +struct llsd_select_integer +{ + LLSD::Integer operator()(const LLSD& sd) const + { + return sd.asInteger(); + } +}; +struct llsd_select_real +{ + LLSD::Real operator()(const LLSD& sd) const + { + return sd.asReal(); + } +}; +struct llsd_select_float +{ + F32 operator()(const LLSD& sd) const + { + return (F32)sd.asReal(); + } +}; +struct llsd_select_uuid +{ + LLSD::UUID operator()(const LLSD& sd) const + { + return sd.asUUID(); + } +}; +struct llsd_select_string +{ + LLSD::String operator()(const LLSD& sd) const + { + return sd.asString(); + } +}; + LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLSD& llsd); namespace llsd diff --git a/indra/llcommon/llstl.h b/indra/llcommon/llstl.h index f110f21aff2bc4edfad5df76b8dd56589276e5eb..2162e8eb7b174f1ddc640705fd05abc3e22095d4 100644 --- a/indra/llcommon/llstl.h +++ b/indra/llcommon/llstl.h @@ -386,9 +386,9 @@ OutputIter ll_transform_n( // select... with the stl. Look up usage on the sgi website. template <class _Pair> -struct _LLSelect1st +struct _LLSelect1st { - const typename _Pair::first_type& operator()(const _Pair& __x) const { + const auto& operator()(const _Pair& __x) const { return __x.first; } }; @@ -396,7 +396,7 @@ struct _LLSelect1st template <class _Pair> struct _LLSelect2nd { - const typename _Pair::second_type& operator()(const _Pair& __x) const { + const auto& operator()(const _Pair& __x) const { return __x.second; } }; @@ -406,52 +406,51 @@ template <class _Pair> struct llselect2nd : public _LLSelect2nd<_Pair> {}; // helpers to deal with the fact that MSDev does not package // bind... with the stl. Again, this is from sgi. -template <class _Operation> +template <class _Operation, typename _Arg1> class llbinder1st { protected: _Operation op; - typename _Operation::first_argument_type value; + _Arg1 value; public: - llbinder1st(const _Operation& __x, - const typename _Operation::first_argument_type& __y) + llbinder1st(const _Operation& __x, const _Arg1& __y) : op(__x), value(__y) {} - typename _Operation::result_type - operator()(const typename _Operation::second_argument_type& __x) const { - return op(value, __x); - } + template <typename _Arg2> + auto + operator()(const _Arg2& __x) const { + return op(value, __x); + } }; template <class _Operation, class _Tp> -inline llbinder1st<_Operation> +inline auto llbind1st(const _Operation& __oper, const _Tp& __x) { - typedef typename _Operation::first_argument_type _Arg1_type; - return llbinder1st<_Operation>(__oper, _Arg1_type(__x)); + return llbinder1st<_Operation, _Tp>(__oper, __x); } -template <class _Operation> +template <class _Operation, typename _Arg2> class llbinder2nd { protected: _Operation op; - typename _Operation::second_argument_type value; + _Arg2 value; public: llbinder2nd(const _Operation& __x, - const typename _Operation::second_argument_type& __y) + const _Arg2& __y) : op(__x), value(__y) {} - typename _Operation::result_type - operator()(const typename _Operation::first_argument_type& __x) const { + template <typename _Arg1> + auto + operator()(const _Arg1& __x) const { return op(__x, value); } }; template <class _Operation, class _Tp> -inline llbinder2nd<_Operation> +inline auto llbind2nd(const _Operation& __oper, const _Tp& __x) { - typedef typename _Operation::second_argument_type _Arg2_type; - return llbinder2nd<_Operation>(__oper, _Arg2_type(__x)); + return llbinder2nd<_Operation, _Tp>(__oper, __x); } /** diff --git a/indra/llcommon/lltracerecording.cpp b/indra/llcommon/lltracerecording.cpp index 0cf3a0e0b92ab3b45249ba9701e8f353122f0c06..79b5ec3efdc4496da11fea3a37a7a9b7558abb3b 100644 --- a/indra/llcommon/lltracerecording.cpp +++ b/indra/llcommon/lltracerecording.cpp @@ -27,12 +27,16 @@ #include "lltracerecording.h" -#include "llmath.h" #include "lltrace.h" #include "llfasttimer.h" #include "lltracethreadrecorder.h" #include "llthread.h" +inline F64 al_lerp(F64 a, F64 b, F64 u) +{ + return a + ((b - a) * u); +} + namespace LLTrace { @@ -267,7 +271,7 @@ F64Kilobytes Recording::getMean(const StatType<MemAccumulator>& stat) { t = active_accumulator->mSize.getSampleCount() / div; } - return F64Bytes(ll_lerp(accumulator.mSize.getMean(), active_accumulator->mSize.getMean(), t)); + return F64Bytes(al_lerp(accumulator.mSize.getMean(), active_accumulator->mSize.getMean(), t)); } else { @@ -442,7 +446,7 @@ F64 Recording::getMean( const StatType<SampleAccumulator>& stat ) { t = active_accumulator->getSampleCount() / div; } - return ll_lerp(accumulator.getMean(), active_accumulator->getMean(), t); + return al_lerp(accumulator.getMean(), active_accumulator->getMean(), t); } else { @@ -528,7 +532,7 @@ F64 Recording::getMean( const StatType<EventAccumulator>& stat ) { t = active_accumulator->getSampleCount() / div; } - return ll_lerp(accumulator.getMean(), active_accumulator->getMean(), t); + return al_lerp(accumulator.getMean(), active_accumulator->getMean(), t); } else { diff --git a/indra/llcommon/stringize.h b/indra/llcommon/stringize.h index 12df6939108e47b3f0e05c8ccfa40ffae7f8f5c4..c0b13135f9e5d1668407b49b193b4d250aab3419 100644 --- a/indra/llcommon/stringize.h +++ b/indra/llcommon/stringize.h @@ -30,7 +30,7 @@ #define LL_STRINGIZE_H #include <sstream> -#include <llstring.h> +#include "llstring.h" #include <boost/call_traits.hpp> /** diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp index d42c46a2c57bf15d08983851851e17d4cc899ba8..7ee36a9ea6ace696a16c22c078cb6574c1174b60 100644 --- a/indra/llcommon/tests/llleap_test.cpp +++ b/indra/llcommon/tests/llleap_test.cpp @@ -15,6 +15,7 @@ #include "llleap.h" // STL headers // std headers +#include <functional> // external library headers #include <boost/assign/list_of.hpp> #include <boost/phoenix/core/argument.hpp> @@ -28,7 +29,6 @@ #include "llstring.h" #include "stringize.h" #include "StringVec.h" -#include <functional> using boost::assign::list_of; @@ -109,11 +109,6 @@ namespace tut "import os\n" "import sys\n" "\n" - // Don't forget that this Python script is written to some - // temp directory somewhere! Its __file__ is useless in - // finding indra/lib/python. Use our __FILE__, with - // raw-string syntax to deal with Windows pathnames. - "mydir = os.path.dirname(r'" << __FILE__ << "')\n" "from llbase import llsd\n" "\n" "class ProtocolError(Exception):\n" @@ -240,9 +235,9 @@ namespace tut "import sys\n" "sys.stderr.write('''Hello from Python!\n" "note partial line''')\n"); + StringVec vcommand{ PYTHON, script.getName() }; CaptureLog log(LLError::LEVEL_INFO); - waitfor(LLLeap::create(get_test_name(), - sv(list_of(PYTHON)(script.getName())))); + waitfor(LLLeap::create(get_test_name(), vcommand)); log.messageWith("Hello from Python!"); log.messageWith("note partial line"); } diff --git a/indra/llcorehttp/CMakeLists.txt b/indra/llcorehttp/CMakeLists.txt index 287b0095198ea783ffc0fbaf168ffd0d7c7e7cb8..46058ea143289d801e4d78a755d200af8a69facd 100644 --- a/indra/llcorehttp/CMakeLists.txt +++ b/indra/llcorehttp/CMakeLists.txt @@ -9,18 +9,9 @@ include(NGHTTP2) include(ZLIBNG) include(LLCoreHttp) include(LLAddBuildTest) -include(LLMessage) include(LLCommon) include(Tut) -include_directories (${CMAKE_CURRENT_SOURCE_DIR}) - -include_directories( - ${LLMESSAGE_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLCOREHTTP_INCLUDE_DIRS} - ) - set(llcorehttp_SOURCE_FILES bufferarray.cpp bufferstream.cpp @@ -78,8 +69,6 @@ set(llcorehttp_HEADER_FILES _thread.h ) -set_source_files_properties(${llcorehttp_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) if (DARWIN OR LINUX) # Boost headers define unused members in condition_variable so... set_source_files_properties(${llcorehttp_SOURCE_FILES} @@ -90,17 +79,18 @@ list(APPEND llcorehttp_SOURCE_FILES ${llcorehttp_HEADER_FILES}) add_library (llcorehttp ${llcorehttp_SOURCE_FILES}) target_link_libraries( - llcorehttp - PUBLIC - llcommon - ${CURL_LIBRARIES} - ${NGHTTP2_LIBRARIES} - ${OPENSSL_LIBRARIES} - ${CRYPTO_LIBRARIES} - ${NGHTTP2_LIBRARIES} - ${BOOST_THREAD_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} + llcorehttp + PUBLIC + llcommon + ll::libcurl + ll::openssl + ll::nghttp2 ) +target_include_directories( llcorehttp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) +# llmessage depends on llcorehttp, yet llcorehttp also depends on llmessage (at least for includes). +# Cannot/Should not use target_link_libraries here to add llmessage to the dependencies, as that would +# lead to circular dependencies (or in case of cmake, the first project declaring it's dependencies wins) +target_include_directories( llcorehttp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../llmessage) if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") target_precompile_headers(llcorehttp @@ -118,7 +108,6 @@ if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") ) endif() - # tests set(LLCOREHTTP_TESTS ON CACHE BOOL "Build and run llcorehttp integration tests specifically") @@ -137,26 +126,15 @@ if (LL_TESTS AND LLCOREHTTP_TESTS) tests/test_bufferstream.hpp ) - set_source_files_properties(${llcorehttp_TEST_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llcorehttp_TEST_SOURCE_FILES ${llcorehttp_TEST_HEADER_FILES}) # LL_ADD_PROJECT_UNIT_TESTS(llcorehttp "${llcorehttp_TEST_SOURCE_FILES}") # set(TEST_DEBUG on) set(test_libs - ${LLCOREHTTP_LIBRARIES} - ${WINDOWS_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${CURL_LIBRARIES} - ${NGHTTP2_LIBRARIES} - ${OPENSSL_LIBRARIES} - ${CRYPTO_LIBRARIES} - ${NGHTTP2_LIBRARIES} - ${BOOST_THREAD_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} + llcorehttp + llmessage + llcommon ) # If http_proxy is in the current environment (e.g. to fetch s3-proxy @@ -216,16 +194,9 @@ endif (DARWIN) ) set(example_libs - ${LLCOREHTTP_LIBRARIES} - ${WINDOWS_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${CURL_LIBRARIES} - ${OPENSSL_LIBRARIES} - ${CRYPTO_LIBRARIES} - ${NGHTTP2_LIBRARIES} - ${BOOST_THREAD_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} + llcorehttp + llmessage + llcommon ) add_executable(http_texture_load diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp index a49a823b20d80dd5f09a77bfed0559cc4f71a74e..54c890cd4ad71f3c50a132c90ab46099dc0575b0 100644 --- a/indra/llcorehttp/_httpoprequest.cpp +++ b/indra/llcorehttp/_httpoprequest.cpp @@ -46,7 +46,6 @@ #include "llhttpconstants.h" #include "llproxy.h" -#include "llmessagelog.h" #include "httpstats.h" // *DEBUG: "[curl:bugs] #1420" problem and testing. @@ -125,6 +124,7 @@ static const char * const LOG_CORE("CoreHttp"); namespace LLCore { +std::function<void(LLCore::HttpResponse* response)> HttpOpRequest::sMessageLogFunc = nullptr; HttpOpRequest::HttpOpRequest() : HttpOperation(), @@ -284,7 +284,7 @@ void HttpOpRequest::visitNotifier(HttpRequest * request) response->setTransferStats(stats); mUserHandler->onCompleted(this->getHandle(), response); - if (LLMessageLog::haveLogger()) LLMessageLog::log(response); + if (sMessageLogFunc != nullptr) sMessageLogFunc(response); response->release(); } } diff --git a/indra/llcorehttp/_httpoprequest.h b/indra/llcorehttp/_httpoprequest.h index b9064644ad45bec7caed766226885c2351efef82..460723da0a610b614a4376f1c4c82faf6b3128df 100644 --- a/indra/llcorehttp/_httpoprequest.h +++ b/indra/llcorehttp/_httpoprequest.h @@ -227,6 +227,9 @@ class HttpOpRequest final : public HttpOperation HttpTime mPolicyMinRetryBackoff; // initial delay between retries (mcs) HttpTime mPolicyMaxRetryBackoff; U64 mRequestId; + + static void setMessageLogFunc(std::function<void(LLCore::HttpResponse* response)> func) { sMessageLogFunc = func;} + static std::function<void(LLCore::HttpResponse* response)> sMessageLogFunc; }; // end class HttpOpRequest diff --git a/indra/llcorehttp/_httprequestqueue.cpp b/indra/llcorehttp/_httprequestqueue.cpp index 86670befae6a313e59c2df332f26e0f8be28a95d..71e49ff0e7a9b7c2afcf082da4f71a5c497cc01b 100644 --- a/indra/llcorehttp/_httprequestqueue.cpp +++ b/indra/llcorehttp/_httprequestqueue.cpp @@ -28,7 +28,6 @@ #include "_httpoperation.h" #include "_mutex.h" -#include "llmessagelog.h" using namespace LLCoreInt; @@ -37,6 +36,7 @@ namespace LLCore { HttpRequestQueue * HttpRequestQueue::sInstance(NULL); +std::function<void(const HttpRequestQueue::opPtr_t &)> HttpRequestQueue::sMessageLogFunc = nullptr; HttpRequestQueue::HttpRequestQueue() @@ -80,7 +80,7 @@ HttpStatus HttpRequestQueue::addOp(const HttpRequestQueue::opPtr_t &op, bool log // Return op and error to caller return HttpStatus(HttpStatus::LLCORE, HE_SHUTTING_DOWN); } - if (loggable && LLMessageLog::haveLogger()) { LLMessageLog::log(op); } + if (loggable && sMessageLogFunc != nullptr ) { sMessageLogFunc(op); } wake = mQueue.empty(); mQueue.push_back(op); } diff --git a/indra/llcorehttp/_httprequestqueue.h b/indra/llcorehttp/_httprequestqueue.h index 99baba9e30f8ba99cb3e58839bb6c1a913606abb..e8e506e4c1725323ada6e5add6480576e06e13fd 100644 --- a/indra/llcorehttp/_httprequestqueue.h +++ b/indra/llcorehttp/_httprequestqueue.h @@ -126,8 +126,11 @@ class HttpRequestQueue final : public LLCoreInt::RefCounted /// Threading: callable by any thread. bool stopQueue(); + static void setMessageLogFunc(std::function<void(const HttpRequestQueue::opPtr_t &)> func) { sMessageLogFunc = func;} + protected: static HttpRequestQueue * sInstance; + static std::function<void(const HttpRequestQueue::opPtr_t &)> sMessageLogFunc; protected: OpContainer mQueue; diff --git a/indra/llfilesystem/CMakeLists.txt b/indra/llfilesystem/CMakeLists.txt index 2b67f8cee1444312a16cfc23bf4126a85eec0d9a..9f24f75eabc2116e50e2674983543ceb1e44aeb1 100644 --- a/indra/llfilesystem/CMakeLists.txt +++ b/indra/llfilesystem/CMakeLists.txt @@ -4,12 +4,6 @@ project(llfilesystem) include(00-Common) include(LLCommon) -include(UnixInstall) - -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ) set(llfilesystem_SOURCE_FILES lldir.cpp @@ -34,9 +28,6 @@ if (DARWIN) LIST(APPEND llfilesystem_SOURCE_FILES lldir_utils_objc.h) LIST(APPEND llfilesystem_SOURCE_FILES lldir_mac.cpp) LIST(APPEND llfilesystem_HEADER_FILES lldir_mac.h) - - set_source_files_properties(lldir_utils_objc.mm - PROPERTIES SKIP_PRECOMPILE_HEADERS TRUE) endif (DARWIN) if (LINUX) @@ -56,40 +47,14 @@ if (WINDOWS) LIST(APPEND llfilesystem_HEADER_FILES lldir_win32.h) endif (WINDOWS) -set_source_files_properties(${llfilesystem_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llfilesystem_SOURCE_FILES ${llfilesystem_HEADER_FILES}) add_library (llfilesystem ${llfilesystem_SOURCE_FILES}) -set(cache_BOOST_LIBRARIES - ${BOOST_FILESYSTEM_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - ) - target_link_libraries(llfilesystem - PUBLIC - ${LLCOMMON_LIBRARIES} - ${cache_BOOST_LIBRARIES} + llcommon ) - -if (WINDOWS) - target_link_libraries(llfilesystem PUBLIC Shlwapi) -endif (WINDOWS) - -if (DARWIN) - include(CMakeFindFrameworks) - find_library(COCOA_LIBRARY Cocoa) - target_link_libraries(llfilesystem PUBLIC ${COCOA_LIBRARY}) -endif (DARWIN) - -if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") - target_precompile_headers(llfilesystem - PRIVATE - [["linden_common.h"]] - ) -endif() +target_include_directories( llfilesystem INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) # Add tests if (LL_TESTS) @@ -99,14 +64,10 @@ if (LL_TESTS) lldiriterator.cpp ) - set_source_files_properties(lldiriterator.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${cache_BOOST_LIBRARIES}" - ) LL_ADD_PROJECT_UNIT_TESTS(llfilesystem "${llfilesystem_TEST_SOURCE_FILES}") # INTEGRATION TESTS - set(test_libs llmath llcommon llfilesystem ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES}) + set(test_libs llmath llcommon llfilesystem ) # TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests. LL_ADD_INTEGRATION_TEST(lldir "" "${test_libs}") diff --git a/indra/llfilesystem/lldiskcache.cpp b/indra/llfilesystem/lldiskcache.cpp index 6b30647517284abbbdb04d67aa3872f86711fb1d..4b9cc259e71e6f3ac08cc01e3703abff231ec62f 100644 --- a/indra/llfilesystem/lldiskcache.cpp +++ b/indra/llfilesystem/lldiskcache.cpp @@ -431,20 +431,22 @@ void LLDiskCache::removeOldVFSFiles() #endif if (boost::filesystem::is_directory(cache_path, ec) && !ec.failed()) { - for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(cache_path, ec), {})) + boost::filesystem::directory_iterator iter(cache_path, ec); + while (iter != boost::filesystem::directory_iterator() && !ec.failed()) { - if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed()) + if (boost::filesystem::is_regular_file(*iter, ec) && !ec.failed()) { - if ((entry.path().string().find(CACHE_FORMAT) != std::string::npos) || - (entry.path().string().find(DB_FORMAT) != std::string::npos)) + if (((*iter).path().string().find(CACHE_FORMAT) != std::string::npos) || + ((*iter).path().string().find(DB_FORMAT) != std::string::npos)) { - boost::filesystem::remove(entry, ec); + boost::filesystem::remove(*iter, ec); if (ec.failed()) { - LL_WARNS() << "Failed to delete cache file " << entry << ": " << ec.message() << LL_ENDL; + LL_WARNS() << "Failed to delete cache file " << *iter << ": " << ec.message() << LL_ENDL; } } } + iter.increment(ec); } } } diff --git a/indra/llimage/CMakeLists.txt b/indra/llimage/CMakeLists.txt index 5b1db56b41272c313ae9c45ba7b402554d7e843e..5ad95cc6d20e9ed42aa46c52929ef4117912421e 100644 --- a/indra/llimage/CMakeLists.txt +++ b/indra/llimage/CMakeLists.txt @@ -5,25 +5,13 @@ project(llimage) include(00-Common) include(LLCommon) include(LLImage) -include(LLMath) -include(LLFileSystem) +include(JPEG) include(LLKDU) -include(LLImageJ2COJ) include(WebP) include(ZLIBNG) include(LLAddBuildTest) include(Tut) -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLFILESYSTEM_INCLUDE_DIRS} - ${WEBP_INCLUDE_DIRS} - ${PNG_INCLUDE_DIRS} - ${ZLIBNG_INCLUDE_DIRS} - ) - set(llimage_SOURCE_FILES llimagebmp.cpp llimage.cpp @@ -57,46 +45,30 @@ set(llimage_HEADER_FILES llpngwrapper.h ) -set_source_files_properties(${llimage_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llimage_SOURCE_FILES ${llimage_HEADER_FILES}) add_library (llimage ${llimage_SOURCE_FILES}) +target_include_directories( llimage INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) # Libraries on which this library depends, needed for Linux builds # Sort by high-level to low-level if (USE_KDU) - target_link_libraries(llimage ${LLKDU_LIBRARIES}) + target_link_libraries(llimage PUBLIC llkdu) else (USE_KDU) - target_link_libraries(llimage ${LLIMAGEJ2COJ_LIBRARIES}) + target_link_libraries(llimage PUBLIC llimagej2coj) endif (USE_KDU) target_link_libraries(llimage - ${LLFILESYSTEM_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${WEBP_LIBRARIES} - ${JPEG_LIBRARIES} - ${PNG_LIBRARIES} - ${ZLIBNG_LIBRARIES} - ) - -if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") - target_precompile_headers(llimage - PRIVATE - [["linden_common.h"]] + PUBLIC + llfilesystem + llmath + llcommon + ll::libwebp + ll::libpng + ll::libjpeg ) -endif() # Add tests if (LL_TESTS) - -set_source_files_properties( - llimageworker.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${LLPRIMITIVE_LIBRARIES}" - ) - SET(llimage_TEST_SOURCE_FILES llimageworker.cpp ) diff --git a/indra/llimagej2coj/CMakeLists.txt b/indra/llimagej2coj/CMakeLists.txt index cb6303d7e85943a5703fd7ad38ed09f803e34061..93e85668dd61c0109ff62670c17ae929b27fc582 100644 --- a/indra/llimagej2coj/CMakeLists.txt +++ b/indra/llimagej2coj/CMakeLists.txt @@ -7,12 +7,6 @@ include(LLCommon) include(LLImage) include(OpenJPEG) -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${OPENJPEG_INCLUDE_DIR} - ) - set(llimagej2coj_SOURCE_FILES llimagej2coj.cpp ) @@ -23,16 +17,13 @@ set(llimagej2coj_HEADER_FILES llimagej2coj.h ) -set_source_files_properties(${llimagej2coj_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llimagej2coj_SOURCE_FILES ${llimagej2coj_HEADER_FILES}) add_library (llimagej2coj ${llimagej2coj_SOURCE_FILES}) -target_link_libraries( - llimagej2coj - llcommon - ${OPENJPEG_LIBRARIES} +target_link_libraries( llimagej2coj + llcommon + llimage + ll::openjpeg ) diff --git a/indra/llinventory/CMakeLists.txt b/indra/llinventory/CMakeLists.txt index a37b3ca65f39811ff1b507d1b5e8e41ed61af9b3..bed02d2f4e7943690127e6f32e9bbbc9844540d7 100644 --- a/indra/llinventory/CMakeLists.txt +++ b/indra/llinventory/CMakeLists.txt @@ -5,17 +5,6 @@ project(llinventory) include(00-Common) include(LLCommon) include(LLCoreHttp) -include(LLMath) -include(LLMessage) -include(LLFileSystem) -include(LLXML) - -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLMESSAGE_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ) set(llinventory_SOURCE_FILES llcategory.cpp @@ -65,24 +54,12 @@ set(llinventory_HEADER_FILES lluserrelations.h ) -set_source_files_properties(${llinventory_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llinventory_SOURCE_FILES ${llinventory_HEADER_FILES}) add_library (llinventory ${llinventory_SOURCE_FILES}) -target_link_libraries( - llinventory - llcommon - ) - -if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") - target_precompile_headers(llinventory - PRIVATE - [["linden_common.h"]] - ) -endif() +target_link_libraries( llinventory llcommon llmath llmessage llxml ) +target_include_directories( llinventory INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) #add unit tests if (LL_TESTS) @@ -93,7 +70,7 @@ if (LL_TESTS) LL_ADD_PROJECT_UNIT_TESTS(llinventory "${llinventory_TEST_SOURCE_FILES}") #set(TEST_DEBUG on) - set(test_libs llinventory ${LLMESSAGE_LIBRARIES} ${LLFILESYSTEM_LIBRARIES} ${LLCOREHTTP_LIBRARIES} ${LLMATH_LIBRARIES} ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES}) + set(test_libs llinventory llmath llcorehttp llfilesystem ) LL_ADD_INTEGRATION_TEST(inventorymisc "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llparcel "" "${test_libs}") endif (LL_TESTS) diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp index 87b9df88857131b69a0010937ba9ef0f6f96263f..f3eda2f83a77b5dbd3eb7575913cc3c997f8339c 100644 --- a/indra/llinventory/llparcel.cpp +++ b/indra/llinventory/llparcel.cpp @@ -1265,5 +1265,5 @@ U32 LLParcel::countExperienceKeyType( U32 type ) return std::count_if( boost::begin(mExperienceKeys | boost::adaptors::map_values), boost::end(mExperienceKeys | boost::adaptors::map_values), - [type](U32 v) { return v == type; }); + [type](U32 key){ return (key == type); }); } diff --git a/indra/llkdu/CMakeLists.txt b/indra/llkdu/CMakeLists.txt index 64c5173dfdba8255b80f7851585168cf08b2174d..ea9bdc220f3d86a9a86e79bcf7fda31fa84984a8 100644 --- a/indra/llkdu/CMakeLists.txt +++ b/indra/llkdu/CMakeLists.txt @@ -2,26 +2,10 @@ project(llkdu) -# Visual Studio 2005 has a dumb bug that causes it to fail compilation -# of KDU if building with both optimisation and /WS (treat warnings as -# errors), even when the specific warnings that make it croak are -# disabled. - -#set(VS_DISABLE_FATAL_WARNINGS ON) - include(00-Common) include(LLCommon) include(LLImage) include(LLKDU) -include(LLMath) - -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${KDU_INCLUDE_DIR} - ${LLKDU_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ) set(llkdu_SOURCE_FILES llimagej2ckdu.cpp @@ -30,35 +14,23 @@ set(llkdu_SOURCE_FILES set(llkdu_HEADER_FILES CMakeLists.txt - llimagej2ckdu.h llkdumem.h ) -set_source_files_properties(${llkdu_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llkdu_SOURCE_FILES ${llkdu_HEADER_FILES}) -# Our KDU package is built with KDU_X86_INTRINSICS in its .vcxproj file. -# Unless that macro is also set for every consumer build, KDU freaks out, -# spamming the viewer log with alignment FUD. -set_source_files_properties(${llkdu_SOURCE_FILES} - PROPERTIES - COMPILE_DEFINITIONS - "KDU_X86_INTRINSICS") - if (USE_KDU) add_library (llkdu ${llkdu_SOURCE_FILES}) - target_link_libraries(llkdu - ${KDU_LIBRARY} - llcommon) - - target_compile_definitions(llkdu PRIVATE -DKDU_X86_INTRINSICS -DKDU_NO_THREADS -DKDU_NO_AVX -DKDU_NO_AVX2) + target_link_libraries(llkdu PUBLIC ll::kdu llimage llcommon) + target_include_directories( llkdu INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) # Add tests - if (LL_TESTS) + # ND: llkdu tests are very strange as they include stubs for KDU classes/methods + # if not having access to the right KDU version this test will fail to compile, incidentally I do not + # have access to a matching version of KDU and thus cannot get this tests to compile + if (LL_TESTS_KDU) include(LLAddBuildTest) include(Tut) SET(llkdu_TEST_SOURCE_FILES @@ -69,11 +41,12 @@ if (USE_KDU) llkdumem.h lltut.h ) - SET(llkdu_test_additional_INCLUDE_DIRS - ${KDU_INCLUDE_DIR} - ${LLKDU_INCLUDE_DIRS} - ) + + get_property( llimage_include_dir TARGET llimage PROPERTY INTERFACE_INCLUDE_DIRECTORIES ) + set_property( SOURCE ${llkdu_TEST_SOURCE_FILES} PROPERTY LL_TEST_ADDITIONAL_LIBRARIES ll::kdu llcommon) + set_property( SOURCE ${llkdu_TEST_SOURCE_FILES} PROPERTY LL_TEST_ADDITIONAL_INCLUDE_DIRS ${llimage_include_dir}) + LL_ADD_PROJECT_UNIT_TESTS(llkdu "${llkdu_TEST_SOURCE_FILES}") - endif (LL_TESTS) + endif (LL_TESTS_KDU) endif (USE_KDU) diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt index 444af803e5cca2cf50c1115c0353fe0b5cd122e0..cd22c6059c2259b64ee2831f2787782af23f3ea5 100644 --- a/indra/llmath/CMakeLists.txt +++ b/indra/llmath/CMakeLists.txt @@ -4,17 +4,9 @@ project(llmath) include(00-Common) include(LLCommon) -include(LLMeshOptimizer) include(LLMath) include(Boost) -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLMESHOPTIMIZER_INCLUDE_DIRS} - ) - set(llmath_SOURCE_FILES llbbox.cpp llbboxlocal.cpp @@ -105,27 +97,12 @@ set(llmath_HEADER_FILES xform.h ) -set_source_files_properties(${llmath_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llmath_SOURCE_FILES ${llmath_HEADER_FILES}) add_library (llmath ${llmath_SOURCE_FILES}) -target_link_libraries(llmath - PRIVATE - meshoptimizer - PUBLIC - ${LLCOMMON_LIBRARIES} - ${LLMESHOPTIMIZER_LIBRARIES} - ) - -if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") - target_precompile_headers(llmath - PRIVATE - [["linden_common.h"]] - ) -endif() +target_link_libraries(llmath PUBLIC llcommon llmeshoptimizer) +target_include_directories( llmath INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) # Add tests if (LL_TESTS) @@ -140,15 +117,11 @@ if (LL_TESTS) v4color.cpp v4coloru.cpp ) - set_source_files_properties( - ${llmath_TEST_SOURCE_FILES} - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_STACKTRACE_LIBRARY};${BOOST_THREAD_LIBRARY}" - ) + LL_ADD_PROJECT_UNIT_TESTS(llmath "${llmath_TEST_SOURCE_FILES}") # INTEGRATION TESTS - set(test_libs llmath llcommon ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES}) + set(test_libs llmath llcommon) # TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests. LL_ADD_INTEGRATION_TEST(alignment "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llbbox llbbox.cpp "${test_libs}") diff --git a/indra/llmeshoptimizer/CMakeLists.txt b/indra/llmeshoptimizer/CMakeLists.txt index 652fe6ed6f3d39dd3f3256300244ea3c254fbf64..bdb54caab38fa65094703217e88e3e859fe2b807 100644 --- a/indra/llmeshoptimizer/CMakeLists.txt +++ b/indra/llmeshoptimizer/CMakeLists.txt @@ -2,42 +2,32 @@ project(llmeshoptimizer) -include(MESHOPTIMIZER) - include(00-Common) include(LLCommon) include(LLMath) -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLMESHOPTIMIZER_INCLUDE_DIR} - ${LIBS_PREBUILT_DIR}/include #access to boost headers, needed for LLError - ) - set(llmeshoptimizer_SOURCE_FILES - llmeshoptimizer.cpp - ) + llmeshoptimizer.cpp + ) set(llmeshoptimizer_HEADER_FILES - CMakeLists.txt - - llmeshoptimizer.h - ) + CMakeLists.txt + llmeshoptimizer.h + ) set_source_files_properties(${llmeshoptimizer_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) + PROPERTIES HEADER_FILE_ONLY TRUE) list(APPEND llmeshoptimizer_SOURCE_FILES ${llmeshoptimizer_HEADER_FILES}) -#if (USE_MESHOPT) - add_library (llmeshoptimizer ${llmeshoptimizer_SOURCE_FILES}) +add_library (llmeshoptimizer ${llmeshoptimizer_SOURCE_FILES}) +target_include_directories( llmeshoptimizer INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) + +target_link_libraries(llmeshoptimizer + PUBLIC + llcommon + llmath + meshoptimizer) - target_link_libraries(llmeshoptimizer - ${LLCOMMON_LIBRARIES} - ${LLMATH_LIBRARIES} - meshoptimizer) - - # Add tests +# Add tests -#endif (USE_MESHOPT) diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt index dac96a655d12af815e427052b8cf4c1cd9fc262b..b24fa5fbfe02c14be4b877d8e4283bb969668ed3 100644 --- a/indra/llmessage/CMakeLists.txt +++ b/indra/llmessage/CMakeLists.txt @@ -9,22 +9,9 @@ include(NGHTTP2) include(LLAddBuildTest) include(LLCommon) include(LLCoreHttp) -include(LLMath) -include(LLMessage) -include(LLFileSystem) include(LLAddBuildTest) include(Tut) -include_directories (${CMAKE_CURRENT_SOURCE_DIR}) - -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLCOREHTTP_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLMESSAGE_INCLUDE_DIRS} - ${LLFILESYSTEM_INCLUDE_DIRS} - ) - set(llmessage_SOURCE_FILES llaescipher.cpp llassetstorage.cpp @@ -195,54 +182,20 @@ set(llmessage_HEADER_FILES sound_ids.h ) -set_source_files_properties(${llmessage_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llmessage_SOURCE_FILES ${llmessage_HEADER_FILES}) add_library (llmessage ${llmessage_SOURCE_FILES}) -if (LINUX) -target_link_libraries( - llmessage - ${CURL_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLMATH_LIBRARIES} - ${OPENSSL_LIBRARIES} - ${CRYPTO_LIBRARIES} - ${NGHTTP2_LIBRARIES} - ${XMLRPCEPI_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - rt - ) -else (LINUX) target_link_libraries( - llmessage - ${CURL_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLMATH_LIBRARIES} - ${OPENSSL_LIBRARIES} - ${CRYPTO_LIBRARIES} - ${NGHTTP2_LIBRARIES} - ${XMLRPCEPI_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - ) -endif(LINUX) - -if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") - target_precompile_headers(llmessage - PRIVATE - [["linden_common.h"]] - ) -endif() + llmessage + PUBLIC + llcommon + llfilesystem + llmath + llcorehttp + ll::xmlrpc-epi +) +target_include_directories( llmessage INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) # tests if (LL_TESTS) @@ -252,39 +205,18 @@ if (LL_TESTS) lltrustedmessageservice.cpp lltemplatemessagedispatcher.cpp ) + set_property( SOURCE ${llmessage_TEST_SOURCE_FILES} PROPERTY LL_TEST_ADDITIONAL_LIBRARIES llmath llcorehttp) LL_ADD_PROJECT_UNIT_TESTS(llmessage "${llmessage_TEST_SOURCE_FILES}") - # set(TEST_DEBUG on) - -if (LINUX) - set(test_libs - ${WINDOWS_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLMATH_LIBRARIES} - ${CURL_LIBRARIES} - ${NGHTTP2_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - rt - ) -else (LINUX) + set(test_libs - ${WINDOWS_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLMATH_LIBRARIES} - ${CURL_LIBRARIES} - ${NGHTTP2_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ) -endif(LINUX) + llfilesystem + llmath + llcorehttp + llmessage + llcommon + ) #LL_ADD_INTEGRATION_TEST(llavatarnamecache "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llhost "" "${test_libs}") diff --git a/indra/llmessage/llfiltersd2xmlrpc.cpp b/indra/llmessage/llfiltersd2xmlrpc.cpp index 075338fd5622e7091686104a731f1e8cbe7eae91..990ccb7ec22491ff8d2731829f770b78fb67347c 100644 --- a/indra/llmessage/llfiltersd2xmlrpc.cpp +++ b/indra/llmessage/llfiltersd2xmlrpc.cpp @@ -78,7 +78,13 @@ #include <sstream> #include <iterator> + +#ifdef LL_USESYSTEMLIBS +#include <xmlrpc.h> +#else #include <xmlrpc-epi/xmlrpc.h> +#endif + #include "apr_base64.h" #include "llbuffer.h" diff --git a/indra/llmessage/llioutil.h b/indra/llmessage/llioutil.h index beab086f552d5ad99d8eb8d9ad258037808a340d..949f7c921fa139a5b730564aeefee38aebdc0533 100644 --- a/indra/llmessage/llioutil.h +++ b/indra/llmessage/llioutil.h @@ -147,7 +147,7 @@ class LLIOAddChain : public LLIOPipe * } * </code> */ -class LLChangeChannel //: public unary_function<T, void> +class LLChangeChannel { public: /** diff --git a/indra/llmessage/llmessagelog.cpp b/indra/llmessage/llmessagelog.cpp index 196232c78a6430695d07f557a3fde680308d0a8a..0e155215b83a0104eedf98cf520955c3cec95cbd 100644 --- a/indra/llmessage/llmessagelog.cpp +++ b/indra/llmessage/llmessagelog.cpp @@ -25,6 +25,7 @@ #include <boost/circular_buffer.hpp> #include <utility> #include "_httpoprequest.h" +#include "_httprequestqueue.h" static boost::circular_buffer<LogPayload> sRingBuffer = boost::circular_buffer<LogPayload>(2048); @@ -102,7 +103,15 @@ void LLMessageLog::setCallback(LogCallback callback) { callback(m); } + LLCore::HttpRequestQueue::setMessageLogFunc([](const LLCore::HttpRequestQueue::opPtr_t& op) { LLMessageLog::log(op); }); + LLCore::HttpOpRequest::setMessageLogFunc([](LLCore::HttpResponse* response) { LLMessageLog::log(response); }); } + else + { + LLCore::HttpOpRequest::setMessageLogFunc(nullptr); + LLCore::HttpRequestQueue::setMessageLogFunc(nullptr); + } + sCallback = callback; } diff --git a/indra/llmessage/llmessagethrottle.cpp b/indra/llmessage/llmessagethrottle.cpp index 8ceeb39f8ddcb95b57ec19330859945f4f71d6f1..a6fc5f4f038ffbadf1d1b1e175ac455cb1a1d6a3 100644 --- a/indra/llmessage/llmessagethrottle.cpp +++ b/indra/llmessage/llmessagethrottle.cpp @@ -32,6 +32,8 @@ #include "llframetimer.h" // This is used for the stl search_n function. +bool eq_message_throttle_entry(LLMessageThrottleEntry a, LLMessageThrottleEntry b) + { return a.getHash() == b.getHash(); } const U64 SEC_TO_USEC = 1000000; @@ -98,9 +100,8 @@ BOOL LLMessageThrottle::addViewerAlert(const LLUUID& to, const std::string& mesg LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime()); // Check if this message is already in the list. - message_list_iterator_t found = std::find_if(message_list->begin(), message_list->end(), - [&entry](const message_list_t::value_type& e) { return e.getHash() == entry.getHash(); }); - + message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(), + 1, entry, eq_message_throttle_entry); if (found == message_list->end()) { // This message was not found. Add it to the list. @@ -127,9 +128,8 @@ BOOL LLMessageThrottle::addAgentAlert(const LLUUID& agent, const LLUUID& task, c LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime()); // Check if this message is already in the list. - message_list_iterator_t found = std::find_if(message_list->begin(), message_list->end(), - [&entry](const message_list_t::value_type& e) { return e.getHash() == entry.getHash(); }); - + message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(), + 1, entry, eq_message_throttle_entry); if (found == message_list->end()) { // This message was not found. Add it to the list. diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h index c13f39df9bda93e0cc263e72e1e3cc24252840d5..8548ed51e74b6cd455c189dc6a9bb8371bd94a62 100644 --- a/indra/llmessage/llregionflags.h +++ b/indra/llmessage/llregionflags.h @@ -89,6 +89,8 @@ const U64 REGION_FLAGS_ALLOW_VOICE = (1 << 28); const U64 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29); const U64 REGION_FLAGS_DENY_AGEUNVERIFIED = (1 << 30); +const U64 REGION_FLAGS_DENY_BOTS = (1 << 31); + const U64 REGION_FLAGS_DEFAULT = REGION_FLAGS_ALLOW_LANDMARK | REGION_FLAGS_ALLOW_SET_HOME | REGION_FLAGS_ALLOW_PARCEL_CHANGES | diff --git a/indra/llmessage/llthrottle.cpp b/indra/llmessage/llthrottle.cpp index 935af2aa5a551b04c45b54cc6d8bc637c296d664..e659414e8c7bbbf258f0ab00aa01c0137865e44c 100644 --- a/indra/llmessage/llthrottle.cpp +++ b/indra/llmessage/llthrottle.cpp @@ -435,12 +435,6 @@ BOOL LLThrottleGroup::dynamicAdjust() { channel_over_nominal[i] = FALSE; } - - //if (total) - //{ - // LL_INFOS() << i << ": B" << channel_busy[i] << " I" << channel_idle[i] << " N" << channel_over_nominal[i]; - // LL_CONT << " Nom: " << mNominalBPS[i] << " Cur: " << mCurrentBPS[i] << " BS: " << mBitsSentHistory[i] << LL_ENDL; - //} } if (channels_busy) diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt index c62cd8e7a6e1bf9fb554d9f9e90bb3bae2cdeb57..9ffa588da3684f714e68affdd642a761cd786393 100644 --- a/indra/llplugin/CMakeLists.txt +++ b/indra/llplugin/CMakeLists.txt @@ -6,26 +6,7 @@ include(00-Common) include(CURL) include(LLCommon) include(LLImage) -include(LLMath) -include(LLMessage) -include(LLRender) -include(LLXML) include(LLWindow) -include(Boost) - -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLMESSAGE_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} - ) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLXML_SYSTEM_INCLUDE_DIRS} - ) set(llplugin_SOURCE_FILES llpluginclassmedia.cpp @@ -39,7 +20,6 @@ set(llplugin_SOURCE_FILES set(llplugin_HEADER_FILES CMakeLists.txt - llpluginclassmedia.h llpluginclassmediaowner.h llplugininstance.h @@ -51,25 +31,10 @@ set(llplugin_HEADER_FILES llpluginsharedmemory.h ) -set_source_files_properties(${llplugin_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llplugin_SOURCE_FILES ${llplugin_HEADER_FILES}) add_library (llplugin ${llplugin_SOURCE_FILES}) - -target_link_libraries(llplugin PUBLIC - ${LLCOMMON_LIBRARIES} - ) - -set_target_properties(llplugin PROPERTIES POSITION_INDEPENDENT_CODE TRUE) - -if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") - target_precompile_headers(llplugin - PRIVATE - [["linden_common.h"]] - ) -endif() - +target_include_directories( llplugin INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries( llplugin llcommon llmath llrender llmessage ) add_subdirectory(slplugin) diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index ef9a315864cd92bbc7bb835ed4cfea58a98f836f..5ac1628d03f2dd92a0da739c2162c06b1edb0728 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -159,6 +159,11 @@ LLPluginProcessParent::~LLPluginProcessParent() { // If we are quitting, the network sockets will already have been destroyed. killSockets(); } + + if (mPolling.connected()) + { + mPolling.disconnect(); + } } /*static*/ diff --git a/indra/llplugin/slplugin/CMakeLists.txt b/indra/llplugin/slplugin/CMakeLists.txt index 9a3ee79eff7f1c86b82b11c3ceb0140fc7499656..ba8eae53462ab19bfb637bd4aac2b111235dba6e 100644 --- a/indra/llplugin/slplugin/CMakeLists.txt +++ b/indra/llplugin/slplugin/CMakeLists.txt @@ -2,25 +2,8 @@ project(SLPlugin) include(00-Common) include(LLCommon) -include(LLPlugin) include(Linking) include(PluginAPI) -include(LLMessage) - -include_directories( - ${LLPLUGIN_INCLUDE_DIRS} - ${LLMESSAGE_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} -) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ) - -if (DARWIN) - include(CMakeFindFrameworks) - find_library(COCOA_LIBRARY Cocoa) -endif (DARWIN) - ### SLPlugin @@ -37,9 +20,6 @@ if (DARWIN) ) endif (DARWIN) -set_source_files_properties(${SLPlugin_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - if (SLPlugin_HEADER_FILES) list(APPEND SLPlugin_SOURCE_FILES ${SLPlugin_HEADER_FILES}) endif (SLPlugin_HEADER_FILES) @@ -51,14 +31,14 @@ add_executable(SLPlugin ) target_link_libraries(SLPlugin - ${LLPLUGIN_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${PLUGIN_API_WINDOWS_LIBRARIES} -) + PUBLIC + llplugin + llmessage + llcommon + ll::pluginlibraries + ) if (WINDOWS) - target_link_libraries(SLPlugin wer) set_target_properties(SLPlugin PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMTD\"" @@ -78,14 +58,12 @@ elseif (DARWIN) MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/slplugin_info.plist ) - # Mac version needs to link against Cocoa - target_link_libraries(SLPlugin ${COCOA_LIBRARY}) # Make sure the app bundle has a Resources directory (it will get populated by viewer-manifest.py later) add_custom_command( TARGET SLPlugin POST_BUILD COMMAND mkdir ARGS -p - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/SLPlugin.app/Contents/Resources + ${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>/SLPlugin.app/Contents/Resources ) endif () diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt index 53bb211842ec28f0a9934adde32ce2e3005326de..e3141a355b1fa4c60c50fef97c84c73948f2a9cb 100644 --- a/indra/llprimitive/CMakeLists.txt +++ b/indra/llprimitive/CMakeLists.txt @@ -4,31 +4,12 @@ project(llprimitive) include(00-Common) include(LLCommon) -include(LLMath) -include(LLMessage) include(LLCoreHttp) -include(LLXML) include(LLPhysicsExtensions) -include(LLCharacter) +include(LLPrimitive) include(LLRender) include(TinyGLTF) - -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLMESSAGE_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LIBS_PREBUILT_DIR}/include/collada - ${LIBS_PREBUILT_DIR}/include/collada/1.4 - ${LLCHARACTER_INCLUDE_DIRS} - ${TINYGLTF_INCLUDE_DIR} - ) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLXML_SYSTEM_INCLUDE_DIRS} - ${LLPHYSICSEXTENSIONS_INCLUDE_DIRS} - ) +include(GLH) set(llprimitive_SOURCE_FILES lldaeloader.cpp @@ -72,32 +53,24 @@ set(llprimitive_HEADER_FILES material_codes.h object_flags.h ) - -set_source_files_properties(${llprimitive_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) list(APPEND llprimitive_SOURCE_FILES ${llprimitive_HEADER_FILES}) add_library (llprimitive ${llprimitive_SOURCE_FILES}) +target_include_directories( llprimitive INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(llprimitive - ${LLCOMMON_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${LLXML_LIBRARIES} - ${LLPHYSICSEXTENSIONS_LIBRARIES} - ${LLCHARACTER_LIBRARIES} - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ) - -if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") - target_precompile_headers(llprimitive - PRIVATE - [["linden_common.h"]] - ) -endif() + PUBLIC + llcommon + llmath + llmessage + llcorehttp + llxml + llcharacter + llphysicsextensions_impl + ll::colladadom + ll::glh_linear + ) #add unit tests if (LL_TESTS) diff --git a/indra/llrender/CMakeLists.txt b/indra/llrender/CMakeLists.txt index 160085abbaee958d63e09da9113ad93fd46eaf1e..870efceb76635cd9f0f97d7757021a1a86811fda 100644 --- a/indra/llrender/CMakeLists.txt +++ b/indra/llrender/CMakeLists.txt @@ -8,26 +8,7 @@ include(SDL2) include(FreeType) include(LLCommon) include(LLImage) -include(LLMath) -include(LLRender) include(LLWindow) -include(LLXML) -include(LLFileSystem) - -include_directories( - ${FREETYPE_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLFILESYSTEM_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLXML_SYSTEM_INCLUDE_DIRS} - ) set(llrender_SOURCE_FILES llcubemap.cpp @@ -82,9 +63,6 @@ set(llrender_HEADER_FILES llglcommonfunc.h ) -set_source_files_properties(${llrender_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llrender_SOURCE_FILES ${llrender_HEADER_FILES}) if (BUILD_HEADLESS) @@ -97,41 +75,29 @@ if (BUILD_HEADLESS) ) target_link_libraries(llrenderheadless - ${LLCOMMON_LIBRARIES} - ${LLIMAGE_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLRENDER_HEADLESS_LIBRARIES} - ${LLXML_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLWINDOW_HEADLESS_LIBRARIES} - ${OPENGL_HEADLESS_LIBRARIES}) - + llcommon + llimage + llmath + llrender + llxml + llfilesystem + ) endif (BUILD_HEADLESS) add_library (llrender ${llrender_SOURCE_FILES}) - -set_target_properties(llrender PROPERTIES POSITION_INDEPENDENT_CODE TRUE) +target_include_directories( llrender INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) # Libraries on which this library depends, needed for Linux builds # Sort by high-level to low-level -target_link_libraries(llrender - ${LLCOMMON_LIBRARIES} - ${LLIMAGE_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLXML_LIBRARIES} - ${LLWINDOW_LIBRARIES} - ${FREETYPE_LIBRARIES} - ${OPENGL_LIBRARIES}) +target_link_libraries(llrender + PUBLIC + llcommon + llimage + llmath + llfilesystem + llxml + llwindow + ll::freetype + ll::opengl + ) -if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") - target_precompile_headers(llrender - PRIVATE - [["linden_common.h"]] - llgltypes.h - <map> - <list> - <string> - <boost/unordered/unordered_flat_map.hpp> - ) -endif() diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp index bc1a2f888709813f5b31dccb90aa57c4f5112525..9750bd4fa1e8e30173cdaa37fd47486ec7ae1c61 100644 --- a/indra/llrender/llfontregistry.cpp +++ b/indra/llrender/llfontregistry.cpp @@ -239,7 +239,7 @@ std::string currentOsName() return "Windows"; #elif LL_DARWIN return "Mac"; -#elif LL_SDL || LL_MESA_HEADLESS +#elif LL_LINUX return "Linux"; #else return ""; diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index b9bd35edb242cc3c56aa5c9a5f0a7343de26b606..3550cc8b1771c12e1d3aeff0efd8e4bbd95c19bc 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -6,33 +6,9 @@ include(00-Common) include(Hunspell) include(LLCommon) include(LLImage) -include(LLInventory) -include(LLMath) -include(LLMessage) include(LLCoreHttp) -include(LLRender) include(LLWindow) include(LLCoreHttp) -include(LLFileSystem) -include(LLXML) - -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLCOREHTTP_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLINVENTORY_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLMESSAGE_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} - ${LLFILESYSTEM_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ${LIBS_PREBUILD_DIR}/include/hunspell - ) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLXML_SYSTEM_INCLUDE_DIRS} - ) set(llui_SOURCE_FILES llaccordionctrl.cpp @@ -258,9 +234,6 @@ set(llui_HEADER_FILES llxyvector.h ) -set_source_files_properties(${llui_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - SET(llurlentry_TEST_DEPENDENCIES llurlmatch.cpp llurlregistry.cpp @@ -274,22 +247,22 @@ set_source_files_properties(llurlentry.cpp list(APPEND llui_SOURCE_FILES ${llui_HEADER_FILES}) add_library (llui ${llui_SOURCE_FILES}) +target_include_directories( llui INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) # Libraries on which this library depends, needed for Linux builds # Sort by high-level to low-level target_link_libraries(llui - ${LLRENDER_LIBRARIES} - ${LLWINDOW_LIBRARIES} - ${LLIMAGE_LIBRARIES} - ${LLINVENTORY_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLXUIXML_LIBRARIES} - ${LLXML_LIBRARIES} - ${LLMATH_LIBRARIES} - ${HUNSPELL_LIBRARY} - ${LLMESSAGE_LIBRARIES} - ${LLCOMMON_LIBRARIES} # must be after llimage, llwindow, llrender + PUBLIC + llrender + llwindow + llimage + llinventory + llmessage + llcorehttp + llfilesystem + llxml + llmath + ll::hunspell + llcommon ) if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") @@ -330,27 +303,17 @@ endif() # Add tests if(LL_TESTS) include(LLAddBuildTest) + set(test_libs llmessage llcorehttp llxml llrender llcommon ll::hunspell) + SET(llui_TEST_SOURCE_FILES llurlmatch.cpp ) + set_property( SOURCE ${llui_TEST_SOURCE_FILES} PROPERTY LL_TEST_ADDITIONAL_LIBRARIES ${test_libs}) LL_ADD_PROJECT_UNIT_TESTS(llui "${llui_TEST_SOURCE_FILES}") # INTEGRATION TESTS - set(test_libs - llui - llmessage - llcorehttp - llcommon - ${HUNSPELL_LIBRARY} - ${LLCOMMON_LIBRARIES} - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - ${WINDOWS_LIBRARIES}) + if(NOT LINUX AND NOT DARWIN) - if(WINDOWS) - LL_ADD_INTEGRATION_TEST(llurlentry llurlentry.cpp "imm32;${test_libs}") - else(WINDOWS) - LL_ADD_INTEGRATION_TEST(llurlentry llurlentry.cpp "${test_libs}") - endif(WINDOWS) + set(test_libs llui llmessage llcorehttp llxml llrender llcommon ll::hunspell ) + LL_ADD_INTEGRATION_TEST(llurlentry llurlentry.cpp "${test_libs}") endif() endif(LL_TESTS) diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h index f35c8591b1dc101eb9e1f44a6334aff100d69cf1..2a618e1ccc1c5ec8527004558ef1457cb9736734 100644 --- a/indra/llui/lldockablefloater.h +++ b/indra/llui/lldockablefloater.h @@ -30,6 +30,7 @@ #include "llerror.h" #include "llfloater.h" #include "lldockcontrol.h" +#include <memory> /** * Represents floater that can dock. diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index dfa306a27e2b50812bdbc05872d65de95bd37687..bf9333ae680f9b0bd93dc84682df360edc674052 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -773,11 +773,13 @@ void LLFloater::closeFloater(bool app_quitting) } // now close dependent floater - for(handle_set_iter_t dependent_it = mDependents.begin(); - dependent_it != mDependents.end(); ) + while(mDependents.size() > 0) { + handle_set_iter_t dependent_it = mDependents.begin(); LLFloater* floaterp = dependent_it->get(); - dependent_it = mDependents.erase(dependent_it); + // normally removeDependentFloater will do this, but in + // case floaterp is somehow invalid or orphaned, erase now + mDependents.erase(dependent_it); if (floaterp) { floaterp->mDependeeHandle = LLHandle<LLFloater>(); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 169d71f9b4886723740136b6c0b45a36159b4dc1..9f6adcff1b3f2f6b6cfbf2e177d2e9908eff07b9 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -198,6 +198,7 @@ bool LLUrlEntryBase::isWikiLinkCorrect(const std::string &labeled_url) const { return (chr == L'\u02D0') // "Modifier Letter Colon" || (chr == L'\uFF1A') // "Fullwidth Colon" + || (chr == L'\u2236') // "Ratio" || (chr == L'\uFE55'); // "Small Colon" }, L'\u003A'); // Colon diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 65d16627a4d0de04447897ee19079c3a22f20942..c91fc168b2addcc0e274f39785ab47fc930b60c3 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -175,7 +175,7 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL for (it = mUrlEntry.begin(); it != mUrlEntry.end(); ++it) { //Skip for url entry icon if content is not trusted - if(!is_content_trusted && (mUrlEntryIcon == *it)) + if((mUrlEntryIcon == *it) && ((text.find("Hand") != std::string::npos) || !is_content_trusted)) { continue; } diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index 861701f0d9b59072cc4e9f187f9aa12cd0437d68..c5d0e6fe02c8964dbbc26847284a29cc9a6f3dfe 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -14,27 +14,9 @@ include(00-Common) include(DragDrop) include(LLCommon) include(LLImage) -include(LLMath) -include(LLRender) -include(LLFileSystem) include(LLWindow) -include(LLXML) include(UI) -include(SDL2) - -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLFILESYSTEM_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLXML_SYSTEM_INCLUDE_DIRS} - ) +include(ViewerMiscLibs) set(llwindow_SOURCE_FILES llcursortypes.cpp @@ -65,21 +47,20 @@ set(viewer_HEADER_FILES llmousehandler.h ) +set(llwindow_LINK_LIBRARIES + llcommon + llimage + llmath + llrender + llfilesystem + llxml + ll::glh_linear + ll::glext + ll::uilibraries + ) # Libraries on which this library depends, needed for Linux builds # Sort by high-level to low-level if (LINUX) - set(llwindow_LINK_LIBRARIES - ${LLCOMMON_LIBRARIES} - ${LLIMAGE_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLRENDER_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLXML_LIBRARIES} - ${UI_LIBRARIES} # for GTK - ${SDL_LIBRARIES} - ${FONTCONFIG_LIBRARIES} # For FCInit and other FC* functions. - ) - list(APPEND viewer_SOURCE_FILES llkeyboardsdl.cpp llwindowsdl.cpp @@ -102,6 +83,10 @@ if (LINUX) ) endif (BUILD_HEADLESS) + list(APPEND llwindow_LINK_LIBRARIES + ll::SDL2 + ) + endif (LINUX) if (DARWIN) @@ -147,18 +132,6 @@ if (WINDOWS) ) endif (WINDOWS) -if (SOLARIS) - list(APPEND llwindow_SOURCE_FILES - llwindowsolaris.cpp - ) - list(APPEND llwindow_HEADER_FILES - llwindowsolaris.h - ) -endif (SOLARIS) - -set_source_files_properties(${llwindow_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - if (BUILD_HEADLESS) set(llwindowheadless_SOURCE_FILES llwindowmesaheadless.cpp @@ -190,16 +163,10 @@ add_library (llwindow ) target_link_libraries (llwindow llcommon ${llwindow_LINK_LIBRARIES}) +target_include_directories(llwindow INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) if (DARWIN) include(CMakeFindFrameworks) find_library(CARBON_LIBRARY Carbon) target_link_libraries(llwindow ${CARBON_LIBRARY}) endif (DARWIN) - -if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") - target_precompile_headers(llwindow - PRIVATE - [["linden_common.h"]] - ) -endif() diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index 1828cf39adc9e93d55be45c9e51ffce6a0aadf41..b0c3bff64539d866bf3bdc0b2c04b6db91162ef2 100644 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -213,6 +213,7 @@ NSWindowRef createNSWindow(int x, int y, int width, int height) styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskResizable | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable backing:NSBackingStoreBuffered defer:NO]; [window makeKeyAndOrderFront:nil]; [window setAcceptsMouseMovedEvents:TRUE]; + [window setRestorable:FALSE]; // Viewer manages state from own settings return (NSWindowRef)CFBridgingRetain(window); } diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index f9ce62184b5b4962552b7aac25f31e2c74afa0a6..9c7073f32646a11e735fa6360eb41ba1f6d5eb74 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -4087,42 +4087,48 @@ void LLWindowWin32::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b) sLanguageTextInputAllowed = b; - if ( sLanguageTextInputAllowed ) - { - // Allowing: Restore the previous IME status, so that the user has a feeling that the previous - // text input continues naturally. Be careful, however, the IME status is meaningful only during the user keeps - // using same Input Locale (aka Keyboard Layout). - if (sWinIMEOpened && GetKeyboardLayout(0) == sWinInputLocale) - { - HIMC himc = LLWinImm::getContext(mWindowHandle); - LLWinImm::setOpenStatus(himc, TRUE); - LLWinImm::setConversionStatus(himc, sWinIMEConversionMode, sWinIMESentenceMode); - LLWinImm::releaseContext(mWindowHandle, himc); - } - } - else - { - // Disallowing: Turn off the IME so that succeeding key events bypass IME and come to us directly. - // However, do it after saving the current IME status. We need to restore the status when - // allowing language text input again. - sWinInputLocale = GetKeyboardLayout(0); - sWinIMEOpened = LLWinImm::isIME(sWinInputLocale); - if (sWinIMEOpened) - { - HIMC himc = LLWinImm::getContext(mWindowHandle); - sWinIMEOpened = LLWinImm::getOpenStatus(himc); - if (sWinIMEOpened) - { - LLWinImm::getConversionStatus(himc, &sWinIMEConversionMode, &sWinIMESentenceMode); + if (sLanguageTextInputAllowed) + { + mWindowThread->post([=]() + { + // Allowing: Restore the previous IME status, so that the user has a feeling that the previous + // text input continues naturally. Be careful, however, the IME status is meaningful only during the user keeps + // using same Input Locale (aka Keyboard Layout). + if (sWinIMEOpened && GetKeyboardLayout(0) == sWinInputLocale) + { + HIMC himc = LLWinImm::getContext(mWindowHandle); + LLWinImm::setOpenStatus(himc, TRUE); + LLWinImm::setConversionStatus(himc, sWinIMEConversionMode, sWinIMESentenceMode); + LLWinImm::releaseContext(mWindowHandle, himc); + } + }); + } + else + { + mWindowThread->post([=]() + { + // Disallowing: Turn off the IME so that succeeding key events bypass IME and come to us directly. + // However, do it after saving the current IME status. We need to restore the status when + // allowing language text input again. + sWinInputLocale = GetKeyboardLayout(0); + sWinIMEOpened = LLWinImm::isIME(sWinInputLocale); + if (sWinIMEOpened) + { + HIMC himc = LLWinImm::getContext(mWindowHandle); + sWinIMEOpened = LLWinImm::getOpenStatus(himc); + if (sWinIMEOpened) + { + LLWinImm::getConversionStatus(himc, &sWinIMEConversionMode, &sWinIMESentenceMode); - // We need both ImmSetConversionStatus and ImmSetOpenStatus here to surely disable IME's - // keyboard hooking, because Some IME reacts only on the former and some other on the latter... - LLWinImm::setConversionStatus(himc, IME_CMODE_NOCONVERSION, sWinIMESentenceMode); - LLWinImm::setOpenStatus(himc, FALSE); - } - LLWinImm::releaseContext(mWindowHandle, himc); - } - } + // We need both ImmSetConversionStatus and ImmSetOpenStatus here to surely disable IME's + // keyboard hooking, because Some IME reacts only on the former and some other on the latter... + LLWinImm::setConversionStatus(himc, IME_CMODE_NOCONVERSION, sWinIMESentenceMode); + LLWinImm::setOpenStatus(himc, FALSE); + } + LLWinImm::releaseContext(mWindowHandle, himc); + } + }); + } } void LLWindowWin32::fillCandidateForm(const LLCoordGL& caret, const LLRect& bounds, @@ -4319,6 +4325,10 @@ void LLWindowWin32::handleStartCompositionMessage() void LLWindowWin32::handleCompositionMessage(const U32 indexes) { + if (!mPreeditor) + { + return; + } BOOL needs_update = FALSE; LLWString result_string; LLWString preedit_string; @@ -4617,7 +4627,7 @@ BOOL LLWindowWin32::handleImeRequests(WPARAM request, LPARAM param, LRESULT *res LLWString context = find_context(wtext, preedit, preedit_length, &context_offset); preedit -= context_offset; preedit_length = llmin(preedit_length, (S32)context.length() - preedit); - if (preedit_length && preedit >= 0) + if (preedit_length > 0 && preedit >= 0) { // IMR_DOCUMENTFEED may be called when we have an active preedit. // We should pass the context string *excluding* the preedit string. diff --git a/indra/llxml/CMakeLists.txt b/indra/llxml/CMakeLists.txt index 232e4e25861544556c5f4af2434e9d7f5a003ab4..ea499967c7bbe8c9e0a0b3ad6ccc5f34b3b1ff18 100644 --- a/indra/llxml/CMakeLists.txt +++ b/indra/llxml/CMakeLists.txt @@ -4,18 +4,6 @@ project(llxml) include(00-Common) include(LLCommon) -include(LLMath) -include(LLFileSystem) -include(LLXML) - -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLFILESYSTEM_INCLUDE_DIRS} - ) -include_directories( - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ) set(llxml_SOURCE_FILES llcontrol.cpp @@ -33,20 +21,19 @@ set(llxml_HEADER_FILES llxmltree.h ) -set_source_files_properties(${llxml_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND llxml_SOURCE_FILES ${llxml_HEADER_FILES}) add_library (llxml ${llxml_SOURCE_FILES}) # Libraries on which this library depends, needed for Linux builds # Sort by high-level to low-level target_link_libraries( llxml - ${LLFILESYSTEM_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${EXPAT_LIBRARIES} + llfilesystem + llmath + llcommon + ll::expat ) +target_include_directories( llxml INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) + if(USE_PRECOMPILED_HEADERS AND ${CMAKE_VERSION} VERSION_GREATER "3.15.0") target_precompile_headers(llxml @@ -69,11 +56,10 @@ if (LL_TESTS) # set(TEST_DEBUG on) set(test_libs - ${LLXML_LIBRARIES} - ${WINDOWS_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ) + llxml + llmath + llcommon + ) LL_ADD_INTEGRATION_TEST(llcontrol "" "${test_libs}") endif (LL_TESTS) diff --git a/indra/media_plugins/base/CMakeLists.txt b/indra/media_plugins/base/CMakeLists.txt index 3a0391dcd5e7dbe2b87e41620e9a6417d1dbc9ae..d1f37913ebc52466275d79e2422e10a080072065 100644 --- a/indra/media_plugins/base/CMakeLists.txt +++ b/indra/media_plugins/base/CMakeLists.txt @@ -5,25 +5,9 @@ project(media_plugin_base LANGUAGES CXX) include(00-Common) include(LLCommon) include(LLImage) -include(LLPlugin) -include(LLMath) -include(LLRender) include(LLWindow) include(Linking) include(PluginAPI) -include(OpenGL) - -include_directories( - ${LLPLUGIN_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} -) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ) ### media_plugin_base @@ -40,10 +24,7 @@ set(media_plugin_base_HEADER_FILES add_library(media_plugin_base ${media_plugin_base_SOURCE_FILES} - ) - -set_target_properties(media_plugin_base PROPERTIES POSITION_INDEPENDENT_CODE TRUE) + ) -target_link_libraries(media_plugin_base PUBLIC - llcommon - ) \ No newline at end of file +target_link_libraries( media_plugin_base llplugin ) +target_include_directories( media_plugin_base INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt index 0d144fdb48111926abea92a6f99b7529e48c1a86..56846c83aa370390d55406c81777dfc6a124dee7 100644 --- a/indra/media_plugins/cef/CMakeLists.txt +++ b/indra/media_plugins/cef/CMakeLists.txt @@ -5,29 +5,12 @@ project(media_plugin_cef) include(Boost) include(00-Common) include(LLCommon) -include(LLPlugin) -include(LLMath) -include(LLRender) include(LLWindow) include(Linking) include(PluginAPI) -include(MediaPluginBase) include(CEFPlugin) -include_directories( - ${LLPLUGIN_INCLUDE_DIRS} - ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} - ${CEF_INCLUDE_DIR} -) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ) - ### media_plugin_cef @@ -39,13 +22,6 @@ set(media_plugin_cef_HEADER_FILES volume_catcher.h ) -set (media_plugin_cef_LINK_LIBRARIES - ${LLPLUGIN_LIBRARIES} - ${MEDIA_PLUGIN_BASE_LIBRARIES} - ${CEF_PLUGIN_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${PLUGIN_API_WINDOWS_LIBRARIES}) - # Select which VolumeCatcher implementation to use if (LINUX) if (PULSEAUDIO_FOUND) @@ -53,14 +29,14 @@ if (LINUX) else (PULSEAUDIO_FOUND) list(APPEND media_plugin_cef_SOURCE_FILES dummy_volume_catcher.cpp) endif (PULSEAUDIO_FOUND) - list(APPEND media_plugin_webkit_LINK_LIBRARIES + list(APPEND media_plugin_cef_LINK_LIBRARIES ${UI_LIBRARIES} # for glib/GTK ) elseif (DARWIN) list(APPEND media_plugin_cef_SOURCE_FILES mac_volume_catcher_null.cpp) find_library(CORESERVICES_LIBRARY CoreServices) find_library(AUDIOUNIT_LIBRARY AudioUnit) - list(APPEND media_plugin_cef_LINK_LIBRARIES + set( media_plugin_cef_LINK_LIBRARIES ${CORESERVICES_LIBRARY} # for Component Manager calls ${AUDIOUNIT_LIBRARY} # for AudioUnit calls ) @@ -68,9 +44,6 @@ elseif (WINDOWS) list(APPEND media_plugin_cef_SOURCE_FILES windows_volume_catcher.cpp) endif (LINUX) -set_source_files_properties(${media_plugin_cef_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND media_plugin_cef_SOURCE_FILES ${media_plugin_cef_HEADER_FILES}) add_library(media_plugin_cef @@ -81,7 +54,8 @@ add_library(media_plugin_cef set_target_properties(media_plugin_cef PROPERTIES POSITION_INDEPENDENT_CODE TRUE) target_link_libraries(media_plugin_cef - ${media_plugin_cef_LINK_LIBRARIES} + media_plugin_base + ll::cef ) if (WINDOWS) diff --git a/indra/media_plugins/example/CMakeLists.txt b/indra/media_plugins/example/CMakeLists.txt index a215381041fa5617a26d6ca88528e5ee9d4bf207..128ef641a00e9f187098d9ffe8aa81e985db2b4a 100644 --- a/indra/media_plugins/example/CMakeLists.txt +++ b/indra/media_plugins/example/CMakeLists.txt @@ -5,31 +5,12 @@ project(media_plugin_example) include(00-Common) include(LLCommon) include(LLImage) -include(LLPlugin) -include(LLMath) -include(LLRender) include(LLWindow) include(Linking) include(PluginAPI) -include(MediaPluginBase) -include(OpenGL) include(ExamplePlugin) -include_directories( - ${LLPLUGIN_INCLUDE_DIRS} - ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} -) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ) - - ### media_plugin_example set(media_plugin_example_SOURCE_FILES @@ -41,16 +22,7 @@ add_library(media_plugin_example ${media_plugin_example_SOURCE_FILES} ) -set_target_properties(media_plugin_example PROPERTIES POSITION_INDEPENDENT_CODE TRUE) - -target_link_libraries(media_plugin_example - ${LLPLUGIN_LIBRARIES} - ${MEDIA_PLUGIN_BASE_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${EXAMPLE_PLUGIN_LIBRARIES} - ${PLUGIN_API_WINDOWS_LIBRARIES} -) - +target_link_libraries(media_plugin_example media_plugin_base ) if (WINDOWS) set_target_properties( media_plugin_example diff --git a/indra/media_plugins/gstreamer010/CMakeLists.txt b/indra/media_plugins/gstreamer010/CMakeLists.txt index 068e7fc291c6cf35b9ebdf91995e1e277f9b776b..d5f129c7dcb1197217b76506b54b9d20da7efb5a 100644 --- a/indra/media_plugins/gstreamer010/CMakeLists.txt +++ b/indra/media_plugins/gstreamer010/CMakeLists.txt @@ -5,32 +5,14 @@ project(media_plugin_gstreamer010) include(00-Common) include(LLCommon) include(LLImage) -include(LLPlugin) include(LLMath) -include(LLRender) include(LLWindow) include(Linking) include(PluginAPI) -include(MediaPluginBase) include(OpenGL) include(GStreamer010Plugin) -include_directories( - ${LLPLUGIN_INCLUDE_DIRS} - ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} - ${GSTREAMER010_INCLUDE_DIRS} - ${GSTREAMER010_PLUGINS_BASE_INCLUDE_DIRS} -) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ) - ### media_plugin_gstreamer010 set(media_plugin_gstreamer010_SOURCE_FILES @@ -50,12 +32,7 @@ add_library(media_plugin_gstreamer010 ${media_plugin_gstreamer010_SOURCE_FILES} ) -set_target_properties(media_plugin_gstreamer010 PROPERTIES POSITION_INDEPENDENT_CODE TRUE) - target_link_libraries(media_plugin_gstreamer010 - ${LLPLUGIN_LIBRARIES} - ${MEDIA_PLUGIN_BASE_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${PLUGIN_API_WINDOWS_LIBRARIES} - ${GSTREAMER010_LIBRARIES} -) + media_plugin_base + ll::gstreamer + ) diff --git a/indra/media_plugins/libvlc/CMakeLists.txt b/indra/media_plugins/libvlc/CMakeLists.txt index 0eb91ea5e916275427895667ab6a347a4d5ffe2e..5273514dbd67ab0601671f4d9ab556e84874d9f0 100644 --- a/indra/media_plugins/libvlc/CMakeLists.txt +++ b/indra/media_plugins/libvlc/CMakeLists.txt @@ -5,32 +5,12 @@ project(media_plugin_libvlc) include(00-Common) include(LLCommon) include(LLImage) -include(LLPlugin) -include(LLMath) -include(LLRender) include(LLWindow) include(Linking) include(PluginAPI) -include(MediaPluginBase) -include(OpenGL) include(LibVLCPlugin) -include_directories( - ${LLPLUGIN_INCLUDE_DIRS} - ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} - ${VLC_INCLUDE_DIRS} -) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ) - - ### media_plugin_libvlc set(media_plugin_libvlc_SOURCE_FILES @@ -43,15 +23,10 @@ add_library(media_plugin_libvlc ) target_link_libraries(media_plugin_libvlc - ${LLPLUGIN_LIBRARIES} - ${MEDIA_PLUGIN_BASE_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${VLC_LIBRARIES} - ${PLUGIN_API_WINDOWS_LIBRARIES} + media_plugin_base + ll::libvlc ) -set_target_properties(media_plugin_libvlc PROPERTIES POSITION_INDEPENDENT_CODE TRUE) - if (WINDOWS) set_target_properties( media_plugin_libvlc diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 6af417634689184c1b4f04cdc969b02afc0dba34..981a846e288b70fb689b03c30ef9666fafc59596 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -24,25 +24,13 @@ include(LibXML2) include(LLAppearance) include(LLAudio) include(LLCA) -include(LLCharacter) include(LLCommon) include(LLCoreHttp) include(LLImage) -include(LLImageJ2COJ) -include(LLInventory) include(LLKDU) -include(LLLogin) -include(LLMath) -include(LLMeshOptimizer) -include(LLMessage) include(LLPhysicsExtensions) -include(LLPlugin) include(LLPrimitive) -include(LLRender) -include(LLUI) -include(LLFileSystem) include(LLWindow) -include(LLXML) include(NDOF) include(NVAPI) include(OPENAL) @@ -54,13 +42,13 @@ include(TemplateCheck) include(ThreeJS) include(Tracy) include(UI) -include(UnixInstall) include(ViewerMiscLibs) include(ViewerManager) include(VisualLeakDetector) include(VulkanGltf) include(ZLIBNG) include(URIPARSER) +include(LLPrimitive) # Viewer Branding Assets use_prebuilt_binary(branding) @@ -69,62 +57,29 @@ if (WINDOWS) endif() if( LLPHYSICSEXTENSIONS_SRC_DIR ) - if (NOT HAVOK_TPV) - # When using HAVOK_TPV, the library is precompiled, so no need for this - add_subdirectory(${LLPHYSICSEXTENSIONS_SRC_DIR} llphysicsextensions) - target_link_libraries(${LLPHYSICSEXTENSIONS_LIBRARIES} llcommon) - endif (NOT HAVOK_TPV) -endif( LLPHYSICSEXTENSIONS_SRC_DIR ) - -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} - ${DBUSGLIB_INCLUDE_DIRS} - ${ZLIBNG_INCLUDE_DIRS} - ${LIBXML2_INCLUDE_DIRS} - ${LLAUDIO_INCLUDE_DIRS} - ${LLCHARACTER_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLCOREHTTP_INCLUDE_DIRS} - ${LLPHYSICS_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLKDU_INCLUDE_DIRS} - ${LLINVENTORY_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLMESHOPTIMIZER_INCLUDE_DIRS} - ${LLMESSAGE_INCLUDE_DIRS} - ${LLPLUGIN_INCLUDE_DIRS} - ${LLPRIMITIVE_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLUI_INCLUDE_DIRS} - ${LLFILESYSTEM_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ${LLLOGIN_INCLUDE_DIRS} - "${LIBS_PREBUILT_DIR}/include/collada" - "${LIBS_PREBUILD_DIR}/include/hunspell" - ${OPENAL_INCLUDE_DIRS} - ${FREEALUT_INCLUDE_DIRS} - "${LIBS_PREBUILT_DIR}/include/collada/1.4" - ${LLAPPEARANCE_INCLUDE_DIRS} - ${DISCORD_INCLUDE_DIRS} - ) - -if(USE_FMODSTUDIO) - include_directories(${FMODSTUDIO_INCLUDE_DIR}) -endif(USE_FMODSTUDIO) - -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLXML_SYSTEM_INCLUDE_DIRS} - ${LLPHYSICSEXTENSIONS_INCLUDE_DIRS} - ) - -if (USE_SENTRY) - include_directories(AFTER - ${SENTRY_INCLUDE_DIRS} - ) -endif (USE_SENTRY) +if (NOT HAVOK_TPV) + # When using HAVOK_TPV, the library is precompiled, so no need for this + + # Stub and probably havok lib itself is a hack, autobuild loads a 3p that really is a source tarball + # which includes a CMakeList.txt and then this whole source tree gets pushed into out build ... :/ + # To make matters worse there is a internal assumption about the structure of the viewers CMake layout, + # which means we need to duct tape this togther ... + + add_subdirectory(${LLPHYSICSEXTENSIONS_SRC_DIR} llphysicsextensions) + + # Another hack that works with newer cmake versions: + cmake_policy( SET CMP0079 NEW) + if( TARGET llphysicsextensionsstub ) + target_link_libraries(llphysicsextensionsstub llcommon llmath) + endif() + if( TARGET llphysicsextensions ) + target_link_libraries(llphysicsextensions llrender ) + if (DARWIN) + target_compile_options( llphysicsextensions PRIVATE -Wno-unused-local-typedef) + endif (DARWIN) + endif() +endif (NOT HAVOK_TPV) +endif() set(viewer_SOURCE_FILES alcinematicmode.cpp @@ -1557,7 +1512,7 @@ set(viewer_HEADER_FILES VorbisFramework.h ) -if(USE_DISCORD) +if(TARGET al::discord-gamesdk) LIST(APPEND viewer_HEADER_FILES aldiscordmanager.h) LIST(APPEND viewer_SOURCE_FILES aldiscordmanager.cpp) endif() @@ -1569,9 +1524,6 @@ source_group("CMake Rules" FILES ViewerInstall.cmake) file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt" "${VIEWER_SHORT_VERSION}\n") -configure_file(llviewerbuildconfig.h.in llviewerbuildconfig.h @ONLY) -LIST(APPEND viewer_HEADER_FILES ${CMAKE_CURRENT_BINARY_DIR}/llviewerbuildconfig.h) - if (WINDOWS) LIST(APPEND viewer_SOURCE_FILES alsquirrelupdater.cpp) LIST(APPEND viewer_HEADER_FILES alsquirrelupdater.h) @@ -1604,21 +1556,6 @@ if (DARWIN) PROPERTIES SKIP_PRECOMPILE_HEADERS TRUE ) - - find_library(APPKIT_LIBRARY AppKit) - find_library(COCOA_LIBRARY Cocoa) - find_library(IOKIT_LIBRARY IOKit) - find_library(COREFOUNDATION_LIBRARY CoreFoundation) - find_library(COREAUDIO_LIBRARY CoreAudio) - - set(viewer_LIBRARIES - ${COCOA_LIBRARY} - ${APPKIT_LIBRARY} - ${IOKIT_LIBRARY} - ${COREFOUNDATION_LIBRARY} - ${COREAUDIO_LIBRARY} - ) - # Add resource files to the project. set(viewer_RESOURCE_FILES macview.r @@ -1631,12 +1568,7 @@ if (DARWIN) Japanese.lproj/language.txt Korean.lproj/language.txt ) - set_source_files_properties( - ${viewer_RESOURCE_FILES} - PROPERTIES - HEADER_FILE_ONLY TRUE - #MACOSX_PACKAGE_LOCATION Resources #don't do this! this tells cmake to copy the files. - ) + SOURCE_GROUP("Resources" FILES ${viewer_RESOURCE_FILES}) list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) endif (DARWIN) @@ -1648,9 +1580,6 @@ if (LINUX) LIST(APPEND viewer_HEADER_FILES algamemode.h) SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") - set(viewer_LIBRARIES - Xinerama - ) endif (LINUX) if (WINDOWS) @@ -1663,7 +1592,6 @@ if (WINDOWS) llappviewerwin32.h llwindebug.h ) - # Replace the icons with the appropriate ones for the channel # ('test' is the default) set(ICON_PATH "test") @@ -1785,35 +1713,13 @@ if (WINDOWS) source_group("Resource Files" FILES ${viewer_RESOURCE_FILES}) - if (NOT USESYSTEMLIBS) - list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) - endif (NOT USESYSTEMLIBS) + list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) set_source_files_properties(llappviewer.cpp PROPERTIES COMPILE_FLAGS /bigobj) set_source_files_properties(llviewermenu.cpp PROPERTIES COMPILE_FLAGS /bigobj) -# see EXP-1765 - theory is opengl32.lib needs to be included before gdi32.lib (windows libs) - set(viewer_LIBRARIES - opengl32 - ${WINDOWS_LIBRARIES} - comdlg32 - dxguid - imm32 - kernel32 - odbc32 - odbccp32 - oleaut32 - shell32 - Vfw32 - wer - winspool - ) endif (WINDOWS) -if (USE_OPENAL) - LIST(APPEND viewer_LIBRARIES ${OPENAL_LIBRARIES} ${FREEALUT_LIBRARIES}) -endif () - # Add the xui files. This is handy for searching for xui elements # from within the IDE. set(viewer_XUI_FILES @@ -1901,9 +1807,7 @@ source_group("Character File" FILES ${viewer_CHARACTER_FILES}) set_source_files_properties(${viewer_CHARACTER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) -if (NOT USESYSTEMLIBS) - list(APPEND viewer_SOURCE_FILES ${viewer_CHARACTER_FILES}) -endif (NOT USESYSTEMLIBS) +list(APPEND viewer_SOURCE_FILES ${viewer_CHARACTER_FILES}) set(viewer_MISC_FILES viewer_manifest.py @@ -1925,28 +1829,22 @@ if (WINDOWS) list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES}) endif (WINDOWS) -if (USE_FMODSTUDIO) - set(FMODWRAPPER_LIBRARY ${FMODSTUDIO_LIBRARY}) -endif (USE_FMODSTUDIO) list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES}) -set_source_files_properties(${viewer_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - add_executable(${VIEWER_BINARY_NAME} WIN32 MACOSX_BUNDLE ${viewer_SOURCE_FILES} ) -if (USE_SENTRY) - target_compile_definitions(${VIEWER_BINARY_NAME} PRIVATE ${SENTRY_DEFINE}) +target_include_directories(${VIEWER_BINARY_NAME} + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ) - list(APPEND viewer_LIBRARIES - ${SENTRY_LIBRARIES} - ) -endif () +target_compile_definitions(${VIEWER_BINARY_NAME} PRIVATE VIEWER_UPDATE_SERVICE="${VIEWER_UPDATE_SERVICE}") # add package files file(GLOB EVENT_HOST_SCRIPT_GLOB_LIST @@ -1979,12 +1877,9 @@ if (WINDOWS) set_target_properties(${VIEWER_BINARY_NAME} PROPERTIES OUTPUT_NAME "${WIN_BINARY_NAME}") - if(GEN_IS_MULTI_CONFIG) - set(VIEWER_BUILD_DEST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") - else() - set(VIEWER_BUILD_DEST_DIR "${CMAKE_CURRENT_BINARY_DIR}/package") + if(NOT LL_GENERATOR_IS_MULTI_CONFIG) set_target_properties(${VIEWER_BINARY_NAME} PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${VIEWER_BUILD_DEST_DIR}") + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>") endif() # If adding a file to viewer_manifest.py in the WindowsManifest.construct() method, be sure to add the dependency @@ -2003,8 +1898,11 @@ if (WINDOWS) # The following commented dependencies are determined at variably at build time. Can't do this here. ${CMAKE_SOURCE_DIR}/../etc/message.xml ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/openjp2.dll - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/SLVoice.exe + ${SHARED_LIB_STAGING_DIR}/openjp2.dll + #${SHARED_LIB_STAGING_DIR}/${LL_INTDIR}/SLVoice.exe + #${SHARED_LIB_STAGING_DIR}/${LL_INTDIR}/libsndfile-1.dll + #${SHARED_LIB_STAGING_DIR}/${LL_INTDIR}/vivoxoal.dll + ${AUTOBUILD_INSTALL_DIR}/ca-bundle.crt ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt ${viewer_APPSETTINGS_FILES} @@ -2013,15 +1911,15 @@ if (WINDOWS) ) if (ADDRESS_SIZE EQUAL 64) - list(APPEND COPY_INPUT_DEPENDENCIES - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk_x64.dll - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp_x64.dll - ) + list(APPEND COPY_INPUT_DEPENDENCIES + ${SHARED_LIB_STAGING_DIR}/vivoxsdk_x64.dll + ${SHARED_LIB_STAGING_DIR}/ortp_x64.dll + ) else (ADDRESS_SIZE EQUAL 64) - list(APPEND COPY_INPUT_DEPENDENCIES - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll - ) + list(APPEND COPY_INPUT_DEPENDENCIES + ${SHARED_LIB_STAGING_DIR}/vivoxsdk.dll + ${SHARED_LIB_STAGING_DIR}/ortp.dll + ) endif (ADDRESS_SIZE EQUAL 64) if (USE_CEF) @@ -2036,33 +1934,21 @@ if (WINDOWS) ) endif () - if (USE_FMODSTUDIO) - if (GEN_IS_MULTI_CONFIG) - list(APPEND COPY_INPUT_DEPENDENCIES - ${SHARED_LIB_STAGING_DIR}/Release/fmod.dll - ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmod.dll - ${SHARED_LIB_STAGING_DIR}/Debug/fmodL.dll - ) - elseif (UPPERCASE_CMAKE_BUILD_TYPE MATCHES DEBUG) - list(APPEND COPY_INPUT_DEPENDENCIES - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/fmodL.dll - ) - else() - list(APPEND COPY_INPUT_DEPENDENCIES - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/fmod.dll - ) - endif() - endif (USE_FMODSTUDIO) - - if (USE_OPENAL) + if (TARGET ll::fmodstudio) list(APPEND COPY_INPUT_DEPENDENCIES - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/OpenAL32.dll - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/alut.dll + ${SHARED_LIB_STAGING_DIR}/fmod.dll + ) + endif () + + if (TARGET ll::openal) + list(APPEND COPY_INPUT_DEPENDENCIES + ${SHARED_LIB_STAGING_DIR}/OpenAL32.dll + ${SHARED_LIB_STAGING_DIR}/alut.dll ) endif () add_custom_command( - OUTPUT ${VIEWER_BUILD_DEST_DIR}/copy_touched.bat + OUTPUT ${CMAKE_CFG_INTDIR}/copy_touched.bat COMMAND ${Python3_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py @@ -2073,15 +1959,14 @@ if (WINDOWS) "--sentry=${USE_SENTRY}" "--fmodstudio=${USE_FMODSTUDIO}" "--openal=${USE_OPENAL}" - "--kdu=${USE_KDU}" --build=${CMAKE_CURRENT_BINARY_DIR} - --buildtype=${CMAKE_BUILD_TYPE} + --buildtype=$<CONFIG> "--channel=${VIEWER_CHANNEL}" --configuration=${CMAKE_CFG_INTDIR} - --dest=${VIEWER_BUILD_DEST_DIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,> --grid=${GRID} --source=${CMAKE_CURRENT_SOURCE_DIR} - --touch=${VIEWER_BUILD_DEST_DIR}/copy_touched.bat + --touch=${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>/copy_touched.bat --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py @@ -2090,7 +1975,7 @@ if (WINDOWS) COMMENT "Performing viewer_manifest copy" ) - add_custom_target(copy_w_viewer_manifest ALL DEPENDS ${VIEWER_BUILD_DEST_DIR}/copy_touched.bat) + add_custom_target(copy_w_viewer_manifest ALL DEPENDS ${CMAKE_CFG_INTDIR}/copy_touched.bat) add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon copy_w_viewer_manifest) @@ -2117,7 +2002,7 @@ if (WINDOWS) ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py ${CMAKE_CURRENT_SOURCE_DIR}/.. ${CMAKE_CURRENT_BINARY_DIR} - ${VIEWER_BUILD_DEST_DIR} + ${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,> DEPENDS lleventhost ${EVENT_HOST_SCRIPTS} @@ -2131,28 +2016,27 @@ if (WINDOWS) endif () add_custom_command( - OUTPUT ${VIEWER_BUILD_DEST_DIR}/touched.bat + OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat COMMAND ${Python3_EXECUTABLE} ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --arch=${ARCH} - --artwork=${ARTWORK_DIR} - "--discord=${USE_DISCORD}" - "--sentry=${USE_SENTRY}" - "--fmodstudio=${USE_FMODSTUDIO}" - "--openal=${USE_OPENAL}" - "--kdu=${USE_KDU}" - --build=${CMAKE_CURRENT_BINARY_DIR} - --buildtype=${CMAKE_BUILD_TYPE} - "--channel=${VIEWER_CHANNEL}" - --configuration=${CMAKE_CFG_INTDIR} - --dest=${VIEWER_BUILD_DEST_DIR} - --grid=${GRID} - --source=${CMAKE_CURRENT_SOURCE_DIR} - --touch=${VIEWER_BUILD_DEST_DIR}/touched.bat - --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt - --updateurl=${VIEWER_UPDATE_SERVICE} - ${DELTA_GEN_SETTING} + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --arch=${ARCH} + --artwork=${ARTWORK_DIR} + "--discord=${USE_DISCORD}" + "--sentry=${USE_SENTRY}" + "--fmodstudio=${USE_FMODSTUDIO}" + "--openal=${USE_OPENAL}" + --build=${CMAKE_CURRENT_BINARY_DIR} + --buildtype=$<CONFIG> + "--channel=${VIEWER_CHANNEL}" + --configuration=${CMAKE_CFG_INTDIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,> + --grid=${GRID} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --touch=${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>/touched.bat + --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt + --updateurl=${VIEWER_UPDATE_SERVICE} + ${DELTA_GEN_SETTING} DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py @@ -2161,22 +2045,17 @@ if (WINDOWS) ) add_custom_target(llpackage ALL DEPENDS - ${VIEWER_BUILD_DEST_DIR}/touched.bat + ${CMAKE_CFG_INTDIR}/touched.bat ) # temporarily disable packaging of event_host until hg subrepos get # sorted out on the parabuild cluster... #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2) + endif (PACKAGE) elseif (DARWIN) - set_target_properties(${VIEWER_BINARY_NAME} - PROPERTIES - LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Xlinker -dead_strip -Xlinker -map -Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}.MAP" - ) -else (WINDOWS) - # Linux - set_target_properties(${VIEWER_BINARY_NAME} - PROPERTIES - LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Wl,--Map=${VIEWER_BINARY_NAME}.MAP" + target_link_options(${VIEWER_BINARY_NAME} + PRIVATE + $<$<CONFIG:Release>:LINKER:-dead_strip> ) endif (WINDOWS) @@ -2209,59 +2088,51 @@ endif (WINDOWS) # modern version. target_link_libraries(${VIEWER_BINARY_NAME} - ${PNG_PRELOAD_ARCHIVES} - ${ZLIBNG_PRELOAD_ARCHIVES} - ${URIPARSER_PRELOAD_ARCHIVES} - ${GOOGLE_PERFTOOLS_LIBRARIES} - ${LLAUDIO_LIBRARIES} - ${LLCHARACTER_LIBRARIES} - ${LLIMAGE_LIBRARIES} - ${LLINVENTORY_LIBRARIES} - ${LLMESHOPTIMIZER_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLPLUGIN_LIBRARIES} - ${LLPRIMITIVE_LIBRARIES} - ${LLRENDER_LIBRARIES} - ${FREETYPE_LIBRARIES} - ${LLUI_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLWINDOW_LIBRARIES} - ${LLXML_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${NDOF_LIBRARY} - ${NVAPI_LIBRARY} - ${HUNSPELL_LIBRARY} - ${viewer_LIBRARIES} - ${BOOST_PROGRAM_OPTIONS_LIBRARY} - ${BOOST_REGEX_LIBRARY} - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_WAVE_LIBRARY} - ${DBUSGLIB_LIBRARIES} - ${OPENGL_LIBRARIES} - ${FMODWRAPPER_LIBRARY} # must come after LLAudio - ${SDL_LIBRARIES} - ${SMARTHEAP_LIBRARY} - ${UI_LIBRARIES} - ${WINDOWS_LIBRARIES} - ${EXPAT_LIBRARIES} - ${LIBXML2_LIBRARIES} - ${XMLRPCEPI_LIBRARIES} - ${OPENSSL_LIBRARIES} - ${CRYPTO_LIBRARIES} - ${LLLOGIN_LIBRARIES} - ${LLPHYSICS_LIBRARIES} - ${LLPHYSICSEXTENSIONS_LIBRARIES} - ${LLAPPEARANCE_LIBRARIES} - ${TRACY_LIBRARY} - ${MINIZIP_LIBRARIES} - ${DISCORD_LIBRARIES} - meshoptimizer - nlohmann_json::nlohmann_json - fmt::fmt - ) + PUBLIC + llaudio + llcharacter + llimage + llinventory + llmessage + llplugin + llprimitive + llrender + llui + llfilesystem + llwindow + llxml + llmath + llcorehttp + llcommon + llmeshoptimizer + ll::ndof + lllogin + llprimitive + llappearance + ${LLPHYSICSEXTENSIONS_LIBRARIES} + ll::tracy + ll::versioninfo + ) + +if( TARGET ll::nvapi ) + target_link_libraries(${VIEWER_BINARY_NAME} PUBLIC ll::nvapi ) +endif() + +if( TARGET al::discord-gamesdk ) + target_link_libraries(${VIEWER_BINARY_NAME} PUBLIC al::discord-gamesdk ) +endif() + +if( TARGET al::sentry ) + target_link_libraries(${VIEWER_BINARY_NAME} PUBLIC al::sentry ) +endif() + +if( TARGET media_plugin_cef ) + target_compile_definitions(${VIEWER_BINARY_NAME} PRIVATE USE_CEF=1) +endif() + +if( TARGET media_plugin_libvlc ) + target_compile_definitions(${VIEWER_BINARY_NAME} PRIVATE USE_VLC=1) +endif() set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH "Path to artwork files.") @@ -2359,7 +2230,7 @@ if (DARWIN) # https://blog.kitware.com/upcoming-in-cmake-2-8-12-osx-rpath-support/ set(CMAKE_MACOSX_RPATH 1) - set(VIEWER_APP_BUNDLE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app") + set(VIEWER_APP_BUNDLE "${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>/${product}.app") set(VIEWER_APP_EXE "${VIEWER_APP_BUNDLE}/Contents/MacOS/${product}") set(VIEWER_APP_DSYM "${VIEWER_APP_EXE}.dSYM") set(VIEWER_APP_XCARCHIVE "${VIEWER_APP_BUNDLE}/../${product}.xcarchive.zip") @@ -2412,7 +2283,7 @@ if (DARWIN) "--openal=${USE_OPENAL}" "--kdu=${USE_KDU}" --build=${CMAKE_CURRENT_BINARY_DIR} - --buildtype=${CMAKE_BUILD_TYPE} + --buildtype=$<CONFIG> --bundleid=${MACOSX_BUNDLE_GUI_IDENTIFIER} "--channel=${VIEWER_CHANNEL}" --configuration=${CMAKE_CFG_INTDIR} @@ -2448,24 +2319,24 @@ if (DARWIN) TARGET llpackage POST_BUILD COMMAND ${Python3_EXECUTABLE} ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --arch=${ARCH} - --artwork=${ARTWORK_DIR} - "--discord=${USE_DISCORD}" - "--sentry=${USE_SENTRY}" - "--fmodstudio=${USE_FMODSTUDIO}" - "--openal=${USE_OPENAL}" - "--kdu=${USE_KDU}" - --build=${CMAKE_CURRENT_BINARY_DIR} - --buildtype=${CMAKE_BUILD_TYPE} - "--channel=${VIEWER_CHANNEL}" - --configuration=${CMAKE_CFG_INTDIR} - --dest=${VIEWER_APP_BUNDLE} - --grid=${GRID} - --source=${CMAKE_CURRENT_SOURCE_DIR} - --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched - --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt - ${SIGNING_SETTING} + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --arch=${ARCH} + --artwork=${ARTWORK_DIR} + "--discord=${USE_DISCORD}" + "--sentry=${USE_SENTRY}" + "--fmodstudio=${USE_FMODSTUDIO}" + "--openal=${USE_OPENAL}" + "--kdu=${USE_KDU}" + --build=${CMAKE_CURRENT_BINARY_DIR} + --buildtype=$<CONFIG> + "--channel=${VIEWER_CHANNEL}" + --configuration=${CMAKE_CFG_INTDIR} + --dest=${VIEWER_APP_BUNDLE} + --grid=${GRID} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --touch=${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>/.${product}.bat + --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt + ${SIGNING_SETTING} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) @@ -2593,9 +2464,16 @@ if (LL_TESTS) ) set(test_libs - ${LLCOMMON_LIBRARIES} - ${CURL_LIBRARIES} - ${NGHTTP2_LIBRARIES} + llcommon + llfilesystem + llxml + llmessage + llcharacter + llui + lllogin + llplugin + llappearance + ll::versioninfo ) set_source_files_properties( @@ -2604,17 +2482,6 @@ if (LL_TESTS) LL_TEST_ADDITIONAL_LIBRARIES "${test_libs}" ) - set_source_files_properties( - llviewerhelputil.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" - ) - - set_source_files_properties( - llremoteparcelrequest.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" - ) set_source_files_properties( llworldmap.cpp @@ -2622,86 +2489,49 @@ if (LL_TESTS) PROPERTIES LL_TEST_ADDITIONAL_SOURCE_FILES tests/llviewertexture_stub.cpp - #llviewertexturelist.cpp - LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" ) set_source_files_properties( llmediadataclient.cpp PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${LLPRIMITIVE_LIBRARIES}" - ) - - set_source_files_properties( - llagentaccess.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" + LL_TEST_ADDITIONAL_LIBRARIES llprimitive ) set_source_files_properties( lllogininstance.cpp PROPERTIES LL_TEST_ADDITIONAL_SOURCE_FILES llversioninfo.cpp - LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" + ) + set_property( SOURCE + ${viewer_TEST_SOURCE_FILES} + PROPERTY + LL_TEST_ADDITIONAL_LIBRARIES ${test_libs} ) - ################################################## - # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS - ################################################## - # if(USE_PRECOMPILED_HEADERS) - # set_source_files_properties( - # ${viewer_TEST_SOURCE_FILES} - # PROPERTIES - # LL_TEST_ADDITIONAL_SOURCE_FILES llviewerprecompiledheaders.cpp - # ) - # endif(USE_PRECOMPILED_HEADERS) LL_ADD_PROJECT_UNIT_TESTS(${VIEWER_BINARY_NAME} "${viewer_TEST_SOURCE_FILES}") #set(TEST_DEBUG on) - ################################################## - # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS - ################################################## - # if(USE_PRECOMPILED_HEADERS) - # set(test_sources "${test_sources}" llviewerprecompiledheaders.cpp) - # endif(USE_PRECOMPILED_HEADERS) - set(test_libs - ${LLMESSAGE_LIBRARIES} - ${WINDOWS_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ) - - if (LINUX) - # llcommon uses `clock_gettime' which is provided by librt on linux. - set(LIBRT_LIBRARY - rt - ) - endif (LINUX) set(test_libs - ${WINDOWS_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${OPENSSL_LIBRARIES} - ${CRYPTO_LIBRARIES} - ${LIBRT_LIBRARY} - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ) - - LL_ADD_INTEGRATION_TEST(llagentaccess - llagentaccess.cpp - "${test_libs}" - ) + llfilesystem + llmath + llcommon + llmessage + llcorehttp + llxml + llui + llplugin + llappearance + lllogin + llprimitive + lllogin + ) LL_ADD_INTEGRATION_TEST(cppfeatures "" "${test_libs}" ) + LL_ADD_INTEGRATION_TEST(llsechandler_basic llsechandler_basic.cpp "${test_libs}" @@ -2715,10 +2545,10 @@ if (LL_TESTS) set(llslurl_test_sources llslurl.cpp llviewernetwork.cpp - ) + ) LL_ADD_INTEGRATION_TEST(llslurl - "${llslurl_test_sources}" + "${llslurl_test_sources}" "${test_libs}" ) diff --git a/indra/newview/aldiscordmanager.cpp b/indra/newview/aldiscordmanager.cpp index 8fa7bf5489618d06a998f287a7421a00e7be7148..c57ee6b2a418dd72111547fcfc0fc6e7d0336c8e 100644 --- a/indra/newview/aldiscordmanager.cpp +++ b/indra/newview/aldiscordmanager.cpp @@ -37,7 +37,6 @@ #include "llappviewer.h" #include "llviewernetwork.h" #include "llregioninfomodel.h" -#include "llviewerbuildconfig.h" #include "llviewercontrol.h" #include "llviewerregion.h" #include "rlvactions.h" diff --git a/indra/newview/alsquirrelupdater.cpp b/indra/newview/alsquirrelupdater.cpp index 604556a4c56e9342e4db8e04bcb3b53f4f7a379a..d2ef58c3158dd8760585e2187850f4d85a7bbe2c 100644 --- a/indra/newview/alsquirrelupdater.cpp +++ b/indra/newview/alsquirrelupdater.cpp @@ -27,8 +27,6 @@ #include "alsquirrelupdater.h" -#include "llviewerbuildconfig.h" - #include "llappviewer.h" #include "llnotificationsutil.h" #include "llversioninfo.h" diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 43df209078c27aa07b05df5ed236c3d81b1e14e6..7b0f10a151aca5d945eb22ca120b17f226357623 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -237,6 +237,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>FetchGroupChatHistory</key> + <map> + <key>Comment</key> + <string>Fetch recent messages from group chat servers when a group window opens</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>VoiceCallsFriendsOnly</key> <map> <key>Comment</key> diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index c998d65a5e593b8386fa0919ffe0096514c9cb39..4152db363bb960c63063138d4275a0aef1b1ba6f 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -138,7 +138,6 @@ LLAgentCamera::LLAgentCamera() : mCameraFOVZoomFactor(0.f), mCameraCurrentFOVZoomFactor(0.f), mCameraFocusOffset(), - mCameraFOVDefault(DEFAULT_FIELD_OF_VIEW), mCameraCollidePlane(), @@ -160,7 +159,6 @@ LLAgentCamera::LLAgentCamera() : mFocusObject(NULL), mFocusObjectDist(0.f), mFocusObjectOffset(), - mFocusDotRadius( 0.1f ), // meters mTrackFocusObject(TRUE), mAtKey(0), // Either 1, 0, or -1... indicates that movement-key is pressed @@ -2573,6 +2571,11 @@ void LLAgentCamera::changeCameraToCustomizeAvatar() gAgent.standUp(); // force stand up gViewerWindow->getWindow()->resetBusyCount(); + if (LLSelectMgr::getInstance()->getSelection()->isAttachment()) + { + LLSelectMgr::getInstance()->deselectAll(); + } + if (gFaceEditToolset) { LLToolMgr::getInstance()->setCurrentToolset(gFaceEditToolset); diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h index a50239fdf3371643301b3177c86dcb5d1c6f945e..c9d471a309695a761bdc7fe2866cf38bdc3fe7a0 100644 --- a/indra/newview/llagentcamera.h +++ b/indra/newview/llagentcamera.h @@ -178,7 +178,6 @@ class LLAgentCamera F32 mTargetCameraDistance; // Target camera offset from avatar F32 mCameraFOVZoomFactor; // Amount of fov zoom applied to camera when zeroing in on an object F32 mCameraCurrentFOVZoomFactor; // Interpolated fov zoom - F32 mCameraFOVDefault; // Default field of view that is basis for FOV zoom effect LLVector4 mCameraCollidePlane; // Colliding plane for camera F32 mCameraZoomFraction; // Mousewheel driven fraction of zoom LLVector3 mCameraPositionAgent; // Camera position in agent coordinates @@ -193,7 +192,6 @@ class LLAgentCamera // Follow //-------------------------------------------------------------------- public: - void setUsingFollowCam(bool using_follow_cam); bool isfollowCamLocked(); private: LLFollowCam mFollowCam; // Ventrella @@ -259,7 +257,6 @@ class LLAgentCamera LLPointer<LLViewerObject> mFocusObject; F32 mFocusObjectDist; LLVector3 mFocusObjectOffset; - F32 mFocusDotRadius; // Meters BOOL mTrackFocusObject; //-------------------------------------------------------------------- diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm index 419cceb67ec0c67c102debefd9953dfa5a8847de..02f26102721953c89d93358f378cd1b9bd44cf55 100644 --- a/indra/newview/llappdelegate-objc.mm +++ b/indra/newview/llappdelegate-objc.mm @@ -25,12 +25,11 @@ */ #import "llappdelegate-objc.h" -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) #import "Sentry.h" #endif #include "llwindowmacosx-objc.h" #include "llappviewermacosx-for-objc.h" -#include "llviewerbuildconfig.h" #include <Carbon/Carbon.h> // Used for Text Input Services ("Safe" API - it's supported) @implementation LLAppDelegate @@ -56,7 +55,7 @@ // initialized, "played back" into whatever handlers have been set up. constructViewer(); -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) [SentrySDK startWithConfigureOptions:^(SentryOptions *options) { options.dsn = @SENTRY_DSN; options.debug = NO; diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 6e8dbe72bdf4bec6c349b053a9e9feccaebc6d45..8721a695ccb56c238bdc2db6b5eac3103587e8bd 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -35,6 +35,7 @@ #include "llinventoryobserver.h" #include "llviewerinventory.h" #include "llcorehttputil.h" +#include <memory> class LLWearableHoldingPattern; class LLInventoryCallback; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index fe29f1d8557fa893df5c015ccdab195222ff6cbb..b0e74b5029818dd37c379c4586c999553d6efac5 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -26,8 +26,6 @@ #include "llviewerprecompiledheaders.h" -#include "llviewerbuildconfig.h" - #include "llappviewer.h" // Viewer includes @@ -263,7 +261,7 @@ using namespace LL; #include "llcoproceduremanager.h" #include "llviewereventrecorder.h" -#if USE_DISCORD +#ifdef AL_DISCORD #include "aldiscordmanager.h" #endif @@ -1158,7 +1156,7 @@ bool LLAppViewer::init() { LL_WARNS("InitInfo") << "Skipping updater check." << LL_ENDL; } - +#endif //LL_RELEASE_FOR_DOWNLOAD { // Iterate over --leap command-line options. But this is a bit tricky: if // there's only one, it won't be an array at all. @@ -1184,7 +1182,6 @@ bool LLAppViewer::init() LLLeap::create("", leap.asString(), false); // exception=false } } -#endif //LL_RELEASE_FOR_DOWNLOAD LLTextUtil::TextHelpers::iconCallbackCreationFunction = create_text_segment_icon_from_url_match; @@ -1247,7 +1244,7 @@ bool LLAppViewer::init() } #endif -#if USE_DISCORD +#ifdef AL_DISCORD ALDiscordManager::getInstance(); LL_INFOS("AppInit") << "Discord Integration Initialized." << LL_ENDL; #endif @@ -5480,7 +5477,8 @@ void LLAppViewer::disconnectViewer() { gInventory.cache(gInventory.getRootFolderID(), gAgent.getID()); if (gInventory.getLibraryRootFolderID().notNull() - && gInventory.getLibraryOwnerID().notNull()) + && gInventory.getLibraryOwnerID().notNull() + && !mSecondInstance) // agent is unique, library isn't { gInventory.cache( gInventory.getLibraryRootFolderID(), diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index d0064dd3ee7d41d539f69d8073f810ed6fffc026..6a414b0b413a46fd171530c9e43b16f7a81aa7e1 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -43,9 +43,8 @@ #include "algamemode.h" // Sentry (https://sentry.io) crash reporting tool -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) #include <sentry.h> -#include "llviewerbuildconfig.h" #endif #if LL_DBUS_ENABLED @@ -114,7 +113,7 @@ int main( int argc, char **argv ) delete viewer_app_ptr; viewer_app_ptr = NULL; -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) sentry_close(); #endif @@ -346,7 +345,7 @@ bool LLAppViewerLinux::sendURLToOtherInstance(const std::string& url) void LLAppViewerLinux::setCrashUserMetadata(const LLUUID& user_id, const std::string& avatar_name) { -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) if (mSentryInitialized) { sentry_value_t user = sentry_value_new_object(); @@ -359,7 +358,7 @@ void LLAppViewerLinux::setCrashUserMetadata(const LLUUID& user_id, const std::st void LLAppViewerLinux::initCrashReporting(bool reportFreeze) { -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) sentry_options_t* options = sentry_options_new(); sentry_options_set_dsn(options, SENTRY_DSN); sentry_options_set_release(options, LL_VIEWER_CHANNEL_AND_VERSION); diff --git a/indra/newview/llappviewermacosx-objc.mm b/indra/newview/llappviewermacosx-objc.mm index b284eae81a880d089dc18f0ee27786ff92014d07..ce300d328b952f20510af73bd83031b5571b998f 100644 --- a/indra/newview/llappviewermacosx-objc.mm +++ b/indra/newview/llappviewermacosx-objc.mm @@ -33,13 +33,13 @@ #include "llappviewermacosx-objc.h" -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) #import "Sentry.h" #endif void setCrashUserMetadataWrapper(const std::string& userid, const std::string& username) { -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) SentryUser *user = [[SentryUser alloc] init]; user.userId = @(userid.c_str()); user.username = @(username.c_str()); diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 41dc6f41b70de30ba6a434103f18d41dc1270830..d367395d5d3a22fb053a73db1fa2e36efd9ca7e3 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -343,16 +343,16 @@ bool LLAppViewerMacOSX::restoreErrorTrap() #define SET_SIG(SIGNAL) sigaction(SIGNAL, &act, &old_act); \ if(act.sa_sigaction != old_act.sa_sigaction) ++reset_count; // Synchronous signals -#if !defined(USE_SENTRY) +#if !defined(AL_SENTRY) SET_SIG(SIGABRT) // let bugsplat catch this #endif SET_SIG(SIGALRM) -#if !defined(USE_SENTRY) +#if !defined(AL_SENTRY) SET_SIG(SIGBUS) SET_SIG(SIGFPE) #endif SET_SIG(SIGHUP) -#if !defined(USE_SENTRY) +#if !defined(AL_SENTRY) SET_SIG(SIGILL) SET_SIG(SIGPIPE) SET_SIG(SIGSEGV) @@ -380,7 +380,7 @@ bool LLAppViewerMacOSX::restoreErrorTrap() void LLAppViewerMacOSX::initCrashReporting(bool reportFreeze) { -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) LL_DEBUGS("InitOSX", "Sentry") << "using Sentry crash logger" << LL_ENDL; #else LL_DEBUGS("InitOSX") << "No crash logger enabled" << LL_ENDL; diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index f536c9f98d87884a22c2f338727e560d7e1317be..92062e383990deaaee18fc8111d1b54331e2474e 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -26,8 +26,6 @@ #include "llviewerprecompiledheaders.h" -#include "llviewerbuildconfig.h" - #ifdef INCLUDE_VLD #include "vld.h" #endif @@ -49,7 +47,7 @@ #include "llviewercontrol.h" #include "lldxhardware.h" -#if USE_NVAPI +#ifdef LL_NVAPI #include "nvapi/nvapi.h" #include "nvapi/NvApiDriverSettings.h" #endif @@ -77,7 +75,7 @@ #include <exception> // Sentry (https://sentry.io) crash reporting tool -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) #include <sentry.h> #endif @@ -142,7 +140,7 @@ bool create_app_mutex() return result; } -#if USE_NVAPI +#ifdef LL_NVAPI #define ALWSTR_SIZE(inwstr) ((inwstr.size() + 1) * sizeof(wchar_t)) @@ -369,7 +367,7 @@ int APIENTRY WINMAIN(HINSTANCE hInstance, return -1; } -#if USE_NVAPI +#ifdef LL_NVAPI // Initialize NVAPI NvAPI_Status nvStatus = NvAPI_Initialize(); NvDRSSessionHandle nvhSession = 0; @@ -446,7 +444,7 @@ int APIENTRY WINMAIN(HINSTANCE hInstance, delete viewer_app_ptr; viewer_app_ptr = NULL; -#if USE_NVAPI +#ifdef LL_NVAPI // (NVAPI) (6) We clean up. This is analogous to doing a free() if (nvhSession) { @@ -465,7 +463,7 @@ int APIENTRY WINMAIN(HINSTANCE hInstance, #endif -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) sentry_close(); #endif @@ -629,7 +627,7 @@ bool LLAppViewerWin32::cleanup() void LLAppViewerWin32::reportCrashToBugsplat(void* pExcepInfo) { -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) if (mSentryInitialized) { sentry_ucontext_s exc_context = {}; @@ -641,7 +639,7 @@ void LLAppViewerWin32::reportCrashToBugsplat(void* pExcepInfo) void LLAppViewerWin32::setCrashUserMetadata(const LLUUID& user_id, const std::string& avatar_name) { -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) if (mSentryInitialized) { sentry_value_t user = sentry_value_new_object(); @@ -756,7 +754,7 @@ bool LLAppViewerWin32::restoreErrorTrap() void LLAppViewerWin32::initCrashReporting(bool reportFreeze) { -#if defined(USE_SENTRY) +#if defined(AL_SENTRY) sentry_options_t* options = sentry_options_new(); sentry_options_set_dsn(options, SENTRY_DSN); sentry_options_set_release(options, LL_VIEWER_CHANNEL_AND_VERSION); diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 95bb08e6aa9f2096787d87f7eecae6b14cf96e57..a1a0061d8609f76d3ed6a2fa7774e1d68f1ddcc1 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -78,7 +78,9 @@ static S32 cube_channel = -1; static S32 diffuse_channel = -1; static S32 bump_channel = -1; -#define LL_BUMPLIST_MULTITHREADED 0 // TODO -- figure out why this doesn't work +// Enabled after changing LLViewerTexture::mNeedsCreateTexture to an +// LLAtomicBool; this should work just fine, now. HB +#define LL_BUMPLIST_MULTITHREADED 1 // static diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp index 937bbec58c94b9c608e3ccebf5489cfe2bf788e1..dba2f34d33ea51054ba7077256b59f64b3b728dc 100644 --- a/indra/newview/llestateinfomodel.cpp +++ b/indra/newview/llestateinfomodel.cpp @@ -74,6 +74,7 @@ bool LLEstateInfoModel::getDenyAgeUnverified() const { return getFlag(REGION_FL bool LLEstateInfoModel::getAllowVoiceChat() const { return getFlag(REGION_FLAGS_ALLOW_VOICE); } bool LLEstateInfoModel::getAllowAccessOverride() const { return getFlag(REGION_FLAGS_ALLOW_ACCESS_OVERRIDE); } bool LLEstateInfoModel::getAllowEnvironmentOverride() const { return getFlag(REGION_FLAGS_ALLOW_ENVIRONMENT_OVERRIDE); } +bool LLEstateInfoModel::getDenyScriptedAgents() const { return getFlag(REGION_FLAGS_DENY_BOTS); } void LLEstateInfoModel::setUseFixedSun(bool val) { setFlag(REGION_FLAGS_SUN_FIXED, val); } void LLEstateInfoModel::setIsExternallyVisible(bool val) { setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE, val); } @@ -83,6 +84,7 @@ void LLEstateInfoModel::setDenyAgeUnverified(bool val) { setFlag(REGION_FLAGS_D void LLEstateInfoModel::setAllowVoiceChat(bool val) { setFlag(REGION_FLAGS_ALLOW_VOICE, val); } void LLEstateInfoModel::setAllowAccessOverride(bool val) { setFlag(REGION_FLAGS_ALLOW_ACCESS_OVERRIDE, val); } void LLEstateInfoModel::setAllowEnvironmentOverride(bool val) { setFlag(REGION_FLAGS_ALLOW_ENVIRONMENT_OVERRIDE, val); } +void LLEstateInfoModel::setDenyScriptedAgents(bool val) { setFlag(REGION_FLAGS_DENY_BOTS, val); } void LLEstateInfoModel::update(const strings_t& strings) { @@ -148,6 +150,7 @@ void LLEstateInfoModel::commitEstateInfoCapsCoro(std::string url) body["allow_direct_teleport"] = getAllowDirectTeleport(); body["deny_anonymous"] = getDenyAnonymous(); body["deny_age_unverified"] = getDenyAgeUnverified(); + body["block_bots"] = getDenyScriptedAgents(); body["allow_voice_chat"] = getAllowVoiceChat(); body["override_public_access"] = getAllowAccessOverride(); @@ -223,6 +226,7 @@ std::string LLEstateInfoModel::getInfoDump() dump["allow_direct_teleport"] = getAllowDirectTeleport(); dump["deny_anonymous" ] = getDenyAnonymous(); dump["deny_age_unverified" ] = getDenyAgeUnverified(); + dump["block_bots" ] = getDenyScriptedAgents(); dump["allow_voice_chat" ] = getAllowVoiceChat(); dump["override_public_access"] = getAllowAccessOverride(); dump["override_environment"] = getAllowEnvironmentOverride(); diff --git a/indra/newview/llestateinfomodel.h b/indra/newview/llestateinfomodel.h index 8e644ea15d785d65af31156acaaeda893a290633..107a4042835311f01907d399071fb37781b96a3f 100644 --- a/indra/newview/llestateinfomodel.h +++ b/indra/newview/llestateinfomodel.h @@ -57,6 +57,7 @@ class LLEstateInfoModel final : public LLSingleton<LLEstateInfoModel> bool getAllowVoiceChat() const; bool getAllowAccessOverride() const; bool getAllowEnvironmentOverride() const; + bool getDenyScriptedAgents() const; const std::string& getName() const { return mName; } const LLUUID& getOwnerID() const { return mOwnerID; } @@ -72,6 +73,7 @@ class LLEstateInfoModel final : public LLSingleton<LLEstateInfoModel> void setAllowVoiceChat(bool val); void setAllowAccessOverride(bool val); void setAllowEnvironmentOverride(bool val); + void setDenyScriptedAgents(bool val); void setSunHour(F32 sun_hour) { mSunHour = sun_hour; } diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 815db449cf9fa31ae0ece17611ebdcc543bd89a6..adc2f7b4e78646ac367b4674797b6b90196344f3 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -878,7 +878,11 @@ void LLFavoritesBarCtrl::updateButtons(bool force_update) if (getChildList()->size() > 0) { //find last visible child to get the rightest button offset - child_list_const_reverse_iter_t last_visible_it = std::find_if(childs->rbegin(), childs->rend(), [](const LLView* viewp) { return viewp->getVisible(); }); + child_list_const_reverse_iter_t last_visible_it = + std::find_if( + childs->rbegin(), childs->rend(), + [](const child_list_t::value_type& child) + { return child->getVisible(); }); if(last_visible_it != childs->rend()) { last_right_edge = (*last_visible_it)->getRect().mRight; diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 341e6d4977dea0c2129832cd84a0c5d78160945f..a7311aa599734db570a1d7f4683d9b2d72bc95f4 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -1490,7 +1490,7 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter, bool blocking) // Hacky stubs designed to facilitate fake getSaveFile and getOpenFile with // static results, when we don't have a real filepicker. -BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename ) +BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename, bool blocking ) { // if local file browsing is turned off, return without opening dialog // (Even though this is a stub, I think we still should not return anything at all) diff --git a/indra/newview/llfloater360capture.cpp b/indra/newview/llfloater360capture.cpp index a4f0ae95a8a8cc60d48d6dbbb799995f4eeb9466..1359030362b581e98463c9069a3ae17c41721ebb 100644 --- a/indra/newview/llfloater360capture.cpp +++ b/indra/newview/llfloater360capture.cpp @@ -898,8 +898,10 @@ const std::string LLFloater360Capture::generate_proposed_filename() // this looks complex but it's straightforward - removes all non-alpha chars from a string // which in this case is the SL region name - we use it as a proposed filename but the user is free to change std::string region_name = region->getName(); - std::replace_if(region_name.begin(), region_name.end(), [](int c) { return !std::isalnum(c); }, '_'); - if (region_name.length() > 0) + std::replace_if(region_name.begin(), region_name.end(), + [](char c){ return ! std::isalnum(c); }, + '_'); + if (! region_name.empty()) { filename << region_name; filename << "_"; diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index 136a4b197b3f0f30f4d05deb6b26d6aa9e9154be..c53fe6cb4535aa280ed5bf7830cb0ccea2eda3ee 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -457,13 +457,18 @@ void LLFloaterAvatarPicker::findCoro(std::string url, LLUUID queryID, std::strin if (status || (status == LLCore::HttpStatus(HTTP_BAD_REQUEST))) { - LLFloaterAvatarPicker* floater = - LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker", name); - if (floater) - { - result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); - floater->processResponse(queryID, result); - } + result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); + } + else + { + result["failure_reason"] = status.toString(); + } + + LLFloaterAvatarPicker* floater = + LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker", name); + if (floater) + { + floater->processResponse(queryID, result); } } @@ -741,59 +746,67 @@ void LLFloaterAvatarPicker::processResponse(const LLUUID& query_id, const LLSD& { LLScrollListCtrl* search_results = getChild<LLScrollListCtrl>("SearchResults"); - LLSD agents = content["agents"]; - - // clear "Searching" label on first results - search_results->deleteAllItems(); - - LLSD item; - LLSD::array_const_iterator it = agents.beginArray(); - for ( ; it != agents.endArray(); ++it) - { - const LLSD& row = *it; - if (row["id"].asUUID() != gAgent.getID() || !mExcludeAgentFromSearchResults) - { - item["id"] = row["id"]; - LLSD& columns = item["columns"]; - columns[0]["column"] = "name"; - columns[0]["value"] = row["display_name"]; - columns[1]["column"] = "username"; - columns[1]["value"] = row["username"]; - search_results->addElement(item); - - // add the avatar name to our list - LLAvatarName avatar_name; - avatar_name.fromLLSD(row); - sAvatarNameMap[row["id"].asUUID()] = avatar_name; - } - } + // clear "Searching" label on first results + search_results->deleteAllItems(); - if (search_results->isEmpty()) - { - std::string name = "'" + getChild<LLUICtrl>("Edit")->getValue().asString() + "'"; - LLSD item; - item["id"] = LLUUID::null; - item["columns"][0]["column"] = "name"; - item["columns"][0]["value"] = name; - item["columns"][1]["column"] = "username"; - item["columns"][1]["value"] = getString("not_found_text"); - search_results->addElement(item); - search_results->setEnabled(false); - getChildView("ok_btn")->setEnabled(false); - } - else - { - getChildView("ok_btn")->setEnabled(true); - search_results->setEnabled(true); - search_results->sortByColumnIndex(1, TRUE); - std::string text = getChild<LLUICtrl>("Edit")->getValue().asString(); - if (!search_results->selectItemByLabel(text, TRUE, 1)) - { - search_results->selectFirstItem(); - } - onList(); - search_results->setFocus(TRUE); - } + if (content.has("failure_reason")) + { + getChild<LLScrollListCtrl>("SearchResults")->setCommentText(content["failure_reason"].asString()); + getChildView("ok_btn")->setEnabled(false); + } + else + { + LLSD agents = content["agents"]; + + LLSD item; + LLSD::array_const_iterator it = agents.beginArray(); + for (; it != agents.endArray(); ++it) + { + const LLSD& row = *it; + if (row["id"].asUUID() != gAgent.getID() || !mExcludeAgentFromSearchResults) + { + item["id"] = row["id"]; + LLSD& columns = item["columns"]; + columns[0]["column"] = "name"; + columns[0]["value"] = row["display_name"]; + columns[1]["column"] = "username"; + columns[1]["value"] = row["username"]; + search_results->addElement(item); + + // add the avatar name to our list + LLAvatarName avatar_name; + avatar_name.fromLLSD(row); + sAvatarNameMap[row["id"].asUUID()] = avatar_name; + } + } + + if (search_results->isEmpty()) + { + std::string name = "'" + getChild<LLUICtrl>("Edit")->getValue().asString() + "'"; + LLSD item; + item["id"] = LLUUID::null; + item["columns"][0]["column"] = "name"; + item["columns"][0]["value"] = name; + item["columns"][1]["column"] = "username"; + item["columns"][1]["value"] = getString("not_found_text"); + search_results->addElement(item); + search_results->setEnabled(false); + getChildView("ok_btn")->setEnabled(false); + } + else + { + getChildView("ok_btn")->setEnabled(true); + search_results->setEnabled(true); + search_results->sortByColumnIndex(1, TRUE); + std::string text = getChild<LLUICtrl>("Edit")->getValue().asString(); + if (!search_results->selectItemByLabel(text, TRUE, 1)) + { + search_results->selectFirstItem(); + } + onList(); + search_results->setFocus(TRUE); + } + } } } diff --git a/indra/newview/llfloateravatarrendersettings.cpp b/indra/newview/llfloateravatarrendersettings.cpp index f09d034d0498490079ef7acb59b98d1bb8359cd6..34a574d0af18e34fdf2e9d10b9299803fdf14810 100644 --- a/indra/newview/llfloateravatarrendersettings.cpp +++ b/indra/newview/llfloateravatarrendersettings.cpp @@ -89,6 +89,7 @@ BOOL LLFloaterAvatarRenderSettings::postBuild() LLFloater::postBuild(); mAvatarSettingsList = getChild<LLNameListCtrl>("render_settings_list"); mAvatarSettingsList->setRightMouseDownCallback(boost::bind(&LLFloaterAvatarRenderSettings::onAvatarListRightClick, this, _1, _2, _3)); + mAvatarSettingsList->setAlternateSort(); getChild<LLFilterEditor>("people_filter_input")->setCommitCallback(boost::bind(&LLFloaterAvatarRenderSettings::onFilterEdit, this, _2)); return TRUE; @@ -138,8 +139,8 @@ void LLFloaterAvatarRenderSettings::updateList() item_params.columns.add().value(av_name.getCompleteName()).column("name"); std::string setting = getString(iter->second == 1 ? "av_never_render" : "av_always_render"); item_params.columns.add().value(setting).column("setting"); - std::string timestamp = createTimestamp(LLRenderMuteList::getInstance()->getVisualMuteDate(iter->first)); - item_params.columns.add().value(timestamp).column("timestamp"); + S32 mute_date = LLRenderMuteList::getInstance()->getVisualMuteDate(iter->first); + item_params.columns.add().value(createTimestamp(mute_date)).column("timestamp").alt_value(std::to_string(mute_date)); mAvatarSettingsList->addNameItemRow(item_params); } } diff --git a/indra/newview/llfloaterdisplayname.cpp b/indra/newview/llfloaterdisplayname.cpp index bddaba18d64fce00f355826b8feb1cb65e560cca..226ec673536690d911d353e2328c0072f92cf2a8 100644 --- a/indra/newview/llfloaterdisplayname.cpp +++ b/indra/newview/llfloaterdisplayname.cpp @@ -47,6 +47,7 @@ class LLFloaterDisplayName final : public LLFloater virtual ~LLFloaterDisplayName() { } /*virtual*/ BOOL postBuild(); void onSave(); + void onReset(); void onCancel(); /*virtual*/ void onOpen(const LLSD& key); @@ -101,6 +102,7 @@ void LLFloaterDisplayName::onOpen(const LLSD& key) BOOL LLFloaterDisplayName::postBuild() { + getChild<LLUICtrl>("reset_btn")->setCommitCallback(boost::bind(&LLFloaterDisplayName::onReset, this)); getChild<LLUICtrl>("cancel_btn")->setCommitCallback(boost::bind(&LLFloaterDisplayName::onCancel, this)); getChild<LLUICtrl>("save_btn")->setCommitCallback(boost::bind(&LLFloaterDisplayName::onSave, this)); @@ -156,6 +158,20 @@ void LLFloaterDisplayName::onCancel() setVisible(false); } +void LLFloaterDisplayName::onReset() +{ + LLAvatarName av_name; + if (!LLAvatarNameCache::get(gAgent.getID(), &av_name)) + { + return; + } + getChild<LLUICtrl>("display_name_editor")->setValue(av_name.getCompleteName()); + + getChild<LLUICtrl>("display_name_confirm")->clear(); + getChild<LLUICtrl>("display_name_confirm")->setFocus(TRUE); +} + + void LLFloaterDisplayName::onSave() { std::string display_name_utf8 = getChild<LLUICtrl>("display_name_editor")->getValue().asString(); diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index b11ee9a4e72238f328b36eb2af7fc82e6a41ccaf..91524e76a9728b4db968dac135b0b38db533a628 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -39,7 +39,6 @@ #include "llsearcheditor.h" #include "llsetkeybinddialog.h" #include "llkeyconflict.h" -#include "llviewerbuildconfig.h" class LLConversationLogObserver; class LLPanelPreference; @@ -206,7 +205,7 @@ class LLFloaterPreference final : public LLFloater, public LLAvatarPropertiesObs void updateMaxComplexity(); static bool loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map); -#if !LL_HAVOK +#ifndef LL_HAVOK void refreshGridList(); void onClickAddGrid(); void onClickActivateGrid(); diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 4222cf039904da7a0b56631522fa1e243711c9d6..cbdab11ca72daa930569f74d168d9fd9349a782c 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -656,11 +656,11 @@ void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region) } // call refresh from region on all panels - std::for_each( - mInfoPanels.begin(), - mInfoPanels.end(), - [region](LLPanelRegionInfo* panelp) { panelp->refreshFromRegion(region); }); - mEnvironmentPanel->refreshFromRegion(region); + for (const auto& infoPanel : mInfoPanels) + { + infoPanel->refreshFromRegion(region); + } + mEnvironmentPanel->refreshFromRegion(region); } // public @@ -1882,6 +1882,7 @@ BOOL LLPanelEstateInfo::postBuild() initCtrl("allow_direct_teleport"); initCtrl("limit_payment"); initCtrl("limit_age_verified"); + initCtrl("limit_bots"); initCtrl("voice_chat_check"); initCtrl("parcel_access_override"); @@ -1905,12 +1906,14 @@ void LLPanelEstateInfo::refresh() getChildView("Only Allow")->setEnabled(public_access); getChildView("limit_payment")->setEnabled(public_access); getChildView("limit_age_verified")->setEnabled(public_access); + getChildView("limit_bots")->setEnabled(public_access); // if this is set to false, then the limit fields are meaningless and should be turned off if (public_access == false) { getChild<LLUICtrl>("limit_payment")->setValue(false); getChild<LLUICtrl>("limit_age_verified")->setValue(false); + getChild<LLUICtrl>("limit_bots")->setValue(false); } } @@ -1927,6 +1930,7 @@ void LLPanelEstateInfo::refreshFromEstate() getChild<LLUICtrl>("limit_payment")->setValue(estate_info.getDenyAnonymous()); getChild<LLUICtrl>("limit_age_verified")->setValue(estate_info.getDenyAgeUnverified()); getChild<LLUICtrl>("parcel_access_override")->setValue(estate_info.getAllowAccessOverride()); + getChild<LLUICtrl>("limit_bots")->setValue(estate_info.getDenyScriptedAgents()); // Ensure appriopriate state of the management UI updateControls(gAgent.getRegion()); @@ -1970,6 +1974,7 @@ bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, con estate_info.setDenyAgeUnverified(getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean()); estate_info.setAllowVoiceChat(getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean()); estate_info.setAllowAccessOverride(getChild<LLUICtrl>("parcel_access_override")->getValue().asBoolean()); + estate_info.setDenyScriptedAgents(getChild<LLUICtrl>("limit_bots")->getValue().asBoolean()); // JIGGLYPUFF //estate_info.setAllowAccessOverride(getChild<LLUICtrl>("")->getValue().asBoolean()); // send the update to sim diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index 40cf34acc7f4307ff1807f0d5b4d637ce7be9af5..9683a3b9ae361dae241c12e9047e66ae8fece7d3 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -771,7 +771,7 @@ struct IsGesturePlaying { bool operator()(const LLMultiGesture* gesture) const { - return gesture->mPlaying ? true : false; + return bool(gesture->mPlaying); } }; diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp index 1ecf8206c1cdf87f36ecf533a17cfdfc585c772e..eae708500bbd6e63b0b6c6b71d80d9c6f15f559c 100644 --- a/indra/newview/llhudnametag.cpp +++ b/indra/newview/llhudnametag.cpp @@ -56,7 +56,6 @@ const F32 HORIZONTAL_PADDING = 16.f; const F32 VERTICAL_PADDING = 12.f; const F32 LINE_PADDING = 3.f; // aka "leading" const F32 BUFFER_SIZE = 2.f; -const F32 HUD_TEXT_MAX_WIDTH = 190.f; const S32 NUM_OVERLAP_ITERATIONS = 10; const F32 POSITION_DAMPING_TC = 0.2f; const F32 MAX_STABLE_CAMERA_VELOCITY = 0.1f; @@ -67,6 +66,8 @@ const F32 LOD_2_SCREEN_COVERAGE = 0.40f; std::set<LLPointer<LLHUDNameTag> > LLHUDNameTag::sTextObjects; std::vector<LLPointer<LLHUDNameTag> > LLHUDNameTag::sVisibleTextObjects; BOOL LLHUDNameTag::sDisplayText = TRUE ; +const F32 LLHUDNameTag::NAMETAG_MAX_WIDTH = 298.f; +const F32 LLHUDNameTag::HUD_TEXT_MAX_WIDTH = 190.f; bool llhudnametag_further_away::operator()(const LLPointer<LLHUDNameTag>& lhs, const LLPointer<LLHUDNameTag>& rhs) const { @@ -418,7 +419,8 @@ void LLHUDNameTag::addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style, const LLFontGL* font, - const bool use_ellipses) + const bool use_ellipses, + F32 max_pixels) { LLWString wline = utf8str_to_wstring(text_utf8); if (!wline.empty()) @@ -435,7 +437,7 @@ void LLHUDNameTag::addLine(const std::string &text_utf8, tokenizer tokens(wline, sep); tokenizer::iterator iter = tokens.begin(); - const F32 max_pixels = HUD_TEXT_MAX_WIDTH; + max_pixels = llmin(max_pixels, NAMETAG_MAX_WIDTH); while (iter != tokens.end()) { U32 line_length = 0; @@ -492,7 +494,7 @@ void LLHUDNameTag::setLabel(const std::string &label_utf8) addLabel(label_utf8); } -void LLHUDNameTag::addLabel(const std::string& label_utf8) +void LLHUDNameTag::addLabel(const std::string& label_utf8, F32 max_pixels) { LLWString wstr = utf8string_to_wstring(label_utf8); if (!wstr.empty()) @@ -506,13 +508,15 @@ void LLHUDNameTag::addLabel(const std::string& label_utf8) tokenizer tokens(wstr, sep); tokenizer::iterator iter = tokens.begin(); + max_pixels = llmin(max_pixels, NAMETAG_MAX_WIDTH); + while (iter != tokens.end()) { U32 line_length = 0; do { S32 segment_length = mFontp->maxDrawableChars(iter->substr(line_length).c_str(), - HUD_TEXT_MAX_WIDTH, wstr.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE); + max_pixels, wstr.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE); LLHUDTextSegment segment(iter->substr(line_length, segment_length), LLFontGL::NORMAL, mColor, mFontp); mLabelSegments.push_back(segment); line_length += segment_length; @@ -703,7 +707,7 @@ void LLHUDNameTag::updateSize() const LLFontGL* fontp = iter->mFont; height += fontp->getLineHeight(); height += LINE_PADDING; - width = llmax(width, llmin(iter->getWidth(fontp), HUD_TEXT_MAX_WIDTH)); + width = llmax(width, llmin(iter->getWidth(fontp), NAMETAG_MAX_WIDTH)); ++iter; } @@ -717,7 +721,7 @@ void LLHUDNameTag::updateSize() while (iter != mLabelSegments.end()) { height += mFontp->getLineHeight(); - width = llmax(width, llmin(iter->getWidth(mFontp), HUD_TEXT_MAX_WIDTH)); + width = llmax(width, llmin(iter->getWidth(mFontp), NAMETAG_MAX_WIDTH)); ++iter; } diff --git a/indra/newview/llhudnametag.h b/indra/newview/llhudnametag.h index 4e5dd26d38ee9da1a04b94e3b5f4ae2d9a8dd721..f825099fa192d690b13333495bdd9da3be7d0f35 100644 --- a/indra/newview/llhudnametag.h +++ b/indra/newview/llhudnametag.h @@ -85,6 +85,9 @@ class LLHUDNameTag final : public LLHUDObject ALIGN_VERT_CENTER } EVertAlignment; + static const F32 NAMETAG_MAX_WIDTH; // 298px, made to fit 31 M's + static const F32 HUD_TEXT_MAX_WIDTH; // 190px + public: // Set entire string, eliminating existing lines void setString(const std::string& text_utf8); @@ -92,11 +95,17 @@ class LLHUDNameTag final : public LLHUDObject void clearString(); // Add text a line at a time, allowing custom formatting - void addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL, const LLFontGL* font = NULL, const bool use_ellipses = false); + void addLine( + const std::string &text_utf8, + const LLColor4& color, + const LLFontGL::StyleFlags style = LLFontGL::NORMAL, + const LLFontGL* font = NULL, + const bool use_ellipses = false, + F32 max_pixels = HUD_TEXT_MAX_WIDTH); // For bubble chat, set the part above the chat text void setLabel(const std::string& label_utf8); - void addLabel(const std::string& label_utf8); + void addLabel(const std::string& label_utf8, F32 max_pixels = HUD_TEXT_MAX_WIDTH); // Sets the default font for lines with no font specified void setFont(const LLFontGL* font); diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp index e112293165180c14432cddf4800200f761a13816..67c7d5058c29d3609f81a7b4316ce935482099ec 100644 --- a/indra/newview/llimprocessing.cpp +++ b/indra/newview/llimprocessing.cpp @@ -606,7 +606,9 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, dialog, parent_estate_id, region_id, - position); + position, + false, // is_region_msg + timestamp); if (!gIMMgr->isDNDMessageSend(session_id)) { @@ -688,7 +690,8 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, parent_estate_id, region_id, position, - region_message); + region_message, + timestamp); } else { @@ -722,7 +725,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, region_id, position, false, - LLSD().with("announcement", true) + 0 ); } @@ -1273,7 +1276,9 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, IM_SESSION_INVITE, parent_estate_id, region_id, - position); + position, + false, // is_region_msg + timestamp); } else { @@ -1293,12 +1298,14 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, from_id, name, buffer, - IM_OFFLINE == offline, - ll_safe_string((char*)binary_bucket), + (IM_OFFLINE == offline), + ll_safe_string((char*)binary_bucket), // session name IM_SESSION_INVITE, parent_estate_id, region_id, - position); + position, + false, // is_region_msg + timestamp); } break; diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index f002098653d435241dd3d6470bf329072675100f..030939e924d38ca20d22dddcd4c5844b59e40312 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1,25 +1,25 @@ -/** +/** * @file LLIMMgr.cpp * @brief Container for Instant Messaging * * $LicenseInfo:firstyear=2001&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -41,6 +41,7 @@ #include "llstring.h" #include "lltextutil.h" #include "lltrans.h" +#include "lltranslate.h" #include "lluictrlfactory.h" #include "llfloaterimsessiontab.h" #include "llagent.h" @@ -82,11 +83,17 @@ const static std::string ADHOC_NAME_SUFFIX(" Conference"); const static std::string NEARBY_P2P_BY_OTHER("nearby_P2P_by_other"); const static std::string NEARBY_P2P_BY_AGENT("nearby_P2P_by_agent"); +// Markers inserted around translated part of chat text +const static std::string XL8_START_TAG(" ("); +const static std::string XL8_END_TAG(")"); +const S32 XL8_PADDING = 3; // XL8_START_TAG.size() + XL8_END_TAG.size() + /** Timeout of outgoing session initialization (in seconds) */ const static U32 SESSION_INITIALIZATION_TIMEOUT = 30; void startConfrenceCoro(std::string url, LLUUID tempSessionId, LLUUID creatorId, LLUUID otherParticipantId, LLSD agents); void chatterBoxInvitationCoro(std::string url, LLUUID sessionId, LLIMMgr::EInvitationType invitationType); +void chatterBoxHistoryCoro(std::string url, LLUUID sessionId, std::string from, std::string message, U32 timestamp); void start_deprecated_conference_chat(const LLUUID& temp_session_id, const LLUUID& creator_id, const LLUUID& other_participant_id, const LLSD& agents_to_invite); const LLUUID LLOutgoingCallDialog::OCD_KEY = LLUUID("7CF78E11-0CFE-498D-ADB9-1417BF03DDB4"); @@ -117,7 +124,7 @@ void process_dnd_im(const LLSD& notification) LLUUID sessionID = data["SESSION_ID"].asUUID(); LLUUID fromID = data["FROM_ID"].asUUID(); - //re-create the IM session if needed + //re-create the IM session if needed //(when coming out of DND mode upon app restart) if(!gIMMgr->hasSession(sessionID)) { @@ -128,13 +135,13 @@ void process_dnd_im(const LLSD& notification) { name = av_name.getDisplayName(); } - - - LLIMModel::getInstance()->newSession(sessionID, - name, - IM_NOTHING_SPECIAL, - fromID, - false, + + + LLIMModel::getInstance()->newSession(sessionID, + name, + IM_NOTHING_SPECIAL, + fromID, + false, false); //will need slight refactor to retrieve whether offline message or not (assume online for now) } @@ -319,8 +326,8 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) } else { - if (is_dnd_msg && (ON_TOP == conversations_floater_status || - NOT_ON_TOP == conversations_floater_status || + if (is_dnd_msg && (ON_TOP == conversations_floater_status || + NOT_ON_TOP == conversations_floater_status || CLOSED == conversations_floater_status)) { im_box->highlightConversationItemWidget(session_id, true); @@ -379,7 +386,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) } if (store_dnd_message) { - // If in DND mode, allow notification to be stored so upon DND exit + // If in DND mode, allow notification to be stored so upon DND exit // the user will be notified with some limitations (see 'is_dnd_msg' flag checks) if(session_id.notNull() && participant_id.notNull() @@ -400,7 +407,7 @@ void startConfrenceCoro(std::string url, { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("TwitterConnect", httpPolicy)); + httpAdapter(std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("ConferenceChatStart", httpPolicy)); LLCore::HttpRequest::ptr_t httpRequest(std::make_shared<LLCore::HttpRequest>()); LLSD postData; @@ -440,7 +447,7 @@ void chatterBoxInvitationCoro(std::string url, LLUUID sessionId, LLIMMgr::EInvit { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("TwitterConnect", httpPolicy)); + httpAdapter(std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("ConferenceInviteStart", httpPolicy)); LLCore::HttpRequest::ptr_t httpRequest(std::make_shared<LLCore::HttpRequest>()); LLSD postData; @@ -518,8 +525,124 @@ void chatterBoxInvitationCoro(std::string url, LLUUID sessionId, LLIMMgr::EInvit } +void translateSuccess(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text, + U64 time_n_flags, std::string originalMsg, std::string expectLang, std::string translation, const std::string detected_language) +{ + std::string message_txt(utf8_text); + // filter out non-interesting responses + if (!translation.empty() + && ((detected_language.empty()) || (expectLang != detected_language)) + && (LLStringUtil::compareInsensitive(translation, originalMsg) != 0)) + { // Note - if this format changes, also fix code in addMessagesFromServerHistory() + message_txt += XL8_START_TAG + LLTranslate::removeNoTranslateTags(translation) + XL8_END_TAG; + } + + // Extract info packed in time_n_flags + bool log2file = (bool)(time_n_flags & (1LL << 32)); + bool is_region_msg = (bool)(time_n_flags & (1LL << 33)); + U32 time_stamp = (U32)(time_n_flags & 0x00000000ffffffff); + + LLIMModel::getInstance()->processAddingMessage(session_id, from, from_id, message_txt, log2file, is_region_msg, time_stamp); +} -LLIMModel::LLIMModel() +void translateFailure(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text, + U64 time_n_flags, int status, const std::string err_msg) +{ + std::string message_txt(utf8_text); + std::string msg = LLTrans::getString("TranslationFailed", LLSD().with("[REASON]", err_msg)); + LLStringUtil::replaceString(msg, "\n", " "); // we want one-line error messages + message_txt += XL8_START_TAG + msg + XL8_END_TAG; + + // Extract info packed in time_n_flags + bool log2file = (bool)(time_n_flags & (1LL << 32)); + bool is_region_msg = (bool)(time_n_flags & (1LL << 33)); + U32 time_stamp = (U32)(time_n_flags & 0x00000000ffffffff); + + LLIMModel::getInstance()->processAddingMessage(session_id, from, from_id, message_txt, log2file, is_region_msg, time_stamp); +} + +void chatterBoxHistoryCoro(std::string url, LLUUID sessionId, std::string from, std::string message, U32 timestamp) +{ // if parameters from, message and timestamp have values, they are a message that opened chat + LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t + httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("ChatHistory", httpPolicy)); + LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + + LLSD postData; + postData["method"] = "fetch history"; + postData["session-id"] = sessionId; + + LL_DEBUGS("ChatHistory") << sessionId << ": Chat history posting " << postData << " to " << url + << ", from " << from << ", message " << message << ", timestamp " << (S32)timestamp << LL_ENDL; + + LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData); + + LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; + LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + + if (!status) + { + LL_WARNS("ChatHistory") << sessionId << ": Bad HTTP response in chatterBoxHistoryCoro" + << ", results: " << httpResults << LL_ENDL; + return; + } + + // Add history to IM session + LLSD history = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_CONTENT]; + + LL_DEBUGS("ChatHistory") << sessionId << ": Chat server history fetch returned " << history << LL_ENDL; + + try + { + LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(sessionId); + if (session && history.isArray()) + { // Result array is sorted oldest to newest + if (history.size() > 0) + { // History from the chat server has an integer 'time' value timestamp. Create 'datetime' string which will match + // what we have from the local history cache + for (LLSD::array_iterator cur_server_hist = history.beginArray(), endLists = history.endArray(); + cur_server_hist != endLists; + cur_server_hist++) + { + if ((*cur_server_hist).isMap()) + { // Take the 'time' value from the server and make the date-time string that will be in local cache log files + // {'from_id':u7aa8c222-8a81-450e-b3d1-9c28491ef717,'message':'Can you hear me now?','from':'Chat Tester','num':i86,'time':r1.66501e+09} + U32 timestamp = (U32)((*cur_server_hist)[LL_IM_TIME].asInteger()); + (*cur_server_hist)[LL_IM_DATE_TIME] = LLLogChat::timestamp2LogString(timestamp, true); + } + } + + session->addMessagesFromServerHistory(history, from, message, timestamp); + + // Display the newly added messages + LLFloaterIMSession* floater = LLFloaterReg::findTypedInstance<LLFloaterIMSession>("impanel", sessionId); + if (floater && floater->isInVisibleChain()) + { + floater->updateMessages(); + } + } + else + { + LL_DEBUGS("ChatHistory") << sessionId << ": Empty history from chat server, nothing to add" << LL_ENDL; + } + } + else if (session && !history.isArray()) + { + LL_WARNS("ChatHistory") << sessionId << ": Bad array data fetching chat history" << LL_ENDL; + } + else + { + LL_WARNS("ChatHistory") << sessionId << ": Unable to find session fetching chat history" << LL_ENDL; + } + } + catch (...) + { + LOG_UNHANDLED_EXCEPTION("chatterBoxHistoryCoro"); + LL_WARNS("ChatHistory") << "chatterBoxHistoryCoro unhandled exception while processing data for session " << sessionId << LL_ENDL; + } +} + +LLIMModel::LLIMModel() { addNewMsgCallback(boost::bind(&LLFloaterIMSession::newIMCallback, _1)); addNewMsgCallback(boost::bind(&on_new_message, _1)); @@ -564,25 +687,25 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& else { mSessionType = ADHOC_SESSION; - } + } } if(mVoiceChannel) { mVoiceChannelStateChangeConnection = mVoiceChannel->setStateChangedCallback(boost::bind(&LLIMSession::onVoiceChannelStateChanged, this, _1, _2, _3)); } - + mSpeakers = new LLIMSpeakerMgr(mVoiceChannel); // All participants will be added to the list of people we've recently interacted with. - // we need to add only _active_ speakers...so comment this. + // we need to add only _active_ speakers...so comment this. // may delete this later on cleanup //mSpeakers->addListener(&LLRecentPeople::instance(), "add"); //we need to wait for session initialization for outgoing ad-hoc and group chat session //correct session id for initiated ad-hoc chat will be received from the server - if (!LLIMModel::getInstance()->sendStartSession(mSessionID, mOtherParticipantID, + if (!LLIMModel::getInstance()->sendStartSession(mSessionID, mOtherParticipantID, mInitialTargetIDs, mType)) { //we don't need to wait for any responses @@ -664,7 +787,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES LLStringUtil::format_map_t string_args; string_args["[NAME]"] = other_avatar_name; message = LLTrans::getString("name_started_call", string_args); - LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message); + LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message); break; } case LLVoiceChannel::STATE_CONNECTED : @@ -768,20 +891,25 @@ void LLIMModel::LLIMSession::sessionInitReplyReceived(const LLUUID& new_session_ } } -void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, - const std::string& time, const bool is_history, bool is_region_msg, const LLSD& bonus) +void LLIMModel::LLIMSession::addMessage(const std::string& from, + const LLUUID& from_id, + const std::string& utf8_text, + const std::string& time, + const bool is_history, // comes from a history file or chat server + const bool is_region_msg, + const U32 timestamp) // may be zero { LLSD message; message["from"] = from; message["from_id"] = from_id; message["message"] = utf8_text; - message["time"] = time; - message["index"] = (LLSD::Integer)mMsgs.size(); + message["time"] = time; // string used in display, may be full data YYYY/MM/DD HH:MM or just HH:MM + message["timestamp"] = (S32)timestamp; // use string? LLLogChat::timestamp2LogString(timestamp, true); + message["index"] = (LLSD::Integer)mMsgs.size(); message["is_history"] = is_history; message["is_region_msg"] = is_region_msg; - message["is_announcement"] = bonus.has("announcement"); - mMsgs.push_front(message); + mMsgs.push_front(message); // Add most recent messages to the front of mMsgs if (mSpeakers && from_id.notNull()) { @@ -790,35 +918,281 @@ void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& f } } -void LLIMModel::LLIMSession::addMessagesFromHistory(const std::list<LLSD>& history) +void LLIMModel::LLIMSession::addMessagesFromHistoryCache(const chat_message_list_t& history) { - std::list<LLSD>::const_iterator it = history.begin(); - while (it != history.end()) - { - const LLSD& msg = *it; + // Add the messages from the local cached chat history to the session window + for (const auto& msg : history) + { + std::string from = msg[LL_IM_FROM]; + LLUUID from_id; + if (msg[LL_IM_FROM_ID].isDefined()) + { + from_id = msg[LL_IM_FROM_ID].asUUID(); + } + else + { // convert it to a legacy name if we have a complete name + std::string legacy_name = gCacheName->buildLegacyName(from); + from_id = LLAvatarNameCache::getInstance()->findIdByName(legacy_name); + } - std::string from = msg[LL_IM_FROM]; - LLUUID from_id; - if (msg[LL_IM_FROM_ID].isDefined()) - { - from_id = msg[LL_IM_FROM_ID].asUUID(); - } - else - { - // convert it to a legacy name if we have a complete name - std::string legacy_name = gCacheName->buildLegacyName(from); - from_id = LLAvatarNameCache::getInstance()->findIdByName(legacy_name); - } + // Save the last minute of messages so we can merge with the chat server history. + // Really would be nice to have a numeric timestamp in the local cached chat file + const std::string & msg_time_str = msg[LL_IM_DATE_TIME].asString(); + if (mLastHistoryCacheDateTime != msg_time_str) + { + mLastHistoryCacheDateTime = msg_time_str; // Reset to the new time + mLastHistoryCacheMsgs.clear(); + } + mLastHistoryCacheMsgs.push_front(msg); + LL_DEBUGS("ChatHistory") << mSessionID << ": Adding history cache message: " << msg << LL_ENDL; + + // Add message from history cache to the display + addMessage(from, from_id, msg[LL_IM_TEXT], msg[LL_IM_TIME], true, false, 0); // from history data, not region message, no timestamp + } +} + +void LLIMModel::LLIMSession::addMessagesFromServerHistory(const LLSD& history, // Array of chat messages from chat server + const std::string& target_from, // Sender of message that opened chat + const std::string& target_message, // Message text that opened chat + U32 timestamp) // timestamp of message that opened chat +{ // Add messages from history returned by the chat server. + + // The session mMsgs may contain chat messages from the local history cache file, and possibly one or more newly + // arrived chat messages. If the chat window was manually opened, these will be empty and history can + // more easily merged. The history from the server, however, may overlap what is in the file and those must also be merged. + + // At this point, the session mMsgs can have + // no messages + // nothing from history file cache, but one or more very recently arrived messages, + // messages from history file cache, no recent chat + // messages from history file cache, one or more very recent messages + // + // The chat history from server can possibly contain: + // no messages + // messages that start back before anything in the local file (obscure case, but possible) + // messages that match messages from the history file cache + // messages from the last hour, new to the viewer + // one or more messages that match most recently received chat (the one that opened the window) + // In other words: + // messages from chat server may or may not match what we already have in mMsgs + // We can drop anything that is during the time span covered by the local cache file + // To keep things simple, drop any chat data older than the local cache file + + if (!history.isArray()) + { + LL_WARNS("ChatHistory") << mSessionID << ": Unexpected history data not array, type " << (S32)history.type() << LL_ENDL; + return; + } - std::string timestamp = msg[LL_IM_TIME]; - std::string text = msg[LL_IM_TEXT]; + if (history.size() == 0) + { // If history is empty + LL_DEBUGS("ChatHistory") << mSessionID << ": addMessagesFromServerHistory() has empty history, nothing to merge" << LL_ENDL; + return; + } - addMessage(from, from_id, text, timestamp, true); + if (history.size() == 1 && // Server chat history has one entry, + target_from.length() > 0 && // and we have a chat message that just arrived + mMsgs.size() > 0) // and we have some data in the window - assume the history message is there. + { // This is the common case where a group chat is silent for a while, and then one message is sent. + LL_DEBUGS("ChatHistory") << mSessionID << ": addMessagesFromServerHistory() only has chat message just received." << LL_ENDL; + return; + } - it++; - } + LL_DEBUGS("ChatHistory") << mSessionID << ": addMessagesFromServerHistory() starting with mMsg.size() " << mMsgs.size() + << " adding history with " << history.size() << " messages" + << ", target_from: " << target_from + << ", target_message: " << target_message + << ", timestamp: " << (S32)timestamp << LL_ENDL; + + // At start of merging, mMsgs is either empty, has some chat messages read from a local cache file, and may have + // one or more messages that just arrived from the server. + U32 match_timestamp = 0; + chat_message_list_t shift_msgs; + if (mMsgs.size() > 0 && + target_from.length() > 0 + && target_message.length() > 0) + { // Find where to insert the history messages by popping off a few in the session. + // The most common case is one duplciate message, the one that opens a chat session + while (mMsgs.size() > 0) + { + // The "time" value from mMsgs is a string, either just time HH:MM or a full date and time + LLSD cur_msg = mMsgs.front(); // Get most recent message from the chat display (front of mMsgs list) + + if (cur_msg.isMap()) + { + LL_DEBUGS("ChatHistoryCompare") << mSessionID << ": Finding insertion point, looking at cur_msg: " << cur_msg << LL_ENDL; + + match_timestamp = cur_msg["timestamp"].asInteger(); // get timestamp of message in the session, may be zero + if ((S32)timestamp > match_timestamp) + { + LL_DEBUGS("ChatHistory") << mSessionID << ": found older chat message: " << cur_msg + << ", timestamp " << (S32)timestamp + << " vs. match_timestamp " << match_timestamp + << ", shift_msgs size is " << shift_msgs.size() << LL_ENDL; + break; + } + // Have the matching message or one more recent: these need to be at the end + shift_msgs.push_front(cur_msg); // Move chat message to temp list. + mMsgs.pop_front(); // Normally this is just one message + LL_DEBUGS("ChatHistory") << mSessionID << ": shifting chat message " << cur_msg + << " to be inserted at end, shift_msgs size is " << shift_msgs.size() + << ", match_timestamp " << match_timestamp + << ", timestamp " << (S32)timestamp << LL_ENDL; + } + else + { + LL_DEBUGS("ChatHistory") << mSessionID << ": Unexpected non-map entry in session messages: " << cur_msg << LL_ENDL; + return; + } + } + } + + // Now merge messages from server history data into the session display. The history data + // from the local file may overlap with the chat messages from the server. + // Drop any messages from the chat server history that are before the latest one from the local history file. + // Unfortunately, messages from the local file don't have timestamps - just datetime strings + LLSD::array_const_iterator cur_history_iter = history.beginArray(); + while (cur_history_iter != history.endArray()) + { + const LLSD &cur_server_hist = *cur_history_iter; + cur_history_iter++; + + if (cur_server_hist.isMap()) + { // Each server history entry looks like + // { 'from':'Laggy Avatar', 'from_id' : u72345678 - 744f - 43b9 - 98af - b06f1c76ddda, 'index' : i24, 'is_history' : 1, 'message' : 'That was slow', 'time' : '02/13/2023 10:03', 'timestamp' : i1676311419 } + + // If we reach the message that opened our window, stop adding messages + U32 history_msg_timestamp = (U32)cur_server_hist[LL_IM_TIME].asInteger(); + if ((match_timestamp > 0 && match_timestamp <= history_msg_timestamp) || + (timestamp > 0 && timestamp <= history_msg_timestamp)) + { // we found the message we matched, so stop inserting from chat server history + LL_DEBUGS("ChatHistoryCompare") << "Found end of chat history insertion with match_timestamp " << (S32)match_timestamp + << " vs. history_msg_timestamp " << (S32)history_msg_timestamp + << " vs. timestamp " << (S32)timestamp + << LL_ENDL; + break; + } + LL_DEBUGS("ChatHistoryCompare") << "Compared match_timestamp " << (S32)match_timestamp + << " vs. history_msg_timestamp " << (S32)history_msg_timestamp << LL_ENDL; + + bool add_chat_to_conversation = true; + if (!mLastHistoryCacheDateTime.empty()) + { // Skip past the any from server that are older than what we already read from the history file. + std::string history_datetime = cur_server_hist[LL_IM_DATE_TIME].asString(); + if (history_datetime.empty()) + { + history_datetime = cur_server_hist[LL_IM_TIME].asString(); + } + + if (history_datetime < mLastHistoryCacheDateTime) + { + LL_DEBUGS("ChatHistoryCompare") << "Skipping message from chat server history since it's older than messages the session already has." + << history_datetime << " vs " << mLastHistoryCacheDateTime << LL_ENDL; + add_chat_to_conversation = false; + } + else if (history_datetime > mLastHistoryCacheDateTime) + { // The message from the chat server is more recent than the last one from the local cache file. Add it + LL_DEBUGS("ChatHistoryCompare") << "Found message dated " + << history_datetime << " vs " << mLastHistoryCacheDateTime + << ", adding new message from chat server history " << cur_server_hist << LL_ENDL; + } + else // (history_datetime == mLastHistoryCacheDateTime) + { // Messages are in the same minute as the last from the cache log file. + const std::string & history_msg_text = cur_server_hist[LL_IM_TEXT]; + + // Look in the saved messages from the history file that have the same time + for (const auto& scan_msg : mLastHistoryCacheMsgs) + { + LL_DEBUGS("ChatHistoryCompare") << "comparing messages " << scan_msg[LL_IM_TEXT] + << " with " << cur_server_hist << LL_ENDL; + if (scan_msg.size() > 0) + { // Extra work ... the history_msg_text value may have been translated, i.e. "I am confused (je suis confus)" + // while the server history will only have the first part "I am confused" + std::string target_compare(scan_msg[LL_IM_TEXT]); + if (target_compare.size() > history_msg_text.size() + XL8_PADDING && + target_compare.substr(history_msg_text.size(), XL8_START_TAG.size()) == XL8_START_TAG && + target_compare.substr(target_compare.size() - XL8_END_TAG.size()) == XL8_END_TAG) + { // This really looks like a "translated string (cadena traducida)" so just compare the source part + LL_DEBUGS("ChatHistory") << mSessionID << ": Found translated chat " << target_compare + << " when comparing to history " << history_msg_text + << ", will truncate" << LL_ENDL; + target_compare = target_compare.substr(0, history_msg_text.size()); + } + if (history_msg_text == target_compare) + { // Found a match, so don't add a duplicate chat message to the window + LL_DEBUGS("ChatHistory") << mSessionID << ": Found duplicate message text " << history_msg_text + << " : " << (S32)history_msg_timestamp << ", matching datetime " << history_datetime << LL_ENDL; + add_chat_to_conversation = false; + break; + } + } + } + } + } + + LLUUID sender_id = cur_server_hist[LL_IM_FROM_ID].asUUID(); + if (add_chat_to_conversation) + { // Check if they're muted + if (LLMuteList::getInstance()->isMuted(sender_id, LLMute::flagTextChat)) + { + add_chat_to_conversation = false; + LL_DEBUGS("ChatHistory") << mSessionID << ": Skipped adding chat from " << sender_id + << " as muted, message: " << cur_server_hist + << LL_ENDL; + } + } + + if (add_chat_to_conversation) + { // Finally add message to the chat session + std::string chat_time_str = LLConversation::createTimestamp((U64Seconds)history_msg_timestamp); + std::string sender_name = cur_server_hist[LL_IM_FROM].asString(); + + std::string history_msg_text = cur_server_hist[LL_IM_TEXT].asString(); + LLSD message; + message["from"] = sender_name; + message["from_id"] = sender_id; + message["message"] = history_msg_text; + message["time"] = chat_time_str; + message["timestamp"] = (S32)history_msg_timestamp; + message["index"] = (LLSD::Integer)mMsgs.size(); + message["is_history"] = true; + mMsgs.push_front(message); + + LL_DEBUGS("ChatHistory") << mSessionID << ": push_front() adding group chat history message " << message << LL_ENDL; + + // Add chat history messages to the local cache file, only in the case where we opened the chat window + // Need to solve the logic around messages that arrive and open chat - at this point, they've already been added to the + // local history cache file. If we append messages here, it will be out of order. + if (target_from.empty() && target_message.empty()) + { + LLIMModel::getInstance()->logToFile(LLIMModel::getInstance()->getHistoryFileName(mSessionID), + sender_name, sender_id, history_msg_text); + } + } + } + } + + S32 shifted_size = shift_msgs.size(); + while (shift_msgs.size() > 0) + { // Finally add back any new messages, and tweak the index value to be correct. + LLSD newer_message = shift_msgs.front(); + shift_msgs.pop_front(); + S32 old_index = newer_message["index"]; + newer_message["index"] = (LLSD::Integer)mMsgs.size(); // Update the index to match the new position in the conversation + LL_DEBUGS("ChatHistory") << mSessionID << ": Re-adding newest group chat history messages from " << newer_message["from"] + << ", text: " << newer_message["message"] + << " old index " << old_index << ", new index " << newer_message["index"] << LL_ENDL; + mMsgs.push_front(newer_message); + } + + LL_DEBUGS("ChatHistory") << mSessionID << ": addMessagesFromServerHistory() exiting with mMsg.size() " << mMsgs.size() + << ", shifted " << shifted_size << " messages" << LL_ENDL; + + mLastHistoryCacheDateTime.clear(); // Don't need this data + mLastHistoryCacheMsgs.clear(); } + void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata) { if (!userdata) return; @@ -827,26 +1201,29 @@ void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const if (type == LLLogChat::LOG_LINE) { - self->addMessage("", LLSD(), msg["message"].asString(), "", true); + LL_DEBUGS("ChatHistory") << "chatFromLogFile() adding LOG_LINE message from " << msg << LL_ENDL; + self->addMessage("", LLSD(), msg["message"].asString(), "", true, false, 0); // from history data, not region message, no timestamp } else if (type == LLLogChat::LOG_LLSD) { - self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString(), true); + LL_DEBUGS("ChatHistory") << "chatFromLogFile() adding LOG_LLSD message from " << msg << LL_ENDL; + self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString(), true, false, 0); // from history data, not region message, no timestamp } } void LLIMModel::LLIMSession::loadHistory() { mMsgs.clear(); + mLastHistoryCacheMsgs.clear(); + mLastHistoryCacheDateTime.clear(); if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") ) { - std::list<LLSD> chat_history; - - //involves parsing of a chat history + // read and parse chat history from local file + chat_message_list_t chat_history; LLLogChat::loadChatHistory(mHistoryFileName, chat_history, LLSD(), isGroupChat()); - addMessagesFromHistory(chat_history); - } + addMessagesFromHistoryCache(chat_history); + } } LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const @@ -866,7 +1243,7 @@ LLIMModel::LLIMSession* LLIMModel::findAdHocIMSession(const uuid_vec_t& ids) for (; it != mId2SessionMap.end(); ++it) { LLIMSession* session = (*it).second; - + if (!session->isAdHoc()) continue; if (session->mInitialTargetIDs.size() != num) continue; @@ -877,8 +1254,8 @@ LLIMModel::LLIMSession* LLIMModel::findAdHocIMSession(const uuid_vec_t& ids) { tmp_list.remove(*iter); ++iter; - - if (tmp_list.empty()) + + if (tmp_list.empty()) { break; } @@ -934,7 +1311,7 @@ void LLIMModel::LLIMSession::buildHistoryFileName() if (isAdHoc()) { /* in case of outgoing ad-hoc sessions we need to make specilized names - * if this naming system is ever changed then the filtering definitions in + * if this naming system is ever changed then the filtering definitions in * lllogchat.cpp need to be change acordingly so that the filtering for the * date stamp code introduced in STORM-102 will work properly and not add * a date stamp to the Ad-hoc conferences. @@ -947,7 +1324,7 @@ void LLIMModel::LLIMSession::buildHistoryFileName() else { //in case of incoming ad-hoc sessions - mHistoryFileName = mName + " " + LLLogChat::timestamp(true) + " " + mSessionID.asString().substr(0, 4); + mHistoryFileName = mName + " " + LLLogChat::timestamp2LogString(0, true) + " " + mSessionID.asString().substr(0, 4); } } else if (isP2P()) // look up username to use as the log name @@ -978,7 +1355,7 @@ void LLIMModel::LLIMSession::buildHistoryFileName() LLUUID LLIMModel::LLIMSession::generateHash(const std::set<LLUUID>& sorted_uuids) { LLMD5 md5_uuid; - + std::set<LLUUID>::const_iterator it = sorted_uuids.begin(); while (it != sorted_uuids.end()) { @@ -1040,7 +1417,7 @@ void LLIMModel::testMessages() S32 rand1 = ll_rand(sizeof firstname)/(sizeof firstname[0]); S32 rand2 = ll_rand(sizeof lastname)/(sizeof lastname[0]); - + from = firstname[rand1] + " " + lastname[rand2]; bot2_id.generate(from); LLUUID bot2_session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, bot2_id); @@ -1050,7 +1427,7 @@ void LLIMModel::testMessages() } //session name should not be empty -bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, +bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice, bool has_offline_msg) { if (name.empty()) @@ -1093,7 +1470,7 @@ bool LLIMModel::clearSession(const LLUUID& session_id) return true; } -void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index, const bool sendNoUnreadMsgs) +void LLIMModel::getMessages(const LLUUID& session_id, chat_message_list_t& messages, int start_index, const bool sendNoUnreadMsgs) { getMessagesSilently(session_id, messages, start_index); @@ -1103,7 +1480,7 @@ void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, } } -void LLIMModel::getMessagesSilently(const LLUUID& session_id, std::list<LLSD>& messages, int start_index) +void LLIMModel::getMessagesSilently(const LLUUID& session_id, chat_message_list_t& messages, int start_index) { LLIMSession* session = findIMSession(session_id); if (!session) @@ -1114,7 +1491,7 @@ void LLIMModel::getMessagesSilently(const LLUUID& session_id, std::list<LLSD>& m int i = session->mMsgs.size() - start_index; - for (std::list<LLSD>::iterator iter = session->mMsgs.begin(); + for (chat_message_list_t::iterator iter = session->mMsgs.begin(); iter != session->mMsgs.end() && i > 0; iter++) { @@ -1136,7 +1513,7 @@ void LLIMModel::sendNoUnreadMessages(const LLUUID& session_id) session->mNumUnread = 0; session->mParticipantUnreadMessageCount = 0; - + LLSD arg; arg["session_id"] = session_id; arg["num_unread"] = 0; @@ -1144,17 +1521,23 @@ void LLIMModel::sendNoUnreadMessages(const LLUUID& session_id) mNoUnreadMsgsSignal(arg); } -bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text, bool is_region_msg, const LLSD& bonus) { - +bool LLIMModel::addToHistory(const LLUUID& session_id, + const std::string& from, + const LLUUID& from_id, + const std::string& utf8_text, + bool is_region_msg, + U32 timestamp) +{ LLIMSession* session = findIMSession(session_id); - if (!session) + if (!session) { LL_WARNS() << "session " << session_id << "does not exist " << LL_ENDL; return false; } - session->addMessage(from, from_id, utf8_text, LLLogChat::timestamp(false), false, is_region_msg, bonus); //might want to add date separately + // This is where a normal arriving message is added to the session. Note that the time string created here is without the full date + session->addMessage(from, from_id, utf8_text, LLLogChat::timestamp2LogString(timestamp, false), false, is_region_msg, timestamp); return true; } @@ -1162,14 +1545,14 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from, bool LLIMModel::logToFile(const std::string& file_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) { if (gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 1) - { + { std::string from_name = from; LLAvatarName av_name; - if (!from_id.isNull() && + if (!from_id.isNull() && LLAvatarNameCache::get(from_id, &av_name) && !av_name.isDisplayNameDefault()) - { + { from_name = av_name.getCompleteName(); } @@ -1183,43 +1566,63 @@ bool LLIMModel::logToFile(const std::string& file_name, const std::string& from, } } -bool LLIMModel::proccessOnlineOfflineNotification( - const LLUUID& session_id, - const std::string& utf8_text) +void LLIMModel::proccessOnlineOfflineNotification( + const LLUUID& session_id, + const std::string& utf8_text) { // Add system message to history - return addMessage(session_id, SYSTEM_FROM, LLUUID::null, utf8_text); + addMessage(session_id, SYSTEM_FROM, LLUUID::null, utf8_text); } -bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, - const std::string& utf8_text, bool log2file, bool is_region_msg, const LLSD& bonus) { +void LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, + const std::string& utf8_text, bool log2file /* = true */, bool is_region_msg, /* = false */ U32 time_stamp /* = 0 */) +{ + if (gSavedSettings.getBOOL("TranslateChat") && (from != SYSTEM_FROM)) + { + const std::string from_lang = ""; // leave empty to trigger autodetect + const std::string to_lang = LLTranslate::getTranslateLanguage(); + U64 time_n_flags = ((U64) time_stamp) | (log2file ? (1LL << 32) : 0) | (is_region_msg ? (1LL << 33) : 0); // boost::bind has limited parameters + LLTranslate::translateMessage(from_lang, to_lang, utf8_text, + boost::bind(&translateSuccess, session_id, from, from_id, utf8_text, time_n_flags, utf8_text, from_lang, _1, _2), + boost::bind(&translateFailure, session_id, from, from_id, utf8_text, time_n_flags, _1, _2)); + } + else + { + processAddingMessage(session_id, from, from_id, utf8_text, log2file, is_region_msg, time_stamp); + } +} - LLIMSession* session = addMessageSilently(session_id, from, from_id, utf8_text, log2file, is_region_msg, bonus); - if (!session) return false; +void LLIMModel::processAddingMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, + const std::string& utf8_text, bool log2file, bool is_region_msg, U32 time_stamp) +{ + LLIMSession* session = addMessageSilently(session_id, from, from_id, utf8_text, log2file, is_region_msg, time_stamp); + if (!session) + return; - //good place to add some1 to recent list - //other places may be called from message history. - if( !from_id.isNull() && - ( session->isP2PSessionType() || session->isAdHocSessionType() ) ) - LLRecentPeople::instance().add(from_id); + //good place to add some1 to recent list + //other places may be called from message history. + if( !from_id.isNull() && + ( session->isP2PSessionType() || session->isAdHocSessionType() ) ) + LLRecentPeople::instance().add(from_id); - // notify listeners - LLSD arg; - arg["session_id"] = session_id; - arg["num_unread"] = session->mNumUnread; - arg["participant_unread"] = session->mParticipantUnreadMessageCount; - arg["message"] = utf8_text; - arg["from"] = from; - arg["from_id"] = from_id; - arg["time"] = LLLogChat::timestamp(false); - arg["session_type"] = session->mSessionType; - mNewMsgSignal(arg); + // notify listeners + LLSD arg; + arg["session_id"] = session_id; + arg["num_unread"] = session->mNumUnread; + arg["participant_unread"] = session->mParticipantUnreadMessageCount; + arg["message"] = utf8_text; + arg["from"] = from; + arg["from_id"] = from_id; + arg["time"] = LLLogChat::timestamp2LogString(time_stamp, true); + arg["session_type"] = session->mSessionType; + arg["is_region_msg"] = is_region_msg; - return true; + mNewMsgSignal(arg); } -LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, - const std::string& utf8_text, bool log2file, bool is_region_msg, const LLSD& bonus) +LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, + const std::string& utf8_text, bool log2file /* = true */, bool is_region_msg, /* false */ + U32 timestamp /* = 0 */) { LLIMSession* session = findIMSession(session_id); @@ -1235,12 +1638,12 @@ LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id, from_name = SYSTEM_FROM; } - addToHistory(session_id, from_name, from_id, utf8_text, is_region_msg, bonus); + addToHistory(session_id, from_name, from_id, utf8_text, is_region_msg, timestamp); if (log2file) { logToFile(getHistoryFileName(session_id), from_name, from_id, utf8_text); } - + session->mNumUnread++; //update count of unread messages from real participant @@ -1345,7 +1748,7 @@ const std::string& LLIMModel::getHistoryFileName(const LLUUID& session_id) const // TODO get rid of other participant ID -void LLIMModel::sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing) +void LLIMModel::sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing) { std::string name; LLAgentUI::buildFullname(name); @@ -1376,7 +1779,7 @@ void LLIMModel::sendLeaveSession(const LLUUID& session_id, const LLUUID& other_p FALSE, gAgent.getSessionID(), other_participant_id, - name, + name, LLStringUtil::null, IM_ONLINE, IM_SESSION_LEAVE, @@ -1397,7 +1800,7 @@ void LLIMModel::sendMessage(const std::string& utf8_text, const LLRelationship* info = NULL; info = LLAvatarTracker::instance().getBuddyInfo(other_participant_id); - + U8 offline = (!info || info->isOnline()) ? IM_ONLINE : IM_OFFLINE; // Old call to send messages to SLim client, no longer supported. //if((offline == IM_OFFLINE) && (LLVoiceClient::getInstance()->isOnlineSIP(other_participant_id))) @@ -1405,7 +1808,7 @@ void LLIMModel::sendMessage(const std::string& utf8_text, // // User is online through the OOW connector, but not with a regular viewer. Try to send the message via SLVoice. // sent = LLVoiceClient::getInstance()->sendTextMessage(other_participant_id, utf8_text); //} - + if(!sent) { // Send message normally. @@ -1500,7 +1903,7 @@ void LLIMModel::sendMessage(const std::string& utf8_text, } } - if((dialog == IM_NOTHING_SPECIAL) && + if((dialog == IM_NOTHING_SPECIAL) && (other_participant_id.notNull())) { // Do we have to replace the /me's here? @@ -1538,7 +1941,7 @@ void LLIMModel::sendMessage(const std::string& utf8_text, // to Recent People to prevent showing of an item with (?? ?)(?? ?), sans the spaces. See EXT-8246. // Concrete participants will be added into this list once they sent message in chat. if (IM_SESSION_INVITE == dialog) return; - + if (IM_SESSION_CONFERENCE_START == dialog) // outgoing ad-hoc session { // Add only online members of conference to recent list (EXT-8658) @@ -1620,7 +2023,7 @@ void start_deprecated_conference_chat( for(S32 i = 0; i < count; ++i) { LLUUID agent_id = agents_to_invite[i].asUUID(); - + memcpy(pos, &agent_id, UUID_BYTES); pos += UUID_BYTES; } @@ -1636,7 +2039,7 @@ void start_deprecated_conference_chat( bucket_size); gAgent.sendReliableMessage(); - + delete[] bucket; } @@ -1857,7 +2260,7 @@ void LLCallDialogManager::onVoiceChannelChangedInt(const LLUUID &session_id) { LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id); if(!session) - { + { mPreviousSessionlName = mCurrentSessionlName; mCurrentSessionlName = ""; // Empty string results in "Nearby Voice Chat" after substitution return; @@ -1880,7 +2283,7 @@ void LLCallDialogManager::onVoiceChannelChangedInt(const LLUUID &session_id) if (LLVoiceChannel::getCurrentVoiceChannel()->getState() == LLVoiceChannel::STATE_CALL_STARTED && LLVoiceChannel::getCurrentVoiceChannel()->getCallDirection() == LLVoiceChannel::OUTGOING_CALL) { - + //*TODO get rid of duplicated code LLSD mCallDialogPayload; mCallDialogPayload["session_id"] = mSession->mSessionID; @@ -1895,7 +2298,7 @@ void LLCallDialogManager::onVoiceChannelChangedInt(const LLUUID &session_id) if(ocd) { ocd->show(mCallDialogPayload); - } + } } } @@ -1928,7 +2331,7 @@ void LLCallDialogManager::onVoiceChannelStateChangedInt(const LLVoiceChannel::ES mCallDialogPayload["ended_by_agent"] = ended_by_agent; switch(new_state) - { + { case LLVoiceChannel::STATE_CALL_STARTED : // do not show "Calling to..." if it is incoming call if(direction == LLVoiceChannel::INCOMING_CALL) @@ -1957,7 +2360,7 @@ void LLCallDialogManager::onVoiceChannelStateChangedInt(const LLVoiceChannel::ES if(ocd) { ocd->show(mCallDialogPayload); - } + } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1983,9 +2386,9 @@ BOOL LLCallDialog::postBuild() { if (!LLDockableFloater::postBuild() || !gToolBarView) return FALSE; - + dockToToolbarButton("speak"); - + return TRUE; } @@ -2003,15 +2406,15 @@ LLDockControl::DocAt LLCallDialog::getDockControlPos(const std::string& toolbarB { LLCommandId command_id(toolbarButtonName); S32 toolbar_loc = gToolBarView->hasCommand(command_id); - + LLDockControl::DocAt doc_at = LLDockControl::TOP; - + switch (toolbar_loc) { case LLToolBarEnums::TOOLBAR_LEFT: doc_at = LLDockControl::RIGHT; break; - + case LLToolBarEnums::TOOLBAR_RIGHT: doc_at = LLDockControl::LEFT; break; @@ -2020,7 +2423,7 @@ LLDockControl::DocAt LLCallDialog::getDockControlPos(const std::string& toolbarB doc_at = LLDockControl::BOTTOM; break; } - + return doc_at; } @@ -2035,7 +2438,7 @@ LLCallDialog(payload) if(instance && instance->getVisible()) { instance->onCancel(instance); - } + } } void LLCallDialog::draw() @@ -2092,7 +2495,7 @@ bool LLCallDialog::lifetimeHasExpired() if (mLifetimeTimer.getStarted()) { F32 elapsed_time = mLifetimeTimer.getElapsedTimeF32(); - if (elapsed_time > mLifetime) + if (elapsed_time > mLifetime) { return true; } @@ -2133,7 +2536,7 @@ void LLOutgoingCallDialog::show(const LLSD& key) } else { - getChild<LLUICtrl>("leaving")->setTextArg("[CURRENT_CHAT]", getString("localchat")); + getChild<LLUICtrl>("leaving")->setTextArg("[CURRENT_CHAT]", getString("localchat")); } if (!mPayload["disconnected_channel_name"].asString().empty()) @@ -2156,7 +2559,7 @@ void LLOutgoingCallDialog::show(const LLSD& key) { callee_name = getString("anonymous"); } - + LLSD callee_id = mPayload["other_user_id"]; // Beautification: Since you know who you called, just show display name std::string title = callee_name; @@ -2212,7 +2615,7 @@ void LLOutgoingCallDialog::show(const LLSD& key) { const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER; getChild<LLTextBox>(nearby_str)->setVisible(true); - } + } else { getChild<LLTextBox>("nearby")->setVisible(true); @@ -2246,7 +2649,7 @@ void LLOutgoingCallDialog::onCancel(void* user_data) LLUUID session_id = self->mPayload["session_id"].asUUID(); gIMMgr->endCall(session_id); - + self->closeFloater(); } @@ -2331,7 +2734,7 @@ BOOL LLIncomingCallDialog::postBuild() LL_INFOS("IMVIEW") << "IncomingCall: notify_box_type was not provided" << LL_ENDL; return TRUE; } - + // init notification's lifetime std::istringstream ss( getString("lifetime") ); if (!(ss >> mLifetime)) @@ -2506,7 +2909,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response, const LLSD &payload if (session_name.empty()) { LL_WARNS() << "Received an empty session name from a server" << LL_ENDL; - + switch(type){ case IM_SESSION_CONFERENCE_START: case IM_SESSION_GROUP_START: @@ -2524,17 +2927,17 @@ void LLIncomingCallDialog::processCallResponse(S32 response, const LLSD &payload if (LLAvatarNameCache::get(caller_id, &av_name)) { correct_session_name = av_name.getCompleteName(); - correct_session_name.append(ADHOC_NAME_SUFFIX); + correct_session_name.append(ADHOC_NAME_SUFFIX); } } LL_INFOS("IMVIEW") << "Corrected session name is " << correct_session_name << LL_ENDL; break; - default: + default: LL_WARNS("IMVIEW") << "Received an empty session name from a server and failed to generate a new proper session name" << LL_ENDL; break; } } - + gIMMgr->addSession(correct_session_name, type, session_id, true); std::string url = gAgent.getRegion()->getCapability( @@ -2546,7 +2949,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response, const LLSD &payload boost::bind(&chatterBoxInvitationCoro, url, session_id, inv_type)); - // send notification message to the corresponding chat + // send notification message to the corresponding chat if (payload["notify_box_type"].asString() == "VoiceInviteGroup" || payload["notify_box_type"].asString() == "VoiceInviteAdHoc") { LLStringUtil::format_map_t string_args; @@ -2581,7 +2984,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response, const LLSD &payload data["session-id"] = session_id; LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(url, data, - "Invitation declined", + "Invitation declined", "Invitation decline failed."); } } @@ -2646,7 +3049,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response, const LLSD &payload // } // } // /* FALLTHROUGH */ -// + // case 1: // decline // { // if (type == IM_SESSION_P2P_INVITE) @@ -2672,7 +3075,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response, const LLSD &payload // gIMMgr->clearPendingInvitation(session_id); // break; // } -// + // return false; //} // [/AL:SE] @@ -2687,9 +3090,11 @@ LLIMMgr::LLIMMgr() mPendingAgentListUpdates = LLSD::emptyMap(); LLIMModel::getInstance()->addNewMsgCallback(boost::bind(&LLFloaterIMSession::sRemoveTypingIndicator, _1)); + + gSavedPerAccountSettings.declareBOOL("FetchGroupChatHistory", TRUE, "Fetch recent messages from group chat servers when a group window opens", LLControlVariable::PERSIST_ALWAYS); } -// Add a message to a session. +// Add a message to a session. void LLIMMgr::addMessage( const LLUUID& session_id, const LLUUID& target_id, @@ -2701,8 +3106,8 @@ void LLIMMgr::addMessage( U32 parent_estate_id, const LLUUID& region_id, const LLVector3& position, - bool is_region_msg, - const LLSD& bonus) + bool is_region_msg, + U32 timestamp) // May be zero { LLUUID other_participant_id = target_id; @@ -2722,7 +3127,7 @@ void LLIMMgr::addMessage( name_is_setted = true; } bool skip_message = false; - bool from_linden = LLMuteList::getInstance()->isLinden(from); + bool from_linden = LLMuteList::isLinden(from); if (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden) { // Evaluate if we need to skip this message when that setting is true (default is false) @@ -2790,6 +3195,14 @@ void LLIMMgr::addMessage( return; } + // Fetch group chat history, enabled by default. + if (gSavedPerAccountSettings.getBOOL("FetchGroupChatHistory")) + { + std::string chat_url = gAgent.getRegion()->getCapability("ChatSessionRequest"); + LLCoros::instance().launch("chatterBoxHistoryCoro", + boost::bind(&chatterBoxHistoryCoro, chat_url, session_id, from, msg, timestamp)); + } + //Play sound for new conversations if (!skip_message & !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation") == TRUE)) { @@ -2805,7 +3218,7 @@ void LLIMMgr::addMessage( if (!LLMuteList::getInstance()->isMuted(other_participant_id, LLMute::flagTextChat) && !skip_message) { - LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg, true, is_region_msg, bonus); + LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg, true, is_region_msg, timestamp); } // Open conversation floater if offline messages are present @@ -2820,7 +3233,7 @@ void LLIMMgr::addMessage( void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args) { LLUIString message; - + // null session id means near me (chat history) if (session_id.isNull()) { @@ -2883,7 +3296,7 @@ void LLIMMgr::autoStartCallOnStartup(const LLUUID& session_id) { LLIMModel::LLIMSession *session = LLIMModel::getInstance()->findIMSession(session_id); if (!session) return; - + if (session->mSessionInitialized) { startCall(session_id); @@ -2891,7 +3304,7 @@ void LLIMMgr::autoStartCallOnStartup(const LLUUID& session_id) else { session->mStartCallOnInitialize = true; - } + } } LLUUID LLIMMgr::addP2PSession(const std::string& name, @@ -2928,7 +3341,7 @@ LLUUID LLIMMgr::addSession( return session_id; } -// Adds a session using the given session_id. If the session already exists +// Adds a session using the given session_id. If the session already exists // the dialog type is assumed correct. Returns the uuid of the session. LLUUID LLIMMgr::addSession( const std::string& name, @@ -2991,9 +3404,9 @@ LLUUID LLIMMgr::addSession( //we don't need to show notes about online/offline, mute/unmute users' statuses for existing sessions if (!new_session) return session_id; - + LL_INFOS("IMVIEW") << "LLIMMgr::addSession, new session added, name = " << name << ", session id = " << session_id << LL_ENDL; - + //Per Plan's suggestion commented "explicit offline status warning" out to make Dessie happier (see EXT-3609) //*TODO After February 2010 remove this commented out line if no one will be missing that warning //noteOfflineUsers(session_id, floater, ids); @@ -3064,7 +3477,7 @@ bool LLIMMgr::leaveSession(const LLUUID& session_id) void LLIMMgr::removeSession(const LLUUID& session_id) { llassert_always(hasSession(session_id)); - + clearPendingInvitation(session_id); clearPendingAgentListUpdates(session_id); @@ -3076,9 +3489,9 @@ void LLIMMgr::removeSession(const LLUUID& session_id) } void LLIMMgr::inviteToSession( - const LLUUID& session_id, - const std::string& session_name, - const LLUUID& caller_id, + const LLUUID& session_id, + const std::string& session_name, + const LLUUID& caller_id, const std::string& caller_name, EInstantMessage type, EInvitationType inv_type, @@ -3195,22 +3608,22 @@ void LLIMMgr::inviteToSession( { if (caller_name.empty()) { - LLAvatarNameCache::get(caller_id, + LLAvatarNameCache::get(caller_id, boost::bind(&LLIMMgr::onInviteNameLookup, payload, _1, _2)); } else { LLFloaterReg::showInstance("incoming_call", payload, FALSE); } - - // Add the caller to the Recent List here (at this point + + // Add the caller to the Recent List here (at this point // "incoming_call" floater is shown and the recipient can // reject the call), because even if a recipient will reject // the call, the caller should be added to the recent list // anyway. STORM-507. if(type == IM_SESSION_P2P_INVITE) LLRecentPeople::instance().add(caller_id); - + mPendingInvitations[session_id.asString()] = LLSD(); } } @@ -3431,7 +3844,7 @@ bool LLIMMgr::startCall(const LLUUID& session_id, LLVoiceChannel::EDirection dir { LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id); if (!voice_channel) return false; - + voice_channel->setCallDirection(direction); voice_channel->activate(); return true; @@ -3549,7 +3962,7 @@ void LLIMMgr::noteMutedUsers(const LLUUID& session_id, if(count > 0) { LLIMModel* im_model = LLIMModel::getInstance(); - + for(S32 i = 0; i < count; ++i) { if( ml->isMuted(ids.at(i)) ) @@ -3627,7 +4040,15 @@ class LLViewerChatterBoxSessionStartReply : public LLHTTPNode if ( body.has("session_info") ) { im_floater->processSessionUpdate(body["session_info"]); - } + + // Send request for chat history, if enabled. + if (gSavedPerAccountSettings.getBOOL("FetchGroupChatHistory")) + { + std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest"); + LLCoros::instance().launch("chatterBoxHistoryCoro", + boost::bind(&chatterBoxHistoryCoro, url, session_id, "", "", 0)); + } + } } gIMMgr->clearPendingAgentListUpdates(session_id); @@ -3756,7 +4177,7 @@ class LLViewerChatterBoxInvitation : public LLHTTPNode LLUUID session_id = message_params["id"].asUUID(); std::vector<U8> bin_bucket = message_params["data"]["binary_bucket"].asBinary(); U8 offline = (U8)message_params["offline"].asInteger(); - + time_t timestamp = (time_t) message_params["timestamp"].asInteger(); @@ -3826,7 +4247,9 @@ class LLViewerChatterBoxInvitation : public LLHTTPNode IM_SESSION_INVITE, message_params["parent_estate_id"].asInteger(), message_params["region_id"].asUUID(), - ll_vector3_from_sd(message_params["position"])); + ll_vector3_from_sd(message_params["position"]), + false, // is_region_message + timestamp); if (LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat)) { @@ -3852,8 +4275,8 @@ class LLViewerChatterBoxInvitation : public LLHTTPNode } gIMMgr->inviteToSession( - input["body"]["session_id"].asUUID(), - input["body"]["session_name"].asString(), + input["body"]["session_id"].asUUID(), + input["body"]["session_name"].asString(), input["body"]["from_id"].asUUID(), input["body"]["from_name"].asString(), IM_SESSION_INVITE, @@ -3862,8 +4285,8 @@ class LLViewerChatterBoxInvitation : public LLHTTPNode else if ( input["body"].has("immediate") ) { gIMMgr->inviteToSession( - input["body"]["session_id"].asUUID(), - input["body"]["session_name"].asString(), + input["body"]["session_id"].asUUID(), + input["body"]["session_name"].asString(), input["body"]["from_id"].asUUID(), input["body"]["from_name"].asString(), IM_SESSION_INVITE, diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 20b30ce57edc8916f47e375fbc6a39a6ac5bb302..5785f8ef4d8aa9667c67abb15fe03c77df8c955d 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -43,6 +43,7 @@ class LLAvatarName; class LLFriendObserver; class LLCallDialogManager; class LLIMSpeakerMgr; + /** * Timeout Timer for outgoing Ad-Hoc/Group IM sessions which being initialized by the server */ @@ -64,11 +65,14 @@ class LLSessionTimeoutTimer : public LLEventTimer class LLIMModel final : public LLSingleton<LLIMModel> { LLSINGLETON(LLIMModel); + public: - struct LLIMSession : public boost::signals2::trackable + typedef std::list<LLSD> chat_message_list_t; + + struct LLIMSession : public boost::signals2::trackable { - typedef enum e_session_type + typedef enum e_session_type { // for now we have 4 predefined types for a session P2P_SESSION, GROUP_SESSION, @@ -85,15 +89,23 @@ class LLIMModel final : public LLSingleton<LLIMModel> }; // [/SL:KB] - LLIMSession(const LLUUID& session_id, const std::string& name, + LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice, bool has_offline_msg); virtual ~LLIMSession(); void sessionInitReplyReceived(const LLUUID& new_session_id); - void addMessagesFromHistory(const std::list<LLSD>& history); - void addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time, const bool is_history = false, bool is_region_msg = false, const LLSD& bonus = LLSD()); - void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction); - + void addMessagesFromHistoryCache(const std::list<LLSD>& history); // From local file + void addMessagesFromServerHistory(const LLSD& history, const std::string& target_from, const std::string& target_message, U32 timestamp); // From chat server + void addMessage(const std::string& from, + const LLUUID& from_id, + const std::string& utf8_text, + const std::string& time, + const bool is_history, + const bool is_region_msg, + U32 timestamp); + + void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction); + /** @deprecated */ static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata); @@ -126,6 +138,10 @@ class LLIMModel final : public LLSingleton<LLIMModel> uuid_vec_t mInitialTargetIDs; std::string mHistoryFileName; + // Saved messages from the last minute of history read from the local group chat cache file + std::string mLastHistoryCacheDateTime; + chat_message_list_t mLastHistoryCacheMsgs; + // connection to voice channel state change signal boost::signals2::connection mVoiceChannelStateChangeConnection; @@ -139,7 +155,7 @@ class LLIMModel final : public LLSingleton<LLIMModel> // does include all incoming messages S32 mNumUnread; - std::list<LLSD> mMsgs; + chat_message_list_t mMsgs; LLVoiceChannel* mVoiceChannel; LLIMSpeakerMgr* mSpeakers; @@ -226,29 +242,43 @@ class LLIMModel final : public LLSingleton<LLIMModel> * and also saved into a file if log2file is specified. * It sends new message signal for each added message. */ - bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true, bool is_region_msg = false, const LLSD& bonus = LLSD()); + void addMessage(const LLUUID& session_id, + const std::string& from, + const LLUUID& other_participant_id, + const std::string& utf8_text, + bool log2file = true, + bool is_region_msg = false, + U32 time_stamp = 0); + + void processAddingMessage(const LLUUID& session_id, + const std::string& from, + const LLUUID& from_id, + const std::string& utf8_text, + bool log2file, + bool is_region_msg, + U32 time_stamp); /** * Similar to addMessage(...) above but won't send a signal about a new message added */ - LLIMModel::LLIMSession* addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, - const std::string& utf8_text, bool log2file = true, bool is_region_msg = false, const LLSD& bonus = LLSD()); + LLIMModel::LLIMSession* addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, + const std::string& utf8_text, bool log2file = true, bool is_region_msg = false, U32 timestamp = 0); /** * Add a system message to an IM Model */ - bool proccessOnlineOfflineNotification(const LLUUID& session_id, const std::string& utf8_text); + void proccessOnlineOfflineNotification(const LLUUID& session_id, const std::string& utf8_text); /** - * Get a session's name. - * For a P2P chat - it's an avatar's name, + * Get a session's name. + * For a P2P chat - it's an avatar's name, * For a group chat - it's a group's name * For an incoming ad-hoc chat - is received from the server and is in a from of "<Avatar's name> Conference" * It is updated in LLIMModel::LLIMSession's constructor to localize the "Conference". */ const std::string getName(const LLUUID& session_id) const; - /** + /** * Get number of unread messages in a session with session_id * Returns -1 if the session with session_id doesn't exist */ @@ -300,7 +330,7 @@ class LLIMModel final : public LLSingleton<LLIMModel> bool logToFile(const std::string& file_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text); private: - + /** * Populate supplied std::list with messages starting from index specified by start_index without * emitting no unread messages signal. @@ -310,7 +340,7 @@ class LLIMModel final : public LLSingleton<LLIMModel> /** * Add message to a list of message associated with session specified by session_id */ - bool addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text, bool is_region_msg = false, const LLSD& bonus = LLSD()); + bool addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text, bool is_region_msg, U32 timestamp); }; @@ -352,8 +382,8 @@ class LLIMMgr final : public LLSingleton<LLIMMgr> U32 parent_estate_id = 0, const LLUUID& region_id = LLUUID::null, const LLVector3& position = LLVector3::zero, - bool is_region_msg = false, - const LLSD& bonus = LLSD()); + bool is_region_msg = false, + U32 timestamp = 0); void addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args); diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 7dc41850a1b79013625a1d10322429a8589ae64b..0c0d9c2fcc5b5b5554fae234c5cd46f5901a9a2a 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -537,7 +537,11 @@ BOOL get_is_item_worn(const LLUUID& id) const LLViewerInventoryItem* item = gInventory.getItem(id); if (!item) return FALSE; - + + if (item->getIsLinkType() && !gInventory.getItem(item->getLinkedUUID())) + { + return FALSE; + } // Consider the item as worn if it has links in COF. // [SL:KB] - The code below causes problems across the board so it really just needs to go // if (LLAppearanceMgr::instance().isLinkedInCOF(id)) @@ -858,7 +862,7 @@ void show_item_original(const LLUUID& item_uuid) LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel(); if (main_inventory) { - main_inventory->resetFilters(); + main_inventory->resetAllItemsFilters(); } reset_inventory_filter(); @@ -866,6 +870,7 @@ void show_item_original(const LLUUID& item_uuid) { LLFloaterReg::toggleInstanceOrBringToFront("inventory"); } + sidepanel_inventory->showInventoryPanel(); const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX); if (gInventory.isObjectDescendentOf(gInventory.getLinkedItemID(item_uuid), inbox_id)) @@ -2721,7 +2726,12 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root } else { - std::copy(selected_uuid_set.begin(), selected_uuid_set.end(), std::back_inserter(ids)); + for (std::set<LLFolderViewItem*>::iterator it = selected_items.begin(), end_it = selected_items.end(); + it != end_it; + ++it) + { + ids.push_back(static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID()); + } } // Check for actions that get handled in bulk @@ -2782,7 +2792,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root } else if ("ungroup_folder_items" == action) { - if (selected_uuid_set.size() == 1) + if (ids.size() == 1) { LLInventoryCategory* inv_cat = gInventory.getCategory(*ids.begin()); if (!inv_cat || LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType())) diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index ca11ef71cd9fbb6bee0afa660c2271e4918922d3..970278a7a426e7fd6051b1baf3c840a5cd48effc 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1784,6 +1784,9 @@ void LLInventoryModel::deleteObject(const LLUUID& id, bool fix_broken_links, boo LL_WARNS(LOG_INV) << "Deleting non-existent object [ id: " << id << " ] " << LL_ENDL; return; } + + //collect the links before removing the item from mItemMap + LLInventoryModel::item_array_t links = collectLinksTo(id); LL_DEBUGS(LOG_INV) << "Deleting inventory object " << id << LL_ENDL; mLastItem = NULL; @@ -1841,7 +1844,7 @@ void LLInventoryModel::deleteObject(const LLUUID& id, bool fix_broken_links, boo // update is getting broken link info separately. if (fix_broken_links && !is_link_type) { - updateLinkedObjectsFromPurge(id); + rebuildLinkItems(links); } obj = nullptr; // delete obj if (do_notify_observers) @@ -1850,26 +1853,25 @@ void LLInventoryModel::deleteObject(const LLUUID& id, bool fix_broken_links, boo } } -void LLInventoryModel::updateLinkedObjectsFromPurge(const LLUUID &baseobj_id) +void LLInventoryModel::rebuildLinkItems(LLInventoryModel::item_array_t& items) { - LLInventoryModel::item_array_t item_array = collectLinksTo(baseobj_id); - - // REBUILD is expensive, so clear the current change list first else - // everything else on the changelist will also get rebuilt. - if (item_array.size() > 0) - { - notifyObservers(); - for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin(); - iter != item_array.end(); - iter++) - { - const LLViewerInventoryItem *linked_item = (*iter); - const LLUUID &item_id = linked_item->getUUID(); - if (item_id == baseobj_id) continue; - addChangedMask(LLInventoryObserver::REBUILD, item_id); - } - notifyObservers(); - } + // REBUILD is expensive, so clear the current change list first else + // everything else on the changelist will also get rebuilt. + if (items.size() > 0) + { + notifyObservers(); + for (LLInventoryModel::item_array_t::const_iterator iter = items.begin(); + iter != items.end(); + iter++) + { + const LLViewerInventoryItem *linked_item = (*iter); + if (linked_item) + { + addChangedMask(LLInventoryObserver::REBUILD, linked_item->getUUID()); + } + } + notifyObservers(); + } } // Add/remove an observer. If the observer is destroyed, be sure to @@ -2108,18 +2110,20 @@ void LLInventoryModel::cache( items, INCLUDE_TRASH, can_cache); - std::string inventory_filename = getInvCacheAddres(agent_id); - saveToFile(inventory_filename, categories, items); - std::string gzip_filename(inventory_filename); + // Use temporary file to avoid potential conflicts with other + // instances (even a 'read only' instance unzips into a file) + std::string temp_file = gDirUtilp->getTempFilename(); + saveToFile(temp_file, categories, items); + std::string gzip_filename = getInvCacheAddres(agent_id); gzip_filename.append(".gz"); - if(gzip_file(inventory_filename, gzip_filename)) + if(gzip_file(temp_file, gzip_filename)) { - LL_DEBUGS(LOG_INV) << "Successfully compressed " << inventory_filename << LL_ENDL; - LLFile::remove(inventory_filename); + LL_DEBUGS(LOG_INV) << "Successfully compressed " << temp_file << " to " << gzip_filename << LL_ENDL; + LLFile::remove(temp_file); } else { - LL_WARNS(LOG_INV) << "Unable to compress " << inventory_filename << LL_ENDL; + LL_WARNS(LOG_INV) << "Unable to compress " << temp_file << " into " << gzip_filename << LL_ENDL; } } @@ -3200,6 +3204,7 @@ bool LLInventoryModel::saveToFile(const std::string& filename, return false; } } + fileXML.flush(); fileXML.close(); @@ -4884,7 +4889,6 @@ void LLInventoryModel::FetchItemHttpHandler::processData(LLSD & content, LLCore: { gInventory.updateItem(*it); } - gInventory.notifyObservers(); gViewerWindow->getWindow()->decBusyCount(); } diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index aaee6fa8cfa7e6eac7cedfd485a8c529d70332a0..3c52ce9c31c51141584f32f5061e666e04fbf104 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -464,7 +464,7 @@ class LLInventoryModel void checkTrashOverflow(); protected: - void updateLinkedObjectsFromPurge(const LLUUID& baseobj_id); + void rebuildLinkItems(LLInventoryModel::item_array_t& items); //-------------------------------------------------------------------- // Reorder diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index a2c15077b7587c6cb3b25429a0641d0c67af0649..c9b4cbfa743461c38ad6abe797526a13188b89c3 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -526,7 +526,7 @@ void LLInventoryModelBackgroundFetch::bulkFetch() //If there are items in mFetchQueue, we want to check the time since the last bulkFetch was //sent. If it exceeds our retry time, go ahead and fire off another batch. LLViewerRegion * region(gAgent.getRegion()); - if (! region || gDisconnected) + if (! region || gDisconnected || LLApp::isExiting()) { return; } diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 501d46cf574b18781e25538b43adba37d5f264a0..619f6d6da126875b28f9b4a13505ca1a5883c479 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -1671,6 +1671,7 @@ void LLInventoryPanel::purgeSelectedItems() if (inventory_selected.empty()) return; LLSD args; S32 count = inventory_selected.size(); + std::vector<LLUUID> selected_items; for (std::set<LLFolderViewItem*>::const_iterator it = inventory_selected.begin(), end_it = inventory_selected.end(); it != end_it; ++it) @@ -1680,27 +1681,23 @@ void LLInventoryPanel::purgeSelectedItems() LLInventoryModel::item_array_t items; gInventory.collectDescendents(item_id, cats, items, LLInventoryModel::INCLUDE_TRASH); count += items.size() + cats.size(); + selected_items.push_back(item_id); } args["COUNT"] = count; - LLNotificationsUtil::add("PurgeSelectedItems", args, LLSD(), boost::bind(&LLInventoryPanel::callbackPurgeSelectedItems, this, _1, _2)); + LLNotificationsUtil::add("PurgeSelectedItems", args, LLSD(), boost::bind(callbackPurgeSelectedItems, _1, _2, selected_items)); } -void LLInventoryPanel::callbackPurgeSelectedItems(const LLSD& notification, const LLSD& response) +// static +void LLInventoryPanel::callbackPurgeSelectedItems(const LLSD& notification, const LLSD& response, const std::vector<LLUUID> inventory_selected) { - if (!mFolderRoot.get()) return; - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); if (option == 0) { - const std::set<LLFolderViewItem*> inventory_selected = mFolderRoot.get()->getSelectionList(); if (inventory_selected.empty()) return; - std::set<LLFolderViewItem*>::const_iterator it = inventory_selected.begin(); - const std::set<LLFolderViewItem*>::const_iterator it_end = inventory_selected.end(); - for (; it != it_end; ++it) + for (auto it : inventory_selected) { - LLUUID item_id = static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID(); - remove_inventory_object(item_id, NULL); + remove_inventory_object(it, NULL); } } } diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 2b0e664af1a702fc94d5c615290b311f45e4bf2c..2ac3f03579c3b2535dd90e9f162a01f1bf494393 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -262,7 +262,7 @@ class LLInventoryPanel : public LLPanel // Clean up stuff when the folder root gets deleted void clearFolderRoot(); - void callbackPurgeSelectedItems(const LLSD& notification, const LLSD& response); + static void callbackPurgeSelectedItems(const LLSD& notification, const LLSD& response, const std::vector<LLUUID> inventory_selected); protected: void openStartFolderOrMyInventory(); // open the first level of inventory diff --git a/indra/newview/lllegacyatmospherics.cpp b/indra/newview/lllegacyatmospherics.cpp index f2bb983bc43668d71af5dc2f809a62f689b14d5f..b3be4eb70d5668954df295688cc5d6991535eb0b 100644 --- a/indra/newview/lllegacyatmospherics.cpp +++ b/indra/newview/lllegacyatmospherics.cpp @@ -483,7 +483,6 @@ void LLAtmospherics::updateFog(const F32 distance, const LLVector3& tosun_in) { const LLSettingsWater::ptr_t& pwater = env.getCurrentWater(); F32 depth = water_height - camera_height; - LLColor4 water_fog_color(pwater->getWaterFogColor()); // adjust the color based on depth. We're doing linear approximations diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 20b76db862246c4f929aa493e6489a2645d9fe53..c90ce91fde1f73965b7c17adf415e11358767544 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -48,6 +48,7 @@ const S32 LOG_RECALL_SIZE = 2048; const std::string LL_IM_TIME("time"); +const std::string LL_IM_DATE_TIME("datetime"); const std::string LL_IM_TEXT("message"); const std::string LL_IM_FROM("from"); const std::string LL_IM_FROM_ID("from_id"); @@ -119,14 +120,14 @@ void append_to_last_message(std::list<LLSD>& messages, const std::string& line) messages.back()[LL_IM_TEXT] = im_text; } -std::string remove_utf8_bom(const char* buf) +const char* remove_utf8_bom(const char* buf) { - std::string res(buf); - if (res[0] == (char)0xEF && res[1] == (char)0xBB && res[2] == (char)0xBF) - { - res.erase(0, 3); + const char* start = buf; + if (start[0] == (char)0xEF && start[1] == (char)0xBB && start[2] == (char)0xBF) + { // If string starts with the magic bytes, return pointer after it. + start += 3; } - return res; + return start; } class LLLogChatTimeScanner final : public LLSingleton<LLLogChatTimeScanner> @@ -297,7 +298,7 @@ std::string LLLogChat::cleanFileName(std::string filename) return filename; } -std::string LLLogChat::timestamp(bool withdate) +std::string LLLogChat::timestamp2LogString(U32 timestamp, bool withdate) { std::string timeStr; if (withdate) @@ -316,7 +317,14 @@ std::string LLLogChat::timestamp(bool withdate) } LLSD substitution; - substitution["datetime"] = (S32)time_corrected(); + if (timestamp == 0) + { + substitution["datetime"] = (S32)time_corrected(); + } + else + { // timestamp is correct utc already + substitution["datetime"] = (S32)timestamp; + } LLStringUtil::format (timeStr, substitution); return timeStr; @@ -338,7 +346,7 @@ void LLLogChat::saveHistory(const std::string& filename, llassert(tmp_filename.size()); return; } - + llofstream file(LLLogChat::makeLogFileName(filename).c_str(), std::ios_base::app); if (!file.is_open()) { @@ -349,7 +357,7 @@ void LLLogChat::saveHistory(const std::string& filename, LLSD item; if (gSavedPerAccountSettings.getBOOL("LogTimestamp")) - item["time"] = LLLogChat::timestamp(gSavedPerAccountSettings.getBOOL("LogTimestampDate")); + item["time"] = LLLogChat::timestamp2LogString(0, gSavedPerAccountSettings.getBOOL("LogTimestampDate")); item["from_id"] = from_id; item["message"] = line; @@ -357,7 +365,7 @@ void LLLogChat::saveHistory(const std::string& filename, //adding "Second Life:" for all system messages to make chat log history parsing more reliable if (from.empty() && from_id.isNull()) { - item["from"] = SYSTEM_FROM; + item["from"] = SYSTEM_FROM; } else { @@ -376,37 +384,60 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& m { if (file_name.empty()) { - LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL; + LL_WARNS("LLLogChat::loadChatHistory") << "Local history file name is empty!" << LL_ENDL; return ; } bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false; - LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ + // Stat the file to find it and get the last history entry time + llstat stat_data; + + std::string log_file_name = LLLogChat::makeLogFileName(file_name); + LL_DEBUGS("ChatHistory") << "First attempt to stat chat history file " << log_file_name << LL_ENDL; + + S32 no_stat = LLFile::stat(log_file_name, &stat_data); + + if (no_stat) + { + if (is_group) + { + std::string old_name(file_name); + old_name.erase(old_name.size() - GROUP_CHAT_SUFFIX.size()); // trim off " (group)" + log_file_name = LLLogChat::makeLogFileName(old_name); + LL_DEBUGS("ChatHistory") << "Attempting to stat adjusted chat history file " << log_file_name << LL_ENDL; + no_stat = LLFile::stat(log_file_name, &stat_data); + if (!no_stat) + { // Found it without "(group)", copy to new naming style. We already have the mod time in stat_data + log_file_name = LLLogChat::makeLogFileName(file_name); + LL_DEBUGS("ChatHistory") << "Attempt to stat copied history file " << log_file_name << LL_ENDL; + LLFile::copy(LLLogChat::makeLogFileName(old_name), log_file_name); + } + } + if (no_stat) + { + log_file_name = LLLogChat::oldLogFileName(file_name); + LL_DEBUGS("ChatHistory") << "Attempt to stat old history file name " << log_file_name << LL_ENDL; + no_stat = LLFile::stat(log_file_name, &stat_data); + if (no_stat) + { + LL_DEBUGS("ChatHistory") << "No previous conversation log file found for " << file_name << LL_ENDL; + return; //No previous conversation with this name. + } + } + } + + // If we got here, we managed to stat the file. + // Open the file to read + LLFILE* fptr = LLFile::fopen(log_file_name, "r"); /*Flawfinder: ignore*/ if (!fptr) - { - if (is_group) - { - std::string old_name(file_name); - old_name.erase(old_name.size() - GROUP_CHAT_SUFFIX.size()); - fptr = LLFile::fopen(LLLogChat::makeLogFileName(old_name), "r"); - if (fptr) - { - fclose(fptr); - LLFile::copy(LLLogChat::makeLogFileName(old_name), LLLogChat::makeLogFileName(file_name)); - } - fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r"); - } - if (!fptr) - { - fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ - if (!fptr) - { - return; //No previous conversation with this name. - } - } + { // Ok, this is strange but not really tragic in the big picture of things + LL_WARNS("ChatHistory") << "Unable to read file " << log_file_name << " after stat was successful" << LL_ENDL; + return; } + S32 save_num_messages = messages.size(); + char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/ char *bptr; S32 len; @@ -424,6 +455,7 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& m while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr)) { len = strlen(buffer) - 1; /*Flawfinder: ignore*/ + // backfill any end of line characters with nulls for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--) *bptr='\0'; if (firstline) @@ -456,6 +488,10 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& m } } fclose(fptr); + + LL_DEBUGS("ChatHistory") << "Read " << (messages.size() - save_num_messages) + << " messages of chat history from " << log_file_name + << " file mod time " << (F64)stat_data.st_mtime << LL_ENDL; } bool LLLogChat::historyThreadsFinished(LLUUID session_id) @@ -820,7 +856,8 @@ bool LLLogChat::isTranscriptFileFound(std::string fullname) { //matching a timestamp boost::match_results<std::string::const_iterator> matches; - if (ll_regex_match(remove_utf8_bom(buffer), matches, TIMESTAMP)) + std::string line(remove_utf8_bom(buffer)); + if (ll_regex_match(line, matches, TIMESTAMP)) { result = true; } @@ -830,7 +867,7 @@ bool LLLogChat::isTranscriptFileFound(std::string fullname) return result; } -//*TODO mark object's names in a special way so that they will be distinguishable form avatar name +//*TODO mark object's names in a special way so that they will be distinguishable form avatar name //which are more strict by its nature (only firstname and secondname) //Example, an object's name can be written like "Object <actual_object's_name>" void LLChatLogFormatter::format(const LLSD& im, std::ostream& ostr) const @@ -848,7 +885,7 @@ void LLChatLogFormatter::format(const LLSD& im, std::ostream& ostr) const ostr << '[' << timestamp << ']' << TWO_SPACES; } - //*TODO mark object's names in a special way so that they will be distinguishable form avatar name + //*TODO mark object's names in a special way so that they will be distinguishable from avatar name //which are more strict by its nature (only firstname and secondname) //Example, an object's name can be written like "Object <actual_object's_name>" if (im[LL_IM_FROM].isDefined()) @@ -911,7 +948,9 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params timestamp.erase(0, 1); timestamp.erase(timestamp.length()-1, 1); - if (cut_off_todays_date) + im[LL_IM_DATE_TIME] = timestamp; // Retain full date-time for merging chat histories + + if (cut_off_todays_date) { LLLogChatTimeScanner::instance().checkAndCutOffDate(timestamp); } @@ -919,9 +958,9 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params im[LL_IM_TIME] = timestamp; } else - { - //timestamp is optional - im[LL_IM_TIME] = ""; + { //timestamp is optional + im[LL_IM_DATE_TIME] = ""; + im[LL_IM_TIME] = ""; } bool has_stuff = matches[IDX_STUFF].matched; diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h index 496ed570815dfdd75035900accbb71f16e65d94e..802034ac8556338c304bd050e1e539cc84f6057a 100644 --- a/indra/newview/lllogchat.h +++ b/indra/newview/lllogchat.h @@ -92,7 +92,7 @@ class LLLogChat final : public LLSingleton<LLLogChat> LOG_END }; - static std::string timestamp(bool withdate = false); + static std::string timestamp2LogString(U32 timestamp, bool withdate); static std::string makeLogFileName(std::string(filename)); static void renameLogFile(const std::string& old_filename, const std::string& new_filename); /** @@ -201,6 +201,7 @@ extern const std::string GROUP_CHAT_SUFFIX; // LLSD map lookup constants extern const std::string LL_IM_TIME; //("time"); +extern const std::string LL_IM_DATE_TIME; //("datetime"); extern const std::string LL_IM_TEXT; //("message"); extern const std::string LL_IM_FROM; //("from"); extern const std::string LL_IM_FROM_ID; //("from_id"); diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 4f8395062babac6b4fdebd6c64aed7f95b22ef94..316d11a7ec61bf25ba612fe1c04f823ded3b2ae5 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -74,7 +74,6 @@ #include "lluploaddialog.h" #include "llfloaterreg.h" #include "llviewernetwork.h" -#include "llviewerbuildconfig.h" #include <boost/smart_ptr/make_shared.hpp> #include <boost/iostreams/device/array.hpp> @@ -4709,7 +4708,7 @@ S32 LLPhysicsDecomp::llcdCallback(const char* status, S32 p1, S32 p2) return 1; } -#if !LL_HAVOK +#ifndef LL_HAVOK bool needTriangles( LLConvexDecomposition *aDC ) { if( !aDC ) @@ -4738,7 +4737,7 @@ bool needTriangles( LLConvexDecomposition *aDC ) void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh, bool vertex_based) { -#if !LL_HAVOK +#ifndef LL_HAVOK LLConvexDecomposition *pDeComp = LLConvexDecomposition::getInstance(); if( !pDeComp ) return; diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index d0d0554dd22f7df362fbe0628e1944e723bae90b..d3f30b86253db3be5b928f8ebe57246127240804 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -196,7 +196,7 @@ void LLMuteList::cleanupSingleton() } // static -BOOL LLMuteList::isLinden(const LLUUID& id) +bool LLMuteList::isLinden(const LLUUID& id) { std::string name; gCacheName->getFullName(id, name); @@ -204,7 +204,7 @@ BOOL LLMuteList::isLinden(const LLUUID& id) } // static -BOOL LLMuteList::isLinden(const std::string& name) +bool LLMuteList::isLinden(const std::string& name) { std::string username = boost::replace_all_copy(name, ".", " "); typedef boost::tokenizer<boost::char_separator<char> > tokenizer; @@ -212,9 +212,9 @@ BOOL LLMuteList::isLinden(const std::string& name) tokenizer tokens(username, sep); tokenizer::iterator token_iter = tokens.begin(); - if (token_iter == tokens.end()) return FALSE; - ++token_iter; - if (token_iter == tokens.end()) return FALSE; + if (token_iter == tokens.end()) return false; + token_iter++; + if (token_iter == tokens.end()) return false; std::string last_name = *token_iter; if (LLGridManager::getInstance()->isInSecondlife()) @@ -225,13 +225,13 @@ BOOL LLMuteList::isLinden(const std::string& name) else if (LLGridManager::getInstance()->isInOpenSim()) { LLViewerRegion* region = gAgent.getRegion(); - if (!region) return FALSE; + if (!region) return false; const auto& gods = region->getGods(); - if (gods.empty()) return FALSE; + if (gods.empty()) return false; return (gods.find(name) != gods.cend() || gods.find(last_name) != gods.cend()); } - return FALSE; + return false; } static LLVOAvatar* find_avatar(const LLUUID& id) diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index 34ae0201b5d1f34bf91e1e501b462ec3d6677f6b..115f773c52845267c381c3300b24fd20579c8500 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -104,8 +104,8 @@ class LLMuteList final : public LLSingleton<LLMuteList> // Alternate (convenience) form for places we don't need to pass the name, but do need flags BOOL isMuted(const LLUUID& id, U32 flags) const { return isMuted(id, LLStringUtil::null, flags); }; - static BOOL isLinden(const LLUUID& id); - static BOOL isLinden(const std::string& name); + static bool isLinden(const LLUUID& id); + static bool isLinden(const std::string& name); BOOL isLoaded() const { return mIsLoaded; } diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index cb3086ee702af589fc8947d7202b50c93f7ed18f..a35082f7eb48be336ab509f92cc5c64a3c803c06 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -275,7 +275,7 @@ void LLHandlerUtil::addNotifPanelToIM(const LLNotificationPtr& notification) LLSD offer; offer["notification_id"] = notification->getID(); offer["from"] = SYSTEM_FROM; - offer["time"] = LLLogChat::timestamp(false); + offer["time"] = LLLogChat::timestamp2LogString(0, false); // Use current time offer["index"] = (LLSD::Integer)session->mMsgs.size(); session->mMsgs.push_front(offer); diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 5ec51c6cc30aadd3d523ac78ed45f9c3212ee937..3b62137c7529ee4cff7c6644ce9779e361dc9682 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -1092,6 +1092,18 @@ void LLPanelLogin::onRememberPasswordCheck(void*) if (sInstance) { gSavedSettings.setBOOL("UpdateRememberPasswordSetting", TRUE); + + LLPointer<LLCredential> cred; + bool remember_user, remember_password; + getFields(cred, remember_user, remember_password); + + std::string grid(LLGridManager::getInstance()->getGridId()); + std::string user_id(cred->userID()); + if (!remember_password) + { + gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id); + gSecAPIHandler->syncProtectedMap(); + } } } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 8a48de596f467f967681d65f4085128a9cba8403..38b05088d5c2ee2325b7bcca9ce2547e9950ab89 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -417,6 +417,18 @@ void LLPanelMainInventory::resetFilters() setFilterTextFromFilter(); } +void LLPanelMainInventory::resetAllItemsFilters() +{ + LLFloaterInventoryFinder *finder = getFinder(); + getAllItemsPanel()->getFilter().resetDefault(); + if (finder) + { + finder->updateElementsFromFilter(); + } + + setFilterTextFromFilter(); +} + void LLPanelMainInventory::setSortBy(const LLSD& userdata) { U32 sort_order_mask = getActivePanel()->getSortOrder(); diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 77244796f9cb6e7d03389d38d27c6abec66f2b23..3b411f4e028d174d5d674bb3c20651b5b2f52fa5 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -96,6 +96,7 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver void toggleFindOptions(); void resetFilters(); + void resetAllItemsFilters(); protected: // diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index 416857bd305f2b22567a03381c30065d14c2a65f..8380394f2cc2c4b2f5d8bd0b459d142d31974932 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -39,6 +39,7 @@ #include "llagent.h" #include "llviewerwindow.h" #include "llviewermedia.h" +#include "llvovolume.h" #include "llsdutil.h" #include "llselectmgr.h" #include "llbutton.h" @@ -452,10 +453,17 @@ bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace(bool only_if_current_ { viewer_media_t media_impl = LLViewerMedia::getInstance()->getMediaImplFromTextureID(object->getTE(face)->getMediaData()->getMediaID()); - if(media_impl) - { + if (media_impl) + { media_impl->setPriority(LLPluginClassMedia::PRIORITY_NORMAL); media_impl->navigateHome(); + + if (!only_if_current_is_empty) + { + LLSD media_data; + media_data[LLMediaEntry::CURRENT_URL_KEY] = std::string(); + object->getTE(face)->mergeIntoMediaData(media_data); + } return true; } } @@ -471,6 +479,23 @@ bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace(bool only_if_current_ LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection(); selected_objects->getSelectedTEValue( &functor_navigate_media, all_face_media_navigated ); + if (all_face_media_navigated) + { + struct functor_sync_to_server : public LLSelectedObjectFunctor + { + virtual bool apply(LLViewerObject* object) + { + LLVOVolume *volume = dynamic_cast<LLVOVolume*>(object); + if (volume) + { + volume->sendMediaDataUpdate(); + } + return true; + } + } sendfunc; + selected_objects->applyToObjects(&sendfunc); + } + // Note: we don't update the 'current URL' field until the media data itself changes return all_face_media_navigated; diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index d64f3a62736b06cb16c674f5bd9ef59477ecf881..38cae56ebb7eeace39dc9f01b5673ea107996b55 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -26,8 +26,6 @@ #include "llviewerprecompiledheaders.h" -#include "llviewerbuildconfig.h" - #include "llprogressview.h" #include "indra_constants.h" @@ -403,7 +401,7 @@ void LLProgressView::initLogos() S32 icon_height; -#if USE_FMODSTUDIO +#ifdef LL_FMODSTUDIO // original image size is 264x96, it is on longer side but // with no internal paddings so it gets additional padding icon_width = 77; @@ -418,7 +416,7 @@ void LLProgressView::initLogos() texture_start_x += icon_width + default_pad + 1; #endif //LL_FMODSTUDIO -#if LL_HAVOK +#ifdef LL_HAVOK // original image size is 342x113, central element is on a larger side // plus internal padding, so it gets slightly more height than desired 32 icon_width = 88; diff --git a/indra/newview/llsceneview.cpp b/indra/newview/llsceneview.cpp index e250f9bc7a998730c056b98cc448ad670f229f06..5e339a52bf1da57f3c522456fa88c1747c573bc5 100644 --- a/indra/newview/llsceneview.cpp +++ b/indra/newview/llsceneview.cpp @@ -207,7 +207,7 @@ void LLSceneView::draw() for (U32 i = 0; i < count; ++i) { F32 rad = size[idx][i]; - total += rad; + total += rad; F32 y = (rad-size_domain[0])/size_range*size_rect.getHeight()+size_rect.mBottom; F32 x = (F32) i / count * size_rect.getWidth() + size_rect.mLeft; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 7425a6481e3cced1d27d917cb6ab709f55cf086b..705b5eefa3fed38801d66817648f8a126e45a5ec 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -26,8 +26,6 @@ #include "llviewerprecompiledheaders.h" -#include "llviewerbuildconfig.h" - #include "llappviewer.h" #include "llstartup.h" #include "llcallstack.h" @@ -42,11 +40,11 @@ #include "llviewermedia_streamingaudio.h" #include "llaudioengine.h" -#if USE_FMODSTUDIO +#ifdef LL_FMODSTUDIO # include "llaudioengine_fmodstudio.h" #endif -#if USE_OPENAL +#ifdef LL_OPENAL # include "llaudioengine_openal.h" #endif @@ -662,7 +660,7 @@ bool idle_startup() delete gAudiop; gAudiop = NULL; -#if USE_FMODSTUDIO +#ifdef LL_FMODSTUDIO if (!gAudiop #if !LL_WINDOWS && NULL == getenv("LL_BAD_FMODSTUDIO_DRIVER") @@ -673,7 +671,7 @@ bool idle_startup() } #endif -#if USE_OPENAL +#ifdef LL_OPENAL if (!gAudiop #if !LL_WINDOWS && NULL == getenv("LL_BAD_OPENAL_DRIVER") diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index 2b1fedf74d1a5dbf48bb79d3dd4b2d844fdcd900..ab559f1e6f3279a584dc4ba33e6538874e7a47cd 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -35,6 +35,7 @@ #include "llviewercontrol.h" #include "lltexteditor.h" +#include <memory> #define MOUSE_LEAVE false #define MOUSE_ENTER true diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index 97e5ba0943ff50dfc515c7a4b4129896e996d17d..704006b26355cb218be0e4d0ef3aaac87c98cebc 100644 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -78,6 +78,7 @@ LLToolCamera::LLToolCamera() mOutsideSlopX(FALSE), mOutsideSlopY(FALSE), mValidClickPoint(FALSE), + mClickPickPending(false), mValidSelection(FALSE), mMouseSteering(FALSE), mMouseUpX(0), @@ -130,6 +131,11 @@ BOOL LLToolCamera::handleMouseDown(S32 x, S32 y, MASK mask) mValidClickPoint = FALSE; + // Sometimes Windows issues down and up events near simultaneously + // without giving async pick a chance to trigged + // Ex: mouse from numlock emulation + mClickPickPending = true; + // If mouse capture gets ripped away, claim we moused up // at the point we moused down. JC mMouseUpX = x; @@ -145,13 +151,15 @@ BOOL LLToolCamera::handleMouseDown(S32 x, S32 y, MASK mask) void LLToolCamera::pickCallback(const LLPickInfo& pick_info) { - if (!LLToolCamera::getInstance()->hasMouseCapture()) + LLToolCamera* camera = LLToolCamera::getInstance(); + if (!camera->mClickPickPending) { return; } + camera->mClickPickPending = false; - LLToolCamera::getInstance()->mMouseDownX = pick_info.mMousePt.mX; - LLToolCamera::getInstance()->mMouseDownY = pick_info.mMousePt.mY; + camera->mMouseDownX = pick_info.mMousePt.mX; + camera->mMouseDownY = pick_info.mMousePt.mY; gViewerWindow->moveCursorToCenter(); @@ -161,7 +169,7 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info) // Check for hit the sky, or some other invalid point if (!hit_obj && pick_info.mPosGlobal.isExactlyZero()) { - LLToolCamera::getInstance()->mValidClickPoint = FALSE; + camera->mValidClickPoint = FALSE; return; } @@ -171,7 +179,7 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info) LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); if (!selection->getObjectCount() || selection->getSelectType() != SELECT_TYPE_HUD) { - LLToolCamera::getInstance()->mValidClickPoint = FALSE; + camera->mValidClickPoint = FALSE; return; } } @@ -195,7 +203,7 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info) if( !good_customize_avatar_hit ) { - LLToolCamera::getInstance()->mValidClickPoint = FALSE; + camera->mValidClickPoint = FALSE; return; } @@ -240,7 +248,7 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info) } - LLToolCamera::getInstance()->mValidClickPoint = TRUE; + camera->mValidClickPoint = TRUE; if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode() ) { @@ -287,32 +295,36 @@ BOOL LLToolCamera::handleMouseUp(S32 x, S32 y, MASK mask) if (hasMouseCapture()) { - if (mValidClickPoint) - { - if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode() ) - { - LLCoordGL mouse_pos; - LLVector3 focus_pos = gAgent.getPosAgentFromGlobal(gAgentCamera.getFocusGlobal()); - BOOL success = LLViewerCamera::getInstance()->projectPosAgentToScreen(focus_pos, mouse_pos); - if (success) - { - LLUI::setMousePositionScreen(mouse_pos.mX, mouse_pos.mY); - } - } - else if (mMouseSteering) - { + // Do not move camera if we haven't gotten a pick + if (!mClickPickPending) + { + if (mValidClickPoint) + { + if (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode()) + { + LLCoordGL mouse_pos; + LLVector3 focus_pos = gAgent.getPosAgentFromGlobal(gAgentCamera.getFocusGlobal()); + BOOL success = LLViewerCamera::getInstance()->projectPosAgentToScreen(focus_pos, mouse_pos); + if (success) + { + LLUI::setMousePositionScreen(mouse_pos.mX, mouse_pos.mY); + } + } + else if (mMouseSteering) + { + LLUI::setMousePositionScreen(mMouseDownX, mMouseDownY); + } + else + { + gViewerWindow->moveCursorToCenter(); + } + } + else + { + // not a valid zoomable object LLUI::setMousePositionScreen(mMouseDownX, mMouseDownY); - } - else - { - gViewerWindow->moveCursorToCenter(); - } - } - else - { - // not a valid zoomable object - LLUI::setMousePositionScreen(mMouseDownX, mMouseDownY); - } + } + } // calls releaseMouse() internally setMouseCapture(FALSE); diff --git a/indra/newview/lltoolfocus.h b/indra/newview/lltoolfocus.h index 9e70b184bdba85c55331a47814af5fb66894e82d..bd0b10616d7c81ef89ffaa5d039d3ff9bc8aa3d8 100644 --- a/indra/newview/lltoolfocus.h +++ b/indra/newview/lltoolfocus.h @@ -51,6 +51,7 @@ class LLToolCamera final virtual LLTool* getOverrideTool(MASK mask) override { return NULL; } + void setClickPickPending() { mClickPickPending = true; } static void pickCallback(const LLPickInfo& pick_info); BOOL mouseSteerMode() { return mMouseSteering; } @@ -67,6 +68,7 @@ class LLToolCamera final BOOL mOutsideSlopX; BOOL mOutsideSlopY; BOOL mValidClickPoint; + bool mClickPickPending; BOOL mValidSelection; BOOL mMouseSteering; S32 mMouseUpX; // needed for releaseMouse() diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index a9314bfb4dcb273989a0789cc9294030ee0edb12..187c81342d3c7d13310d46134544b6cc0d3f5423 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -492,6 +492,7 @@ BOOL LLToolPie::handleLeftClickPick() LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance()); gViewerWindow->hideCursor(); LLToolCamera::getInstance()->setMouseCapture(TRUE); + LLToolCamera::getInstance()->setClickPickPending(); LLToolCamera::getInstance()->pickCallback(mPick); gAgentCamera.setFocusOnAvatar(TRUE, TRUE); diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index bb3eebbe5f3d53270dd3ce70ea2cb575764c1d34..84601da4c1d1d37176fb5482ead58352f4991355 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -549,6 +549,18 @@ void LLBingTranslationHandler::verifyKey(const std::string &key, LLTranslate::Ke } //========================================================================= +LLTranslate::LLTranslate(): + mCharsSeen(0), + mCharsSent(0), + mFailureCount(0), + mSuccessCount(0) +{ +} + +LLTranslate::~LLTranslate() +{ +} + /*static*/ void LLTranslate::translateMessage(const std::string &from_lang, const std::string &to_lang, const std::string &mesg, TranslationSuccess_fn success, TranslationFailure_fn failure) @@ -637,6 +649,43 @@ bool LLTranslate::isTranslationConfigured() return getPreferredHandler().isConfigured(); } +void LLTranslate::logCharsSeen(size_t count) +{ + mCharsSeen += count; +} + +void LLTranslate::logCharsSent(size_t count) +{ + mCharsSent += count; +} + +void LLTranslate::logSuccess(S32 count) +{ + mSuccessCount += count; +} + +void LLTranslate::logFailure(S32 count) +{ + mFailureCount += count; +} + +LLSD LLTranslate::asLLSD() const +{ + LLSD res; + bool on = gSavedSettings.getBOOL("TranslateChat"); + res["on"] = on; + res["chars_seen"] = (S32) mCharsSeen; + if (on) + { + res["chars_sent"] = (S32) mCharsSent; + res["success_count"] = mSuccessCount; + res["failure_count"] = mFailureCount; + res["language"] = getTranslateLanguage(); + res["service"] = gSavedSettings.getString("TranslationService"); + } + return res; +} + // static LLTranslationAPIHandler& LLTranslate::getPreferredHandler() { diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h index e0722fbd83f92dce9b41c58012e19875893d6621..58707e2d3620e1c0f8b59d24be16f2f7a546b9b3 100644 --- a/indra/newview/lltranslate.h +++ b/indra/newview/lltranslate.h @@ -30,6 +30,8 @@ #include "llbufferstream.h" #include <boost/function.hpp> +#include "llsingleton.h" + namespace Json { class Value; @@ -48,8 +50,10 @@ class LLTranslationAPIHandler; * * API keys for translation are taken from saved settings. */ -class LLTranslate +class LLTranslate: public LLSingleton<LLTranslate> { + LLSINGLETON(LLTranslate); + ~LLTranslate(); LOG_CLASS(LLTranslate); public : @@ -94,9 +98,19 @@ public : static std::string addNoTranslateTags(std::string mesg); static std::string removeNoTranslateTags(std::string mesg); + void logCharsSeen(size_t count); + void logCharsSent(size_t count); + void logSuccess(S32 count); + void logFailure(S32 count); + LLSD asLLSD() const; private: static LLTranslationAPIHandler& getPreferredHandler(); static LLTranslationAPIHandler& getHandler(EService service); + + size_t mCharsSeen; + size_t mCharsSent; + S32 mFailureCount; + S32 mSuccessCount; }; #endif diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp index c91b63e2358a2bc21034a012270c3e766ee887e0..c9e8e9b5c9755dc5dd94363d06bdf94bae450566 100644 --- a/indra/newview/llversioninfo.cpp +++ b/indra/newview/llversioninfo.cpp @@ -26,7 +26,6 @@ */ #include "llviewerprecompiledheaders.h" -#include "llviewerbuildconfig.h" #include "llevents.h" #include "lleventfilter.h" #include "llregex.h" diff --git a/indra/newview/llviewerbuildconfig.h.in b/indra/newview/llviewerbuildconfig.h.in deleted file mode 100644 index 4e975df04b02a68b54fc18cd1252760f3f7099ed..0000000000000000000000000000000000000000 --- a/indra/newview/llviewerbuildconfig.h.in +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @file llviewerbuildconfig.h - * @brief Viewer build-time config options. - * @author Rye Mutt <rye@alchemyviewer.org> - * - * $LicenseInfo:firstyear=2019&license=viewerlgpl$ - * Alchemy Viewer Source Code - * Copyright (C) 2019, Rye Mutt <rye@alchemyviewer.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * $/LicenseInfo$ - */ - -#ifndef LL_LLVIEWERBUILDCONFIG_H -#define LL_LLVIEWERBUILDCONFIG_H - -// Commit SHA -#define LL_VIEWER_COMMIT_SHA "@VIEWER_COMMIT_LONG_SHA@" -#define LL_VIEWER_COMMIT_SHORT_SHA "@VIEWER_COMMIT_SHORT_SHA@" - -// Build Configuration -#define LLBUILD_CONFIG "@CMAKE_BUILD_TYPE@" - -// Version Information -#define LL_VIEWER_CHANNEL "@VIEWER_CHANNEL@" -#define LL_VIEWER_CHANNEL_CODENAME "@VIEWER_CHANNEL_CODENAME_INTERNAL@" -#define LL_VIEWER_CHANNEL_AND_VERSION "@VIEWER_VERSION_AND_CHANNEL@" -#define LL_VIEWER_VERSION_MAJOR @VIEWER_VERSION_MAJOR@ -#define LL_VIEWER_VERSION_MINOR @VIEWER_VERSION_MINOR@ -#define LL_VIEWER_VERSION_PATCH @VIEWER_VERSION_PATCH@ - -// Updater URL -#define VIEWER_UPDATE_SERVICE "@VIEWER_UPDATE_SERVICE@" - -// Sentry -#define SENTRY_DSN "@SENTRY_DSN@" - -// Discord -#define DISCORD_CLIENTID @DISCORD_CLIENTID@ - -// Graphics Utils -#cmakedefine01 USE_NVAPI - -// Audio Engines -#cmakedefine01 USE_FMODSTUDIO -#cmakedefine01 USE_OPENAL - -// Media Plugins -#cmakedefine01 USE_CEF -#cmakedefine01 USE_VLC - -// Havok -#cmakedefine01 HAVOK -#cmakedefine01 HAVOK_TPV -#define LL_HAVOK (HAVOK || HAVOK_TPV) - -#endif // LL_LLVIEWERBUILDCONFIG_H \ No newline at end of file diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index aa64cca23fe1088494ff7c7ef85dcfeb39d73c88..931dea09625dd03fabea25f99de404c8217e438a 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2530,6 +2530,7 @@ void translateSuccess(LLChat chat, LLSD toastArgs, std::string originalMsg, std: chat.mText += " (" + LLTranslate::removeNoTranslateTags(translation) + ")"; } + LLTranslate::instance().logSuccess(1); LLNotificationsUI::LLNotificationManager::instance().onChat(chat, toastArgs); } @@ -2539,6 +2540,7 @@ void translateFailure(LLChat chat, LLSD toastArgs, int status, const std::string LLStringUtil::replaceString(msg, "\n", " "); // we want one-line error messages chat.mText += " (" + msg + ")"; + LLTranslate::instance().logFailure(1); LLNotificationsUI::LLNotificationManager::instance().onChat(chat, toastArgs); } @@ -2939,6 +2941,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) LLSD args; chat.mOwnerID = owner_id; + LLTranslate::instance().logCharsSeen(mesg.size()); if (gSavedSettings.getBOOL("TranslateChat") && chat.mSourceType != CHAT_SOURCE_SYSTEM) { if (chat.mChatStyle == CHAT_STYLE_IRC) @@ -2948,6 +2951,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) const std::string from_lang = ""; // leave empty to trigger autodetect const std::string to_lang = LLTranslate::getTranslateLanguage(); + LLTranslate::instance().logCharsSent(mesg.size()); LLTranslate::translateMessage(from_lang, to_lang, mesg, boost::bind(&translateSuccess, chat, args, mesg, from_lang, _1, _2), boost::bind(&translateFailure, chat, args, _1, _2)); @@ -6249,8 +6253,12 @@ void process_script_question(LLMessageSystem *msg, void **user_data) { count++; known_questions |= script_perm.permbit; - // check whether permission question should cause special caution dialog - caution |= (script_perm.caution); + + if (!LLMuteList::isLinden(owner_name)) + { + // check whether permission question should cause special caution dialog + caution |= (script_perm.caution); + } if (("ScriptTakeMoney" == script_perm.question) && has_not_only_debit) continue; diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp index fe10a127e305d7ad94ef575f7766fa57f05de5b2..f4b46153a358a574b05ae86938f4ca6c09c887b4 100644 --- a/indra/newview/llviewernetwork.cpp +++ b/indra/newview/llviewernetwork.cpp @@ -174,7 +174,7 @@ void LLGridManager::initialize(const std::string& grid_file) "secondlife", "Aditi"); -#if !LL_HAVOK +#ifndef LL_HAVOK LLSD other_grids; llifstream llsd_xml; if (!grid_file.empty()) @@ -371,7 +371,7 @@ bool LLGridManager::addGrid(LLSD& grid_data) return added; } -#if !LL_HAVOK +#ifndef LL_HAVOK bool LLGridManager::removeGrid(const std::string& gridkey) { //Grid must exist and not be a system addition @@ -447,7 +447,7 @@ void LLGridManager::addSystemGrid(const std::string& label, addGrid(grid); } -#if !LL_HAVOK +#ifndef LL_HAVOK void LLGridManager::addRemoteGrid(const std::string& login_uri, const EAddGridType type) { LL_DEBUGS("GridManager") << "Adding '" << login_uri << "' to grid manager." << LL_ENDL; @@ -708,7 +708,7 @@ void LLGridManager::setGridChoice(const std::string& grid, const bool only_selec updateIsInProductionGrid(); } -#if !LL_HAVOK +#ifndef LL_HAVOK else if (!only_select) { // the grid was not in the list of grids. diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h index 6fcad3ec745fce42dba63b2a1518d41755592cdf..9c3223d70620080ce590eb1d56be53450f8486a7 100644 --- a/indra/newview/llviewernetwork.h +++ b/indra/newview/llviewernetwork.h @@ -28,8 +28,6 @@ #ifndef LL_LLVIEWERNETWORK_H #define LL_LLVIEWERNETWORK_H -#include "llviewerbuildconfig.h" - // @TODO this really should be private, but is used in llslurl #define MAINGRID "util.agni.lindenlab.com" @@ -258,7 +256,7 @@ class LLGridManager final : public LLSingleton<LLGridManager> /// Is the selected grid aditi? bool isInSLBeta() const; -#if !LL_HAVOK +#ifndef LL_HAVOK /* =============================================================== * @name User grid management functions * @{ @@ -278,7 +276,7 @@ class LLGridManager final : public LLSingleton<LLGridManager> void setLoggedIn(bool logged_in) { mLoggedIn = logged_in; } protected: -#if !LL_HAVOK +#ifndef LL_HAVOK void gridInfoResponderCoro(const std::string uri, bool hypergrid); #endif private: @@ -287,7 +285,7 @@ class LLGridManager final : public LLSingleton<LLGridManager> bool addGrid(LLSD& grid_info); ///< @returns true if successfully added -#if !LL_HAVOK +#ifndef LL_HAVOK /// Save grids list to file void saveGridList(); #endif diff --git a/indra/newview/llviewerprecompiledheaders.cpp b/indra/newview/llviewerprecompiledheaders.cpp deleted file mode 100644 index 307e9037269a6c6e4b7de41fcd8d58f4a13cd26a..0000000000000000000000000000000000000000 --- a/indra/newview/llviewerprecompiledheaders.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @file llviewerprecompiledheaders.cpp - * @brief precompiled headers for newview project - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -// source file that includes just the standard includes -// newview.pch will be the pre-compiled header -// llviewerprecompiledheaders.obj will contain the pre-compiled type information - -#include "llviewerprecompiledheaders.h" - -// TODO: reference any additional headers you need in llviewerprecompiledheaders.h -// and not in this file diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h index 26e4967efea3bc289ea9c619c1eee4bd58a3103a..5210df1fd9301f50d6a7a231bf88afb0a72cdc30 100644 --- a/indra/newview/llviewerprecompiledheaders.h +++ b/indra/newview/llviewerprecompiledheaders.h @@ -115,6 +115,4 @@ #include "llui.h" #include "lluictrl.h" -#include "llviewerbuildconfig.h" - #endif diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index eb258f3dc8bd5a6c58afd597f1d8d46be847fd43..11b39390523e381400d6406d3078773bf92ad8c0 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -89,7 +89,6 @@ #include "llviewernetwork.h" #include "llslurl.h" #include "llnotificationsutil.h" -#include "llviewerbuildconfig.h" #include <boost/regex.hpp> @@ -628,12 +627,17 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, mHandle(handle), mTimeDilation(1.0f), mWidthScaleFactor(region_width_meters / REGION_WIDTH_METERS), +#ifndef LL_HAVOK mMaxBakes(LLGridManager::getInstance()->isInSecondlife()? LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_NUM_INDICES: LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_LEFT_ARM), mMaxTEs(LLGridManager::getInstance()->isInSecondlife()? LLAvatarAppearanceDefines::ETextureIndex::TEX_NUM_INDICES: LLAvatarAppearanceDefines::ETextureIndex::TEX_HEAD_UNIVERSAL_TATTOO), +#else + mMaxBakes(LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_NUM_INDICES), + mMaxTEs(LLAvatarAppearanceDefines::ETextureIndex::TEX_NUM_INDICES), +#endif mName(""), mZoning(""), mIsEstateManager(FALSE), @@ -2494,7 +2498,7 @@ void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features) { LL_INFOS() << "region " << getName() << " " << ll_pretty_print_sd(sim_features) << LL_ENDL; mSimulatorFeatures = sim_features; -#if !LL_HAVOK +#ifndef LL_HAVOK if (LLGridManager::getInstance()->isInOpenSim()) { setGodnames(); @@ -2606,15 +2610,17 @@ void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features) mAvatarHoverHeightEnabled = (mSimulatorFeatures.has("AvatarHoverHeightEnabled") && mSimulatorFeatures["AvatarHoverHeightEnabled"].asBoolean()); - if (mBakesOnMeshEnabled) +#ifndef LL_HAVOK + if (!mBakesOnMeshEnabled) { - mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_NUM_INDICES; - mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_NUM_INDICES; + mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_LEFT_ARM; + mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_HEAD_UNIVERSAL_TATTOO; } else +#endif { - mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_LEFT_ARM; - mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_HEAD_UNIVERSAL_TATTOO; + mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_NUM_INDICES; + mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_NUM_INDICES; } setSimulatorFeaturesReceived(true); @@ -3189,6 +3195,7 @@ void LLViewerRegion::unpackRegionHandshake() } mCentralBakeVersion = region_protocols & 1; // was (S32)gSavedSettings.getBOOL("UseServerTextureBaking"); +#ifndef LL_HAVOK constexpr U64 REGION_SUPPORTS_BOM{ 1ULL << 63ULL }; if (LLGridManager::instance().isInSecondlife() || (region_protocols & REGION_SUPPORTS_BOM)) // OS sets bit 63 when BOM supported { @@ -3200,6 +3207,12 @@ void LLViewerRegion::unpackRegionHandshake() mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_LEFT_ARM; mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_HEAD_UNIVERSAL_TATTOO; } +#else + { + mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_NUM_INDICES; + mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_NUM_INDICES; + } +#endif LLVLComposition *compp = getComposition(); if (compp) diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 313e3bb31e81e5e831813a9e3de85aa5e94f2c14..ca7d045866c8e2236b1dce1ebb9d04b532433992 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -63,6 +63,7 @@ #include "llcorehttputil.h" #include "llvoicevivox.h" #include "llinventorymodel.h" +#include "lltranslate.h" // "Minimal Vulkan" to get max API Version @@ -525,6 +526,7 @@ void send_viewer_stats(bool include_preferences) agent["meters_traveled"] = gAgent.getDistanceTraveled(); agent["regions_visited"] = gAgent.getRegionsVisited(); agent["mem_use"] = LLMemory::getCurrentRSS() / 1024.0; + agent["translation"] = LLTranslate::instance().asLLSD(); LLSD &system = body["system"]; @@ -534,6 +536,7 @@ void send_viewer_stats(bool include_preferences) system["cpu_sse"] = gSysCPU.getSSEVersions(); system["address_size"] = ADDRESS_SIZE; system["os_bitness"] = LLOSInfo::instance().getOSBitness(); + system["hardware_concurrency"] = (LLSD::Integer) std::thread::hardware_concurrency(); unsigned char MACAddress[MAC_ADDRESS_BYTES]; LLUUID::getNodeID(MACAddress); std::string macAddressString = llformat("%02x-%02x-%02x-%02x-%02x-%02x", @@ -555,6 +558,7 @@ void send_viewer_stats(bool include_preferences) gGLManager.asLLSD(system["gl"]); + S32 shader_level = 0; if (LLPipeline::sRenderDeferred) { diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 5f56e48c7fbbafb4e0b4d2e3d180e95a2edf1bd3..5a68f998c47f864ee351719e237a7deca39e5902 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -518,6 +518,8 @@ class LLViewerFetchedTexture : public LLViewerTexture LLFrameTimer mStopFetchingTimer; // Time since mDecodePriority == 0.f. BOOL mInImageList; // TRUE if image is in list (in which case don't reset priority!) + // This needs to be atomic, since it is written both in the main thread + // and in the GL image worker thread... HB LLAtomicBool mNeedsCreateTexture; BOOL mForSculpt ; //a flag if the texture is used as sculpt data. diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 361c322f0966e24d6fe6857b942a3e00820d02af..a58c3aad1961d3de4a6fd464f445093ea7880a74 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -785,7 +785,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, S32 LLVOAvatar::getNumBakes() const { -#if !LL_HAVOK +#ifndef LL_HAVOK // BAKED_LEFT_ARM is equal to the pre-BOM BAKED_NUM_INDICES if(LLViewerRegion* regionp = getRegion()) { @@ -3662,14 +3662,15 @@ void LLVOAvatar::idleUpdateNameTagText(bool new_name) void LLVOAvatar::addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font, const bool use_ellipses) { + // extra width (NAMETAG_MAX_WIDTH) is for names only, not for chat llassert(mNameText); if (mVisibleChat) { - mNameText->addLabel(line); + mNameText->addLabel(line, LLHUDNameTag::NAMETAG_MAX_WIDTH); } else { - mNameText->addLine(line, color, (LLFontGL::StyleFlags)style, font, use_ellipses); + mNameText->addLine(line, color, (LLFontGL::StyleFlags)style, font, use_ellipses, LLHUDNameTag::NAMETAG_MAX_WIDTH); } mNameIsSet |= !line.empty(); } diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp index a2044e084d963629d3de06d00a66f193f4ef1bfc..7024753c104db46518f3e0a639d307121576b78d 100644 --- a/indra/newview/llwatchdog.cpp +++ b/indra/newview/llwatchdog.cpp @@ -222,18 +222,17 @@ void LLWatchdog::run() if(current_run_delta > (WATCHDOG_SLEEP_TIME_USEC * TIME_ELAPSED_MULTIPLIER)) { LL_INFOS() << "Watchdog thread delayed: resetting entries." << LL_ENDL; - std::for_each(mSuspects.begin(), - mSuspects.end(), - std::mem_fn(&LLWatchdogEntry::reset) - ); + for (const auto& suspect : mSuspects) + { + suspect->reset(); + } } else { SuspectsRegistry::iterator result = std::find_if(mSuspects.begin(), - mSuspects.end(), - [](LLWatchdogEntry* entry){ return !entry->isAlive(); } - ); + mSuspects.end(), + [](const LLWatchdogEntry* suspect){ return ! suspect->isAlive(); }); if(result != mSuspects.end()) { // error!!! diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 55e2bf5b680e8b78d28dcbfc5d7297660eca86c1..7f2c2239eecac1fb6a6e7b96ffb6288df8548ef2 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -828,13 +828,10 @@ void LLWorld::updateParticles() void LLWorld::renderPropertyLines() { - S32 region_count = 0; - for (region_list_t::iterator iter = mVisibleRegionList.begin(); iter != mVisibleRegionList.end(); ++iter) { LLViewerRegion* regionp = *iter; - region_count++; regionp->renderPropertyLines(); } } diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index 55012fb2aa840bc11cdf7564e7f46573c103f0bc..4a6e4bd82aad92c6ee505826b552afef7d13c3ea 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -44,7 +44,12 @@ #include "llviewercontrol.h" // Have to include these last to avoid queue redefinition! + +#ifdef LL_USESYSTEMLIBS +#include <xmlrpc.h> +#else #include <xmlrpc-epi/xmlrpc.h> +#endif // <xmlrpc-epi/queue.h> contains a harmful #define queue xmlrpc_queue. This // breaks any use of std::queue. Ditch that #define: if any of our code wants // to reference xmlrpc_queue, let it reference it directly. diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index ee7edbd3b3d358b76dac41e0f9f99fed0ce703df..c508cbc8bcbbb84f2ddf6c2ca7a1f184723b0534 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1803,20 +1803,17 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable) void LLPipeline::removeMutedAVsLights(LLVOAvatar* muted_avatar) { LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; - light_set_t::iterator iter = gPipeline.mNearbyLights.begin(); - - while (iter != gPipeline.mNearbyLights.end()) - { - if (iter->drawable->getVObj()->isAttachment() && iter->drawable->getVObj()->getAvatar() == muted_avatar) - { - gPipeline.mLights.erase(iter->drawable); - iter = gPipeline.mNearbyLights.erase(iter); - } - else - { - iter++; - } - } + for (light_set_t::iterator iter = gPipeline.mNearbyLights.begin(); + iter != gPipeline.mNearbyLights.end(); iter++) + { + const LLViewerObject *vobj = iter->drawable->getVObj(); + if (vobj && vobj->getAvatar() + && vobj->isAttachment() && vobj->getAvatar() == muted_avatar) + { + gPipeline.mLights.erase(iter->drawable); + gPipeline.mNearbyLights.erase(iter); + } + } } U32 LLPipeline::addObject(LLViewerObject *vobj) diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index a4dfde66bcccd4d942b72d4e9c830eb4ae443cf7..f6208e11a5d956a9e3f0983fa4addba481c7f09a 100644 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -40,7 +40,7 @@ Klicken und ziehen, um Land auszuwählen </floater.string> <floater.string name="status_selectcount"> - [OBJ_COUNT] Objekte ausgewählt, Auswirkung auf Land [LAND_IMPACT] + [OBJ_COUNT] Objekte ausgewählt, Auswirkung auf Land [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?] </floater.string> <floater.string name="status_remaining_capacity"> Verbleibende Kapazität [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/en/floater_display_name.xml b/indra/newview/skins/default/xui/en/floater_display_name.xml index 3c8f4158605579d383dfa14fdcad8c1e0fc97ecb..f3431da858d78c15e9ccdf10845dde815941c8cf 100644 --- a/indra/newview/skins/default/xui/en/floater_display_name.xml +++ b/indra/newview/skins/default/xui/en/floater_display_name.xml @@ -56,7 +56,7 @@ max_length_chars="31" height="20" top_pad="5" - left="50" /> + left_delta="0" /> <text top_pad="15" left="25" @@ -72,23 +72,33 @@ max_length_chars="31" height="20" top_pad="5" - left="50" /> + left_delta="0" /> + <button + label="Reset" + layout="topleft" + font="SansSerif" + width="120" + height="23" + top_pad="40" + left_delta="0" + name="reset_btn" + tool_tip="Use Username as a Display Name" /> <button height="23" label="Save" layout="topleft" font="SansSerif" - left="35" + left_pad="35" name="save_btn" tool_tip="Save your new Display Name" - top_pad="40" + top_delta="0" width="120" /> <button height="23" label="Cancel" font="SansSerif" layout="topleft" - left_pad="125" + left_pad="5" name="cancel_btn" width="120" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index d37ca0e0cbc35a81613eb2faef12685cefeeafd3..7cdb46937f2b6bf7ea7ac6aa19833e675fee491e 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -1192,7 +1192,6 @@ even though the user gets a free copy. decimal_digits="0" increment="1" left_pad="0" - control_name="Edit Cost" name="Edit Cost" label="L$" label_width="15" diff --git a/indra/newview/skins/default/xui/en/menu_participant_view.xml b/indra/newview/skins/default/xui/en/menu_participant_view.xml index 7ea87ee05c442542a9bcc79117d6b710e832c664..b9750284cdf29e61b30b00ada3d99bdc4c788bb4 100644 --- a/indra/newview/skins/default/xui/en/menu_participant_view.xml +++ b/indra/newview/skins/default/xui/en/menu_participant_view.xml @@ -90,7 +90,7 @@ parameter="conversation_log" /> </menu_item_check> <menu_item_separator layout="topleft" /> - <menu_item_check name="Translate_chat" label="Translate Nearby chat"> + <menu_item_check name="Translate_chat" label="Translate chat"> <menu_item_check.on_click function="IMFloaterContainer.Action" parameter="Translating.Toggle" /> diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml index 2316beeb36c8cef72fe69dbd28852a079081a0b1..4c566dc60a13ce971b51c2f840c132512b713ddc 100644 --- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml @@ -92,10 +92,7 @@ label="Reset" left_delta="233" name="current_url_reset_btn" - width="110" > - <button.commit_callback - function="Media.ResetCurrentUrl"/> - </button> + width="110"/> <check_box bottom_delta="-25" enabled="true" diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml index 9b9c870c49f384ebd8a41ef55652b567df02232a..33e99a46aecf4a62d341ead9666955bb21e76679 100644 --- a/indra/newview/skins/default/xui/en/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml @@ -82,7 +82,7 @@ <view_border bevel_style="none" follows="top|left" - height="185" + height="205" layout="topleft" left="10" top_pad="5" @@ -125,6 +125,16 @@ tool_tip="Residents must have payment information on file to access this estate. See the [SUPPORT_SITE] for more information." top_pad="2" width="278" /> + <check_box + follows="top|left" + height="18" + label="Must not be a scripted agent" + layout="topleft" + left_delta="0" + name="limit_bots" + tool_tip="Residents must not be a scripted agents (bots) to access this estate. See the [SUPPORT_SITE] for more information." + top_pad="2" + width="278" /> <check_box height="18" label="Parcel owners can be more restrictive" diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index 5a6252550240d7b9213a084f377ad7f086fe70c8..4d5b7f35e0bf27b49e869d0531e4a44d59a151a5 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -467,7 +467,6 @@ follows="left|top" decimal_digits="0" increment="1" - control_name="Edit Cost" name="Edit Cost" label="Price: L$" label_width="75" @@ -478,8 +477,72 @@ max_val="999999999" top_pad="10" tool_tip="Object cost." /> - </panel> - + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="BaseMaskDebug" + text_color="White" + top_pad="30" + width="130"> + B: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="OwnerMaskDebug" + text_color="White" + top_delta="0" + width="270"> + O: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="GroupMaskDebug" + text_color="White" + top_delta="0" + width="210"> + G: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="EveryoneMaskDebug" + text_color="White" + top_delta="0" + width="150"> + E: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="NextMaskDebug" + text_color="White" + top_delta="0" + width="90"> + N: + </text> + </panel> </scroll_container> <panel height="30" diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml index 367a194daf23154f59bc1f133c18d665c33c1577..107539ad7ffadf676ebf23acf85d95a8ab8068ac 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -462,7 +462,6 @@ increment="1" top_pad="10" left="120" - control_name="Edit Cost" name="Edit Cost" label="Price: L$" label_width="73" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index e7b769bd32e83e83acc1c8b3a652946f77a91f91..b88bc8f07272225a6b82829ac45a03b90190f418 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -148,7 +148,7 @@ Voice Server Version: [VOICE_VERSION] <string name="LoginFailedViewerNotPermitted"> The viewer you are using can no longer access [CURRENT_GRID]. Please visit the following page to download a new viewer: https://www.alchemyviewer.org/pages/downloads.html</string> - <string name="LoginFailed">Grid emergency login failure. + <string name="LoginFailed">"Login process did not complete due to system issues. Try again in a few minutes. If you feel this is an error, please contact support.</string> <string name="LoginIntermediateOptionalUpdateAvailable">Optional viewer update available: [VERSION]</string> <string name="LoginFailedRequiredUpdate">Required viewer update: [VERSION]</string> diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index 6fce98472d1d5715a76f457dfdd3256e86c2180b..ffa85a2f04221e19cadf85cfddd415502784251b 100644 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -25,7 +25,7 @@ Pulsa y arrastra para seleccionar el terreno. </floater.string> <floater.string name="status_selectcount"> - [OBJ_COUNT] objetos seleccionados, impacto en el terreno [LAND_IMPACT] + [OBJ_COUNT] objetos seleccionados, impacto en el terreno [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?] </floater.string> <floater.string name="status_remaining_capacity"> Capacidad restante [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index 9597d38dcab206587c333bbc9541d552daea738d..c161f3f5306de68d1a20d0a607a2278abea1e613 100644 --- a/indra/newview/skins/default/xui/fr/floater_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_tools.xml @@ -40,7 +40,7 @@ Cliquez et faites glisser pour sélectionner le terrain. </floater.string> <floater.string name="status_selectcount"> - [OBJ_COUNT] objets sélectionnés, impact sur le terrain [LAND_IMPACT] + [OBJ_COUNT] objets sélectionnés, impact sur le terrain [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?] </floater.string> <floater.string name="status_remaining_capacity"> Capacité restante [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml index a21ae9a485ad110fac397d7888d49c694463c902..f98a2da277cbec7800ecd769f473537064e078f1 100644 --- a/indra/newview/skins/default/xui/it/floater_tools.xml +++ b/indra/newview/skins/default/xui/it/floater_tools.xml @@ -40,7 +40,7 @@ Clicca e trascina per selezionare il terreno </floater.string> <floater.string name="status_selectcount"> - [OBJ_COUNT] oggetti selezionati, impatto terreno [LAND_IMPACT] + [OBJ_COUNT] oggetti selezionati, impatto terreno [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?] </floater.string> <floater.string name="status_remaining_capacity"> Capacità restante [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index aec0dbdb555fa9cb77d5564eeba240b5ce7b9bbf..13f766698ebdd9746fa8f8c23dde2a150b6b851f 100644 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -40,7 +40,7 @@ 土地をクリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦é¸æŠž </floater.string> <floater.string name="status_selectcount"> - é¸æŠžã•れã¦ã„るオブジェクト㯠[OBJ_COUNT] 個ã€åœŸåœ°ã®è² è·ã¯ [LAND_IMPACT] + é¸æŠžã•れã¦ã„るオブジェクト㯠[OBJ_COUNT] 個ã€åœŸåœ°ã®è² è·ã¯ [LAND_IMPACT] [secondlife:///app/openfloater/object_weights 詳細] </floater.string> <floater.string name="status_remaining_capacity"> 残りã®è¨±å®¹æ•° [LAND_CAPACITY]。 diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml index 5e2ed4a3510b46a42b5e662bf0b06ef00ef1628e..8932a86fd1c8588eadc0c576252e8411e1da7864 100644 --- a/indra/newview/skins/default/xui/pl/floater_tools.xml +++ b/indra/newview/skins/default/xui/pl/floater_tools.xml @@ -40,7 +40,7 @@ Kliknij i przeciÄ…gnij, aby zaznaczyć teren </floater.string> <floater.string name="status_selectcount"> - [OBJ_COUNT] zaznaczonych obiektów, wpÅ‚yw na strefÄ™: [LAND_IMPACT] + [OBJ_COUNT] zaznaczonych obiektów, wpÅ‚yw na strefÄ™: [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?] </floater.string> <floater.string name="status_remaining_capacity"> Pojemność pozostaÅ‚a: [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml index 0882f485a6e652b0911328b5b1dc385430b29b51..c0eab171c8bbdd39928e44f9cc88e64f93a9316f 100644 --- a/indra/newview/skins/default/xui/pt/floater_tools.xml +++ b/indra/newview/skins/default/xui/pt/floater_tools.xml @@ -40,7 +40,7 @@ Clicar e arrastar para selecionar a terra </floater.string> <floater.string name="status_selectcount"> - [OBJ_COUNT] objetos selecionados, impacto no terreno [LAND_IMPACT] + [OBJ_COUNT] objetos selecionados, impacto no terreno [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?] </floater.string> <floater.string name="status_remaining_capacity"> Capacidade restante [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/ru/floater_tools.xml b/indra/newview/skins/default/xui/ru/floater_tools.xml index 82ee3c49ae112976ff71d58d94935659a4b0c69c..44f54aabb6dfd00aea2739b67076b5d2fbe15072 100644 --- a/indra/newview/skins/default/xui/ru/floater_tools.xml +++ b/indra/newview/skins/default/xui/ru/floater_tools.xml @@ -40,7 +40,7 @@ Щелкните и перетащите Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð·ÐµÐ¼Ð»Ð¸ </floater.string> <floater.string name="status_selectcount"> - Выбрано объектов: [OBJ_COUNT], влиÑние на землю [LAND_IMPACT] + Выбрано объектов: [OBJ_COUNT], влиÑние на землю [LAND_IMPACT] [secondlife:///app/openfloater/object_weights ?] </floater.string> <floater.string name="status_remaining_capacity"> ОÑтаток емкоÑти [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/tr/floater_tools.xml b/indra/newview/skins/default/xui/tr/floater_tools.xml index d6b9a4a533f79d4cb91b938908ec906dbfaa41c8..d48a617e388f01483405090a9b4b2e281f7cf630 100644 --- a/indra/newview/skins/default/xui/tr/floater_tools.xml +++ b/indra/newview/skins/default/xui/tr/floater_tools.xml @@ -40,7 +40,7 @@ Araziyi seçmek için tıklayın ve sürükleyin </floater.string> <floater.string name="status_selectcount"> - [OBJ_COUNT] nesne seçili, [LAND_IMPACT] arazi etkisi + [OBJ_COUNT] nesne seçili, [LAND_IMPACT] arazi etkisi [secondlife:///app/openfloater/object_weights Ek bilgi] </floater.string> <floater.string name="status_remaining_capacity"> Kalan kapasite [LAND_CAPACITY]. diff --git a/indra/newview/skins/default/xui/zh/floater_tools.xml b/indra/newview/skins/default/xui/zh/floater_tools.xml index 539c7454f1506453509da5697584e2a3bdceabb0..f83b058ce18b32196f875077a662324397e64d7e 100644 --- a/indra/newview/skins/default/xui/zh/floater_tools.xml +++ b/indra/newview/skins/default/xui/zh/floater_tools.xml @@ -40,7 +40,7 @@ 按ä½ä¸¦æ‹–曳,å¯ä»¥é¸å–土地 </floater.string> <floater.string name="status_selectcount"> - é¸å–了 [OBJ_COUNT] å€‹ç‰©ä»¶ï¼ŒåœŸåœ°è¡æ“Šé‡ [LAND_IMPACT] + é¸å–了 [OBJ_COUNT] å€‹ç‰©ä»¶ï¼ŒåœŸåœ°è¡æ“Šé‡ [LAND_IMPACT] [secondlife:///app/openfloater/object_weights 詳情] </floater.string> <floater.string name="status_remaining_capacity"> 剩餘容ç´é‡ [LAND_CAPACITY]。 diff --git a/indra/newview/tests/llslurl_test.cpp b/indra/newview/tests/llslurl_test.cpp index e5de7e3d45406f09782abf9f1df1a88789ded3f3..a0a27af28cea6ad79ebdc83f93a223b83e16fff8 100644 --- a/indra/newview/tests/llslurl_test.cpp +++ b/indra/newview/tests/llslurl_test.cpp @@ -274,7 +274,7 @@ namespace tut ensure_equals(" slurl, region + coords", slurl.getSLURLString(), "http://maps.secondlife.com/secondlife/my%20region/1/2/3"); -#ifndef HAVOK_BUILD +#ifndef LL_HAVOK LLGridManager::getInstance()->setGridChoice("my.grid.com"); slurl = LLSLURL("x-grid-info://my.grid.com/region/my%20region/1/2/3"); ensure_equals("grid slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); @@ -368,7 +368,7 @@ namespace tut ensure_equals(" default grid/region/vector", slurl.getSLURLString(), "http://maps.secondlife.com/secondlife/my%20region/1/2/3"); -#ifndef HAVOK_BUILD +#ifndef LL_HAVOK LLGridManager::getInstance()->setGridChoice("MyGrid"); slurl = LLSLURL("my region", LLVector3(1,2,3)); ensure_equals("default grid/region/vector - type", slurl.getType(), LLSLURL::LOCATION); @@ -377,7 +377,7 @@ namespace tut #endif } -#ifndef HAVOK_BUILD +#ifndef LL_HAVOK // x-grid-location-info template<> template<> void slurlTestObject::test<3>() diff --git a/indra/newview/tests/llversioninfo_test.cpp b/indra/newview/tests/llversioninfo_test.cpp index 064d2e0f7382e6aa97e0c77af6ec0999851d6d70..8e77708a92adad33626f3f8be2ff7a4468208a99 100644 --- a/indra/newview/tests/llversioninfo_test.cpp +++ b/indra/newview/tests/llversioninfo_test.cpp @@ -25,8 +25,6 @@ #include "linden_common.h" -#include "llviewerbuildconfig.h" - #include "../test/lltut.h" #include "../llversioninfo.h" diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp index 9b371cfdb9e1cf4bfad813f1aae031650cff8764..e77fcbd803333563ea9d78ae66c3a7674a39afef 100644 --- a/indra/newview/tests/llviewernetwork_test.cpp +++ b/indra/newview/tests/llviewernetwork_test.cpp @@ -280,7 +280,7 @@ namespace tut LLGridManager::getInstance()->isSystemGrid("util.aditi.lindenlab.com")); } -#ifndef HAVOK_BUILD +#ifndef LL_HAVOK // initialization with a grid file template<> template<> void viewerNetworkTestObject::test<2>() @@ -450,7 +450,7 @@ namespace tut uris[0], std::string("https://login.agni.lindenlab.com/cgi-bin/login.cgi")); -#ifndef HAVOK_BUILD +#ifndef LL_HAVOK LLGridManager::getInstance()->setGridChoice(std::string("altgrid.long.name")); ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 9f3aae2ee8022ed49322a01378fc4e3f3b703517..4cf8749b1126eb23218727a22666f9b2e181b9c5 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -83,12 +83,12 @@ def construct(self): # include the entire shaders directory recursively self.path("shaders") # include the extracted list of contributors - contributions_path = "../../doc/contributions.txt" + contributions_path = os.path.join(self.args['source'], "..", "..", "doc", "contributions.txt") contributor_names = self.extract_names(contributions_path) self.put_in_file(contributor_names, "contributors.txt", src=contributions_path) # include the extracted list of supporters - supporters_path = "../../doc/supporters.txt" + supporters_path = os.path.join(self.args['source'], "..", "..", "doc", "supporters.txt") supporters_names = self.extract_names(supporters_path) self.put_in_file(supporters_names, "supporters.txt", src=supporters_path) @@ -451,7 +451,7 @@ def construct(self): # Get shared libs from the shared libs staging directory with self.prefix(src=os.path.join(self.args['build'], os.pardir, - 'sharedlibs', self.args['configuration'])): + 'sharedlibs', self.args['buildtype'])): # For image support self.path("openjp2.dll") @@ -463,7 +463,7 @@ def construct(self): # Get fmodstudio dll for audio engine, continue if missing if self.args['fmodstudio'] == 'ON' or self.args['fmodstudio'] == 'TRUE': - if self.args['configuration'].lower() == 'debug': + if self.args['buildtype'].lower() == 'debug': self.path("fmodL.dll", "fmodL.dll") else: self.path(src="fmod.dll", dst="fmod.dll") @@ -499,13 +499,13 @@ def construct(self): # Media plugins - CEF with self.prefix(dst="llplugin"): with self.prefix(src=os.path.join(self.args['build'], os.pardir, 'media_plugins')): - if self.args['configuration'].lower() != 'debug': + if self.args['buildtype'].lower() != 'debug': with self.prefix(src=os.path.join('cef', self.args['configuration'])): self.path("media_plugin_cef.dll") - # Media plugins - LibVLC - with self.prefix(src=os.path.join('libvlc', self.args['configuration'])): - self.path("media_plugin_libvlc.dll") + # Media plugins - LibVLC + with self.prefix(src=os.path.join('libvlc', self.args['configuration'])): + self.path("media_plugin_libvlc.dll") # Media plugins - Example (useful for debugging - not shipped with release viewer) if self.channel_type() != 'release': @@ -514,8 +514,8 @@ def construct(self): # CEF runtime files - debug # CEF runtime files - not debug (release, relwithdebinfo etc.) - config = 'debug' if self.args['configuration'].lower() == 'debug' else 'release' - if self.args['configuration'].lower() != 'debug': + config = 'debug' if self.args['buildtype'].lower() == 'debug' else 'release' + if self.args['buildtype'].lower() != 'debug': with self.prefix(src=os.path.join(pkgdir, 'bin', config)): self.path("chrome_elf.dll") self.path("d3dcompiler_47.dll") @@ -529,8 +529,6 @@ def construct(self): self.path("v8_context_snapshot.bin") self.path("vk_swiftshader_icd.json") - self.path_optional("vcruntime140_1.dll") - # CEF files common to all configurations with self.prefix(src=os.path.join(pkgdir, 'resources')): self.path("chrome_100_percent.pak") @@ -700,7 +698,7 @@ def construct(self): pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') relpkgdir = os.path.join(pkgdir, "lib", "release") debpkgdir = os.path.join(pkgdir, "lib", "debug") - libdir = debpkgdir if self.args['configuration'].lower() == 'debug' else relpkgdir + libdir = debpkgdir if self.args['buildtype'].lower() == 'debug' else relpkgdir with self.prefix(src="", dst="Contents"): # everything goes in Contents # CEF framework goes inside Contents/Frameworks. @@ -722,7 +720,7 @@ def construct(self): self.path(libfile) if self.args['fmodstudio'] == 'ON' or self.args['fmodstudio'] == 'TRUE': - if self.args['configuration'].lower() == 'debug': + if self.args['buildtype'].lower() == 'debug': self.path("libfmodL.dylib") else: self.path("libfmod.dylib") diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt index ca2f0fc967f6689c1dccc057d9bfa0426d7e34cc..a5f28c6a5a1bf208f2e8c3cbed2fc89c73ea1055 100644 --- a/indra/test/CMakeLists.txt +++ b/indra/test/CMakeLists.txt @@ -6,32 +6,10 @@ include(00-Common) include(Sentry) include(LLCommon) include(LLCoreHttp) -include(LLInventory) -include(LLMath) -include(LLMessage) -include(LLFileSystem) -include(LLXML) include(Linking) include(Tut) include(LLAddBuildTest) -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLCOREHTTP_INCLUDE_DIRS} - ${LLDATABASE_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLMESSAGE_INCLUDE_DIRS} - ${LLINVENTORY_INCLUDE_DIRS} - ${LLFILESYSTEM_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ${LSCRIPT_INCLUDE_DIRS} - ${TUT_INCLUDE_DIR} - ) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLXML_SYSTEM_INCLUDE_DIRS} - ) - set(test_SOURCE_FILES io.cpp llapp_tut.cpp @@ -73,37 +51,19 @@ if (NOT WINDOWS) ) endif (NOT WINDOWS) -set_source_files_properties(${test_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND test_SOURCE_FILES ${test_HEADER_FILES}) add_executable(lltest ${test_SOURCE_FILES}) -if (USE_SENTRY) - set_target_properties(lltest PROPERTIES COMPILE_DEFINITIONS "${SENTRY_DEFINE}") -endif (USE_SENTRY) - target_link_libraries(lltest - ${LLDATABASE_LIBRARIES} - ${LLINVENTORY_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLFILESYSTEM_LIBRARIES} - ${LLXML_LIBRARIES} - ${LSCRIPT_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${EXPAT_LIBRARIES} - ${PTHREAD_LIBRARY} - ${WINDOWS_LIBRARIES} - ${BOOST_PROGRAM_OPTIONS_LIBRARY} - ${BOOST_REGEX_LIBRARY} - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - ${DL_LIBRARY} - ) + llinventory + llmessage + llmath + llfilesystem + llxml + llcommon + llcorehttp + ) if (WINDOWS) set_target_properties(lltest @@ -115,10 +75,10 @@ endif (WINDOWS) set(TEST_EXE $<TARGET_FILE:lltest>) -SET_TEST_PATH(DYLD_LIBRARY_PATH) +SET_TEST_PATH(LD_LIBRARY_PATH) LL_TEST_COMMAND(command - "${DYLD_LIBRARY_PATH}" + "${LD_LIBRARY_PATH}" "${TEST_EXE}" "--output=${CMAKE_CURRENT_BINARY_DIR}/cpp_test_results.txt" "--touch=${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt") @@ -139,4 +99,13 @@ set(test_results ${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt) # developers choose to disable LL_TESTS. if (LL_TESTS) add_custom_target(tests_ok ALL DEPENDS ${test_results}) + if(DARWIN) + # Support our "@executable_path/../Resources" load path for our test + # executable. This SHOULD properly be "$<TARGET_FILE_DIR:lltest>/Resources", + # but the CMake $<TARGET_FILE_DIR> generator expression isn't evaluated by + # CREATE_LINK, so fudge it. + add_custom_command( TARGET lltest POST_BUILD + COMMAND cmake -E create_symlink ${SHARED_LIB_STAGING_DIR} ${CMAKE_BINARY_DIR}/test/Resources + ) + endif() endif (LL_TESTS) diff --git a/indra/test/lldoubledispatch_tut.cpp b/indra/test/lldoubledispatch_tut.cpp index e38d0e92a37df87af763c7f450738f20e9e598a2..dbf55e666f19b3173ea4521c9a7942187462b82f 100644 --- a/indra/test/lldoubledispatch_tut.cpp +++ b/indra/test/lldoubledispatch_tut.cpp @@ -35,8 +35,9 @@ #include "lldoubledispatch.h" // STL headers // std headers -#include <string> #include <iostream> +#include <memory> +#include <string> #include <typeinfo> // external library headers // other Linden headers diff --git a/indra/viewer_components/login/CMakeLists.txt b/indra/viewer_components/login/CMakeLists.txt index 23518b791c0a7d78967376b837565b9b86c25858..8381803b03870a8abb3c96da6b21f62776307c22 100644 --- a/indra/viewer_components/login/CMakeLists.txt +++ b/indra/viewer_components/login/CMakeLists.txt @@ -7,21 +7,7 @@ if(LL_TESTS) include(LLAddBuildTest) endif(LL_TESTS) include(LLCommon) -include(LLMath) -include(LLXML) -include(Boost) include(LLCoreHttp) -include(LLMessage) - -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLXML_SYSTEM_INCLUDE_DIRS} - ) set(login_SOURCE_FILES lllogin.cpp @@ -31,9 +17,6 @@ set(login_HEADER_FILES lllogin.h ) -set_source_files_properties(${login_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND login_SOURCE_FILES ${login_HEADER_FILES} @@ -42,17 +25,14 @@ list(APPEND add_library(lllogin ${login_SOURCE_FILES} ) +target_include_directories( lllogin INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(lllogin - ${LLMESSAGE_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLXML_LIBRARIES} - ${BOOST_THREAD_LIBRARY} - ${BOOST_FIBER_LIBRARY} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} + llmessage + llcorehttp + llcommon + llmath + llxml ) if(LL_TESTS) @@ -62,7 +42,7 @@ if(LL_TESTS) set_source_files_properties( lllogin.cpp PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${LLMESSAGE_LIBRARIES};${LLCOREHTTP_LIBRARIES};${LLCOMMON_LIBRARIES};${BOOST_FIBER_LIBRARY};${BOOST_CONTEXT_LIBRARY};${BOOST_THREAD_LIBRARY};${BOOST_SYSTEM_LIBRARY}" + LL_TEST_ADDITIONAL_LIBRARIES llmessage llcorehttp llcommon ) LL_ADD_PROJECT_UNIT_TESTS(lllogin "${lllogin_TEST_SOURCE_FILES}") diff --git a/scripts/packages-formatter.py b/scripts/packages-formatter.py index dafa0bf53b7bb687ce88c46416ba6d589849cdae..5d31702e7668de95c2cb81b7ce3e47bcea6c2374 100755 --- a/scripts/packages-formatter.py +++ b/scripts/packages-formatter.py @@ -34,6 +34,7 @@ parser = argparse.ArgumentParser(description='Format dependency version and copyright information for the viewer About box content') parser.add_argument('channel', help='viewer channel name') parser.add_argument('version', help='viewer version number') +parser.add_argument('install_dir', help="install dir of packages") args = parser.parse_args() _autobuild=os.getenv('AUTOBUILD', 'autobuild') @@ -74,8 +75,8 @@ def add_info(key, pkg, lines): else: dups[key].add(pkg) -versions=autobuild('install', '--versions') -copyrights=autobuild('install', '--copyrights') +versions=autobuild('install', '--versions', '--install-dir', args.install_dir) +copyrights=autobuild('install', '--copyrights', '--install-dir', args.install_dir) viewer_copyright = copyrights.readline() # first line is the copyright for the viewer itself # Two different autobuild outputs, but we treat them essentially the same way: