2011-03-23 31 views
6

Ja próbuje budować Google Breakpad dla Mac OS X jako część portowania aplikacji, na podstawie przeglądu pnia 782.Building Google Breakpad na Mac OS X

The Breakpad wiki określa, że ​​należy zbudować klienta/MAC/Breakpad .xcodeproj, który tworzy Breakpad.framework zawierający dynamicznie dołączoną bibliotekę jeśli dobrze rozumiem. Istnieje również przykładowy kod na temat korzystania z tego z aplikacji Objective-C, ale wszystko to wydaje się bardzo różne od tego, co wydaje się być normalnym sposobem robienia rzeczy na innych platformach, w tym z użyciem plistów i innych rzeczy, które nie są częścią mojej aplikacji. Wolę robić rzeczy tak podobne, jak to tylko możliwe na różnych platformach.

Na przykład this wydaje się być sposób, że Firefox używa Breakpad:

// include exception_handler.h from client/<platform>/handler, 
// using ... here for brevity 
#include "... exception_handler.h" 
... 
gExceptionHandler = new google_breakpad:: 
    ExceptionHandler(tempPath.get(), 
        nsnull, 
        MinidumpCallback, 
        nsnull, 
#if defined(XP_WIN32) 
        google_breakpad::ExceptionHandler::HANDLER_ALL); 
#else 
        true); 
#endif 

W moim projekcie, robimy to samo i po prostu połączyć przeciwko exception_handler.lib na Windows. Wydaje się, że na Linuksie, Breakpad generuje odpowiedni libbreakpad_client.a, które mogą być powiązane przed w ten sam sposób, ale nie na Mac OS X. Jeśli robię

./configure 
make 

z katalogu głównego breakpad libbreakpad.a generowany jest, że nie zawierają obsługę wyjątku i plik libbreakpad_client.a, który nie powinien być budowany. Bardzo dobrze mogłem źle zrozumieć wszystko na temat zarówno normalnego sposobu używania Breakpada, jak i normalnej procedury budowania zewnętrznych bibliotek na komputerze Mac, więc każda pomoc jest doceniana.

Jak zbudować libbreakpad_client.a na Mac OS X?

+2

Witaj villintehaspam, czy mógłbyś podzielić się swoimi źródłami breakpacka, które można skompilować pod MacOSX-em? Mam podobny problem, ale nie mogę się dowiedzieć, jak poprawnie używać zaktualizowanych plików Makefile ;-(Mam moje pytanie na SO tutaj: http://stackoverflow.com/questions/10450586/qt-google-breakpad-and- macos Dzięki –

Odpowiedz

3

Niestety, nie ma rozwiązania dla źródła Breakpad. Projekty XCode po prostu budują framework Breakpad, ponieważ jest to bardziej obsługiwany interfejs API klienta. Można zbudować kod z własnym zestawem Makefile lub cokolwiek budować setup chcecie w ten sam sposób Firefox robi patrząc na zestaw makefile Mozilla:

http://mxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/google-breakpad/src/common/Makefile.in

http://mxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/google-breakpad/src/common/mac/Makefile.in

http://mxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/google-breakpad/src/client/Makefile.in

http://mxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/google-breakpad/src/client/mac/handler/Makefile.in

http://mxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/Makefile.in

i zebranie zestawu plików wymienionych w CSRCS/CPPSRCS/CMSRCS/CMMSRCS i zbudowanie ich wszystkich.

Możesz także zgłosić błąd w Breakpad issue tracker, aby poprosić, aby projekt XCode zbudował również tę bibliotekę statyczną. To nie będzie łatwa łatka.

+0

Dziękuję Ted, bardzo przydatne wskaźniki! – villintehaspam

+0

Jestem wykopał ten wątek, ale w jaki sposób mogę użyć Makefile.in? Czy istnieje jakieś narzędzie, którego powinienem użyć? Jaki jest proces, począwszy od tych Makefile.in pliki, aby skompilować biblioteki? – Mike

+0

FYI, mozilla usunęła wszystkie pliki Makefile z ich repozytorium, ponieważ zostały one przeniesione z dala od marki. Chociaż twoja rada opierająca się na źródłach bezpośrednio pozostaje, tak jak są one wymienione w [moz.build] (http : //mxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/google-breakpad/src/client/mac/handler/moz.build) jako pliki "UNIFIED_SOURCES". – zmo

4

Może to nie być pomocne w twoim przypadku, ale znalazłem, że działa to w przypadku projektu, nad którym pracuję, który musi działać zarówno na systemie Linux, jak i na OS X. W Linuksie używamy "normalnego" sposobu działania autotools; w systemie OSX wywołujemy xcodebuild, aby utworzyć Breakpad.framework, a następnie połączyć się z tym.

Oto odpowiednia część CMakeLists.plik txt (for CMake see here):

IF(LINUX) 
    add_custom_target(
    GOOGLE_BREAKPAD_MAKEFILE 
    COMMAND cd ../google-breakpad/ && ([ -e Makefile ] || (autoreconf && bash configure)) 
) 
    add_custom_target(
    GOOGLE_BREAKPAD 
    COMMAND cd ../google-breakpad/ && $(MAKE) 
) 
    add_dependencies(GOOGLE_BREAKPAD GOOGLE_BREAKPAD_MAKEFILE) 
ENDIF() 

IF(APPLE) 
    add_custom_target(
    GOOGLE_BREAKPAD 
    COMMAND cd ../google-breakpad/src/client/mac/ && xcodebuild -sdk macosx 
) 
ENDIF() 

Jeśli aplikacja jest zbudowany z clang -stdlib=libc++ (co jest całkiem normalne, jeśli w ogromnym stopniu korzystają z C++ 11), należy dołączyć frazę GCC_VERSION=com.apple.compilers.llvm.clang.1_0 OTHER_CFLAGS=-stdlib=libc++ OTHER_LDFLAGS=-stdlib=libc++ do końca linii xcodebuild . To zmusi xcodebuild do robienia właściwych rzeczy.

Jeśli twoja aplikacja jest zbudowana z GCC i GNU libstdC++, nie musisz niczego dodawać do linii xcodebuild.