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
parent
0ebdfaa5fc
commit
63fe7d802a
20
build.sh
20
build.sh
|
|
@ -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 \
|
||||
|
|
|
|||
|
|
@ -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})
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
Loading…
Reference in New Issue