diff options
| author | Nat Goodspeed <nat@lindenlab.com> | 2018-10-17 10:56:43 -0400 | 
|---|---|---|
| committer | Nat Goodspeed <nat@lindenlab.com> | 2018-10-17 10:56:43 -0400 | 
| commit | d81863d23d49f3a71fb477d7e5c9d149b14da9f2 (patch) | |
| tree | 02e236d6bc530067d020c889c15f0c54f648a001 /indra/newview | |
| parent | 036c52fcdf425fe79a9aa6682cd7c7fe709a2442 (diff) | |
DRTVWR-447: Finish merging Poseidon into BugSplat
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/CMakeLists.txt | 339 | ||||
| -rwxr-xr-x | indra/newview/viewer_manifest.py | 318 | 
2 files changed, 412 insertions, 245 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index e7111ebe54..5c918fc3b2 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -3,7 +3,14 @@  project(viewer)  include(00-Common) +# DON'T move Linking.cmake to its place in the alphabetized list below: it +# sets variables on which the 3p .cmake files depend. +include(Linking) +  include(Boost) +if (BUGSPLAT_DB) +  include(bugsplat) +endif (BUGSPLAT_DB)  include(BuildPackagesInfo)  include(BuildVersion)  include(CMakeCopyIfDifferent) @@ -36,7 +43,6 @@ include(LLUI)  include(LLVFS)  include(LLWindow)  include(LLXML) -include(Linking)  include(NDOF)  include(NVAPI)  include(OPENAL) @@ -91,6 +97,12 @@ include_directories(      ${CMAKE_CURRENT_SOURCE_DIR}      ) +if (BUGSPLAT_DB) +  include_directories( +    ${BUGSPLAT_INCLUDE_DIR} +    ) +endif (BUGSPLAT_DB) +  include_directories(SYSTEM      ${LLCOMMON_SYSTEM_INCLUDE_DIRS}      ${LLXML_SYSTEM_INCLUDE_DIRS} @@ -1354,6 +1366,14 @@ if (DARWIN)    # This should be compiled with the viewer.    LIST(APPEND viewer_SOURCE_FILES llappdelegate-objc.mm) +  set_source_files_properties( +    llappdelegate-objc.mm +    PROPERTIES +    COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" +    # BugsplatMac is a module, imported with @import. That language feature +    # demands these switches. +    COMPILE_FLAGS "-fmodules -fcxx-modules" +    )    find_library(AGL_LIBRARY AGL)    find_library(APPKIT_LIBRARY AppKit) @@ -1368,6 +1388,12 @@ if (DARWIN)      ${COREAUDIO_LIBRARY}      ) +  if (BUGSPLAT_DB) +    list(APPEND viewer_LIBRARIES +      ${BUGSPLAT_LIBRARIES} +      ) +  endif (BUGSPLAT_DB) +    # Add resource files to the project.    set(viewer_RESOURCE_FILES      secondlife.icns @@ -1393,6 +1419,11 @@ endif (DARWIN)  if (LINUX)      LIST(APPEND viewer_SOURCE_FILES llappviewerlinux.cpp) +    set_source_files_properties( +      llappviewerlinux.cpp +      PROPERTIES +      COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" +      )      LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp)      SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") @@ -1409,6 +1440,11 @@ if (WINDOWS)           llappviewerwin32.cpp           llwindebug.cpp           ) +    set_source_files_properties( +      llappviewerwin32.cpp +      PROPERTIES +      COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" +      )      list(APPEND viewer_HEADER_FILES           llappviewerwin32.h @@ -1691,6 +1727,11 @@ if (SDL_FOUND)      )  endif (SDL_FOUND) +if (BUGSPLAT_DB) +  set_property(TARGET ${VIEWER_BINARY_NAME} +    PROPERTY COMPILE_DEFINITIONS "LL_BUGSPLAT") +endif (BUGSPLAT_DB) +  # add package files  file(GLOB EVENT_HOST_SCRIPT_GLOB_LIST       ${CMAKE_CURRENT_SOURCE_DIR}/../viewer_components/*.py) @@ -1789,7 +1830,7 @@ if (WINDOWS)             ${SHARED_LIB_STAGING_DIR}/Debug/fmodexL.dll            )      endif (FMODEX) -     +      add_custom_command(        OUTPUT  ${CMAKE_CFG_INTDIR}/copy_touched.bat        COMMAND ${PYTHON_EXECUTABLE} @@ -1798,15 +1839,16 @@ if (WINDOWS)          --actions=copy          --arch=${ARCH}          --artwork=${ARTWORK_DIR} +        "--bugsplat=${BUGSPLAT_DB}"          --build=${CMAKE_CURRENT_BINARY_DIR}          --buildtype=${CMAKE_BUILD_TYPE} +        "--channel=${VIEWER_CHANNEL}"          --configuration=${CMAKE_CFG_INTDIR}          --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}          --grid=${GRID} -        "--channel=${VIEWER_CHANNEL}" -        --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt          --source=${CMAKE_CURRENT_SOURCE_DIR}          --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat +        --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt        DEPENDS          ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py          stage_third_party_libs @@ -1824,24 +1866,9 @@ if (WINDOWS)      add_dependencies(${VIEWER_BINARY_NAME}        SLPlugin -   windows-crash-logger +      windows-crash-logger      ) -    # sets the 'working directory' for debugging from visual studio. -    if (NOT UNATTENDED) -        add_custom_command( -            TARGET ${VIEWER_BINARY_NAME} POST_BUILD -            COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe -            ARGS -              --solution -              ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln -              --workingdir -              ${VIEWER_BINARY_NAME} -              "${CMAKE_CURRENT_SOURCE_DIR}" -            COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging." -            ) -    endif (NOT UNATTENDED) -      if (PACKAGE)        add_custom_command(          OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2 @@ -1864,15 +1891,16 @@ if (WINDOWS)            ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py            --arch=${ARCH}            --artwork=${ARTWORK_DIR} +          "--bugsplat=${BUGSPLAT_DB}"            --build=${CMAKE_CURRENT_BINARY_DIR}            --buildtype=${CMAKE_BUILD_TYPE}            "--channel=${VIEWER_CHANNEL}" -          --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt            --configuration=${CMAKE_CFG_INTDIR}            --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}            --grid=${GRID}            --source=${CMAKE_CURRENT_SOURCE_DIR}            --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat +          --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt          DEPENDS              ${VIEWER_BINARY_NAME}              ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py @@ -1903,8 +1931,8 @@ else (WINDOWS)  endif (WINDOWS)  # *NOTE: - this list is very sensitive to ordering, test carefully on all -# platforms if you change the releative order of the entries here. -# In particular, cmake 2.6.4 (when buidling with linux/makefile generators) +# platforms if you change the relative order of the entries here. +# In particular, cmake 2.6.4 (when building with linux/makefile generators)  # appears to sometimes de-duplicate redundantly listed dependencies improperly.  # To work around this, higher level modules should be listed before the modules  # that they depend upon. -brad @@ -1979,6 +2007,12 @@ target_link_libraries(${VIEWER_BINARY_NAME}      ${LLAPPEARANCE_LIBRARIES}      ) +if (BUGSPLAT_DB) +  target_link_libraries(${VIEWER_BINARY_NAME} +    ${BUGSPLAT_LIBRARIES} +    ) +endif (BUGSPLAT_DB) +  set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH      "Path to artwork files.") @@ -2002,15 +2036,16 @@ if (LINUX)          ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py          --arch=${ARCH}          --artwork=${ARTWORK_DIR} +        "--bugsplat=${BUGSPLAT_DB}"          --build=${CMAKE_CURRENT_BINARY_DIR}          --buildtype=${CMAKE_BUILD_TYPE}          "--channel=${VIEWER_CHANNEL}" -        --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt          --configuration=${CMAKE_CFG_INTDIR}          --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged          --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        DEPENDS          ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py          ${COPY_INPUT_DEPENDENCIES} @@ -2024,17 +2059,18 @@ if (LINUX)      COMMAND ${PYTHON_EXECUTABLE}      ARGS        ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py -      --arch=${ARCH}        --actions=copy +      --arch=${ARCH}        --artwork=${ARTWORK_DIR} +      "--bugsplat=${BUGSPLAT_DB}"        --build=${CMAKE_CURRENT_BINARY_DIR}        --buildtype=${CMAKE_BUILD_TYPE} +      "--channel=${VIEWER_CHANNEL}"        --configuration=${CMAKE_CFG_INTDIR}        --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged        --grid=${GRID} -      "--channel=${VIEWER_CHANNEL}" -      --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt        --source=${CMAKE_CURRENT_SOURCE_DIR} +      --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt      DEPENDS        ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py        ${COPY_INPUT_DEPENDENCIES} @@ -2052,31 +2088,45 @@ if (LINUX)  endif (LINUX)  if (DARWIN) -  # These all get set with PROPERTIES -  set(product "Second Life") -  set(MACOSX_EXECUTABLE_NAME "Second Life") -  set(MACOSX_BUNDLE_INFO_STRING "Second Life Viewer") +  # These all get set with PROPERTIES. It's not that the property names are +  # magically known to CMake -- it's that these names are referenced in the +  # Info-SecondLife.plist file in the configure_file() directive below. +  set(product "${VIEWER_CHANNEL}") +  set(MACOSX_BUNDLE_INFO_STRING "${VIEWER_CHANNEL}")    set(MACOSX_BUNDLE_ICON_FILE "secondlife.icns")    set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.secondlife.indra.viewer")    set(MACOSX_BUNDLE_LONG_VERSION_STRING "${VIEWER_CHANNEL} ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}")    set(MACOSX_BUNDLE_BUNDLE_NAME "SecondLife") -  set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}") +  set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}")    set(MACOSX_BUNDLE_BUNDLE_VERSION "${VIEWER_SHORT_VERSION}${VIEWER_MACOSX_PHASE}${VIEWER_REVISION}")    set(MACOSX_BUNDLE_COPYRIGHT "Copyright © Linden Research, Inc. 2007")    set(MACOSX_BUNDLE_NSMAIN_NIB_FILE "SecondLife.nib")    set(MACOSX_BUNDLE_NSPRINCIPAL_CLASS "NSApplication") + +  # https://blog.kitware.com/upcoming-in-cmake-2-8-12-osx-rpath-support/ +  set(CMAKE_MACOSX_RPATH 1)    set_target_properties(      ${VIEWER_BINARY_NAME}      PROPERTIES      OUTPUT_NAME "${product}" +    # From Contents/MacOS/SecondLife, look in Contents/Frameworks +    INSTALL_RPATH "@loader_path/../Frameworks" +    # SIGH, as of 2018-05-24 (cmake 3.11.1) the INSTALL_RPATH property simply +    # does not work. Try this: +    LINK_FLAGS "-rpath @loader_path/../Frameworks"      MACOSX_BUNDLE_INFO_PLIST      "${CMAKE_CURRENT_SOURCE_DIR}/Info-SecondLife.plist"      ) +  set(VIEWER_APP_BUNDLE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${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") +    configure_file(       "${CMAKE_CURRENT_SOURCE_DIR}/Info-SecondLife.plist" -     "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app/Contents/Info.plist" +     "${VIEWER_APP_BUNDLE}/Contents/Info.plist"      )    add_custom_command( @@ -2087,15 +2137,16 @@ if (DARWIN)        --actions=copy        --arch=${ARCH}        --artwork=${ARTWORK_DIR} +      "--bugsplat=${BUGSPLAT_DB}"        --build=${CMAKE_CURRENT_BINARY_DIR}        --buildtype=${CMAKE_BUILD_TYPE} +      --bundleid=${MACOSX_BUNDLE_GUI_IDENTIFIER} +      "--channel=${VIEWER_CHANNEL}"        --configuration=${CMAKE_CFG_INTDIR} -      --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app +      --dest=${VIEWER_APP_BUNDLE}        --grid=${GRID} -      "--channel=${VIEWER_CHANNEL}" -      --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt -      --bundleid=${MACOSX_BUNDLE_GUI_IDENTIFIER}        --source=${CMAKE_CURRENT_SOURCE_DIR} +      --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt      DEPENDS        ${VIEWER_BINARY_NAME}        ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py @@ -2120,15 +2171,16 @@ if (DARWIN)            ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py            --arch=${ARCH}            --artwork=${ARTWORK_DIR} +          "--bugsplat=${BUGSPLAT_DB}"            --build=${CMAKE_CURRENT_BINARY_DIR}            --buildtype=${CMAKE_BUILD_TYPE} +          "--channel=${VIEWER_CHANNEL}"            --configuration=${CMAKE_CFG_INTDIR} -          --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app +          --dest=${VIEWER_APP_BUNDLE}            --grid=${GRID} -          "--channel=${VIEWER_CHANNEL}" -          --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt            --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}          DEPENDS            ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py @@ -2140,67 +2192,152 @@ if (INSTALL)    include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake)  endif (INSTALL) -if (PACKAGE) -  set(SYMBOL_SEARCH_DIRS "") -  # Note that the path to VIEWER_SYMBOL_FILE must match that in ../../build.sh -  if (WINDOWS) -    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") -    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-windows-$ENV{AUTOBUILD_ADDRSIZE}.tar.bz2") -    # slplugin.exe failing symbols dump - need to debug, might have to do with updated version of google breakpad -    # set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe") -    set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX}") -    set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}") -    set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest) -  endif (WINDOWS) -  if (DARWIN) -    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") -    # *TODO: Generate these search dirs in the cmake files related to each binary. -    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}") -    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_crash_logger/${CMAKE_CFG_INTDIR}") -    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}") -    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin-$ENV{AUTOBUILD_ADDRSIZE}.tar.bz2") -    set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin mac-crash-logger") -    set(VIEWER_EXE_GLOBS "'Second Life' mac-crash-logger") -    set(VIEWER_LIB_GLOB "*.dylib") -  endif (DARWIN) -  if (LINUX) -    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged") -    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux-$ENV{AUTOBUILD_ADDRSIZE}.tar.bz2") -    set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin") -    set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin") -    set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*") -    set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest) -  endif (LINUX) - -  if(RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) -  if(CMAKE_CFG_INTDIR STREQUAL ".") -      set(LLBUILD_CONFIG ${CMAKE_BUILD_TYPE}) -  else(CMAKE_CFG_INTDIR STREQUAL ".") -      # set LLBUILD_CONFIG to be a shell variable evaluated at build time -      # reflecting the configuration we are currently building. -      set(LLBUILD_CONFIG ${CMAKE_CFG_INTDIR}) -  endif(CMAKE_CFG_INTDIR STREQUAL ".") -  add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}" -    COMMAND "${PYTHON_EXECUTABLE}" -    ARGS -      "${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py" -      "${LLBUILD_CONFIG}" -      "${SYMBOL_SEARCH_DIRS}" -      "${VIEWER_EXE_GLOBS}" -      "${VIEWER_LIB_GLOB}" -      "${AUTOBUILD_INSTALL_DIR}/bin/dump_syms" -      "${VIEWER_SYMBOL_FILE}" -    DEPENDS generate_breakpad_symbols.py -        VERBATIM) - -  add_custom_target(generate_breakpad_symbols DEPENDS "${VIEWER_SYMBOL_FILE}" "${VIEWER_BINARY_NAME}" "${VIEWER_COPY_MANIFEST}") -  add_dependencies(generate_breakpad_symbols "${VIEWER_BINARY_NAME}") -  if (WINDOWS OR LINUX) -    add_dependencies(generate_breakpad_symbols "${VIEWER_COPY_MANIFEST}") -  endif (WINDOWS OR LINUX) -  add_dependencies(llpackage generate_breakpad_symbols) -  endif(RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) -endif (PACKAGE) +# Note that the conventional VIEWER_SYMBOL_FILE is set by ../../build.sh +if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIEWER_SYMBOL_FILE) +  if (NOT BUGSPLAT_DB) +    # Breakpad symbol-file generation +    set(SYMBOL_SEARCH_DIRS "") +    if (WINDOWS) +      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") +      # slplugin.exe failing symbols dump - need to debug, might have to do with updated version of google breakpad +      # set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe") +      set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX}") +      set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}") +      set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest) +    endif (WINDOWS) +    if (DARWIN) +      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") +      # *TODO: Generate these search dirs in the cmake files related to each binary. +      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}") +      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_crash_logger/${CMAKE_CFG_INTDIR}") +      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}") +      set(VIEWER_EXE_GLOBS "'${product}' SLPlugin mac-crash-logger") +      set(VIEWER_EXE_GLOBS "'${product}' mac-crash-logger") +      set(VIEWER_LIB_GLOB "*.dylib") +    endif (DARWIN) +    if (LINUX) +      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged") +      set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin") +      set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin") +      set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*") +      set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest) +    endif (LINUX) + +    if(CMAKE_CFG_INTDIR STREQUAL ".") +        set(LLBUILD_CONFIG ${CMAKE_BUILD_TYPE}) +    else(CMAKE_CFG_INTDIR STREQUAL ".") +        # set LLBUILD_CONFIG to be a shell variable evaluated at build time +        # reflecting the configuration we are currently building. +        set(LLBUILD_CONFIG ${CMAKE_CFG_INTDIR}) +    endif(CMAKE_CFG_INTDIR STREQUAL ".") +    add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}" +      COMMAND "${PYTHON_EXECUTABLE}" +      ARGS +        "${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py" +        "${LLBUILD_CONFIG}" +        "${SYMBOL_SEARCH_DIRS}" +        "${VIEWER_EXE_GLOBS}" +        "${VIEWER_LIB_GLOB}" +        "${AUTOBUILD_INSTALL_DIR}/bin/dump_syms" +        "${VIEWER_SYMBOL_FILE}" +      DEPENDS generate_breakpad_symbols.py +          VERBATIM) + +    add_custom_target(generate_symbols DEPENDS "${VIEWER_SYMBOL_FILE}" ${VIEWER_BINARY_NAME} "${VIEWER_COPY_MANIFEST}") +    add_dependencies(generate_symbols ${VIEWER_BINARY_NAME}) +    if (WINDOWS OR LINUX) +      add_dependencies(generate_symbols "${VIEWER_COPY_MANIFEST}") +    endif (WINDOWS OR LINUX) + +  else (NOT BUGSPLAT_DB) +    # BugSplat symbol-file generation +    if (WINDOWS) +      # Just pack up a tarball containing only the .pdb file for the +      # executable. Because we intend to use cygwin tar, we must render +      # VIEWER_SYMBOL_FILE in cygwin path syntax. +      execute_process(COMMAND "cygpath" "-u" "${VIEWER_SYMBOL_FILE}" +        OUTPUT_VARIABLE VIEWER_SYMBOL_FILE_CYGWIN +        OUTPUT_STRIP_TRAILING_WHITESPACE) +      execute_process(COMMAND "cygpath" "-u" "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}" +        OUTPUT_VARIABLE PARENT_DIRECTORY_CYGWIN +        OUTPUT_STRIP_TRAILING_WHITESPACE) +      add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}" +        # Use of 'tar ...j' here assumes VIEWER_SYMBOL_FILE endswith .tar.bz2; +        # testing a string suffix is painful enough in CMake language that +        # we'll continue assuming it until forced to generalize. +        COMMAND "tar" +        ARGS +          "cjf" +          "${VIEWER_SYMBOL_FILE_CYGWIN}" +          "-C" +          "${PARENT_DIRECTORY_CYGWIN}" +          "secondlife-bin.pdb" +        DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-bin.pdb" +        COMMENT "Packing viewer PDB into ${VIEWER_SYMBOL_FILE_CYGWIN}" +        ) +      add_custom_target(generate_symbols DEPENDS "${VIEWER_SYMBOL_FILE}" ${VIEWER_BINARY_NAME}) +      add_dependencies(generate_symbols ${VIEWER_BINARY_NAME}) +    endif (WINDOWS) +    if (DARWIN) +      # Have to run dsymutil first, then pack up the resulting .dSYM directory +      add_custom_command(OUTPUT "${VIEWER_APP_DSYM}" +        COMMAND "dsymutil" +        ARGS +          ${VIEWER_APP_EXE} +        COMMENT "Generating ${VIEWER_APP_DSYM}" +        ) +      add_custom_target(dsym_generate DEPENDS "${VIEWER_APP_DSYM}") +      add_dependencies(dsym_generate ${VIEWER_BINARY_NAME}) +      add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}" +        # See above comments about "tar ...j" +        COMMAND "tar" +        ARGS +          "cjf" +          "${VIEWER_SYMBOL_FILE}" +          "-C" +          "${VIEWER_APP_DSYM}/.." +          "${product}.dSYM" +        DEPENDS "${VIEWER_APP_DSYM}" +        COMMENT "Packing dSYM into ${VIEWER_SYMBOL_FILE}" +        ) +      add_custom_target(dsym_tarball DEPENDS "${VIEWER_SYMBOL_FILE}") +      add_dependencies(dsym_tarball dsym_generate) +      add_custom_command(OUTPUT "${VIEWER_APP_XCARCHIVE}" +        COMMAND "zip" +        ARGS +          "-r" +          "${VIEWER_APP_XCARCHIVE}" +          "." +        WORKING_DIRECTORY "${VIEWER_APP_DSYM}/.." +        DEPENDS "${VIEWER_APP_DSYM}" +        COMMENT "Generating xcarchive.zip for upload to BugSplat" +        ) +      add_custom_target(dsym_xcarchive DEPENDS "${VIEWER_APP_XCARCHIVE}") +      add_dependencies(dsym_xcarchive dsym_generate) +      # Have to create a stamp file, and depend on it, to force CMake to run +      # the cleanup step. +      add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/dsym.stamp" +        COMMAND rm -rf "${VIEWER_APP_DSYM}" +        COMMAND touch "${CMAKE_CURRENT_BINARY_DIR}/dsym.stamp" +        DEPENDS "${VIEWER_SYMBOL_FILE}" "${VIEWER_APP_XCARCHIVE}" +        COMMENT "Cleaning up dSYM" +        ) +      add_custom_target(generate_symbols DEPENDS +        "${VIEWER_APP_DSYM}" +        "${VIEWER_SYMBOL_FILE}" +        "${VIEWER_APP_XCARCHIVE}" +        "${CMAKE_CURRENT_BINARY_DIR}/dsym.stamp" +        ) +      add_dependencies(generate_symbols dsym_tarball dsym_xcarchive) +    endif (DARWIN) +    if (LINUX) +      # TBD +    endif (LINUX) +  endif (NOT BUGSPLAT_DB) + +  # for both BUGSPLAT_DB and Breakpad +  add_dependencies(llpackage generate_symbols) +endif ()  if (LL_TESTS)    # To add a viewer unit test, just add the test .cpp file below diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 57da87a3ee..5dd4d13a3a 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -26,19 +26,20 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA  Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA  $/LicenseInfo$  """ -import sys -import os -import os.path -import shutil  import errno  import json +import os +import os.path  import plistlib  import random  import re +import shutil  import stat  import subprocess +import sys  import tarfile  import time +import zipfile  viewer_dir = os.path.dirname(__file__)  # Add indra/lib/python to our path so we don't have to muck with PYTHONPATH. @@ -63,7 +64,7 @@ class ViewerManifest(LLManifest):          self.path(src="../../etc/message.xml", dst="app_settings/message.xml")          if self.is_packaging_viewer(): -            with self.prefix(src="app_settings"): +            with self.prefix(src_dst="app_settings"):                  self.exclude("logcontrol.xml")                  self.exclude("logcontrol-dev.xml")                  self.path("*.ini") @@ -85,7 +86,7 @@ class ViewerManifest(LLManifest):                  # ... and the included spell checking dictionaries                  pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') -                with self.prefix(src=pkgdir,dst=""): +                with self.prefix(src=pkgdir):                      self.path("dictionaries")                  # include the extracted packages information (see BuildPackagesInfo.cmake) @@ -107,17 +108,18 @@ class ViewerManifest(LLManifest):                                          Type='String',                                          Value=''))                  settings_install = {} -                if 'sourceid' in self.args and self.args['sourceid']: +                sourceid = self.args.get('sourceid') +                if sourceid:                      settings_install['sourceid'] = settings_template['sourceid'].copy() -                    settings_install['sourceid']['Value'] = self.args['sourceid'] -                    print "Set sourceid in settings_install.xml to '%s'" % self.args['sourceid'] +                    settings_install['sourceid']['Value'] = sourceid +                    print "Set sourceid in settings_install.xml to '%s'" % sourceid -                if 'channel_suffix' in self.args and self.args['channel_suffix']: +                if self.args.get('channel_suffix'):                      settings_install['CmdLineChannel'] = settings_template['CmdLineChannel'].copy()                      settings_install['CmdLineChannel']['Value'] = self.channel_with_pkg_suffix()                      print "Set CmdLineChannel in settings_install.xml to '%s'" % self.channel_with_pkg_suffix() -                if 'grid' in self.args and self.args['grid']: +                if self.args.get('grid'):                      settings_install['CmdLineGridChoice'] = settings_template['CmdLineGridChoice'].copy()                      settings_install['CmdLineGridChoice']['Value'] = self.grid()                      print "Set CmdLineGridChoice in settings_install.xml to '%s'" % self.grid() @@ -129,20 +131,20 @@ class ViewerManifest(LLManifest):                                   src="environment") -            with self.prefix(src="character"): +            with self.prefix(src_dst="character"):                  self.path("*.llm")                  self.path("*.xml")                  self.path("*.tga")              # Include our fonts -            with self.prefix(src="fonts"): +            with self.prefix(src_dst="fonts"):                  self.path("*.ttf")                  self.path("*.txt")              # skins -            with self.prefix(src="skins"): +            with self.prefix(src_dst="skins"):                      # include the entire textures directory recursively -                    with self.prefix(src="*/textures"): +                    with self.prefix(src_dst="*/textures"):                              self.path("*/*.tga")                              self.path("*/*.j2c")                              self.path("*/*.jpg") @@ -170,7 +172,7 @@ class ViewerManifest(LLManifest):              # local_assets dir (for pre-cached textures) -            with self.prefix(src="local_assets"): +            with self.prefix(src_dst="local_assets"):                  self.path("*.j2c")                  self.path("*.tga") @@ -186,6 +188,10 @@ class ViewerManifest(LLManifest):                              "Address Size":self.address_size,                              "Update Service":"https://update.secondlife.com/update",                              } +            # Only store this if it's both present and non-empty +            bugsplat_db = self.args.get('bugsplat') +            if bugsplat_db: +                build_data_dict["BugSplat DB"] = bugsplat_db              build_data_dict = self.finish_build_data_dict(build_data_dict)              with open(os.path.join(os.pardir,'build_data.json'), 'w') as build_data_handle:                  json.dump(build_data_dict,build_data_handle) @@ -206,8 +212,9 @@ class ViewerManifest(LLManifest):      def channel_with_pkg_suffix(self):          fullchannel=self.channel() -        if 'channel_suffix' in self.args and self.args['channel_suffix']: -            fullchannel+=' '+self.args['channel_suffix'] +        channel_suffix = self.args.get('channel_suffix') +        if channel_suffix: +            fullchannel+=' '+channel_suffix          return fullchannel      def channel_variant(self): @@ -215,8 +222,7 @@ class ViewerManifest(LLManifest):          return self.channel().replace(CHANNEL_VENDOR_BASE, "").strip()      def channel_type(self): # returns 'release', 'beta', 'project', or 'test' -        global CHANNEL_VENDOR_BASE -        channel_qualifier=self.channel().replace(CHANNEL_VENDOR_BASE, "").lower().strip() +        channel_qualifier=self.channel_variant().lower()          if channel_qualifier.startswith('release'):              channel_type='release'          elif channel_qualifier.startswith('beta'): @@ -234,11 +240,12 @@ class ViewerManifest(LLManifest):          if self.channel_type() == 'release':              suffix=suffix.replace('Release', '').strip()          # for the base release viewer, suffix will now be null - for any other, append what remains -        if len(suffix) > 0: -            suffix = "_"+ ("_".join(suffix.split())) +        if suffix: +            suffix = "_".join([''] + suffix.split())          # the additional_packages mechanism adds more to the installer name (but not to the app name itself) -        if 'channel_suffix' in self.args and self.args['channel_suffix']: -            suffix+='_'+("_".join(self.args['channel_suffix'].split())) +        # ''.split() produces empty list, so suffix only changes if +        # channel_suffix is non-empty +        suffix = "_".join([suffix] + self.args.get('channel_suffix', '').split())          return suffix      def installer_base_name(self): @@ -488,19 +495,19 @@ class WindowsManifest(ViewerManifest):              # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe.              self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) -            with self.prefix(src=os.path.join(pkgdir, "VMP"), dst=""): +            with self.prefix(src=os.path.join(pkgdir, "VMP")):                  # include the compiled launcher scripts so that it gets included in the file_list                  self.path('updater.exe')                  #IUM is not normally executed directly, just imported.  No exe needed.                  self.path("InstallerUserMessage.py") -            with self.prefix(src=self.icon_path(), dst="vmp_icons"): -                self.path("secondlife.ico") - -            #VMP  Tkinter icons -            with self.prefix("vmp_icons"): -                self.path("*.png") -                self.path("*.gif") +            with self.prefix(dst="vmp_icons"): +                with self.prefix(src=self.icon_path()): +                    self.path("secondlife.ico") +                #VMP  Tkinter icons +                with self.prefix(src="vmp_icons"): +                    self.path("*.png") +                    self.path("*.gif")          # Plugin host application          self.path2basename(os.path.join(os.pardir, @@ -508,8 +515,8 @@ class WindowsManifest(ViewerManifest):                             "slplugin.exe")          # Get shared libs from the shared libs staging directory -        with self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']), -                       dst=""): +        with self.prefix(src=os.path.join(self.args['build'], os.pardir, +                                          'sharedlibs', self.args['configuration'])):              # Get llcommon and deps. If missing assume static linkage and continue.              try: @@ -575,6 +582,17 @@ class WindowsManifest(ViewerManifest):              # Hunspell              self.path("libhunspell.dll") +            # BugSplat +            if self.args.get('bugsplat'): +                if(self.address_size == 64): +                    self.path("BsSndRpt64.exe") +                    self.path("BugSplat64.dll") +                    self.path("BugSplatRc64.dll") +                else: +                    self.path("BsSndRpt.exe") +                    self.path("BugSplat.dll") +                    self.path("BugSplatRc.dll") +              # For google-perftools tcmalloc allocator.              try:                  if self.args['configuration'].lower() == 'debug': @@ -584,114 +602,116 @@ class WindowsManifest(ViewerManifest):              except:                  print "Skipping libtcmalloc_minimal.dll" -          self.path(src="licenses-win32.txt", dst="licenses.txt")          self.path("featuretable.txt") -        with self.prefix(src=pkgdir,dst=""): +        with self.prefix(src=pkgdir):              self.path("ca-bundle.crt")          # Media plugins - CEF -        with self.prefix(src='../media_plugins/cef/%s' % self.args['configuration'], dst="llplugin"): -            self.path("media_plugin_cef.dll") - -        # Media plugins - LibVLC -        with self.prefix(src='../media_plugins/libvlc/%s' % self.args['configuration'], dst="llplugin"): -            self.path("media_plugin_libvlc.dll") - -        # Media plugins - Example (useful for debugging - not shipped with release viewer) -        if self.channel_type() != 'release': -            with self.prefix(src='../media_plugins/example/%s' % self.args['configuration'], dst="llplugin"): -                self.path("media_plugin_example.dll") - -        # CEF runtime files - debug -        # CEF runtime files - not debug (release, relwithdebinfo etc.) -        config = 'debug' if self.args['configuration'].lower() == 'debug' else 'release' -        with self.prefix(src=os.path.join(pkgdir, 'bin', config), dst="llplugin"): -            self.path("chrome_elf.dll") -            self.path("d3dcompiler_43.dll") -            self.path("d3dcompiler_47.dll") -            self.path("libcef.dll") -            self.path("libEGL.dll") -            self.path("libGLESv2.dll") -            self.path("dullahan_host.exe") -            self.path("natives_blob.bin") -            self.path("snapshot_blob.bin") -            self.path("widevinecdmadapter.dll") - -        # MSVC DLLs needed for CEF and have to be in same directory as plugin -        with self.prefix(src=os.path.join(os.pardir, 'sharedlibs', 'Release'), dst="llplugin"): -            self.path("msvcp120.dll") -            self.path("msvcr120.dll") - -        # CEF files common to all configurations -        with self.prefix(src=os.path.join(pkgdir, 'resources'), dst="llplugin"): -            self.path("cef.pak") -            self.path("cef_100_percent.pak") -            self.path("cef_200_percent.pak") -            self.path("cef_extensions.pak") -            self.path("devtools_resources.pak") -            self.path("icudtl.dat") - -        with self.prefix(src=os.path.join(pkgdir, 'resources', 'locales'), dst=os.path.join('llplugin', 'locales')): -            self.path("am.pak") -            self.path("ar.pak") -            self.path("bg.pak") -            self.path("bn.pak") -            self.path("ca.pak") -            self.path("cs.pak") -            self.path("da.pak") -            self.path("de.pak") -            self.path("el.pak") -            self.path("en-GB.pak") -            self.path("en-US.pak") -            self.path("es-419.pak") -            self.path("es.pak") -            self.path("et.pak") -            self.path("fa.pak") -            self.path("fi.pak") -            self.path("fil.pak") -            self.path("fr.pak") -            self.path("gu.pak") -            self.path("he.pak") -            self.path("hi.pak") -            self.path("hr.pak") -            self.path("hu.pak") -            self.path("id.pak") -            self.path("it.pak") -            self.path("ja.pak") -            self.path("kn.pak") -            self.path("ko.pak") -            self.path("lt.pak") -            self.path("lv.pak") -            self.path("ml.pak") -            self.path("mr.pak") -            self.path("ms.pak") -            self.path("nb.pak") -            self.path("nl.pak") -            self.path("pl.pak") -            self.path("pt-BR.pak") -            self.path("pt-PT.pak") -            self.path("ro.pak") -            self.path("ru.pak") -            self.path("sk.pak") -            self.path("sl.pak") -            self.path("sr.pak") -            self.path("sv.pak") -            self.path("sw.pak") -            self.path("ta.pak") -            self.path("te.pak") -            self.path("th.pak") -            self.path("tr.pak") -            self.path("uk.pak") -            self.path("vi.pak") -            self.path("zh-CN.pak") -            self.path("zh-TW.pak") - -        with self.prefix(src=os.path.join(pkgdir, 'bin', 'release'), dst="llplugin"): -            self.path("libvlc.dll") -            self.path("libvlccore.dll") -            self.path("plugins/") +        with self.prefix(dst="llplugin"): +            with self.prefix(src=os.path.join(self.args['build'], os.pardir, 'media_plugins')): +                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 - Example (useful for debugging - not shipped with release viewer) +                if self.channel_type() != 'release': +                    with self.prefix(src=os.path.join('example', self.args['configuration'])): +                        self.path("media_plugin_example.dll") + +            # CEF runtime files - debug +            # CEF runtime files - not debug (release, relwithdebinfo etc.) +            config = 'debug' if self.args['configuration'].lower() == 'debug' else 'release' +            with self.prefix(src=os.path.join(pkgdir, 'bin', config)): +                self.path("chrome_elf.dll") +                self.path("d3dcompiler_43.dll") +                self.path("d3dcompiler_47.dll") +                self.path("libcef.dll") +                self.path("libEGL.dll") +                self.path("libGLESv2.dll") +                self.path("dullahan_host.exe") +                self.path("natives_blob.bin") +                self.path("snapshot_blob.bin") +                self.path("widevinecdmadapter.dll") + +            # MSVC DLLs needed for CEF and have to be in same directory as plugin +            with self.prefix(src=os.path.join(self.args['build'], os.pardir, +                                              'sharedlibs', 'Release')): +                self.path("msvcp120.dll") +                self.path("msvcr120.dll") + +            # CEF files common to all configurations +            with self.prefix(src=os.path.join(pkgdir, 'resources')): +                self.path("cef.pak") +                self.path("cef_100_percent.pak") +                self.path("cef_200_percent.pak") +                self.path("cef_extensions.pak") +                self.path("devtools_resources.pak") +                self.path("icudtl.dat") + +            with self.prefix(src=os.path.join(pkgdir, 'resources', 'locales'), dst='locales'): +                self.path("am.pak") +                self.path("ar.pak") +                self.path("bg.pak") +                self.path("bn.pak") +                self.path("ca.pak") +                self.path("cs.pak") +                self.path("da.pak") +                self.path("de.pak") +                self.path("el.pak") +                self.path("en-GB.pak") +                self.path("en-US.pak") +                self.path("es-419.pak") +                self.path("es.pak") +                self.path("et.pak") +                self.path("fa.pak") +                self.path("fi.pak") +                self.path("fil.pak") +                self.path("fr.pak") +                self.path("gu.pak") +                self.path("he.pak") +                self.path("hi.pak") +                self.path("hr.pak") +                self.path("hu.pak") +                self.path("id.pak") +                self.path("it.pak") +                self.path("ja.pak") +                self.path("kn.pak") +                self.path("ko.pak") +                self.path("lt.pak") +                self.path("lv.pak") +                self.path("ml.pak") +                self.path("mr.pak") +                self.path("ms.pak") +                self.path("nb.pak") +                self.path("nl.pak") +                self.path("pl.pak") +                self.path("pt-BR.pak") +                self.path("pt-PT.pak") +                self.path("ro.pak") +                self.path("ru.pak") +                self.path("sk.pak") +                self.path("sl.pak") +                self.path("sr.pak") +                self.path("sv.pak") +                self.path("sw.pak") +                self.path("ta.pak") +                self.path("te.pak") +                self.path("th.pak") +                self.path("tr.pak") +                self.path("uk.pak") +                self.path("vi.pak") +                self.path("zh-CN.pak") +                self.path("zh-TW.pak") + +            with self.prefix(src=os.path.join(pkgdir, 'bin', 'release')): +                self.path("libvlc.dll") +                self.path("libvlccore.dll") +                self.path("plugins/")          # pull in the crash logger and updater from other projects          # tag:"crash-logger" here as a cue to the exporter @@ -874,6 +894,12 @@ class DarwinManifest(ViewerManifest):          # darwin requires full app bundle packaging even for debugging.          return True +    def is_rearranging(self): +        # That said, some stuff should still only be performed once. +        # Are either of these actions in 'actions'? Is the set intersection +        # non-empty? +        return bool(set(["package", "unpacked"]).intersection(self.args['actions'])) +      def construct(self):          # copy over the build result (this is a no-op if run within the xcode script)          self.path(os.path.join(self.args['configuration'], "Second Life.app"), dst="") @@ -1362,19 +1388,19 @@ class LinuxManifest(ViewerManifest):          debpkgdir = os.path.join(pkgdir, "lib", "debug")          self.path("licenses-linux.txt","licenses.txt") -        with self.prefix("linux_tools", dst=""): +        with self.prefix("linux_tools"):              self.path("client-readme.txt","README-linux.txt")              self.path("client-readme-voice.txt","README-linux-voice.txt")              self.path("client-readme-joystick.txt","README-linux-joystick.txt")              self.path("wrapper.sh","secondlife") -            with self.prefix(src="", dst="etc"): +            with self.prefix(dst="etc"):                  self.path("handle_secondlifeprotocol.sh")                  self.path("register_secondlifeprotocol.sh")                  self.path("refresh_desktop_app_entry.sh")                  self.path("launch_url.sh")              self.path("install.sh") -        with self.prefix(src="", dst="bin"): +        with self.prefix(dst="bin"):              self.path("secondlife-bin","do-not-directly-run-secondlife-bin")              self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin")              self.path2basename("../llplugin/slplugin", "SLPlugin")  @@ -1388,9 +1414,9 @@ class LinuxManifest(ViewerManifest):          # Get the icons based on the channel type          icon_path = self.icon_path()          print "DEBUG: icon_path '%s'" % icon_path -        with self.prefix(src=icon_path, dst="") : +        with self.prefix(src=icon_path) :              self.path("secondlife_256.png","secondlife_icon.png") -            with self.prefix(src="",dst="res-sdl") : +            with self.prefix(dst="res-sdl") :                  self.path("secondlife_256.BMP","ll_icon.BMP")          # plugins @@ -1412,7 +1438,7 @@ class LinuxManifest(ViewerManifest):          self.path("featuretable_linux.txt") -        with self.prefix(src=pkgdir,dst=""): +        with self.prefix(src=pkgdir):              self.path("ca-bundle.crt")      def package_finish(self): @@ -1468,7 +1494,7 @@ class Linux_i686_Manifest(LinuxManifest):          relpkgdir = os.path.join(pkgdir, "lib", "release")          debpkgdir = os.path.join(pkgdir, "lib", "debug") -        with self.prefix(relpkgdir, dst="lib"): +        with self.prefix(src=relpkgdir, dst="lib"):              self.path("libapr-1.so")              self.path("libapr-1.so.0")              self.path("libapr-1.so.0.4.5") @@ -1554,4 +1580,8 @@ class Linux_x86_64_Manifest(LinuxManifest):  ################################################################  if __name__ == "__main__": -    main() +    extra_arguments = [ +        dict(name='bugsplat', description="""BugSplat database to which to post crashes, +             if BugSplat crash reporting is desired""", default=''), +        ] +    main(extra=extra_arguments) | 
