SL-821, SL-826: Use BUGSPLAT_DB from environment on Windows and Mac.

On TeamCity, set BUGSPLAT_DB from build-secrets.

Use the presence of $BUGSPLAT_DB, rather than a new CMake BUGSPLAT option, to
control whether CMake searches for BugSplat -- and passes LL_BUGSPLAT into C++.

When BUGSPLAT_DB is present, make viewer_manifest.py set "BugSplat DB" in
build_data.json, and "BugsplatServerURL" in Mac Info.plist.

Make llappviewerwin32.cpp read "BugSplat DB" from build_data.json.

Add placeholders for Mac hooks to suppress BugSplat prompt and send
SecondLife.log.
master
Nat Goodspeed 2018-05-25 12:09:50 -04:00
parent 0ebdfaa5fc
commit 63fe7d802a
6 changed files with 112 additions and 42 deletions

View File

@ -95,18 +95,24 @@ pre_build()
&& [ -r "$master_message_template_checkout/message_template.msg" ] \
&& template_verifier_master_url="-DTEMPLATE_VERIFIER_MASTER_URL=file://$master_message_template_checkout/message_template.msg"
# nat 2016-12-20: disable HAVOK on Mac until we get a 64-bit Mac build.
RELEASE_CRASH_REPORTING=ON
HAVOK=ON
SIGNING=()
if [ "$arch" == "Darwin" ]
then
if [ "$variant" == "Release" ]
then SIGNING=("-DENABLE_SIGNING:BOOL=YES" \
"-DSIGNING_IDENTITY:STRING=Developer ID Application: Linden Research, Inc.")
fi
if [ "$arch" == "Darwin" -a "$variant" == "Release" ]
then SIGNING=("-DENABLE_SIGNING:BOOL=YES" \
"-DSIGNING_IDENTITY:STRING=Developer ID Application: Linden Research, Inc.")
fi
# don't spew credentials into build log
bugsplat_sh="$build_secrets_checkout/bugsplat/bugsplat.sh"
set +x
if [ -r "$bugsplat_sh" ]
then # show that we're doing this, just not the contents
echo source "$bugsplat_sh"
source "$bugsplat_sh"
fi
set -x
"$autobuild" configure --quiet -c $variant -- \
-DPACKAGE:BOOL=ON \
-DUNATTENDED:BOOL=ON \

View File

@ -1,13 +1,7 @@
# BUGSPLAT can be set when launching the make using the argument -DBUGSPLAT:BOOL=ON
# When building using proprietary binaries though (i.e. having access to LL private servers),
# we always build with BUGSPLAT.
# Open source devs should use the -DBUGSPLAT:BOOL=ON then if they want to
# build with BugSplat, whether they are using USESYSTEMLIBS or not.
if (INSTALL_PROPRIETARY)
set(BUGSPLAT ON CACHE BOOL "Using BugSplat crash reporting library.")
endif (INSTALL_PROPRIETARY)
if (BUGSPLAT)
# BugSplat is engaged by setting environment variable BUGSPLAT_DB to the
# target BugSplat database name prior to running CMake (and during autobuild
# build).
if (DEFINED ENV{BUGSPLAT_DB})
if (USESYSTEMLIBS)
set(BUGSPLAT_FIND_QUIETLY ON)
set(BUGSPLAT_FIND_REQUIRED ON)
@ -27,4 +21,4 @@ if (BUGSPLAT)
endif (WINDOWS)
set(BUGSPLAT_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/bugsplat)
endif (USESYSTEMLIBS)
endif (BUGSPLAT)
endif (DEFINED ENV{BUGSPLAT_DB})

View File

@ -1715,10 +1715,10 @@ if (SDL_FOUND)
)
endif (SDL_FOUND)
if (BUGSPLAT)
if (DEFINED ENV{BUGSPLAT_DB})
set_property(TARGET ${VIEWER_BINARY_NAME}
PROPERTY COMPILE_DEFINITIONS "LL_BUGSPLAT")
endif (BUGSPLAT)
endif (DEFINED ENV{BUGSPLAT_DB})
# add package files
file(GLOB EVENT_HOST_SCRIPT_GLOB_LIST

View File

@ -70,6 +70,8 @@
#if defined(LL_BUGSPLAT)
// https://www.bugsplat.com/docs/platforms/os-x#initialization
// [BugsplatStartupManager sharedManager].autoSubmitCrashReport = YES;
// [BugsplatStartupManager sharedManager].askUserDetails = NO;
[[BugsplatStartupManager sharedManager] start];
#endif
}
@ -187,4 +189,21 @@
return true;
}
#if 0 // defined(LL_BUGSPLAT)
@implementation BugsplatStartupManagerDelegate
- (BugsplatAttachment *)attachmentForBugsplatStartupManager:(BugsplatStartupManager *)bugsplatStartupManager {
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"example" withExtension:@"json"];
NSData *data = [NSData dataWithContentsOfURL:fileURL];
BugsplatAttachment *attachment =
[[BugsplatAttachment alloc] initWithFilename:@"example.json"
attachmentData:data
contentType:@"application/json"];
return attachment;
}
#endif // LL_BUGSPLAT
@end

View File

@ -68,29 +68,30 @@
#include "stringize.h"
#include "lldir.h"
#include <fstream>
#include <exception>
// Bugsplat (http://bugsplat.com) crash reporting tool
#ifdef LL_BUGSPLAT
#include "BugSplat.h"
#include "reader.h" // JsonCpp
namespace
{
// FIXME: need a production BugSplat database name
static const wchar_t *bugdb_name = L"second_life_callum_test";
// MiniDmpSender's constructor is defined to accept __wchar_t* instead of
// plain wchar_t*.
// plain wchar_t*. It would be nice if, when wchar_t is the same as
// __wchar_t, this whole function would optimize away. However, we use it
// only for the arguments to make exactly one call to initialize BugSplat.
inline std::basic_string<__wchar_t> wunder(const std::wstring& str)
{
return { str.begin(), str.end() };
}
// Irritatingly, MiniDmpSender::setCallback() is defined to accept a
// classic-C function pointer instead of an arbitrary C++ callable. In the
// latter case, we could pass a lambda that binds our MiniDmpSender
// pointer. As things stand, we must define an actual function and store
// the pointer statically.
// classic-C function pointer instead of an arbitrary C++ callable. If it
// did accept a modern callable, we could pass a lambda that binds our
// MiniDmpSender pointer. As things stand, though, we must define an
// actual function and store the pointer statically.
static MiniDmpSender *sBugSplatSender = nullptr;
bool bugsplatSendLog(UINT nCode, LPVOID lpVal1, LPVOID lpVal2)
@ -549,22 +550,60 @@ bool LLAppViewerWin32::init()
#else // LL_BUGSPLAT
std::wstring version_string(WSTRINGIZE(LL_VIEWER_VERSION_MAJOR << '.' <<
LL_VIEWER_VERSION_MINOR << '.' <<
LL_VIEWER_VERSION_PATCH << '.' <<
LL_VIEWER_VERSION_BUILD));
if (gDirUtilp)
{
LL_WARNS() << "Can't initialize BugSplat, gDirUtilp not yet set" << LL_ENDL;
}
else
{
std::string build_data_fname(
gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "build_data.json"));
std::ifstream inf(build_data_fname.c_str());
if (! inf.open())
{
LL_WARNS() << "Can't initialize BugSplat, can't read '" << build_data_fname
<< "'" << LL_ENDL;
}
else
{
Json::Reader reader;
Json::Value build_data;
if (! reader.parse(inf, build_data, false)) // don't collect comments
{
LL_WARNS() << "Can't initialize BugSplat, can't parse '" << build_data_fname
<< "': " << reader.getFormattedErrorMessages() << LL_ENDL;
}
else
{
Json::Value BugSplat_DB = build_data["BugSplat DB"];
if (! BugSplat_DB)
{
LL_WARNS() << "Can't initialize BugSplat, no 'BugSplat DB' entry in '"
<< build_data_fname "'" << LL_ENDL;
}
else
{
// Got BugSplat_DB, onward!
std::wstring version_string(WSTRINGIZE(LL_VIEWER_VERSION_MAJOR << '.' <<
LL_VIEWER_VERSION_MINOR << '.' <<
LL_VIEWER_VERSION_PATCH << '.' <<
LL_VIEWER_VERSION_BUILD));
// have to convert normal wide strings to strings of __wchar_t
sBugSplatSender = new MiniDmpSender(
wunder(bugdb_name).c_str(),
wunder(LL_TO_WSTRING(LL_VIEWER_CHANNEL)).c_str(),
wunder(version_string).c_str(),
nullptr);
sBugSplatSender->setCallback(bugsplatSendLog);
// have to convert normal wide strings to strings of __wchar_t
sBugSplatSender = new MiniDmpSender(
wunder(BugSplat_DB).c_str(),
wunder(LL_TO_WSTRING(LL_VIEWER_CHANNEL)).c_str(),
wunder(version_string).c_str(),
nullptr);
sBugSplatSender->setCallback(bugsplatSendLog);
// engage stringize() overload that converts from wstring
LL_INFOS() << "Engaged BugSplat(" << LL_TO_STRING(LL_VIEWER_CHANNEL)
<< stringize(version_string) << ')' << LL_ENDL;
// engage stringize() overload that converts from wstring
LL_INFOS() << "Engaged BugSplat(" << LL_TO_STRING(LL_VIEWER_CHANNEL)
<< stringize(version_string) << ')' << LL_ENDL;
} // got BugSplat_DB
} // parsed build_data.json
} // opened build_data.json
} // gDirUtilp set
#endif // LL_BUGSPLAT
#endif // LL_SEND_CRASH_REPORTS

View File

@ -186,6 +186,11 @@ class ViewerManifest(LLManifest):
"Address Size":self.address_size,
"Update Service":"https://update.secondlife.com/update",
}
try:
build_data_dict["BugSplat DB"] = os.environ["BUGSPLAT_DB"]
except KeyError:
# skip the assignment if there's no BUGSPLAT_DB variable
pass
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)
@ -1001,6 +1006,13 @@ open "%s" --args "$@"
# runs the executable, instead of launching the app)
Info["CFBundleExecutable"] = "Second Life"
Info["CFBundleIconFile"] = viewer_icon
try:
# https://www.bugsplat.com/docs/platforms/os-x#configuration
Info["BugsplatServerURL"] = \
"https://{BUGSPLAT_DB}.bugsplatsoftware.com/".format(**os.environ)
except KeyError:
# skip the assignment if there's no BUGSPLAT_DB variable
pass
self.put_in_file(
plistlib.writePlistToString(Info),
os.path.basename(Info_plist),